Поделиться через


Пример стека устройств WDM

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

На следующем рисунке показаны объекты устройств, созданные примерами драйверов, описанными в разделе Уровни драйверов WDM: пример.

схема, иллюстрирующая пример слоев объектов устройства wdm для usb-джойстика.

Начиная с нижней части этого рисунка объекты устройств в примерах стеков устройств включают:

  1. PDO и FDO для шины PCI.

    Драйвер корневой шины перечисляет внутреннюю системную шину (корневую шину) и создает PDO для каждого найденного устройства. Один из таких PDO предназначен для шины PCI. (PDO и FDO для корневой шины не показаны на рисунке.)

    Диспетчер PnP определяет драйвер PCI в качестве драйвера функции для шины PCI, загружает драйвер (если он еще не загружен) и передает PDO драйверу PCI. В своей процедуре AddDevice драйвер PCI создает FDO для шины PCI (IoCreateDevice) и присоединяет FDO к стеку устройств (IoAttachDeviceToDeviceStack) для шины PCI. Драйвер PCI создает и присоединяет это FDO в рамках своих обязанностей в качестве драйвера функций для шины PCI.

    В этом примере отсутствуют драйверы фильтров для шины PCI.

  2. PDO и FDO для USB-контроллера узла.

    Диспетчер PnP направляет драйвер PCI на запуск устройства (IRP_MN_START_DEVICE), а затем запрашивает у драйвера PCI дочерние элементы (IRP_MN_QUERY_DEVICE_RELATIONS с типом связи BusRelations). В ответ драйвер PCI перечисляет устройства в своей шине. В этом примере драйвер PCI находит контроллер узла USB и создает PDO для этого устройства. Широкая стрелка на рисунке указывает, что контроллер узла USB является "дочерним" для шины PCI. Драйвер PCI создает PDO для своих дочерних устройств в рамках своих обязанностей в качестве водителя автобуса PCI.

    Диспетчер PnP идентифицирует пару мини-класса и драйвера класса USB-контроллера узла в качестве драйвера функции для контроллера УЗЛА USB и загружает пару драйверов. Диспетчер PnP вызывает пару драйверов в соответствующее время, чтобы создать и подключить FDO для usb-контроллера узла.

    В этом примере отсутствуют драйверы фильтров для usb-контроллера узла.

  3. PDO и FDO для USB-концентратора.

    Контроллер узла USB перечисляет шину, находит USB-концентратор в единственном порту и создает PDO для концентратора. Драйвер USB-концентратора создает и подключает FDO для концентратора.

    В этом примере нет драйверов фильтров для USB-концентратора.

  4. PDO, FDO и два DOS фильтра для устройства джойстика.

    Драйвер USB-концентратора перечисляет шину, находит устройство HID (джойстик) и создает PDO для джойстика.

    В этом примере в реестре для джойстиков настроен драйвер фильтра более низкого уровня, поэтому диспетчер PnP загружает драйвер фильтра. Драйвер фильтра определяет, что он относится к устройству, и создает и присоединяет фильтр DO к стеку устройств.

    Диспетчер PnP определяет, что драйвер-функция для джойстика является парой драйверов класса HID и миникласса, и загружает эти драйверы. Пара драйверов состоит из драйвера мини-класса, связанного с библиотекой DLL драйвера класса; вместе они действуют как один драйвер функции для устройства. Пара драйверов класса и миникласса создает один объект устройства ( FDO) и присоединяет его к стеку устройств.

    Драйвер фильтра верхнего уровня создает и присоединяет фильтр DO к стеку устройств, аналогично фильтру нижнего уровня.

Обратите внимание, что PDO, созданная драйвером родительской шины, всегда находится в нижней части стека устройств для определенного устройства. Когда водители обрабатывают PnP или irP питания, они должны передавать каждый IRP весь путь вниз по стеку устройств PDO и связанному с ним драйверу шины.

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

схема, иллюстрирующая образцы уровней объектов устройства с точки зрения драйвера.

Водитель автобуса охватывает несколько стеков устройств. Драйвер шины создает FDO для адаптера или контроллера шины и создает PDO для каждого из своих дочерних устройств.