Сведения о функциях API приведены в таблице ниже.
Получение сведений о странице виртуальной памяти
Чтобы получить сведения о странице виртуальной памяти, нужно вызвать функцию KnVmQuery().
Получение размера буфера MDL
Чтобы получить размер буфера MDL, нужно вызвать функцию KnPmmMdlGetSize().
Получение сведений о регионе виртуальной памяти, на который отображен буфер MDL
Буферы MDL используются не только для создания разделяемой памяти и загрузки сегментов ELF-образа в память нового процесса, но и для создания дампа памяти процесса, находящегося в "замороженном" состоянии. Функция KnTaskGetNextVmRegion() из API task_api.h создает буфер MDL из физической памяти, отображенной на регион виртуальной памяти процесса, находящегося в "замороженном" состоянии. Таблица описания памяти этого буфера MDL может содержать фиктивные регионы физической памяти, для которых указан размер, но не указан адрес. Фиктивные регионы физической памяти в таблице описания памяти буфера MDL соответствуют участкам незафиксированных страниц в регионе виртуальной памяти процесса, находящегося в "замороженном" состоянии. Созданный функцией KnTaskGetNextVmRegion() буфер MDL нужно отобразить вызовом функции KnPmmMdlMap() на регион виртуальной памяти процесса, создающего дамп, для последующего сохранения содержимого. Этот регион виртуальной памяти будет содержать участки незафиксированных страниц, если таблица описания памяти буфера MDL содержит фиктивные регионы физической памяти. Если процесс, создающий дамп, будет обращаться к участкам незафиксированных страниц в регионе виртуальной памяти, на который отображен буфер MDL, то это приведет к нежелательному выделению физической памяти. Сведения о распределении зафиксированных и незафиксированных страниц в регионе виртуальной памяти, на который отображен буфер MDL, позволяют процессу, создающему дамп, избежать обращения к участкам незафиксированных страниц в этом регионе виртуальной памяти.
Чтобы получить сведения о распределении зафиксированных и незафиксированных страниц в регионе виртуальной памяти, на который отображен буфер MDL, нужно использовать функцию KnPmmMdlGetUsageMap(). Через выходной параметр counters функция передает массив счетчиков зафиксированных и незафиксированных страниц. Счетчики зафиксированных и незафиксированных страниц строго чередуются. Это отражает, что за участком зафиксированных страниц следует участок незафиксированных страниц и наоборот. Выходной параметр firstUsed позволяет определить, какой счетчик является первым в массиве: счетчик зафиксированных страниц или счетчик незафиксированных страниц.
Для сбора сведений об одном регионе виртуальной памяти может потребоваться повторно вызывать функцию KnPmmMdlGetUsageMap() по следующим причинам:
При повторном вызове функции KnPmmMdlGetUsageMap() в параметре startPage нужно указать смещение, то есть число страниц, для которых уже собраны сведения при предыдущих вызовах функции.
Чтобы убедиться в том, что сбор сведений осуществлен для всего региона виртуальной памяти, на который отображен буфер MDL, нужно проверить выполнение одного из следующих условий:
KnPmmMdlGetUsageMap(), соответствует размеру буфера MDL.KnPmmMdlGetUsageMap() через параметр usedCounters при повторном вызове, равно нулю.Сведения о функциях API
Функции vmm_api.h
Функция |
Сведения о функции |
|---|---|
|
Назначение Позволяет получить сведения о странице виртуальной памяти. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить размер буфера MDL. Параметры
Возвращаемые значения В случае успеха возвращает |
|
Назначение Позволяет получить сведения о распределении зафиксированных и незафиксированных страниц в регионе виртуальной памяти, на который отображен буфер MDL. Параметры
Возвращаемые значения В случае успеха возвращает |