感谢
http://blog.csdn.net/sszgg2006/article/details/8573348
http://doudouclever.blog.163.com/blog/static/175112310201210210591835/
结果如上图所示:
stdafx.h:
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
vs10Console.cpp:
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <WinNT.h>
//#include <stdio.h>
//#include <windows.h>
#define BUFFSIZE 1024 //内存大小
#define FILE_MAP_START 0x28804 //文件映射的起始位置
LPTSTR lpcTheFile = TEXT("test.dat");
int main(void)
{
HANDLE hMapFile; //文件内存映射区域的句柄
HANDLE hFile; //文件的句柄
DWORD dBytesWritten; //写入的字节数
DWORD dwFileSize; //文件的大小
DWORD dwFileMapSize; //文件映射的大小
DWORD dwMapViewSize; //视图(View)的大小
DWORD dwFileMapStart; //文件映射视图的起始位置
DWORD dwSysGran; //系统内存分配粒度
SYSTEM_INFO SysInfo; //系统信息
LPVOID lpMapAddress; //内存映射区域的起始位置
PCHAR pData; //数据
INT i; //循环变量
INT iData; //
INT iViewDelta; //
BYTE cMapBuffer[32]; //存储从mapping 中计出的数据
//创建一个文件
hFile = CreateFile(lpcTheFile,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
依次写入整数,一共写入65535个整数
//for (i = 0; i < 65535; i++)
//{
// WriteFile(hFile, &i, sizeof( i ), &dBytesWritten, NULL);
//}
//查看写入完成后的文件大小
dwFileSize = GetFileSize(hFile, NULL);
printf("文件大小:%d\n", dwFileSize);
//获取系统信息,内存分配粒度
//获取分配粒度,进行下面的几个计算
//目的是为了映射的数据与系统内存分配粒度对齐,提高内存访问效率
GetSystemInfo(&SysInfo);
dwSysGran = SysInfo.dwAllocationGranularity; //内存分配粒度
//计算mapping的起始位置
dwFileMapStart = (FILE_MAP_START / dwSysGran ) * dwSysGran;
//计算mapping view 的大小
dwMapViewSize = (FILE_MAP_START % dwSysGran ) + BUFFSIZE;
//计算mapping (文件映射)的大小
dwFileMapSize = FILE_MAP_START + BUFFSIZE;
//计算需要读取的数据的偏移
iViewDelta = FILE_MAP_START - dwFileMapStart;
//创建File mapping
hMapFile = CreateFileMapping(hFile, //需要映射的对象句柄
NULL, //安全选项,默认
PAGE_READWRITE, //可读、可写
0, //mapping 对象的大小,高位
dwFileMapSize, //mapping 对象的大小,低位
NULL //mapping对象的名字
);
cout<<"hFile="<<hFile<<endl;
cout<<"hMapFile="<<hMapFile<<endl;
//映射view
lpMapAddress = MapViewOfFile(hMapFile, //mapping 对象的句柄
FILE_MAP_ALL_ACCESS, // 可读可写
0, // 映射的文件偏移,高位
dwFileMapStart, //映射的文件偏移,低位
dwMapViewSize); //映射到View的数据大小
if (lpMapAddress == NULL)
{
printf("MapViewOfFile error: %d\n",GetLastError());
return 1;
}
printf("文件map view 相对于文件的起始位置:0x%x\n",dwFileMapStart);
printf("文件map view的大小:0x%x\n", dwMapViewSize);
printf("从相对map view 0x%x 字节的位置读取数据, ",iViewDelta);
//将指向数据的指针偏移,到达我们关心的地方
pData = (PCHAR) lpMapAddress + iViewDelta;
//读取数据,赋值给变量
iData = *(PINT)pData;
//显示读取的数据
printf("为:x%.8x\n", iData);
//从mapping中复制数据,32个字节,并打印
CopyMemory(cMapBuffer,lpMapAddress, 32);
printf("lpMapAddress起始的字节是:");
for (i = 0; i < 32; i++)
{
printf("0x%.2x ", cMapBuffer[i]);
}
//将mapping的前32个字节用xff填充
FillMemory(lpMapAddress, 32, (BYTE)0Xff);
//将映射的数据写回硬盘上
FlushViewOfFile(lpMapAddress, dwMapViewSize);
printf("\n已经将lpMapAddress开始的字节使用0xff填充。\n");
//关闭mapping对象
if (!CloseHandle(hMapFile))
{
printf("\nclosing the mapping object error %d!", GetLastError());
}
//关闭文件
if (!CloseHandle(hFile))
{
printf("\nError %ld occured closing the file", GetLastError());
}
int ii;
cin>>ii;
return 0;
}