Минифильтр, IRP_MJ_WRITE приходит дважды

Тема в разделе "WASM.NT.KERNEL", создана пользователем vasalvit, 13 мар 2008.

  1. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Здравствуйте.

    Изучаю минифилтры. Поставил перед собой следующую задачу - написать простейший шифровальщик файлов с определённым расширением. Алгоритм шифрования простой - XOR 0xFF.

    Появилась проблема. Если я в блокноте ввёл 10 символов и нажал сохранить, то приходит два IRP_MJ_WRITE:
    1. с размером 10 байт
    2. с размером 4096 байт

    Почему так - я догадываюсь. Первый раз - сами данные, второй - уже при записи на диск вместе с "мусором" для выравнивания.
    Для моего фильтра нужно обрабатывать только первый. Как его отследить?

    Смотрел в DDK scanner и swapBuffers примеры. Там тоже приходят два сообщения. Они их игнорируют.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    содержимое буферов одинаковое? первый 10 байт.
     
  3. vasalvit

    vasalvit New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    53
    Да. Первые 10 байт одинаковы.
     
  4. DriversDeveloper

    DriversDeveloper Виктор Фисюк

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    6
    Адрес:
    Kiev, Ukraine
    Первая операция записи - это запись в кеш, флаг 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.