MapViewOfFile 函数 (memoryapi.h)

将文件映射的视图映射到调用进程的地址空间。

若要为视图指定建议的基址,请使用 MapViewOfFileEx 函数。 但是,不建议使用这种做法。

语法

LPVOID MapViewOfFile(
  [in] HANDLE hFileMappingObject,
  [in] DWORD  dwDesiredAccess,
  [in] DWORD  dwFileOffsetHigh,
  [in] DWORD  dwFileOffsetLow,
  [in] SIZE_T dwNumberOfBytesToMap
);

参数

[in] hFileMappingObject

文件映射对象的句柄。 CreateFileMappingOpenFileMapping 函数返回此句柄。

[in] dwDesiredAccess

对文件映射对象的访问类型,该对象确定页面的页面保护。 此参数可以是下列值之一,也可以是多个值的按位 OR 组合(如果适用)。

价值 意义
FILE_MAP_ALL_ACCESS
映射文件的读/写视图。 必须使用 PAGE_READWRITEPAGE_EXECUTE_READWRITE 保护创建文件映射对象。

MapViewOfFile 函数一起使用时,FILE_MAP_ALL_ACCESS 等效于 FILE_MAP_WRITE

FILE_MAP_READ
映射文件的只读视图。 尝试写入文件视图会导致访问冲突。

必须使用 PAGE_READONLYPAGE_READWRITEPAGE_EXECUTE_READPAGE_EXECUTE_READWRITE 保护创建文件映射对象。

FILE_MAP_WRITE
映射文件的读/写视图。 必须使用 PAGE_READWRITEPAGE_EXECUTE_READWRITE 保护创建文件映射对象。

MapViewOfFile一起使用时,(FILE_MAP_WRITE | FILE_MAP_READ)和 FILE_MAP_ALL_ACCESS 等效于 FILE_MAP_WRITE

 

使用按位 OR,可以将上述值与这些值组合在一起。

价值 意义
FILE_MAP_COPY
映射文件的复制写入视图。 必须使用 PAGE_READONLYPAGE_EXECUTE_READPAGE_WRITECOPYPAGE_EXECUTE_WRITECOPYPAGE_READWRITEPAGE_EXECUTE_READWRITE 保护来创建文件映射对象。

当进程写入到写入时,系统会将原始页面复制到一个新页面,该页面是专用于进程的。 新页面由分页文件提供支持。 对新页面的保护会从写入副本更改为读/写。

指定写入时复制访问时,系统将对整个视图承担进程提交费用,因为调用过程可能会写入视图中的每一页,从而使所有页面都成为私有页面。 新页面的内容永远不会写回到原始文件,在取消映射视图时丢失。

FILE_MAP_EXECUTE
文件的可执行视图已映射(映射的内存可以作为代码运行)。 必须使用 PAGE_EXECUTE_READPAGE_EXECUTE_WRITECOPYPAGE_EXECUTE_READWRITE 保护创建文件映射对象。

Windows Server 2003 和 Windows XP:此值从 Windows XP 和 SP2 和 Windows Server 2003 SP1 开始可用。

FILE_MAP_LARGE_PAGES
从 Windows 10 版本 1703 开始,此标志指定应使用 大型页面支持映射视图。 视图的大小必须是 GetLargePageMinimum 函数报告的大型页面大小的倍数,并且必须使用 SEC_LARGE_PAGES 选项创建文件映射对象。 如果为 lpBaseAddress提供非 null 值,则该值必须是 GetLargePageMinimum的倍数。

注意:在 Windows 10 版本 1703 之前的 OS 版本上,FILE_MAP_LARGE_PAGES 标志不起作用。 在这些版本中,如果分区是使用 SEC_LARGE_PAGES 标志集创建的,则使用大型页面自动映射视图。
FILE_MAP_TARGETS_INVALID
将映射文件中的所有位置设置为控制流防护(CFG)的无效目标。 此标志类似于 PAGE_TARGETS_INVALID。 将此标志与执行访问权限 FILE_MAP_EXECUTE结合使用。 对这些页面中位置的任何间接调用都将失败 CFG 检查,并且该过程将终止。 分配的可执行页面的默认行为是标记为 CFG 的有效调用目标。
 

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

