драйвер минифильтра | отслеживание изменений в файлах

Чего я пытаюсь добиться, так это перехватывать каждую запись в файл и отслеживать изменения в файле. Я хочу отслеживать, насколько отличается содержимое файла до и после записи.

До сих пор в моем драйвере минифильтра я регистрировался для обратных вызовов IRP_MJ_WRITE и теперь может перехватывать записи в файл. Однако я до сих пор не уверен, как мне получить содержимое файла до [предварительной операции] и содержимое после [постоперации]. Параметры, которые у меня есть в функциях обратного вызова: PCFLT_RELATED_OBJECTS, PFLT_CALLBACK_DATA, и я не смог найти в них ничего, связанного с содержимым самого файла.


person Naftaly    schedule 07.11.2017    source источник
comment
Я никогда не писал мини-фильтр, но я думаю, вы могли бы использовать некоторую комбинацию: (1) зарегистрироваться для уведомления об открытии файла, и когда это произойдет, выполнить свои собственные операции чтения (IRP_MJ_READ) для получения исходного содержимого файла ( 2) когда вы получаете каждый IRP_MJ_WRITE, считывайте соответствующий начальный контент (если есть) перед передачей записи (3) определяйте, когда файл закрыт (может быть сложно?), а затем переходите к чтению любого контента, который не был изменен , если вас это волнует.   -  person asynchronos    schedule 09.11.2017
comment
FLT_PARAMETERS в PFLT_CALLBACK_DATA->Iopb предоставит вам необходимые параметры этого IRP. Ссылка: msdn.microsoft.com /en-us/library/windows/hardware/   -  person Rohan    schedule 13.11.2017


Ответы (1)


Это операции, которые могут изменить данные в файле:

  1. Изменение файла: IRP_MJ_WRITE, IRP_MJ_SET_INFORMATION (в частности, информационные классы FileEndOfFileInformation и FileValidDataLengthInformation), IRP_MJ_FILE_SYSTEM_CONTROL< /strong> (в частности, коды FSCTL_OFFLOAD_WRITE, FSCTL_WRITE_RAW_ENCRYPTED и FSCTL_SET_ZERO_DATA fsctl).

Что касается содержимого самого файла, то вам просто нужно прочитать его самостоятельно. Если вы имеете в виду буферы в том виде, в котором они пишутся, например, проверьте это, чтобы узнать больше о параметрах IRP_MJ_WRITE в данных обратного вызова. По сути, буфер находится в Data->Iopb->Parameters.Write.WriteBuffer/MdlAddress.

Убедитесь, что вы правильно обращаетесь с этой памятью, иначе это приведет к BSOD.

Удачи.

person Gabriel Bercea    schedule 26.01.2018