Задача: Отследить факт закрытия файлов определенного типа в каталоге. Через некоторое время (delta-T) после закрытия необходимо модифицировать атрибуты файлов. Список каталоглв и типы файлов указываются в настройках. Рассматриваемое решение: Legacy драйвер-фильтр ФС, который отлавливает открытие и закрытие файлов (фильтруя по типу и каталогу) и передает эту информацию приложению(в идеале служба). Приложение ведет счетчик "дескрипторов" на каждый файл, если счетчик файла обнуляется, то приложение запускает таймер ожидания delta-T. Если за этот период файл открывается, то счетчик сбрасывается, если файл остается "нетронутым", то выполняется модификация этого файла. Примечание: legacy фильтр выбран т.к. требуется поддержка ОС Win2000 (сам в шоке). Хотя думаю, что SP4 там доступен по этому подумываю об альтернативе с минифильтром для Filter Manager, но опыта работы с ним нет, а информации в достатке пока не нашёл. Сейчас за основу взял пример legacy фильтра ФС (http://www.codeproject.com/KB/system/fs-filter-driver-tutorial.aspx) Вопросы: -Как гарантированно отследить закрытие файла? -Как лучше организовать передачу данных от драйвера приложению (Смотрю в сторону асинхронных DeviceIoControl) с передачей через буфер т.к. данных мало (файл, дата, флаг открыт/закрыт) -Буду признателен за любую дополнительную информацию по теме. -Активно поддериживаются замечания, мнения и предложения по реализации.
Для отслеживания закрытия файла для начала отлавливайте сообщение IRP_MJ_CLOSE в фильтре. Смотрите исходники Filemon'a
Да нормальное решение, чо. Если есть возможность, - лучше минифильтры, конечно. Да ничего там особо сложного, уж как-нибудь разберёшься. Исходники WDK-шные смотри, а не туториалы какие-то там. Думаю, IRP_MJ_CLEANUP тебе вполне достаточно будет. Да как хочешь, хоть IRP_MJ_READ асинхронный а-ля inverted calls. Это уже видел? Ну и дальше там по ссылкам. Лень. Просто лень.
А он нигде не говорил, что ему нужно выгружаемое решение. Но даже если и так, то минифильтры с этим вполне справятся, а других преимуществ у твоего решения нет, одни минусы.
Это конечно решение, но с хак решениями я завязал на 5ом курсе) Нужно сделать надёжно и просто. Спасибо x64 за наводку на WDK (до этого я пользовался старым хелпом из DDK, там этого не было). Сейчас изучаю miniSpy. Думаю что там совсем немного надо подкрутить и всё получится. Там даже взаимодействие с клиентом есть на портах.