Подключение драйвера фильтра

Тема в разделе "WASM.NT.KERNEL", создана пользователем wint, 4 фев 2007.

  1. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Доброго времени суток.

    Передо мной стоит следующая задача:
    Перехватить и модифицировать пакеты идущие непосредственно! от флэшки, выше лежащему драйверу UStork.sys, поставляемому вместе с устройством.

    Как я понимаю, необходимо написать драйвер фильтр для USB флэш диска, который будет подключаться между шинным драйвером и драйвером Ustork.sys , а точнее к PDO создаваемом шинным драйвером.(возможно, даже наверняка, в стеке присутствуют и другие драйвера, в том числе и от производителя флэхи)

    Открываю Солдатова... читаю:
    "В результате вызовов IoAttachDeviceToDeviceStack или IoAttachDevice будет найден объект устройства, находящийся на вершине стека над указанным целевым объектом (по имени или по указателю). К нему и будет подключен новый объект устройства. Соответственно, разработчик, подключающий свой объект устройства к устройству в "середине" стека и надеющийся, что таким образом через его драйвер будут "протекать" IRP запросы от вышестоящих драйверов к нижестоящим, глубоко заблуждается. На самом деле, для достижения этой цели необходимо не просто выполнить подключение к нужному объекту устройства, но и сделать это в строго определенный момент загрузки — ранее, чем будет выполнена загрузка вышестоящих драйверов, чьи запросы предполагается перехватывать. Однако рассмотрение данной проблемы выходит за рамки данной книги. "

    Возникает вопрос: Как подключить драйвер в "середину" стека?
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    :)

    Теоретически возможны только три варианта:
    1. Сразу над PDO. Официально не поддерживается, но реализуется.
    2. Куда-то между PDO и FDO. Ключ реестра LowerFilters.
    3. Куда-то над FDO. Ключ реестра UpperFilters.

    Куда-то означает, что если есть ещё желающие воткнуться туда же, то их порядком практически невозможно управлять. Точнее нет гарантий.

    В какую именно середину нужно воткнуться?
     
  3. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    У меня есть книжка Addison Wesley - USB System Architecture (USB 2.0).pdf
    Посмотри на сайте изд-ва. Может пригодится.
     
  4. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Four-F
    Если честно я не знаю куда точно нужно его подключать:), точно знаю что надо оказаться ниже UStork.sys. А что под ним я не знаю... Я пытаюсь обойти защиту флэхи (я уже писал об этом в других постах)... Сейчас хочу попробовать подменить ответ флэш диска на запрос драйвера.
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Если он управляет FDO, тогда никаких проблем. Если он управляет каким-нибудь lower-level фильтром, тогда проблема, но есть варианты. Если он управляет каким-нибудь upper-level фильтром, тогда тоже никаких проблем.
     
  6. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Four-F
    А как это можно узнать?=)

    apple
    Спасибо за ссылку на книжку... бегло посмотрел оглавление - Есть то - чего не нашел в 5 книгах=)
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Много всяких способов. Тебе, наверное, проще devcon'ом (В тулзах к DDK идет).

    Узнаешь Hardware ID для нужного девайса, например перечислив все девайсы, в id которых есть usb:

    Код (Text):
    1. C:\Protools\devcon>devcon hwids usb*
    2. USB\ROOT_HUB\4&18F45С86&1
    3.     Name:     Hardware ID's:
    4.         USB\ROOT_HUB&VID1002&PID0056&REV0011
    5.         USB\ROOT_HUB&VID1002&PID0056
    6.         USB\ROOT_HUB
    7. USB\ROOT_HUB\4&2DA8245B&3
    8.     Name:     Hardware ID's:
    9.         USB\ROOT_HUB&VID1002&PID0056&REV0011
    10.         USB\ROOT_HUB&VID1002&PID0056
    11.         USB\ROOT_HUB
    12. USB\ROOT_HUB\4&38DFB650&3
    13.     Name:     Hardware ID's:
    14.         USB\ROOT_HUB&VID1002&PID0056&REV0011
    15.         USB\ROOT_HUB&VID1002&PID0056
    16.         USB\ROOT_HUB
    17. USB\VID_0816&PID_1100\6DEAE6
    18.     Name: D-Link DSL-200 USB ADSL WAN Modem
    19.     Hardware ID's:
    20.         USB\Vid_0816&Pid_1100&Rev_0100
    21.         USB\Vid_0816&Pid_1100
    22.     Compatible ID's:
    23.         USB\Class_ff&SubClass_ff&Prot_ff
    24.         USB\Class_ff&SubClass_ff
    25.         USB\Class_ff
    26. 4 matching device(s) found.
    Дальше берешь Hardware ID нужного тебе девайса (я взял для своего адсл модема) и смотришь стек (кавычки и собака обязательно):

    Код (Text):
    1. C:\Protools\devcon>devcon stack "@USB\VID_0816&PID_1100\6DEAE6"
    2. USB\VID_0816&PID_1100\6DEAE6
    3.     Name: D-Link DSL-200 USB ADSL WAN Modem
    4.     Setup Class: {4D36E972-E325-11CE-BFC1-08002BE10318} Net
    5.     Class upper filters:
    6.         libusb0
    7.     Controlling service:
    8.         wanusb
    9. 1 matching device(s) found.
    Controlling service - это FDO. Class upper filters - это собственно Class upper filters ;)

    См. доку по devcon в DDK.
     
  8. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Ага... получаю такую вот штуку:
    Код (Text):
    1. C:\WINDDK\2600\tools\devcon\i386>devcon stack "@USBSTOR\DISK&VEN_USB_MASS&PROD__
    2. STORAGE_DEVICE&REV_0.2B\6&152FD4A3&0&0"
    3. USBSTOR\DISK&VEN_USB_MASS&PROD__STORAGE_DEVICE&REV_0.2B\6&152FD4A3&0&0
    4.     Name: JetFlashTS512MJF2B
    5.     Setup Class: {4D36E967-E325-11CE-BFC1-08002BE10318} DiskDrive
    6.     Class upper filters:
    7.         PartMgr
    8.     Controlling service:
    9.         disk
    10. 1 matching device(s) found.
    Тока, я не понял "who is who"? (не бейте больно)
    disk - это FD0 - кто его создает?
    PartMgr - это как я понимаю FiDO , т.е. FDO, созданный вышележащим драйвером-фильтром. Каким? UStrok.sys?
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ты не ту ноду смотришь. Это дечерняя нода твоей флешки.
    Код (Text):
    1. Запоминающее устройство для USB
    2.     Дисковый накопитель
    3.         Универсальный том
    Ты смотришь ноду "Дисковый накопитель", а тебе надо родителя смотреть, т.е. "Запоминающее устройство для USB". У него Hardware ID будет начинаться с USB\, а у юсб-дисков Hardware ID начинается с USBSTOR\.
     
  10. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    А если становится в вершину стека, но слать пакеты в обход UStork.sys.
     
  11. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Чтобы тебе всякие 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.
     
  12. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Понял=)
    Код (Text):
    1. C:\WINDDK\2600\tools\devcon\i386>devcon stack "@USB\VID_0EA0&PID_2168\61100740FF
    2. 6F84A9"
    3. USB\VID_0EA0&PID_2168\61100740FF6F84A9
    4.     Name: U-Storage Controller
    5.     Setup Class: {36FC9E60-C465-11CF-8056-444553540000} USB
    6.     Controlling service:
    7.         USTOR
    8.     Lower filters:
    9.         usbsnoop
    10. 1 matching device(s) found.
    С USTORK - вроде ясно, он создает непосредственно FDO подключаемой флэшки.(если я правильно понимаю)
    usbsnoop - а это походу фильтр, установленный поставляемым с флэшкой ПО?
     
  13. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Да.

    Да, это фильтр, но ПО флешки тут не при чём. Это SnoopyPro http://sourceforge.net/projects/usbsnoop/
    Он прописывает себя в ключ реестра LowerFilters для конкретного девайса в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\. Т.е. это получается по терминологии device lower filter.

    Т.е. снуппи сидит у тебя под FDO. Тебе тоже самое надо сделать.
     
  14. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    А.. точно.. ставил... помню=) тока он не пашет не фига... сносить надо=)...

    Ага... куда подключаться понял... а вот как?...
     
  15. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Это зависит от того, для чего тебе это нужно. Если для дебага на своей машине, то можно просто руками в реестр прописать.
     
  16. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Four-F
    Мне нужно сделать драйвер который устанавливается на машину, и автоматически при передаче определенного пакета флэшке, в следующем, обратном пакете от флэшки, модифицирует один бит=)
     
  17. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Я не это мею ввиду. Если нужно установить на машину у_друга/на_работе для конкретной флешки - это одно. Если же в глобальном масштабе, например, при инсталяции широко распространяемого софта - это другое. Для конкретной флешки или вообще для всех существующих в природе.

    Вообще для этого 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 девайсов.

    Короче самое главное: для конкретной флешки или вообще для всех и для какого софта это нужно?
     
  18. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Four-F
    Я хочу реализовать приложение, в котором по нажатию "на кнопочку" можно было бы загрузить данный драйвер-фильтр, что бы он перехватывал пакеты от подключенной флэшки.
    Драйер должен работать со Всеми флэшками данного модельного ряда. (т.е. не зависимо от объема памяти во флэшке).
     
  19. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Т.е. у юзера будет возможность увидеть все подключённые флешки, тыкнуть в одну из них и нажать на кнопочку. Если да, то нужно будет получить через Setup API HardwareID посадить на этот девайс фильтр и рестартануть девайс предварительно сделав сброс кэша. Бери исходники SnoopyPro. Кроме сброса кэша всё это там есть.

    Я не знаю как определить модельный ряд, и думаю, что это вообще невозможно. Всё что у тебя есть это VID, идентифицирующий производителя и PID, идентифицирующий конкретный девайс этого производителя. PID своим девайсам назначает сам производитель и такого понятия как модельный ряд просто не существует.
     
  20. wint

    wint New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2006
    Сообщения:
    66
    Four-F
    Ну выбор модели флэшки я планирую предоставить пользователю, т.е. выбирает модельку... типа JetFlash2.0 и жмет на кнопку аля "Старт" и тогда стартует драйвер для этих флэшек.

    Я планирую еще другие флэшки в перспективе добавить... Возникнет вопрос, что будет если пользователь ошибется с выбором модели, но это уже нюансы, о которых буду думать позже=)... пока нужно реализовать простое приложение, которое работает со всеми флэшками считая что эти флэшки работают по нужному протоколу.

    Если я правильно понял, то
    Если я праильно понял то будет работать со всеми флэшками?... т.е. если юзер правильно определил модель, то все будет ок?