步骤2:创建一个文件映射内核对象

调用CreateFileMapping函数告诉系统,文件映射对象需要多少物理存储器。

HANDLE CreateFileMapping(

   HANDLE hFile,

   PSECURITY_ATTRIBUTES psa,

   DWORD fdwProtect,

   DWORD dwMaximumSizeHigh,

   DWORD dwMaximumSizeLow,

   PCTSTR pszName);

 

第一个参数hFile用于标识你想要映射到进程地址空间中的文件句柄。该句柄由前面调用的CreateFile函数返回。

第二个参数psa参数是指向文件映射内核对象的SECURITY_ATTRIBUTES结构的指针,通常传递的值是NULL(它提供默认的安全特性,返回的句柄是不能继承的)。

第三个参数fdwProtect参数使你能够设定这些保护属性。大多数情况下,可以设定下表列出的3个保护属性之一。

使用fdwProtect 参数设定的部分保护属性

保护属性

含义

PAGE_READONLY

当文件映射对象被映射时,可以读取文件的数据。必须已经将GENERIC_READ传递给CreateFile函数

PAGE_READWRITE

当文件映射对象被映射时,可以读取和写入文件的数据。必须已经将GENERIC_READ | GENERIC_WRITE传递给Creat eFile

PAGE_WRITECOPY

当文件映射对象被映射时,可以读取和写入文件的数据。如果写入数据,会导致页面的私有拷贝得以创建。必须已经将GENERIC_READGENERIC_WRITE传递给CreateFile

 

除了上面的页面保护属性外,还有4节保护属性

 

节的第一个保护属性SEC_NOCACHE,它告诉系统,没有将文件的任何内存映射页面放入高速缓存。因此,当将数据写入该文件时,系统将更加经常地更新磁盘上的文件数据。供设备驱动程序开发人员使用的,应用程序通常不使用。

节的第二个保护属性SEC_IMAGE,它告诉系统,你映射的文件是个可移植的可执行PE)文件映像。当系统将该文件映射到你的进程的地址空间中时,系统要查看文件的内容,以确定将哪些保护属性赋予文件映像的各个页面。例如, PE文件的代码节( . text)通常用PAGE_ EXECUTE_READ属性进行映射, PE 文件的数据节( .data) 则通常用PAGE_READW RITE属性进行映射。如果设定的属性是S E C _ I M A G E,则告诉系统进行文件映像的映射,并设置相应的页面保护属性。

最后两个保护属性是SEC_RESERVESEC_COMMIT,它们是两个互斥属性。只有当创建由系统的页文件支持的文件映射对象时,这两个标志才有意义。SEC_COMMIT标志能使CreateFileMapping从系统的页文件中提交存储器。如果两个标志都不设定,其结果也一样。

第四和五个参数:dwMaximumSizeHighdwMaximumSizeLow这两个参数将告诉系统该文件的最大字节数

最后一个参数是pszName 它是个以0结尾的字符串,用于给该文件映射对象赋予一个名字。该名字用于与其他进程共享文件映射对象。

 

步骤3:将文件数据映射进程的地址空间

将文件的数据作为映射到该区域的物理存储器进行提交。

PVOID MapViewOfFile(

   HANDLE hFileMappingObject,

   DWORD dwDesiredAccess,

   DWORD dwFileOffsetHigh,

   DWORD dwFileOffsetLow,

   SIZE_T dwNumberOfBytesToMap);

 

第一个参数: hFileMappingObject用于标识文件映射对象的句柄,该句柄是前面调用CreateFileMappingOpenFileMapping函数返回的。

 

第二个参数:dwDesiredAccess用于标识如何访问该数据。可以设定下表所列的4个值中的一个。

含义

FILE_MAP_WRITE

可以读取和写入文件数据。CreateFileMapping函数必须通过传递PAGE_READWRITE标志来调用

FILE_MAP_READ

可以读取文件数据。CreateFileMapping函数可以通过传递下列任何一个保护属性来调用:PAGE_READONLYPAGE_ READWRITEPAGE_WRITECOPY

FILE_MAP_ALL_ACCES S

FILE_MAP_WRITE相同

FILE_MAP_COPY

可以读取和写入文件数据。如果写入文件数据,可以创建一个页面的私有拷贝。在Windows 2000中,CreateileMapping函数可以用PAGE_READONLYPAGE_READWRITEPAGE_WRITECOPY等保护属性中的任何一个来调用。在Windows 98中,CreateFileMapping必须用PAGE_WRITECOPY来调用

 

(一个文件映射到你的进程的地址空间中时,你不必一次性地映射整个文件。相反,可以只将文件的小部分映射到地址空间。被映射到进程的地址空间的这部分文件称为一个视图。)

 

第三四个参数:dwFileOfsetHighdwFileOfsetLow参数。指定哪个字节应该作为视图中的第一个字节来映射。

第五个参数dwNumberOfBytesToMap有多少字节要映射到地址空间。如果设定的值是0,那么系统将设法把从文件中的指定位移开始到整个文件的结尾的视图映射到地址空间。