Доброго времени суток. Передо мной стоит следующая задача: Перехватить и модифицировать пакеты идущие непосредственно! от флэшки, выше лежащему драйверу UStork.sys, поставляемому вместе с устройством. Как я понимаю, необходимо написать драйвер фильтр для USB флэш диска, который будет подключаться между шинным драйвером и драйвером Ustork.sys , а точнее к PDO создаваемом шинным драйвером.(возможно, даже наверняка, в стеке присутствуют и другие драйвера, в том числе и от производителя флэхи) Открываю Солдатова... читаю: "В результате вызовов IoAttachDeviceToDeviceStack или IoAttachDevice будет найден объект устройства, находящийся на вершине стека над указанным целевым объектом (по имени или по указателю). К нему и будет подключен новый объект устройства. Соответственно, разработчик, подключающий свой объект устройства к устройству в "середине" стека и надеющийся, что таким образом через его драйвер будут "протекать" IRP запросы от вышестоящих драйверов к нижестоящим, глубоко заблуждается. На самом деле, для достижения этой цели необходимо не просто выполнить подключение к нужному объекту устройства, но и сделать это в строго определенный момент загрузки — ранее, чем будет выполнена загрузка вышестоящих драйверов, чьи запросы предполагается перехватывать. Однако рассмотрение данной проблемы выходит за рамки данной книги. " Возникает вопрос: Как подключить драйвер в "середину" стека?
Теоретически возможны только три варианта: 1. Сразу над PDO. Официально не поддерживается, но реализуется. 2. Куда-то между PDO и FDO. Ключ реестра LowerFilters. 3. Куда-то над FDO. Ключ реестра UpperFilters. Куда-то означает, что если есть ещё желающие воткнуться туда же, то их порядком практически невозможно управлять. Точнее нет гарантий. В какую именно середину нужно воткнуться?
У меня есть книжка Addison Wesley - USB System Architecture (USB 2.0).pdf Посмотри на сайте изд-ва. Может пригодится.
Four-F Если честно я не знаю куда точно нужно его подключать, точно знаю что надо оказаться ниже UStork.sys. А что под ним я не знаю... Я пытаюсь обойти защиту флэхи (я уже писал об этом в других постах)... Сейчас хочу попробовать подменить ответ флэш диска на запрос драйвера.
Если он управляет FDO, тогда никаких проблем. Если он управляет каким-нибудь lower-level фильтром, тогда проблема, но есть варианты. Если он управляет каким-нибудь upper-level фильтром, тогда тоже никаких проблем.
Four-F А как это можно узнать?=) apple Спасибо за ссылку на книжку... бегло посмотрел оглавление - Есть то - чего не нашел в 5 книгах=)
Много всяких способов. Тебе, наверное, проще devcon'ом (В тулзах к DDK идет). Узнаешь Hardware ID для нужного девайса, например перечислив все девайсы, в id которых есть usb: Код (Text): C:\Protools\devcon>devcon hwids usb* USB\ROOT_HUB\4&18F45С86&1 Name: Hardware ID's: USB\ROOT_HUB&VID1002&PID0056&REV0011 USB\ROOT_HUB&VID1002&PID0056 USB\ROOT_HUB USB\ROOT_HUB\4&2DA8245B&3 Name: Hardware ID's: USB\ROOT_HUB&VID1002&PID0056&REV0011 USB\ROOT_HUB&VID1002&PID0056 USB\ROOT_HUB USB\ROOT_HUB\4&38DFB650&3 Name: Hardware ID's: USB\ROOT_HUB&VID1002&PID0056&REV0011 USB\ROOT_HUB&VID1002&PID0056 USB\ROOT_HUB USB\VID_0816&PID_1100\6DEAE6 Name: D-Link DSL-200 USB ADSL WAN Modem Hardware ID's: USB\Vid_0816&Pid_1100&Rev_0100 USB\Vid_0816&Pid_1100 Compatible ID's: USB\Class_ff&SubClass_ff&Prot_ff USB\Class_ff&SubClass_ff USB\Class_ff 4 matching device(s) found. Дальше берешь Hardware ID нужного тебе девайса (я взял для своего адсл модема) и смотришь стек (кавычки и собака обязательно): Код (Text): C:\Protools\devcon>devcon stack "@USB\VID_0816&PID_1100\6DEAE6" USB\VID_0816&PID_1100\6DEAE6 Name: D-Link DSL-200 USB ADSL WAN Modem Setup Class: {4D36E972-E325-11CE-BFC1-08002BE10318} Net Class upper filters: libusb0 Controlling service: wanusb 1 matching device(s) found. Controlling service - это FDO. Class upper filters - это собственно Class upper filters См. доку по devcon в DDK.
Ага... получаю такую вот штуку: Код (Text): C:\WINDDK\2600\tools\devcon\i386>devcon stack "@USBSTOR\DISK&VEN_USB_MASS&PROD__ STORAGE_DEVICE&REV_0.2B\6&152FD4A3&0&0" USBSTOR\DISK&VEN_USB_MASS&PROD__STORAGE_DEVICE&REV_0.2B\6&152FD4A3&0&0 Name: JetFlashTS512MJF2B Setup Class: {4D36E967-E325-11CE-BFC1-08002BE10318} DiskDrive Class upper filters: PartMgr Controlling service: disk 1 matching device(s) found. Тока, я не понял "who is who"? (не бейте больно) disk - это FD0 - кто его создает? PartMgr - это как я понимаю FiDO , т.е. FDO, созданный вышележащим драйвером-фильтром. Каким? UStrok.sys?
Ты не ту ноду смотришь. Это дечерняя нода твоей флешки. Код (Text): Запоминающее устройство для USB Дисковый накопитель Универсальный том Ты смотришь ноду "Дисковый накопитель", а тебе надо родителя смотреть, т.е. "Запоминающее устройство для USB". У него Hardware ID будет начинаться с USB\, а у юсб-дисков Hardware ID начинается с USBSTOR\.
Чтобы тебе всякие usbstor'ы не мешались, сделай devcon hwids usb\vid* и ищи там девайс у которого Compatible ID's: USB\Class_08&SubClass_06&Prot_XX USB\Class_08&SubClass_06 USB\Class_08 Class_08 - это mass storage.
Понял=) Код (Text): C:\WINDDK\2600\tools\devcon\i386>devcon stack "@USB\VID_0EA0&PID_2168\61100740FF 6F84A9" USB\VID_0EA0&PID_2168\61100740FF6F84A9 Name: U-Storage Controller Setup Class: {36FC9E60-C465-11CF-8056-444553540000} USB Controlling service: USTOR Lower filters: usbsnoop 1 matching device(s) found. С USTORK - вроде ясно, он создает непосредственно FDO подключаемой флэшки.(если я правильно понимаю) usbsnoop - а это походу фильтр, установленный поставляемым с флэшкой ПО?
Да. Да, это фильтр, но ПО флешки тут не при чём. Это SnoopyPro http://sourceforge.net/projects/usbsnoop/ Он прописывает себя в ключ реестра LowerFilters для конкретного девайса в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\. Т.е. это получается по терминологии device lower filter. Т.е. снуппи сидит у тебя под FDO. Тебе тоже самое надо сделать.
А.. точно.. ставил... помню=) тока он не пашет не фига... сносить надо=)... Ага... куда подключаться понял... а вот как?...
Это зависит от того, для чего тебе это нужно. Если для дебага на своей машине, то можно просто руками в реестр прописать.
Four-F Мне нужно сделать драйвер который устанавливается на машину, и автоматически при передаче определенного пакета флэшке, в следующем, обратном пакете от флэшки, модифицирует один бит=)
Я не это мею ввиду. Если нужно установить на машину у_друга/на_работе для конкретной флешки - это одно. Если же в глобальном масштабе, например, при инсталяции широко распространяемого софта - это другое. Для конкретной флешки или вообще для всех существующих в природе. Вообще для этого inf-файл нужно делать и инсталлить его либо через rundll32 rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 132 mycool.inf либо самому через Setup API. Тот же devcon может это делать, см. в DDK Example 25: Insert a filter driver in the class list Но это будет class filter, т.е. он будет грузиться в стеки всех USB девайсов. Короче самое главное: для конкретной флешки или вообще для всех и для какого софта это нужно?
Four-F Я хочу реализовать приложение, в котором по нажатию "на кнопочку" можно было бы загрузить данный драйвер-фильтр, что бы он перехватывал пакеты от подключенной флэшки. Драйер должен работать со Всеми флэшками данного модельного ряда. (т.е. не зависимо от объема памяти во флэшке).
Т.е. у юзера будет возможность увидеть все подключённые флешки, тыкнуть в одну из них и нажать на кнопочку. Если да, то нужно будет получить через Setup API HardwareID посадить на этот девайс фильтр и рестартануть девайс предварительно сделав сброс кэша. Бери исходники SnoopyPro. Кроме сброса кэша всё это там есть. Я не знаю как определить модельный ряд, и думаю, что это вообще невозможно. Всё что у тебя есть это VID, идентифицирующий производителя и PID, идентифицирующий конкретный девайс этого производителя. PID своим девайсам назначает сам производитель и такого понятия как модельный ряд просто не существует.
Four-F Ну выбор модели флэшки я планирую предоставить пользователю, т.е. выбирает модельку... типа JetFlash2.0 и жмет на кнопку аля "Старт" и тогда стартует драйвер для этих флэшек. Я планирую еще другие флэшки в перспективе добавить... Возникнет вопрос, что будет если пользователь ошибется с выбором модели, но это уже нюансы, о которых буду думать позже=)... пока нужно реализовать простое приложение, которое работает со всеми флэшками считая что эти флэшки работают по нужному протоколу. Если я правильно понял, то Если я праильно понял то будет работать со всеми флэшками?... т.е. если юзер правильно определил модель, то все будет ок?