【问题标题】:Remap MapViewOfFile while keeping the same address在保持相同地址的同时重新映射 MapViewOfFile
【发布时间】:2019-09-24 05:10:43
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我说你的问题不清楚,两个虚拟内存区域第三个虚拟内存区域“指向”另外两个虚拟内存区域之一记忆 - 为了什么?
  • 正如document 所说,建议使用偏移量而不是地址,因为不能保证地址会随着时间的推移保持安全。您对使用偏移量有任何顾虑吗?
  • @RitaHan-MSFT 这是对仿真的优化。有两个模拟内存组(前两个虚拟内存区域),如果我可以简单地使用第三个区域指向适当的内存组,它将简化代码。

标签: winapi virtual-memory


【解决方案1】:

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

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

【讨论】:

  • 我能想到的唯一问题是取消映射和重新映射之间可能存在竞争条件,其中 VirtualAlloc 窃取了 mappedAddress。
  • @Programmdude 你可以在UnmapViewOfFile之前使用VirtualLock来防止被盗。
猜你喜欢
  • 2018-02-20
  • 2012-10-16
  • 1970-01-01
  • 2017-05-06
  • 2011-03-27
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多