MiniFilter Driver - изменить байты файла в IRP_MJ_CLOSE и IRP_MJ_CREATE

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

Я создал новый проект "Драйвер фильтра: мини-фильтр файловой системы" с WDK8 в Visual Studio 2012 и зарегистрировал PreCreate, PostCreate, PreClose и PostClose в качестве функций обратного вызова.

Например, для IRP_MJ_CLOSE файла, байтом которого является {72,101,108,108,111} ("Hello"), я хочу, чтобы после функции PostClose файл выглядел на жестком диске следующим образом: {10,11,12,72,101,108,108,111}.

Я подозреваю, что это не так просто, как просто:

    FLT_PREOP_CALLBACK_STATUS
    PreClose (
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    )
{
    //...

    //some if statment...
    {
        Data->Iopb->Parameters.Write.WriteBuffer = newBfr;
        Data->Iopb->Parameters.Write.Length = newLen;
    }
    //...

    return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}

Я хотел бы получить некоторое руководство по этому вопросу.

Также, каков наилучший способ отладки этого? Я не нашел способ распечатать в отладке Windows 7.

Спасибо! gfgqtmakia.

РЕДАКТИРОВАТЬ: Я прочитал http://code.msdn.microsoft.com/windowshardware/swapBuffer-File-System-6b7e6e2d но я не думаю, что это поможет мне, потому что это для чтения / записи, что я не не хочу иметь дело с

РЕДАКТИРОВАТЬ 2: Или, может быть, я должен сделать свои изменения в PreCreate и PostClose, когда файл находится на жестком диске, а не в середине IRP, и тогда мне не нужно будет работать с буферами "на лету", а на диск?

1 ответ

Решение

Вам придется написать что-то вроде буфера обмена. Изменение данных файла в PostCreate/PreClose не будет хорошей идеей.

Несколько причин:

  • Во-первых, в PostCreate/PreClose вы не должны получать доступ Data->Iopb->Parameters.Write.WriteBuffer, Это действительно только в IRP_MJ_WRITE. Ты можешь сделать FltWriteFile записать данные в файл.
  • Ядро Windows может не записывать данные файла сразу на диск в / после IRP_MJ_CLOSE. Подумайте о кеше страницы.
  • Могут возникнуть сложности, такие как пейджинговый ввод-вывод, прямой ввод-вывод и т. Д., О которых необходимо позаботиться должным образом.
  • Еще одна важная вещь, которую я заметил, это то, что вы также измените размер файла (как сказано в вашем вопросе, фактическая длина данных составляет 5 байт, а вы обновите данные до 8 байт). Сейчас этим очень сложно управлять. Никогда не рекомендуется изменять размер файла в минифильтре / драйвере файловой системы.
Другие вопросы по тегам