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 必须描述锁定的物理页。 锁定的 MDL 可由 MmProbeAndLockPages 或 MmAllocatePagesForMdlEx 例程生成。
[in] CacheType
指定用于创建映射 的MEMORY_CACHING_TYPE 值。
返回值
MmMapLockedPagesWithReservedMapping 返回指向映射内存开头的指针;如果系统无法映射内存,则返回 NULL 。 仅当函数参数中存在错误时,此例程才返回 NULL (例如,驱动程序的映射地址不够大,无法跨越提供的 MDL) 。 此函数旨在使驱动程序即使在资源不足的情况下也能向前推进。
注解
调用方可以使用 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) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) |