Написание драйвера в подробностях №1. Разработка драйверов


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

[Previous] [Next]

Когда кто-то приступает к большому делу, а для начала решает спросить у людей сведущих что-то вроде "Как съесть слона?", то самый правильный ответ, который он только может получить: "По частям!".

Несерьезно? Но зато как верно!

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

Предназначенная для студентов ВУЗ'ов и специалистов, чья профессиональная деятельность заставляет их обратиться к разработке собственных драйверов для Windows или просто к программированию в режиме ядра Windows, книга предполагает наличие у читателей достаточной подготовки. Прежде всего, разработчик драйвера должен владеть программированием на языке С (без расширений С++), поскольку описание синтаксиса и применения конструкций этого языка не рассматриваются в данной книге вовсе. Во-вторых, разработчик драйверов, пусть начинающий, должен иметь твердо сформировавшееся представление о программировании в многозадачной среде при интенсивном использовании многопоточности. Конечно же, указанные требования не столь объемны и могут быть выполнены в результате короткого "самообразовательного штурма", но здесь придется корректировать свои планы на величину различия между этапами "я Это знаю" и "я умею Этим пользоваться".

Необходимость знания Читателем языка программирования С, как было сказано выше, продиктовано тем обстоятельством, что излагаемый материал ориентирует Читателя на использование пакета Microsoft DDK (Device Driver Kit — пакет программного обеспечения для разработки драйверов), хотя существуют коммерческие программные пакеты и от других фирм, которые базируются на использовании других языков программирования (подробнее эти вопросы будут рассмотрены далее, в главе 2).

Наверное, следовало бы упомянуть и о таком требовании к потенциальному потребителю приведенной в книге информации, как "предрасположенность" или "дружественность" к аппаратуре, поскольку основное назначение драйвера все-таки — взаимодействие с аппаратным обеспечением. Однако во-первых, это подразумевается. Во-вторых, сведения из данной книги можно применять и для разработки таких модулей режима ядра, которые лишь формально являются драйверами, но ни с какими устройствами не связаны и используются лишь как агент доступа к богатому и полезному набору функций режима ядра.

Как Вы, уважаемый Читатель, сможете неоднократно убедиться далее, в книге использован прием повтора некоторых важных положений и выводов, что призвано помочь в расстановке должных, с точки зрения автора, смысловых акцентов. (А вовсе не по причине его забывчивости и не по ошибке редактора!) Начинающему разработчику драйверов настоятельно рекомендуется не пропускать первые главы книги, поскольку такое легкомыслие чревато серьезными проблемами в дальнейшем понимании материала.

Обилие англоязычных синонимов к используемым терминам в тексте так же решает свою задачу. Рано или поздно (скоре всего, уже случилось!) Читателю придется обратиться к чтению DDK документации, поставляемой вместе с программами и библиотеками фирмой Microsoft. По ряду причин это нельзя назвать простым делом. Поскольку чтение англоязычной документации — процесс, которого разработчику драйверов не избежать, чтобы облегчить вступление на этот нелегкий путь, в книге приводятся многочисленные наборы синонимичных терминов с развернутыми вариантами переводов.

За пределами рассмотрения данной книги остались вопросы, которые можно назвать "сложным программированием" драйверов. Не рассматриваются принтерные, SCSI, видео и сетевые драйверы, поскольку этот емкий материал может легко заслонить приоритетные задачи — объяснение, какова внутренняя логика подсистемы ввода/вывода Windows и ознакомление с приемами программирования в режиме ядра.

Книга ориентирована на разработчиков программного обеспечения, но некоторые ее части будут небесполезны и для разработчиков аппаратуры.

drp.su

Основы разработки драйверов устройств в операционных системах Windows

В предыдущих главах этой книги  для управления  различными  устройствами  мы использова ли свободно распространяемое программное обеспечение, куда входил драйвер PortTalk.sys и программа allowio.exe. В этой главе мы рассмотрим вопросы создания собственных драйве ров устройств в операционных  системах Windows, а также создадим драйвер для управления аналого цифровым преобразователем, подключенным к параллельному порту ПК.

