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 байт). Сейчас этим очень сложно управлять. Никогда не рекомендуется изменять размер файла в минифильтре / драйвере файловой системы.