Czy wersja systemu Windows zachowywała się w ten sposób?

36

Inspirowany dzisiejszym artykułem DailyWTF .

Autor twierdzi, że plik C:\Program.exezostanie wykonany po kliknięciu skrótu do, na przykład C:\Program Files\Doom 2\doom2.exe -nomusic.

Podobno Windows najpierw próbuje wywołać C:\Programargumenty Files\Doom 2/doom2.exe -nomusic.

Jeśli nie C:\Program.exe, to próbuje C:\Program Files\Doomz argumentami 2/doom2.exe -nomusic.

A jeśli nie C:\Program Files\Doom.exe\, to w końcu próbuje C:\Program Files\Doom 2\doom2.exe -nomusici się udaje.

Dla mnie to brzmi jak kompletny nonsens. Nie mogę uwierzyć, że to kiedykolwiek działało w ten sposób. Komentator dobrze to ujmuje :

Trudno mi uwierzyć, że jakakolwiek wydana wersja systemu Windows kiedykolwiek zastosowała metodę prób i błędów opisaną przez OP.

Absolutnie wierzę, że wydana wersja systemu Windows domyślnie zachowywała się jak mózg. Doświadczyłem tego z pierwszej ręki wiele, wiele razy.

Nie wierzę w to, że wypuszczona wersja systemu Windows miała takie zadziwiające zachowanie, jak opisano w tym artykule. Jest to zbyt duża wada bezpieczeństwa, aby przejść niezauważona, dopóki jakieś przypadkowe codzienne zgłoszenia WTF nie odkryły jej, co najmniej dziesięć lat później, ponieważ musiałaby to być wersja systemu Windows wcześniejsza niż XP.

Edytuj dla jasności: oto, jak sam to przetestowałem.

  1. Skopiuj notepad.exe do C: \ program.exe
  2. Uruchom C: \ program files \ Internet Explorer \ iexplore.exe
  3. Notatnik zostanie otwarty. Jest to oczekiwane, ponieważ znajdzie coś o nazwie C: \ program
  4. Przenieś program progam.exe do C: \ program files \ Internet.exe
  5. Uruchom C: \ program files \ Internet Explorer \ iexplore.exe

Według autora artykułu ( i tego artykułu z Microsoftu ) notatnik powinien się nadal otwierać. Ale tak się nie dzieje, polecenie kończy się niepowodzeniem z tym komunikatem:

C:\program is not recognized as an internal or external command, operable program or batch file.

Ponownie nie dyskutuję o twierdzeniu tego artykułu, że program C: \ zostałby wywołany. Zastanawiam się, czy system Windows rekurencyjnie wypróbowuje każdy katalog, dopóki nie znajdzie pasującego elementu.

Czy więc jakaś wersja systemu Windows kiedykolwiek działała w ten sposób?

dpatchery
źródło
1
Tak ! Zobacz odpowiedź @ grawity tutaj: superuser.com/a/373756/100787
iglvzx
2
Powinieneś był sprawdzić wszystkie komentarze;) msdn.microsoft.com/en-us/library/windows/desktop/…
Baarn
Wygląda na to, że toczą się tutaj dwa (lub więcej) osobne pytania: czy system Windows umożliwi utworzenie skrótu C:\Program Files\..., i czy system Windows interpretuje taki skrót (lub polecenie Uruchom, polecenie wiersza polecenia lub inną metodę) jako "C:\Program" Files\.... Pierwsza część wydaje się mało prawdopodobna, ale druga część wydaje mi się prawdopodobna i oczekiwana.
mwfearnley
Trzecie pytanie, jak sądzę, brzmi: czy jakakolwiek dana metoda uruchamiania poleceń systemu Windows interpretowałaby C:\Program Filesjako "C:\Program Files"? Po odrobinie czytania wygląda na to, że w niektórych przypadkach odpowiedź może brzmieć „tak”, co jest jedynym naprawdę nieoczekiwanym obszarem.
mwfearnley

Odpowiedzi:

32

Każda wersja systemu Windows od długich nazw plików, do których dodano, działa w ten sposób od systemu Windows 95 do Windows 7 włącznie.

To zachowanie jest udokumentowane :

LpApplicationName parametr może być NULL . W takim przypadku nazwa modułu musi być pierwszym tokenem rozdzielanym spacjami w ciągu lpCommandLine . Jeśli używasz długiej nazwy pliku, która zawiera spację, użyj łańcuchów cytowanych, aby wskazać, gdzie kończy się nazwa pliku i zaczynają się argumenty; w przeciwnym razie nazwa pliku jest niejednoznaczna. Rozważmy na przykład ciąg „c: \ program files \ sub dir \ program name”. Ciąg ten można interpretować na wiele sposobów. System próbuje zinterpretować możliwości w następującej kolejności:

c:\program.exe files\sub dir\program name
c:\program files\sub.exe dir\program name
c:\program files\sub dir\program.exe name
c:\program files\sub dir\program name.exe

Dlaczego pyta w ten sposób - aby nie łamał programów, które nie potrafią poprawnie obsługiwać spacji w nazwach plików .

Edycja Wygląda na to, że polecenie „Uruchom” nie zachowuje się w ten sposób - musi być dodana dodatkowa logika, aby obsłużyć ten dokładnie przypadek. Jednak próba uruchomienia z dowolnego miejsca - w tym CreateProcessbezpośrednie użycie funkcji, której większość aplikacji użyłaby do uruchomienia polecenia.

