Основные понятия WDM для драйверов WDF
Windows Driver Framework (WDF) — это оболочка для интерфейсов модели драйверов Microsoft Windows (WDM). Хотя платформа упрощает многие концепции WDM и полностью скрывает другие, чтобы с ними не нужно было работать, все же следует понимать некоторые основные понятия драйверов WDM. В частности, следует понимать типы драйверов, стеки драйверов, стеки устройств и пакеты запросов ввода-вывода.
Типы драйверов
Драйверы на базе Windows делятся на три типа: водители автобусов, водители функций и драйверы фильтров. Водители автобусов поддерживают шины ввода-вывода, обнаруживая дочерние устройства, подключенные к родительской шине, и сообщая об их характеристиках. (Это действие называется перечислением шины.) Драйверы функций управляют операциями ввода-вывода для устройств и автобусов. Драйверы фильтрации получают, просматривают и, возможно, изменяют данные, которые передаются между пользовательскими приложениями и драйверами или между отдельными драйверами.
Водители автобусов по сути являются водителями-функциями, которые также перечисляют дочерние элементы. Водитель выступает в качестве "водителя автобуса" при перечислении дочерних устройств в шине. В противном случае тот же драйвер выступает в качестве "драйвера функций" для шины при обработке операций ввода-вывода, которые обращаются к оборудованию адаптера шины.
Драйвер User-Mode Driver Framework (UMDF) не может быть водителем автобуса.
Стеки драйверов
В операционной системе Windows драйверы WDM размещаются в вертикальной последовательности вызовов, которая называется стеком драйверов. Самый верхний драйвер в стеке обычно получает запросы ввода-вывода от пользовательских приложений после того, как запросы проходят через диспетчер ввода-вывода операционной системы. Нижние уровни драйверов обычно взаимодействуют с оборудованием компьютера.
Простой стек драйверов содержит драйвер шины в нижней части стека, который обрабатывает операции ввода-вывода для конкретной шины и перечисляет дочерние устройства, подключенные к нему. Как правило, один или несколько драйверов функций для конкретного устройства находятся выше драйвера автобуса. Эти драйверы функций обрабатывают операции ввода-вывода на устройствах, подключенных к шине. Драйверы фильтров могут находиться выше драйверов функций или находиться между драйвером шины и драйвером-функцией. В работающей системе есть несколько стеков драйверов, поддерживающих различные типы устройств.
Стеки устройств
Каждый стек драйверов поддерживает один или несколько стеков устройств. Стек устройств — это набор объектов устройств , созданных из структур, определяемых WDM DEVICE_OBJECT . Каждый стек устройств представляет одно устройство. Каждый драйвер создает объект устройства для каждого из своих устройств и присоединяет каждый объект устройства к стеку устройств. Стеки устройств создаются и удаляются по мере подключения и отключения устройств, а также при каждой перезагрузке системы.
Когда водитель шины обнаруживает, что дочерние устройства были подключены или отключены, он сообщает диспетчеру Plug and Play (PnP). В ответ диспетчер PnP просит водителя шины создать объект физического устройства (PDO) для каждого дочернего устройства, подключенного к родительскому устройству (т. е. шине). PDO становится нижней частью стека устройств.
Затем диспетчер PnP загружает драйверы функций и фильтров для поддержки каждого устройства (если они еще не загружены), а затем диспетчер PnP вызывает эти драйверы, чтобы каждый из них смог создать объект устройства и добавить его в верхнюю часть стека устройств. Драйверы функций создают объекты функциональных устройств (FDO), а драйверы фильтров — объекты фильтров устройств (фильтрация DOS).
Когда диспетчер ввода-вывода отправляет запрос ввода-вывода драйверам устройства, он передает его драйверу, создающему самый верхний объект устройства в стеке устройств. Если этот драйвер просит диспетчера ввода-вывода передать запрос драйверу следующего уровня, диспетчер операций ввода-вывода использует стек устройств для определения следующего ниже драйвера. (Драйвер next-lower — это драйвер, создавший объект устройства следующего уровня ниже.)
WDF создает объект устройства платформы для каждого объекта устройства WDM. Драйверы на основе платформы обращаются к этим объектам устройств платформы, а не к объектам устройств WDM.
Пакеты запросов ввода-вывода
Диспетчер ввода-вывода отправляет запросы на ввод-вывод приложения к драйверам, создавая пакеты запросов ввода-вывода (IRP). IRP может содержать запрос на выполнение операции ввода-вывода (например, операции чтения и записи) или запрос на выполнение действия элемента управления вводом-выводом (IOCTL) (например, возврат состояния). Кроме того, диспетчер PnP создает irp, представляющие операции PnP и управления питанием, которые должны выполнять драйверы, и отправляет эти IRP в драйверы.
Как правило, диспетчер ввода-вывода создает IRP для чтения или записи, когда пользовательское приложение запрашивает операцию чтения или записи. Диспетчер ввода-вывода передает IRP драйверу в верхней части стека драйверов, и этот драйвер либо обслуживает запрос, либо передает запрос следующему драйверу ниже. Некоторые запросы перемещаются в нижнюю часть стека, а некоторые полностью обрабатываются драйверами более высокого уровня.
Каждый раз, когда драйвер получает IRP, драйвер также получает указатель на объект устройства, который представляет устройство, которое должно обрабатывать операцию. Таким образом, драйверы в стеке драйверов используют объекты устройств, чтобы определить, к какому из подключенных устройств должен отправляться конкретный запрос.
Драйверы WDF обычно не обращаются напрямую к IRP. Платформа преобразует WDM IRP, которые представляют операции управления операциями чтения, записи и ввода-вывода устройств, в объекты запроса платформы, которые Kernel-Mode драйверы платформы драйверов (KMDF) и UMDF получают в очередях ввода-вывода. Платформа обрабатывает PnP и irP управления питанием внутренне и использует функции обратного вызова событий для информирования драйвера о событиях PnP и питания.