Una versione di Windows si è mai comportata in questo modo?


36

Ispirato dall'articolo odierno di DailyWTF .

L'autore afferma che un file C:\Program.exeverrebbe eseguito facendo clic su un collegamento a, ad esempio C:\Program Files\Doom 2\doom2.exe -nomusic,.

Presumibilmente, Windows tenta innanzitutto di invocare C:\Programgli argomenti Files\Doom 2/doom2.exe -nomusic.

Se non c'è C:\Program.exe, prova C:\Program Files\Doomcon gli argomenti 2/doom2.exe -nomusic.

E se non c'è C:\Program Files\Doom.exe\, finalmente prova C:\Program Files\Doom 2\doom2.exe -nomusice ci riesce.

Mi sembra una totale assurdità. Non posso credere che abbia mai funzionato in questo modo. Un commentatore lo dice bene :

Trovo difficile credere che qualsiasi versione rilasciata di Windows abbia mai seguito l'approccio di prova ed errore descritto da OP.

Sono assolutamente convinto che una versione rilasciata di Windows avesse come impostazione predefinita un comportamento cerebrale. L'ho sperimentato in prima persona molte, molte volte.

Quello che non credo è che una versione rilasciata di Windows avesse questo comportamento cerebrale, come descritto nell'articolo. È troppo grande un difetto di sicurezza per essere passato inosservato fino a quando non è stato scoperto da qualche invio casuale di WTF giornaliero, almeno un decennio più tardi poiché avrebbe dovuto essere una versione di Windows precedente a XP.

Modifica per chiarezza: ecco come l'ho provato io stesso.

  1. Copia notepad.exe in C: \ program.exe
  2. Esegui C: \ programmi \ Internet explorer \ iexplore.exe
  3. Si apre il Blocco note. Ciò è previsto perché trova qualcosa chiamato C: \ program
  4. Spostare progam.exe in C: \ program files \ Internet.exe
  5. Esegui C: \ programmi \ Internet explorer \ iexplore.exe

Secondo l'autore dell'articolo ( e di questo articolo di Microsoft ), il blocco note dovrebbe ancora aprirsi. Ma non funziona, il comando non riesce con questo messaggio:

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

Ancora una volta, non sto discutendo l'affermazione dell'articolo secondo cui il programma C: \ sarebbe invocato. Sto discutendo che Windows tenta in modo ricorsivo ogni directory fino a quando non raggiunge una corrispondenza.

Quindi, qualsiasi versione di Windows ha mai funzionato in questo modo?


1
Si ! Vedi la risposta di @ grawity qui: superuser.com/a/373756/100787
iglvzx,

2
Avresti dovuto controllare tutti i commenti;) msdn.microsoft.com/en-us/library/windows/desktop/…
Baarn,

Sembra che ci siano due (o più) domande separate in corso qui: Windows consentirebbe di creare un collegamento C:\Program Files\...e Windows interpreterebbe tale collegamento (o comando Esegui o comando al prompt dei comandi o qualche altro metodo) come "C:\Program" Files\.... La prima parte sembra improbabile, ma la seconda parte sembra probabile e prevista per me.
mwfearnley,

Una terza domanda, immagino, è: qualsiasi dato metodo di esecuzione dei comandi di Windows interpreterebbe C:\Program Filescome "C:\Program Files"? Da un po 'di lettura, sembra che la risposta in alcuni casi possa essere "sì", che è l'unica area davvero inaspettata.
mwfearnley,

Risposte:


32

Ogni versione di Windows da quando sono stati aggiunti nomi di file lunghi funziona in questo modo da Windows 95 fino a Windows 7 incluso.

Questo comportamento è documentato :

Il parametro lpApplicationName può essere NULL . In tal caso, il nome del modulo deve essere il primo token delimitato da spazi bianchi nella stringa lpCommandLine . Se si utilizza un nome file lungo che contiene uno spazio, utilizzare le stringhe tra virgolette per indicare dove finisce il nome del file e iniziano gli argomenti; in caso contrario, il nome del file è ambiguo. Ad esempio, considera la stringa "c: \ programmi \ sub dir \ nome programma". Questa stringa può essere interpretata in diversi modi. Il sistema tenta di interpretare le possibilità nel seguente ordine:

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

Quanto al perché lo chiede in questo modo, in modo da non interrompere i programmi che non sono in grado di gestire correttamente gli spazi nei nomi dei file .

Modifica Sembra che il comando "Esegui" non si comporti in questo modo - deve avere una logica aggiuntiva aggiunta per gestire questo caso esatto. Tuttavia, provando a eseguire da qualsiasi altra parte, incluso l'uso CreateProcessdiretto della funzione che è quella che la maggior parte delle applicazioni userebbe per eseguire un comando.

