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 |