Функция MmBuildMdlForNonPagedPool (wdm.h)
Подпрограмма MmBuildMdlForNonPagedPool получает MDL-файл, указывающий буфер виртуальной памяти без пахоты, и обновляет его для описания базовых физических страниц.
Синтаксис
void MmBuildMdlForNonPagedPool(
[in, out] PMDL MemoryDescriptorList
);
Параметры
[in, out] MemoryDescriptorList
Указатель на MDL, указывающий буфер виртуальной памяти в несоположенной памяти. Вызывающий объект использовал подпрограмму IoAllocateMdl для создания MDL для этого буфера.
Возвращаемое значение
None
Remarks
При входе указанный MDL должен описывать буфер в непагружаемой системной памяти или в памяти, заблокированной (физические страницы не могут быть проданы), например память, выделенную подпрограммой ExAllocatePoolWithTag с PoolType = NonPagedPool или подпрограммой MmAllocateContiguousMemorySpecifyCache . MmBuildMdlForNonPagedPool обновляет MDL для описания базовых физических страниц.
MmBuildMdlForNonPagedPool не может использоваться с mdls, описывающими буферы, выделенные в стеке ядра. Чтобы создать MDL, описывающий буфер стека ядра, драйверы должны вызывать MmProbeAndLockPages. Это связано с тем, что страницы стека ядра могут быть проданы, если они не находятся в пробе и блокировке. Это правило применяется, даже если драйвер гарантирует, что стек ядра не может быть выложен на страницу.
Так как страницы, описанные в MDL, уже не поддерживают страницы и уже сопоставлены с системным адресным пространством, драйверы не должны пытаться заблокировать их с помощью процедуры MmProbeAndLockPages или создать дополнительные сопоставления системного адресного пространства с помощью процедуры MmMapLockedPagesSpecifyCache . Аналогичным образом драйверы не должны пытаться разблокировать страницы с помощью процедуры MmUnlockPages или освободить существующее сопоставление системных адресов и пространств с помощью процедуры MmUnmapLockedPages . Если драйвер выполняет какие-либо из этих недопустимых операций в MDL, созданном MmBuildMdlForNonPagedPool, результирующее поведение не определено.
Передача MDL, созданного mmBuildMdlForNonPagedPool , в подпрограмму MmGetSystemAddressForMdlSafe , разрешена. В этом случае вызов MmGetSystemAddressForMdlSafe просто возвращает начальный виртуальный адрес буфера, описанный в MDL.
Драйвер может использовать подпрограмму MmMapLockedPagesSpecifyCache для сопоставления MDL, созданного MmBuildMdlForNonPagedPool, с виртуальным адресным пространством пользователя. Однако драйвер должен выполнять эту операцию таким образом, чтобы избежать определенных проблем с безопасностью. Дополнительные сведения см. в разделе MmMapLockedPagesSpecifyCache.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно начиная с Windows 2000. |
Целевая платформа | Универсальное |
Верхняя часть | wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=DISPATCH_LEVEL |