Программирование драйверов Windows

       

В данной главе представлены начальные


В данной главе представлены начальные сведения по предметной области, называемой "Драйверы Windows".


В данной главе не были рассмотрены программные средства, которые можно назвать средствами "второго эшелона". Среди них — программы верификации драйверов (которые тестируют драйверы, обращаясь к ним со всевозможными "глупыми" запросами — то есть такими обращениями, которые, как полагает разработчик, никогда не поступят в драйвер), а также модификация настроечных параметров запуска Windows (файл boot.ini), позволяющих, в частности, имитировать небольшой размер физической памяти. Кроме того, в составе утилит Windows DDK и на интернет сайтах упомянутых выше разработчиков можно обнаружить множество программ, которые могут оказаться полезными разработчику драйвера при решении отдельных специфических проблем.


В данной главе был рассмотрен простейший драйвер Example.sys, реализованный как драйвер "в-стиле-NT" (тип драйвера, называемый еще Legacy Driver). Ha его примере были представлены начальные сведения об основных этапах разработки простого драйвера: компиляция и сборка checked версии в среде Microsoft Visual Studio, в среде Windows DDK, реализация тестирующего приложения пользовательского режима, инсталляция и запуск. Изложение этого материала можно признать поверхностным и беглым, однако, предназначено оно для того, чтобы дать первый фактический материал начинающему разработчику для более продуктивного чтения последующих глав этой книги.


Операционные системы ряда Windows NT 5.x (Windows 2000/XP/Server 2003) представляют богатые возможности для разработки приложений. Схема обработки операций ввода/вывода в Windows 2000/XP/Server 2003 сложна и требует достаточных усилий, чтобы охватить картину в целом, что необходимо для продуктивной работы. Главы 5 и 6 рассматривают эти вопросы более подробно.


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


Краткое введение в подсистему ввода/ вывода операционной системы Windows NT 5 завершено. Полностью, хотя и весьма кратко, описана структура драйвера Windows 2000/XP/Server 2003, который предназначен для работы в режиме ядра.
Прежде, чем перейти к деталям реализации драйверных процедур, остановимся, в следующей главе, на некоторых практических приемах программирования в режиме ядра, а именно &#8212 на работе с памятью, строками Unicode, объектами и т.п.




Краткий обзор структур данных и функций общего назначения и первой необходимости при программировании в режиме ядра завершен. Более детальную информацию и сведения о нерассмотренных здесь системных вызовах можно почерпнуть в документации DDK. Автор надеется, что приведенные в этой главе сведения существенно в этом помогут.
Позже, в главе 10, будет рассмотрена еще одна достаточно важная группа функций, посвященная работе с программными потоками и ведающая вопросами синхронизации.


Рабочие процедуры составляют основу интерфейса между драйвером и инициатором запроса. В данной главе были рассмотрены основные особенности конструкции этих функций и обсуждались детали получения доступа к буферным областям, задаваемым инициатором запроса, и к другим параметрам, передаваемым в драйвер клиентским приложением. Были затронуты также вопросы, связанные с обработкой прерываний.
Практические примеры, посвященные отработке приемов обслуживания прерываний будут рассмотрены в главе 11, "Обработка аппаратных прерываний".
В следующей главе будут рассмотрены дополнения, привнесенные драйверной моделью WDM.


В данной главе были рассмотрены мотивы, обусловившие внедрение PnP спецификации как стандарта конструирования аппаратуры. Были рассмотрены также пути приспособления драйверной модели DOS-Windows к новым условиям, в результате чего конечной версией драйверной модели на сегодня стала WDM модель. Были обсуждены специфические аспекты разработки драйверных процедур в канве новой модели и рассмотрены примеры использования стандартных системных вызовов режима ядра в процедурах WDM драйверов, реализующих многослойную методологию современной драйверной модели Windows.


