IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Карта виртуального адресного пространства, VC++ 2008 EE
18192123
сообщение 16.11.2008 0:15
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Доброго времени суток=)
Требуется составить карту виртуальной памяти для любого процесса..
Соответственно, буду использовать функцию VirtualQuery()..
Ну а перед этим хочу прояснить для себя то, что не ясно..

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


Объясните пожалуйста, откуда взять 1-й параметр(указатель на адрес)...и как учесть, что карта составляется для какого-то процесса (ведь в задании говорится о составлении карты виртуальной памяти для любого процесса)?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
18192123
сообщение 16.11.2008 22:15
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Вот что у меня получилось...
Но выводит только 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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 29.07.2025 5:35
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"