-1

我正在尝试使用 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));
     }
}

谢谢是提前。

4

1 回答 1

0

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

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

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

于 2020-04-02T00:37:45.283 回答