我想使用CreateFileMapping
创建一个内存映射区域,而没有任何特定的磁盘文件绑定,而是绑定(使用MapViewOfFileEx
)到一个特定的内存地址。从一开始,这种区域的保护就必须是只读的。然后,我无法将数据写入这样的区域。如果将为特定的磁盘文件创建此区域,则初始数据将来自文件内容。如何用初始数据填充此只读区域?
示例:
大多数Windows进程的内存区域自创建以来就被映射(且未绑定到任何文件路径)且为只读区域,它们包含数据。这是如何实现的?这些区域如何充满数据?
答案 0 :(得分:2)
只有一种方法可以执行此操作-首先使用PAGE_READWRITE
映射部分,对其内容进行初始化,可能取消映射,然后再次使用PAGE_READONLY
保护对其进行映射。例如
ULONG demo_map(PVOID BaseAddress, ULONG size, ULONG (*Init)(PVOID pv, ULONG size))
{
ULONG dwError = NOERROR;
if (HANDLE hSection = CreateFileMappingW(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, 0))
{
if (PVOID pv = MapViewOfFile(hSection, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0))
{
dwError = Init(pv, size);
UnmapViewOfFile(pv);
}
else
{
dwError = GetLastError();
}
if (!dwError)
{
dwError = MapViewOfFileEx(hSection, FILE_MAP_READ, 0, 0, 0, BaseAddress) ? NOERROR : GetLastError();
}
CloseHandle(hSection);
}
return dwError;
}