2017-12-15 30 views
1

Windows Server 2012 R2 Standardを実行している特定のマシンで、32ビットWin32コンソールアプリケーションがkernel32.dllの64ビットバージョンをロードしていることがあります。Win32 32ビットプロセスが64ビットkernel32.dllをロードする

Loading the 64-bit version of kernel32.dll

それは正しく、他のマシン上で32ビットのカーネル32をロードします。それはこのようになりますシンプルなHelloWorldのアプリケーションでDependency Walkerを使用して

Loading the 32-bit version of kernel32.dll

PATHの値が同一でないので、もし、少なくとも異なるマシン上で正確に同じ順序に関連するパスを含むと思われます。

マイクロソフトからthis pageによれば、DLLの検索順序は次のとおり

  1. 現在のプロセスの実行可能モジュールが配置されているディレクトリ。
  2. 現在のディレクトリ。
  3. Windowsのシステムディレクトリ。 GetSystemDirectory関数は、このディレクトリのパスを取得します。
  4. Windowsディレクトリ。 GetWindowsDirectory関数は、このディレクトリのパスを取得します。
  5. 環境変数PATHにリストされているディレクトリ。

私はWindows/system32代わりのWindows/SysWOW64へのパスを返すか、32ビットプロセスのためのsystem32からSysWOW64へのマッピングが正常に動作していないが、これらは、資格の推測であることをGetSystemDirectoryこの特定のマシンであることを推測しています。

この現象の原因は何ですか?

+1

これはDependency Walkerの間違いではありません。 32ビットアプリケーションは静的インポートによってkernel32.dllの64ビットバージョンをロードしません。 path/GetSystemDirectoryは '\ KnownDlls32 \ kernel32.dll'セクションが常に存在するため、ここでは関係ありません。それは使用されます – RbMm

+2

Dependency Walkerが幾分信頼できるように最後に働いたのはWindows Vistaでした。 Dependency WalkerのWindows 7以降のOSで、混乱している/誤解を招くような情報を表示する準備をしてください。DLLの問題を診断するには、[ローダースナップを有効にする](https://docs.microsoft.com/en-us/windows) -hardware/drivers/debugger/show-loader-snap)を実行します。 – IInspectable

答えて

3

依存関係ウォーカーは依存関係を誤って報告しています。その静的解析は時には32ビットと64ビットの間で混乱します。通常、これは、32ビットのターゲット実行可能ファイルに対して64ビットバージョンのDependency Walkerを実行する場合、またはその逆の場合です。

32ビットプログラムが32ビットバージョンのkernel32をロードしていることを確認してください。

+0

恥ずかしい。あなたが正しいです。 :-)できるだけ早く答えを受け入れます。 – mgd