Разработка  драйверов  для Windows (как,  впрочем,  и для других операционных  систем) окутана неким мистическим ореолом таинственности и считается чем то из разряда «черной магии». Большинство программистов  и пользователей полагают, что это чрезвычайно  труд ное занятие и доступно далеко не каждому. В определенном смысле это действительно так, если вы собираетесь разработать, например, драйвер звуковой или видеокарты.

Тем не менее, разработать несложный драйвер для обычного устройства из разряда до машней или лабораторной электроники может даже пользователь средней руки, достаточно хорошо владеющий основами программирования  на языке C (поскольку все драйверы разра батываются с использованием языка  C) и имеющий хорошее представление о принципах организации  операционных  систем Windows. При разработке  драйверов  следует всегда по мнить, что они работают в режиме ядра и при неправильном функционировании мгновенно могут привести операционную систему к краху («синий экран  смерти»).

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

Для разработки драйверов мы будем применять стандартное свободно распространяе мое программное  средство, выпущенное фирмой Microsoft  – Windows DDK (Driver Develop ment Kit). Этот программный  пакет можно  закачать  с сайта Microsoft.  В его состав включена обширная документация вместе с примерами разработок драйверов.

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

2000/XP/2003/Vista.

Начнем с того, что определим, что собой представляет драйвер устройства, и как  он вза имодействует с операционной системой. В упрощенном виде такую схему взаимодействия можно представить следующей схемой (рис. 7.1):

Рис. 7.2

Ошибка программы при попытке записи

в параллельный порт

Команды ассемблера in и out являются «привилегированными» инструкциями процессора Intel и могут выполняться только программами, работающими на уровне ядра системы, поэто му пользовательская программа и завершается аварийным образом.

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

Есть и другой путь для работы с устройствами пользователя – написать самому драйвер устройства и обращаться к нему из программы  пользователя.  Именно этот путь и будет здесь описан. Для того чтобы реализовать такую возможность  нужно сделать два шага:

1)   написать драйвер устройства;

2)   написать программу, которая бы обращалась к драйверу устройства для выполнения операций ввода вывода.

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

Источник:  Магда Ю. С. Компьютер  в домашней лаборатории.  – М.: ДМК Пресс, 2008. – 200 с.: ил.

nauchebe.net

Написание драйвера в подробностях №1

Драйвер-это основа взаимодействия системы с устройством в ОС Windows.Это одновременно удобно и неудобно.Про удобства я разъяснять не буду — это и так понятно,а заострюсь я именно на неудобствах драйверов.В сложившейся ситуации пользователь полностью подчинён воле производителя— выпусти тот драйвер — хорошо, а не выпустит…Только продвинутый пользователь, имеющий голову на плечах(особенно, если он ешё и программер) не станет мириться с таким положением дел— он просто возьмёт и сам напишет нужный драйвер.Это нужно и взломщику: драйвер — это удобное окошко в ring0,которое является раем для хакера. Но хоть написать драйвер и просто,да не совсем — есть масса подводных камней. Да и документированность данного вопроса на русском языке оставляет желать лучшего.Этот цикл статей поможет тебе во всём разобраться.Приступим.

Интра

Хочу сразу же сделать несколько предупреждений.Данная статья всё-таки подразумевает определённый уровень подготовки.Драйвера-то ведь пишутся на C(++) с большим количеством ассемблерных вставок.Поэтому хорошее знание обоих языков весьма желательно (если не сказать — обязательно).Если же ты пока не можешь этим похвастаться,но желание писать драйвера есть — что ж, так как эта статья вводная, в конце её будет приведён список полезной литературы,ссылок и т.д. Но помни: учить тебя в этом цикле статей программированию как таковому я тебя не буду.Может как-нибудь в другой раз. Согласен? Тогда поехали!

Теория

Скоро здесь, возможно, будет стоять твоё имя.

