информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Я думаю должна сработать работа с файлом USB001 или USB002 -... 20.06.07 14:47  Число просмотров: 3471
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
Я думаю должна сработать работа с файлом USB001 или USB002 - что-то в этом роде.
<programming>
[Win32] Как просто передать данные по USB? 19.06.07 14:28  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Здравствуйте, все. У меня такая проблема. Нужно обмениваться данными с USB-устройством. Есть ли простые способы для этого (например, как при работе с LPT/COM через CreateFile)?

Пока вижу только такое решение: сканировать шину PCI, потом USB и, наконец (хотя, ИМХО, это только начало...), инициализировать его и обмениваться данными.

А если учесть возможность работы под NT-подобными Виндами, то ещё и драйвер писать придётся чтобы порты открыть. Последнее меня вообще в тоску кидает, т.к. это мне пока ещё не очень по зубам.

Может кто знает способ попроще?
У Агурова в книжке "Практика программирования USB" вычитал,... 24.07.07 05:59  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
У Агурова в книжке "Практика программирования USB" вычитал, что можно создавать устройства, для которых не понадобится драйверов. Один из таких классов устройств - это CDC. Говорит, что в этом случае обмен данными будет точно такой же, как и с последовательным портом. Посмотрел программу, прилагаемую к дискете. Намёков на USB даже не обнаружил! Обычная программа для обмена данными по COM-порту. Я где-то туплю, или Агуров всех развёл?
Развел. Для USB по любому нужны драйвера 24.07.07 11:33  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> У Агурова в книжке "Практика программирования USB" вычитал,
> что можно создавать устройства, для которых не понадобится
> драйверов. Один из таких классов устройств - это CDC.

А что такое CDC?

> Говорит, что в этом случае обмен данными будет точно такой
> же, как и с последовательным портом. Посмотрел программу,
> прилагаемую к дискете. Намёков на USB даже не обнаружил!
> Обычная программа для обмена данными по COM-порту. Я где-то
> туплю, или Агуров всех развёл?

Другое дело, что есть USB класс - последовательный девайс (на нем обычно работают всякие IrDA, дата-кабели к мобилам и пр.). Вот к нему то драйвер обеспечивает доступ как к обычному COM-порту. Проблема только в том, что (насколько я помню) дрова для данного класса не bundle-ятся с WinXP всех сервис паков.
Это коммуникационные устройства и есть. 24.07.07 12:00  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Сдается мне, что начать можно вот с этой статьи 20.06.07 16:54  
Автор: Neznaika <Alex> Статус: Member
<"чистая" ссылка>
http://junglewin.narod.ru/usb.html
Neznaika, спасибо, но я пока морально не готов к разбору с... 24.06.07 16:06  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Neznaika, спасибо, но я пока морально не готов к разбору с драйверами. Вроде нашёл способ проще, правда не факт, что он работает. В нём используются GUID'ы и функции SetupDiGetInterfaceDeviceDetail, SetupDiDestroyDeviceInfoList и другие похожие, правда в MSDN'е некоторых из них нет. Кто-нибудь в этой стороне на грабли попадал? Буду, признателен, если опытом поделитесь.

PS. Несколько абзацев прочитал. Хорошая статья - на лёгком языке написана. Спасибо.
А стоило дочитать до конца, тогда вопрос бы отпал. 25.06.07 11:10  
Автор: AlexD <Alexander> Статус: Member
<"чистая" ссылка>
Возникло ещё больше вопросов. Думаю это не та статья, с... 03.07.07 07:46  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Возникло ещё больше вопросов. Думаю это не та статья, с которой нужно начинать, она вроде рассчитана на продвинутых людей, имеющих опыт в программировании драйверов. Решил разбираться с DDK, открываю новую тему, по поводу: «Как компилировать в DDK?».

