簡體   English   中英

關於查詢memory區域的問題(Windows)

[英]Question on querying memory regions (Windows)

我編寫了一個程序,它枚舉具有以下屬性的進程的所有 memory 區域:MEM_COMMIT 和 PAGE_READWRITE,並且在程序結束時打印找到的所有區域的總大小,一切似乎都運行良好,然后我嘗試了它在 64 位的程序上,結果發現總區域大小大於我 PC 上可用的 RAM。 在我的 PC 上,有 15.9GB 的 RAM 可用,而我進行的掃描之一是 18.363.846.656 字節(18.3 GB)。 我想知道,這怎么可能? 這是我的代碼中的錯誤,還是他們使用了一些我不知道的 memory 管理方法?

#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;
}

您不能使用任何正常記錄的 Windows API 函數查詢物理 memory。 虛擬 Memory 旨在成為一種抽象,操作系統旨在為您在后台處理所有這些。

SysInternals的 RAMMap 可以顯示有關物理 memory 的信息,但源代碼不公開。 RAMMap 在 Microsoft 的此視頻中進行了解釋

要了解有關系統如何工作的更多信息,您可以在 Windows 內部手冊中查找“物理內存”。

這個答案中有一些代碼聲稱能夠使用 NtOpenSection 和NtMapViewOfSection從用戶模式查詢物理 memory。

要從 kernel 驅動程序與物理 memory 交互,您可以閱讀此源代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM