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
Для написания драйверов мой совет:
- Не начинайте с реализации устройств HID (устройства с человеческим интерфейсом), потому что вы можете заставить Windows использовать ваш собственный драйвер вместо мыши или клавиатуры вместооригинальный драйвер, это отключит вашу мышь или клавиатуру, очень опасно.
- Не загружайте драйверы в вашу машину разработчика:
- используйте виртуальную машину и устанавливайте там свои драйверы.Установите отладчик ядра для вашей виртуальной машины: http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
- или загрузите драйверы на другой тестовой машине.
- Хорошей платформой обучения для драйверов USB является "OSR USB-FX2 Learning Kit "