драйвер фильтр к Floppy и CD-ROM/DVD-ROM
От: Гость Украина  
Дата: 10.06.08 09:49
Оценка:
Здравствуйте уважаемые коллеги!
Возник вопрос в отношении написания драйвера фильтра к файловой системе FAT и CDFS расположенной на Floppy и CD-ROM устройстве. Драйвер взят из примера IFS Kit (sfilter.с) и переработан для собственных нужд. Я пречитал всё, что возможно в этом форуме, но нашёл только разговор о даной проблемме но не её решение. Вопрос в следующем на Windows 2000 не срабатывает вызов IoRegisterFsRegistrationChange и не даёт возможности определить, когда произошло монтирование диска. Если делаю драйвер загружаемым в момент запуска системы boot mode ситуация аналогичная — реакции на вставку вынимание диска не наблюдается, плюс отсутствует и реакция на флеш накопитель. Есть возможность сделать опрос через таймаут всех устройств но это не совсем красиво, а что касается Floppy дисковода, то он при этом ещё мигает и скрипит впечатление буд то вирус какой на комп попал. Нужен какой — нибудь дельный совет, как получить это событие в режиме ядря для перехвата монтирования и размонтирования томов, важное требование возможно ли это сделать без перезагрузки системы?
Re: драйвер фильтр к Floppy и CD-ROM/DVD-ROM
От: Sergey Storozhevykh Россия  
Дата: 10.06.08 10:53
Оценка:
Здравствуйте, Гость, Вы писали:

Г>Вопрос в следующем на Windows 2000 не срабатывает вызов IoRegisterFsRegistrationChange и не даёт возможности определить, когда произошло монтирование диска.


С помощью IoRegisterFsRegistrationChange вы регистрируете свой фильтр для получения нотификаций о появлении файловой системы (когда файловая система вызывает IoRegisterFileSystem/IoUnregisterFileSystem). При получении такой нотификации фильтр должен прицепиться к CDO файловой системы (на примере sfilter см. SfAttachToFileSystemDevice). Момент монтирования тома можно определить, фильтруя запросы IRP_MN_MOUNT_VOLUME к CDO файловой системы. Это все есть в sfilter.
Re[2]: драйвер фильтр к Floppy и CD-ROM/DVD-ROM
От: c0deC Украина  
Дата: 10.06.08 12:28
Оценка:
Здравствуйте, Sergey Storozhevykh, Вы писали:

SS>Здравствуйте, Гость, Вы писали:


Г>>Вопрос в следующем на Windows 2000 не срабатывает вызов IoRegisterFsRegistrationChange и не даёт возможности определить, когда произошло монтирование диска.


SS>С помощью IoRegisterFsRegistrationChange вы регистрируете свой фильтр для получения нотификаций о появлении файловой системы (когда файловая система вызывает IoRegisterFileSystem/IoUnregisterFileSystem). При получении такой нотификации фильтр должен прицепиться к CDO файловой системы (на примере sfilter см. SfAttachToFileSystemDevice). Момент монтирования тома можно определить, фильтруя запросы IRP_MN_MOUNT_VOLUME к CDO файловой системы. Это все есть в sfilter.


Спасибо за ответ я попытаюсь уточнить свой вопрос. Функция IoRegisterFsRegistrationChange среди своих параметров имеет функцию нотификации SfNotification, в которой и происходит вызов SfAttachToFileSystemDevice. Я поставил DbgPrint в функцию SfNotification для отслеживания хоть какой-нибудь её активности ещё до вызова SfAttachToFileSystemDevice. После того как всё запущенно и я начинаю вставлять вынимать диски подключать и отключать флешь никакие мои действия не приводят к срабатыванию SfNotification в Windows 2000 даже при запуске драйвера из под boot mode. Как это побороть?
Re[3]: драйвер фильтр к Floppy и CD-ROM/DVD-ROM
От: Sergey Storozhevykh Россия  
Дата: 10.06.08 12:38
Оценка: +1
Здравствуйте, c0deC, Вы писали:

C>Спасибо за ответ я попытаюсь уточнить свой вопрос. Функция IoRegisterFsRegistrationChange среди своих параметров имеет функцию нотификации SfNotification, в которой и происходит вызов SfAttachToFileSystemDevice. Я поставил DbgPrint в функцию SfNotification для отслеживания хоть какой-нибудь её активности ещё до вызова SfAttachToFileSystemDevice. После того как всё запущенно и я начинаю вставлять вынимать диски подключать и отключать флешь никакие мои действия не приводят к срабатыванию SfNotification в Windows 2000 даже при запуске драйвера из под boot mode. Как это побороть?


SfNotification вызывается при регистрации файловой системы Это происходит один раз (обычно). Монтирование/демонтирование устройств отслеживаются путем перехвата IRP_MN_MOUNT на CDO файловой системы, к которому мы и цепляемся в SfNotification.
FastFat does not call IoRegisterFileSystem, when the boot pa
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 10.06.08 14:47
Оценка: 3 (1)
Здравствуйте, c0deC, Вы писали:

