Привет. Собственно задача такая. Нужно найти все устройства на 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.
Читал. Не отпали. Ну по сути насчёт енумерации устройств можно сказать не вопрос. В ddk есть usbview - он через IOCTL к драйверу хаба осуществляет поиск устройств, и в Агурове есть пример через SetupApi (мне меньше нравится). Основной вопрос можно ли из ring3 обратиться к устройству и если нет, то как это сделать из ring0. Где хотя бы найти список IOCTL для HCD и USBD? В ddk что-то найти не могу...
Подойдёт. У Агурова и есть copy/past отсюда с переводом на Delphi Перечисление устройств это в принципе последняя проблема... Вопрос как передачу данных организовать. Нашёл в том же MSDN IOCTL_USB_USER_REQUEST и USBUSER_OP_SEND_ONE_PACKET. Написано что добавлено для поддержки разработчиков - чтобы тестировать транзакции в пошаговом режиме. Отсюда вопрос сразу - а с производительностью у него как будет? Ну и чтоб работал этот запрос надо в реестре параметр добавить (а не захочет ли оно перезагрузку :/ ). И нашёл ещё функции либы WinUsb.dll WinUSB_* Но опять таки никаких примеров нету... А описание типа "посылает пакет устройству с таким-то хэндлом" мало чего даёт. Вот например: Код (Text): 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 не поддерживает не знаю... Как бы перезагрузку не потребовало. Ну а писать чтобы потом убедиться что не работает как то интереса нет.
cppasm Я так понимаю, что какая-то из функций вернет DevicePath, который ты и передашь в CreateFile. Я тут "изучаю" драйвер одного USB устройства, в нем обращения к устройству выполняются с помощью функций SendASPI32Command и GetASPI32SupportInfo из WNASPI32.DLL.
С этим я уже разобрался, но оно не подходит. WinUSB.dll и WinUSB.sys нет в поставке Windows по умолчанию. А если ставить что-то стороннее, то я скорее поставлю libusb-win32. Это скорее всего дисковое устройство какое-то... В общем если кто знает, подскажите: 1. что будет если фильтр не поддерживает PnP? Устройство отключить нельзя будет? или проблемы будут со спящим режимом и т.д.? хотя с другой стороны я фильтр цеплять думаю на хост контроллер, а это pci устройство - всё равно его вытягивать не будут. 2. насколько сложно добавить поддержку PnP и где про это почитать (желательно с примерами). у FourF в CmdTut что-то не нашёл... Хотелось без драйверов обойтись, но единственное что я пока вижу - это IOCTL_USB_USER_REQUEST и USBUSER_OP_SEND_ONE_PACKET. Правда надо реестр чуть подправить.
Читаю. Очень похоже на то что без драйвера не обойтись :/ User Mode интерфейс (WinUSB) появился только в Vista.
а что твои DOS наработки не позволяют работать через порты ring0 драйверка, скажем так же как работают c LPT портом из Win32 приложений? Ты же фактически на порты работал, наверное. Есдинственный существенный минус, думаю отсутствие обработки в таком случае аппратного прерывания ээтого самого устройства. А что этот самый WinUSB "прикрутить" к XP, скажем не удастся? Бредово, конечно, но всеже, как один из шансов крекерски-хакерски получить желаемое и готовенькое...
Не позволяют. Там всё сложнее. Для работы с USB я под DOS писал USB стек. В Windows есть свой. Для работы с устройствами используется именно стек (драйвер шины), весь обмен идёт через него. Если я заменю стек на свой, отвалятся все остальные устройства, т.к. мой со стандартным не совместим. Два стека тоже жить не будут вместе. В общем тут способ типа GiveIO.sys не прокатит У меня желания нет его прикручивать. Потому что для него надо как для обычного драйвера .inf писать и он на конкретное устройство встанет. А мне надо для класса устройств. Тогда лучше уже usblib-win32 поставить и через него работать. Вообще как свою задачу решить я почти нашёл, и даже без драйвера. WIA (Windows Image Aquire) позволяет слать устройству PTP команды, т.е. это и было бы решение. Но проблема в том что работает оно только под Windows XP и выше. А надо ещё хотя бы Win2k. А там нет такого ничего TWAIN совсем не подходит... Что интересно что есть к примеру CanonSDK, драйверов не инсталит, но с камерой как-то работает, притом команды не стандартные шлёт. А как - фиг знает. Что ещё странно - под ОС ниже WinXP ставится драйвер "Canon TWAIN Driver". Странно потому что в TWAIN по сути нет функций для получения файла. Оно больше на сканер рассчитано, возвращает DIB Bitmap. Но Canon'овские проги как-то файлы сливают... Просто Win2k нет под рукой чтоб попробовать.
Еще крохотная альтернатива с большим "мозговложением" - SMI. Там, кстати (в биосе) и модулек готовый же должен быть по работе с файлами, иначе с ее невозможно грузиться было бы... Хотя опять же вендорозависимость, неуниверсальность... Вообщем это тоже не подойдет. Ну это из серии мысли вслух, пожалуй. Навеяло из прочитанного этого оффтопчика http://www.rom.by/article/А_кто_управляет_Вашим_компьютером
Кто такой "с неё"? Нафига грузиться с фотоаппарата? Нет его поддержки в BIOS да и не поможет она ничем. Люди, а что такое STI? Где-нибудь можно про него почитать? А то microsoft своё WIA продвигает, по STI что-то не могу нормальной информации найти. Сочинили бы раньше WIA - проблем бы не было :/
причём тут фотоаппарат? ) Я имел ввиду, что современный биос умет грузиться с USB Flash! А это значит, что в нем (в биосе) есть и драйвер USB и как ты говоришь стек и умение работать с файлами этой флешки, пусть даже только FAT.
2cppasm в DDK вроде как есть замечательные самплы, в том числе для работы с булк-транспортом...- по крайней мере в моем WDK (Windows Driver Kit build 6.0.6000.16386 (Vista RTM)). Там-же прилагаются ессно и сырки юзермода для записи/чтения с девайса... - Лично юзал, когда писали дров к нашему девайсу, - там же сможешь чуток подпатчить инфик, немного пошаманить, и работать например, с флешей через этот драйвер - на ХРхе, на чем угодно. Игрались - слали скайзёвые пакеты на флешу с питона 8-). Доки - имхо, достаточно Уолтера Они. зы. чото не получилось у меня приаттачить сюда архив в 200К, - надо будет, пиши... Тока там в булковом драйвере небольшие грабли - он режет пакеты то ли на 512 байт то ли еще как-то... но вобщем, это легко лечится путем добавки пары-тройки строк кода... не припомню, но разобраться довольно просто (эта "нарезка" пакетов мешала нормально реализовать MSCBOT с юзерспейса - надо было иметь это апи именно в юзерспейсе). ззы. Еще поможет в твоем нелегком деле - ЮСБ-сниффер, - есть какой-то (точно не помню - Snoopy Pro чтоли) - на соурсфорже - очень в свое время помогло.
Так собственно в этом небольшая загвоздка. Мне драйвер надо (очень желательно) сделать без inf файла. Т.е. есть устройство, на него уже установлен драйвер - под WinXP стандартный, под Win2k от производителя. Но он не реализует всю функциональность устройства. Надо в стек всунуть свой драйвер который будет позволять слать устройству пакеты. Дальше лично мне всё понятно. Вроди подходит для таких целей фильтр, надо только в реестре прописать драйвер. Но опять таки вопросы прописывать как Upper Filter или как Lower Filter, и в чём основная разница. И как после этого перезапустить стек устройства чтобы драйвер подгрузился. Вообще поскольку устройств может быть несколько, а потом может ещё и для других понадобиться, то фильтр лучше наверное вообще для корневого хаба писать... Через него потом ко всем устройствам можно доступ получить. И не очень пока понимаю как обнаружить все устройства на шине. Если я фильтр писать буду, но енумерацию ведь основной драйвер проведёт. Есть у меня в большом количестве PS: DDK у меня от WinXP 2600, пример там есть, но всё на inf заточено. Пытаюсь в libusb-win32 разобраться, там динамически подключается.
Ну, тогда, похоже - тебе действительно нужен фильтр. Разница между аппер и ловер фильтрами, на сколько уловил - в аппере лучше всего добавлять новый функционал (имхо, твой случай), в ловер - патчить/слушать пакеты на пути к устройству. Кстати, ЮСБ снифферы - по идее, как раз и реализуют фильтры - так что можешь использовать их код за базу исследований (ессно, вероятнее всего - они являются ловер-фильтрами, хотя, что-то мне сдается, в ловер-фильтрах тоже можно реализовать поддержку "дополнительных фич"). Как получить список устройств - SetupAPI тебе в помощь. Перезапускать стек - в случае ЮСБ думаю можно так - 1. Через сетап-апи софтварно отключаешь устройство (вероятно даже, - все устройства, на которые подразумевается повесить фильтр). 2. Опять там-же в сетап-апи (или в cfgmgr32) - инициируешь перечисление устройств - все дрова должны подхватиться согласно указаниям реестра. т.е. перезапускать стек имеет смысл только при первой инсталляции драйвера и то при условии, что устройство физически подключено - дальше твой драйвер должен подхватываться всегда сам.
Что-то я никак не могу понять как получить путь до usb mass storage. В каком порядке нужно вызывать функции SetupAPI и где брать нужные guid'ы?