zoukankan      html  css  js  c++  java
  • 内存映射文件

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

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

  • 相关阅读:
    发送ajax步骤
    web app开发技巧总结
    移动端常见问题及解决方案
    【转】Session Cookie Token的区别
    call、apply、bind的区别
    【转】rem自适应布局
    ThinkPHP系统内置单字母函数函数
    thinkphp buildsql和fetchsql的区别
    thinkphp 3.2.3重写 pdo链接
    thinkphp pdo 重写问题
  • 原文地址:https://www.cnblogs.com/hanhandaren/p/11146811.html
Copyright © 2011-2022 走看看