捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >API档案 > 正文
19 2017.06

MapViewOfFileEx

点击次数:1626 更新时间:2017-6-19 19:28:12  【打印此页

原文链接 -> 传送门

函数功能:

MapViewOfFileEx 函数用于将一个文件映射视图映射到一个正在被调用的进程的地址空间中。调用者能够选择性的为视图指定一个建议的基地址。

想要在物理内存中指定 NUMA 节点,请参照 MapViewOfFileExNuma 函数。


API 函数原型:

注释:_In_ 说明该参数是输入的,_In_opt_ 说明该参数是输入同时是可选的

LPVOID WINAPI MapViewOfFileEx(
  _In_     HANDLE hFileMappingObject,
  _In_     DWORD  dwDesiredAccess,
  _In_     DWORD  dwFileOffsetHigh,
  _In_     DWORD  dwFileOffsetLow,
  _In_     SIZE_T dwNumberOfBytesToMap,
  _In_opt_ LPVOID lpBaseAddress
);


参数解析:
 

参数

含义

hFileMappingObject

1. 该参数指定一个文件映射对象句柄

2. 使用 CreateFileMapping 函数和 OpenFileMapping 函数可以获取该句柄

dwDesiredAccess

1. 该参数指定一个文件映射对象的访问类型,该访问类型决定了要保护的页面

该参数可能是下列值中的任何一个:

含义

FILE_MAP_ALL_ACCESS

1. 该值表示一个被映射的文件的读/写视图。该文件映射对象在创建时必须带有 PAGE_READWRITE 或 PAGE_EXECUTE_READWRITE 保护

2. 当与 MapViewOfFile 函数一起使用时,FILE_MAP_ALL_ACCESS 相当于FIEL_MAP_WRITE

FILE_MAP_COPY

1. 该值表示一个被映射文件的写时拷贝视图。该文件视图对象在创建时必须带 PAGE_READONLY,AGE_READ_EXECUTE,PAGE_WRITECOPY,PAGE_EXECUTE_WRITECOPY,PAGE_READWRITE 或 PAGE_EXECUTE_READWRITE 保护

2. 当一个进程写入到一个写时备份页面时,系统会将原始页面拷贝到一个只属于该进程的一个新页面。该新页面由分页文件支持。新页面的保护从写时拷贝改变到读/写

3. 当指定了写时拷贝访问时,系统和进程为整个视图提交开销,因为正在被调用的进程可能会潜在的写入视图中的每个页面。新页面的内容从不会写回到原始文件并且当该视图不在被映射时这些内容会被丢弃

FILE_MAP_READ

1. 该值表示一个被映射文件的只读视图。如果尝试将该视图写入到文件视图将导致访问冲突

2. 该文件视图对象创建时必须带 PAGE_EADONLY,PAGE_READWRITE,PAGE_EXECUTE_READ 或 PAGE_EXECUTE_READWRITE 保护

FILE_MAP_WRITE

1. 该值表示一个被映射文件的读/写视图。给文件视图对象创建时必须带 PAGE_READEWRITE 或 PAGE_EXECUTE_READWRITE 保护

2. 当与 MapViewOfFile 函数一起使用时,(FILE_MAP-WRITE | FILE_MAP_READ) 和 FILE_MAP_ALL_ACCESS 相当于 FIEL_MAP_WRITE


前面的任何一个值都可以与下列值组合:

含义

FILE_MAP_EXECUTE

1. 该值表示一个被映射文件的可执行视图(映射内存能够作为代码运行)。该文件映射对象创建时必须带有 PAGE_ECECUTE_READ,PAGE_EXECUTE_WRITECOPY 或 PAGE_EXECUTE_READWRITE 保护

2. Windows Server 2003 和 Windows XP:该值在 Windows XP SP1 和 Windows Server 2003 SP1 开始能够使用


2. 对于以 SEC_IMAGE 属性创建的文件映射对象,dwDesiredAccess参 数没有过效果并且应该设置一个像 FILE_MAP_READ 一样有效的值

3. 更多关于访问文件映射对象的信息,请参照 File Mapping Security and Access Rights

dwFileOffsetHigh

该参数表示视图开始处的高阶的双字节的文件偏移量

dwFileOffsetLow

1. 该参数表示视图开始处的低阶的双字节的文件偏移量

2. 高低偏移量的组合必须指定一个文件映射内的偏移量。它们也必须与系统中内存的分配粒度相匹配。也就是说偏移量必须是分配粒度的倍数

3. 可以使用 GetSystemInfo 函数获得系统中内存分配粒度,该分配粒度填写在一个SYSTEM_INFO 结构的成员中

dwNumberOfBytesToMap

1. 该值表示映射到视图的文件映射的字节数

2. 总字节必须在 CreateFileMapping 函数指定的最大字节内。如果该参数为 0(zero),该映射将从指定的偏移量扩展到文件映射的结尾

