1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Доброго времени суток=) Требуется составить карту виртуальной памяти для любого процесса.. Соответственно, буду использовать функцию VirtualQuery().. Ну а перед этим хочу прояснить для себя то, что не ясно..
Объясните пожалуйста, откуда взять 1-й параметр(указатель на адрес)...и как учесть, что карта составляется для какого-то процесса (ведь в задании говорится о составлении карты виртуальной памяти для любого процесса)?
Объясните пожалуйста, откуда взять 1-й параметр(указатель на адрес)...и как учесть, что карта составляется для какого-то процесса (ведь в задании говорится о составлении карты виртуальной памяти для любого процесса)?
Не делать себе проблемы, а потом героически их преодолевать, а сразу воспользоваться VirtualQueryEx
Вот что у меня получилось... Но выводит только 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);
могу предположить, что не осуществляется переход к очередной странице в области...
Естественно... В той программе, ссылка на которую есть в предыдущем посте, ты из всего, что нужно, реализовала только функциональность VMQueryHelp (частично), а нужно еще и вызывать эту самую VMQuery, и из нее - VMQueryHelp...
if (fOk) { // Construct the line to be displayed, and add it to the list box. TCHAR szLine[1024]; ConstructRgnInfoLine(hProcess, &vmq, szLine, sizeof(szLine)); ListBox_AddString(hwndLB, szLine);
if (fExpandRegions) { for (DWORD dwBlock = 0; fOk && (dwBlock < vmq.dwRgnBlocks); dwBlock++) {
// Get the address of the next region to test. pvAddress = ((PBYTE) pvAddress + vmq.BlkSize); if (dwBlock < vmq.dwRgnBlocks - 1) { // Don't query the memory info after the last block. fOk = VMQuery(hProcess, pvAddress, &vmq); } } }
// Get the address of the next region to test. pvAddress = ((PBYTE) vmq.pvRgnBaseAddress + vmq.RgnSize); } }