阻止CreateFileMapping更改源文件(Windows)

时间:2018-06-21 18:34:11

标签: c windows file-mapping

我正在研究Windows上的内存映射,并编写了以下代码(出于可读性,我从副本中省略了错误处理):

HANDLE file_h = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

HANDLE map_h = CreateFileMapping(file_h, NULL, PAGE_READWRITE, 0, lengthOfFile + padding, NULL);

char * map;
map = MapViewOfFile(map_h, FILE_MAP_COPY, 0, 0, lengthOfFile + padding);

lengthOfFile 是我以前以此方式计算的文件的长度(出于某些原因,与这种情况无关)

FILE * file;
file = fopen(filename,"rb");
fseek(file, 0, SEEK_END);
int lengthOfFile = ftell(file);
fseek(file, 0, SEEK_SET);
int last = (lengthOfFile % 4);
int n_pack = (int)(lengthOfFile / 4);
int padding = 4 - last;

并且 padding 是我需要添加的一些额外长度(您可以通过阅读上面的代码来找出原因)。

然后,我对内存映射文件执行一些操作,包括对其的修改以及将其新值分配给另一个函数。

如何做到这一点,以便当我同时关闭 file_h map_h 来处理源文件(文件名)时,保持不变(正确现在,由于关闭了附加的 padding ,因此一旦关闭它的句柄,它就会被修改,显然是在它的句柄关闭后立即“掉入”了源文件)?

我尝试将 PAGE_WRITECOPY 标志与 PAGE_READWRITE (用于修改内存映射文件的内容)一起使用,但使用 CreateFileMapping 函数无法返回 ERROR_INVALID_PARAMETER (87)错误。

换句话说,我需要使用以下方法实现与Unix中相同的行为: mmap(0,lengthOfFile + padding,PROT_READ | PROT_WRITE, **MAP_PRIVATE**,fileno(file),0); 我想关键是 MAP_PRIVATE 属性。

0 个答案:

没有答案