MEMORY_BASIC_INFORMATION32不再合法?

时间:2016-11-11 18:07:29

标签: c++ virtualquery

我正在尝试使用Windows API查询内存信息。 我想同时针对x86和x64。所以我阅读了有关的文档 MEMORY_BASIC_INFORMATION,发现我需要做两件事 不同的查询取决于目标流程" bitness"。

但是当我查询x86进程并使用MEMORY_BASIC_INFORMATION32时 结构我得到系统错误代码24.其中说明命令的长度 是不合法的。

但是当我使用MEMORY_BASIC_INFORMATION64版本时,该调用适用于x86和x64进程。 这是怎么回事。这不是我理解文档告诉我的内容。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa366775(v=vs.85).aspx

这种行为在各个版本中都是可移植的。任何人都可以解释这种行为。或者只是我的系统完全搞砸了?

这是我使用的代码:

class Process {
     HANDLE m_handle;

     bool Process::query_impl(RemotePointer address, void *info, size_t size) {
           return VirtualQueryEx(m_handle, address.get(), (MEMORY_BASIC_INFORMATION*) info, size);
     }
public:

     bool Process::query(RemotePointer address, MEMORY_BASIC_INFORMATION64 &info) {
           return query_impl(address, &info, sizeof(MEMORY_BASIC_INFORMATION64));
     }

     bool Process::query(RemotePointer address,  MEMORY_BASIC_INFORMATION32 &info) {
           return query_impl(address, &info, sizeof(MEMORY_BASIC_INFORMATION32));
     }
}

谢谢你的到来。

1 个答案:

答案 0 :(得分:0)

与位冲突的进程的内存交互表示许多Windows API函数(包括该函数)存在的问题。在x86上编译时,VirtualQueryEx()需要一个4字节的指针,但是如果您尝试在x86程序的x64进程上使用它,则不能为它提供8字节的指针。

即使您以某种方式使它工作,您也只能查询底部约4GB的内存

因此,最好的做法是针对每个位编译单独的二进制文件,并仅使用MEMORY_BASIC_INFORMATION,以便它使用宏自行解决。