Поделиться через


Функция 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

См. также раздел

ExAllocatePoolWithTag

MmAllocateContiguousMemorySpecifyCache

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages