Фильтры
От: Аноним  
Дата: 21.05.04 12:15
Оценка:
Задача состоит в следующем. Имеется драйвер на подобии filemon,
который фильтрует IRP, поступающие на гибкие диски и CDROM/CD-R/CD-RW.
Очень интересуют такие вопросы:
а) как отследить появление в дисководе FDD дискеты;
б) как отследить появление в дисководе CDROM cd-диска;
в) где на fast io узнать серийный номер тома.

Нужно вот зачем. Узнав, что вставлен флоппи-диск/cd-диск,
даю команду драйверу. Драйвер прикрепляет себя к стеку
устройств и проверяет серийный номер. Если номер совпал с заданным
(переданным из пользовательской программы через DeviceIoControl), то
пропускаем IRP, если нет, отменяем их на фиг.
Re: Фильтры
От: Maxim S. Shatskih Россия  
Дата: 21.05.04 17:39
Оценка: 42 (9)
А>Задача состоит в следующем. Имеется драйвер на подобии filemon,

Забудьте о filemon Руссиновича. Он неправильно написан. Он лезет на ходу к структурам данных, при невозможности захватить лок, связанный с ними. Это из серии "решение на соплях".

Правильный шаблон FS filter — SFILTER из MS IFS Kit. В последнем ките было что-то поновее, но, если нужна поддержка хотя бы w2k, не говоря об NT4 — то можно смело забыть про все новомодные заморочки.

А>а) как отследить появление в дисководе FDD дискеты;

А>б) как отследить появление в дисководе CDROM cd-диска;

Ха! Ну давайте расскажу все, что там происходит.

В случае флопика — если юзер тронул кнопочку eject, то дисковод взводит некий провод, и этот факт потом виден драйверу в одном из статусных регистров контроллера. Старые дисководы и контроллеры не умели, и в этом случае драйвер делал все по таймеру — "если со времени выполнения последней операции прошла секунда, то подозревать media change".

В случае сидюка все чуть иначе. Драйвер CdRom.sys постоянно пингует сидюк командой TEST UNIT READY. Команда описана в стандарте SCSI на www.t10.org, и работает примерно так — если в сидюке есть диск и его не меняли со времен последней команды, то она ничего не делает и завершается успешно. Если диск есть, но его меняли со времен последней команды — то TUR обламывается с ошибкой unit attention (это такое понятие в SCSI есть). Если диска нет — TUR обламывается с еще каким-то кодом ошибки. Если открыта дверца или высунут язык — то и еще с другим кодом ошибки .

Что такое unit attention. Если в SCSI приводе меняли дискету или ленту — он входит в состояние unit attention. В этом состоянии он обламывают любую — абсолютно любую — входящую команду с кодом ошибки unit attention. В момент этого облома состояние unit attention снимается, и на последующие команды уже не распространяется. Их выполнение будет или успешным, или с какой-то еще ошибкой, но не unit attention.

А дальше completion внутри CdRom.sys отслеживает ошибки уровня SCSI, и, в случае unit attention — считает, что в сидюке сменили диск.

Сидюки, понятное дело, у нас обычно ATAPIшные, но ATAPI — это SCSI по IDEшным проводам, и все вышесказанное верно и там.

А дальше — между диском и файловой системой — идет механизм, основанный на STATUS_VERIFY_REQUIRED и DO_VERIFY_VOLUME, см. книгу Раджива Нагара или исходники из IFS Kit.

Кстати, а USBшные флешки Вам неинтересны? С ними свои заморочки

А>в) где на fast io узнать серийный номер тома.


А почему на FastIo?

А>Нужно вот зачем. Узнав, что вставлен флоппи-диск/cd-диск,

А>даю команду драйверу. Драйвер прикрепляет себя к стеку

Неправильно! Поздно!

Прикрепиться к стеку можно только по ходу его построения, а не когда-то в будущем. Правильный способ — вписать себя в реестр как UpperFilters для классов Floppy и CdRom, и потом вести себя как обычный PnP/WDM фильтр.

Если речь о флешках — то там все суровей немножко, они как бы почти неотличимы от винчестера, и фильтр придется ставить на класс Disk. Писать придется его очень аккуратно, поскольку он и для бутового диска будет пытаться загрузиться.

