Я написал программу, которая перечисляет все области памяти процесса со следующими атрибутами: 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;
}