Поделиться через


Различия между WDM и WDF

Модель WDM тесно связана с операционной системой. Драйверы взаимодействуют непосредственно с операционной системой, вызывая подпрограммы системной службы и управляя структурами операционной системы. Так как драйверы WDM являются доверенными компонентами режима ядра, система обеспечивает ограниченные проверки ввода драйвера.

В сравнении модель Windows Driver Frameworks (WDF) фокусируется на требованиях драйвера, а библиотека платформы обрабатывает большинство взаимодействий с системой.

Платформа перехватывает запросы ввода-вывода, выполняет действия по умолчанию и вызывает обратные вызовы драйвера по мере необходимости. Модель WDF является объектной и управляемой событиями. Объекты представляют общие конструкции драйверов, такие как устройство, блокировка или очередь. Драйвер Kernel-Mode Driver Framework (KMDF) или драйвер User-Mode Driver Framework (UMDF) содержит точку входа (DriverEntry), функции обратного вызова, связанные с событиями, необходимые для обслуживания устройства и поддержки операций ввода-вывода, и любые дополнительные внутренние служебные функции, от которых зависит реализация.

В этом разделе описываются важные различия между WDM и WDF в следующих областях:

Структура драйверов

Драйверы WDM и WDF содержат подпрограмму DriverEntry, ряд подпрограмм, которые вызываются для обработки конкретных запросов ввода-вывода и различных подпрограмм поддержки.

В драйвере WDM подпрограммы диспетчеризации ввода-вывода соответствуют определённым основным кодам IRP. Диспетчерские подпрограммы получают IRP от менеджера ввода-вывода, анализируют их и соответствующим образом реагируют.

В драйвере WDF фреймворк регистрирует собственные процедуры диспетчеризации, которые получают IRP от диспетчера ввода-вывода, анализируют их, а затем вызывают функции обратного вызова событий драйвера для их обработки. Функции обратного вызова событий обычно выполняют более конкретную задачу, чем общие подпрограммы отправки ввода-вывода драйвера WDM.

Типичный драйвер WDF для устройства Plug and Play содержит следующее:

  • Подпрограмма DriverEntry.
  • Подпрограмма EvtDriverDeviceAdd, которая аналогична подпрограмме WDM AddDevice.
  • Одна или несколько очередей ввода-вывода.
  • Одна или несколько функций обратного вызова событий ввода-вывода, которые похожи на функции, аналогичные подпрограммам диспетчера операций ввода-вывода драйвера WDM.
  • Обратные вызовы для обработки событий Plug and Play и питания, поддерживаемых драйвером.
  • Обратные вызовы для обработки запросов WMI, поддерживаемых драйвером. (только KMDF)
  • Дополнительные обратные вызовы, по мере необходимости, для очистки объектов, создания файлов и целей ввода-вывода и т. д.

Объекты устройства и роли драйвера

Оба драйвера WDM и WDF создают один или несколько объектов устройства. Каждый объект устройства представляет роль драйвера, которая является целью запросов ввода-вывода. Объект физического устройства (PDO) представляет драйвер шины, функциональный объект устройства (FDO) представляет драйвер функции, а объект устройства фильтра (filter DO) представляет драйвер фильтра.

В драйверах WDM эти роли драйвера являются неявными, поэтому драйвер должен отслеживать, какую роль каждый объект устройства представляет, и также отвечает на IRP соответствующим образом.

Однако драйверы WDF явно указывают, представляет ли объект устройства PDO (только KMDF), FDO или фильтрацию DO и регистрируют обратные вызовы событий, специфичные для этой роли. Например, конечным объектом для запросов к ресурсам являются запросы и запросы на извлечение устройств, в то время как FDOs и фильтрация DOS не обрабатывают такие запросы.

Драйвер WDF настраивает каждый объект устройства для получения определенных типов запросов ввода-вывода. Платформа вызывает драйвер для обработки только тех запросов ввода-вывода и выполняет действие по умолчанию для всех остальных запросов. Если объект устройства представляет драйвер фильтра, платформа передает все остальные запросы следующему нижнему драйверу. Если объект устройства представляет шину или драйвер функции, платформа завершает работу всех других типов запросов.

Для запросов Plug and Play и питания фреймворк вызывает драйвер KMDF или UMDF только для запросов, подходящих для каждого объекта устройства, и в соответствующее время. Например, FDO должен отвечать на определенные запросы после того, как базовый PDO уже ответил. В драйвере WDM FDO должен задать подпрограмму завершения ввода-вывода, передать IRP вниз по стеку и обработать его после обработки в нижележащих драйверах. Драйвер WDF просто реализует соответствующую подпрограмму обратного вызова, и платформа вызывает ее после завершения обработки более низких драйверов.

Смотрите сведения о создании объектов устройств в рамках в разделе Создание объекта устройства в рамках.

Некоторые драйверы также обрабатывают определенные запросы ввода-вывода, которые не зависят от Plug and Play. Драйвер WDM создает DEVICE_OBJECT в качестве целевого объекта для таких запросов, но не подключает его к стеку устройств Plug and Play. Чтобы добиться того же результата, драйвер KMDF создает объект устройства управления. Некоторые драйверы на основе платформы используют объекты управления устройствами для реализации механизмов ввода-вывода на стороне, чтобы они могли получать определенные типы запросов ввода-вывода независимо от состояния устройства.

Модель объектов

