Win32 32 位进程加载 64 位 kernel32.dll
Posted
技术标签:
【中文标题】Win32 32 位进程加载 64 位 kernel32.dll【英文标题】:Win32 32-bit process loads 64-bit kernel32.dll 【发布时间】:2018-05-29 12:12:14 【问题描述】:我发现 32 位 Win32 控制台应用程序正在运行 Windows Server 2012 R2 Standard 的一台特定机器上加载 64 位版本的 kernel32.dll。
使用Dependency Walker 和一个简单的HelloWorld 应用程序,它看起来像这样:
它可以在其他机器上正确加载 32 位 kernel32。
PATH
的值似乎不完全相同,因此至少包括在不同机器上以完全相同的顺序排列的相关路径。
根据微软的this page,DLL 的搜索顺序是:
-
当前进程的可执行模块所在目录。
当前目录。
Windows 系统目录。
GetSystemDirectory
函数检索此目录的路径。
Windows 目录。 GetWindowsDirectory
函数检索此目录的路径。
PATH
环境变量中列出的目录。
我猜在这台特定的机器上GetSystemDirectory
返回到Windows/system32
的路径而不是Windows/SysWOW64
或者从system32
到SysWOW64
的32 位进程的映射不能正常工作,但这些是只有合格的猜测。
知道是什么导致了这种行为吗?
【问题讨论】:
这只是 Dependency Walker 的错误——仅此而已。和 32 位应用程序永远不会通过静态导入加载 64 位版本的 kernel32.dll。和路径/ GetSystemDirectory - 这里根本不相关,因为总是存在\KnownDlls32\kernel32.dll
部分。它会被使用
Dependency Walker 上一次可靠地工作是在 Windows Vista 上。准备好在从 Windows 7 开始的任何操作系统上看到 Dependency Walker 中令人困惑/误导的信息。诊断 DLL 问题的更好方法是enable loader snaps。
【参考方案1】:
Dependency Walker 错误地报告了依赖关系。它的静态分析有时会在 32 位和 64 位模块之间混淆。通常这是当您针对 32 位目标可执行文件运行 64 位版本的 Dependency Walker 时,反之亦然。
请放心,您的 32 位程序正在加载 32 位版本的 kernel32。
【讨论】:
尴尬。你说的对。 :-) 我会尽快接受答案。以上是关于Win32 32 位进程加载 64 位 kernel32.dll的主要内容,如果未能解决你的问题,请参考以下文章