Теперь ответ на вопрос: влезть в механизм STATUS_VERIFY_REQUIRED/DO_VERIFY_VOLUME между диском и файловой системой. Только будучи в этом механизме, можно четко отследить новую дискету или новый сидюк. Фильтр файловой системы, кстати, необязателен — проще прямо с диска IRPом прочитать кусочек метаданных, где сидит volume serial number.
Занимайтесь LoveCraftом, а не WarCraftом!
Re: Фильтры
От: Аноним  
Дата: 22.05.04 11:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Задача состоит в следующем. Имеется драйвер на подобии filemon,

А>который фильтрует IRP, поступающие на гибкие диски и CDROM/CD-R/CD-RW.
А>Очень интересуют такие вопросы:
А>а) как отследить появление в дисководе FDD дискеты;
А>б) как отследить появление в дисководе CDROM cd-диска;
А>в) где на fast io узнать серийный номер тома.

А>Нужно вот зачем. Узнав, что вставлен флоппи-диск/cd-диск,

А>даю команду драйверу. Драйвер прикрепляет себя к стеку
А>устройств и проверяет серийный номер. Если номер совпал с заданным
А>(переданным из пользовательской программы через DeviceIoControl), то
А>пропускаем IRP, если нет, отменяем их на фиг.

Можно конечно проверить готовность дисковода, обращаясь к нему по таймеру
каждые n секунд, однако это непрактично и неудобно. Если прямой ответ дать
трудно, то могу ли я рассчитывать хотя бы ссылку.
Re[2]: Фильтры
От: Orifiel  
Дата: 04.06.04 12:21
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

А>>Задача состоит в следующем. Имеется драйвер на подобии filemon,


MSS>Забудьте о filemon Руссиновича. Он неправильно написан. Он лезет на ходу к структурам данных, при невозможности захватить лок, связанный с ними. Это из серии "решение на соплях".


MSS>Правильный шаблон FS filter — SFILTER из MS IFS Kit. В последнем ките было что-то поновее, но, если нужна поддержка хотя бы w2k, не говоря об NT4 — то можно смело забыть про все новомодные заморочки.


А>>а) как отследить появление в дисководе FDD дискеты;

А>>б) как отследить появление в дисководе CDROM cd-диска;

MSS>Ха! Ну давайте расскажу все, что там происходит.


MSS>В случае флопика — если юзер тронул кнопочку eject, то дисковод взводит некий провод, и этот факт потом виден драйверу в одном из статусных регистров контроллера. Старые дисководы и контроллеры не умели, и в этом случае драйвер делал все по таймеру — "если со времени выполнения последней операции прошла секунда, то подозревать media change".


MSS>В случае сидюка все чуть иначе. Драйвер CdRom.sys постоянно пингует сидюк командой TEST UNIT READY. Команда описана в стандарте SCSI на www.t10.org, и работает примерно так — если в сидюке есть диск и его не меняли со времен последней команды, то она ничего не делает и завершается успешно. Если диск есть, но его меняли со времен последней команды — то TUR обламывается с ошибкой unit attention (это такое понятие в SCSI есть). Если диска нет — TUR обламывается с еще каким-то кодом ошибки. Если открыта дверца или высунут язык — то и еще с другим кодом ошибки .


MSS>Что такое unit attention. Если в SCSI приводе меняли дискету или ленту — он входит в состояние unit attention. В этом состоянии он обламывают любую — абсолютно любую — входящую команду с кодом ошибки unit attention. В момент этого облома состояние unit attention снимается, и на последующие команды уже не распространяется. Их выполнение будет или успешным, или с какой-то еще ошибкой, но не unit attention.


MSS>А дальше completion внутри CdRom.sys отслеживает ошибки уровня SCSI, и, в случае unit attention — считает, что в сидюке сменили диск.


MSS>Сидюки, понятное дело, у нас обычно ATAPIшные, но ATAPI — это SCSI по IDEшным проводам, и все вышесказанное верно и там.


MSS>А дальше — между диском и файловой системой — идет механизм, основанный на STATUS_VERIFY_REQUIRED и DO_VERIFY_VOLUME, см. книгу Раджива Нагара или исходники из IFS Kit.


