【问题标题】:Win32 32-bit process loads 64-bit kernel32.dllWin32 32 位进程加载 64 位 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 的搜索顺序是:

  1. 当前进程的可执行模块所在目录。
  2. 当前目录。
  3. Windows 系统目录。 GetSystemDirectory 函数检索此目录的路径。
  4. Windows 目录。 GetWindowsDirectory 函数检索此目录的路径。
  5. 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

标签: windows winapi dll 32bit-64bit


【解决方案1】:

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

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

【讨论】:

  • 尴尬。你说的对。 :-) 我会尽快接受答案。
猜你喜欢
  • 2011-08-12
  • 2014-08-10
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2013-02-06
  • 2011-01-16
  • 2012-02-29
相关资源
最近更新 更多