lpBaseAddress

1. 该参数表示一个在映射开始的调用进程地址空间中指向内存地址的指针。它必须是系统内存分配颗粒的整数倍,否则函数运行失败。想要确定系统的内存分配粒度,可以使用GetSystemInfo 函数。如果在指定的地址有没有足够的地址空间,该函数运行失败

2. 如果 IpBaseAddress 参数为 NULL,操作系统会选择映射地址。在这种情况下,该函数相当于 MapViewOfFile 函数

3. 虽然现在指定一个安全的地址是可能的(不是被电脑使用的),但是并不保重该地址的永久安全。因此,最好让操作系统选择该地址。这样,你不需要再内存映射文件内存储指针,你将存储以文件映射为基础的偏移量,以便于映射能够在任何地址都可以用



返回值:

1. 如果该函数调用成功,则返回值是映射视图的起始地址;

2. 如果该函数调用失败,则返回值是 NULL。

获取有关错误的更多信息,请调用 GetLastError 函数。


备注:

1. 映射一个文件让一个文件的指定部分在当前调用进程的地址空间内可见。

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

3. 想要获得一个视图的大小,可以使用 VirtualQuery 函数。

4. 在一个基于页面文件的的文件映射对象的原始页面内容为 0(zero)。

5. 通常,被建议的地址是被用于指定一个在众多进程中映射应该被映射在相同的地址中的文件。这要求该地址空间区域在所有参与的进程中都可用。其它的内存分配不能发生在该区域,该区域只能用于映射,包括用 VirtualAlloc 函数或VirtualAllocEx 函数去备份内存。

6. 如果 IpBaseAddress 参数指定了一个基础偏移量,如果指定的内存区域并没有已经被调用进程使用,那么该函数能运行成功。系统不会保证相同的内存区域对其它的 32 位进程中的内存映射文件可用。

7. 一个文件的大量视图(或者一个文件映射对象和他的映射文件)是一致的,如果他们在一个指定的时间包含相同的数据。如果文件视图是来源于任何一个被相同的文件支持的文件映射对象时上述情况会发生。通过使用 DuplicateHandle 函数一个进程可以复制一个文件映射对象句柄到另一个进程中或者可以通过使用 OpenFileMapping 函数让一个进程能够通过名字打开一个文件映射对象。

8. 一个重要的特例,在一个特定的时间,来源于任何一个被相同的文件支持的文件映射对象是一致的或者是相同的。对于一个进程中的视图和一个被不同的进程映射的视图来说一致性是有保证的。

9. 该特例与远程文件有关。尽管 MapViewOfFileEx 函数适用于远程文件,但是该函数不会保持他们的一致性。例如,如果两个电脑都映射一个文件为可写,并且这两个电脑都改变相同的页面,但是每一个电脑只能看见它在该页写的内容。当数据在硬盘上更新时,它没有被合并。

10. 一个文件的映射视图不被保证与被 ReadFile 函数或 WriteFile 函数访问的文件的一致性。

11. 存储时不要将指针存储于内存中的映射文件,而是存储以文件映射为基础的偏移量,以便于映射能够在任何地址都可以用。

12. 为了避免 EXCEPTION_IN_PAGE_ERROR 异常的发生,可以用结构化异常处理去保护任何写入的或者从一个文件的内存映射视图而不是页面文件读取的代码。更多信息,请参照 Reading and Writing From a File View

13. 当通过一个映射视图修改一个文件时,最后的修改时间戳可能不会自动跟新。如果有需要,调用者应该使用SetFileTime 函数去设置时间戳。

14. 想要有一个带有可执行许可的文件,一个应用必须调用带有 PAGE_EXECUTE_READWRITE 或 PAGE_EXECUTE_READ 值中的任何一个的
CreateFileMapping 函数,并且之后调用带有 FILE_MAP_EXECUTE | FILE_MAP_WRITE 或 FILE_MAP_EXECUTE | FILE_MAP_READ 值的 MapViewOfFile 函数。

15. 在Windows Server 2012中,该函数由以下技术支持:
 

技术

是否支持

Server Message Block (SMB) 3.0 protocol

SMB 3.0 Transparent Failover (TFO)

SMB 3.0 with Scale-out File Shares (SO)

Cluster Shared Volume File System (CsvFS)

Resilient File System (ReFS)


当 CsvFs 被暂停,该调用可能失败,并且该失败标志着此处有一个锁冲突。


需求:
 

Minimum supported client

Windows XP [仅桌面应用程序]

Minimum supported server

Windows 2003 服务器版 [仅桌面应用程序]

Header

WinBase.h (包含于 Windows.h)

Library

Kernel32.lib

DLL

Kernel32.dll

提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1626 更新时间:2017-6-19 19:28:12  【打印此页

上一条:MapViewOfFile

下一条:GlobalAlloc

关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修