Windows driver foundation разработка драйверов
Использование ВДФ для разработки драйвера
В этом разделе представлен общий обзор объектов платформы, которые будут использоваться для разработки драйвера платформы Kernel-Mode Driver Framework (КМДФ). Кроме указанных выше, вы будете использовать те же объекты для разработки драйвера платформы User-Mode Driver Framework (UMDF), начиная с UMDF версии 2.
драйверы Windows платформы драйверов (вдф) состоят из подпрограммы DriverEntry и набора функций обратного вызова событий, которые определяются Windows объектами платформы драйверов , используемыми драйверами на основе платформы. Функции обратного вызова вызывают методы объекта, которые экспортирует платформа. комплект драйверов Windows (WDK) содержит примеры драйверов вдф, демонстрирующих способы реализации функций обратного вызова событий драйвера. эти образцы можно загрузить с Windows Центр разработки-Hardware. Сведения о доступных примерах см. в разделе Sample Кмдф Drivers and Sample Drivers.
При создании драйвера ВДФ вы, как правило, выполняете следующие действия:
Используйте объект драйвера платформы для представления драйвера.
Подпрограмму DriverEntry драйвера необходимо вызвать вдфдриверкреате , чтобы создать объект драйвера платформы, представляющий драйвер. метод вдфдриверкреате также регистрирует функцию обратного вызова евтдривердевицеадд драйвера, которая вызывается платформой каждый раз, когда диспетчер Plug and Play (PnP) сообщает о существовании устройства, поддерживаемого драйвером.
Используйте объекты устройств платформы для поддержки PnP и управления питанием в драйвере.
Все драйверы должны вызывать вдфдевицекреате для создания объекта устройства платформы для каждого устройства, поддерживаемого драйвером. Устройство может быть частью оборудования, подключенного к компьютеру, или устройством, предназначенным только для программного обеспечения. Объекты устройств платформы поддерживают операции PnP и управления питанием, а драйверы могут регистрировать функции обратного вызова событий, которые уведомляют драйвер о том, что устройство переходит или оставляет свое рабочее состояние.
Дополнительные сведения об объектах устройств платформы см. в разделе Поддержка PnP и управления питанием в драйвере.
Используйте объекты очереди и объекты запросов платформы для поддержки операций ввода-вывода в драйвере.
Все драйверы, получающие запросы на чтение, запись или операции ввода-вывода устройств от приложений или других драйверов, должны вызывать вдфиокуеуекреате для создания объектов очереди платформы, представляющих очереди ввода-вывода. Как правило, драйверы регистрируют один или несколько обработчиков запросов для каждой очереди ввода-вывода. Когда диспетчер ввода-вывода отправляет в драйвер запрос ввода-вывода, платформа создает объект запроса платформы для запроса, помещает объект запроса в очередь ввода-вывода и вызывает один из обработчиков запросов драйвера, чтобы сообщить драйверу о доступности запроса. Драйвер получает запрос ввода-вывода и может переставить в очередь, завершить, отменить или переслать запрос.
Дополнительные сведения об использовании объектов очереди и объектов запроса платформы см. в разделе объекты очереди платформы и объекты запроса платформы.
Используйте объекты прерываний платформы для обработки прерываний устройства.
Драйверы, обрабатывающие прерывания устройств, должны вызывать вдфинтеррупткреате для создания объекта прерывания платформы для каждого прерывания и регистрации функций обратного вызова. Эти функции обратного вызова включают и отключают прерывание и служат в качестве процедуры обработки прерываний (ISR) и отложенного вызова процедур (DPC) для прерывания.
Дополнительные сведения об объектах прерываний платформы см. в разделе обработка аппаратных прерываний.
Драйверы КМДФ могут использовать объекты-модули поддержки DMA платформы и объекты транзакций DMA для управления операциями прямого доступа к памяти (DMA) устройства.
Если устройство драйвера КМДФ поддерживает операции DMA, драйвер должен вызвать вдфдмаенаблеркреате для создания объекта включения DMA и вдфдматрансактионкреате для создания одного или нескольких объектов транзакций DMA. Объект транзакции DMA определяет функцию обратного вызова евтпрограмдма , которая программирует оборудование устройства для выполнения операции DMA.
Используйте целевые объекты платформы ввода-вывода для отправки запросов ввода-вывода в другие драйверы.
Для передачи запросов ввода-вывода к другим драйверам (обычно следующий более низкий драйвер в стеке драйверов) драйвер отправляет запрос в целевой объект ввода-вывода.
Дополнительные сведения о целевых объектах ввода-вывода см. в разделе Использование целевых объектов ввода-вывода.
драйвер кмдф может использовать объекты поставщика wmi платформы и объекты экземпляра wmi для поддержки возможностей инструментарий управления Windows (WMI) (WMI).
Большинство драйверов КМДФ должны поддерживать Инструментарий WMI и вызывать вдфвмиинстанцекреате для регистрации функций обратного вызова, которые отправляют или получают данные WMI.
Используйте возможности синхронизации платформы.
Все драйверы должны быть осведомлены о проблемах синхронизации многопроцессорной среды и должны использовать методы синхронизации , предоставляемые платформой.
Используйте дополнительные объекты и функции, предоставляемые платформой.
Платформа предоставляет дополнительные объекты, которые может использовать драйвер. Дополнительные сведения об этих объектах см. в разделе ВДФ support Objects.
Сборка и загрузка драйвера ВДФ
В этом разделе описывается, как выбрать целевую операционную систему и версию платформы для проекта драйвера в Visual Studio.
Чтобы определить, нужно ли включать в пакет драйверов распространяемые компоненты платформы, см. раздел распространяемые компоненты платформы.
Какую версию платформы использовать?
- для назначения Windows XP используйте вдф 1,9 или более раннюю версию.
- чтобы выбрать Windows Vista, Windows 7 или Windows 8, используйте вдф 1,11 или более раннюю версию.
- чтобы выбрать целевой Windows 8.1, используйте кмдф 1,13 или более раннюю версию или umdf 1. x или umdf 2,0.
- чтобы использовать Windows 10 версии 1507, используйте кмдф 1,15 или более раннюю версию или umdf 1. x или umdf 2,15 или более ранних версий.
Подробные сведения о версиях КМДФ и UMDF см. в статье журнал версий кмдф и Журнал версий UMDF.
Разделы справки задать версии в Visual Studio?
если вы создаете проект драйвера для последней версии Windows и самой последней версии кмдф или UMDF, вы можете оставить значения по умолчанию и пропустить этот шаг.
В противном случае выполните следующие действия.
- Щелкните решение правой кнопкой мыши и выберите Configuration Manager. задайте для Project конфигурации нужное значение (например, отладку).
- Щелкните правой кнопкой мыши проект драйвера и выберите пункт Свойства. откройте свойства конфигурации — > драйвер драйвера Параметры- > драйвер. измените значение дополнительного номера версии кмдф (целевая версия) или вспомогательной версии UMDF (целевая версия) в модели драйвера Параметры на нужное значение. Сведения о дополнительной версии кмдф (минимальная необходимая) и версии UMDF (минимальная необходимая)см. в разделе Указание минимального необходимогозначения.
вы можете использовать Windows набор драйверов (WDK), поставляемый с Windows 10 для создания драйверов кмдф 1,9-1.29, а также драйверы UMDF 1,9-2.29.
Подробные сведения о версиях КМДФ и UMDF см. в статье журнал версий кмдф и Журнал версий UMDF.
Связывание и загрузка
при создании проекта платформы Windows драйверов (вдф) в Microsoft Visual Studio MSBuild связывает драйвер с соответствующей библиотекой платформы, загрузчиком библиотеки и файлом-заглушкой, который включается в WDK. (Библиотека и загрузчик также включены в совместный установщик платформы, поэтому при необходимости их можно распространить вместе с пакетом драйверов.)
Файл заглушки содержит специальную подпрограмму точки входа: фксдриверентри. MSBuild задает подпрограмму фксдриверентри заглушки в качестве начальной точки входа для драйверов на основе платформы.
Когда операционная система загружает драйвер на основе платформы, он также загружает файл заглушки и загрузчик библиотеки. Затем система вызывает подпрограмму фксдриверентри файла-заглушки. Затем эта подпрограммы вызывает загрузчик. Загрузчик определяет версию библиотеки платформы, требуемую драйвером, а затем загружает правильную версию библиотеки как службу режима ядра (если она еще не загружена). Наконец, Библиотека вызывает подпрограмму DriverEntry драйвера.
книга Орвик в помощь
Как создать драйвер — очень помогает книга Пенни Орвик, Гай Смит. В момент, когда ничего не понятно, спокойненько берем эту книгу , заливаем к ппимеру на eBook, выбираем время и читаем не торопясь, делаем заметки. Одного дня не хватит.
Самое прикольное — надо изучать командную строку и утилиту build, ибо драйверы не собираются в VisualStudio и сама Windows кстати тоже собирается через build.
В папочке C:\WinDDK\7600.16385.1 собрано все : и инструменты , и примеры.
KMDF — драйверы пишутся на C (тут С++ может налажать с выделением памяти не туда куда нужно).
UMDF — драйверы на С++ , там на COM объектах замес, интерфейсы и все такое.
Нас интересует UMDF драйвер типа VirtualSerial и к нему присобачить TCP слушающий поток.
Так вот UMDF драйвер это dll файл, inProc тип, т.е. он не создает своего потока , а работает в потоке вызывающего хоста.
Делать поток для прослушивания TCP порта будем в Initialize при создании драйвера. Тупо смотрим пример tcp2com.
Привожу заметки сумасшедшего, как есть пока без корректировки:
похоже драйвер не создает своего потока
tlist утилита
примеры по ходу книги:
skeleton umdf
fx2_driver umdf
DBH
файлы идентификаторов
отладочная версия виндоус (вроде как есть такая штука)
OSR learning kit
фоновый режим — драйверам
WDM DDI низший уровень
ДРАЙВЕР как одностороннее зеркало
FDO functional dev.object
PDO phisical device object
FIDO filter device objec
IRP method_buffered
ISR interrupt service routing
DFC deferred proc call
IRQL interrupt request level
до 51 страницы дочитал далее бегло промотрел
DISPATCH_LEVEL
DIRQL
——————-
аппаратные ресурсы и прерывания Глава 16 — для UMDF тута ничего не надо
read_port_xxx macro write_port_xxx
функции обратного вызова фов
EvtDtiverDeviceAdd:
wdf_pnppower_event_callbacks structure
EvtDevicePrepareHardware
.
EvtInterruptIsr return false/true = наше устройство вызвало прерывание?
EvtInterruprDpcq
.
EvtDeviceD0Exit
.
EvtDeviceReleaseHardware
usb,1394,bt не генерируют апп.прер.!
HAL hardware abstract layer
MSI Message Signaled Interrupt
глава18 com umdf
inProc dll выполняется в потоке хоста,с++
DllMain
DllGetClassObject
об’екты обратного вызова — интфейсы
IWDFxxxx- об’екты umdf
DllMain может вызываться для создания потока!?
Initialize — д/б открытый метод (вызывается извне) т.к. может зак.неудачей
kmdf ntddk.h wdf.h
umdf wudfddi.h
———— сборка ———————
build _ только ей собираются дрова
и сама виндоус тоже только ей. Только командная строка.
makefile — ребята изучает все связано с makefile (похоже на ближайшее столетие ничего не поменяется)
inx см.stampinf.exe
makefile.inc
MOF для WMI
Dirs
build -gce только текущую папку с Sources остальные только через .lib
Windows Driver Foundation
Разработчик |
---|