Vedere questo comportamento in azione:

  1. Apri un prompt dei comandi amministrativo
  2. Correre: copy c:\Windows\System32\notepad.exe c:\program.exe
  3. Correre: c:\Program Files\Internet Explorer\iexplore.exe
  4. Il blocco note si aprirà dicendo che non è possibile trovare Files\Internet Explorer\iexplore.exe
  5. Digita c:\Program Files\Internet Explorer\iexplore.exel'opzione Esegui e IE si aprirà correttamente.

Modifica 2 Nel caso del tuo C:\program files\internet.exeesempio; Credo che questo sia l'interprete della riga di comando che si frappone. Prova a elaborare e tokenizzare la riga di comando in parametri suddivisi per spazi. Quindi prende C:\programcome primo token e lo interpreta come il nome del programma come il resto come parametri.

Per un test ho creato una piccola applicazione che chiama CreateProcessdirettamente e si comporta esattamente come documentata. Il tuo C:\program files\internet.exeesempio verrà avviato C:\program files\internet.exe. Quindi sembra che il comportamento dipenda esattamente da come viene eseguito il comando: qualcosa potrebbe elaborare la riga di comando prima di passarlo a CreateProcess.

Esempio di programma:

#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);
}

1
Vedi la mia modifica per capire perché non risponde alla mia domanda. Hai testato solo la prima cosa nell'ordine dato, ti sto chiedendo della seconda.
dpatchery,

Ho fatto un po 'più di ricerca da solo e sono d'accordo con la tua ultima modifica - sembra che la discrepanza risieda tra cmd.exe e la funzione CreateProcess. Colorami convinto!
dpatchery,

Questa parte non sembra corretta: l'esempio C: \ program files \ internet.exe avvierà C: \ program files \ internet.exe
Daniel Beck

Secondo la CreateProcesspagina su MSDN, ciò accade solo se il parametro lpApplicationName è NULL . Altrimenti, il sistema utilizzerà quel parametro come programma da avviare e non cercherà di trovarlo. Suppongo che il comando "Esegui" NON fornisca un parametro NULL qui, pertanto non cercherebbe il programma in questo modo.
Kevin Panko,

1
@ shf301 In realtà utilizza ShellExecuteExe quindi chiamaCreateProcess
Kevin Panko,

5

Voglio solo aggiungere qualcosa alle risposte precedenti.

Mentre è possibile forzare questo comportamento attraverso lo sforzo, la cattiva programmazione (non RTFM) o la tempesta perfetta non verificabile causata da questo particolare programma antivirus, nulla avrebbe causato il comportamento descritto nell'articolo. In nessun modo un collegamento creato correttamente, ad esempio uno che ha come target "C: \ Programmi \ Microsoft \ Office \ Word.exe", tra virgolette, eseguirà C: \ Program.exe. Lo stesso con Firefox. Inferno, è praticamente impossibile creare una scorciatoia che non sarebbe sfuggita correttamente, perché è fatta in modo intelligente.

Se crei un collegamento sul desktop che punta a Firefox, verrà salvato correttamente. Se fai clic con il pulsante destro del mouse -> proprietà e provi a rimuovere le virgolette, le inserirà automaticamente quando premi hit, anche se esiste C: \ Program.exe. Quando analizza ciò, suppongo che sia dando la preferenza alla cartella o trattando tutto prima dell'ultimo '\' come parte del percorso. Solo se si inseriscono due spazi tra Program e Files verrà analizzato come puntato a C: \ Program.exe con argomenti. Se puoi modificare il collegamento in un editor di testo (non è un testo in chiaro), potrebbe funzionare.

Proprio come le scorciatoie, anche la finestra di dialogo Esegui analizza correttamente la stringa. Solo nella Command Console di livello relativamente basso chiamerà erroneamente C: \ Program.exe, ma non tenterà le altre varie possibilità. Cioè, tenterà erroneamente di chiamare "C: \ Program.exe", ma non tenterà di chiamare "C: \ Program Files \ Internet.exe" o qualsiasi altra cosa, anche se tali possibilità esistono. Restituirà un errore dicendo che non riesce a trovare C: \ Program.exe.

E soprattutto, quando c'è un Program.exe nella cartella C: \, ti avviserà all'avvio e ti chiederà se vuoi rinominarlo. Questo è stato verificato per XP, Vista, Windows 7 e ora posso verificare Windows 8 ( http://goo.gl/eeNCp ). Forse questo è stato possibile in Windows 9x, ma ne dubito.

In conclusione, questo è ovvio e nessun programmatore di Windows commetterebbe questo errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.