我编写了一个程序,该程序枚举具有以下属性的进程的所有内存区域:MEM_COMMIT和PAGE_READWRITE,并且在程序末尾打印找到的所有区域的总大小,看起来一切正常,然后我在64位程序上进行了尝试,结果发现总区域大小大于PC上可用的RAM。在我的PC上有15.9GB的可用RAM,而我进行的扫描之一是18.363.846.656字节(18.3 GB)。我想知道,这怎么可能?这是我的代码中的错误,还是他们使用了我不知道的某些内存管理方法?
#include <iostream>
#include <Windows.h>
int main()
{
// Get an handle to the process
HWND hWnd = FindWindowA(NULL, "WindowName");
DWORD pid; GetWindowThreadProcessId(hWnd, &pid);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
// Declaration of some variables
char* Ptr(0);
MEMORY_BASIC_INFORMATION Mem;
size_t totalSize = 0;
// Start querying
while (VirtualQueryEx(hProcess, Ptr, &Mem, sizeof(MEMORY_BASIC_INFORMATION)))
{
if (Mem.State == MEM_COMMIT && Mem.Protect == PAGE_READWRITE)
{
totalSize += Mem.RegionSize;
std::cout << std::hex << Mem.BaseAddress << " - " << (LPVOID)(Mem.RegionSize + (INT64)Mem.BaseAddress) << " - size:(" << std::dec << Mem.RegionSize << ")\n";
}
Ptr += Mem.RegionSize;
}
std::cout << "[" << totalSize << "]";
CloseHandle(hProcess);
return 0;
}
[SysInternals中有RAMMap,它可以显示有关物理内存的信息,但是源代码不是公开的。在Microsoft的video中解释了RAMMap
要了解有关系统如何工作的更多信息,可以在Windows Internals手册中查找“物理内存”。
此答案中有一些代码声称可以使用NtOpenSection和NtMapViewOfSection从用户模式here查询物理内存。
要从内核驱动程序与物理内存进行交互,您可以阅读this source code