Программирование драйверов Windows

         

Device Object, PDO, FDO


Объект устройства, объект физического устройства (Physical Device Object), объект функционального устройства (Functional Device Object). Абстракции, созданные для представления дееспособных единиц в драйверной архитектуре. Объекты физических устройств (далее будем обозначать их аббревиатурой 'PDO') создаются шинными драйверами, когда те находят подключенные к шине реальные (физические) устройства - для отображения самого факта их существования. Именно к PDO объектам, принадлежащих шинному драйверу, будут подключаться объекты функциональных устройств (далее будем обозначать их как 'FDO' либо 'объект-устройство') полноценных WDM драйверов. Объект FDO создается собственно драйвером обнаруженного устройства (при помощи вызова IoCreateDevice). Объект FDO может иметь свою "символьную ссылку" (symbolic link), по которой будет получать запросы от клиентов своего драйвера. Следует обратить внимание на то, что IRP запросы получает не драйвер (хотя, и он тоже), а именно FDO объект, созданный в драйвере: в каждую рабочую процедуру (Dispatch Routine) драйвера в качестве аргументов передается не только указатель на пакет IRP запроса, но и указатель на FDO, которому адресован этот запрос. В результате подключения FDO-объекта (что внутри драйвера устройства) к PDO-объекту (что внутри шинного драйвера) создается впечатление, что один драйвер подключается к другому. Отсюда и берет начало жаргонизм "стек драйверов"!

Те, кто не боится трудностей, может, например, создать в своем драйвере несколько FDO и получить для каждого символьные ссылки. Чего этим можно добиться? Например, можно предоставлять разным клиентам драйвера функционально разные услуги по доступу к обслуживаемому данным драйвером устройству — в зависимости от того, какую символьную ссылку использовал новый клиент при открытии драйвера.

Драйвер в-стиле-NT, который не обслуживает реального устройства или обслуживает не-PnP устройство, не получает никаких PDO ни от каких шинных драйверов. Однако он все равно создает FDO объект, хотя бы только для того, чтобы иметь символьную ссылку (symbolic link) для связи с внешним миром. Возможны возражения, что существуют способы, как "добраться" до драйвера и без символьной ссылки — по зарегистрированному им при помощи вызова IoRegisterDeviceInterface интерфейсу (в большинстве случаев — путь для тех, кто коллекционирует трудности), однако, в данном случае для регистрации интерфейса опять-таки необходимо иметь указатель на PDO объект! Иными словами, трудно представить себе драйвер, которому не нужен был бы свой FDO объект, — этакий живущий сам по себе обрывок кода режима ядра.



Содержание раздела