Windowsのバージョンはこのように動作しましたか?


36

今日のDailyWTF記事に触発されました

著者は、C:\Program.exe例えばへのショートカットをクリックするとファイルが実行されると主張していますC:\Program Files\Doom 2\doom2.exe -nomusic

おそらく、Windowsは最初C:\Programにarguments を使用して起動しようとしますFiles\Doom 2/doom2.exe -nomusic

ない場合は、引数を使用してC:\Program.exe試行C:\Program Files\Doomします2/doom2.exe -nomusic

そして、ない場合C:\Program Files\Doom.exe\、最終的に試行C:\Program Files\Doom 2\doom2.exe -nomusicして成功します。

これは私には完全にナンセンスなように聞こえます。このように機能したとは信じられません。解説者はそれをうまく説明しています

Windowsのリリースされたバージョンが、OPで説明されている試行錯誤のアプローチを実行したことは信じられません。

Windowsのリリースバージョンには、デフォルトとして脳死の動作があったと私は絶対に信じています。私は何度も何度も直接体験しました。

私が信じていないのは、リリースされたバージョンのWindowsには、この記事で説明されているように、この脳死の動作があったということです。少なくとも10年後、XPに先行するWindowsのバージョンにならなければならなかったので、ランダムなDaily WTFの提出がそれを発見するまで気付かれないようにするには、セキュリティの欠陥が大きすぎます。

わかりやすくするために編集します。これを自分でテストした方法を次に示します。

  1. notepad.exeをC:\ program.exeにコピーします
  2. C:\ program files \ Internet explorer \ iexplore.exeを実行します
  3. メモ帳が開きます。これは、C:\ programと呼ばれるものを見つけるためです。
  4. progam.exeをC:\ program files \ Internet.exeに移動します
  5. C:\ program files \ Internet explorer \ iexplore.exeを実行します

記事の著者(およびMicrosoftのこの記事)によると、メモ帳はまだ開いているはずです。しかし、そうではなく、コマンドは次のメッセージで失敗します。

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

繰り返しますが、C:\ programが呼び出されるという記事の主張については議論していません。Windowsは、一致するまですべてのディレクトリを再帰的に試行することを議論しています。

それでは、Windowsのどのバージョンでもこのように機能しましたか?


1
はい!ここで@grawityの答えを参照してください:superuser.com/a/373756/100787-iglvzx
03

2
あなたはすべてのコメントをチェックしているはずです。)msdn.microsoft.com/en-us/library/windows/desktop/...
バールン

うのWindowsは、あなたがへのショートカットを作成することができます:ここで起こって2つ(またはそれ以上)個別の質問がありますように思えるC:\Program Files\...、と考えWindowsは、このようなショートカット(またはRunコマンド、またはコマンドプロンプトコマンド、またはその他の方法)を解釈するように"C:\Program" Files\...。最初の部分はありそうにないように見えますが、2番目の部分は可能性があり、私には期待されているようです。
mwfearnley

3番目の質問は、Windowsのコマンド実行メソッドはどのように解釈さC:\Program Filesれるの"C:\Program Files"でしょうか?少し読んでみると、場合によっては答えが「はい」であるように見えますが、これは本当に予期しない唯一の領域です。
mwfearnley

回答:


32

追加された長いファイル名は、Windows 95からWindows 7を含むまでこのように機能するため、Windowsのすべてのバージョン。

これは動作が文書化されています

lpApplicationNameのパラメータができNULL。その場合、モジュール名は、lpCommandLine文字列の最初の空白区切りトークンである 必要があります。スペースを含む長いファイル名を使用している場合は、引用符付きの文字列を使用して、ファイル名の終わりと引数の始まりを示します。それ以外の場合、ファイル名はあいまいです。たとえば、文字列「c:\ program files \ sub dir \ program name」を考えます。この文字列はさまざまな方法で解釈できます。システムは、次の順序で可能性を解釈しようとします。

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

なぜこのように要求するのか- ファイル名のスペースを正しく処理できないプログラムを壊さないように。

編集 「実行」コマンドはこのように動作しないようです-この正確なケースを処理するために追加のロジックを追加する必要があります。ただしCreateProcess、ほとんどのアプリケーションがコマンドを実行するために使用する関数を直接使用するなど、他のどこからでも実行しようとしています。

