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 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

另请参阅

ExAllocatePoolWithTag

MmAllocateContiguousMemorySpecifyCache

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages