Вопрос по запросам областей памяти (Windows) - PullRequest
0 голосов
/ 03 мая 2020

Я написал программу, которая перечисляет все области памяти процесса со следующими атрибутами: MEM_COMMIT и PAGE_READWRITE, и что в конце программы выводится общий размер всех найденных областей, все, кажется, работает хорошо, затем я попробовал это на программах на 64 битах, и оказалось, что общий размер областей был больше, чем доступная память на моем P C. На моем P C доступно 15,9 ГБ оперативной памяти, в то время как один из выполненных мною сканирований был 18,363,846,656 байт (18,3 ГБ). Интересно, как это возможно? это ошибка в моем коде, или они используют некоторые методы управления памятью, о которых я не знаю?

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