Задача состоит в следующем. Имеется драйвер на подобии filemon,
который фильтрует IRP, поступающие на гибкие диски и CDROM/CD-R/CD-RW.
Очень интересуют такие вопросы:
а) как отследить появление в дисководе FDD дискеты;
б) как отследить появление в дисководе CDROM cd-диска;
в) где на fast io узнать серийный номер тома.
Нужно вот зачем. Узнав, что вставлен флоппи-диск/cd-диск,
даю команду драйверу. Драйвер прикрепляет себя к стеку
устройств и проверяет серийный номер. Если номер совпал с заданным
(переданным из пользовательской программы через DeviceIoControl), то
пропускаем IRP, если нет, отменяем их на фиг.
А>Задача состоит в следующем. Имеется драйвер на подобии 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 секунд, однако это непрактично и неудобно. Если прямой ответ дать
трудно, то могу ли я рассчитывать хотя бы ссылку.
Здравствуйте, 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.
Огромное спасибо за инфу. Вы мне здорово помогли.
Вот только интересно, где можно узнать об этом поподробнее.
А кусочек метаданных где расположен, случайно не на нулевой дорожке?
Здравствуйте, Maxim S. Shatskih, Вы писали:
А>>Задача состоит в следующем. Имеется драйвер на подобии filemon,
MSS>Забудьте о filemon Руссиновича. Он неправильно написан. Он лезет на ходу к структурам данных, при невозможности захватить лок, связанный с ними. Это из серии "решение на соплях".
MSS>Правильный шаблон FS filter — SFILTER из MS IFS Kit. В последнем ките было что-то поновее, но, если нужна поддержка хотя бы w2k, не говоря об NT4 — то можно смело забыть про все новомодные заморочки.
Уже за эти два абзаца вам нужно 2^32 баллов дать. Я серьезно. Надеюсь, после их прочтения эти примеры выйдут из моды.
LD>Уже за эти два абзаца вам нужно 2^32 баллов дать. Я серьезно. Надеюсь, после их >прочтения эти примеры выйдут из моды.
Редмондцы уже устали повторять на англоязычных форумах — "не берите FILEMON Руссиновича как шаблон", "фильтры файловых систем принципиально не отгружаемы, если не использовать новомодный filter manager" и так далее.
Здравствуйте, Maxim S. Shatskih, Вы писали:
LD>>Уже за эти два абзаца вам нужно 2^32 баллов дать. Я серьезно. Надеюсь, после их >>прочтения эти примеры выйдут из моды.
MSS>Редмондцы уже устали повторять на англоязычных форумах — "не берите FILEMON Руссиновича как шаблон", "фильтры файловых систем принципиально не отгружаемы, если не использовать новомодный filter manager" и так далее.
Имхо ... они это смогут исправить, если перестанут требовать за свой IFS kit денег и зделают документацию по файловым системам более доступной.
Я думаю это скоро случится... хотя .... все могут ошибаться
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, Fagot, Вы писали:
F>Здравствуйте, Аноним, Вы писали:
А>>а) как отследить появление в дисководе FDD дискеты;
F>Скажите Вас интересует ИМЕННО, отслеживание появления, или Вы будите проверять номер после попытки первого обращения?