Виртуальное USB-устройство

Тема в разделе "WASM.NT.KERNEL", создана пользователем leeloo, 25 май 2007.

  1. leeloo

    leeloo New Member

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

    Речь вот о чем - как программно сообщить ОС , что воткнули флешку (на самом деле ничего не втыкать).
    Например есть GUI с кнопкой - жмем кнопку ... и в винде "всплывает" балун - "найдено новое устройство"...

    Что-то похожее было здесь

    Подскажите.
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Что происходит при подключении USB-джойстика, описано подробно тут
    Adding a PnP Device to a Running System
    для флешек примерно то же самое + монтирование тома.
    Насчет виртуальных USB-устройств ничего умного сказать не могу.
     
  3. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Там несовсем то написано...

    Перефразирую вопрос - нужно эмулировать присоединение устройства (втыкание флешки), остальную работу пусть делает винда(установка драйвера).
    Я заполняю структуры:

    Код (Text):
    1. DEVICE DESCRIPTOR:
    2.     BYTE  bLength:                  0x12
    3.     BYTE  bDescriptorType:          0x01
    4.     WORD  bcdUSB:                   0x0200
    5.     BYTE  bDeviceClass:             0xEF
    6.     BYTE  bDeviceSubClass:          0x02
    7.     BYTE  bDeviceProtocol:          0x01
    8.     BYTE  bMaxPacketSize0:          0x40
    9.     WORD  idVendor:                 0x045E
    10.     WORD  idProduct:                0xFFFF
    11.     WORD  bcdDevice:                0x0100
    12.     BYTE  iManufacturer:            0x01
    13.     WORD  iProduct:                 0x02
    14.     WORD  iSerialNumber:            0x02
    15.     BYTE  bNumConfigurations:       0x01
    16. -------------------------
    17. CONFIGURATION DESCRIPTOR:
    18.     BYTE  bLength:                  0x09
    19.     BYTE  bDescriptorType:          0x02
    20.     WORD  wTotalLength:             0x....
    21.     BYTE  bNumInterface:            0x03
    22.     BYTE  bConfigurationValue:      0x01
    23.     BYTE  iConfiguration:           0x01
    24.     BYTE  bmAttributes:             0x80 (BUS Powered)
    25.     BYTE  bMaxPower:                0x19 (50 mA)
    26. -------------------------
    27. INTERFACE ASSOCIATION DESCRIPTOR:
    28.     BYTE  bLength:                  0x08
    29.     BYTE  bDescriptorType:          0x0B
    30.     BYTE  bFirstInterface:          0x00
    31.     BYTE  bInterfaceCount:          0x02
    32.     BYTE  bFunctionClass:           0x0E
    33.     BYTE  bFunctionSubClass:        0x03
    34.     BYTE  bFunctionProtocol:        0x00
    35.     BYTE  iFunction:                0x04
    и что-то там еще, жму кнопку в программе - ВОТ ЗДЕСЬ что нужно делать(?)
    Открыть (присоединиться) свободный USB - порт и послать туда какие-то байты.

    Отсюда вопросы - как система определяет, что якобы появился новый девайс в USB , как сообщить iProduct и idVendor, чтоб потом поставить нужные драйвера.

    Может быть при появлении питания на флешке, она выдает команду в USB ...
    Так вот, что это за команда - хочу реализовать в программе. Где почитать?

    Гм. Может топик не для этой ветки - перенесите в электронику.
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    USB порт имеет 4 провода: 2 питание, 2 собственно шина. Оба шинных провода подтянуты резисторами к цепям питания. При втыкании девайса в порт, баланс сопротивлений резко меняется и получается электрический импульс. Хаб аппаратно это видит и сигналит драйверу. Точнее драйвер опрашивает какие-то регистры хаба (кажется... точно не помню). Драйвер создает PDO для нового девайса и сигналит системе, через вызов IoInvalidateDeviceRelations, о том, что появился новый девайс и, типа, "давай ищи и загружай для него дрова". Дальше нечинает работать подсистема PnP, как описано по ссылке выше.

    Т.о., чтобы программно сделать то, что ты хочешь, нужно создать PDO, вызвать IoInvalidateDeviceRelations, и ловить все запросы от системы, подсовывая ей нужную инфу. Возможно, придется эмулировать не только одно устройство, а весь хост-контроллер и корневой хаб. Как это сделать - не знаю.

    Инфа по USB легко гуглится. И на русском тоже много чего есть, например:
    http://www.is.svitonline.com/vks/Links/Article/USB_intro.html

    Вряд ли. Тебе ведь чисто программно надо эмулировать, т.е. из драйвера.
     
  5. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    При втыкании реального девайса - загружается стандартный драйвер, а потом уже требуется дрова мануфактурера. Так вот, как просигналить драйверу, что на таком-то порту появился девайс? Тоесть обмануть хаб, но при этом открыть порт и занять его, сообщив пиды, виды, намепродукта, энергопотребление ... Все остальное возложить на плечи системы.

    Пока ненагугливается ... Только про реальные девайсы.
     
  6. Four-F

    Four-F New Member

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

    Только для классов поддерживаемых системой (mass storage, hid и т.д.). Класс берётся из bDeviceClass/bInterfaceClass. При этом, возможно, система сначала пытается таки по idVendor/idProduct найти более специфичный драйвер, но это точно не знаю.
     
  7. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Ну так и сделать придется ...
    Вот, об этом я и говорил. Так есть API для команды драйверу(?) -
    , а остальное пусть система пусть делает.
     
  8. Four-F

    Four-F New Member

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

    Так просто не получится. Конфигурирование нового USB девайса весьма мудрёный процесс.

    Помимо кучи URB и IOCTL, которыми кидается система в этот момент, есть куча прямых интерфейсов к USB Bus Driver (usbhub.sys) и USB Port Driver (usbport.sys) http://msdn2.microsoft.com/en-us/library/ms790683.aspx.
     
  9. leeloo

    leeloo New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2004
    Сообщения:
    31
    Ok буду разбираться.
     
  10. _bloom

    _bloom New Member

    Публикаций:
    0
    Регистрация:
    21 авг 2006
    Сообщения:
    35
    Извиняюсь за глупый вопрос.
    Но по какому принципу работают тогда эмуляторы USB-донглов ?
     
  11. Ra_

    Ra_ New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    289