Функция MmAllocatePagesForMdl (wdm.h)
Подпрограмма MmAllocatePagesForMdl выделяет страницы физической памяти для MDL с нулевой заполненной, нестраничной, физической памятью.
Синтаксис
PMDL MmAllocatePagesForMdl(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes
);
Параметры
[in] LowAddress
Задает физический адрес начала первого диапазона адресов, из которого могут поступать выделенные страницы. Если MmAllocatePagesForMdl не удается выделить запрошенное число байтов в первом диапазоне адресов, он выполняет итерацию по дополнительным диапазонам адресов, чтобы получить больше страниц. При каждой итерации MmAllocatePagesForMdl добавляет значение SkipBytes в предыдущий начальный адрес, чтобы получить начало следующего диапазона адресов.
[in] HighAddress
Указывает физический адрес конца первого диапазона адресов, из которого могут поступать выделенные страницы.
[in] SkipBytes
Указывает количество байтов, пропускаемых с начала предыдущего диапазона адресов, из которого могут поступать выделенные страницы. SkipBytes должен быть целым числом размером страницы виртуальной памяти в байтах.
[in] TotalBytes
Указывает общее количество байтов, выделяемых для MDL.
Возвращаемое значение
MmAllocatePagesForMdl возвращает одно из следующих элементов:
Возвращаемый код | Описание |
---|---|
указателя MDL | Указатель MDL описывает набор физических страниц в указанном диапазоне адресов. Если запрашиваемое число байтов недоступно, MDL описывает столько физической памяти, сколько доступно. |
NULL | В указанных диапазонах адресов нет страниц физической памяти или недостаточно пула памяти для самого MDL. |
Замечания
Драйверы, работающие в Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версиях Windows, должны использовать подпрограмму MmAllocatePagesForMdlEx вместо MmAllocatePagesForMdl. MmAllocatePagesForMdlEx обеспечивает лучшую производительность, чем MmAllocatePagesForMdl, избегая ненужных сбросов буфера внешнего вида перевода (TLB) и памяти кэша.
Страницы физической памяти, возвращаемые MmAllocatePagesForMdl обычно не являются смежными страницами. MmAllocatePagesForMdl всегда заполняет выделенные страницы в возвращаемом MDL с нулями.
MmAllocatePagesForMdl предназначено для использования драйверами в режиме ядра, которые не нуждаются в соответствующих виртуальных адресах (т. е. они нуждаются в физических страницах и не нуждаются в том, чтобы страницы были физически смежными) или драйверами в режиме ядра, которые могут добиться существенного повышения производительности, если физическая память устройства выделена в определенном физическом диапазоне адресов. Драйвер графической карты AGP является примером такого драйвера.
В зависимости от объема физической памяти, доступной в запрошенных диапазонах, MmAllocatePagesForMdl может возвращать MDL, описывающий меньше памяти, чем запрошено. Подпрограмма возвращает NULL, если память не выделена. Вызывающий объект должен проверить объем памяти, который фактически выделяется для MDL.
Вызывающий объект должен использовать MmFreePagesFromMdl, чтобы освободить страницы памяти, описанные MDL, созданной MmAllocatePagesForMdl. После вызова MmFreePagesFromMdlвызывающий объект также должен вызвать ExFreePool, чтобы освободить память, выделенную для самой структуры MDL.
В Windows 2000 и более поздних версиях Windows максимальный объем памяти, MmAllocatePagesForMdl может выделяться в одном вызове (4 гигабайта — PAGE_SIZE). Подпрограмма может удовлетворить запрос на выделение этого объема только в том случае, если доступны достаточно страниц.
MmAllocatePagesForMdl выполняется в IRQL <= APC_LEVEL. Windows Server 2008 и более поздних версий операционной системы Windows позволяют вызывать вызывающие DISPATCH_LEVEL MmAllocatePagesForMdl. Однако вы можете повысить производительность драйвера, вызвав APC_LEVEL или ниже.
Вызов MmAllocatePagesForMdl из специального вызова асинхронной процедуры ядра (APC) может привести к рекурсивному приобретению монопольной блокировки, которая находится только в критическом регионе (отключены пользовательские или обычные API ядра), но не в защищенном регионе (все API отключены).
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | См. раздел "Примечания". |
правил соответствия DDI | HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport) |