В данной главе были рассмотрены основы построения исполнительного рисунка программного кода режима ядра &#8212 способы запуска программных потоков, основные синхронизационные примитивы и системные вызовы для работы с ними. Использование программных потоков позволяет отойти от жесткой схемы "Диспетчер ввода/вывода &#8212 рабочая процедура &#8212 Диспетчер ввода/вывода" и реализовывать более гибкие алгоритмы, в том числе &#8212 с помощью объектов синхронизации.
Следующая глава будет посвящена рассмотрению двух примеров драйверов, работающих с аппаратными прерываниями LPT порта.


Данная глава была посвящена рассмотрению двух реализаций драйвера LPTPort.sys, работающего с параллельным портом (устройством отмирающей, но еще вполне "живой" шины ISA), который при дополнении его тестовой заглушкой CheckIt становится отличным полигоном для детального рассмотрения зарождения и обработки прерываний в драйверах режима ядра.
Драйвер обладает определенными недостатками. Обслуживая не-PnP устройство, он опять-таки построен по методике Legacy (как драйвер "в стиле NT"), a не как современный WDM драйвер. Кроме того, для простоты реализации, он использует ресурсы, обозначенные другим, системным драйвером, не уделив должного внимания собственному "захвату" аппаратных ресурсов с последующей регистрацией их в операционной системе.
Тем не менее, заглушка CheckIt позволит любому читателю данной книги заполучить несложное устройство, которое позволяет произвольно, по собственному желанию, получать и обрабатывать прерывания на любом компьютере, в офисе или дома.
Первая, упрощенная версия драйвера LPTPort.sys, знакомит с общей методикой обработки прерываний в Windows NT 5.x. Вторая, усложненная версия вводит в использование механизмов системных очередей IRP пакетов как метода обеспечения последовательного доступа к устройству, а также знакомит с приемами совместного использования объектов события приложениями пользовательского режима и драйверами.
На базе приведенных примеров читатель может самостоятельно достроить достаточно интересные тесты, например, по одновременному доступу к драйверу из разных приложений (с использованием событий уведомляющего, а не синхронизационного типа), а также по реализации собственных очередей отложенных IRP пакетов.
Следующая глава будет посвящена рассмотрению вопросов установки драйверов с использованием inf-файлов.


Установка драйвера при помощи inf-файлов является приемлемым и общепринятым решением для проведения установки драйвера в системе, особенно если драйвер следует передать для использования другим людям, которые не могут и вовсе не обязаны быть в курсе тонкостей установки разработанного драйвера.
В данной главе были приведены сведения, как создавать корректные inf-файлы, как раз и предоставляющие преимущества стандартизованного механизма установки.
В следующей главе будут рассмотрены общие вопросы отладки драйверного кода.


Данная глава была посвящена рассмотрению общих вопросов тестирования драйверов.
Ошибки программирования драйверов обладают большой разрушительной и деморализующей силой. Простой пользователь в этой ситуации напоминает мирного жителя, который не может точно сосчитать неожиданно появившихся диверсантов. И не следует его в том винить.
Драйвер является кодом, которому операционная система априори доверяет больше, нежели коду приложений пользовательского режима. Эта банальность есть основной аргумент в пользу тщательной проверки всех неясных мест в коде драйвера, включая дополнительную проверку, зачастую, весьма скупо описанных в документации DDK возможностей и особенностей системных вызовов. Возможно, приведенные в данной главе немногочисленные методы обнаружения, изоляции и предотвращения ошибок драйверного кода помогут разработчику в его нелегком труде.
Интерактивная отладка всегда более привлекательна, однако, оснащение для этого требуется существенное, включая возможные затраты по подписке на дополнительную информацию от Microsoft.
Операционная система Windows NT 5 (версии 2000, XP и Server 2003) отличается богатым набором инструментальных средств, которыми разработчик быстро и эффективно может локализовать ошибку, особенно, если она является в большей степени программной (в отличие от аппаратных ошибок обслуживаемого устройства). Остается лишь научиться это применять на практике.

Содержание раздела