Приступая к началу: следует ли вам изучать WDM или WDF?

Информация

Основная часть

Как вы, несомненно, знаете, одна из вещей, которые мы делает здесь в OSR — это обучение людей написанию драйверов под Windows. Мы гордимся собой на обучающих семинарах, которые действительно готовят новых разработчиков драйверов Windows к «реальному миру», давая им фундаментальную подготовку и знание архитектуры, которые им потребуются для становления со временем успешными разработчиками.

Исторически, за исключением различных «мини-порт» моделей, Windows Driver Model (WDM) предоставляла разработчикам драйверов доступ к (практически) полному диапазону технологий и интерфейсов, доступных для мира ядра Windows. Выбор технологии для решения определенной проблемы и использование этой технологии с умом зачастую требует большого количество знаний и опыта. Когда вы объединяете эти требуемые архитектурные знания с необходимостью понимать детали PnP и управления питанием, вы можете начать понимать, почему разработка Windows WDM драйверов так часто описывается как гигантский вертикальный подъем.

Мир драйверов Windows изменился 5 декабря 2005, когда Microsoft выпустила первую версию Windows Driver Foundation (WDF) Kernel Mode Driver Framework (KMDF). С того времени User Mode Driver Framework (UMDF) присоединился к пакету, и KMDF претерпела несколько небольших исправлений.

В результате этих изменений, новоиспеченный писатель драйверов Windows сталкивается с интересной проблемой: можете ли вы считаться компетентным разработчиком драйверов, если вы знаете только WDF, или вам по-прежнему необходимо приложить усилия для изучения всех нюансов WDF? Майк Кемп из Sintefex Audio, опытный разработчик WDM драйверов, работающий в сфере аудио, хотел знать, что посоветовать коллеге, поэтому поднял этот же вопрос в списке NTDEV недавно. И на этот вопрос мы ответим в этой статье.

Не очевидно

Когда концепция WDF только формировалась, все участники мечтали о создании полностью новой абстракции для разработки драйверов. Целью было не что иное, как создание модели, которая бы отделила разработку драйверов от мучений с WDM навсегда! Однако, реальность — и ограничения, навязанные временем, ресурсами, диспетчерами, и потребность работать с каркасом существующих операционных систем — стали преградой. В дополнение, сообщество разработчиков драйверов Windows выставило несколько ключевых требований. Например, сообщество было непреклонно в том, что новая архитектура не должна ограничивать типы драйверов или решений, которые могли быть созданы. Это являлось большой проблемой для проектировщиков WDF.

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

Все зависит от обстоятельств

Одна причина, по которой сложно ответить на вопрос о выборе M или F, заключается в том, что разработчики драйверов составляют исключительно изменчивое сообщество. Еще несколько лет назад было нетипично для разработчика драйверов специализироваться исключительно на проектировании и разработке драйверов Windows. Совсем недавно в редких случаях инженер-программист являлся исключительно разработчиком драйверов, однако зачастую этот человек был ответственен за написание драйверов для продуктов его компании на множестве операционных систем. Чаще всего, однако, разработчики драйверов работали над драйверами только часть своего времени и тратили остальное на написание кода в режиме пользователя.

Не только разработчики драйверов рознятся между собой, но и компании, на которые они работали. Некоторые компании видят разработку драйверов как необходимое зло на пути к выпуску из продукта. Разработка драйверов для них есть всего лишь еще один раздражающий, но необходимый шаг в процессе, также как и сертификация FCC или CE. С другой стороны, для некоторых компания драйвер обеспечивает критическую часть ценности их продукта. Для этих компаний функциональность и производительность являются критичными, дифференцирующими факторами.

Все эти факторы сказываются на решении, является ли изучение WDF «достаточным», или все же подробное знание WDM «необходимо»