Прочитав некоторое число литературы, пришёл к выводу, что «просто» пообщаться с USB устройствами не получится. Если никто не докажет обратного, тему через пару дней закрою.
А чем BuildXxxUrbRequest/IoCallDriver не просто? 03.07.07 11:08  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
А можно какую-нибудь конкретную функцию из... 03.07.07 11:46  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
А можно какую-нибудь конкретную функцию из BuildXxxUrbRequest, а то в MSDN'е много чего на слово Build начинается... И что, в этом случае без драйвера можно обойтись? Извиняюсь, если вопросы глупые.
Практически вся работа с USB-устройствами ведется через URB (USB Request Block) 03.07.07 13:05  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> А можно какую-нибудь конкретную функцию из
> BuildXxxUrbRequest, а то в MSDN'е много чего на слово Build
> начинается... И что, в этом случае без драйвера можно
> обойтись? Извиняюсь, если вопросы глупые.

Посылается URB через обычный Internal IOCTL IRP с кодом IOCTL_INTERNAL_USB_SUBMIT_URB. Один из самых широко используемых типов URB - это UrbBulkOrInterruptTransfer, его поля можно заполнить при помощи макроса UsbBuildInterruptOrBulkTransferRequest. Пример использования можно найти в том же \src\usb\bulkusb\sys\bulkrwr.c

Хотя для работы с USB надо как минимум сначала выбрать конфигурацию (UrbSelectConfiguration) и только после этого используя один из pipe handle-ов, можно посылать/принимать данные. В общем, если ты ожидал что-то типа UART-а, то придется забыть об этих мечтах.
Подключил к USB флешку, и смотрю пример bulkusb: 03.07.07 13:49  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка>
Подключил к USB флешку, и смотрю пример bulkusb:
rwbulk -u
выдаёт: Failed to open () = 0DEV not open

rwbulk -w 5
выдаёт
Failed to GetUsbDeviceFileName

Прогонял программу в отладчике и обнаружил, что функция SetupDiEnumDeviceInterfaces возвращает ошибку 0x103 (что означает "Дополнительные данные отсутствуют"). Если просто -w, без 5, то вообще с ошибкой завершается и просит отослать отчёт Microsoft.

Может быть это всё из-за того, что я драйвер установить не смог? rwbulk его автоматически подгружает?

Пробовал следовать инструкциям Readme-файла по установке драйвера, но не получилось. Там говорится, что нужно установить драйвер для нового устройства, а как быть если я работаю с драйвером, у которого устройства нет?

Поможете корректно запустить этот пример?

PS. Трудно быть чайником...
Нет не подгружает. 03.07.07 16:02  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Может быть это всё из-за того, что я драйвер установить не
> смог? rwbulk его автоматически подгружает?

Нет не подгружает.

> Пробовал следовать инструкциям Readme-файла по установке
> драйвера, но не получилось. Там говорится, что нужно
> установить драйвер для нового устройства, а как быть если я
> работаю с драйвером, у которого устройства нет?

Я не разбирался с этим примером, но кажется мне, что драйвер надо ставить на то устройство, с которым ты собираешься работать (в твоем случае - флешку). Если будешь делать update driver, то замени vid и pid в inf файле (как написано в readme).

> Поможете корректно запустить этот пример?

Еще один вариант: создать сервис для драйвера самому
sc create bulkusb binPath= "System32\DRIVERS\bulkusb.sys" type= kernel

После этого найти Hardware Device Key нужного устройства в HKLM\System\CCS\Enum\USB\Vid_xxxx&Pid_xxxx\xxxxxx
Узнать можно в Device Manager-е. Открыть properties нужного девайса и во вкладке Details посмотреть Device Instance Id

После того, как нужный ключ найден, разрешить себе доступ на запись в этот ключ (по дефолту запись на все подключи Enum-а - только для юзера SYSTEM) и поменять значение Service с USBSTOR (скорее всего именно такой сервис будет у флешки) на bulkusb. При следующем появлении данного устройства, для него будет загружен драйвер bulkusb и ты сможешь с ним общаться.

> PS. Трудно быть чайником...
Ага :-)
Я думаю должна сработать работа с файлом USB001 или USB002 -... 20.06.07 14:47  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
Я думаю должна сработать работа с файлом USB001 или USB002 - что-то в этом роде.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach