Co ty, 2GB pamięci przeszukujesz, czytając po 4 bajty?!
Najsensowniej byłoby przeszukiwać tylko te obszary pamięci, które są w danej chwili wykorzystywane przez proces, a nie jego całą możliwą przestrzeń adresową
(choć przyjąłeś bardzo naiwne założenie odnośnie jej początku i końca).
Skrobnąłem kod, który wylicza (chyba) wszystkie bloki pamięci, które są w użyciu przez aplikację, wliczając w to pamięć sterty, stosu, zmiennych statycznych i kodu:
- Kod: Zaznacz cały
SYSTEM_INFO sys_info;
GetSystemInfo(&sys_info);
DWORD procID = ????; HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,TRUE,procID);
if(hProcess)
{
const void* p = sys_info.lpMinimumApplicationAddress;
MEMORY_BASIC_INFORMATION mem_info;
while(VirtualQueryEx(hProcess,p,&mem_info,sizeof(MEMORY_BASIC_INFORMATION)) == sizeof(MEMORY_BASIC_INFORMATION))
{
if(mem_info.State == MEM_COMMIT)
{
cout << p << " size = " << mem_info.RegionSize << '\n';
}
p = (char*)mem_info.BaseAddress + mem_info.RegionSize;
if(p >= sys_info.lpMaximumApplicationAddress)break;
}
CloseHandle(hProcess);
}