Привет всем. Речь вот о чем - как программно сообщить ОС , что воткнули флешку (на самом деле ничего не втыкать). Например есть GUI с кнопкой - жмем кнопку ... и в винде "всплывает" балун - "найдено новое устройство"... Что-то похожее было здесь Подскажите.
Что происходит при подключении USB-джойстика, описано подробно тут Adding a PnP Device to a Running System для флешек примерно то же самое + монтирование тома. Насчет виртуальных USB-устройств ничего умного сказать не могу.
Там несовсем то написано... Перефразирую вопрос - нужно эмулировать присоединение устройства (втыкание флешки), остальную работу пусть делает винда(установка драйвера). Я заполняю структуры: Код (Text): DEVICE DESCRIPTOR: BYTE bLength: 0x12 BYTE bDescriptorType: 0x01 WORD bcdUSB: 0x0200 BYTE bDeviceClass: 0xEF BYTE bDeviceSubClass: 0x02 BYTE bDeviceProtocol: 0x01 BYTE bMaxPacketSize0: 0x40 WORD idVendor: 0x045E WORD idProduct: 0xFFFF WORD bcdDevice: 0x0100 BYTE iManufacturer: 0x01 WORD iProduct: 0x02 WORD iSerialNumber: 0x02 BYTE bNumConfigurations: 0x01 ------------------------- CONFIGURATION DESCRIPTOR: BYTE bLength: 0x09 BYTE bDescriptorType: 0x02 WORD wTotalLength: 0x.... BYTE bNumInterface: 0x03 BYTE bConfigurationValue: 0x01 BYTE iConfiguration: 0x01 BYTE bmAttributes: 0x80 (BUS Powered) BYTE bMaxPower: 0x19 (50 mA) ------------------------- INTERFACE ASSOCIATION DESCRIPTOR: BYTE bLength: 0x08 BYTE bDescriptorType: 0x0B BYTE bFirstInterface: 0x00 BYTE bInterfaceCount: 0x02 BYTE bFunctionClass: 0x0E BYTE bFunctionSubClass: 0x03 BYTE bFunctionProtocol: 0x00 BYTE iFunction: 0x04 и что-то там еще, жму кнопку в программе - ВОТ ЗДЕСЬ что нужно делать(?) Открыть (присоединиться) свободный USB - порт и послать туда какие-то байты. Отсюда вопросы - как система определяет, что якобы появился новый девайс в USB , как сообщить iProduct и idVendor, чтоб потом поставить нужные драйвера. Может быть при появлении питания на флешке, она выдает команду в USB ... Так вот, что это за команда - хочу реализовать в программе. Где почитать? Гм. Может топик не для этой ветки - перенесите в электронику.
USB порт имеет 4 провода: 2 питание, 2 собственно шина. Оба шинных провода подтянуты резисторами к цепям питания. При втыкании девайса в порт, баланс сопротивлений резко меняется и получается электрический импульс. Хаб аппаратно это видит и сигналит драйверу. Точнее драйвер опрашивает какие-то регистры хаба (кажется... точно не помню). Драйвер создает PDO для нового девайса и сигналит системе, через вызов IoInvalidateDeviceRelations, о том, что появился новый девайс и, типа, "давай ищи и загружай для него дрова". Дальше нечинает работать подсистема PnP, как описано по ссылке выше. Т.о., чтобы программно сделать то, что ты хочешь, нужно создать PDO, вызвать IoInvalidateDeviceRelations, и ловить все запросы от системы, подсовывая ей нужную инфу. Возможно, придется эмулировать не только одно устройство, а весь хост-контроллер и корневой хаб. Как это сделать - не знаю. Инфа по USB легко гуглится. И на русском тоже много чего есть, например: http://www.is.svitonline.com/vks/Links/Article/USB_intro.html Вряд ли. Тебе ведь чисто программно надо эмулировать, т.е. из драйвера.
При втыкании реального девайса - загружается стандартный драйвер, а потом уже требуется дрова мануфактурера. Так вот, как просигналить драйверу, что на таком-то порту появился девайс? Тоесть обмануть хаб, но при этом открыть порт и занять его, сообщив пиды, виды, намепродукта, энергопотребление ... Все остальное возложить на плечи системы. Пока ненагугливается ... Только про реальные девайсы.
Боюсь, что это невозможно. Порт - это аппаратная сущность. Если он эпоксидкой не залит, то при появлении там девайса всё равно пойдёт процесс... Только для классов поддерживаемых системой (mass storage, hid и т.д.). Класс берётся из bDeviceClass/bInterfaceClass. При этом, возможно, система сначала пытается таки по idVendor/idProduct найти более специфичный драйвер, но это точно не знаю.
Ну так и сделать придется ... Вот, об этом я и говорил. Так есть API для команды драйверу(?) - , а остальное пусть система пусть делает.
Документированных нет, это точно. Так просто не получится. Конфигурирование нового USB девайса весьма мудрёный процесс. Помимо кучи URB и IOCTL, которыми кидается система в этот момент, есть куча прямых интерфейсов к USB Bus Driver (usbhub.sys) и USB Port Driver (usbport.sys) http://msdn2.microsoft.com/en-us/library/ms790683.aspx.