この動作を実際に見る:

  1. 管理コマンドプロンプトを開く
  2. 実行: copy c:\Windows\System32\notepad.exe c:\program.exe
  3. 実行: c:\Program Files\Internet Explorer\iexplore.exe
  4. メモ帳が開き、見つからないことがわかります Files\Internet Explorer\iexplore.exe
  5. c:\Program Files\Internet Explorer\iexplore.exe[実行]オプションに入力すると、IEが正しく開きます。

編集2お使いの場合C:\program files\internet.exeの例。これが邪魔になるコマンドラインインタープリターだと思います。コマンドラインを処理し、スペースで分割されたパラメーターにトークン化しようとします。したがってC:\program、最初のトークンとして受け取り、それをプログラム名として残りをパラメーターとして解釈します。

テストのために、CreateProcess直接呼び出す小さなアプリケーションを作成し、文書化されたとおりに動作します。あなたのC:\program files\internet.exe例では、起動しますC:\program files\internet.exe。そのため、動作はコマンドの実行方法に正確に依存しているようCreateProcessです。

サンプルプログラム:

#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
これが私の質問に答えない理由については、私の編集をご覧ください。あなたは与えられた順序で最初のものだけをテストしました、私は2番目のものについて尋ねています。
-dpatchery

私はもう少し研究を行いましたが、最新の編集に同意します-cmd.exeとCreateProcess関数の間​​に矛盾があるようです。納得させてください!
-dpatchery

この部分は正しくないようです:C:\ program files \ internet.exeの例はC:\ program files \ internet.exeを起動します
ダニエルベック

CreateProcessMSDN のページによると、これはlpApplicationNameパラメーターがNULLの場合にのみ発生します。それ以外の場合、システムは起動するプログラムとしてそのパラメーターを使用し、検索するために検索しません。ここでは、「実行」コマンドがNULLパラメーターを提供しないと想定しているため、この方法でプログラムを検索しません。
ケビン・パン粉

1
@ shf301これは、実際に使用しないShellExecuteExと、その後の呼び出しそのCreateProcess
ケビン・パン粉

5

以前の回答に何かを追加したいだけです。

努力、不適切なプログラミング(RTFMではない)、またはこの特定のウイルス対策プログラムによって引き起こされる検証不可能なパーフェクトストームによってこの動作を強制することは可能ですが、この記事で説明されている動作は発生しませんでした。「C:\ Program Files \ Microsoft \ Office \ Word.exe」を引用符で囲んだショートカットは、C:\ Program.exeを実行するなど、決して正しく作成されません。Firefoxでも同じです。地獄、適切にエスケープされないショートカットを作成することは基本的に不可能です。

Firefoxを指すショートカットをデスクトップに作成すると、適切にエスケープされます。->プロパティを右クリックして引用符を削除しようとすると、C:\ Program.exeが存在する場合でも、適用をクリックすると自動的に引用符が挿入されます。それを解析すると、フォルダを優先するか、パスの一部として最後の「\」より前のすべてを処理していると推測します。ProgramとFilesの間に2つのスペースを挿入した場合にのみ、引数でC:\ Program.exeを指していると解析されます。テキストエディタ(プレーンテキストではない)でショートカットを編集できる場合、機能する可能性があります。

ショートカットと同様に、実行ダイアログも文字列を正しく解析します。比較的低レベルのコマンドコンソールでのみ、C:\ Program.exeを誤って呼び出しますが、他のさまざまな可能性を試しません。つまり、誤って「C:\ Program.exe」を呼び出そうとしますが、「C:\ Program Files \ Internet.exe」など、他の可能性が存在する場合でも呼び出そうとしません。C:\ Program.exeが見つからないというエラーが返されます。

さらに、C:\フォルダーにProgram.exeがある場合、起動時に警告が表示され、名前を変更するかどうかを尋ねられます。これはXP、Vista、Windows 7で検証されており、Windows 8(http://goo.gl/eeNCp)を検証できるようになりました。これはWindows 9xで可能だったかもしれませんが、私は疑っています。

結論として、これは明らかであり、Windowsプログラマーがこの間違いを犯すことはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.