У меня есть некоторый код (который я не могу изменить), который мне нужен для работы в родной среде Win32. Этот код вызывает mmap()
и munmap()
, поэтому я создал эти функции, используя CreateFileMapping()
, MapViewOfFile()
и т. Д., Чтобы выполнить то же самое. Первоначально это работает нормально, и код может получить доступ к файлам, как и ожидалось. К сожалению, код переходит к munmap()
выбранным частям файла, которые ему больше не нужны.
x = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
...
munmap(x, hdr_size);
munmap(x + foo, bar);
...
К сожалению, когда вы передаете указатель в середину отображаемого диапазона на UnmapViewOfFile()
, он уничтожает все отображение. Хуже того, я не могу понять, как мне удалось бы обнаружить, что это частичный запрос отмены отображения, и просто проигнорировать его.
Я попытался вызвать VirtualFree()
в диапазоне, но, что неудивительно, это приводит к ошибке ERROR_INVALID_PARAMETER.
Я начинаю думать, что мне придется использовать статические / глобальные переменные для отслеживания всех отображений открытой памяти, чтобы я мог обнаруживать и игнорировать частичные отображения, но я надеюсь, что у вас есть идея получше ...
редактирование:
Поскольку я не был достаточно ясен выше: документы для UnMapViewOfFile не точно отражают поведение этой функции.
Отмена отображения всего представления и перераспределения фрагментов не является хорошим решением, поскольку вы можете только предложить базовый адрес для нового отображения, вы не можете реально его контролировать. Семантика munmap()
не допускает изменения базового адреса все еще отображенной части.
Что мне действительно нужно, так это способ найти базовый адрес и размер уже отображенной области памяти.
edit2: Теперь, когда я повторяю проблему таким образом, похоже, что функции VirtualQuery()
будет достаточно.