ZwMapViewOfSection 函数 (wdm.h)
ZwMapViewOfSection 例程将节的视图映射到主题进程的虚拟地址空间中。
语法
NTSYSAPI NTSTATUS ZwMapViewOfSection(
[in] HANDLE SectionHandle,
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in] ULONG_PTR ZeroBits,
[in] SIZE_T CommitSize,
[in, out, optional] PLARGE_INTEGER SectionOffset,
[in, out] PSIZE_T ViewSize,
[in] SECTION_INHERIT InheritDisposition,
[in] ULONG AllocationType,
[in] ULONG Win32Protect
);
参数
[in] SectionHandle
节对象的句柄。 此句柄是通过成功调用 ZwCreateSection 或 ZwOpenSection 创建的。
[in] ProcessHandle
对象的句柄,该对象表示视图应映射到的进程。 使用 ZwCurrentProcess 宏指定当前进程。 句柄必须已使用 PROCESS_VM_OPERATION 访问权限打开。
[in, out] BaseAddress
指向接收视图基址的变量的指针。 如果此参数的值不为 NULL,则从指定的虚拟地址开始分配视图,并向下舍入到下一个 64 KB 地址边界。
[in] ZeroBits
指定节视图基址中必须为零的高序地址位数。 此参数的值必须小于 21,并且仅在 BaseAddress 为 NULL 时使用,换句话说,当调用方允许系统确定分配视图的位置时。
[in] CommitSize
指定视图的初始提交区域的大小(以字节为单位)。 CommitSize 仅对支持页面文件的部分有意义,并且向上舍入为最接近PAGE_SIZE倍数。 (对于映射文件的节,数据和图像在节创建时提交。)
[in, out, optional] SectionOffset
指向变量的指针,该变量接收从节开头到视图的偏移量(以字节为单位)。 如果此指针不为 NULL,则偏移量将向下舍入到下一个分配粒度大小边界。
[in, out] ViewSize
指向SIZE_T变量的指针。 如果此变量的初始值为零, 则 ZwMapViewOfSection 映射节的视图,该视图从 SectionOffset 开始,一直持续到节的末尾。 否则,初始值指定视图的大小(以字节为单位)。 在映射视图之前,ZwMapViewOfSection 始终将此值向上舍入为最接近的PAGE_SIZE倍数。
返回时,该值接收视图的实际大小(以字节为单位)。
[in] InheritDisposition
指定如何与子进程共享视图。 可能的值为:
ViewShare
该视图将映射到将来创建的任何子进程。
ViewUnmap
视图不会映射到子进程。
驱动程序通常应为此参数指定 ViewUnmap 。
[in] AllocationType
指定一组标志,用于描述要为指定的页面区域执行的分配类型。 有效标志为MEM_RESERVE、MEM_TOP_DOWN、MEM_LARGE_PAGES、MEM_DIFFERENT_IMAGE_BASE_OK和MEM_REPLACE_PLACEHOLDER。 虽然不允许MEM_COMMIT,但除非指定MEM_RESERVE,否则是默示的。 有关 MEM_XXX 标志的详细信息,请参阅 VirtualAlloc 和 MapViewOfFile3 例程的说明。
[in] Win32Protect
指定要应用于映射视图 的页面保护 。
对于使用 SEC_IMAGE 属性创建的节对象,Win32Protect 参数不起作用,可以设置为任何有效值,例如PAGE_READONLY。
对于使用 SEC_IMAGE_NO_EXECUTE 属性创建的节对象,Win32Protect 值必须设置为 PAGE_READONLY。
对于非图像部分,Win32Protect 参数的值必须与调用 ZwCreateSection 时指定的节的页面保护兼容。
ZwMapViewOfSection 设置映射页的缓存类型,以匹配创建分区对象时提供的缓存类型。 例如,如果使用 SEC_NOCACHE 标志调用 ZwCreateSection,则无论 Win32Protect 参数是否包含 PAGE_NOCACHE 标志, ZwMapViewOfSection 都将映射未缓存的页面。
返回值
ZwMapViewOfSection 返回 NTSTATUS 值。 可能的返回值包括:
返回代码 | 说明 |
---|---|
STATUS_SUCCESS | 例程已成功执行请求的操作。 |
STATUS_CONFLICTING_ADDRESSES | 指定的地址范围与已保留的范围冲突。 |
STATUS_INVALID_PAGE_PROTECTION | 为 Win32Protect 参数指定的值无效。 |
STATUS_SECTION_PROTECTION | 为 Win32Protect 参数指定的值与创建节时指定的页面保护不兼容。 |
注解
一个节的多个不同视图可以同时映射到一个或多个进程的虚拟地址空间中。
请勿使用 ZwMapViewOfSection 将 \Device\PhysicalMemory 中的内存范围映射到用户模式,除非驱动程序已通过 MmAllocatePagesForMdlEx 或其他方法直接分配内存范围,以确保没有其他系统组件映射了具有不同 MEMORY_CACHING_TYPE 值的相同内存范围。
用户应用程序无法从 Windows Server 2003 开始直接访问 \Device\PhysicalMemory ,而 Service Pack 1 (SP1) ,并且仅当驱动程序将句柄传递给应用程序时才能访问它。
有关节对象的详细信息,请参阅 节对象和视图。
如果在用户模式下调用此函数,则应使用名称“NtMapViewOfSection”而不是“ZwMapViewOfSection”。
对于来自内核模式驱动程序的调用,Windows 本机系统服务例程的 NtXxx 和 ZwXxx 版本在处理和解释输入参数的方式上的行为可能有所不同。 有关例程的 NtXxx 和 ZwXxx 版本之间的关系的详细信息,请参阅 使用本机系统服务例程的 Nt 和 Zw 版本。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) 、 PowerIrpDDis (wdm) |