我正在尝试使用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));
}
}
谢谢你的到来。
答案 0 :(得分:0)
与位冲突的进程的内存交互表示许多Windows API函数(包括该函数)存在的问题。在x86上编译时,VirtualQueryEx()需要一个4字节的指针,但是如果您尝试在x86程序的x64进程上使用它,则不能为它提供8字节的指针。
即使您以某种方式使它工作,您也只能查询底部约4GB的内存
因此,最好的做法是针对每个位编译单独的二进制文件,并仅使用MEMORY_BASIC_INFORMATION,以便它使用宏自行解决。