Terinspirasi oleh artikel DailyWTF hari ini .
Penulis mengklaim bahwa file C:\Program.exe
akan dieksekusi ketika mengklik jalan pintas ke, misalnya C:\Program Files\Doom 2\doom2.exe -nomusic
,.
Seharusnya, Windows pertama kali mencoba untuk mengajukan C:\Program
argumen Files\Doom 2/doom2.exe -nomusic
.
Jika tidak ada C:\Program.exe
, maka akan mencoba C:\Program Files\Doom
dengan argumen 2/doom2.exe -nomusic
.
Dan jika tidak ada C:\Program Files\Doom.exe\
, akhirnya mencoba C:\Program Files\Doom 2\doom2.exe -nomusic
dan berhasil.
Ini kedengarannya seperti omong kosong bagi saya. Saya tidak percaya itu pernah bekerja seperti ini. Seorang komentator mengatakannya dengan baik :
Saya merasa sulit untuk percaya bahwa setiap versi Windows yang dirilis pernah melakukan pendekatan coba-coba yang dijelaskan oleh OP.
Saya benar-benar percaya bahwa versi Windows yang dirilis memiliki perilaku mati otak sebagai default. Saya sudah mengalaminya sendiri berkali-kali.
Apa yang saya tidak percaya adalah bahwa versi Windows yang dirilis memiliki perilaku yang mematikan otak ini , seperti yang dijelaskan oleh artikel. Terlalu besar kesalahan keamanan yang terjadi tanpa disadari sampai beberapa pengajuan Harian WTF acak membukanya, setidaknya satu dekade kemudian karena itu harus menjadi versi Windows yang mendahului XP.
Sunting untuk kejelasan: Inilah cara saya mengujinya sendiri.
- Salin notepad.exe ke C: \ program.exe
- Jalankan C: \ program file \ Internet explorer \ iexplore.exe
- Notepad terbuka. Ini diharapkan karena ia menemukan sesuatu yang disebut program C: \
- Pindahkan progam.exe ke C: \ program file \ Internet.exe
- Jalankan C: \ program file \ Internet explorer \ iexplore.exe
Menurut penulis artikel ( dan artikel ini dari Microsoft ), notepad harus tetap terbuka. Tetapi tidak, perintah gagal dengan pesan ini:
C:\program is not recognized as an internal or external command, operable program or batch file.
Sekali lagi, saya tidak memperdebatkan klaim artikel bahwa program C: \ akan dipanggil. Saya memperdebatkan bahwa Windows secara rekursif mencoba setiap direktori sampai hits pertandingan.
Jadi, apakah ada versi Windows yang pernah bekerja dengan cara ini?
C:\Program Files\...
, dan apakah Windows akan menafsirkan pintasan seperti itu (atau perintah Run, atau perintah prompt perintah, atau beberapa metode lain) sebagai"C:\Program" Files\...
. Bagian pertama tampaknya tidak mungkin, tetapi bagian kedua tampaknya mungkin dan diharapkan untuk saya.C:\Program Files
sebagai"C:\Program Files"
? Dari sedikit bacaan, sepertinya jawabannya dalam beberapa kasus mungkin "ya", yang merupakan satu-satunya area yang benar-benar tidak terduga.Jawaban:
Setiap versi Windows sejak nama file yang panjang di mana ditambahkan bekerja dengan cara ini dari Windows 95 dan hingga termasuk Windows 7.
Ini adalah perilaku yang didokumentasikan :
Seperti mengapa ia bertanya seperti ini - sehingga tidak merusak program yang tidak dapat menangani spasi dalam nama file dengan benar .
Edit Tampaknya perintah "Jalankan" tidak berperilaku seperti ini - itu harus memiliki beberapa logika tambahan yang ditambahkan untuk menangani kasus yang tepat ini. Namun mencoba untuk menjalankan dari tempat lain - termasuk menggunakan
CreateProcess
fungsi secara langsung yang sebagian besar aplikasi akan gunakan untuk menjalankan perintah.Lihat perilaku ini dalam aksi:
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
opsi Run dan IE akan terbuka dengan benar.Edit 2 Dalam hal
C:\program files\internet.exe
contoh Anda ; Saya percaya ini adalah juru bahasa command line yang menghalangi. Itu mencoba untuk memproses dan tokenize baris perintah menjadi parameter yang dipecah oleh spasi. Jadi dibutuhkanC:\program
sebagai token pertama dan mengartikannya sebagai nama program sebagai sisanya sebagai parameter.Untuk tes saya membuat aplikasi kecil yang memanggil
CreateProcess
langsung dan berperilaku persis seperti yang didokumentasikan.C:\program files\internet.exe
Contoh Anda akan diluncurkanC:\program files\internet.exe
. Jadi kelihatannya perilaku tersebut tergantung pada bagaimana tepatnya perintah dijalankan - sesuatu mungkin memproses baris perintah sebelum meneruskannyaCreateProcess
.Contoh program:
sumber
CreateProcess
halaman di MSDN, ini hanya terjadi jika parameter lpApplicationName adalah NULL . Jika tidak, sistem akan menggunakan parameter itu sebagai program untuk diluncurkan dan tidak akan mencari untuk menemukannya. Saya akan menganggap perintah "Jalankan" TIDAK memberikan parameter NULL di sini, oleh karena itu, ia tidak akan mencari program dengan cara ini.ShellExecuteEx
dan kemudian memanggilCreateProcess
Saya hanya ingin menambahkan sesuatu ke jawaban sebelumnya.
Meskipun dimungkinkan untuk memaksa perilaku ini melalui upaya, pemrograman yang buruk (bukan RTFM), atau badai sempurna yang tidak dapat diverifikasi yang disebabkan oleh program antivirus khusus ini, tidak ada yang akan menyebabkan perilaku yang dijelaskan oleh artikel tersebut. Sama sekali tidak ada cara pintas dibuat dengan benar, misalnya yang menargetkan "C: \ Program Files \ Microsoft \ Office \ Word.exe", dengan tanda kutip, jalankan C: \ Program.exe. Sama dengan Firefox. Sial, pada dasarnya tidak mungkin untuk membuat jalan pintas yang tidak akan lolos dengan benar, karena dilakukan dengan cerdas.
Jika Anda membuat pintasan di desktop yang menunjuk ke Firefox, itu akan lolos dengan benar. Jika Anda klik kanan -> properti dan mencoba untuk menghapus tanda kutip, itu akan secara otomatis menyisipkan mereka ketika Anda menekan berlaku, bahkan jika C: \ Program.exe ada. Ketika mem-parsing itu, saya kira itu memberikan preferensi ke folder atau memperlakukan semuanya sebelum yang terakhir '\' sebagai bagian dari jalan. Hanya jika Anda menyisipkan dua spasi antara Program dan File yang akan diuraikan sebagai menunjuk ke C: \ Program.exe dengan argumen. Jika Anda dapat mengedit pintasan di editor teks (ini bukan plaintext), mungkin berhasil.
Sama seperti cara pintas, Run Dialog dengan benar mem-parsing string juga. Hanya di Command Console tingkat rendah yang akan salah memanggil C: \ Program.exe, tetapi tidak akan mencoba berbagai kemungkinan lainnya. Artinya, ia akan salah mencoba memanggil "C: \ Program.exe", tetapi tidak akan mencoba memanggil "C: \ Program Files \ Internet.exe" atau apa pun, bahkan jika kemungkinan itu ada. Ini akan mengembalikan kesalahan yang mengatakan tidak dapat menemukan C: \ Program.exe.
Dan di atas semua ini, ketika ada Program.exe di folder C: \, itu akan memperingatkan Anda saat memulai dan bertanya apakah Anda ingin mengganti nama. Ini telah diverifikasi untuk XP, Vista, Windows 7 dan sekarang saya dapat memverifikasi Windows 8 ( http://goo.gl/eeNCp ). Mungkin ini mungkin di Windows 9x, tapi saya ragu.
Intinya, ini jelas dan tidak ada programmer Windows yang akan membuat kesalahan ini.
sumber