在保持相同地址的同时重新映射 MapViewOfFile

Remap MapViewOfFile while keeping the same address

我希望解决的根本问题是拥有两个由物理内存(即 VirtualAlloc)支持的虚拟内存区域,以及 "points" 到另一个区域的第三个虚拟内存区域两个虚拟内存区域。

虽然我相信您可以使用 MapViewOfFileEx 映射两个支持的内存区域之一,但我找不到任何方法来确保在将映射从一个区域更改为另一个区域时 lpBaseAddress 不会被盗。

我最初的想法是使用 MEM_RESERVE 的 VirtualAlloc,但是 MapViewOfFileEx 不能使用预留内存。

我相信我可以在 posix 上用 shm_open 和家人完成同样的事情,因为 mmap 可以覆盖映射区域。

您不能直接覆盖正在使用的地址。

要使用相同的地址 (mappedAddress),您需要在重新映射之前调用 UnmapViewOfFile。像这样:

HANDLE targetFile = CreateFile(L"target.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
HANDLE fileMap = CreateFileMapping(targetFile, 0, PAGE_READWRITE, 0, 10, L"myTestMap");
LPVOID mappedAddress = MapViewOfFileEx(fileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0, 0);
BOOL result = UnmapViewOfFile(mappedAddress); // Get the address.

HANDLE targetFile2 = CreateFile(L"target2.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
HANDLE fileMap2 = CreateFileMapping(targetFile2, 0, PAGE_READWRITE, 0, 10, L"myTestMap2");
LPVOID mappedAddress2 = MapViewOfFileEx(fileMap2, FILE_MAP_ALL_ACCESS, 0, 0, 0, mappedAddress); // Use the same address.