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 或者从system32SysWOW64 的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的主要内容,如果未能解决你的问题,请参考以下文章

在 64 位机器上捕获的 32 位进程的调试转储

64位系统下注册32位dll文件

64 位托管进程:进程外 32 位 COM 服务器非默认接口不可用

试图加载格式不正确的程序

使用 C++ 从 32 位进程访问 64 位 dll

在 Win64 操作系统中从 32 位应用程序解析 PROGRAMFILES 变量?