有关访问文件映射对象的详细信息,请参阅 文件映射安全和访问权限

[in] dwFileOffsetHigh

视图开始的文件偏移量 DWORD 高阶。

[in] dwFileOffsetLow

要开始视图的文件偏移量 低序 DWORD。 高偏移和低偏移的组合必须在文件映射中指定偏移量。 它们还必须匹配系统的虚拟内存分配粒度。 也就是说,偏移量必须是 VirtualAlloc 分配粒度的倍数。 若要获取系统的 VirtualAlloc 内存分配粒度,请使用 GetSystemInfo 函数,该函数填充 SYSTEM_INFO 结构的成员。

[in] dwNumberOfBytesToMap

要映射到视图的文件映射的字节数。 所有字节必须位于 CreateFileMapping指定的最大大小内。 如果此参数为 0(零),则映射从指定的偏移量扩展到文件映射的末尾。

返回值

如果函数成功,则返回值为映射视图的起始地址。

如果函数失败,则返回值 NULL。 若要获取扩展的错误信息,请调用 GetLastError

言论

映射文件会使文件的指定部分在调用进程的地址空间中可见。

对于大于地址空间的文件,一次只能映射一小部分文件数据。 第一个视图完成后,可以取消映射并映射新视图。

若要获取视图的大小,请使用 VirtualQuery 函数。

文件(或文件映射对象及其映射文件)的多个视图 一致(如果它们在指定时间包含相同的数据)。 如果文件视图派生自同一文件支持的任何文件映射对象,则会出现这种情况。 进程可以使用 DuplicateHandle 函数将文件映射对象句柄复制到另一个进程,或者另一个进程可以使用 OpenFileMapping 函数按名称打开文件映射对象。

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

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

不能保证文件的映射视图与 ReadFileWriteFile 函数访问的文件一致。

不要将指针存储在内存映射文件中;存储与文件映射基的偏移量,以便可以在任何地址使用映射。

若要防范 EXCEPTION_IN_PAGE_ERROR 异常,请使用结构化异常处理来保护写入文件或从文件以外的内存映射视图中读取的任何代码。 有关详细信息,请参阅 从文件视图读取和写入

通过映射视图修改文件时,可能不会自动更新上次修改时间戳。 如果需要,调用方应使用 SetFileTime 来设置时间戳。

如果文件映射对象由分页文件提供支持(使用设置为 INVALID_HANDLE_VALUEhFile 参数调用 createFileMapping),则分页文件必须足够大,才能容纳整个映射。 如果没有,MapViewOfFile 失败。 由分页文件支持的文件映射对象中的页面的初始内容为 0(零)。

创建由分页文件支持的文件映射对象时,调用方可以指定 MapViewOfFile 应同时保留和提交页面(SEC_COMMIT),还是只保留页(SEC_RESERVE)。 映射文件会使整个映射的虚拟地址范围无法用于进程中的其他分配。 提交保留范围中的页面后,无法通过调用 VirtualFree来释放或取消该页。 取消映射视图并关闭文件映射对象时,将释放保留和提交的页面。 有关详细信息,请参阅 UnmapViewOfFileCloseHandle 函数。

若要具有可执行权限的文件,应用程序必须使用 PAGE_EXECUTE_READWRITEPAGE_EXECUTE_READ调用 CreateFileMapping,然后使用 FILE_MAP_EXECUTE | 或 FILE_MAP_EXECUTE | 调用 MapViewOfFile

在 Windows Server 2012 中,以下技术支持此函数。

科技 支持
服务器消息块 (SMB) 3.0 协议 是的
SMB 3.0 透明故障转移 (TFO) 是的
具有横向扩展文件共享的 SMB 3.0 (SO) 是的
群集共享卷文件系统 (CsvFS) 是的
可复原文件系统 (ReFS) 是的
 

当 CSV 暂停时,此调用可能会失败,并显示指示存在锁冲突的错误。

例子

有关示例,请参阅 创建命名共享内存

要求

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

另请参阅

CreateFileMapping

创建文件视图

DuplicateHandle

GetSystemInfo

MapViewOfFileEx

内存管理功能

OpenFileMapping

SYSTEM_INFO

UnmapViewOfFile