码迷,mamicode.com
首页 > 其他好文 > 详细

内存映射文件

时间:2019-07-07 17:51:38      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:程序   图片   缓存   读取   user   fine   kernel   file   写入   

技术图片

 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共享时候为啥进程相互之间改写不影响?

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

内存映射文件

标签:程序   图片   缓存   读取   user   fine   kernel   file   写入   

原文地址:https://www.cnblogs.com/hanhandaren/p/11146811.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!