![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Получение информации о состояниии виртуальной памяти
Сведения о конкретной платформе предоставляет процедура: void GetSystemInfo(LPSYSTEM_INFO lpSystemInfo)Структура данных SYSTEM_INFO описана cледующим образом: typedef struct _SYSTEM_INFO { union { DWORD dwOemId; struct { WORD wProcessorArchitecture; WORD wReserved; }; }; DWORD dwPageSize; LPVOID lpMinimumApplicationAddress; LPVOID lpMaximumApplicationAddress; DWORD_PTR dwActiveProcessorMask; DWORD dwNumberOfProcessors; DWORD dwProcessorType; DWORD dwAllocationGranularity; WORD wProcessorLevel; WORD wProcessorRevision; } SYSTEM_INFO
Более подробная информация приведена в MSDN. Для динамического отслеживания текущего состояния памяти используется процедура void GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer); Структура данных _MEMORYSTATUS описана какtypedef struct _MEMORYSTATUS { DWORD dwLength; DWORD dwMemoryLoad; SIZE_T dwTotalPhys; SIZE_T dwAvailPhys; SIZE_T dwTotalPageFile; SIZE_T dwAvailPageFile; SIZE_T dwTotalVirtual; SIZE_T dwAvailVirtual; } MEMORYSTATUS, *LPMEMORYSTATUS Назначение полей данной структуры: dwMemoryLoad - оценка занятости системы управления памятью(0-100) dwTotalPhys - общий размер физической памяти RAM-памяти в байтах dwAvailPhys - общий размер физической памяти RAM-памяти в байтах, доступной для выделения dwTotalPageFile - максимальное количество байтов, которое может содержаться в страничном файде на жестком диске (или дисках) dwAvailPageFile - максимальное количество байтов, которое может быть передано процессу из страничного файла dwTotalVirtual: DWORD - количество байтов в адресном пространстве, принадлежащих лично данному процессу dwAvailVirtual - суммарный объем всех свободных регионов в адресном пространстве процесса, вызывающего процедуру GlobalMemoryStatus вычитая из dwTotalVirtual полученное значение, можно найти размер зарезервированной процессом области в виртуальном адресном пространстве
Перед вызовом процедуры необходимо занести в поле dwLength размер структуры в байтах с помощью функции sizeof().
Для запроса информации об участке памяти по заданному адресу (размер, тип памяти, атрибуты защиты) текущего процесса служит функция: SIZE_T VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength);
При вызове функции первый параметр должен содержать адрес виртуальной памяти, о котором нужно получить информацию. Второй параметр – переменная типа, описанного как 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;
Назначение полей данной структуры: BaseAddress - значение параметра lpAddress, округленное до значения, кратного размеру страницы AllocationBase - базовый адрес региона, включающего адрес запроса AllocationProtect - атрибут защиты региона – некоторые из возможных значений PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE RegionSize - суммарный размер (в байтах) группы страниц, начинающихся с базового адреса и имеющих те же атрибуты защиты, состояние и тип, что и страница, обнаруженная по адресу lpAddress State - указывает состояние (MEM_FREE, MEM_RESERVE, MEM_COMMIT) всех смежных страниц, имеющих те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу lpAddress
Для состояния MEM_FREE элементы Allocationbase, Alloocation, Protect и Type не определяются Protect - содержит атрибут защиты (PAGE_*), общий для всех смежных страниц, имеющих те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу lpAddress Type - определяет тип физической памяти (MEM_IMAGE, MEM_MAPPED или MEM_PRIVATE), связанной с группой смежных страниц, имеющих имеющих те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу lpAddress
Параметр dwLength задает размер структуры MEORY_BASIC_INFORMATION. Функция VirtualQuery() возвращает число байт, скопированных в буфер. Если возвращено нулевое значение, информация о запрошенном участке НЕ ПОЛУЧЕНА. Сканируя память в диапазоне от минимального до максимального адреса, можно построить карту виртуальной памяти процесса.
|