Архитектура памяти Windows
От: Анонимщик  
Дата: 13.02.03 08:57
Оценка:
Читаю Рихтера, и не могу понять следующего вопроса. Нужно получить как можно больше информации о памяти чужих процессов.
ProcessEntry32 pe32;
//
hProcessSnapShot = CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Process32First(hProcessSnapShot, pe32);
// Это я получил доступ к процессу

MemoryBasicInformation mbi;
//
lpcVoid = 0;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, pe32.th32ProcessID);
VirtualQueryEx(hProcess, lpcVoid, mbi, SizeOf(mbi))
// это я получил доступ к информации о памяти процесса
// Детали — в mbi
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

Не пойму разницы между первым и вторым полем
В RegionSize возвращается размер зарезервированного региона (по русски правильно — области?). Я так понял, что это группа страниц, имеющих одинаковые атрибуты, причем с нюансами. Я так понял, что они (эти страницы) при попытке выделении памяти могли быть выделены с разными атрибутами, но операционная система решила по-своему, и они оказались с одинаковыми атрибутами. Но формально атрибуты все же разные. Но в этом RegionSize возвращается размер именно того, что решила операционная система. Но дело в том, что можно каким-то образом узнать и формальные параметры, с какими производилась попытка выделения всех страниц этого региона. Это и делает Рихтер, каким-то образом манипулируя с первыми двумя полями. Как — не пойму. Т.е. в каждом регионе — несколько блоков.
Я совсем не уверен, что все правильно понял. Можете прокомментировать и сказать, как получить количество этих самых блоков и чем отличаются BaseAddress и AllocationBase. Из MSDN нихрена не понял.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.