【问题标题】:MEMORY_BASIC_INFORMATION and VirtualQueryEx on different architectures不同架构上的 MEMORY_BASIC_INFORMATION 和 VirtualQueryEx
【发布时间】:2020-07-05 07:35:10
【问题描述】:

MSDN page for MEMORY_BASIC_INFORMATION 在备注部分指出,当目标进程运行在与查询程序不同的架构上时(使用VirtualQueryEx 时),应指定 MEMORY_BASIC_INFORMATION32 和 MEMORY_BASIC_INFORMATION64。我还发现一些 SO 帖子在他们对相关问题的回答中指出了这一点。尽管我发现 VirtualQUEeryEx 传递的 MEMORY_BASIC_INFORMATION 的版本与我的程序架构相同,尽管目标是相同的。我想确保我正确解析来自 VirtualQueryEx 的信息。我真的需要指定我使用的 MEMORY_BASIC_INFORMATION 的版本来匹配目标的体系结构吗?如果是这样,为什么 VirtualQueryEx 只返回我的程序架构的版本,我该如何解决这个问题?

【问题讨论】:

  • 这只能在调试过程在不同的计算机上运行时使用。当两个进程在相同的comp(具有相同的内核)上运行时-这没用。本机进程始终可以按原样使用MEMORY_BASIC_INFORMATION,wow64 进程只能查询另一个 wow64 进程
  • 好的,有道理。因此,如果我想在我的计算机上获取有关 32 位和 64 位进程的信息,我将不得不编译单独的程序?
  • 不,你错了。对于仅从同一台计算机获取信息,请始终按原样仅使用MEMORY_BASIC_INFORMATION。本机进程始终获得有关任何进程(32 和 64)的正确信息。 wow64进程无论如何只能查询32位进程
  • 好的,我想我现在明白了。只要我的调试器是本机的,我就可以安全地使用带有本机或 wow64 目标的默认 MEMORY_BASIC_INFORMATION。对吗?
  • 是的。真正的调试器总是必须是本机的(所以在 64 位窗口上总是 64 位)。和 64 位进程总是在 MEMORY_BASIC_INFORMATION 中从 32 位和 64 位进程中获得正确的信息

标签: windows msdn virtual-memory virtualquery


【解决方案1】:

根据我的经验,最好的解决方案是使用常规宏 MEMORY_BASIC_INFORMATION 并为 x86 和 x64 构建单独的可执行文件。此外,根据您构建的架构,对所有地址、偏移量和指针使用宏来解析正确的大小。然后根据目标进程的架构使用对应的可执行文件。这将导致最少的头痛。

在这种情况下,如果您从 x64 进程使用 MEMORY_BASIC_INFORMATION 并针对 x86 或 x64 进程,它应该可以正常工作。但我不认为这适用于所有结构和 Windows API 函数,因为这只会给你带来麻烦,这就是我推荐上述方法的原因。

【讨论】:

    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2021-04-30
    • 2015-11-29
    • 2022-12-18
    • 2021-09-11
    相关资源
    最近更新 更多