Фильтр файловой системы (Открытие и закрытие файлов)

Тема в разделе "WASM.NT.KERNEL", создана пользователем mohito, 17 июл 2011.

  1. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Задача:
    Отследить факт закрытия файлов определенного типа в каталоге. Через некоторое время (delta-T) после закрытия необходимо модифицировать атрибуты файлов. Список каталоглв и типы файлов указываются в настройках.

    Рассматриваемое решение:
    Legacy драйвер-фильтр ФС, который отлавливает открытие и закрытие файлов (фильтруя по типу и каталогу) и передает эту информацию приложению(в идеале служба). Приложение ведет счетчик "дескрипторов" на каждый файл, если счетчик файла обнуляется, то приложение запускает таймер ожидания delta-T. Если за этот период файл открывается, то счетчик сбрасывается, если файл остается "нетронутым", то выполняется модификация этого файла.

    Примечание:
    legacy фильтр выбран т.к. требуется поддержка ОС Win2000 (сам в шоке).
    Хотя думаю, что SP4 там доступен по этому подумываю об альтернативе с минифильтром для Filter Manager, но опыта работы с ним нет, а информации в достатке пока не нашёл.
    Сейчас за основу взял пример legacy фильтра ФС (http://www.codeproject.com/KB/system/fs-filter-driver-tutorial.aspx)

    Вопросы:
    -Как гарантированно отследить закрытие файла?
    -Как лучше организовать передачу данных от драйвера приложению (Смотрю в сторону асинхронных DeviceIoControl) с передачей через буфер т.к. данных мало (файл, дата, флаг открыт/закрыт)
    -Буду признателен за любую дополнительную информацию по теме.
    -Активно поддериживаются замечания, мнения и предложения по реализации.
     
  2. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Для отслеживания закрытия файла для начала отлавливайте сообщение IRP_MJ_CLOSE в фильтре.
    Смотрите исходники Filemon'a
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да нормальное решение, чо.

    Если есть возможность, - лучше минифильтры, конечно.

    Да ничего там особо сложного, уж как-нибудь разберёшься.

    Исходники WDK-шные смотри, а не туториалы какие-то там.

    Думаю, IRP_MJ_CLEANUP тебе вполне достаточно будет.

    Да как хочешь, хоть IRP_MJ_READ асинхронный а-ля inverted calls.

    Это уже видел?
    Ну и дальше там по ссылкам.

    Лень.
    Просто лень.
     
  4. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Хук на IofCallDriver, хак-решение, но обычно помогает в таких задачах, без установки (мини)фильтра
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    А он нигде не говорил, что ему нужно выгружаемое решение. Но даже если и так, то минифильтры с этим вполне справятся, а других преимуществ у твоего решения нет, одни минусы.
     
  6. mohito

    mohito New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2007
    Сообщения:
    10
    Это конечно решение, но с хак решениями я завязал на 5ом курсе)
    Нужно сделать надёжно и просто.

    Спасибо x64 за наводку на WDK (до этого я пользовался старым хелпом из DDK, там этого не было). Сейчас изучаю miniSpy. Думаю что там совсем немного надо подкрутить и всё получится. Там даже взаимодействие с клиентом есть на портах.