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


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

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

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

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

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

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

    Драйвер корневой шины перечисляет внутреннюю системную шину (корневую шину) и создает PDO для каждого найденного устройства. Один из этих PDOs предназначен для шины 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 создает PDOs для своих дочерних устройств в рамках своих обязанностей в качестве водителя шины для шины PCI.

    Диспетчер PnP определяет пару миниклассов и классов драйвера контроллера USB хоста в качестве функционального драйвера контроллера USB хоста и загружает эту пару драйверов. Диспетчер PnP вызывает пару драйверов в соответствующее время для создания и подключения FDO для контроллера USB-хоста.

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

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

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

    Этот пример не включает фильтрующие драйверы для USB-концентратора.

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

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

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

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

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

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

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

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

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