Практически в любом деле, как мне кажется, нужно начинать с теории.Вот и начнём с неё. Для начала уясним себе поточнее основные понятия.Первое: что есть драйвер? Драйвер — в сущностикусок кода ОС, отвечающий за взаимодействие с аппаратурой.Слово «аппаратура» в данном контексте следует понимать в самом широком смысле.С момента своего появления как такого до сегодняшнего дня драйвер беспрерывно эволюционировал.Вот, скажем, один из моментов его развития. Как отдельный и довольно независимый модуль драйвер сформировался не сразу.Да и сейчас этот процесс до конца не завершён:ты наверняка сталкивался с тем, что во многихдистрибутивах никсов для установки/перестановки etc драйверов нужно перекомпилировать ядро,т.е. фактически заново пересобирать систему.Вот, кстати ещё один близкий моментец: разные принципы работы с драйверами в Windows 9x и NT.В первом процесс установки/переустановки драйверов проходит практически без проблем,во втором же случае это тяжёлое и неблагодарное дело,для «благополучного» завершения которого нередко приходится прибегать к полной переустановке ОС.А зато в Windows 9x… так,стоп,открывается широкая и волнующая тема,которая уведёт меня далеко от темы нынешней статьи,так что вернёмся к нашим баранам… ой,то есть к драйверам.В порядке общего развития интересно сравнить особенности драйверов в Windows и *nix(xBSD) системах: 

1) Способ работы с драйверами как файлами (подробнее см. ниже)2) Драйвер, как легко заменяемая честь ОС (учитывая уже сказанные выше примечания)3) Существование режима ядра

Теперь касательно первого пункта. Это значит,что функции, используемые при взаимодействии с файлами,как и с драйверами, практически идентичные (имеется в виду лексически):open, close, read и т.д. И напоследок стоит отметить идентичность механизмаIOCTL (Input/Output Control Code-код управления вводом-выводом)-запросов. 

Драйвера под Windows делятся на два типа:Legacy (устаревший) и WDM (PnP). Legacy драйверы (иначе называемые «драйверы в стилеNT") чрезвычайно криво работают (если работают вообще)под Windows 98, не работают с PnP устройствами, но зато могут пользоваться старыми функциямиHalGetBusData, HalGetInterruptVector etc, но при этом не имеют поддержки в лице шинных драйверов.Как видишь, весьма средненький драйвер. То ли делоWDM: главный плюс — поддержка PnP и приличненькая совместимость:Windows 98, Me, 2000, XP, 2003, Server 2003 и т.д. с вариациями; но он тоже вынужден за это расплачиваться:например, он не поддерживает некоторые устаревшие функции(которые всё таки могут быть полезны). В любом случае,не нужно ничего воспринимать как аксиому, везде бывают свои исключения.В некоторых случаях лучше написания Legacy драйвера ничего не придумать. 

Как ты наверняка знаешь, в Windows есть два мода работы:User Mode и Kernel Mode — пользовательский режим и режим ядра соответственно.Первый — непривилегированный, а второй — наоборот.Вот во втором чаще всего и сидят драйвера (темболее, что мы в данный момент говорим именно о драйверах режима ядра).Главные различия между ними:  это доступность всяких привилегированных команд процессора.Программировать (а уж тем более качественно) в Kernel mode посложнее будет,чем писать прикладные незамысловатые проги.А драйвера писать без хорошего знания Kernel mode — никак.Нужно попариться над назначением выполнения разнообразных работ отдельному подходящему уровню IRQL, желательно выучить новое API (так как в Kernel mode API отличается от прикладного)…в общем, предстоит много всяких радостей. Но тем не менее,это очень интересно, познавательно, и даёт тебе совершенно иной уровень власти над компьютером.

А раз уж я упомянула про IRQL, разьясню и это понятие.IRQL (Interrupt Request Level — уровень приоритета выполнения) — это приоритеты,назначаемые специально для кода, работающего в режиме ядра.Самый низкий уровень выполнения — PASSIVE_LEVEl. Работающий поток может быть прерван потоком только с более высокимIRQL. 

Ну и напоследок разъясним ещё несколько терминов: 

1) ISR (Interrupt Service Routine) — процедура обслуживания прерываний.Эта функция вызывается драйвером в тот момент,когда обслуживаемая им аппаратура посылает сигнал прерывания.Делает самые необходимые на первый момент вещи:регистрирует callback — функцию и т.д.