Г>>>Вопрос в следующем на Windows 2000 не срабатывает вызов IoRegisterFsRegistrationChange и не даёт возможности определить, когда произошло монтирование диска.


SS>>С помощью IoRegisterFsRegistrationChange вы регистрируете свой фильтр для получения нотификаций о появлении файловой системы (когда файловая система вызывает IoRegisterFileSystem/IoUnregisterFileSystem). При получении такой нотификации фильтр должен прицепиться к CDO файловой системы (на примере sfilter см. SfAttachToFileSystemDevice). Момент монтирования тома можно определить, фильтруя запросы IRP_MN_MOUNT_VOLUME к CDO файловой системы. Это все есть в sfilter.


C>Спасибо за ответ я попытаюсь уточнить свой вопрос. Функция IoRegisterFsRegistrationChange среди своих параметров имеет функцию нотификации SfNotification, в которой и происходит вызов SfAttachToFileSystemDevice. Я поставил DbgPrint в функцию SfNotification для отслеживания хоть какой-нибудь её активности ещё до вызова SfAttachToFileSystemDevice. После того как всё запущенно и я начинаю вставлять вынимать диски подключать и отключать флешь никакие мои действия не приводят к срабатыванию SfNotification в Windows 2000 даже при запуске драйвера из под boot mode. Как это побороть?

это известное поведение и отличительная особенность legacy OS aka 2000.

Там SfNotification callback не всегда дергается для уже распознанных FS, конкретно этим славится FastFat, т.к. FastFat does not call IoRegisterFileSystem, when the boot partition is FAT formatted.

Т.е. понятно что происходит: если получилось так, что Ваш фильтр запросил нотификацию после того как отслеживаемое событие уже произошло и например на системный диск примонтировался FAT (что логично, раз он boot) — можете не ждать никаких новых событий при появлении новых томов с тем же типом FS — а зачастую flash drives имеют именно FAT на себе, равно как и флоппи.

Начиная с XP MSFT под давлением негодующей общественности решил изменить поведение и каждый вновь загружаемый фильтр при постановке ф-ии обратного вызова на такие события — получает их для всех FS в системе, в т.ч. получит и для FAT из примера выше. Поэтому у Вас скорее всего и наблюдается описанная картина применительно к 2000 — проверьте?

Аналогично, кстати, на XP зато (в обратку к 2000й) решили игнорировать в указанном API события от RAW file system. С 2003 SP1 тоже есть нюансы, IIRC.


Как же быть?


Да просто. При старте своего хозяйства на 2000й нужно не только поставить SfNotification и ждать поклевки, но и перечислить хотя бы OS-supplied FS по имени (их не так много ). Затем прицепиться (если еще не) к полученным device object(s). Прицеп по имени делается на раз через IoGetDeviceObjectPointer с именем как ни странно "L"\\Fat" для FAT bp примера выше. Тут winobj\DeviceTree etc всегда подскажут как зовут. Ну а далее как посоветовали выше по ветке IRP_MN_MOUNT_VOLUME и т.д.

PS аналогичная проблема касается и сетевых редиректоров на 2000й. Решение пойдет в кач-ве домашнего задания.
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re: FastFat does not call IoRegisterFileSystem, when the boo
От: c0deC Украина  
Дата: 10.06.08 20:17
Оценка:
Здравствуйте, Valery A. Boronin, Вы писали:

Правила форума нарушены.
— оверквотинг
Правила можно найти в разделе FAQ данного форума и\или ресурса.
Нарушение правил может повлечь за собой санкции, описанные там же — модератор

VAB>Как же быть?


VAB>Да просто. При старте своего хозяйства на 2000й нужно не только поставить SfNotification и ждать поклевки, но и перечислить хотя бы OS-supplied FS по имени (их не так много ). Затем прицепиться (если еще не) к полученным device object(s). Прицеп по имени делается на раз через IoGetDeviceObjectPointer с именем как ни странно "L"\\Fat" для FAT bp примера выше. Тут winobj\DeviceTree etc всегда подскажут как зовут. Ну а далее как посоветовали выше по ветке IRP_MN_MOUNT_VOLUME и т.д.


VAB>PS аналогичная проблема касается и сетевых редиректоров на 2000й. Решение пойдет в кач-ве домашнего задания.


То есть Вы предлагаете подцепиться к уже существующим системам типа "L"\\Fat" на Floppy с вставленной дискетой и флеш накопителем, на "L"\\Cdfs" с вставленным CD-ROM ? А если дискеты нет и CD-ROM диска нет в устройстве то к чему мы подцепимся? На сколько я пробывал все эти варианты то получается следующее:
1) если дисковод Floppy диска пуст то подцепиться можно к RAW файловой системе;
2) аналогично если привод CD-ROM/DVD-ROM пуст то там можно увидеть только RAW систему;

И что дальше на RAW system ждать IRP_MN_MOUNT_VOLUME? Похоже это не пройдёт. Покрайней мере у меня пока не сработало. Если подцепиться на устройство с вставленным и смонтированным диском то более-менее технология понятно хотя всё равно возникают некоторые вопросы. Но сей час главный вопрос где ждать IRP_MN_MOUNT_VOLUME? К чему нужно пприаттачиться что бы его получить? При присоединении к RAW системе я его не получаю.