Имейте в виду, что в этой статье мы совершенно не затрагиваем вопрос, что опытный писатель драйверов Windows должен использовать: WDF или WDM для написания драйвера к их устройству. Ответ на этот вопрос прост: если вы можете использовать WDF, вам следует использовать WDF. Я вызывал PoRequestPowerIrp последний раз (Insh'Allah). То есть, речь не о том, что вам следует использовать, если вы знаете обе технологии, речь о том, что необходимо изучать новичку.

Некоторые рекомендации

Как вы можете видеть, мы думали упорно и долго размышляли об этой проблеме на протяжении прошедших нескольких лет. После того, как мы задумали наш WDF-семинар, нам необходимо было рассмотреть, какие концепции из WDM нам необходимо было включить. Поскольку мы не из тех людей, которые дают людям знания поверхностного уровня или предоставляют подробное описание действий, мы хотели быть уверенными, что мы «делает правое дело» для студентов, изучающих KMDF и UMDF.

Итак, здесь приведены некоторые рекомендации, которые мы разработали:

  1. Если вам необходимо писать файловые системы или фильтры файловых систем, забудьте все, что вы когда-либо слышали о WDF. Извините, вы должны изучить весь WDM и затем все о мире файловые систем Windows. Желаем удачи, вам придется туго. Перестаньте читать это. Желаем приятно провести время.
  2. Если вам необходимо писать видео, аудио, большинство типов драйверов сетевых или запоминающих адаптеров, существуют специализированные модели драйверов, применимые к вам. WDF может быть полезен для фильтров в вашем стеке или для специальных целей, но вам следует настроиться на изучение специфической модели драйверов и интерфейс, которые Windows использует для поддержки вашего устройства. Поскольку WDM является базовой технологией для всех драйверов Windows, изучение основ WDM будет улучшать ваше понимание. Однако изучение и использование только лишь WDF — это практически нереально.
  3. Если вам необходимо писать драйвера для принтеров, для вас также существует специальная модель, и я не имею представления, что она из себя представляет. Но это не WDF. Я думаю, это какая-то вещь режима пользователя. Так или иначе, если вы — разработчик драйверов принтеров, вы никоим образом не читаете эту статью. Или, если все же читаете, пожалуйста, обратитесь к тому, кто вас сюда направил.
  4. Если вам необходимо поддерживать или улучшать существующий WDM-драйвер, вас следует в ближайшее время изучать WDM. В перспективе, рассмотрите изучение WDF и переписывание драйвера, если это вообще возможно. Ваш босс будет ненавидеть эту идею, но когда вы наконец сделаете это, вы будете героем в вашей компании из-за сокращения отчетов об ошибках.
  5. Если производительность (или использование ресурсов) вашего устройства сверхкритична, вы, возможно, должны изучать WDM. Я не говорю, что WDF непроизводительна. Скорее я говорю, что для вас является уместным пойти на как можно большее число компромиссов, когда доходит до оптимизации производительности вашего устройства и драйвера, и вам понадобятся все знания об архитектуре и подсистеме ввода-вывода, какие только вы можете получить. И это означает, что вы должны изучать WDM.
  6. Если вы не попали ни в одну из перечисленных категорий или
  7. Вам необходимо писать фильтрующий драйвер для изменения или добавления поведения практически любого стека драйверов Windows.

Вам повезло, потому что вполне возможно, что изучения WDF (в сопровождении нескольких базовых, системных и WDM концепций) будет достаточно для вас! Весьма вероятно, что большинство драйверов, написанных для Windows, попадает в эти две последних категории. Подумайте об этом: фильтры HID, фильтры запоминающих устройств, драйвера для большинства устройств USB, устройства SDCard, устройства управления производственным процессом и лабораторная периферия. И вы можете писать драйвера для этих устройств чрезвычайно хорошо, сосредоточившись только на одном WDF.

Однако, есть несколько других ограничений, которые необходимо коснуться, чтобы убедиться в том, что изучения одного WDF будет достаточно для ваших нужд: ваше устройство должно быть относительно простым, ваш драйвер должен следовать твердо устоявшимся шаблоном программирования, необходимо хороший пример WDF, с которого можно начать, и вам лучше не лезть слишком глубоко в дебри отладки.

Почему ограничения? Чтобы хорошо выполнить работу, когда ваш драйвер или устройство не отвечает требованиям, к вашим знаниям WDF возможно потребуется прибавить приличное понимание WDM. Иными словами, если у вас есть сложное устройство DMA или устройство, которое может обрабатывать множество одновременных запросов в странных комбинациях, вы, вероятно, по-прежнему сможете использовать WDF для драйвера,… но вам также может потребоваться изучить детали WDM.

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

Итак, что же делать новичку?

Почти во всех случаях новичку следует начать изучение одного WDF с несколькими ключевыми концепциями WDM. Прочтите Руссиновича и Соломона для приличной подготовки в концепциях ОС Windows, а затем идите писать несколько драйверов WDF. Они не должны быть сложными. Просто убедитесь, что довели их до ума. Выполнив это, вы получите хорошее понимание вопросов управления пользовательскими буферами, обращения с устройствами, отладки в режиме ядра (в том случае, если вы не используете исключительно UMDF) и работы с Диспетчером ввода-вывода Windows.

Почти во всех случаях новичку следует начать изучение одного WDF с несколькими ключевыми концепциями WDM. Прочтите Руссиновича и Соломона для приличной подготовки в концепциях ОС Windows, а затем идите писать несколько драйверов WDF. Они не должны быть сложными. Просто убедитесь, что довели их до ума. Выполнив это, вы получите хорошее понимание вопросов управления пользовательскими буферами, обращения с устройствами, отладки в режиме ядра (в том случае, если вы не используете исключительно UMDF) и работы с Диспетчером ввода-вывода Windows.

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