Windows Driver Model
Windows Driver Model (WDM) — это модель драйверов устройств для операционных систем семейства Windows NT (начиная с Windows 2000), определяющая стандартную архитектуру, интерфейсы и правила разработки драйверов, обеспечивающих взаимодействие между операционной системой и аппаратным обеспечением. WDM пришла на смену более ранним моделям (VxD для Windows 9x и NT 4.0 Driver Model) и стала основой для драйверов в Windows 2000, XP, Vista, 7, 8, 10 и 11. Основная цель WDM — унификация разработки драйверов для разных версий Windows и обеспечение обратной совместимости.
История
Предпосылки создания
До появления WDM драйверы для Windows 9x и Windows NT разрабатывались по разным моделям. Для Windows 95/98/Me использовалась модель VxD (Virtual Device Driver), которая была тесно связана с архитектурой MS-DOS и не поддерживала многозадачность и защиту памяти в полной мере. Для Windows NT (NT 4.0) существовала модель NT 4.0 Driver Model, которая была более стабильной, но требовала переписывания драйверов для каждой версии ОС. Это приводило к фрагментации рынка драйверов и усложняло поддержку оборудования.
Разработка и внедрение
Разработка WDM началась в середине 1990-х годов в рамках проекта Windows 2000 (кодовое имя «Memphis»). Основная задача заключалась в создании единой модели, которая работала бы как на потребительских (Windows 9x), так и на корпоративных (Windows NT) версиях Windows. Первая реализация WDM была представлена в Windows 2000 (выпущена в 2000 году). В Windows 98 WDM была реализована частично (через слой эмуляции), а в Windows Me — полностью. С выходом Windows XP (2001 год) WDM стала единственной поддерживаемой моделью драйверов для всех версий Windows NT.
Эволюция и преемники
WDM оставалась основной моделью до выхода Windows Vista (2006 год), когда была представлена Windows Driver Foundation (WDF), включающая Kernel-Mode Driver Framework (KMDF) и User-Mode Driver Framework (UMDF). WDF построена поверх WDM и упрощает разработку, но не заменяет её полностью. В Windows 8 и более поздних версиях WDM продолжает использоваться для низкоуровневых драйверов, хотя Microsoft рекомендует использовать WDF для новых проектов. В Windows 10 и 11 WDM поддерживается в режиме совместимости.
Архитектура
Основные компоненты
WDM основана на объектно-ориентированной модели, где каждый драйвер представлен как набор объектов (драйверных объектов, объектов устройств, объектов IRP). Ключевые элементы архитектуры:
- Драйверный объект (Driver Object) — структура данных, представляющая загруженный драйвер в памяти. Содержит указатели на функции обработки запросов (Dispatch routines).
- Объект устройства (Device Object) — представляет логическое или физическое устройство, управляемое драйвером. Каждый драйвер создаёт один или несколько объектов устройств.
- Пакет запроса ввода-вывода (IRP — I/O Request Packet) — структура данных, описывающая запрос от приложения или другого драйвера к устройству. IRP передаётся по стеку драйверов.
- Стек драйверов (Driver Stack) — иерархическая структура, в которой драйверы обрабатывают IRP последовательно. Обычно включает драйвер шины, функциональный драйвер и драйвер фильтра.
Типы драйверов WDM
WDM определяет три основных типа драйверов:
- Функциональный драйвер (Function Driver) — основной драйвер устройства, реализующий его логику и управление. Обычно один на устройство.
- Драйвер шины (Bus Driver) — управляет шиной (например, PCI, USB, FireWire) и отвечает за обнаружение, конфигурацию и управление питанием подключённых устройств.
- Драйвер фильтра (Filter Driver) — модифицирует поведение других драйверов (например, добавляет шифрование, мониторинг). Может быть верхним (выше функционального) или нижним (ниже функционального).
Уровни иерархии
IRP обрабатывается в следующем порядке (сверху вниз):
- Верхний драйвер фильтра (если есть).
- Функциональный драйвер.
- Нижний драйвер фильтра (если есть).
- Драйвер шины.
Каждый драйвер может передать IRP следующему в стеке или завершить его обработку.
Основные принципы работы
Поддержка Plug and Play (PnP)
WDM полностью интегрирована с подсистемой Plug and Play, что позволяет автоматически обнаруживать устройства при подключении, загружать соответствующие драйверы и назначать ресурсы (порты ввода-вывода, IRQ, память). Драйверы WDM обязаны реализовывать обработку IRP типа IRP_MJ_PNP, включая запросы на запуск, остановку, удаление и изменение состояния устройства.
Управление питанием (Power Management)
WDM поддерживает управление питанием на уровне устройств. Драйверы обрабатывают IRP типа IRP_MJ_POWER, которые позволяют переводить устройство в состояния с низким энергопотреблением (D0 — активное, D1–D3 — спящие). Система может отправлять запросы на изменение состояния питания в зависимости от активности пользователя или настроек электропитания.
Обработка запросов ввода-вывода
Все запросы к устройству (чтение, запись, управление) передаются через IRP. Драйверы WDM реализуют функции обработки (Dispatch routines), которые вызываются диспетчером ввода-вывода Windows. Обработка может быть синхронной (блокирующей) или асинхронной (с использованием callback-функций).
Многопоточность и синхронизация
Драйверы WDM работают в многопоточной среде. Для синхронизации доступа к общим данным используются спин-блокировки (spin locks), мьютексы и события (event objects). Драйверы должны быть реентерабельными и корректно обрабатывать прерывания.
Преимущества и недостатки
Преимущества
- Унификация: одна модель для всех версий Windows NT, начиная с Windows 2000.
- Обратная совместимость: драйверы WDM, написанные для Windows 2000, могут работать в Windows XP, Vista, 7, 8, 10 и 11 (с некоторыми ограничениями).
- Поддержка PnP и управления питанием: встроенная поддержка современных стандартов.
- Гибкость: возможность создания драйверов фильтров для расширения функциональности.
Недостатки
- Сложность разработки: WDM требует глубокого понимания архитектуры Windows, управления памятью и синхронизации.
- Высокий риск ошибок: ошибки в драйвере WDM могут привести к синим экранам смерти (BSOD) и нестабильности системы.
- Отсутствие абстракции: разработчик должен вручную управлять объектами, IRP и ресурсами.
- Сложность отладки: отладка драйверов WDM требует специальных инструментов (WinDbg, KD) и часто — второго компьютера.
Применение
Типичные сценарии
WDM используется для разработки драйверов устройств, которые не могут быть реализованы с помощью более высокоуровневых моделей (например, WDF). Типичные примеры:
- Драйверы для видеокарт, звуковых карт, сетевых адаптеров.
- Драйверы для специализированного оборудования (промышленные контроллеры, медицинские приборы).
- Драйверы фильтров для антивирусов, систем шифрования, мониторинга.
- Драйверы для виртуальных устройств (например, виртуальные сетевые адаптеры).
Современное состояние
Несмотря на появление WDF, WDM продолжает использоваться для низкоуровневых драйверов, особенно в ситуациях, когда требуется прямой доступ к аппаратным ресурсам или реализация сложных протоколов. Microsoft рекомендует для новых проектов использовать KMDF или UMDF, но WDM остаётся важной частью экосистемы Windows. В Windows 10 и 11 WDM поддерживается в режиме совместимости, а новые версии WDF (например, KMDF 1.33) построены поверх WDM.
Инструменты разработки
Для разработки драйверов WDM используются:
- Windows Driver Kit (WDK) — набор инструментов, включающий компиляторы, линковщики, заголовочные файлы и документацию.
- Visual Studio — среда разработки, поддерживающая проекты WDK.
- WinDbg — отладчик для анализа и отладки драйверов.
- Driver Verifier — утилита для проверки корректности работы драйвера (выявляет утечки памяти, нарушения синхронизации и другие ошибки).
Сравнение с другими моделями
| Характеристика | WDM | WDF (KMDF) | VxD (Windows 9x) |
|---|---|---|---|
| Поддержка PnP | Да | Да | Ограниченная |
| Управление питанием | Да | Да | Нет |
| Многопоточность | Да | Да | Нет |
| Сложность разработки | Высокая | Средняя | Низкая |
| Совместимость с Windows NT | Да | Да | Нет |
| Поддержка в Windows 10/11 | Да | Да | Нет |
Критика
WDM критикуется за излишнюю сложность и высокий порог входа для разработчиков. Многие ошибки в драйверах WDM связаны с неправильной обработкой IRP, утечками памяти или нарушениями синхронизации. Кроме того, WDM требует от разработчика глубоких знаний архитектуры Windows, что делает её малопригодной для быстрой разработки. В ответ на это Microsoft создала WDF, которая абстрагирует многие низкоуровневые детали и предоставляет более простой API.
Источники
- Microsoft Windows Driver Kit (WDK) Documentation — официальная документация по WDM.
- «Windows Internals, Part 1» (7th edition) — Mark Russinovich, David A. Solomon, Alex Ionescu.
- «Developing Drivers with the Windows Driver Foundation» — Penny Orwick, Guy Smith.
- MSDN Library: Windows Driver Model Overview.
- «Programming the Microsoft Windows Driver Model» — Walter Oney.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →