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 的搜索顺序是:
- 当前进程的可执行模块所在的目录。
- 当前目录。
- Windows 系统目录。
GetSystemDirectory
函数检索此目录的路径。
- Windows 目录。
GetWindowsDirectory
函数检索此目录的路径。
PATH
环境变量中列出的目录。
我猜测在这台特定的机器上 GetSystemDirectory
returns 到 Windows/system32
而不是 Windows/SysWOW64
的路径或者从 system32
到 SysWOW64
32 位进程无法正常工作,但这只是合格的猜测。
知道是什么导致了这种行为吗?
Dependency Walker 报告的依赖关系不正确。它的静态分析有时会混淆 32 位和 64 位模块。通常,这是当您 运行 64 位版本的 Dependency Walker 针对 32 位目标可执行文件时,反之亦然。
请放心,您的 32 位程序正在加载 32 位版本的 kernel32。
我发现 32 位 Win32 控制台应用程序在一台 运行 Windows Server 2012 R2 Standard 的特定机器上加载 64 位版本的 kernel32.dll。
将 Dependency Walker 与简单的 HelloWorld 应用程序一起使用,它看起来像这样:
它在其他机器上正确加载 32 位 kernel32。
PATH
的值似乎不相同,所以至少在不同机器上以完全相同的顺序包含相关路径。
根据 Microsoft 的 this page,DLL 的搜索顺序是:
- 当前进程的可执行模块所在的目录。
- 当前目录。
- Windows 系统目录。
GetSystemDirectory
函数检索此目录的路径。 - Windows 目录。
GetWindowsDirectory
函数检索此目录的路径。 PATH
环境变量中列出的目录。
我猜测在这台特定的机器上 GetSystemDirectory
returns 到 Windows/system32
而不是 Windows/SysWOW64
的路径或者从 system32
到 SysWOW64
32 位进程无法正常工作,但这只是合格的猜测。
知道是什么导致了这种行为吗?
Dependency Walker 报告的依赖关系不正确。它的静态分析有时会混淆 32 位和 64 位模块。通常,这是当您 运行 64 位版本的 Dependency Walker 针对 32 位目标可执行文件时,反之亦然。
请放心,您的 32 位程序正在加载 32 位版本的 kernel32。