【问题标题】:Calling VirtualQueryEx function from a 64 bit process on a 32 bit one从 32 位进程上的 64 位进程调用 VirtualQueryEx 函数
【发布时间】:2015-01-02 06:24:47
【问题描述】:

TL;DR:如果我在 32 位进程上从 64 位进程调用 VirtualQueryEx,我应该使用 MEMORY_BASIC_INFORMATION 还是 MEMORY_BASIC_INFORMATION32

嗨!

我有一个 64 位应用程序,可以读取其他进程的内存(OpenProcessVirtualQueryEx,然后是 ReadProcessMemory)。我想知道我是否应该做一个特殊的检查,看看其他进程是否是 32 位进程。

我的代码是这样的:

MEMORY_BASIC_INFORMATION info;

SIZE_T r = VirtualQueryEx((HANDLE) handle,
(void *) 0x0,
&info,
sizeof(info));

问题是,the documentation of MEMORY_BASIC_INFORMATION 是这样说的:

使调试器能够调试在不同设备上运行的目标 体系结构(32 位与 64 位),使用其中一种显式形式 这个结构。

这两个进程在同一台计算机上运行(相同的架构?),但一个是 32 位进程,另一个是 64 位进程。

我已经在 64 位 windows 8 中测试了这个应用程序,它适用于我的测试用例(在 32 位进程内存中搜索特定字符串),但我不希望它以后适得其反。

注意:我知道this answer,这就是我首先提出这个问题的原因。我用 32 位二进制文​​件进行了测试,它可以正常工作。

【问题讨论】:

  • 不,他们说的调试器功能是this one。您不能可靠地将 VirtualQueryEx() 用于 32 位程序中的 64 位进程。
  • 那么,VirtualQueryEx 不被视为调试器?文档看起来模棱两可:(

标签: windows winapi 32bit-64bit


【解决方案1】:

所以,总而言之,我只是个菜鸟,通过一个简单的测试就解决了:

如果我尝试使用 MEMORY_BASIC_INFORMATION32 而不是 MEMORY_BASIC_INFORMATION

VirtualQueryEx 失败并出现错误 24 (ERROR_BAD_LENGTH)

答案是,始终使用MEMORY_BASIC_INFORMATION

我就是这样称呼VirtualQueryEx

MEMORY_BASIC_INFORMATION32 info32;
SIZE_T r32 = VirtualQueryEx(hndl,
                            (void *) 0x0,
                            (PMEMORY_BASIC_INFORMATION) &info32,
                            sizeof(info32));

【讨论】:

  • 这是不对的,因为当您使用 32 位指针时,您如何将内存定位在 64 位进程中?您链接到的答案是正确的(并告诉您不要这样做)。 (我的回答错了 - 已删除)。
  • 记住这个问题是问如果TARGET是32位(源进程是64位)是否有问题,所以指针大小没有问题。
  • 对。在另一个方向,这将是一个问题。
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 2010-09-12
  • 2013-01-03
  • 1970-01-01
  • 2011-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多