Zobacz to zachowanie w akcji:

  1. Otwórz administracyjny wiersz polecenia
  2. Biegać: copy c:\Windows\System32\notepad.exe c:\program.exe
  3. Biegać: c:\Program Files\Internet Explorer\iexplore.exe
  4. Notatnik otworzy się, informując, że nie można go znaleźć Files\Internet Explorer\iexplore.exe
  5. Wpisz c:\Program Files\Internet Explorer\iexplore.exeopcję Uruchom, a IE otworzy się poprawnie.

Edycja 2 W przypadku twojego C:\program files\internet.exeprzykładu; Wierzę, że to przeszkadza interpreter wiersza poleceń. Próbuje przetwarzać i tokenizować wiersz poleceń na parametry podzielone spacjami. Więc bierze C:\programjako pierwszy token i interpretuje to jako nazwę programu, a resztę jako parametry.

Do testu stworzyłem małą aplikację, która wywołuje CreateProcessbezpośrednio i zachowuje się dokładnie tak, jak zostało to udokumentowane. Twój C:\program files\internet.exeprzykład się uruchomi C:\program files\internet.exe. Wygląda więc na to, że zachowanie zależy od tego, w jaki sposób polecenie jest uruchamiane - coś może przetwarzać wiersz polecenia przed przekazaniem go CreateProcess.

Przykładowy program:

#include <Windows.h>

void main()
{
    STARTUPINFO si = {0};
    si.cb= sizeof(si);
    PROCESS_INFORMATION pi = {0};

    CreateProcess(NULL, "c:\\program files\\internet explorer\\iexplore.exe",
            NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}
shf301
źródło
1
Zobacz moją edycję, aby dowiedzieć się, dlaczego nie odpowiada na moje pytanie. Testowałeś tylko pierwszą rzecz w podanej kolejności, pytam o drugą.
dpatchery
Zrobiłem trochę więcej badań i zgadzam się z twoją najnowszą edycją - wygląda na to, że rozbieżność leży między cmd.exe a funkcją CreateProcess. Pokoloruj mnie przekonany!
dpatchery
Ta część nie wydaje się prawidłowa: Twój przykład C: \ program files \ internet.exe uruchomi C: \ program files \ internet.exe
Daniel Beck
Według CreateProcessstrony MSDN dzieje się tak tylko wtedy, gdy parametr lpApplicationName ma wartość NULL . W przeciwnym razie system użyje tego parametru jako programu do uruchomienia i nie będzie go szukał. Zakładam, że polecenie „Uruchom” NIE podaje tutaj parametru NULL , dlatego nie szukałby programu w ten sposób.
Kevin Panko,
1
@ shf301 Faktycznie korzysta, ShellExecuteExa potem to wywołujeCreateProcess
Kevin Panko
5

Chcę tylko dodać coś do poprzednich odpowiedzi.

Chociaż możliwe jest wymuszenie tego zachowania poprzez wysiłek, złe programowanie (nie RTFM) lub niemożliwą do zweryfikowania idealną burzę spowodowaną przez ten konkretny program antywirusowy, nic nie spowodowałoby zachowania opisanego w tym artykule. Absolutnie żaden sposób nie utworzyłby poprawnie utworzonego skrótu, np. Takiego, który celuje w „C: \ Program Files \ Microsoft \ Office \ Word.exe”, używając cudzysłowów, uruchomi C: \ Program.exe. To samo z Firefoksem. Do diabła, w zasadzie nie jest możliwe utworzenie skrótu, który nie byłby właściwie uciekany, ponieważ jest zrobiony inteligentnie.

Jeśli utworzysz skrót na pulpicie wskazujący na Firefoksa, zostanie on poprawnie zamknięty. Jeśli klikniesz prawym przyciskiem myszy -> właściwości i spróbujesz usunąć cytaty, zostaną one automatycznie wstawione po naciśnięciu przycisku Zastosuj, nawet jeśli istnieje C: \ Program.exe. Kiedy to analizuje, domyślam się, że albo preferuje folder, albo traktuje wszystko przed ostatnim „\” jako część ścieżki. Tylko jeśli wstawisz dwie spacje między Programem a plikami, zostanie on przeanalizowany jako wskazujący na C: \ Program.exe z argumentami. Jeśli możesz edytować skrót w edytorze tekstu (nie jest to zwykły tekst), może on działać.

Podobnie jak skróty, okno dialogowe Uruchom również poprawnie analizuje ciąg. Tylko w stosunkowo niskiego poziomu konsoli poleceń niepoprawnie wywoła C: \ Program.exe, ale nie wypróbuje innych różnych możliwości. Oznacza to, że niepoprawnie spróbuje wywołać „C: \ Program.exe”, ale nie spróbuje wywołać „C: \ Program Files \ Internet.exe” ani niczego innego, nawet jeśli te możliwości istnieją. Zwróci błąd informujący, że nie można znaleźć C: \ Program.exe.

A na dodatek, gdy w folderze C: \ znajduje się Program.exe, ostrzeże Cię podczas uruchamiania i zapyta, czy chcesz zmienić jego nazwę. Zostało to zweryfikowane dla XP, Visty, Windows 7 i mogę teraz zweryfikować Windows 8 ( http://goo.gl/eeNCp ). Może było to możliwe w systemie Windows 9x, ale wątpię w to.

Podsumowując, jest to oczywiste i żaden programista systemu Windows nie popełniłby tego błędu.

lordcheeto
źródło