Программа-пример VMMap
Эта программа, "14_VMMap.exe" (см. листинг на рис 14-4), просматривает свое адресное пространство и показывает содержащиеся в нем регионы и блоки, присутствующие в регионах Файлы исходного кода и ресурсов этой программы находятся в каталоге 14-VMMap на компакт-диске, прилагаемом к книге. После запуска VMMap на экране появляется следующее окно:
Карты виртуальной памяти, представленные в главе 13 в таблицах 13-2, 13-3 и 13-4, созданы с помощью именно этой программы.
Каждый злемент в списке — результат вызова моей функции VMQuery. Основний цикл программы VMMap (в функции Refresb) выглядит так:
BOOL fOk = TRUE;
PVOID pvAddress = NULL;
...
while (fOk)
{
VMQUERY vmq;
fOk = VMQuery(hProcess, pvAddress, &vmq);
if (fOk)
{
// формируем строку для вывида на экран
// и добавляем ее в окно списка
TCHAR szLine[1024];
ConstructRgnInfoLine(hProcess. &vmq, szLine, sizeof(szLine});
LisTBox_AddString(hwndLB, szLine);
if (fExpandRegions)
{
for (DWORD dwBlock = 0; f0k && (dwBlock < vmq.dwRgnBlocks); dwBlock++)
{
ConstructBlkInfoLine(&vmq, szLine, sizeof(szLine));
ListBox_AddString(hwndLB, szLine);
// получаем адрес следующего региона
pvAddress = ((PBYTE) pvAddress + vmq BlkSize);
if (dwBlock < vmq dwRgnBlocks - 1)
{
// нельзя запрашивать информацию о памяти за последним блоком
fOk = VMQuery(liProcess, pvAddress, &vmq);
}
}
}
// получаем адрес следующего региона
pvAddress = ((PBYTE) vmq pvRgnBaseAddress + vmq.RgnSize);
}
}
Этот цикл начинает работу с виртуального адреса NULL и заканчивается, когда VMQuery возвращает FALSE, что указывает на невозможность дальнейшего просмотра адресного пространства процесса. На каждой итерации цикла вызывается функция ConstructRgnlnfoLine; она заполняет символьный буфер информацией о регионе. По том эти данные вносятся в список.
В основной цикл вложен еще один цикл — он позволяет получать информацию о каждом блоке текущего региона. На каждой итерации из данного цикла вызывается функция ConstructBlklnfoLine, заполняющая символьный буфер информацией о блоках региона. Эти данные тоже добавляются к списку. В общем, с помощью функции VMQuery просматривить адресное пространство процесса очень легко.
VMMap