Отображение файла только для чтения в памяти и отслеживание изменений с использованием WRITE_WATCHES не работает - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу отобразить файл (фактически набор файлов) в памяти таким образом, чтобы содержимое файлов не обновлялось при изменении памяти.Обычно этого можно достичь, выполнив следующие вызовы 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)), и я хочу отслеживать, какие страницы памяти были изменены во время работы приложения, чтобы я мог скопировать измененные страницы в другое место.

Есть предложения?

1 Ответ

0 голосов
/ 22 августа 2019

Используйте QueryWorkingSet и проверьте каждую соответствующую страницу на наличие флага частной страницы, этот флаг означает, что произошло копирование при записи.Кстати, таким образом, вы также можете проверить наличие точек останова, установленных отладчиком.Удачи.

...