Помощь - Поиск - Пользователи - Календарь
Полная версия: Карта виртуального адресного пространства
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
18192123
Доброго времени суток=)
Требуется составить карту виртуальной памяти для любого процесса..
Соответственно, буду использовать функцию VirtualQuery()..
Ну а перед этим хочу прояснить для себя то, что не ясно..

Итак..
   
DWORD VirtualQuery(
LPCVOID lpAddress,
PMEMORY_BASIC_INFORMATION lpBuffer,
DWORD dwLength
);


Объясните пожалуйста, откуда взять 1-й параметр(указатель на адрес)...и как учесть, что карта составляется для какого-то процесса (ведь в задании говорится о составлении карты виртуальной памяти для любого процесса)?
volvo
Цитата
Объясните пожалуйста, откуда взять 1-й параметр(указатель на адрес)...и как учесть, что карта составляется для какого-то процесса (ведь в задании говорится о составлении карты виртуальной памяти для любого процесса)?
Не делать себе проблемы, а потом героически их преодолевать, а сразу воспользоваться VirtualQueryEx
18192123
Ага, тогда с любым процессом ясно..
А вот насчёт параметра lpAddress..Откуда я должна узнать этот базовый адрес области страниц?
volvo
Вот пример использования VirtualQueryEx: VMMap
18192123
Вот что у меня получилось...
Но выводит только 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

volvo
Цитата
могу предположить, что не осуществляется переход к очередной странице в области...
Естественно... В той программе, ссылка на которую есть в предыдущем посте, ты из всего, что нужно, реализовала только функциональность VMQueryHelp (частично), а нужно еще и вызывать эту самую VMQuery, и из нее - VMQueryHelp...
  while (fOk) {

VMQUERY vmq;
fOk = VMQuery(hProcess, pvAddress, &vmq);

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++) {

ConstructBlkInfoLine(&vmq, szLine, sizeof(szLine));
ListBox_AddString(hwndLB, szLine);

// 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);
}
}
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.