使用函数CreateFileMapping创建文件映射,然后调用MapViewOfFile把文件映射到进程中,可以通过直接修改进程里面的内存来达到修改文件内容的目的。
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <shellapi.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile = NULL, hMappingHandle = NULL;
LPVOID pFile=NULL;
hFile=CreateFile(
L"e:/1.txt", //打开的文件名
GENERIC_READ | GENERIC_WRITE, //打开的权限 这里申请读写权限
0, //0代表独占打开 不共享
NULL, //安全属性,该参数为0 则创建的子进程无法继承该句柄
OPEN_EXISTING, //文件以外的设备通常使用该值, 这里测试已经存在的文件 所以也可以使用这个值
FILE_ATTRIBUTE_NORMAL,
NULL //当打开一个存在的文件时,忽略此参数
);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("文件打开失败,错误码=%d\n",GetLastError());
goto exit;
}
hMappingHandle=CreateFileMappingW(
hFile, //打开的文件句柄
NULL, //使用默认的安全属性
PAGE_READWRITE, //文件映射对象的也保护 这里没有设置可执行属性
0,
0, //对于文件映射这两个大小都可以设置为0.
L"yxp" //文件映射对象的名称
);
if (hMappingHandle == 0)
{
printf("创建文件映射失败,错误码=%d\n", GetLastError());
goto exit;
}
//将文件映射的视图映射到调用进程的地址空间。
pFile=MapViewOfFile(
hMappingHandle,
FILE_MAP_READ | FILE_MAP_WRITE, //对文件映射的访问类型 这里使用读和写
0,
0, //映射的开始位置
0 //表示从指定的偏移 映射到文件尾
);
if (pFile == NULL)
{
printf("文件映射到进程失败,错误码=%d\n", GetLastError());
goto exit;
}
*(int*)pFile = 0x11111111; //这种方式就修改了文件内容
UnmapViewOfFile(pFile);
exit:
if (hFile)
{
CloseHandle(hFile);
}
if (hMappingHandle)
{
CloseHandle(hMappingHandle);
}
getchar();
return 0;
}