2) DpcForISR (Deferred Procedure Call for ISR) — процедура отложенного вызова для обслуживания прерываний.Эту функцию драйвер регистрирует в момент работы ISR для выполнения основной работы.

3) IRP (Input/Output Request Packet) — пакет запроса на ввод — вывод.Пакет IRP состоит из фиксированной и изменяющейся частей.Вторая носит название стека IRP или стека ввода — вывода (IO stack).

4) IO stack location — стек ввода — вывода в пакете IRP.

5) Dispatch Routines (Рабочие процедуры) — эти функции регистрируются в самой первой (по вызову) процедуре драйвера.

6) Major IRP Code — старший код IRP пакета.

7) Minor IRP Code — соответственно, младший код IRP пакета.

8) DriverEntry — эта функция драйвера будет вызвана первой при его загрузке.

9) Layering (Многослойность) — данной возможностью обладают только WDM — драйвера.Она заключается в наличии реализации стекового соединения между драйверами.Что такое стековое соединение? Для этого необходимо знать про DeviceStack (стек драйверов) — поэтому я обязательно вспомню про всё это чуточку ниже.

10) Device Stack, Driver Stack (стек устройств, стек драйверов) — всего лишьобъемное дерево устройств. Его, кстати, можно рассмотреть во всех подробностях с помощью программыDeviceTree (из MS DDK), например.

11) Стековое соединение — как и обещала, объясняю. В стеке драйверов самый верхний драйвер — подключившийся позднее.Он имеет возможность посылать/переадресовывать IRP запросы другим драйверам,которые находятся ниже его. Воти всё. Правда,просто?

12) AddDevice — функция, которую обязательно должны поддерживать WDM драйверы.Её название говорит само за себя.

13) Device Object, PDO, FDO (Объект устройства, физический,функциональный) — при подключении устройства к шине она создаёт PDO.А уже к PDO будут подключаться FDO объекты WDM драйверов.Обьект FDO создаётся самим драйвером устройства при помощи функции IOCreateDevice.Обьект FDO также может иметь свою символическую ссылку, от которой он будет получать запросы от драйвера.Это что касается WDM драйверов. С драйверами «в стиле NT» ситуация несколько иная.Если он не обслуживает реальных/PnP устройств,то PDO не создаётся. Но для связи с внешним миром без FDO не обойтись.Поэтому он присутствует и тут.

14) Device Extension (Расширение обьекта устройства) — «авторская» структура,т.е. она полностью определяется разработчиком драйвера.Правилом хорошего тона считается, например,размещать в ней глобальные переменные.

15) Monolithic Driver (Монолитный драйвер) — это драйвер,который самостоятельно обрабатывает все поступающиеIRP пакеты и сам работает с обслуживаемым им устройством(в стеке драйверов он не состоит). Данный тип драйверов используется только если обслуживается неPnР устройство или же всего лишь требуется окошко в ring0.

16) DIRQL (уровни аппаратных прерываний) —прерывания, поступающие от реальных устройств, имеют наивысший приоритет IRQL,поэтому для них решено было придумать специальное название(Device IRQL).

17) Mini Driver (Мини — драйвер) — чуть меньше «полного» драйвера.Обычно реализуется в виде DLL-ки и имеет оболочку в виде «полного» драйвера.

18) Class Driver (Классовый драйвер) — высокоуровневый драйвер,который предоставляет поддержку класса устройств.

19) РnP Manager (PnP менеджер) — один из главных компонентов операционной системы.Состоит из двух частей: PnP менеджера пользовательского и «ядерного» режимов.Первый в основном взаимодействует с пользователем;когда тому нужно, например, установить новые драйвера и т.д.А второй управляет работой, загрузкой и т.д. драйверов.

20) Filter Driver (фильтр — драйвер) — драйверы, подключающиеся к основному драйверу либо сверху(Upper), либо снизу (Lower). Фильтр драйверы (их может быть несколько) выполняют фильтрацию IRP пакетов.Как правило, для основного драйвера Filter Drivers неощутимы.

