MmMapLockedPagesWithReservedMapping 函数 (wdm.h)
MmMapLockedPagesWithReservedMapping 例程映射以前由 MmAllocateMappingAddress 例程保留的地址范围的全部或部分。
语法
PVOID MmMapLockedPagesWithReservedMapping(
[in] PVOID MappingAddress,
[in] ULONG PoolTag,
[in] PMDL MemoryDescriptorList,
[in] __drv_strictTypeMatch(__drv_typeCond)MEMORY_CACHING_TYPE CacheType
);
参数
[in] MappingAddress
指向保留虚拟内存范围的开头的指针。 这必须是以前由 MmAllocateMappingAddress返回的地址。
[in] PoolTag
指定保留内存缓冲区的池标记。 这必须与调用 MmAllocateMappingAddress 保留缓冲区的 PoolTag 参数中指定的值相同。
[in] MemoryDescriptorList
指向要映射的 MDL 的指针。 此 MDL 必须描述锁定的物理页面。 MmProbeAndLockPages 或 MmAllocatePagesForMdlEx 例程可以生成锁定的 MDL。
[in] CacheType
指定要用于创建映射的 MEMORY_CACHING_TYPE 值。
返回值
MmMapLockedPagesWithReservedMapping 返回指向映射内存开头的指针,或者如果系统无法映射内存,NULL。 仅当函数参数中存在错误(例如,驱动程序的映射地址不足以跨越提供的 MDL)时,此例程才会返回 NULL。 此函数旨在使驱动程序即使在低资源方案中也能取得进展。
言论
调用方可以使用 MmMapLockedPagesWithReservedMapping 映射 MmAllocateMappingAddress 保留的虚拟内存范围的子范围,如下所示:
使用 IoAllocateMdl 分配 MDL。 返回的 MDL 是使用要映射的虚拟内存范围的指定起始地址和大小生成的。
使用 MmProbeAndLockPages 锁定步骤 1 中获取的 MDL 描述的物理页。
使用 MmMapLockedPagesWithReservedMapping 实际将虚拟内存映射到步骤 2 中锁定的物理内存。 请注意,此函数返回的虚拟地址包含 MDL 指定的字节偏移量。 但是,此函数设置的 MDL 的 MappedSystemVa 字段不包括字节偏移量。
调用方无需访问内存后,它会使用 MmUnmapReservedMapping取消映射内存。 调用方可以根据需要映射和取消映射内存缓冲区,并且必须先取消映射,然后才能使用 MmFreeMappingAddress释放映射范围。
请注意,MappingAddress 参数指定调用方以前保留的内存范围的开头,而不是要映射的内存子范围的开头。 当调用方使用 ioAllocateMdl分配 MDL 时,调用方指定缓冲区的起始地址和长度。 缓冲区必须适合保留内存范围,但它可以是严格的子集。
仅当 MDL 描述的页面没有与其关联的缓存类型时,该例程才使用 CacheType 参数。 但是,在几乎所有情况下,页面已有关联的缓存类型,并且新映射使用此缓存类型。 此规则的例外是 MmAllocatePagesForMdl分配的页面,这些页面没有与之关联的特定缓存类型。 对于此类页面,CacheType 参数确定映射的缓存类型。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows XP 和更高版本的 Windows 中可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDIS(storport) |