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

4
我发现在一台运行Windows Server 2012 R2 Standard的特定机器上,32位Win32控制台应用程序会加载64位版本的kernel32.dll。使用Dependency Walker和一个简单的HelloWorld应用程序,情况如下:

Loading the 64-bit version of kernel32.dll

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

Loading the 32-bit version of kernel32.dll

PATH的值似乎在不同的机器上至少包含相同顺序的相关路径,如果不是完全相同的话。
根据微软的这个页面,DLL的搜索顺序如下:
  1. 当前进程可执行模块所在的目录。
  2. 当前目录。
  3. Windows系统目录。GetSystemDirectory函数检索此目录的路径。
  4. Windows目录。GetWindowsDirectory函数检索此目录的路径。
  5. 列在PATH环境变量中的目录。
我猜想,在这台特定的机器上,GetSystemDirectory返回的是指向Windows/system32而不是Windows/SysWOW64的路径,或者32位进程从system32SysWOW64的映射没有正常工作,但这些只是合格的猜测。
你有什么想法是什么导致了这种行为?

1
这只是 Dependency Walker 的错误,没有别的了。而且 32 位应用程序永远不会通过静态导入加载 64 位版本的 kernel32.dll。路径/ GetSystemDirectory - 在这里根本不相关,因为始终存在 \KnownDlls32\kernel32.dll 部分,它将被使用。 - RbMm
3
依赖项检视器最后一次可靠地工作是在Windows Vista上。准备好在任何Windows 7及以上版本中看到依赖项检视器显示混乱/误导的信息。诊断DLL问题的更好方法是启用加载程序快照 - IInspectable
1个回答

5

依赖性检查工具(Dependency Walker)的依赖关系报告有误。其静态分析有时会混淆32位和64位模块。通常情况下,这是在您运行64位版本的依赖性检查工具来检查32位目标可执行文件时发生的,或者反之亦然。

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


有些尴尬。你说得对。 :-) 我会尽快接受答案。 - mgd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接