内存映射文件

Posted hanhandaren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存映射文件相关的知识,希望对你有一定的参考价值。

技术图片

 1 // 文件映射.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "windows.h"
 6 
 7 #define MAPPINGNAME "共享文件"
 8 
 9 /*
10 通过文件映射 读写文件
11 *参数:lpcFile 文件路径
12 *返回值:1 成功 0 失败
13 */
14 
15 DWORD MappingFile(LPSTR lpcFile)
16 
17     HANDLE hFile;
18     HANDLE hMapFile;
19     DWORD dwFileMapSize;
20     LPVOID lpAddr;
21     //1.得到文件句柄
22     hFile = CreateFile((LPCWSTR)lpcFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
23     if (hFile == INVALID_HANDLE_VALUE)
24     
25         printf("创建文件失败:%d\\n", GetLastError());
26         return 0;
27 
28     
29     //2.创建FileMapping对象
30     hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, (LPCWSTR)MAPPINGNAME);
31     if (hMapFile == NULL)
32     
33         printf("CreateFileMapping失败:%d\\n", GetLastError());
34         CloseHandle(hFile);
35         return 0;
36     
37 
38     //3.映射到虚拟内存(关联)
39     lpAddr = MapViewOfFile(hMapFile,FILE_MAP_COPY,0,0,0);
40 
41     if (lpAddr ==NULL)
42     
43         printf("MapViewOfFile失败:%d\\n", GetLastError());
44         CloseHandle(hMapFile);
45         CloseHandle(hFile);
46         return 0;
47     
48 
49     //4.读取文件
50     DWORD dwText1 = *(PDWORD)lpAddr;  //读文件最开始的地方
51     DWORD dwText2 = *((PDWORD)lpAddr + 0x1b8fc);  //读文件位于偏移0x1b8fc的地方
52     printf("%x %x \\n", dwText1, dwText2);
53 
54     //5.写文件(不是实时性的修改)
55     *(PDWORD)lpAddr = 0x41414141;
56     printf("A写入:%x\\n", *(PDWORD)lpAddr);
57     //强制更新缓存(加上后可以实时性)
58     FlushViewOfFile(((PDWORD)lpAddr), 4);
59 
60     //6.关闭资源
61     UnmapViewOfFile(lpAddr);
62     CloseHandle(hMapFile);
63     CloseHandle(hFile);
64 

技术图片

kernel32

user32

ntdll 

全部都是通过Mapping映射到各个文件进程内,实际上物理页就一份

 

 

为什么kernel32等dll共享时候为啥进程相互之间改写不影响?

原因:因为映射的是写拷贝属性,写的也是拷贝后的数据,而不是原数据

以上是关于内存映射文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理内存映射相关数据结构 ⑥ ( 文件映射 虚拟内存区域 | vm_area_struct | vm_operations_struct | 匿名映射 虚拟内存区域 )

内存映射文件原理探索

内存映射文件原理探索

内存映射文件

内存映射大文件

内存映射文件长度