Программирование USB.

Тема в разделе "WASM.NT.KERNEL", создана пользователем cppasm, 21 апр 2008.

  1. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Привет.
    Собственно задача такая.
    Нужно найти все устройства на USB и дальше с определёнными работать.
    Информации нифига найти не могу нормальной.
    Всё это было мной реализовано в DOS, теперь надо под Windows...
    По сути для общения с устройством достаточно знать контроллер к которому оно подключено и его адрес.
    Чтобы не было абстрактно, вот конкретные вопросы:

    1. как послать устройству запросы на Control Transfer, Bulk Transfer и т.д.?
    можно ли это сделать из ring3 каким нибудь IOCTL (каким?) к USBD?

    2. если можно только из ring0, то опять же можно ли это сделать "абстрактным" драйвером (не связанным с физическим устройством)? как device object нужного устройства узнать и т.д.? или оно не надо?

    3. ну и собственно как поиск устройств осуществить?

    в идеале хотелось бы какой-нибудь IOCTL чтобы выполнить URB_FUNCTION_CONTROL_TRANSFER, URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER.
    ну а вообще хоть какую-нибудь документацию не по USB (её я всю читал), а именно про программирование USB стека под Windows.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Могу посоветовать Агурова "Интерфейс USB". Некоторые вопросы отпадут
     
  3. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Читал. Не отпали.
    Ну по сути насчёт енумерации устройств можно сказать не вопрос.
    В ddk есть usbview - он через IOCTL к драйверу хаба осуществляет поиск устройств, и в Агурове есть пример через SetupApi (мне меньше нравится).
    Основной вопрос можно ли из ring3 обратиться к устройству и если нет, то как это сделать из ring0.
    Где хотя бы найти список IOCTL для HCD и USBD?
    В ddk что-то найти не могу...
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Подойдёт.
    У Агурова и есть copy/past отсюда с переводом на Delphi :)
    Перечисление устройств это в принципе последняя проблема...
    Вопрос как передачу данных организовать.
    Нашёл в том же MSDN IOCTL_USB_USER_REQUEST и USBUSER_OP_SEND_ONE_PACKET.
    Написано что добавлено для поддержки разработчиков - чтобы тестировать транзакции в пошаговом режиме.
    Отсюда вопрос сразу - а с производительностью у него как будет?
    Ну и чтоб работал этот запрос надо в реестре параметр добавить (а не захочет ли оно перезагрузку :/ ).
    И нашёл ещё функции либы WinUsb.dll WinUSB_*
    Но опять таки никаких примеров нету...
    А описание типа "посылает пакет устройству с таким-то хэндлом" мало чего даёт.
    Вот например:
    Код (Text):
    1. BOOL __stdcall  WinUsb_Initialize (    IN HANDLE  DeviceHandle,    OUT  PWINUSB_INTERFACE_HANDLE  InterfaceHandle  );
    DeviceHandle - написано что-то типа "хэндл устройства который вернул CreateFile".
    А кого этим CreateFile() открывать - догадайся сам.
    Нашёл правда только-что это:
    http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/WinUsb_HowTo.docx
    http://msdn2.microsoft.com/en-us/library/aa476413.aspx
    буду изучать.
    Вообще надо это для получения фоток с ЦФК.
    Но стандартный драйвер не подходит - есть расширения для того чтобы помечать какие фотки новые, какие уже скачивались и т.д.
    Нужно устройству слать пакеты с запросами.
    Можно было бы написать и фильтр, но я с PnP плохо знаком, а как поведёт себя ОС при отключении устройства если фильтр PnP не поддерживает не знаю...
    Как бы перезагрузку не потребовало.
    Ну а писать чтобы потом убедиться что не работает как то интереса нет.
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    cppasm
    Я так понимаю, что какая-то из функций вернет DevicePath, который ты и передашь в CreateFile.

    Я тут "изучаю" драйвер одного USB устройства, в нем обращения к устройству выполняются с помощью функций SendASPI32Command и GetASPI32SupportInfo из WNASPI32.DLL.
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    С этим я уже разобрался, но оно не подходит.
    WinUSB.dll и WinUSB.sys нет в поставке Windows по умолчанию.
    А если ставить что-то стороннее, то я скорее поставлю libusb-win32.
    Это скорее всего дисковое устройство какое-то...

    В общем если кто знает, подскажите:
    1. что будет если фильтр не поддерживает PnP? Устройство отключить нельзя будет?
    или проблемы будут со спящим режимом и т.д.?
    хотя с другой стороны я фильтр цеплять думаю на хост контроллер, а это pci устройство - всё равно его вытягивать не будут.
    2. насколько сложно добавить поддержку PnP и где про это почитать (желательно с примерами).
    у FourF в CmdTut что-то не нашёл...

    Хотелось без драйверов обойтись, но единственное что я пока вижу - это IOCTL_USB_USER_REQUEST и USBUSER_OP_SEND_ONE_PACKET.
    Правда надо реестр чуть подправить.
     
  8. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    cppasm
    Уолтера Оуни почитай про WDM
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Читаю.
    Очень похоже на то что без драйвера не обойтись :/
    User Mode интерфейс (WinUSB) появился только в Vista.
     
  10. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    а что твои DOS наработки не позволяют работать через порты ring0 драйверка, скажем так же как работают c LPT портом из Win32 приложений?
    Ты же фактически на порты работал, наверное. Есдинственный существенный минус, думаю отсутствие обработки в таком случае аппратного прерывания ээтого самого устройства.
    А что этот самый WinUSB "прикрутить" к XP, скажем не удастся? Бредово, конечно, но всеже, как один из шансов крекерски-хакерски получить желаемое и готовенькое...
     
  11. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Не позволяют. Там всё сложнее.
    Для работы с USB я под DOS писал USB стек. В Windows есть свой.
    Для работы с устройствами используется именно стек (драйвер шины), весь обмен идёт через него.
    Если я заменю стек на свой, отвалятся все остальные устройства, т.к. мой со стандартным не совместим.
    Два стека тоже жить не будут вместе.
    В общем тут способ типа GiveIO.sys не прокатит :)
    У меня желания нет его прикручивать.
    Потому что для него надо как для обычного драйвера .inf писать и он на конкретное устройство встанет.
    А мне надо для класса устройств.
    Тогда лучше уже usblib-win32 поставить и через него работать.

    Вообще как свою задачу решить я почти нашёл, и даже без драйвера.
    WIA (Windows Image Aquire) позволяет слать устройству PTP команды, т.е. это и было бы решение.
    Но проблема в том что работает оно только под Windows XP и выше.
    А надо ещё хотя бы Win2k. А там нет такого ничего :dntknw: TWAIN совсем не подходит...

    Что интересно что есть к примеру CanonSDK, драйверов не инсталит, но с камерой как-то работает, притом команды не стандартные шлёт.
    А как - фиг знает. Что ещё странно - под ОС ниже WinXP ставится драйвер "Canon TWAIN Driver".
    Странно потому что в TWAIN по сути нет функций для получения файла.
    Оно больше на сканер рассчитано, возвращает DIB Bitmap.
    Но Canon'овские проги как-то файлы сливают...
    Просто Win2k нет под рукой чтоб попробовать.
     
  12. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Еще крохотная альтернатива с большим "мозговложением" - SMI. Там, кстати (в биосе) и модулек готовый же должен быть по работе с файлами, иначе с ее невозможно грузиться было бы... Хотя опять же вендорозависимость, неуниверсальность... Вообщем это тоже не подойдет. Ну это из серии мысли вслух, пожалуй. Навеяло из прочитанного этого оффтопчика http://www.rom.by/article/А_кто_управляет_Вашим_компьютером
     
  13. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Кто такой "с неё"? Нафига грузиться с фотоаппарата?
    Нет его поддержки в BIOS да и не поможет она ничем.

    Люди, а что такое STI?
    Где-нибудь можно про него почитать?
    А то microsoft своё WIA продвигает, по STI что-то не могу нормальной информации найти.
    Сочинили бы раньше WIA - проблем бы не было :/
     
  14. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    причём тут фотоаппарат? )
    Я имел ввиду, что современный биос умет грузиться с USB Flash!
    А это значит, что в нем (в биосе) есть и драйвер USB и как ты говоришь стек и умение работать с файлами этой флешки, пусть даже только FAT.
     
  15. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    2cppasm
    в DDK вроде как есть замечательные самплы, в том числе для работы с булк-транспортом...- по крайней мере в моем WDK (Windows Driver Kit build 6.0.6000.16386 (Vista RTM)). Там-же прилагаются ессно и сырки юзермода для записи/чтения с девайса... - Лично юзал, когда писали дров к нашему девайсу, - там же сможешь чуток подпатчить инфик, немного пошаманить, и работать например, с флешей через этот драйвер - на ХРхе, на чем угодно. Игрались - слали скайзёвые пакеты на флешу с питона 8-).

    Доки - имхо, достаточно Уолтера Они.

    зы. чото не получилось у меня приаттачить сюда архив в 200К, - надо будет, пиши... Тока там в булковом драйвере небольшие грабли - он режет пакеты то ли на 512 байт то ли еще как-то... но вобщем, это легко лечится путем добавки пары-тройки строк кода... не припомню, но разобраться довольно просто (эта "нарезка" пакетов мешала нормально реализовать MSCBOT с юзерспейса - надо было иметь это апи именно в юзерспейсе).

    ззы. Еще поможет в твоем нелегком деле - ЮСБ-сниффер, - есть какой-то (точно не помню - Snoopy Pro чтоли) - на соурсфорже - очень в свое время помогло.
     
  16. axe_roma

    axe_roma New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2004
    Сообщения:
    93
    Адрес:
    Russia
  17. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Так собственно в этом небольшая загвоздка.
    Мне драйвер надо (очень желательно) сделать без inf файла.
    Т.е. есть устройство, на него уже установлен драйвер - под WinXP стандартный, под Win2k от производителя. Но он не реализует всю функциональность устройства.
    Надо в стек всунуть свой драйвер который будет позволять слать устройству пакеты.
    Дальше лично мне всё понятно.
    Вроди подходит для таких целей фильтр, надо только в реестре прописать драйвер.
    Но опять таки вопросы прописывать как Upper Filter или как Lower Filter, и в чём основная разница.
    И как после этого перезапустить стек устройства чтобы драйвер подгрузился.
    Вообще поскольку устройств может быть несколько, а потом может ещё и для других понадобиться, то фильтр лучше наверное вообще для корневого хаба писать...
    Через него потом ко всем устройствам можно доступ получить.
    И не очень пока понимаю как обнаружить все устройства на шине.
    Если я фильтр писать буду, но енумерацию ведь основной драйвер проведёт.
    Есть у меня в большом количестве :)
    PS: DDK у меня от WinXP 2600, пример там есть, но всё на inf заточено.
    Пытаюсь в libusb-win32 разобраться, там динамически подключается.
     
  18. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Ну, тогда, похоже - тебе действительно нужен фильтр.
    Разница между аппер и ловер фильтрами, на сколько уловил - в аппере лучше всего добавлять новый функционал (имхо, твой случай), в ловер - патчить/слушать пакеты на пути к устройству.
    Кстати, ЮСБ снифферы - по идее, как раз и реализуют фильтры - так что можешь использовать их код за базу исследований :) (ессно, вероятнее всего - они являются ловер-фильтрами, хотя, что-то мне сдается, в ловер-фильтрах тоже можно реализовать поддержку "дополнительных фич").

    Как получить список устройств - SetupAPI тебе в помощь.

    Перезапускать стек - в случае ЮСБ думаю можно так -
    1. Через сетап-апи софтварно отключаешь устройство (вероятно даже, - все устройства, на которые подразумевается повесить фильтр).
    2. Опять там-же в сетап-апи (или в cfgmgr32) - инициируешь перечисление устройств - все дрова должны подхватиться согласно указаниям реестра.
    т.е. перезапускать стек имеет смысл только при первой инсталляции драйвера и то при условии, что устройство физически подключено - дальше твой драйвер должен подхватываться всегда сам.
     
  19. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Что-то я никак не могу понять как получить путь до usb mass storage. В каком порядке нужно вызывать функции SetupAPI и где брать нужные guid'ы?
     
  20. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Black_mirror
    WDK примеры