1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Доброго времени суток=) Требуется составить карту виртуальной памяти для любого процесса.. Соответственно, буду использовать функцию VirtualQuery().. Ну а перед этим хочу прояснить для себя то, что не ясно..
Объясните пожалуйста, откуда взять 1-й параметр(указатель на адрес)...и как учесть, что карта составляется для какого-то процесса (ведь в задании говорится о составлении карты виртуальной памяти для любого процесса)?
Вот что у меня получилось... Но выводит только 1 строку... Не очень пойму в чём дело...могу предположить, что не осуществляется переход к очередной странице в области... Объясните пожалуйста, чего не хватает или где я ошибаюсь??
MEMORY_BASIC_INFORMATION mbi; PVOID pvAddress = NULL; HANDLE hPr=OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,PID); BOOL fOk = (VirtualQueryEx(hPr, pvAddress, &mbi, sizeof(mbi)) == sizeof(mbi)); if (!fOk) MessageBox(hWndMain,TEXT("Bad memory address"),TEXT("Error"),MB_ICONERROR);// Bad memory address, return failure else { // Walk starting at the region's base address (which never changes) PVOID pvRgnBaseAddress = mbi.AllocationBase; // Walk starting at the first block in the region (changes in the loop) PVOID pvAddressBlk = pvRgnBaseAddress; for(;;) { // Get info about the current block. fOk = (VirtualQueryEx(hPr, pvAddressBlk, &mbi, sizeof(mbi))== sizeof(mbi)); if (!fOk) break; // Couldn't get the information, end loop. // Is this block in the same region? if (mbi.AllocationBase != pvRgnBaseAddress) break; // Found a block in the next region; end loop. wsprintf(lpProcName,_T("%d bytes, 0x%X, 0x%X "), mbi.RegionSize,mbi.State,mbi.Type); SendMessage(hListBox,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)lpProcName); pvAddressBlk = (PVOID) ((PBYTE) pvAddressBlk + mbi.RegionSize);