zoukankan      html  css  js  c++  java
  • 一个简单但详细的解释Windows文件映射读取数据文件的例子

    #include <windows.h>
    #include <string.h>
    #include <string>
    #include <iostream>
    using namespace std;

    int main(int argc, char *argv[])
    {
    // 步骤1 打开文件FILE_FLAG_WRITE_THROUGH
    HANDLE hFile = CreateFile(
    "demo.txt",
    GENERIC_WRITE | GENERIC_READ,// 如果要映射文件:此处必设置为只读(GENERIC_READ)或读写
    0, // 此设为打开文件的任何尝试均将失败
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, //|FILE_FLAG_WRITE_THROUGH,【解1】
    NULL);
    if (hFile != INVALID_HANDLE_VALUE)// 文件打开失败返回句柄为-1
    // 这步必须测试,详细见步骤2
    {
    cout<<"文件打开成功~! ";
    }
    else
    {
    cout<<"文件打开失败! ";
    DWORD d = GetLastError();
    cout<<d<<endl;
    return -1;
    }

    // 步骤2 建立内存映射文件
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    printf("文件大小为:%d ", dwFileSize);
    HANDLE hFileMap = CreateFileMapping(
    hFile, // 如果这值为INVALID_HANDLE_VALUE,是合法的,上步一定测试啊
    NULL, // 默认安全性
    PAGE_READWRITE, // 可读写
    0, // 2个32位数示1个64位数,最大文件字节数,
    // 高字节,文件大小小于4G时,高字节永远为0
    0,//dwFileSize, // 此为低字节,也就是最主要的参数,如果为0,取文件真实大小
    NULL);
    if (hFileMap != NULL)
    {
    cout<<"内存映射文件创建成功~! ";
    }
    else
    {
    cout<<"内存映射文件创建失败~!"<<endl;
    }

    // 步骤3:将文件数据映射到进程的地址空间
    PVOID pvFile = MapViewOfFile( //pvFile就是得到的指针,用它来直接操作文件
    hFileMap,
    FILE_MAP_WRITE, // 可写
    0, // 文件指针头位置 高字节
    0, // 文件指针头位置 低字节 必为分配粒度的整倍数,windows的粒度为64K
    0); // 要映射的文件尾,如果为0,则从指针头到真实文件尾
    if (pvFile != NULL)
    {
    cout<<"文件数据映射到进程的地址成功~! ";
    }
    else
    {
    cout<<"文件数据映射到进程的地址成功~! ";
    }

    // 步骤4: 像操作内存一样操作文件,演示功能把整个文件倒序
    char *p = (char*)pvFile;
    printf("%s ", p);
    for (unsigned int i = 0; i <= dwFileSize / 2; i++)
    {
    int nTmp = p[i];
    p[i] = p[dwFileSize - 1 - i];
    p[dwFileSize - 1 - i] = nTmp;
    }
    printf("%s ", p);

    cout<<"交换完毕,点击Enter退出"<<endl;

    // 步骤5: 相关的释放工作
    UnmapViewOfFile(pvFile); // 释放内存映射文件的头指针
    CloseHandle(hFileMap); // 内存映射文件句柄
    CloseHandle(hFile); // 关闭文件
    getchar();
    return 0;
    }

  • 相关阅读:
    PowerCat DNS 隧道通信
    各种反弹shell方法总结备忘
    Halo-个人独立博客系统
    内网渗透之域渗透
    使用 EW 作Socks5代理内网穿透
    PowerShell攻击:nishang
    贝叶斯网络
    Anaconda的CondaHTTPError问题
    完美解决win10系统无法安装.NET Framework问题
    敏捷开发中如何做质量管理?
  • 原文地址:https://www.cnblogs.com/xunbu7/p/4155166.html
Copyright © 2011-2022 走看看