MapViewOfFile3 函数 (memoryapi.h)

将文件或页文件支持的分区视图映射到指定进程的地址空间。

语法

PVOID MapViewOfFile3(
  [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

HANDLE 要在其中映射节的进程。

[in, optional] BaseAddress

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

如果此参数 NULL,则系统会选取基址。

如果 BaseAddressNULL,则提供的任何 MEM_ADDRESS_REQUIREMENTS 都必须包含所有零。

[in] Offset

节开头的偏移量。

在 AllocationType 中使用MEM_LARGE_PAGES时,偏移量必须对齐 64k 或与 GetLargePageMinimum 对齐。 此外,当在 AllocationType 中使用MEM_REPLACE_PLACEHOLDER时,偏移量必须与 VirtualAlloc2 授予的基础页面大小对齐。

[in] ViewSize

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

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

[in] AllocationType

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

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

将占位符替换为映射视图后,若要将映射视图释放回占位符,请参阅 UnmapViewOfFileExUnmapFlags 参数,并 UnmapViewOfFile2

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

指定此标志时,OffsetBaseAddress 的 64k 对齐要求不适用。

MEM_LARGE_PAGES
0x20000000
映射大型页面视图。 此标志指定应使用 大页面支持映射视图。 视图的大小必须是 GetLargePageMinimum 函数报告的大型页面大小的倍数,并且必须使用 SEC_LARGE_PAGES 选项创建文件映射对象。 如果为 BaseAddress 参数提供非 null 值,则该值必须是 GetLargePageMinimum的倍数。

指定此标志时,Offset 的 64k 对齐要求不适用。

[in] PageProtection

所需的页面保护。

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

[in, out, optional] ExtendedParameters

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

[in] ParameterCount

ExtendedParameters指向的扩展参数数。

返回值

如果成功,则返回映射视图的基址。 否则,使用 getLastError返回 NULL 和扩展错误状态

言论

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

将此函数用于新分配,可以:

  • 指定虚拟地址空间的范围和 2 的对齐限制
  • 指定任意数量的扩展参数
  • 将物理内存的首选 NUMA 节点指定为扩展参数
  • 指定占位符操作(具体而言,替换)。

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

例子

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

要求

要求 价值
最低支持的客户端 Windows 10 版本 1803 [仅限桌面应用]
支持的最低服务器 Windows Server 2016 [仅限桌面应用]
目标平台 窗户
标头 memoryapi.h (包括 Windows.h)
onecore.lib
DLL Kernel32.dll

另请参阅

VirtualAlloc2

MapViewOfFile

MapViewOfFile2

MapViewOfFileNuma2