Inspirowany dzisiejszym artykułem DailyWTF .
Autor twierdzi, że plik C:\Program.exe
zostanie 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:\Program
argumenty Files\Doom 2/doom2.exe -nomusic
.
Jeśli nie C:\Program.exe
, to próbuje C:\Program Files\Doom
z 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 -nomusic
i 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.
- Skopiuj notepad.exe do C: \ program.exe
- Uruchom C: \ program files \ Internet Explorer \ iexplore.exe
- Notatnik zostanie otwarty. Jest to oczekiwane, ponieważ znajdzie coś o nazwie C: \ program
- Przenieś program progam.exe do C: \ program files \ Internet.exe
- 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?
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.C:\Program Files
jako"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.Odpowiedzi:
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 :
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
CreateProcess
bezpośrednie użycie funkcji, której większość aplikacji użyłaby do uruchomienia polecenia.Zobacz to zachowanie w akcji:
copy c:\Windows\System32\notepad.exe c:\program.exe
c:\Program Files\Internet Explorer\iexplore.exe
Files\Internet Explorer\iexplore.exe
c:\Program Files\Internet Explorer\iexplore.exe
opcję Uruchom, a IE otworzy się poprawnie.Edycja 2 W przypadku twojego
C:\program files\internet.exe
przykładu; Wierzę, że to przeszkadza interpreter wiersza poleceń. Próbuje przetwarzać i tokenizować wiersz poleceń na parametry podzielone spacjami. Więc bierzeC:\program
jako pierwszy token i interpretuje to jako nazwę programu, a resztę jako parametry.Do testu stworzyłem małą aplikację, która wywołuje
CreateProcess
bezpośrednio i zachowuje się dokładnie tak, jak zostało to udokumentowane. TwójC:\program files\internet.exe
przykład się uruchomiC:\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 goCreateProcess
.Przykładowy program:
źródło
CreateProcess
strony 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.ShellExecuteEx
a potem to wywołujeCreateProcess
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.
źródło