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


Функция MmBuildMdlForNonPagedPool (wdm.h)

Подпрограмма MmBuildMdlForNonPagedPool получает MDL, указывающий непагаченный буфер виртуальной памяти и обновляет его, чтобы описать базовые физические страницы.

Синтаксис

void MmBuildMdlForNonPagedPool(
  [in, out] PMDL MemoryDescriptorList
);

Параметры

[in, out] MemoryDescriptorList

Указатель на MDL, указывающий буфер виртуальной памяти в непагаченной памяти. Вызывающий объект использовал подпрограмму IoAllocateMdl для создания MDL для этого буфера.

Возвращаемое значение

Никакой

Замечания

При входе, указанный MDL должен описывать буфер в непагрегированном системном памяти или в памяти, заблокированной (физические страницы нельзя торговать), например память, выделенную подпрограммой exAllocatePoolWithTag с PoolType = NonPagedPool или подпрограммой MmAllocateContiguousMemorySpecifyCache. MmBuildMdlForNonPagedPool обновляет MDL для описания базовых физических страниц.

MmBuildMdlForNonPagedPool не может использоваться с многомерными выражениями, описывающими буферы, выделенные в стеке ядра. Чтобы создать MDL, описывающий буфер стека ядра, драйверы должны вызывать MmProbeAndLockPages. Это связано с тем, что страницы стека ядра можно торговать, если они не заблокированы. Это правило применяется, даже если драйвер гарантирует, что стек ядра не может быть выстраивается.

Так как страницы, описанные MDL, уже не отображаются и уже сопоставлены с адресным пространством системы, драйверы не должны пытаться заблокировать их с помощью процедуры MmProbeAndLockPages или создать дополнительные сопоставления пространства системных адресов с помощью процедуры MmMapLockPagesSpecifyCache. Аналогичным образом драйверы не должны пытаться разблокировать страницы с помощью процедуры MmUnlockPages или выпуска существующего сопоставления пространства адресов системы с помощью процедуры MmUnmapLockPages. Если драйвер выполняет какие-либо из этих незаконных операций с MDL, созданным MmBuildMdlForNonPagedPool, результирующее поведение не определено.

Допускается передача MDL, созданного MmBuildMdlForNonPagedPool в подпрограмму MmGetSystemAddressForMdlSafe. Вызов MmGetSystemAddressForMdlSafe, в этом случае просто возвращает начальный виртуальный адрес буфера, описываемого MDL.

Драйвер может использовать процедуру MmMapLockedPagesSpecifyCache для сопоставления MDL, созданного MmBuildMdlForNonPagedPool в пользовательское виртуальное адресное пространство. Однако драйвер должен выполнять эту операцию таким образом, чтобы избежать определенных проблем безопасности. Дополнительные сведения см. в разделе MmMapLockedPagesSpecifyCache.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Windows 2000.
целевая платформа Всеобщий
заголовка wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

См. также

ExAllocatePoolWithTag

MmAllocateContiguousMemorySpecifyCache

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

mmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages