Создание виртуального USB-устройства

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

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

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

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

4 ответов


Windows использует архитектуру подключи и играй. Когда вы вставляете 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 -> "Диспетчер устройств" или панель управления -> "Система" -> "оборудование" -> "Диспетчер устройств")
  • затем используйте меню "Вид", чтобы переключиться на"устройство по соединению"
  • открыть " ACPI [...] "- >"PCI bus" / "PCI Express Root Complex" ->" [...] USB.[ ..] Хост-Контроллер"
  • разверните любую из записей под хост-контроллером и для любого из устройств в списке, щелкните правой кнопкой мыши, чтобы получить их свойства, открытое на вкладке "Сведения", а затем использовать свойство выпадающем меню найдите "ИД оборудования", "совместимые ИД", "код экземпляра устройства", "соответствующий идентификатор устройства", "сервис" и т. д.

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

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

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

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

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

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

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

используйте структуру моделирования устройств (DSF).

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


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

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


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