MSS>Кстати, а USBшные флешки Вам неинтересны? С ними свои заморочки


А>>в) где на fast io узнать серийный номер тома.


MSS>А почему на FastIo?


А>>Нужно вот зачем. Узнав, что вставлен флоппи-диск/cd-диск,

А>>даю команду драйверу. Драйвер прикрепляет себя к стеку

MSS>Неправильно! Поздно!


MSS>Прикрепиться к стеку можно только по ходу его построения, а не когда-то в будущем. Правильный способ — вписать себя в реестр как UpperFilters для классов Floppy и CdRom, и потом вести себя как обычный PnP/WDM фильтр.


MSS>Если речь о флешках — то там все суровей немножко, они как бы почти неотличимы от винчестера, и фильтр придется ставить на класс Disk. Писать придется его очень аккуратно, поскольку он и для бутового диска будет пытаться загрузиться.


MSS>Теперь ответ на вопрос: влезть в механизм STATUS_VERIFY_REQUIRED/DO_VERIFY_VOLUME между диском и файловой системой. Только будучи в этом механизме, можно четко отследить новую дискету или новый сидюк. Фильтр файловой системы, кстати, необязателен — проще прямо с диска IRPом прочитать кусочек метаданных, где сидит volume serial number.



Огромное спасибо за инфу. Вы мне здорово помогли.
Вот только интересно, где можно узнать об этом поподробнее.
А кусочек метаданных где расположен, случайно не на нулевой дорожке?
Re: Фильтры
От: Fagot  
Дата: 04.06.04 13:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а) как отследить появление в дисководе FDD дискеты;


Скажите Вас интересует ИМЕННО, отслеживание появления, или Вы будите проверять номер после попытки первого обращения?
Re[2]: Фильтры
От: Lonely Dog Россия  
Дата: 04.06.04 15:37
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

А>>Задача состоит в следующем. Имеется драйвер на подобии filemon,


MSS>Забудьте о filemon Руссиновича. Он неправильно написан. Он лезет на ходу к структурам данных, при невозможности захватить лок, связанный с ними. Это из серии "решение на соплях".


MSS>Правильный шаблон FS filter — SFILTER из MS IFS Kit. В последнем ките было что-то поновее, но, если нужна поддержка хотя бы w2k, не говоря об NT4 — то можно смело забыть про все новомодные заморочки.

Уже за эти два абзаца вам нужно 2^32 баллов дать. Я серьезно. Надеюсь, после их прочтения эти примеры выйдут из моды.
Re[3]: Фильтры
От: Maxim S. Shatskih Россия  
Дата: 05.06.04 08:15
Оценка:
LD>Уже за эти два абзаца вам нужно 2^32 баллов дать. Я серьезно. Надеюсь, после их
>прочтения эти примеры выйдут из моды.

Редмондцы уже устали повторять на англоязычных форумах — "не берите FILEMON Руссиновича как шаблон", "фильтры файловых систем принципиально не отгружаемы, если не использовать новомодный filter manager" и так далее.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[4]: Фильтры
От: Злость Россия  
Дата: 07.06.04 07:22
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

LD>>Уже за эти два абзаца вам нужно 2^32 баллов дать. Я серьезно. Надеюсь, после их

>>прочтения эти примеры выйдут из моды.

MSS>Редмондцы уже устали повторять на англоязычных форумах — "не берите FILEMON Руссиновича как шаблон", "фильтры файловых систем принципиально не отгружаемы, если не использовать новомодный filter manager" и так далее.



Имхо ... они это смогут исправить, если перестанут требовать за свой IFS kit денег и зделают документацию по файловым системам более доступной.

Я думаю это скоро случится... хотя .... все могут ошибаться
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[2]: Фильтры
От: Orifiel  
Дата: 07.06.04 11:10
Оценка:
Здравствуйте, Fagot, Вы писали:

F>Здравствуйте, Аноним, Вы писали:


А>>а) как отследить появление в дисководе FDD дискеты;


F>Скажите Вас интересует ИМЕННО, отслеживание появления, или Вы будите проверять номер после попытки первого обращения?


После попытки первого обращения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.