Thor
Гость
|
|
« : 23-08-2004 07:56 » |
|
Добрый день, я пытаюсь написать драйвер фильтр файловой системы для фильтрации IRP_MJ_CREATE запросов. За основу взял sfilter example из IFS Kit. Сейчас на этапе теста я просто отсылаю имя файла полученое в обработчике IRP_MJ_CREATE юзер процессу. Я заметил что не при всех открытиях файлов мне приходит IRP_MJ_CREATE для открываемового/копируемого файла. Все фаст функции зарегестрированы и все возвращают FALSE. Функция получения имени скопирована из ФайлСпая (ИФС Кит сампл). Но есть небольшое но.... после запуска и во время работы Файл Монитора с сис интерналс мне начинают приходить IRP_MJ_CREATE и всё работает чётко. Насколько я понял ФайлМон эту лазейку(через которую без IRP_MJ_CREATE открываются файлы) прикрывает. Если кто встречался с подобными проблемами или знает где я что не так сделал, пожалуйста подскажите как заставить систему присылать мне IRP_MJ_CREATE.
|
|
|
Записан
|
|
|
|
mad
Гость
|
|
« Ответ #1 : 23-08-2004 08:17 » |
|
Я заметил что не при всех открытиях файлов мне приходит IRP_MJ_CREATE для открываемового/копируемого файла
пример привести можешь этих условий?
|
|
|
Записан
|
|
|
|
Thor
Гость
|
|
« Ответ #2 : 23-08-2004 08:33 » |
|
Закономерностей особых не наблюдается - вобщето для теста должно заблокать .тхт файл - так вот иногда оно его блокает ( аксесс денаед ), иногда открывает. Я ДебагПринтом печатаю - или это .тхт или нет - когда не блокает открытие то приходит один IRP_MJ_CREATE после него квери информатион и клосе - это вроде файл менеджер получает инфо по файлу - а второго IRP_MJ_CREATE , нотепадовского нету. Если включить файлмон то блокает все файлы .тхт и приходит два IRP_MJ_CREATE с нормальным именем. Была версия что не ловлю нормально имя - но функция вроде Микрософтом написана и никакого ерора не возвращает. Была версия что что это нотепад с мемори маппед файлами чё то химичит - но копирование тоже блокется через раз. Квери опен заблокирован как и все фаст ио.
Да что ещё интересно - ФайлСпай (мною не погрызеный ) эти IRP_MJ_CREATE тоже не ловит - или их просто нету :? .
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #3 : 26-08-2004 08:05 » |
|
На будущее- пиши названия на языке оригинала, а то если тут начнут все по русски писать, смешно будет. заметил что не при всех открытиях файлов мне приходит IRP_MJ_CREATE для открываемового/копируемого файла
Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT. Функция получения имени скопирована из ФайлСпая (ИФС Кит сампл).
Чего за функция, имя бы написал.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #4 : 26-08-2004 08:21 » |
|
Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет.
А во всех операционных системах ?
|
|
|
Записан
|
while (8==8)
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #5 : 26-08-2004 09:05 » |
|
А во всех операционных системах ?
Да! :new_shot:
|
|
|
Записан
|
|
|
|
Anonymous
Гость
|
|
« Ответ #6 : 26-08-2004 09:12 » |
|
IoCreateStreamFileObject - хотелось бы уточнить насчёт этой функции, с её помощью можна получить доступ к файлу и она не отсылает IRP_MJ_CREATE - но в параметрах есть FILE_OBJECT - может быть 0 - при его получении прийдёт IRP_MJ_CREATE , и DEVICE_OBJECT - если FILE_OBJECT == 0 то , DEVICE_OBJECT должен != 0. Интересно или DEVICE_OBJECT может получить юзер процес и может ли юзер процесс использовать IoCreateStreamFileObject . Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT.
Чёрт его знает - сел переписал общение с юзер процесом на масив событий - начало блокать все .тхт файлы (вроде бы). :? Чего за функция, имя бы написал.
Функция SpyGetFullPathName.
|
|
|
Записан
|
|
|
|
Thor
Гость
|
|
« Ответ #7 : 26-08-2004 09:16 » |
|
Верхний пост мой.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #8 : 26-08-2004 12:56 » |
|
Thor, пиши более понятно. IoCreateStreamFileObject - хотелось бы уточнить насчёт этой функции, с её помощью можна получить доступ к файлу
С ее помощью нельзя получить доступ к файлу, чтоб получить доступ нужно иметь FILE_OBJECT. Интересно или DEVICE_OBJECT может получить юзер процес и может ли юзер процесс использовать IoCreateStreamFileObject .
Чего спросил понял? Как ты из юзер мода ее вызовешь? DeviceObject в нее передают для получения FILE_OBJECT чтоб юзать часть диска как файл, обычно чтоб закешировать. ЕЩЕ РАЗ! Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT. :new_shot: :new_shot: :new_shot: - Если кто не понял.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #9 : 27-08-2004 05:31 » |
|
"ЕЩЕ РАЗ! Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT. " нет это не так - http://www.osronline.com/article.cfm?id=102(нужна регистрация, но она формальная) "A file system has several mechanisms for creating file objects that it may use for its own internal processing. These include IoCreateStreamFileObject, IoCreateStreamFileObjectLite, and IoCreateStreamFileObjectEx. " "“Thus filter drivers should expect to receive IRP_MJ_CLOSE requests for previously unseen file objects.” Of course, the fact that a file system filter driver receives an IRP_MJ_CLOSE operation for file objects which were never indicated to the filter driver does complicate reference counting." правда IoCreateStreamFileObject создает новый FileObject на основе ранее созданного и прошедшего через irp_mj_create. но для файловых фильтров всегда нужно быть готовым к появлению FileObject, для которых не был вызван irp_mj_create. point.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #10 : 27-08-2004 05:40 » |
|
в догонку:
если внимательно посмотреть на доку к IoCreateStreamFileObject, то в конце можно увидеть следующее:
"File system filter driver writers should note that IoCreateStreamFileObject causes an IRP_MJ_CLEANUP request to be sent to the file system driver stack for the volume. Because file systems often create stream file objects as a side effect of operations other than IRP_MJ_CREATE, it is difficult for filter drivers to reliably detect stream file object creation. Thus a filter driver should expect to receive IRP_MJ_CLEANUP and IRP_MJ_CLOSE requests for previously unseen file objects. "
плюс ко всему входной FileObject у этой ф-ии опциональный, на сколько я понимаю при его отсутствии происходит создание FileObject для доступа к тому на основе переданного DeviceObject.
point.
|
|
|
Записан
|
|
|
|
Thor
Гость
|
|
« Ответ #11 : 27-08-2004 06:31 » |
|
Чего спросил понял? Как ты из юзер мода ее вызовешь? DeviceObject в нее передают для получения FILE_OBJECT чтоб юзать часть диска как файл, обычно чтоб закешировать.
ЕЩЕ РАЗ! Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT. - Если кто не понял.
Я то понял чего спросил , меня интересовало или юзер процес с помощью IoCreateStreamFileObject может получить доступ к файлу. Как ты из юзер мода ее вызовешь?
откуда я знаю как я её вызову? Но это похоже на ответ, спасибо.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #12 : 27-08-2004 08:02 » |
|
point, Эта ф-ция сделана только для УДОБСТВА чтоб не документировать закрытую ф-цию ObCreateObject, а так можно ее использовать. нет это не так -
Так, именно так. А тебе наверно следовало более внимательно прочитать статью. Во первых FILE_OBJECT надо проинициализировать, это только в IRP_MJ_CREATE и ТОЛЬКО в нем. Если файловая система ХОЧЕТ создать FILE_OBJECT для своих целей- она это может сделать кучей способов, но это FILE_OBJECT для внутреннего использования. Также она может создавать какие угодно объекты для внутреннего использования, но внешний интерфейс- олько через IRP_MJ_CREATE. плюс ко всему входной FileObject у этой ф-ии опциональный, на сколько я понимаю при его отсутствии происходит создание FileObject для доступа к тому на основе переданного DeviceObject.
Вот доку прочти внимательно про опциональность - два варианта 1) Если передал не NULL FILE_OBJECT - то созданный FILE_OBJECT используется для доступа к каким то специфичным свойствам файла. При этом на второй аргумент система забивает. 2) Если NULL передали то создается FILE_OBJECT для доступа к диску, наужно это для использования менеджера кэша для кеширования всего или части диска, как файла. ПРИ ЭТОМ- ФАЙЛОВАЯ СИСТЕМА САМА ИНИЦИАЛИЗИРУЕТ ЭТОТ FILE_OBJECT ТАКЖЕ КАК И В IRP_MJ_CRETATE. То есть использовать эту ф-цию для создания валидного объекта из внешнего по потношению к файловой системе модуля ты НЕ МОЖЕШЬ. Вот такие вот пироги.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #13 : 27-08-2004 08:12 » |
|
Thor, Я то понял чего спросил , меня интересовало или юзер процес с помощью IoCreateStreamFileObject может получить доступ к файлу.
НЕТ не может этот FileObject не будет до конца проинициализирован, все упадет в BSOD. Причем вызвать из юзер мода эту ф-цию нельзя - только посредством другого драйвера. Почему будет невалидным FileObject - читай в ответе к point.
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #14 : 27-08-2004 08:13 » |
|
2slavai
меня не надо учить. вопрос был окуда беруться FileObject-ы не прошедшие через IRP_MJ_CREATE - я дал ссылку где это объясняется.. Ваша фраза "ЕЩЕ РАЗ! Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT. " просто не верна в данном контексте.. человек разрабатывает фильтр файловой системы так что назвать этот продукт "внешним по отношению к fs" достаточно сложно...
point.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #15 : 27-08-2004 08:16 » |
|
меня не надо учить.
ну хорошо вопрос был окуда беруться FileObject-ы не прошедшие через IRP_MJ_CREATE - я дал ссылку где это объясняется
только почему то выглядело это так как утверждение о возможности создания валидного объекта в обход IRP_MJ_CREATE. Так сразу бы дал ссылку на ObCreateObject, только толку никакого, не сделаешь ей ничего в обход IRP_MJ_CREATE (особенно твой второй пост).
|
|
|
Записан
|
|
|
|
point
Гость
|
|
« Ответ #16 : 27-08-2004 08:30 » |
|
"сразу бы дал ссылку на ObCreateObject, только толку никакого, не сделаешь ей ничего в обход IRP_MJ_CREATE ."
риторический вопрос: зачем ему ссылка на эту вещь?
мысли вслух: FS фильтры область сложна и запутаная. она усложнена как девелоперами от MS так и сторонними разработчиками фильтров. тот кто занимается разработкой в этой области должен держать в голове кучу инфы, которая толком нигде не описана и либо нарабатывается собственным опытом либо берется из чужих сырцов (в лучшем случае). поэтому перегружать себя инфой о таких подробностях реализации ОСи смысла особого нет... первоначальный вопрос этой ветки никаким образом к ObCreateObject не относился может общие знания об этой ф-ии и будут полезны но не в данном случае... просто при отслеживании объектов открываемых на файловой системе нужно быть готовым к тому что в запросах будут приходить FileObject-ы не прошедшие IRP_MJ_CREATE и поэтому нельзя использовать FileObject в качестве ключа для поиска. обычно рекомендуют юзать FsContext. люди из OSR описали в своей статье как можно решить эту проблему.
point.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #17 : 27-08-2004 08:44 » |
|
запросах будут приходить FileObject-ы не прошедшие IRP_MJ_CREATE и поэтому нельзя использовать FileObject в качестве ключа для поиска
Я вобще не понимаю людей которые не предусматривают возможность того, что в их базе данных FILE_OBJECT ов не окажется пришедшего, такие ситуации надо корректно обрабатывать. У меня это всегда предусмотрено.
|
|
|
Записан
|
|
|
|
Thor
Гость
|
|
« Ответ #18 : 27-08-2004 18:39 » |
|
Понятно спасибо, и ещё такой вопросик можно при обработке IRP_MJ_CREATE его передать нижнему драйверу потом отменить (IoCancelFileOpen) и потом ещё раз передать вниз?
|
|
|
Записан
|
|
|
|
Thor
Гость
|
|
« Ответ #19 : 30-08-2004 06:54 » |
|
Мне просто надо передать вниз чтоб узнать или это не директория, потом отменить открытия файла чтоб юзер процесс мог его открыть ну и потом уже или пустить вниз или отменить открытие. Так можна делать?: - Скопировать Irp в локальную пременную - Передать вниз - Отменить открытие файла - Скопировать из локальной переменной назад в Irp - Передать вниз или отменить. Или просто перед открытием поставить в IrpSp->Parameters.Create.ShareAccess флажок FILE_SHARE_READ и не парится?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #20 : 02-09-2004 07:13 » |
|
Понятно спасибо, и ещё такой вопросик можно при обработке IRP_MJ_CREATE его передать нижнему драйверу потом отменить (IoCancelFileOpen) и потом ещё раз передать вниз?
Можно.
|
|
|
Записан
|
|
|
|
|