MmBuildMdlForNonPagedPool 函式 (wdm.h)

MmBuildMdlForNonPagedPool 例程會接收指定非分頁虛擬記憶體緩衝區的 MDL,並更新它來描述基礎實體頁面。

語法

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

參數

[in, out] MemoryDescriptorList

MDL 的指標,指定非分頁記憶體中的虛擬記憶體緩衝區。 呼叫端使用 IoAllocateMdl 例程來為此緩衝區建立 MDL。

傳回值

備註

在輸入時,指定的 MDL 必須描述非分頁系統記憶體或鎖定記憶體中的緩衝區, (實體頁面無法交易) ,例如 ,ExAllocatePoolWithTag 例程搭配 PoolType = NonPagedPoolMmAllocateContiguousMemorySpecifyCache 例程所配置的記憶體。 MmBuildMdlForNonPagedPool 會更新 MDL 來描述基礎實體頁面。

MmBuildMdlForNonPagedPool 不能與描述核心堆疊上配置的緩衝區的 MDL 搭配使用。 若要建置描述核心堆疊緩衝區的 MDL,驅動程式必須呼叫 MmProbeAndLockPages。 這是因為核心堆疊頁面可以交易,除非它們處於探查和鎖定狀態。 即使驅動程式保證無法分頁核心堆疊,仍適用此規則。

由於 MDL 所描述的頁面已經不可分頁,而且已經對應到系統地址空間,因此驅動程式不得嘗試使用 MmProbeAndLockPages 例程來鎖定它們,或使用 MmMapLockedPagesSpecifyCache 例程建立其他系統地址空間對應。 同樣地,驅動程式不得嘗試使用 MmUnlockPages 例程來解除鎖定頁面,或使用 MmUnmapLockedPages 例程釋放現有的系統地址空間對應。 如果驅動程式在 MmBuildMdlForNonPagedPool 所建置的 MDL 上執行任何不合法的作業,則產生的行為未定義。

允許將 MmBuildMdlForNonPagedPool 所建置的 MDL 傳遞至 MmGetSystemAddressForMdlSafe 例程。 在此案例中, MmGetSystemAddressForMdlSafe 呼叫只會傳回 MDL 所描述之緩衝區的起始虛擬位址。

驅動程式可以使用 MmMapLockedPagesSpecifyCache 例程,將 MmBuildMdlForNonPagedPool 所建置的 MDL 對應至使用者虛擬位址空間。 不過,驅動程式必須以避免某些安全性問題的方式執行這項作業。 如需詳細資訊,請參閱 MmMapLockedPagesSpecifyCache

規格需求

需求
最低支援的用戶端 從 Windows 2000 開始提供。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

另請參閱

ExAllocatePoolWithTag

MmAllocateContiguousMemorySpecifyCache

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages