Когда создаются объекты устройств WDM?

В этом разделе описывается каждый вид объекта устройства и приводится информация о времени создания каждого из них.

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

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

Начиная с нижней части этого рисунка:

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

    Драйвер шины создает PDO для дочернего устройства при перечислении устройства. Драйвер шины перечисляет устройство в ответ на запрос IRP_MN_QUERY_DEVICE_RELATIONS для BusRelations от диспетчера PnP. Драйвер шины создает PDO для дочернего устройства, если устройство было добавлено в шину с момента последнего ответа драйвера шины на запрос операций для BusRelations (или если это первый запрос операций после загрузки компьютера).

    PDO представляет устройство водителю шины, а также другим компонентам системы режима ядра, таким как диспетчер питания, диспетчер PnP и диспетчер ввода-вывода.

    Другие драйверы устройства подключают объект устройства поверх PDO, но PDO всегда находится в нижней части стека устройств.

  • Необязательные драйверы фильтров шины создают DOS для каждого устройства, которое они фильтруют.

    Когда диспетчер PnP обнаруживает новое устройство в списке BusRelations , он определяет наличие драйверов фильтров шины для устройства. Если это так, для каждого такого драйвера диспетчер PnP гарантирует загрузку (вызывает DriverEntry при необходимости) и вызывает подпрограмму AddDevice драйвера. Если драйвер фильтра шины фильтрует операции для этого устройства, драйвер фильтра создает объект устройства и присоединяет его к стеку устройств в подпрограмме AddDevice . Если существует более одного драйвера фильтра шины и который имеет отношение к этому устройству, каждый такой драйвер фильтра создает и присоединяет свой собственный объект устройства.

  • Необязательные драйверы фильтров нижнего уровня создают фильтрующие ОЗУ для каждого устройства, которое они фильтруют.

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

  • Драйвер функции создает FDO для устройства.

    Диспетчер PnP гарантирует, что драйвер функции для устройства загружается и вызывает подпрограмму AddDevice драйвера функции. Драйвер функции создает FDO и присоединяет его к стеку устройств.

  • Необязательные драйверы фильтров верхнего уровня создают фильтр DO для каждого устройства, которое они фильтруют.

    Если для устройства существуют какие-либо необязательные фильтрующие драйверы верхнего уровня, диспетчер PnP гарантирует, что они загружаются после функционального драйвера и вызывает их подпрограммы AddDevice. Каждый такой драйвер фильтра присоединяет объект устройства к стеку устройств.

В итоге стек устройств содержит объект устройства для каждого драйвера, который участвует в обработке ввода-вывода на определенное устройство. Родительский драйвер шины имеет PDO, драйвер-функция имеет FDO, а каждый дополнительный драйвер фильтра имеет фильтр DO.

Обратите внимание, что все устройства, адаптер шины или контроллеры и устройства, отличные от шины, имеют PDO и FDO в стеке устройств. PDO для адаптера или контроллера шины создается драйвером шины для родительской шины. Например, если адаптер SCSI подключается к шине PCI, драйвер шины PCI создает PDO для адаптера SCSI.

Если устройство используется в необработанном режиме, нет драйверов функций или фильтров (без FDO или фильтрации DOs). Существует только PDO для родительского водителя шины и ноль или более фильтров шины DOS.

Подробнее о том, какие подпрограммы драйверов отвечают за создание и присоединение объектов устройств, см. в статье Создание объекта устройства.

Стек устройств плюс некоторые дополнительные сведения составляют devnode для устройства. Менеджер PnP хранит информацию в узле устройства devnode, например, о том, запущено ли устройство, и какие драйверы, если таковые имеются, зарегистрированы для уведомления об изменениях на устройстве. Команда отладчика ядра !devnode отображает сведения о devnode.