在32位进程上从64位进程调用VirtualQueryEx函数

时间:2014-11-05 21:45:54

标签: windows winapi 32bit-64bit

TL; DR:如果我在64位进程的32位进程上调用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位二进制文​​件,它只是没有错误。

1 个答案:

答案 0 :(得分:2)

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

如果我尝试使用VirtualQueryEx代替MEMORY_BASIC_INFORMATION32

,则

MEMORY_BASIC_INFORMATION失败,错误 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));