Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: IRP_MJ_CREATE в фильтр файловой системы  (Прочитано 22477 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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
Главный специалист

ru
Offline Offline

« Ответ #3 : 26-08-2004 08:05 » 

На будущее- пиши названия на языке оригинала, а то если тут начнут все по русски писать, смешно будет.

Цитата

 заметил что не при всех открытиях файлов мне приходит IRP_MJ_CREATE для открываемового/копируемого файла


Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT.

Цитата

Функция получения имени скопирована из ФайлСпая (ИФС Кит сампл).


Чего за функция, имя бы написал.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #4 : 26-08-2004 08:21 » 

Цитата: SlavaI
Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет.


А во всех операционных системах ?
Записан

while (8==8)
SlavaI
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline Offline

« Ответ #20 : 02-09-2004 07:13 » new

Цитата

Понятно спасибо, и ещё такой вопросик можно при обработке IRP_MJ_CREATE его передать нижнему драйверу потом отменить (IoCancelFileOpen) и потом ещё раз передать вниз?


Можно.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines