Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Windows Driver Frameworks (WDF) — это оболочка для интерфейсов microsoft Windows Driver Model (WDM). Хотя платформа упрощает множество концепций WDM и скрывает другие полностью, чтобы вам не нужно работать с ними, следует по-прежнему понимать некоторые основные понятия драйверов WDM. В частности, следует понимать типы драйверов, стеки драйверов, стеки устройств и пакеты запросов ввода-вывода.
Типы драйверов
Драйверы на основе Windows делятся на три типа: водители шины, драйверы функций и драйверы фильтров. Водители автобусов поддерживают автобусы ввода-вывода, обнаруживая дочерние устройства, подключенные к родительской шине и сообщая о своих характеристиках. (Это действие называется перечислением шины.) Драйверы функций управляют операциями ввода-вывода для устройств и шин. Драйверы фильтров получают, просматривают и могут изменять данные, которые передаются между пользовательскими приложениями и драйверами или между отдельными драйверами.
Водители для автобусов по сути являются водителями функций, которые также перечисляют детей. Водитель выступает в качестве "водителя автобуса", когда перечисляет дочерние устройства на автобусе. В противном случае тот же драйвер действует как "драйвер функции" для шины при обработке операций ввода-вывода, которые обращаются к оборудованию адаптера шины.
Драйвер User-Mode Driver Framework (UMDF) не может быть водителем автобуса.
Стеки драйверов
В операционной системе Windows драйверы WDM организованы в вертикальной цепочке вызовов, которая называется стеком драйверов. Самый верхний драйвер в стеке обычно получает запросы ввода-вывода от пользовательских приложений после прохождения запросов через диспетчер ввода-вывода операционной системы. Более низкие уровни драйверов обычно взаимодействуют с компьютерным оборудованием.
Простой стек драйверов включает драйвер шины в нижней части стека, который обрабатывает операции ввода-вывода для шины и перечисляет дочерние устройства, подключенные к нему. Как правило, один или несколько драйверов функций устройства находятся выше драйвера шины. Эти драйверы функций обрабатывают операции ввода-вывода на устройства, подключенные к шине. Драйверы фильтров могут быть выше драйверов функций или могут находиться между водителем шины и драйвером функций. В работающей системе есть несколько стеков драйверов, поддерживающих различные типы устройств.
Стеки устройств
Каждый стек драйверов поддерживает один или несколько стеков устройств. Стек устройств — это набор объектов устройств , созданных из определенных WDM DEVICE_OBJECT структур. Каждый стек устройств представляет одно устройство. Каждый драйвер создает объект устройства для каждого устройства и присоединяет каждый объект устройства к стеку устройств. Стеки устройств создаются и удаляются при подключении и отмене подключения устройств при каждом перезапуске системы.
Когда драйвер шины обнаруживает, что дочерние устройства подключаются или отключаются, он сообщает об этом менеджеру Plug and Play (PnP). В ответ диспетчер PnP просит драйвера шины создать объект физического устройства (PDO) для каждого дочернего устройства, подключенного к родительскому устройству, то есть шине. PDO становится нижней частью стека устройств.
Затем диспетчер PnP загружает драйверы функций и фильтров для поддержки каждого устройства (если они еще не загружены), а диспетчер PnP вызывает эти драйверы, чтобы каждый из них смог создать объект устройства и добавить его в верхнюю часть стека устройств. Функциональные драйверы создают функциональные объекты устройств (FDOs), а драйверы фильтров создают объекты фильтрующих устройств (filter DOs).
Когда диспетчер ввода-вывода отправляет запрос ввода-вывода драйверам устройства, он передает запрос драйверу, создающему самый верхний объект устройства в стеке устройств. Если этот драйвер просит диспетчера ввода-вывода передать запрос следующему драйверу ниже, диспетчер ввода-вывода использует стек устройств для определения следующего ниже драйвера. (Следующий ниже драйвер — драйвер, создавший следующий объект устройства ниже.)
WDF создает объект устройства каркаса для каждого объекта устройства WDM. Драйверы на основе фреймворка обращаются к этим объектам устройств фреймворка вместо объектов устройств WDM.
Пакеты запросов ввода-вывода
Диспетчер операций ввода-вывода отправляет запросы на ввод-вывод приложения драйверам путем создания пакетов запросов ввода-вывода (IRPs). IRP может содержать запрос на выполнение операции ввода-вывода (например, операции чтения и записи) или запроса на выполнение действия элемента управления ввода-вывода (IOCTL) (например, возвращающего состояние). Кроме того, диспетчер PnP создает irPs, представляющие операции управления PnP и питанием, которые должны выполнять драйверы, и отправляет эти irPs драйверам.
Как правило, диспетчер операций ввода-вывода создает IRP для чтения или записи, когда пользовательское приложение запрашивает операцию чтения или записи. Диспетчер ввода-вывода передает IRP драйверу в верхней части стека драйверов, и этот драйвер либо обслуживает запрос, либо передает запрос следующему драйверу. Некоторые запросы отправляются в нижней части стека, и некоторые из них полностью обрабатываются драйверами более высокого уровня.
Каждый раз, когда драйвер получает IRP, драйвер также получает указатель на объект устройства, представляющий устройство, которое должно обрабатывать операцию. Таким образом, драйверы в стеке драйверов используют объекты устройств, чтобы определить, к каким из подключенных устройств должен перейти конкретный запрос.
Драйверы WDF обычно не обращаются непосредственно к IRP. Платформа преобразует IRP WDM, которые представляют операции чтения, записи и управления вводом-выводом устройств, в объекты запросов платформы, которые Kernel-Mode Driver Framework (KMDF) и драйверы UMDF получают в очередях ввода-вывода. Платформа обрабатывает IRP для Plug and Play и управления питанием внутренне и использует функции обратного вызова событий для информирования драйвера о событиях Plug and Play и управления питанием.