内存映射区域初始数据

时间:2018-07-01 02:54:37

标签: c++ winapi memory-management

我想使用CreateFileMapping创建一个内存映射区域,而没有任何特定的磁盘文件绑定,而是绑定(使用MapViewOfFileEx)到一个特定的内存地址。从一开始,这种区域的保护就必须是只读的。然后,我无法将数据写入这样的区域。如果将为特定的磁盘文件创建此区域,则初始数据将来自文件内容。如何用初始数据填充此只读区域?

示例:
大多数Windows进程的内存区域自创建以来就被映射(且未绑定到任何文件路径)且为只读区域,它们包含数据。这是如何实现的?这些区域如何充满数据?

1 个答案:

答案 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;
}