MEMORY_BASIC_INFORMATION32不再合法

MEMORY_BASIC_INFORMATION32 not legal anymore?

本文关键字:不再 INFORMATION32 BASIC MEMORY      更新时间:2023-10-16

我正在尝试使用Windows API查询内存信息。我的目标是x86和x64。所以我读了文档MEMORY_BASIC_INFORMATION,发现我需要两个不同的查询取决于目标进程的"位"。

但是当我查询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));
     }
}

与具有冲突位的进程的内存交互代表了许多Windows API函数的问题,包括这个函数。VirtualQueryEx()在x86下编译时需要一个4字节的指针,但是如果你试图在x86程序的x64进程中使用它,你不能给它一个8字节的指针。

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

出于这个原因,最好的方法是为每个位编译单独的二进制文件,并且只使用MEMORY_BASIC_INFORMATION,以便它使用宏自行解析。