Когда создаются объекты устройств WDM?
В этом разделе описывается каждый тип объекта устройства и упоминается, когда они создаются.
На следующем рисунке показаны возможные типы объектов устройств, которые можно подключить в стеке устройств, представляющих драйверы, обрабатывающие запросы ввода-вывода для устройства.
Начиная с нижней части этого рисунка:
Водитель шины создает PDO для каждого устройства, которое он перечисляет в своей шине.
Драйвер шины создает PDO для дочернего устройства при перечислении устройства. Драйвер шины перечисляет устройство в ответ на запрос IRP_MN_QUERY_DEVICE_RELATIONSbusRelations от диспетчера PnP. Водитель шины создает PDO для дочернего устройства, если устройство было добавлено в шину с момента последнего ответа водителя автобуса на запрос отношений для BusRelations (или если это первый запрос к отношениям запросов с момента загрузки компьютера).
PDO представляет устройство для драйвера шины, а также для других системных компонентов режима ядра, таких как диспетчер питания, диспетчер PnP и диспетчер ввода-вывода.
Другие драйверы для устройства присоединяют объекты устройств поверх PDO, но PDO всегда находится в нижней части стека устройств.
Необязательные драйверы фильтров шины создают dos фильтра для каждого устройства, которое они фильтруют.
Когда диспетчер PnP обнаруживает новое устройство в списке BusRelations , он определяет, есть ли драйверы фильтров шины для устройства. В этом случае диспетчер PnP обеспечивает загрузку каждого такого драйвера (при необходимости вызывает DriverEntry ) и вызывает подпрограмму AddDevice драйвера. Если драйвер фильтра шины фильтрует операции для этого устройства, драйвер фильтра создает объект устройства и присоединяет его к стеку устройств в своей процедуре AddDevice . Если существует несколько драйверов фильтра шины и относится к этому устройству, каждый такой драйвер фильтра создает и присоединяет собственный объект устройства.
Необязательные драйверы фильтров нижнего уровня создают dos фильтра для каждого устройства, которое они фильтруют.
Если для этого устройства существует необязательный драйвер фильтра нижнего уровня, диспетчер 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.