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

节对象的句柄。 此句柄是通过成功调用 ZwCreateSectionZwOpenSection 创建的。

[in] ProcessHandle

对象的句柄,该对象表示视图应映射到的进程。 使用 ZwCurrentProcess 宏指定当前进程。 句柄必须已使用 PROCESS_VM_OPERATION 访问权限打开。

[in, out] BaseAddress

指向接收视图基址的变量的指针。 如果此参数的值不为 NULL,则从指定的虚拟地址开始分配视图,并向下舍入到下一个 64 KB 地址边界。

[in] ZeroBits

指定节视图基址中必须为零的高序地址位数。 此参数的值必须小于 21,并且仅在 BaseAddressNULL 时使用,换句话说,当调用方允许系统确定分配视图的位置时。

[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_LARGE_PAGES、MEM_RESERVE和MEM_TOP_DOWN。 虽然不允许MEM_COMMIT,但除非指定MEM_RESERVE,否则是默示的。 有关 MEM_XXX 标志的详细信息,请参阅 VirtualAlloc 例程的说明。

[in] Win32Protect

指定初始提交页面区域的保护类型。 设备和中间驱动程序应将此值设置为 PAGE_READWRITE。

返回值

ZwMapViewOfSection 返回 NTSTATUS 值。 可能的返回值包括:

返回代码 说明
STATUS_SUCCESS 例程已成功执行请求的操作。
STATUS_CONFLICTING_ADDRESSES 指定的地址范围与已保留的地址范围冲突,或者指定的缓存属性类型与地址范围的现有缓存属性冲突。 例如,如果要映射的内存位于已映射为完全缓存的大页中,则请求将此内存映射为非缓存或写入组合是非法的。
STATUS_INVALID_PAGE_PROTECTION Protect 参数指定的值无效。
STATUS_SECTION_PROTECTION AllocationType 参数指定的值与创建节时指定的保护类型不兼容。

注解

一个节的多个不同视图可以同时映射到一个或多个进程的虚拟地址空间中。

如果指定的部分不存在或不允许访问请求的访问, ZwMapViewOfSection 将返回错误。

请勿使用 ZwMapViewOfSection\Device\PhysicalMemory 中的内存范围映射到用户模式,除非驱动程序已通过 MmAllocatePagesForMdl 或其他方法直接分配内存范围,以确保没有其他系统组件映射了具有不同 MEMORY_CACHING_TYPE 值的相同内存范围。

用户应用程序无法从 Windows Server 2003 开始直接访问 \Device\PhysicalMemory ,而 Service Pack 1 (SP1) ,并且仅当驱动程序将句柄传递给应用程序时才能访问它。

有关节对象的详细信息,请参阅 节对象和视图

如果在用户模式下调用此函数,则应使用名称“NtMapViewOfSection”而不是“ZwMapViewOfSection”。

对于来自内核模式驱动程序的调用,Windows 本机系统服务例程的 NtXxxZwXxx 版本在处理和解释输入参数的方式上的行为可能有所不同。 有关例程的 NtXxxZwXxx 版本之间的关系的详细信息,请参阅 使用本机系统服务例程的 Nt 和 Zw 版本

要求

要求
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) PowerIrpDDis (wdm)

另请参阅

MEMORY_CACHING_TYPE

MmAllocatePagesForMdl

使用本机系统服务例程的 Nt 和 Zw 版本

VirtualAlloc

ZwCurrentProcess

ZwOpenSection

ZwUnmapViewOfSection