Win32 32 位进程加载 64 位 kernel32.dll

Win32 32-bit process loads 64-bit kernel32.dll

我发现 32 位 Win32 控制台应用程序在一台 运行 Windows Server 2012 R2 Standard 的特定机器上加载 64 位版本的 kernel32.dll。

Dependency Walker 与简单的 HelloWorld 应用程序一起使用,它看起来像这样:

它在其他机器上正确加载 32 位 kernel32。

PATH 的值似乎不相同,所以至少在不同机器上以完全相同的顺序包含相关路径。

根据 Microsoft 的 this page,DLL 的搜索顺序是:

  1. 当前进程的可执行模块所在的目录。
  2. 当前目录。
  3. Windows 系统目录。 GetSystemDirectory 函数检索此目录的路径。
  4. Windows 目录。 GetWindowsDirectory 函数检索此目录的路径。
  5. PATH 环境变量中列出的目录。

我猜测在这台特定的机器上 GetSystemDirectory returns 到 Windows/system32 而不是 Windows/SysWOW64 的路径或者从 system32SysWOW64 32 位进程无法正常工作,但这只是合格的猜测。

知道是什么导致了这种行为吗?

Dependency Walker 报告的依赖关系不正确。它的静态分析有时会混淆 32 位和 64 位模块。通常,这是当您 运行 64 位版本的 Dependency Walker 针对 32 位目标可执行文件时,反之亦然。

请放心,您的 32 位程序正在加载 32 位版本的 kernel32。