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 ", 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 ", 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 ", 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 ", dwText1, dwText2); 53 54 //5.写文件(不是实时性的修改) 55 *(PDWORD)lpAddr = 0x41414141; 56 printf("A写入:%x ", *(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共享时候为啥进程相互之间改写不影响?
原因:因为映射的是写拷贝属性,写的也是拷贝后的数据,而不是原数据