Как написать драйвер для Windows ?
Информация по программированию драйверов Windows . С чего начать. Где скачать DDK . Что читать.
Видимо, перед вами стоит задача взаимодействия с аппаратурой. Наверное, эта аппаратура подключена не к COM порту. Для работы с RS232 Windows API имеет практически все возможности, за исключением взаимодействия с микроконтроллерами по протоколу с девятым адресным битом, да и это возможно осуществить. А вот если требуется вывести байт данных в параллельный порт или еще куда, то тут OpenFile(«LPT». ) уже не работает. На ассемблере тоже бесполезно. Наверное все уже в курсе, что код типа [ out dx,al ] под 200 0 — XP ничего кроме ошибки не дает. Что же делать ? Надо сделать драйвер под Windows. И тут возникает вопрос, а как бы побыстрее научиться писать драйвера, а еще лучше разработать один драйвер д ля Windowsи и забыть, как о кошмарном сне. Возможно многие сочтут, что п рограммировать драйвера, а особенно отлаживать драйвера под Windows, не самое приятное занятие.
Радует, тот факт, что за последние 5 лет появилась рускоязычная литература на тему разработки драйверов ибо осваивать эту тему по документации Microsoft DDK весьма утопичное занятие.
X очется отметить книгу : « Программирование драйверов для Windows .» Автор: В.П. Солдатов . Издательство: Бином. ISBN: 5-9518-0099-4
Данная книга не содержит диска с примерами, да и вообще примерами не изобилует, зато дает очень хорошее описание архитектуры ядра Windows , и может служить хорошим стартом для освоения программирования драйверов.
Понятно, что для создания дравера необходимо инструментальное средство разработки драйверов, и чем оно мощнее, тем быстрее вы достигните цели. С амое примитивное из средств рахзработки драйверов это , это DDK, Driver Development Kit.
И вот что досадно, если в 2000-2002 году DDK 2000 можно было скачать бесплатно, то сейчас бесплатно доступна только Windows Server 2003 DDK , причем скачать нельзя, можно только получить CD по почте, при этом необходимо иметь кредитку, т.к. DDK то бесплатно, но пересылка диска будет стоить 25 $ . Деньги не великие, так что если имеете кредитку и желаете DDK 2003 , вот ссылка http://www.microsoft.com/whdc/devtools/ddk/default.mspx
Более навороченный продукт DDK Suite 3, обойдется уже в 199 $ плюс те же 25 за доставку.
Найти DDK на рынке за 60 рублей, наверное можно но сложно, слишком редко востребуемый продукт. Ну а если нет кредитки или времени на ожидание диска, не отчаивайтесь, и не благодарите 🙂
Скачивайте все файлы что там есть. Распакуете ddk.rar и запускайте ksetup.exe. Спасибо Яндексу за 67 мегабайт.
Правда писать драйвера при помощи только DDK не самый удобный на сегодня способ , а посему предлагаю обратить внимания на два продукта.
Оба по сути похожи, а именно позволяют создавать драйвера двух типов.
Работающие через некий универсальный драйвер.
Полноценные драйвера работающие в режиме ядра.
Как вы правильно догадались первый способ значительно легче и не требует от программиста глубокого понимания процессов происходящих в ядре, да вообще ни какого понимания не требует.
Мастер создания драйверов, DriverWizard ( Jungo) сгенерит код, который вы сможете вставить в свои программы и обращаться к портам в-в, памяти и даже использовать прерывания. Все очень просто: Утром установите WinDriver, вечером ваша программа будет работать с аппаратурой, но остерегайтесь WinDrivera . Покупать вы его конечно не будете, и при установке , выберете 30-дневную копию. В течении месяца все будет работать и Driver Wizard и все программы его использующие. Потом DriverWizard работать перестанет, но к тому времени вы то уже поймете, что он и не нужен. Нужн а только библиотека WINDRVR.SYS, которая и обеспечивает взаимодействие с портами Вашей программе. Так вот этот самый WINDRVR.SYS, через который будет работать ваша программа, в отличии от DriverWizarda не подает никаких признаков того, что срок истек и он больше работать не будет. Драйвер открывается как и раньше, все функции возвращают результат S UCCESS однако программа не работает, потому что драйвер пишет не то и не туда и читает не оттуда и не всегда. При этом можно подумать, что проблемы с аппаратурой, поэтому при использовании Win D r i vera лучше отыскать serial number и зарегистрировать. Слишком коварная у него система защиты.
Numega Driver Studio.имеет в своем составе аналогичный компонент: Driver Agent сгенерит все необходимое для использования универсального драйвера. Вы даже сможете создать свой файл.sys, который будет работать в составе ядра и делать там все, что вы запрограммируете, например обрабатывать прерывания. При этом вникать опять же ни во что не придется. За день разработаете свой драйвер.
Оба пакета содержат средства для написания настоящих драйверов, НО при помощи DriverStudio или WinDriver это делать значительно проще, чем при помощи только DDK , в дополнение они имеют хорошую документацию касающуюся общих вопросов драйверов, более читаемую чем в DDK . Кстати DDK для работы с ними необходимо установить.
Установив Numega Driver Works, Вы открываете студию (не Driver , а Microsoft Visual Studio ), выбираете там NewProject и видете в окне мастера рядом с
MFC App Wizard
NT/WDM Driver Wizard
Мастер за 9 шагов, сгенерит проект из которого получается драйвер и exe-шник, который этот драйвер тестирует. Кроме того в Driver Studio входит (я бы назвал это Driver Developmen Foundational Classes) набор классов, которые содержат все необходимое для разработки драйверов, так же как MFC для разработки приложений.
Ну, а если вам необходимо прочитать — записать байт в порт, не используя прерываний, так тут ни каких драйверов писать не надо, все уже написано до нас.
Универсальный драйвер, который позволяет обращаться к портам ввода-вывода. Больше он ничего не может, но в большинстве случаев можно обойтись и этим. Драйвер этот называется PortIo .sys и входит в состав примеров прилагаемых к Numega Driver Works . Я его скомпилировал, вам остается скачать и использовать. Драйвер предоставляет 4 функции: Open, Close,Read и Write. Есть тестовое приложение которое демонстрирует как эти функции использовать.
Чтобы установить драйвер надо:
- Поместить файл portio.sys в C:\WINDOWS\SYSTEM32\DRIVERS\
- Прописать его в реестре. Для XP и 2000 это делается командой regini portio.ini в результате в разделе HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services появится раздел PortIo.
В нем параметры:
ErrorControl 0x00000001 ImagePath \SystemRoot\System32\Drivers\portio.sys Type 0x00000001 Start 0x00000002 Перезагрузите систему.
Драйвер установлен можно использовать.
Смотрите тестовое приложение.
Как писать драйвер под windows
Как писать драйвера
Как писать драйвера (часть 1)
Драйвера под Windows являются для большей массы программистов, «тайной за семью печатями». И вовсе не потому, что это что-то архисложное, сколько по причине абсолютной недокументированности идеологии.
Начав заниматься этой темой я понял особенную необходимость не в переводе стандартного Майкрософтовского описания, а именно неких заметок, по созданию и сбору драйверов для различных устройств.
Уточню, что в этих заметках, будут только те данные, которые я проверил лично, с которыми столкнулся в процессе разработки промышленных драйверов, бегающих сегодня в коммерческих пакетах.
Естественно, все коммерческие секреты я рассказывать не буду.
Эти заметки не ориентированны на людей – проектирующих драйвера, они уже должны знать все, что здесь будет.
Не стоит читать их человеку, слабо знакомому с языками С и С++, а также плохо понимающему объектную структуру и принципы Win32.
Часть первая: «Что нужно для компиляции простейшего драйвера?»
Для разных типов Windows вам понадобиться разный набор программ.
В любом случае надо скачать Win DDK (Driver Development Kit), для той платформы, под которую пишется драйвер. Его можно брать с разных источников, лично я предпочитаю сайт Майкрософта.
Для линейки 9х вам понадобится и SDK (Software Development Kit), который возьмите там же.
Так как под продукцию Билла Гейтса стоит поставить и VC++ , я посоветую ставить в таком порядке.
Для более поздних платформ достаточно только DDK.
Установив все эти продукты вы получите возможность собирать и инсталлировать драйвера.
Первая тестовая компиляция.
Да, не удивляйтесь, начнем мы именно с этого. По принципу создания, я обычно предпочитаю не писать весь драйвер целиком с нуля. Поверьте, очень нудное и практически невозможное занятие. Мне так и не удалось довести это до конца, уж слишком глубоких знаний самой системы это требует.
Мы пойдем более простым и надежным путем.
После установки DDK, у вас появились в директории samples или sources, в зависимости от версии, коды примеров драйверов. Это ваша библия, которую стоит изучить.
Проверка, собственно, правильности прописывания путей (environments), и собственно самой DDK и SDK – состоит в пробной компиляции примера.
Компиляция осуществляется посредством стандартных средств.
Программами build, make и link.
Makefile уже написан за вас, и вам надо сделать следующее. Зайдя в Start menu в разделе Programs|DDK|Build environment выберите вариант free и запустите.
Запустится стандартное окно терминала, с установленными переменными среды сборки DDK.
Перейдите в директорию с sources драйвера, который вы выбрали. Компилировать и собирать в корневой директории DDK не стоит.
Это приведет к сборке ВСЕХ драйверов примеров и компиляции всех библиотек, а это очень долго.
В корневой директории примера (драйвер принтера в нашем случае) запустите build с параметрами –cZ.
Если вы получили ошибки перепроверьте ваши установки. В нормальном случае вы получите возможность увидеть надпись об удачной сборки sys или vxd файла – в определенной директории. Чаще всего это Free/i386/
Но бывает и другая. Это говорит о том что ваш драйвер собран правильно и установка прошла успешно
Как писать драйвера (часть 2)
Прежде, чем хвататься за описание самого драйвера, давайте определимся с типами существующих драйверов.
По существующему в DDK разделению сам Microsoft подразделяет драйвера на следующие типы:
– Kernel Streaming Drivers;
– Virtual Device Drivers.
С графическими и сетевыми драйверами более менее понятно по названию.
Виртуальные VDD относятся к устройствам, нуждающимся в работе под MS-DOS.
А вот два первых типа мы разберем немного подробнее.
На рисунке видна структура всех драйверов типа Kernel-Mode Drivers. В иерархии этой системы различают драйвера для работы на верхнем уровне(high-level), промежуточные (intermediate) и низкого уровня (low-level).
К первому относятся драйвера файловый систем (FAT, NTFS), ко второму – драйвера фильтры, драйвера виртуальных дисков, I/O устройств, а к третьему – драйвера непосредственно работающие на уровне прерываний.
Kernel Streaming Drivers – это в первую очередь драйвера устройств видео и аудио потока.
Немного лирики. По сути все драйвера, работают на уровне kernel, поэтому такое деление, лично я, считаю не оправданным, но раз создатели говорят «есть контакт», нам придется «есть контакт».
Более подробную информацию по разделению на типы, и их описание можно найти в Help DDK идущего в поставке DDK, и устанавливаемому вместе с этим пакетом.
Отступим от абстрактной классификации, и перейдем к более земным вещам.
Опишем среднестатистическую структуру драйвера.
Каждый драйвер является набором функций, встраивающихся при инсталляции в структуру Windows машины, и выполняемых при возникновении определенного события. По сути – это функции конечного автомата Windows которые обязаны соответствовать определенному формату.
В каждом драйвере есть входная точка, соответствующая функции main(), в замечательном С, WinMain() в Windows. Функция вызывается при старте системы автоматически в момент инициализации обслуживающей части Windows к которой относится данный драйвер.
Функции выхода нет.
Еще чуть-чуть лирики. В нашей с вами ситуации дистанционного общения, придется брать и писать один из драйверов для примера. Без этого будет сложновато объяснить, что мы делаем и зачем. Поэтому я предлагаю выбрать некий тип для нашего примера.
Так как большая часть драйверов работает для поддержки и управления реального физического устройства, предположить, что у всех вас есть одинаковая плата или одинаковый дисковод, было бы верхом глупости.
Отбросив таким образом драйвера, который привязаны к железке мы остановимся на типе Network – сетевых драйверах.
Сетевые драйвера тоже как и драйвера типа kernel, делятся на такие же три уровня. Вспомните, что все разделение я назвал условным.
Меняется только название.
Структура сетевой части драйверного поголовья, похожа на пирог. Давайте посмотрим как это выглядит.
На рисунке четко видно, как структура NDIS (Network Driver Interface Specification) пронизывает все слои драйверного пирога.
Теперь давайте представим как проходит пакет от пользовательской аппликации к посылке через модем или сетевую карту в сеть. Все клиенты Microsoft, такие как браузер IE, или Outlook, пользуются одним и тем же слоем библиотек, откликающихся на имя транспортные библиотеки.
Главным в этом семействе является библиотека сокетов. Про то как она работает вы прочитаете в наших выпусках посвященных Winsock. В любом случае библиотека, оформив запрос отправляет его в NDIS, и о нем совершенно забывает. В структуре нашего пирога, главным управляющим звеном является как раз NDIS. Этот цербер распределяет кому и как передать пакет. Собственно драйвер в сети встроенный в NDIS предоставляет управленцу все необходимые прототипы функций. Начав с первого типа, протокольного, пакет проходит через слой промежуточных драйверов и попадает в драйвер модема (Miniport – это слово я на русский затруднился перевести в контексте, пусть так и останется).
Пишем свой промежуточный драйвер. Часть 1
Здравствуйте, уважаемые хабраюзеры!
Интересовались ли Вы когда-нибудь как работает снифер и что он из себя представляет? Или как Ваш любимый фаервол защищает Вас от троянов и прочей гадости на сетевом уровне? Да и вообще, как он работает? Я уверен, что Вы задавали себе такого рода вопросы, но все же, если нет, то я от части Вам про это расскажу. Начиная с этой статьи мы будем постепенно осваивать написание своего сниферо-подобного драйвера. Сегодня мы рассмотрим некоторые общие положения, которые нам будут необходимы для понимая всего того, что будет происходить в последующих статьях. Перед прочтением этой статьи, дабы у Вас началась складываться более или менее ясная картина, я рекомендую Вам прочтение прошлого топика Краткий обзор драйверов спецификации NDIS
Всем кому это интересно прошу под кат.
Сразу скажу, что статья ориентирована на пользовотелей, которые слабо знакомы с данной темой, поэтому буду стараться излагать подробно некотрые вещи. Ну что ж, приступим.
Что нам потребуется и с чего начать?
На многих форумах очень часто можно увидеть вопросы такого садержания: «Я начинающий программист, хочу писать драйвера, но не знаю как. С чего мне начать?» Поэтому, пытаясь описывать все последовательно я счел нужным рассказать что нам потребуется.
Если вы решили заняться написанием драйверов, будь то обычные драйвера или будь они сетевыми Вам обязательно потребуется скачать WDK-Windows Driver Kits (он же NT DDK). Установив это добро на свою рабочую лошадку Вы станете вооружены для написания своего драйвера. Вместе с WDK идет своя документация, заголовочники, либы и примеры (они то нам и потребуются, став скелетом нашего будующего дрйвера). Работая в Visual Studio вы также можете скачать плагин для VS под названием Visual DDK. Это интеграционное средство поможет Вам в написании (и сборке) драйверов непосредственно из Visual Studio. Здесь Вы сможете ознакомиться с кратким хелпом по использованию этого средства. Хочу подчеркнуть, что установка Visual DDK для работы с драйверами из студии вовсе не обязательна, вы можете писать и собирать свои драйверы в VS и без этого средства! Это всего лишь плагин.
Мы будем рассматривать пример промежуточного драйвера из WDK и модифицируем его. Почему именно промежуточный? Тем, кто ознакомился с предыдущей статьёй или просто сведом в спецификации NDIS известно, что промежуточный сетевой драйвер объединяет в себе поведение как драйверов протоколов так и минипорт-драйверов, являясь прослойкой между ними. Таким образом на этом примере можно охватить хотя бы частично все типы драйверов NDIS.
Итак, скелетом нашего драйвера будет драйвер Passthru из WDK. Установив WDK Вы сможете найти его исходники в каталоге \src\network\ndis\passthru. Подробнее об этом исходнике можно узнать тут.Что делает этот драйвер? Пока ничего, он просто есть и все. Что будет делать наш драйвер? Он будет выполнять роль снифера, принимая и отправляя пакеты, получая о них информацию и возможно блокируя или изменяя ее. Для начала мы добавим в него некоторый функционал, напишем клиентскую программу, через котрую мы будем общаться с нашим драйвером, но это будет только в следующих статьях, а пока изучим немного теории.
Немного теории
Как Вы наверняка знаете, аналогом функции main в драйверах я вляется функция DriverEntry, у промежуточного дрйвера есть ряд дел, котрые он должен сделать, прежде чем начать функционировать. А сделать в DriverEntry он должен следующее:
- зарегистрировать себя в NDIS (с помощью функции NdisMInitializeWrapper);
- зарегистрировать свой «вид сверху» — виртуальный адаптер (с помощью функции NdisIMRegisterLayeredMiniport);
- зарегистрировать свой «вид снизу» (виртуальный протокол) (с помощью функции NdisRegisterProtocol);
- сообщить в NDIS, что «вид сверху» и «вид снизу» есть разные виды одного и того же драйвера (с помощью функции NdisIMAssociateMiniport).
Вот и все. Помните в прошлой статье я писал про систему коллбэков у драйверов минипорта и протокола? Так вот, выполняя эти 4 действия промежуточный драйвер именно здесь регистрирует свои callback-функции. Если Вы раньше имели дело с драйверами минипорта и/или протокола, то Вы заметите, что функция NdisIMRegisterLayeredMiniport очень похожа на функцию NdisMRegisterMiniport (вызывается в случае регистрации не виртуального адаптера), а при создании как вируального так и не виртуального протокола вообще вызывается одна и та же функция NdisRegisterProtocol. Изначально Вы заполняете поля структур NDIS_PROTOCOL_CHARACTERISTICS и NDIS_MINIPORT_CHARACTERISTICS (здесь и записываются имена используемых коллбэков), а затем передаете их как параметры соответствующим функциям.
Теперь давайте поговорим немного о сниферах.