首页 > 解决方案 > 在保持相同地址的同时重新映射 MapViewOfFile

问题描述

我希望解决的基本问题是拥有两个由物理内存(即 VirtualAlloc)支持的虚拟内存区域,以及“指向”另外两个虚拟内存区域之一的第三个虚拟内存区域。

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

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

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

标签: winapivirtual-memory

解决方案


如果地址正在使用中,则不能直接覆盖该地址。

要使用相同的地址 ( 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.

推荐阅读