Я хочу отобразить файл (фактически набор файлов) в памяти таким образом, чтобы содержимое файлов не обновлялось при изменении памяти.Обычно этого можно достичь, выполнив следующие вызовы Windows (некоторые аргументы опущены):
auto fileHandle = CreateFile (...,GENERIC_READ,...);
auto mapHandle = CreatefileMapping(fileHandle,...,PAGE_WRITECOPY,...);
auto memory = MapViewOfFile(mapHandle,FILE_MAP_READ|FILE_MAP_COPY,...);
Чтобы проверить, какая память была изменена, я хочу использовать флаг MEM_WRITE_WATCH
, но выне может передать это в функцию MapViewOfFile
.
Альтернативой может быть явное резервирование памяти с помощью VirtualAlloc
и передача MEM_WRITE_WATCH
для этого вызова и передача зарезервированного адреса в MapViewOfFile
, но этоне удается, потому что вы не можете отобразить представление в память, которая уже была зарезервирована.
Начиная с Windows 10 Redstone 4, вы можете использовать VirtualAlloc2
и резервировать память, используя MEM_RESERVE_PLACEHOLDER
.Затем функцию MapViewOfFile3
можно использовать для сопоставления вида с адресом (с использованием флага MEM_REPLACE_PLACEHOLDER
).Хотя это, вероятно, должно работать, я уже заблокирован вызовом метода VirtualAlloc2
, так как передаю ему MEM_WRITE_WATCH
, так как он завершается с ошибкой 87 (недопустимые аргументы).
Цель всей конструкциисостоит в том, чтобы отобразить большой (десятки или сотни гигабайт) в память только для чтения (я не хочу изменять входные файлы и не хочу явно читать полные файлы, так как это может просто скопировать файлв файл подкачки (pagefile.sys)), и я хочу отслеживать, какие страницы памяти были изменены во время работы приложения, чтобы я мог скопировать измененные страницы в другое место.
Есть предложения?