logo search
Протоколирование обмена информацией между компьютером и внешним запоминающим USB-устройством

1.4.1 Драйверные слои

Согласно перечисленным выше типам драйверов, существует три типа
объектов:

· Объекты физических устройств (PDO, Physical Device Object) - эти объекты создаются для каждого физически идентифицируемого элемента аппаратуры, подключенного к шине данных;

· Объекты функциональных устройств (FDO, Functional Device Object) - подразумевает единицу логической функциональности устройства;

· Объекты фильтров устройств (FiDO, Filter Device Object) - предоставляют дополнительную функциональность.

В Windows NT 5 последовательность загрузки драйверов устройств такая:

1. Во время загрузки операционной системы производится загрузка шинных драйверов для каждой известной системе шины (список шин создается при установке операционной системы и сохраняется в реестре);

2. Вызывается DriverEntry, а затем AddDevice для каждого шинного драйвера. В AddDevice создается FDO для драйвера системной шины. Затем на созданный FDO отправляется запрос IRP_MN_START_DEVICE;

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

4. На каждый PDO посылается запрос IRP_MN_QUERY_DEVICE_RELATION, в ответ на который шинный драйвер возвращает идентификаторы всех найденных устройств;

5. На эти PDO посылают запрос IRP_MN_QUERY_ID, в ответ на который драйвер системной шины сообщает идентификаторы этих устройств;

6. Получив идентификаторы, система пытается найти и загрузить драйверы устройств;

7. Найдя драйвер для устройств, система загружает его в память, вызывая его DriverEntry. Потом вызывается AddDevice, где создается FDO для устройства. Если устройств, управляемых этим драйвером, несколько, то AddDevice будет вызвана для каждого устройства. Если в реестре зарегистрированы дополнительные фильтры, то они также загружаются в память. Затем система посылает на FDO запрос IRP_MN_START_DEVICE;

8. Происходит посылка на FDO запроса IRP_MN_QUERY_DEVICE_RELATIONS. Если устройство само является шиной или держит на себе другие устройства, которыми само не управляет, то для устройства на нем повторяется вся последовательность действий, начиная с пункта 5.

Функция AddDevice, вызываемая для каждого FDO, вызывает IoCreateDevice и IoAttachDeviceToStack, обеспечивая построение стека устройств. Стек устройств обеспечивает прохождение запросов от пользовательских программ до аппаратного (нижнего) уровня драйверов (Рис. 1.4.1.1).

Рис. 1.4.1.1 Стек устройств

Из вышесказанного становится понятным, что разрабатываемый драйвер должен являться драйвером-фильтром нижнего уровня, связанным с клиентским драйвером USB_накопителя. Необходимость работы с клиентским USB_драйвером объясняется тем, что именно на этом уровне перехватываемая информация обладает требуемой структурированностью - передаются именно файлы, а не блоки информации (кадры или составленные из них транзакции), определяемые протоколом обмена по USB.