21) Filter Device Object — объект устройства, создаваемый фильтр — драйвером.

22) HAL (Hardware Abstraction Layer) — слой аппаратных абстракций.Данный слой позволяет абстрагироваться компонентам операционной системы от особенностей конкретной платформы.

23) Synchronization Objects (Обьекты синхронизации) — с помощью этихобъектов потоки корректируют и синхронизируют свою работу.

24) Device ID — идентификатор устройства.

25) DMA (Direct Memory Access) — метод обмена данными между устройством и памятью(оперативной) в котором центральный процессор не принимает участия.

25) Polling — это особый метод программирования, при котором не устройство посылает сигналы прерывания драйверу,а сам драйвер периодически опрашивает обслуживаемое им устройство.

26) Port Driver (Порт-драйвер) — низкоуровневый драйвер,принимающий системные запросы. Изолирует классовые драйверы устройств от аппаратной специфики последних.

Ну вот, пожалуй, и хватит терминов. В будущем,если нужны будут какие-нибудь уточнения по теме,я обязательно их укажу. А теперь, раз уж эта статьятеоретическая, давай-ка взглянем на архитектуру Windows NT с высоты птичьего полёта.

Краткий экскурс в архитектуру Windows NT

Наш обзор архитектуры Windows NT мы начнём с разговора об уровнях разграничения привилегий. Я уже упоминала об user и kernel mode.Эти два понятия тесно связаны с так называемыми кольцами (не толкиеновскими ).Их ( колец) в виде всего четыре: Ring3,2,1 и 0. Ring3 — наименее привилегированное кольцо,в котором есть множество ограничений по работе с устройствами,памятью и т.д. Например, в третьем кольце нельзя видеть адресное пространство других приложений без особого на то разрешения. Естественно,трояну вирусу etc эти разрешения получить будет трудновато, так что хакеру в третьем кольце жизни никакой. В третьем кольце находится user mode. Kernel mode сидит в нулевом кольце — наивысшем уровне привилегий. В этом кольце можно всё: смотреть адресные пространства чужих приложений без каких — либо ограничений и разрешений, по своему усмотрению поступать с любыми сетевыми пакетами, проходящими через машину, на всю жизнь скрыть какой-нибудь свой процесс или файл и т.д. и т.п. Естественно,просто так пролезть в нулевое кольцо не получиться: для этого тоже нужны дополнительные телодвижения. У легального драйвера с этим проблем нет: ему дадут все необходимые API — шки, доступ ко всем нужным системным таблицам и проч. Хакерской же нечисти опять приходиться туго: все необходимые привилегии ему приходиться «выбивать»незаконным путём. Но это уже тема отдельной статьи, и мы к ней как-нибудь ещё вернёмся. А пока продолжим.

У тебя наверняка возник законный вопрос: а что же сидит в первом и втором кольцах ? В том то всё и дело,что программисты из Microsoft почему — то обошли эти уровни своим вниманием. Пользовательское ПО сидит в user mode,а всё остальное (ядро,драйвера…) — в kernel mode. Почему они так сделали — загадка, но нам это только на руку. А теперь разберёмся с компонентами (или, иначе говоря, слоями ) операционной системы WindowsNT.

Посмотри на схему — по ней многое можно себе уяснить. Разберём её подробнее.С пользовательским режимом всё понятно. В kernel mode самый низкий уровень аппаратный. Дальше идёт HAL, выше — диспетчер ввода — вывода и драйвера устройств в одной связке, а также ядрышко вместе с исполнительными компонентами. О HAL я уже говорила, поэтому поподробнее поговорим об исполнительных компонентах. Что они дают? Прежде всего они приносят пользу ядру. Как ты уже наверняка уяснил себе по схеме, ядро отделено от исполнительных компонентов. Возникает вопрос: почему ? Просто на ядре оставили только одну задачу: просто управление потоками, а все остальные задачи (управление доступом,памятью для процессов и т.д.) берут на себя исполнительные компоненты (еxecutive). Они реализованы по модульной схеме, но несколько компонентов её (схему) не поддерживают . Такая концепция имеет свои преимущества: таким образом облегчается расширяемость системы. Перечислю наиболее важные исполнительные компоненты: 

