【问题标题】:Memory Mapped Region initial data内存映射区域初始数据
【发布时间】:2018-07-01 02:54:37
【问题描述】:

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

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

【问题讨论】:

  • “绑定(使用 MapViewOfFileEx)到特定进程内存地址” 不清楚你的意思。您只能将共享内存映射到您自己的进程,而不是其他进程。听起来像XY problem。你对这一切的实际目标是什么?
  • 编辑更清晰
  • 是什么让您相信“大多数 Windows 进程都有映射的内存区域(并且不绑定到任何文件路径)并且自创建以来只读”?你有什么证据证明这个说法?
  • 我看到这个使用调试器,一些内存区域映射到一些文件路径,一些不包含文件路径。但问题不在于证据,而在于如何制作这样的区域。
  • 他们首先使用读写保护映射部分,然后使用只读映射

标签: c++ winapi memory-management


【解决方案1】:

只有一种方法可以做到这一点 - 第一个使用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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多