![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
18192123 |
![]()
Сообщение
#1
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Доброго времени суток=)
Требуется составить карту виртуальной памяти для любого процесса.. Соответственно, буду использовать функцию VirtualQuery().. Ну а перед этим хочу прояснить для себя то, что не ясно.. Итак..
DWORD VirtualQuery(
LPCVOID lpAddress,
PMEMORY_BASIC_INFORMATION lpBuffer,
DWORD dwLength
);
Объясните пожалуйста, откуда взять 1-й параметр(указатель на адрес)...и как учесть, что карта составляется для какого-то процесса (ведь в задании говорится о составлении карты виртуальной памяти для любого процесса)? |
![]() ![]() |
18192123 |
![]()
Сообщение
#2
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Вот что у меня получилось...
Но выводит только 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);
}//end for(;;)
}//end else
|
![]() ![]() |
![]() |
Текстовая версия | 29.07.2025 5:35 |