1) System Service Interface (Интерфейс системных служб )2) Configuration Manager (Менеджер конфигурирования)3) I/O Manager (Диспетчер ввода-вывода,ДВВ)4) Virtual Memory Manager,VMM (Менеджер виртуальной памяти)5) Local Procedure Call,LPC (Локальный процедурный вызов )6) Process Manager (Диспетчер процессов)7) Object Manager (Менеджер объектов)

Так как эта статья — первая в цикле, обзорная, подробнее на этом пока останавливаться не будем. В процессе практического обучения написанию драйверов, я буду разъяснять все неясные термины и понятия. А пока перейдём к API. 

API (Application Programming Interface) — это интерфейс прикладного программирования. Он позволяет обращаться прикладным программам к системным сервисам через их специальные абстракции. API-интерфейсов несколько, таким образом в Windows-системах присутствуют несколько подсистем. Перечислю: 

1) Подсистема Win32.2) Подсистема VDM (Virtual DOS Machine — виртуальная ДОС — машина)3) Подсистема POSIX (обеспечивает совместимость UNIX — программ)4) Подсистемиа WOW (Windows on Windows). WOW 16 обеспечивает совместимость 32-х разрядной системы с 16-битными приложениями. В 64-х разрядных системах есть подсистема WOW 32,которая обеспечивает аналогичную поддержку 32 — битных приложений.5) Подсистема OS/2. Обеспечивает совместимость с OS/2 приложениями.

Казалось бы, всё вышеперечисленное однозначно говорит в пользу WINDOWS NT систем!Но не всё так хорошо. Основа WINDOWS NT (имеются ввиду 32-х разрядные версии) — подсистема Win32. Приложения, заточенные под одну подсистему не могут вызывать функции другой. Все остальные (не Win32) подсистемы существуют в винде только в эмуляции и реализуются функции этих подсистем только через соответствующие функции винды. Убогость и ограниченность приложений, разработанных, скажем, для подсистемы POSIX и запущенных под винду — очевидны.Увы.

Подсистема Win32 отвечает за графический интерфейс пользователя, за обеспечение работоспособности Win32 API и за консольный ввод — вывод. Каждой реализуемой задачесоответствуют и свои функции: функции, отвечающие за графический фейс,за консольный ввод — вывод (GDI — функции) и функции управления потоками,файлами и т.д. Типы драйверов, наличествующие в Windows, я уже упоминала в разделе терминов: монолитный драйвер, фильтр — драйвер и т.д. А раз так, то пора закругляться. Наш краткий обзор архитектуры Windows NT можно считать завершённым. Этого тебе пока хватит для общего понимания концепций Windows NT, и концепций написания драйверов под эту ось — как следствие.

Инструменты

Описать и/или упомянуть обо всех утилитах, могущих понадобиться при разработке драйверов — немыслимо. Расскажу только об общих направлениях.

Без чего нельзя обойтись ни в коем случае — это Microsoft DDK (Driver Development Kit ). К этому грандиозному пакету прилагается и обширная документация. Её ценность — вопрос спорный. Но в любом случае, хотя бы ознакомиться с первоисточником информации по написанию драйверов для Windows — обязательно. В принципе, можно компилять драйвера и в Visual Studio, но это чревато долгим и нудным копанием в солюшенах и vcproj-ектах, дабы код твоего драйвера нормально откомпилировался. В любом случае, сорцы придётся набивать в визуальной студии, т.к. в DDK не входитнормальная IDE. Есть пакеты разработки драйверов и от третьих фирм:WinDriver или NuMega Driver Studio, например. Но у них есть отличия от майкрософтовского базиса функций (порой довольно большие ) и многие другие мелкие неудобства. Так что DDK — лучший вариант. Если же ты хочешь писать драйвера исключительно на ассемблере, тебе подойдёт KmdKit (KernelMode Driver DevelopmentKit) для MASM32. Правда, этот вариант только для Win2k/XP.

