MapViewOfFile3FromApp 函数 (memoryapi.h)

将文件映射的视图映射到调用的 Windows 应用商店应用的地址空间中。

使用此函数,可以:对于新分配,指定虚拟地址空间范围和 2 次幂对齐限制;指定任意数量的扩展参数;将物理内存的首选 NUMA 节点指定为扩展参数;并指定占位符操作,具体 (替换) 。

若要指定 NUMA 节点,请参阅 ExtendedParameters 参数。

语法

PVOID MapViewOfFile3FromApp(
  [in]                HANDLE                 FileMapping,
  [in]                HANDLE                 Process,
  [in, optional]      PVOID                  BaseAddress,
  [in]                ULONG64                Offset,
  [in]                SIZE_T                 ViewSize,
  [in]                ULONG                  AllocationType,
  [in]                ULONG                  PageProtection,
  [in, out, optional] MEM_EXTENDED_PARAMETER *ExtendedParameters,
  [in]                ULONG                  ParameterCount
);

参数

[in] FileMapping

要映射到指定进程的地址空间的节的 HANDLE

[in] Process

节将映射到的进程句

[in, optional] BaseAddress

视图的所需基址。 地址向下舍入到最近的 64k 边界。

              If this parameter is <b>NULL</b>, the system picks the base
              address.

如果 BaseAddress 不是 NULL,则提供的任何 MEM_ADDRESS_REQUIREMENTS 结构都必须包含所有零。

[in] Offset

部分开头的偏移量。 这必须是 64k 对齐的。

[in] ViewSize

要映射的字节数。 值为 0 (0) 指定要映射整个部分。

大小必须始终是页面大小的倍数。

[in] AllocationType

内存分配的类型。 此参数可以是零 (0) 或以下值之一。

含义
MEM_RESERVE
0x00002000
映射保留视图。
MEM_REPLACE_PLACEHOLDER
0x00004000
将占位符替换为映射视图。 仅支持数据/pf 支持的分区视图, (无图像、物理内存等) 。 替换占位符时, BaseAddressViewSize 必须与占位符完全匹配,并且提供的任何 MEM_ADDRESS_REQUIREMENTS 结构都必须包含所有零。

将占位符替换为映射视图后,若要将该映射视图释放回占位符,请参阅 UnmapViewOfFileExUnmapViewOfFile2UnmapFlags 参数。

占位符是保留内存区域的一种类型。

MEM_LARGE_PAGES
0x20000000
映射大型页面视图。 请参阅 大页面支持

[in] PageProtection

所需的页面保护。

对于使用 SEC_IMAGE 属性创建的文件映射对象, PageProtection 参数不起作用,应设置为任何有效值,例如 PAGE_READONLY

[in, out, optional] ExtendedParameters

指向 MEM_EXTENDED_PARAMETER类型的一个或多个扩展参数的可选指针。 每个扩展参数值本身都可以具有 MemExtendedParameterAddressRequirementsMemExtendedParameterNumaNode的 Type 字段。 如果未提供 MemExtendedParameterNumaNode 扩展参数,则行为与 VirtualAlloc/MapViewOfFile 函数 (相同,也就是说,物理页的首选 NUMA 节点是根据首先访问内存) 线程的理想处理器确定的。

[in] ParameterCount

ExtendedParameters 指向的扩展参数数

返回值

如果成功,则返回映射视图的基址。 否则,返回 NULL ,并且可以使用 GetLastError 扩展错误状态。

注解

此 API 有助于支持高性能游戏和服务器应用程序,这些应用程序在管理虚拟地址空间方面有特定要求。 例如,在以前保留的区域上映射内存;这对于实现自动环绕环缓冲区很有用。 并分配具有特定对齐方式的内存;例如,使应用程序能够按需提交大型/大型页面映射区域。

有一个重要例外,派生自由同一文件支持的任何文件映射对象的文件视图在特定时间是一致的或相同的。 对于进程内的视图以及由不同进程映射的视图,可以保证一致性。

异常与远程文件相关。 尽管 MapViewOfFile3FromApp 适用于远程文件,但无法使其保持一致。 例如,如果两台计算机都将一个文件映射为可写文件,并且都更改了同一页,则每台计算机只看到自己对页面的写入。 在磁盘上更新数据时,不会合并数据。

仅当应用具有 codeGeneration 功能时,才能成功请求可执行保护。

示例

有关代码示例,请参阅 Virtual2Alloc 中的方案 1。

要求

   
最低受支持的客户端 Windows 10 [仅限桌面应用]
最低受支持的服务器 Windows Server 2016 [仅限桌面应用]
目标平台 Windows
标头 memoryapi.h (包括 Windows.h)
Library WindowsApp.lib
DLL Kernel32.dll

另请参阅

CreateFileMapping

创建文件视图

DuplicateHandle

GetSystemInfo

MapViewOfFile3

MapViewOfFileEx

内存管理函数

OpenFileMapping

SYSTEM_INFO

UnmapViewOfFile