关于查询内存区域的问题(Windows)

问题描述 投票:0回答:1

我编写了一个程序,该程序枚举具有以下属性的进程的所有内存区域: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;
}
c++ memory memory-management
1个回答
0
投票
您无法使用已记录的任何正常Windows API函数查询物理内存。虚拟内存旨在作为一种抽象,操作系统旨在为您在后台处理所有这些。

[SysInternals中有RAMMap,它可以显示有关物理内存的信息,但是源代码不是公开的。在Microsoft的video中解释了RAMMap

要了解有关系统如何工作的更多信息,可以在Windows Internals手册中查找“物理内存”。

此答案中有一些代码声称可以使用NtOpenSection和NtMapViewOfSection从用户模式here查询物理内存。

要从内核驱动程序与物理内存进行交互,您可以阅读this source code

© www.soinside.com 2019 - 2024. All rights reserved.