Теперь можно поговорить о сторонних утилитах. Некоторые уже включены в стандартную поставкуWindows:  редактор реестра. Но их в любом случае не хватит. Надо будем инсталлить отдельно.Множество наиполезнейших утилит создали патриархи системного кодинга вWindows: Марк Руссинович, Гарри Нэббет, Свен Шрайбер… и т.д. Вот о них и поговорим.Марк Руссинович создал много полезных утилит:RegMon, FileMon (мониторы обращений к реестру и файлам соответственно), WinObj (средство просмотра директорий именобъектов), DebugView,DebugPrint (программы просмотра, сохранения и т.д. отладочных сообщения) и проч. и проч. Все эти утилиты и огромное количество других можно найти на знаменитом сайте Руссиновичаhttp://www.sysinternals.com.

На диске, прилагающемся к знаменитой книге «Недокументированные возможности Windows 2000» Свена Шрайбера,есть замечательные утилиты w2k_svc, -_sym, -_mem, позволяющие просматривать установленные драйвера, приложения и службы, работающие в режиме ядра, делать дамп памяти и т.д. Все эти утилиты, а также другие программы с диска можно скачать сhttp://www.orgon.com/w2k_internals/cd.html. 

Напоследок нельзя не упомянуть такие хорошие проги, как PEExplorer, PE Browse Professional Explorer, и такие незаменимые, как дизассемблер IDA и лучший отладчик всех времён и народов SoftICE.

Заключение

Ну вот и подошла к концу первая статья из цикла про написание драйверов под Windows. Теперь ты достаточно «подкован» потеоретической части, так что в следующей статье мы перейдём к практике. Желаю тебе удачи в этом интереснейшем деле — написании драйверов! Да не облысеют твои пятки!

xakep.ru

Разработка драйверов устройств в Linux

Главная > Курсы > Разработка СПО в Linux | Сетевые технологии  | Курсы Linux

Разработка драйверов устройств в Linux

Этот курс в нашем Центре успешно закончили 2337 человек!

Linux device drivers development

Цель курса: - дать знания и навыки, необходимые для разработки драйверов устройств для ОС Linux.

Ядро Linux используется в большинстве современных смартфонов за счет применения в популярной платформе Android. Кроме того, не следует забывать и про лидирующее положение Linux в сегменте суперкомпьютеров (469 из  топ 500 суперкомпьютеров под данным www.top500.org), второе место в сегменте интернет-серверов и высокую популярность в корпоративном сегменте. GNU Compilers Collection является лидером в списке аналогичного программного обеспечения по популярности среди средств разработки решений с открытым исходным кодом. 

Курс рассчитан на программистов, окончивших курс «Linux (Ubuntu). Уровень 2. Программирование в Linux на C» или имеющих эквивалентную подготовку.

Окончив данный курс, вы получите опыт, достаточный, чтобы начать работать в качестве системного программиста Linux.

Программа курса соответствует требованиям профессионального стандарта «Программист».

По окончании курса Вы будете уметь:
  • понимать отличия драйверов устройств от прикладного ПО;
  • знать специфику и ограничения, присущие драйверам устройств;
  • понимать влияние ошибок в драйверах устройств на безопасность всей системы в целом;
  • понимать отличия в реализации символьных драйверов устройств от блочных;
  • знать особенности файловой системы /proc и специфику работы с ней;
  • понимать конкуренцию и ситуацию гонок в ядре, проблемы и их решения;
  • знать аспекты, связанные с совместимостью, специфику использования стандартных типов данных.
Специалисты, обладающие этими знаниями и навыками, в настоящее время крайне востребованы. Большинство выпускников наших курсов делают успешную карьеру и пользуются уважением работодателей.

Продолжительность курса - 40 ак. ч.

Преподаватели курса

Отзывы о курсе

О преподавателе: Замечательный преподаватель курсов по программированию и СУБД с 25-летним стажем работы, опытнейший программист С/C++, Python, Delphi, Ruby и др., сертифицированный тренер PostgreSQL. Читать далее

Все преподаватели по курсу

