Переопределите MapViewOfFile, сохранив тот же адрес - PullRequest
0 голосов
/ 24 сентября 2019

Основная проблема, которую я хочу решить, состоит в том, чтобы иметь две области виртуальной памяти, поддерживаемые физической памятью (т. Е. VirtualAlloc), и третью область виртуальной памяти, которая «указывает» на одну из двух других областей виртуальной памяти.memory.

Хотя я считаю, что вы можете отобразить одну из двух резервных областей памяти с помощью MapViewOfFileEx, я не могу найти никакого способа гарантировать, что lpBaseAddress не будет украден при изменении отображения из одной области надругой регион.

Моя первоначальная идея заключалась в том, чтобы VirtualAlloc с MEM_RESERVE, но MapViewOfFileEx не может использовать зарезервированную память.

Я считаю, что могу выполнить то же самое на posix с shm_open и family, как mmapможет переопределить сопоставленные регионы.

1 Ответ

1 голос
/ 25 сентября 2019

Вы не можете напрямую переопределить адрес, если он используется.

Чтобы использовать тот же адрес (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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...