WDF поддерживает последовательную объектную модель, в которой объекты непрозрачны для драйверов, предоставляют области контекста, настраиваемые драйвером, и ссылаются на дескриптор. Объекты WDM — это системные объекты, доступные драйверам и на которые ссылаются указатели. Драйвер, который повреждает объект WDM, может повредить всю систему. Повреждение объекта WDF не только сложнее, так как платформа проверяет данные, которые поставляет драйвер, но и вызывает проблемы на уровне системы гораздо реже.

Получить сведения о соглашении об именовании объектов KMDF можно в разделе архитектура WDF.

Платформа поддерживает счетчик ссылок для каждого объекта, который таким образом обеспечивает некоторый контроль над временем существования. Дополнительные сведения см. в жизненном цикле объектов Framework.

Хотя многие объекты WDF соответствуют объектам WDM, объекты WDF поддерживают функции, требующие дополнительного кода в драйвере WDM. Все объекты WDF поддерживают определяемые драйвером области контекста объектов, чтобы драйвер может хранить сведения, связанные с конкретным экземпляром объекта с самим объектом. Объекты обычно отслеживают состояние. Например, объекты WDFQUEUE — это больше, чем просто список запросов ввода-вывода; они поддерживают несколько типов отправки, автоматическую синхронизацию с Plug and Play и отмену запроса. Для объектов WDFMEMORY число ссылок, управляемых платформой, помогает предотвратить утечку памяти и преждевременное освобождение ресурсов.

Создание объекта

Драйверы WDF соответствуют обычному шаблону для создания всех типов объектов:

  1. Инициализируйте структуру конфигурации для объекта, если она существует.
  2. При необходимости инициализировать структуру атрибутов для объекта.
  3. Вызовите метод создания для создания объекта.

Структура конфигурации и структура атрибутов предоставляют основные сведения об объекте и его использовании драйвером. Все типы объектов используют WDF_OBJECT_ATTRIBUTES в качестве структуры атрибутов, но структура конфигурации для каждого типа объекта отличается, а некоторые объекты не имеют одного. Например, существует WDF_DRIVER_CONFIG структура, но не структура WDF_DEVICE_CONFIG.

Структура конфигурации содержит указатели на сведения, относящиеся к объекту, например функции обратного вызова события драйвера для объекта. Драйвер заполняет эту структуру, а затем передает его в платформу при вызове метода создания объекта. Например, вызов WdfDriverCreate включает указатель на структуру WDF_DRIVER_CONFIG, содержащую указатель на функцию обратного вызова драйвера EvtDriverDeviceAdd.

Платформа определяет функции, именованные WDF_object_CONFIG_INIT для инициализации структур конфигурации, где Object представляет имя типа объекта. Функция WDF_OBJECT_ATTRIBUTES_INIT инициализирует структуру WDF_OBJECT_ATTRIBUTES драйвера.

Область контекста объекта

Каждый экземпляр объекта может иметь одну или несколько областей контекста объекта. Область контекста объекта — это область хранения данных, связанных с данными, связанными с этим конкретным экземпляром, например объектом события, выделенным драйвером. Драйвер определяет размер и макет области контекста объекта. Для объекта устройства область контекста объекта эквивалентна расширению устройства WDM. Сведения об определении и инициализации области контекста см. в разделе Контекстное пространство объекта Framework.

Поддерживаемые типы IRP

WDF поддерживает подмножество IRP Windows. Сводку основных типов WDM IRP и соответствующих функций обратного вызова событий WDF см. в разделе WDM IRP и функции обратного вызова для событий WDF.

Даже если драйвер получает IRPs, отличные от перечисленных в таблице, вы можете перенести его на платформу KMDF. KMDF предоставляет механизм, с помощью которого драйвер может получать "необработанные" WDM IRPs, но также использовать функции KMDF для других типов IRP. Дополнительные сведения см. в разделе Обработка WDM IRP за пределами фреймворка.

Очереди ввода-вывода

Почти все драйверы ставят в очередь запросы на ввод-вывод. Драйверы WDM обычно используют один из следующих подходов:

  • Реализуйте функцию StartIo и вызовите IoStartPacket и IoStartNextPacket для использования очереди устройств системы для запросов ввода-вывода.
  • Используйте IoCsqXxx или другие функции управления списками для реализации собственных внутренних очередей ввода-вывода.
  • Используйте функции KeXxxDeviceQueue для инициализации и управления очередью, защищенной спин-блокировкой.

Драйвер WDF создает объект очереди WDF (WDFQUEUE) для представления очереди ввода-вывода. Объект WDF-очереди по своей сути аналогичен очереди с безопасной отменой, но обладает дополнительными функциями.

При переносе драйвера WDM в WDF можно использовать механизм очереди WDF независимо от механизма, используемого драйвером WDM. Дополнительные сведения о очередях см. в объектах очередей Framework.

Синхронизация и параллелизм

Драйверы WDF получают преимущества от встроенной поддержки синхронизации, недоступной драйверам WDM. Хотя эта поддержка не означает, что драйвер может игнорировать параллелизм и синхронный доступ к данным, драйверы WDF, тем не менее, требуют значительно меньше блокировок и меньше кода синхронизации, чем драйверы WDM.

Дополнительные сведения о функциях синхронизации, предоставляемых платформой, см. в методах синхронизации.

Установка драйвера

Как и драйверы WDM, драйверы KMDF и UMDF устанавливаются с помощью INF-файлов. Однако для установки драйвера WDF иногда требуется соустановщик платформы, предоставляемый комплектом драйверов Windows (WDK). Со-установщик обеспечивает, что в целевой системе присутствует совместимая версия библиотеки фреймворка. Сведения об установке см. в разделе Сборка и загрузка драйвера WDF.