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 搭配使用。 若要建置描述核心堆疊緩衝區的 MDL,驅動程式必須呼叫 MmProbeAndLockPages。 這是因為核心堆疊頁面可以交易,除非它們是探查和鎖定。 即使驅動程序保證核心堆疊無法分頁,此規則仍適用。
因為 MDL 所描述的頁面已經不可分頁,而且已經對應到系統地址空間,因此驅動程式不得嘗試使用 MmProbeAndLockPages 例程鎖定它們,或使用 MmMapLockedPagesSpecifyCache 例程建立其他系統地址空間對應。 同樣地,驅動程式不得嘗試使用 MmUnlockPages 例程來解除鎖定頁面,或是使用 MmUnmapLockedPages 例程來釋放現有的系統地址空間對應。 如果驅動程式在 MmBuildMdlForNonPagedPool 所建置的 MDL 上執行上述任何非法作業,則 未定義產生的行為。
允許將 MmBuildMdlForNonPagedPool 建置的 MDL 傳遞給 MmGetSystemAddressForMdlSafe 例程。 MmGetSystemAddressForMdlSafe 呼叫,在此案例中,只會傳回 MDL 所描述之緩衝區的起始虛擬位址。
驅動程式可以使用 MmMapLockedPagesSpecifyCache 例程,將 MmBuildMdlForNonPagedPool 建置的 MDL 對應至使用者虛擬位址空間。 不過,驅動程式必須以避免某些安全性問題的方式執行這項作業。 如需詳細資訊,請參閱 mmMapLockedPagesSpecifyCache。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=DISPATCH_LEVEL |