О преподавателе: Уникальный преподаватель-практик по направлениям «Программирование», «Трехмерная графика» и «MacOS». Занятия по графике проводит комплексно, показывая наглядные примеры из области архитектуры, промышленного дизайна, индустрии, рекламы и проч. Материал подает понятно и ярко, с поучительными примерами и добрым юмором. Не оставляет без исчерпывающего ответа ни одного вопроса. Слушатели ловят каждое его слово, после обучения оставляют восторженные отзывы и с удовольствием идут на дальнейшее обучение к этому преподавателю.Читать далее

Все преподаватели по курсу

Все отзывы по курсу (16)

Предварительная подготовка

Требуемая подготовка: Успешное окончание курса Linux (Ubuntu). Уровень 2. Программирование в Linux на C или эквивалентная подготовка.

Получить консультацию о необходимой предварительной подготовке по курсу Вы можете у наших менеджеров: +7 (495) 232-32-16.

Наличие предварительной подготовки является залогом Вашего успешного обучения. Предварительная подготовка указывается в виде названия других курсов Центра (Обязательная предварительная подготовка). Вам следует прочитать программу указанного курса и самостоятельно оценить, есть ли у Вас знания и опыт, эквивалентные данной программе. Если Вы обладаете знаниями менее 85-90% рекомендуемого курса, то Вы обязательно должны получить предварительную подготовку. Только после этого Вы сможете качественно обучиться на выбранном курсе.

Рекомендуемые курсы по специальности

Чтобы стать профессионалом, мы рекомендуем Вам вместе с этим курсом изучить:

Программа курса

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

  • утренним группам с 8:30 до 10:00
  • дневным группам - по 1 ак.ч. до и после занятий (13.15-14.00, 17.10-17.55)

Ближайшие группы 

*Данная скидка действительна при заказе и оплате очного обучения и вебинаров сегодня. Запишитесь прямо сейчас со скидкой!

*Группа в формате открытого обучения.

*Данная скидка действительна при заказе и оплате очного обучения и вебинаров сегодня. Запишитесь прямо сейчас со скидкой!

*Группа в формате открытого обучения.

На данный момент групп нет

На данный момент групп нет

*Данная скидка действительна при заказе и оплате очного обучения и вебинаров сегодня. Запишитесь прямо сейчас со скидкой!

*Группа в формате открытого обучения.

Полное расписание курса

с 10:00 до 17:00Экономия до 15% Вечер или ВыходныеСтандартная цена ВебинарЭкономия до 15% Индивидуальное обучение Записаться
Частные лица 23 990 20 350 23 990 23 990 20 350 60 000 **
Организации 27 990 27 990 27 990
*Стоимость указана с учетом скидки. Для юридических лиц (организаций) указана минимальная цена, действующая при полной предоплате. Центр предоставляет специальную услугу Индивидуального обучения. Длительность индивидуального обучения - минимум 4 академических часа. Стоимость обучения в Москве уточняйте у менеджера. При выездном индивидуальном обучении устанавливается надбавка: +40% от стоимости заказанных часов при выезде в пределах МКАД, +40% от стоимости заказанных часов и + 1% от стоимости заказанных часов за каждый километр удаления от МКАД при выезде в пределах Московской области. Стоимость выезда за пределы Московской области рассчитывается индивидуально менеджерами по работе с корпоративными клиентами. **Указана минимальная цена за индивидуальное обучение. Число часов работы с преподавателем в 2 раза меньше, чем при обучении в группе. Если Вам для полного усвоения материала курса потребуется больше часов работы с преподавателем, то они оплачиваются дополнительно.

Документы об окончании

В зависимости от программы обучения выдаются следующие документы:

Cert_Common

Свидетельство

БУХ

Удостоверение*

Cert_Inter

Cертификат международного образца

*Для получения удостоверения вам необходимо предоставить копию диплома о высшем или среднем профессиональном образовании.

Сертификаты международного образца выводятся после окончания курса в личном кабинете слушателя.

Все документы Центра

Главная > Курсы > Разработка СПО в Linux | Сетевые технологии  | Курсы Linux

www.specialist.ru


Смотрите также