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) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=DISPATCH_LEVEL |