C++ 内存映射区域初始数据
我想使用C++ 内存映射区域初始数据,c++,winapi,memory-management,C++,Winapi,Memory Management,我想使用CreateFileMapping创建内存映射区域,但不绑定任何特定的磁盘文件,而是绑定(使用mapviewoffiex)到特定的内存地址。这种区域的保护从一开始就需要是只读的。然后,我无法将数据写入这样的区域。如果要为特定磁盘文件创建此区域,则初始数据将来自文件内容。如何用初始数据填充此只读区域 示例: 大多数Windows进程都有内存区域,这些内存区域被映射(并且没有绑定到任何文件路径)并且自创建以来是只读的,它们包含数据。这是如何实现的?这些区域是如何被数据填充的?只有一种方法可以
CreateFileMapping
创建内存映射区域,但不绑定任何特定的磁盘文件,而是绑定(使用mapviewoffiex
)到特定的内存地址。这种区域的保护从一开始就需要是只读的。然后,我无法将数据写入这样的区域。如果要为特定磁盘文件创建此区域,则初始数据将来自文件内容。如何用初始数据填充此只读区域
示例:大多数Windows进程都有内存区域,这些内存区域被映射(并且没有绑定到任何文件路径)并且自创建以来是只读的,它们包含数据。这是如何实现的?这些区域是如何被数据填充的?只有一种方法可以做到这一点-首先使用
PAGE\u READWRITE
映射部分,初始化it内容,可能取消映射,然后使用PAGE\u 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;
}
“绑定(使用MapViewOffilex)到特定进程内存地址”不清楚这是什么意思。您只能将共享内存映射到自己的进程中,而不能映射到其他进程中。听起来像是一场灾难。您的实际目标是什么?编辑以获得更清晰的信息是什么让您相信“大多数windows进程的内存区域都是映射的(并且没有绑定到任何文件路径),并且自创建以来是只读的”?你的证据是什么?我用调试器看到了,一些内存区域映射到了一些文件路径,一些不包含文件路径。但问题不在于证据,而在于如何制作这样的区域。它们首先使用读写保护映射节,然后使用只读映射