Создание виртуального USB-устройства - PullRequest
18 голосов
/ 16 февраля 2011

Я новичок, изучающий, как писать драйверы устройств WDM для устройств USB, и обнаружил, что доступные материалы слишком сложны для понимания (онлайн-документ DDK является одним из самых трудных для чтения, а книгу драйверов устройств WDM -Один не лучше).

Итак, у меня есть простой вопрос.С чего начать, если я хочу создать виртуальное USB-устройство (например, виртуальную USB-мышь, которая выглядит как настоящая USB-мышь, подключенная к USB-порту) для тестирования / обучения.

Пока что я понимаюЭто драйвер HIDClass (hidclass.sys) имеет мини-драйвер для шины USB (hidusb.sys), который выполняет перечисление подключенного оборудования USB.Итак, если я хочу перехватить процесс перечисления оборудования и создать свое собственное виртуальное оборудование, должен ли я где-то включить драйвер фильтра для перехвата некоторых IRP, связанных с процессом перечисления оборудования?

Извините, если вышеприведенное не имеет смыславообще, так как я все еще нахожусь в стадии обучения, и это на самом деле одно из упражнений, которое, я думаю, могло бы помочь мне лучше узнать о написании драйверов устройств USB.

Ответы [ 4 ]

20 голосов
/ 07 марта 2011

Windows использует архитектуру Plug and Play.Когда вы вставляете USB-устройство, оно отправляет низкоуровневый USB-запрос на устройство, а затем на основе ответа от устройства решает, какой драйвер загрузить.Сопоставление выполняется путем сравнения идентификатора поставщика, идентификатора продукта и т. Д. С разделами inf-файлов.Драйверы поставляются в виде скомпилированного файла xxx.sys с файлом xxx.inf и загружаются в пространство ядра.Windows решает, какой xxx.sys загрузить, основываясь на файле * .inf, который поставляется с драйвером устройства.

Эти файлы имеют следующие разделы:

[Manufacturer]
%Manufacturer% = DeviceInstall

[DeviceInstall]
"some usb dev"=OTHER_SECTION_DEV, USB\Vid_XXXX&Pid_yyyy

# This is where windows learns to match this information
# to your device, using the product id (Pid) and the 
# vendor id (Vid) that Windows gets back during the
# low level USB DeviceDescriptor request

[OTHER_SECTION_DEV]
CopyFiles = xxx.sys, 10,system32\drivers

(более подробное описаниечто в inf файлах можно найти на https://docs.microsoft.com/en-us/windows-hardware/drivers/install/inf-manufacturer-section)

Подробное описание процесса перечисления USB (используйте USB-регистратор):

  • USB-устройство подключено
  • Запрос драйвера USB-шины
    • GetDescriptor (устройство)
    • GetDescriptor (Конфигурация)
    • GetDescriptor (String iSerialNumber), используемый в качестве идентификатора экземпляра устройства
    • GetDescriptor (String iProduct), используемый в всплывающих окнах «Обнаружено новое оборудование»
  • Диспетчер PNP (Plug and Play) информируется о том, что драйверы шины добавили устройство.
  • Затем диспетчер PNP запрашивает у драйвера шины информацию об устройстве, используяЗапрос PNP с запросом:
    • строка DeviceID, представляющая поставщика USB и идентификатора продукта,
    • строка HardwareIDs,
    • строка CompatibleIDs, представляющая класс интерфейса USB-устройства, подкласс иПротокол и
    • Строка InstanceID, представляющая uid для этого конкретного устройства в наборе всех экземпляров с одинаковым совместимым идентификатором, подключенным к компьютеру.

Для любого подключенного USB-устройства вы можете увидеть эти строки с помощью диспетчера устройств:

  • Откройте диспетчер устройств (меню Windows -> «Диспетчер устройств» илиПанель управления -> «Система» -> «Оборудование» -> «Диспетчер устройств»)
  • , а затем с помощью меню «Вид» переключитесь в «Устройство по подключению»
  • open »ACPI [...] "->" Шина PCI "/" Корневой комплекс PCI Express "->" [...] Хост-контроллер USB [...] "
  • развернуть любую запись в хост-контроллереи для любого из перечисленных устройств щелкните правой кнопкой мыши, чтобы получить их свойства, откройте вкладку «Сведения», а затем используйте раскрывающееся меню свойств, чтобы найти «Аппаратные идентификаторы», «Совместимые идентификаторы», «Идентификатор экземпляра устройства», «Соответствие».«Идентификатор устройства», «Сервис» и т. Д.

Например, у меня есть USB-накопитель с подключенным Device Id = usb\class_08&subclass_06&prot_50, и эту строку можно сопоставить с добавленным файлом .infв список известных устройств после первого перечисления.Этот файл имеет строку Service = USBSTOR, и поэтому мы знаем, что usbstor.sys используется для взаимодействия с этим USB-накопителем.

Давайте продолжим процесс сопоставления.

  • Диспетчер PNP пытается определить, было ли устройство уже «установлено»:
    • Он ищет в реестре ключ, соответствующий «идентификатору устройства», чтобы узнать, какая служба обрабатывает взаимодействие с этим устройством.В частности, он ищет это в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

Для диска на ключе вы можете увидеть что-то вроде:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_5406\0775555ACA54ADE3]
"Service"="USBSTOR"
  • PNPЗатем Manager загружает связанный драйвер на основе совпадения строк в запросах PNP и данных из базы данных .inf: база данных
    • inf, расположенная в папке: C: \ WINDOWS \ inf \
    • drivers.Расположенные sys файлы: C: \ WINDOWS \ system32 \ drivers
  • Если PNP не может найти подходящую строку, вы получите приглашение указать путь к xxx.sys и xxx.inf

Для написания драйверов мой совет:

  1. Не начинайте с реализации устройств HID (устройства с человеческим интерфейсом), потому что вы можете заставить Windows использовать ваш собственный драйвер вместо мыши или клавиатуры вместооригинальный драйвер, это отключит вашу мышь или клавиатуру, очень опасно.
  2. Не загружайте драйверы в вашу машину разработчика:
    1. используйте виртуальную машину и устанавливайте там свои драйверы.Установите отладчик ядра для вашей виртуальной машины: http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
    2. или загрузите драйверы на другой тестовой машине.
  3. Хорошей платформой обучения для драйверов USB является "OSR USB-FX2 Learning Kit "
4 голосов
/ 13 декабря 2012

Использование Device Simulation Framework (DSF).

http://msdn.microsoft.com/en-us/library/windows/hardware/gg454516.aspx

2 голосов
/ 30 августа 2014

Вы можете использовать проект USB / IP для эмуляции любого устройства, которое вы хотите.В своем блоге я продемонстрировал, как эмулировать устройство USB Mouse в python, используя проект USB / IP: http://breaking -the-system.blogspot.com / 2014/08 / emulation-usb-devices-in-python-with-no.html

Это не поможет вам понять, как создать виртуальное устройство USB (процесс выполняется в драйвере USB / IP, вы можете прочитать код), но он создаствиртуальное устройство USB HID, и вы можете играть с аргументами HID, отправленными на драйвер USB.

1 голос
/ 16 февраля 2011

Разве не имеет смысла указывать свой собственный тип шины и счетчик?

...