Спасибо за все ответы, если что то невнятно описал то напишите что, я распишу вопрос подробнее.
Re[4]: драйвер фильтр к Floppy и CD-ROM/DVD-ROM
От: c0deC Украина  
Дата: 11.06.08 15:10
Оценка:
Здравствуйте, Sergey Storozhevykh, Вы писали:

SS>SfNotification вызывается при регистрации файловой системы Это происходит один раз (обычно). Монтирование/демонтирование устройств отслеживаются путем перехвата IRP_MN_MOUNT на CDO файловой системы, к которому мы и цепляемся в SfNotification.


Данная ситуация понятна если имеем дело с томом на HDD. Как быть в случае Floppy и CD-ROM приводов, в которых ещё нет диска? IRP_MN_MOUNT нужно на где-то ждать. Где можно его ждать, если событие на вложение диска в дисковод не проходит через функцию нотификации SfNotification. Присоединение к RAW файловой системе на пустом приводе тоже не помогает, данный запрос IRP_MN_MOUNT через него не проходит.

Буду рад любым конструктивным советам.
Re[5]: драйвер фильтр к Floppy и CD-ROM/DVD-ROM
От: Sergey Storozhevykh Россия  
Дата: 12.06.08 08:11
Оценка:
Здравствуйте, c0deC, Вы писали:

SS>>SfNotification вызывается при регистрации файловой системы Это происходит один раз (обычно). Монтирование/демонтирование устройств отслеживаются путем перехвата IRP_MN_MOUNT на CDO файловой системы, к которому мы и цепляемся в SfNotification.


C>Данная ситуация понятна если имеем дело с томом на HDD. Как быть в случае Floppy и CD-ROM приводов, в которых ещё нет диска?


Точно так же.

C>IRP_MN_MOUNT нужно на где-то ждать. Где можно его ждать, если событие на вложение диска в дисковод не проходит через функцию нотификации SfNotification.


Что такое CDO файловой системы понятно? Ждать IRP_MN_MOUNT нужно именно на нем. С чего вы взяли, что SfNotification должна вызываться при монтировании тома? Она вызывается при регистрации файловой системы. Порядок действий такой:
1. При получении нотификации о регистрации файловой системы, цепляемся к CDO файловой системы. В Win2000 нотификация может пройти мимо вас, если стартанули поздно либо в силу причин, описанных выше Валерием. Тогда нужно перечислять файловые системы самостоятельно. В любом случае вам нужно сверху сесть на CDO интересующих файловой систем.
2. Ждем IRP_MN_MOUNT на CDO. При любом монтировании тома этой ФС (в том числе и в случае с дискетой и CD) вы увидете IRP_MN_MOUNT.

C>Присоединение к RAW файловой системе на пустом приводе тоже не помогает, данный запрос IRP_MN_MOUNT через него не проходит.


RAW тут не причем.
Re[6]: драйвер фильтр к Floppy и CD-ROM/DVD-ROM
От: c0deC Украина  
Дата: 19.06.08 14:27
Оценка:
Здравствуйте, Sergey Storozhevykh, Вы писали:

SS>Что такое CDO файловой системы понятно? Ждать IRP_MN_MOUNT нужно именно на нем.


Большое спасибо Вам за ответ, я разобрался с IRP_MN_MOUNT и у меня получается следующая ситуация:
1) IRP_MN_MOUNT я получаю после присоединения фильтра к //Cdfs и //Fat;
2) IRP_MN_MOUNT приходит только если вставляется новый диск или один диск заменяется другим, вставляние и выниманте одного и того же диска не генерирует повторно IRP_MN_MOUNT;
3)после прихода IRP_MN_MOUNT на CDO я создаю новый фильтр и аттачусь к монтируемому диску через Vpb;
4) после пункта 3) есть вопрос начиная с этого момента все ли запросы к файловой системе на CD-ROM и Floppy дисках идут уже через мой приаттаченный фильтр или нет;
5) я не получаю нигде IRP_MN_LOAD_FILE_SYSTEM при каких ситуациях я должен попасть в эту ветку, сей час драйвер загружается после загрузки всей системы на Windows 2000 путём запуска через Monitor.
6) обязательно ли вообще обрабатывать этот код SfFsControlLoadFileSystem() в ветке для IRP_MN_LOAD_FILE_SYSTEM для успешной работы драйвера. Сей час он у меня закомментарен и всё в роде работает?
7) как безопасно выгрузить фильтры-устройства созданные для //Cdfs и //Fat в DriverUnload
8) при вынимании дискеты из Floppy или CD-ROM диска из привода нужно ли писать какой то дополнительный код для удаления ранее созданных устройств на сколько я смотрел в Sfilter содержит код :

VOID SfFastIoDetachDevice (IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice )

который дожен вызываться при размонтировании. Соответственно туда нужно положить весь код для очистки памяти и устройств или я ошибаюсь?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.