Здравствуйте. Изучаю минифилтры. Поставил перед собой следующую задачу - написать простейший шифровальщик файлов с определённым расширением. Алгоритм шифрования простой - XOR 0xFF. Появилась проблема. Если я в блокноте ввёл 10 символов и нажал сохранить, то приходит два IRP_MJ_WRITE: 1. с размером 10 байт 2. с размером 4096 байт Почему так - я догадываюсь. Первый раз - сами данные, второй - уже при записи на диск вместе с "мусором" для выравнивания. Для моего фильтра нужно обрабатывать только первый. Как его отследить? Смотрел в DDK scanner и swapBuffers примеры. Там тоже приходят два сообщения. Они их игнорируют.
Первая операция записи - это запись в кеш, флаг IRP_NOCACHE не установлен (поле Data->Iopb->IrpFlags для минифильтров или Irp->Flags для legacy filters). Когда же lazy writer кеш менеджера сбрасывает данные на диск, минифильтру приходит страничная операция записи (установлены флаги IRP_PAGING_IO и IRP_NOCACHE). Если же запись в файл происходит без использования кеша, например, когда указан флаг FILE_NO_INTERMEDIATE_BUFFERING при открытии файла, то минифильтру придет запись с установленным флагом IRP_NOCACHE (без IRP_PAGING_IO). В данном случае данные будут непосредственно записаны на диск. Фильтр-драйвер шифрования должен шифровать/расшифровывать только те данные, которые непосредственно записываются на диск или считываются с диска. Т.е. операции в которых установлен флаг IRP_NOCACHE.