Пишем драйвер visual studio
Создание драйверов. Часть 1. В данной статье мне хотелось бы показать, как создавать драйвера, если Вам необходима теоретическая информация то советую прочесть книгу Дэвида Соломона и Марка Руссиновича «Внутреннее устройство Microsoft Windows 2000». Для начала мы сделаем простой драйвер для Windows 2000, который послужит нам каркасом для дальнейших экспериментов. Для работы понадобится «Windows 2000 Driver Development Kit», именно с помощью данного пакета создаются драйвера, в его состав входят компилятор, линкер, заголовочные файлы, lib-файлы, документация, полезные инструменты и конечно множество примеров.
Начнем, создайте на диске С:\ папку и назовите её «MyFirstDriver», затем в ней папку «sys» и «loader», это нужно для того чтобы легче было работать с путями к бинарным файлам. В папке «sys» создайте три файла, с именами «makefile», «sources» и «MyFirstDriver.c». В файле «makefile» напишите следующее:
Этот файл нужен для работы программы Build. В файле «sources» напишите следующее:
TARGETNAME=MyFirstDriver
TARGETTYPE=DRIVER
TARGETPATH=obj
SOURCES=MyFirstDriver.c
Этот файл нужен для настройки процесса компиляции:
TARGETNAME – имя драйвера;
TARGETTYPE – тип бинарного файла, который мы хотим создать, может иметь следующие значения: DRIVER, GDI_DRIVER, MINIPORT, LIBRARY, DYNLINK (for DLLs).
TARGETPATH – путь для папки с временными файлами;
SOURCES – путь к файлу с исходным текстом драйвера.
Теперь переходим к исходному файлу «MyFirstDriver.c», в нем напишите следующее:
будет присутствовать только в версиях Checked.
Для компиляции запустите «Checked Build Environment»,
Появится консольное окно, далее с помощью команды «cd» перейдите в папку с файлами драйвера и наберите команду build –cZ
Теперь драйвер готов, следующим шагом будет создание программы, которая будет динамически загружать наш драйвер с помощью SCM (Service Control Manager), подробно о нем написано в MSDN`е. Для этого создайте обыкновенную консольную версию программы и поместите все файлы проекта в папку «loader», в исходнике загрузчика напишите следующее:
Перед тем как запускать программу, запустите DebugView, только после этого запускайте загрузчик драйвера.
Как Вы видите наш драйвер заработал, на этом пока все.
- Вы не можете создать новую тему
- Вы не можете ответить в тему
Программирование драйверов устройств для чайников
Введение
В этой теме я планирую дать серию уроков, которые позволят любому человеку получить базовое представление о том, как устроена система взаимодействия прикладного ПО и драйверов ОС Windows, научиться читать исходные коды существующих драйверов устройств или написать свой собственный драйвер, работающий с его собственным устройством.
Также эти уроки могут помочь аудитории владельцев видеокарт с графическими чипами, произведенными компанией 3dfx, разобраться в доступных исходных кодах драйверов этих видеокарт. Упомянутые исходники могут быть с наименьшим количеством переделок откомпилированы под Windows XP/Windows 2003 Server, которые и будут являться основной целевой системой. В более современной Windows Vista/7 несколько изменилась модель драйверов, наиболее сильно это затронуло графическую подсистему. Это означает, что для их корректной работы придется переписать весьма значительную часть кода. Кроме того, под х64 версиями Vista/7 и более старших операционных систем просто так нельзя загрузить драйвер, не имеющей цифровой подписи. Подпись стоит порядка 500 долларов в год (150, если найти купон на скидку), их не любят давать частным лицам и даже небольшим организациям. Кроме того, если в подписанном драйвере обнаружится уязвимость и ей воспользуются хакеры – то подпись данного [почти всегда юридического] лица аннулируется и у него возникают проблемы с получением новой. Еще есть такая процедура, как WHQL-сертификация, но ее я вообще не собираюсь пока здесь обсуждать.
Весьма приветствуется, если другие люди будут давать здесь свои собственные уроки, не выходящие за пределы темы. Также здесь можно задавать любые вопросы, предлагать свои идеи для следующих уроков и отписываться об своих удачных/неудачных результатах.
Для начала работы требуется иметь некоторое знакомство с любым языком программирования. Думаю, для этого вполне достаточно школьного / вузовского курса для непрограммистов. Если же в современных программах образования знакомство с программированием не было предусмотрено/за давностью лет курс забыт или просто что-то непонятно – отписывайтесь в теме, я напишу другие уроки, подробней раскрывающие непонятную тему.
Урок 0. Установка и настройка программного обеспечения
Список используемого программного обеспечения:
Все используемое мною программное обеспечение – на английском языке. В большинстве случаев можно использовать и русские версии, но может возникнуть путаница в командах или другие проблемы с совместимостью. Для начала работы потребуется компьютер с установленной обычной 32-разрядной Windows XP/2003. Продвинутые пользователи могут пользоваться необычной – отладочной, она же - checked build. Эта версия показывает больше информации при отладке устройств. Обычная же версия Windows носит название free build. Компьютер для экспериментов может быть как реальным, так и виртуальным. Разрабатываемые программы я буду проверять на одной реальной машине и одной виртуальной. На обоих установлен Windows Server 2003 R2 Enterprise Edition c SP2. Виртуальная машина запущена под VMWare Workstation 8.0.2.
Установка Visual Studio
Я буду использовать Visual Studio 2010 Ultimate. В принципе, ставить ее не обязательно, так как все необходимые инструменты, включая компилятор и заголовки есть и в WDK. Но для написания прикладных программ, в особенности для новичка, она намного удобней вызова компилятора из консоли. Если ее все же планируется установить, то лучше делать это перед установкой WDK.
Рис 0.1 – Выбор пакетов в установщике Visual Studio
Установка WDK
Монтируем скачанный iso-образ аналогично тому, как это было сделано с Visual Studio. Запускаем KitSetup.exe, на этапе выбора пакетов устанавливаем галочки в соответствии с рисунком:
Рис 0.2 – Выбор пакетов в установщике WDK
В дальнейшем рассмотрим и драйверы для Windows 9x. Для этого потребуется другое программное обеспечение, но программирование драйверов для Windows 9x проще.
развертывание драйвера на Windows 10 IoT Базовая с Visual Studio.
настройте проект Visual Studio драйвера, чтобы можно было компилировать и развертывать драйвер для определенной платформы на этапе разработки драйвера.
В этом упражнении вы можете использовать образец драйвера гпиокмдфдемо.
Если вы хотите добавить драйвер к образу, ознакомьтесь с инструкциями в нашем производственном руководством IOT.
Шаг 1. Настройка
На устройстве
- убедитесь, что на устройстве установлен образ иоткоре, следуя инструкциям Начало работы.
- Подключение на устройство с помощью PowerShell.
На компьютере
убедитесь, что установлен Visual Studio 2017.
установите пакет драйверов Windows. Вам потребуется установить пакет SDK и WDK.
Установите сертификаты, чтобы правильно подписать драйвер и запустить его на устройстве. В командной строке с повышенными привилегиями выполните команды, перечисленные ниже.
- cd c:\Program Files (x86)\Windows Kits\10\Tools\bin\i386
- set WPDKContentRoot=c:\Program Files (x86)\Windows Kits\10
- InstallOEMCerts.cmd
Примените исправление, чтобы включить развертывание F5 из VS. В командной строке с повышенными привилегиями выполните следующие команды:
- cd %TEMP% (изменит каталог на c:\users\<usernsme>\Appdata\Local\Temp )
- md “WdkTempFiles” Создание каталога "Вдктемпфилес" вручную. это обходной путь для ошибки в средствах и должен выполняться на компьютере md “WdkTempFiles” .
Шаг 2. Инициализация устройства с помощью Visual Studio
откройте Visual Studio и выберите драйвер тест > настройка устройств > добавить новое устройство .
- Если пункт меню драйвер не отображается, проверьте, установлен ли пакет SDK.
В диалоговом окне Конфигурация устройства
- Введите удобное для пользователя отображаемое имя для целевого устройства
- Выберите тип устройства = мобильный.
- В отображаемом списке отсортируйте по IP-адресу и найдите адрес для устройства IoT и выберите. Если есть две записи, выберите одну из них с ненулевым идентификатором GUID. Убедитесь, что строка выбрана — она должна выделять синим цветом.
- В нижней части диалогового окна находятся два переключателя. Выберите тот, который говорит Device подготавливать устройство, и выберите параметры отладчика. Щелкните Далее.
На странице Настройка параметров отладчиказадайте соответствующие параметры. Следует отметить следующее.
- Минновбоардмакс может использовать сеть для отладки.
- Использовать сеть типа подключения
- Выберите порт — по умолчанию можно использовать
- Выберите ключ — по умолчанию можно использовать
- Выберите IP-адрес узла компьютера, на котором работает Visual Studio. Не используйте адрес аутонет (169.xxx).
- Щелкните Далее.
- Raspberry Pi использует последовательное подключение для отладки ядра.
- Подключение соответствующий кабель последовательной отладки для устройства PI и главного компьютера
- Выберите серийный номер для типа подключения.
- Заполните остальные параметры, соответствующие Raspberry Pi.
- Щелкните Далее.
WDK в Visual Studio теперь будет подготавливать устройство IoT. ТАЕФ и ВДТФ будут установлены на устройстве, и устройство будет настроено для отладки ядра в соответствии с указанными выше параметрами.
- Теперь устройство подготовлено, и в нем отображается состояние конфигурации тестирования устройства , настроенное для тестирования драйверов .
шаг 3. настройка проекта драйвера Visual Studio
- запустите Visual Studio в режиме администратора и откройте проект драйвера Visual Studio.
- Убедитесь, что версия целевой платформы соответствует пакету SDK, установленному на компьютере разработки. выберите Project свойства в окне обозреватель решений. В разделе Общие свойства конфигурации убедитесь, что версия целевой платформы соответствует пакету SDK, установленному на компьютере разработчика. Версию пакета SDK можно проверить с помощью панели управления программы > и компоненты.
- в разделе Project добавить новый элемент > Visual C++ > Windows драйвервыберите > и нажмите кнопку >.
Package.pkg.xml файл будет добавлен в проект. В этом файле укажите Теги "владелец", "платформа", "компонент" и "подкомпоненты".
- задайте номер версии пакета на Project свойства паккажежен > версия. Обратите внимание, что каждый раз, когда необходимо выполнить установку или переустановку драйвера, этот номер версии должен быть увеличен.
- в разделе Project свойства подпись > тестового сертификатавыберите тестовый сертификат (Телефон OEM-тестовый сертификат).
- Перейдите к разделу Установка драйвера и выберите развертывание .
- В раскрывающемся списке Target Device Name (имя целевого устройства ) выберите целевой объект, созданный выше в процессе подготовки. Обратите внимание на два варианта установки, переустановки и быстрой переустановки. Выберите параметр и нажмите кнопку ОК.
- Для первоначальной установки драйвера на целевой сервер используется Установка и повторная установка. при этом пакет драйверов устанавливается с помощью Windows обновления стека и может занять несколько минут. Этот параметр должен использоваться при каждом изменении INF-файла.
Каждый раз, когда этот параметр используется для установки драйвера после первоначальной установки, номер версии пакета должен быть увеличен.
- Быстрая переустановка может быть использована после установки драйвера, и в INF-файле Drivers отсутствуют последующие изменения, влияющие на реестр. Этот метод обходит процесс установки, завершает работу всех девнодес, связанных с драйвером, копирует драйвер и перезапускает девноде. Это займет несколько ( < 20) секунд.
Этот метод не гарантируется успешно — если по какой-либо причине девноде не может быть выключен для освобождения драйвера, операция завершится ошибкой. Это может быть вызвано сбоем оборудования или первоначальной неудачной реализацией драйвера. В этом случае необходимо использовать параметр install/REINSTALL.
теперь проект Visual Studio готов к созданию и развертыванию драйвера на целевом устройстве. Если вы используете пример драйвера гпиокмдфдемо, вам потребуется создать таблицу ACPI и скопировать ее на целевое устройство, а затем выполнить действия, описанные в разделе Создание драйвера в Visual Studio.
Шаг 4. сборка и развертывание драйвера
Это можно сделать двумя способами: с помощью клавиши F5 и с помощью параметра deploy . в обоих случаях драйвер будет создан и развернут (т. е. установит его на устройстве), а F5 присоединит Visual Studio отладчика ядра к установленному и загруженному драйверу.
Некоторые пользователи предпочитают использовать функцию развертывания и присоединяют другой отладчик ядра, например WINDBG или KD. Это обеспечивает большую гибкость, чем использование отладчика VS.
Развернуть
- Щелкните правой кнопкой мыши проект в обозревателе решений.
- Выберите Развернуть.
- Процесс развертывания должен быть продолжен. После развертывания устройство IoT будет перезагружено, и во время установки должен отобразиться экран "шестеренки".
- В окне сборка убедитесь, что настройки верны: Текущая сборка сборки совпадает с настройкой на целевом устройстве. Именно для этого нужно, чтобы в целевом имени была ценная дуга. Целевой объект будет отображаться в поле вид в строке меню в VS сверху вниз.
- Нажмите клавишу F5. Целевой объект будет создан, развернут и подключен к отладчику ядра VS.
- После перезагрузки убедитесь, что PowerShell все еще подключен к нему, в противном случае повторно подключитесь к целевому устройству с помощью enter-pssession команды PowerShell.
Известные проблемы
Ошибки подготовки
Список ошибок:
- Ошибка: не удалось успешно завершить задачу "регистрация ВДТФ".
- Ошибка: не удалось успешно завершить задачу "Настройка параметров отладчика ядра (возможно, перезагрузка)"
Обходной путь: Эти ошибки почти наверняка можно игнорировать.
Дополнительно
Следующая ошибка отобразится в диалоговом окне " ход настройки конфигурации устройства ":
На этом этапе можно безопасно щелкнуть Готово , а затем Применить и ОК.
Это неопасная ошибка, сформированная состоянием гонки, приводящая к неправильной обработке журнала результатов. Это можно проверить, просмотрев файл журнала в следующей области:
Откройте FTP-подключение к этому каталогу (как показано на экране устройства) Data/test/bin/DriverTest/Run . Например, ftp://<ip address of device>/Data/test/bin/DriverTest/Run/
Скопируйте Configuring_computer_settings_(possible_reboot)_identifier.wtl файл на локальный компьютер. Обратите внимание, что имя файла журнала совпадает с именем невыполненной задачи.
Откройте файл в блокноте.
Прокрутите журнал до конца. Будет представлен следующий текст, указывающий, что подготовка выполнена успешно.
Процессорные архитектуры x86 и x64 имеют четыре кольца защиты, из которых в Windows по факту используются всего два — это ring 3 (режим пользователя) и ring 0 (режим ядра). Бытует мнение, что код режима ядра — самый привилегированный и «ниже» ничего нет. На самом деле архитектура x86/x64 позволяет опускаться еще ниже: это технология виртуализации (hypervisor mode), которая считается кольцом −1 (ring −1), и режим системного управления (System Management Mode, SMM), считающийся кольцом −2 (ring −2), которому доступна память режима ядра и гипервизора.
Итак, мы решили писать собственный драйвер. Начнем с выбора инструментария. Я советую использовать Microsoft Visual Studio, как наиболее user-friendly IDE. Также необходимо будет установить Windows SDK и Windows Driver Kit (WDK) для твоей версии ОС. Кроме того, я крайне рекомендую запастись такими утилитами, как DebugView (просмотр отладочного вывода), DriverView (позволяет получить список всех установленных драйверов) и KmdManager (удобный загрузчик драйверов).
Драйверы в Windows начиная с Vista могут быть как режима пользователя (User-Mode Driver Framework, UMDF), так и режима ядра (Kernel-Mode Driver Framework, KMDF). Более ранние драйверы Windows Driver Model (WDM) появились в Windows 98 и сейчас считаются устаревшими.
Драйверы UMDF имеют намного более ограниченные права, чем KMDF, однако они используются, например, для управления устройствами, подключенными по USB. Помимо ограничений, у них есть очевидные плюсы: их намного проще отлаживать, а ошибка в их написании не вызовет глобальный системный сбой и синий экран смерти. Такие драйверы имеют расширение dll.
Что до драйверов режима ядра (KMDF), то им дозволено куда больше, а расширение файлов, закрепленное за ними, — это sys. В этой статье мы научимся писать простые драйверы режима ядра, напишем драйвер для скрытия процессов методом DKOM (Direct Kernel Object Manipulation) и его загрузчик.
Создание драйвера KMDF
После того как ты создашь проект драйвера, Visual Studio автоматически настроит некоторые параметры. Проект будет компилироваться в бинарный файл в соответствии с тем, какая выбрана подсистема. Наш вариант — это NATIVE, подсистема низкого уровня, как раз для того, чтобы писать драйверы.
Точка входа в драйвер
Строго говоря, точка входа в драйвер может быть любой — мы можем сами ее определить, добавив к параметрам компоновки проекта -entry:[DriverEntry] , где [DriverEntry] — название функции, которую мы хотим сделать стартовой. Если в обычных приложениях основная функция обычно называется main, то в драйверах точку входа принято называть DriverEntry.
Выглядеть это будет так:
Давай пройдемся по параметрам, которые передаются DriverEntry . pDriverObject имеет тип PDRIVER_OBJECT , это значит, что это указатель на структуру DRIVER_OBJECT , которая содержит информацию о нашем драйвере. Мы можем менять некоторые поля этой структуры, тем самым меняя свойства драйвера. Второй параметр имеет тип PUNICODE_STRING , который означает указатель на строку типа UNICODE . Она, в свою очередь, указывает, где в системном реестре хранится информация о нашем драйвере.
WARNING
Любая ошибка в драйвере может вызвать общесистемный сбой и BSOD. Вероятна потеря данных и повреждение системы. Все эксперименты я рекомендую проводить в виртуальной машине.
Interrupt Request Level (IRQL)
IRQL — это своеобразный «приоритет» для драйверов. Чем выше IRQL, тем меньшее число других драйверов будут прерывать выполнение нашего кода. Существует несколько уровней IRQL: Passive, APC, Dispatch и DIRQL. Если открыть документацию MSDN по функциям WinAPI, то можно увидеть примечания, которые регламентируют уровень IRQL, который требуется для обращения к каждой функции. Чем выше этот уровень, тем меньше WinAPI нам доступно для использования. Первые три уровня IRQL используются для синхронизации программных частей ОС, уровень DIRQL считается аппаратным и самым высоким по сравнению с программными уровнями.
Пакеты запроса ввода-вывода (Input/Output Request Packet)
IRP — это запросы, которые поступают к драйверу. Именно при помощи IRP один драйвер может «попросить» сделать что-то другой драйвер либо получить запрос от программы, которая им управляет. IRP используются диспетчером ввода-вывода ОС. Чтобы научить программу воспринимать наши IRP, мы должны зарегистрировать функцию обратного вызова и настроить на нее массив указателей на функции. Код весьма прост:
А вот код функции-заглушки, которая всегда возвращает статусный код STATUS_SUCCESS . В этой функции мы обрабатываем запрос IRP.
Теперь любой запрос к нашему драйверу вызовет функцию-заглушку, которая всегда возвращает STATUS_SUCCESS . Но что, если нам нужно попросить драйвер сделать что-то конкретное, например вызвать определенную функцию? Для этого регистрируем управляющую процедуру:
Здесь мы объявили процедуру с именем IRP_MY_FUNC и ее кодом — 0x801 . Чтобы драйвер ее обработал, мы должны настроить на нее ссылку, создав таким образом дополнительную точку входа в драйвер:
После этого нам нужно получить указатель на стек IRP, который мы будем обрабатывать. Это делается при помощи функции IoGetCurrentIrpStackLocation , на вход которой подается указатель на пакет. Кроме этого, необходимо будет получить от диспетчера ввода-вывода размеры буферов ввода-вывода, чтобы иметь возможность передавать и получать данные от пользовательского приложения. Шаблонный код каркаса обработчика управляющей процедуры:
Продолжение доступно только участникам
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Читайте также: