Простейший WDM-драйвер
В данной статье описан процесс написания простейшего драйвера, который выводит скан-коды нажатых клавиш.
Также в данной статье описан процесс настройки рабочего места для написания драйверов.
Если Вам интересно, прошу под кат.
Подготовка стенда
Установка необходимого ПО для написания простейшего драйвера
Необходимое ПО:
- Windows DDK (Driver Development Kit);
- VMware Workstation или Virtual Box;
- Windows XP;
- Visual Studio 2005;
- DDKWizard;
- KmdManager
- DebugView;
Я использую две виртуальные машины, пишу драйверы на одной, а запускаю на другой. Если вы тоже решите так делать то для той машины, на которой вы будете запускать драйверы, хватит 4 Гбайтового жесткого диска и 256 Мбайт оперативной памяти.
Настройка рабочего места
Установка DDK
Установка предельно проста. Единственное на что необходимо обратить внимание — это диалог, в котором Вам предлагается выбрать компоненты, которые будут установлены. Настоятельно рекомендую отметить всю документацию и примеры.
Установка и настройка Microsoft® Visual Studio 2005
Установка Microsoft® Visual Studio 2005 ничем не сложнее установки DDK. Если Вы будете использовать её только для написания драйверов, то когда инсталлятор спросит какие компоненты необходимо установить, выберите только Visual C++.
Далее можно установить Visual Assist X. С помощью этой программы (аддона) можно будет легко настроить подсказки для удобного написания драйверов.
После установки Visual Assist X в Visual Studio 2005 появится новое меню VAssistX. Далее в этом меню: Visual Assist X Options -> Projects -> C/C++ Directories -> Platform: Custom, Show Directories for: Stable include files . Нажимаем Ins или на иконку добавить новую директорию и в появившейся строке, если у вас Windows XP вписываем %WXPBASE%\inc\ddk\wxp .
Установка и настройка DDKWizard
Для того чтобы в Visual Studio можно было компилировать драйверы нужно установить DDKWizard. Его можно скачать с сайта ddkwizard.assarbad.net. Также с этого сайта скачайте скрипт ddkbuild.cmd.
После того как мастер установится необходимо выполнить следующие шаги:
- Создать системные (рекомендуется) или пользовательские переменные со следующими именами и значением, которое соответствует пути к DDK
Версия DDK Имя переменной Путь по умолчанию Windows XP DDK WXPBASE C:\WINDDK\2600 Windows 2003 Server DDK WNETBASE C:\WINDDK\3790.1830 Windows Vista/Windows 2008 Server WDK WLHBASE Windows 7/Windows 2008 Server R2 WDK W7BASE Например, если я использую Windows XP DDK, то я должен создать переменную WXPBASE со значением, которое соответствует пути к DDK. Так как я не изменял путь установки, то значение у меня будет C:\WINDDK\2600.
- Скопируйте скачанный скрипт ddkbuild.cmd, например, в папку с DDK. У меня это C:\WINDDK\.
- Добавьте в конец системной переменной Path путь к скрипту ddkbuild.cmd.
Всё, машина, на которой будем запускать драйверы, готова.
Установка необходимого ПО для запуска драйверов
Теперь настроим машину, на которой будем запускать написанные драйверы.
Нам потребуются следющие программы:
- DebugView (link) — это утилитка, которая позволяет просматривать отладочный вывод как режима пользователя так и режима ядра.
- KmdManager (link) — утилита динамической загрузки/выгрузки драйверов
Всё, машина готова для запуска драйверов.
Постановка задачи
Задача: написать драйвер, который будет выводить в дебаг скан-коды нажатых клавиш и их комбинаций.
Немного теории
Драйвер — это набор функций, которые вызываются операционной системой при наступлении некоторых событий, приходящих от устройства или пользовательского режима.
Существует достаточно много типов драйверов, ниже перечисленны некоторые из них:
- драйверы классов;
- минидрайверы;
- функциональные драйверы;
- фильтрующие драйверы.
Драйверы классов — это драйверы, котрые пишет Microsoft. Это общие драйвера для определенного класса (неужели!) устройств.
Минидрайверы — драйверы, которые используеют драйвер класса для управления устройством.
Функциональные драйверы — это драйверы, которые работают самостоятельно и определяет все что связано с устройством.
Фильтрующие драйверы — драйверы, которые используются для мониторинга или изменения логики другого драйвера путем изменения данных, которые идут к нему.
Необязательно определять все возожные функции в своем драйвере, но он обязательно должен содержать DriverEntry и AddDevice .
IRP — это структура, которая используется драйверами для обмена данными.
Итак, для того чтобы выводить скан-коды (что это?) в дебаг, будем использовать фильтрующий драйвер.
Существует два типа фильтрующих драйверов:
- верхние фильтрующие драйверы;
- нижние фильтрующие драйверы.
То, к какому типу относится ваш драйвер, зависит от того где этот драйвер находится в стеке драйверов устройств. Если Ваш драйвер находится выше функционального драйвера, то его называют верхним фильтрующим драйвером, если ниже, то, нижним фильтрующим драйвером.
Отличия между верхними и нижними фильтрующими драйверами
Через верхние фильтрующие драйверы проходят все запросы, а это значит, что они могут изменять и/или фильтровать информацию, идущую к функциональному драйверу, ну и далее, возможно, к устройству.
Пример использования верхних фильтрующих драйверов:
Фильтр-хук драйвер, который устанавливает свою хук-функцию для системного драйвера IpFilterDirver, для отслеживания и фильтрации траффика. Такие драйверы используются в брандмауэрах.
Через нижние фильтрующие драйверы проходит меньше запросов потому что большинство запросов выполняет и завершает функциональный драйвер.
Проблемы синхронизации
В драйвере, который мы будем писать, есть несколько «проблемных» секций. Для нашего драйвера вполне достаточно использования ассемблерных вставок:
Префикс lock позволяет безопасно выполнить идущую за ним команду. Она блокирует остальные процессоры, пока выполняется команда.
Экшен
Для начала необходимо включить заголовочные файлы «ntddk.h», «ntddkbd.h»
Также необходимо описать структуру DEVICE_EXTENSION
Объект pLowerDO это объект устройства, который находится ниже нас в стеке. Он нужен нам для того чтобы знать кому дальше отправлять IRP-пакеты.
Еще для работы нашего драйвера нам нужна переменная, в которой будет храниться количество не завершенных запросов.
Начнем с функции, которая является главной точкой входа нашего драйвера.
theDriverObject – объект драйвера, содержит указатели на все необходимые операционной системе функции, которые мы должны будем инициализировать.
ustrRegistryPath – имя раздела в реестре, где хранится информация о данном драйвере.
Для начала необходимо объявить и обнулить переменные:
Далее, как я и писал выше, нужно инициализировать указатели на функции
Функция DispatchRead будет обрабатывать запросы на чтение. Она будет вызываться, когда нажата или отпущена клавиша клавиатуры.
Функция DriverUnload вызывается, когда драйвер уже не нужен и его можно выгрузить из памяти, или когда пользователь сам выгружает драйвер. В данной функции должна производиться «зачистка», т.е. освобождаться ресурсы, которые использовались драйвером, завершаться все незавершенные запросы и т.д.
Функция DispatchThru это функция-заглушка. Все что она делает это передача IRP-пакета следующему драйверу (драйверу который находится под нашим в стеке, т.е. pLowerDO из DEVICE_EXTENSION ).
Далее мы вызываем нашу функцию, для создания и установки нашего устройства в стек устройств:
Эту функцию я опишу чуть ниже.
Возвращаем status , в котором, если функция InstallFilter завершилась удачей, хранится значение STATUS_SUCCESS .
Переходим к функции InstallFilter . Вот её прототип:
Эта функция создает объект устройства, настраивает его и включает в стек устройств поверх \\Device\\KeyboardClass0
pKeyboardDevice – это объект устройсва, которое мы должны создать.
Вызываем IoCreateDevice для создания нового устройства
Разберем подробнее параметры:
- Первый аргумент это объект драйвера, который мы получили как параметр функции InstallFilter. Он передается в IoCreateDevice для того чтобы установить связь между нашим драйвером и новым устройством.
- Третий параметр это имя устройства
- Четвертый параметр это тип устройства
- Пятый параметр это флаги, которые обычно устанавливаются для запоминающих устройств.
- Шестой параметр описывает можно ли открывать манипуляторы устройства в количестве больше одного. Если FALSE можно открыть только один манипулятор. Иначе можно открыть любое количество манипуляторов.
- Седьмой параметр это память, в которой будем сохранен созданный объект устройства.
Далее устанавливаем флаги устройства.
Флаги, которые мы устанавливаем для нашего устройства, должны быть эквивалентными флагам устройства, поверх которого мы включаемся в стек.
Далее мы должны выполнить преобразования имени устройства, которое мы включаем в стек.
Функция IoAttachDevice внедряет наше устройство в стек. В pdx->pLowerDO будет храниться объект следующего (нижнего) устройства.
Далее разберем функцию DispatchRead с прототипом:
Данная функция будет вызываться операционной системой при нажатии или отпускании клавиши клавиатуры
Увеличиваем счетчик незавершенных запросов
Перед тем как передать запрос следующему драйверу мы должны настроить указатель стека для драйвера. IoCopyCurrentIrpStackLocationToNext копирует участок памяти, который принадлежит текущему драйверу, в область памяти следующего драйвера.
Когда запрос идет вниз по стеку в нем еще нет нужных нам данных, поэтому мы должны задать функцию, которая вызовется, когда запрос будет идти вверх по стеку с нужными нам данными.
где ReadCompletionRoutine наша функция.
Передаем IRP следующему драйверу:
Теперь разберем функцию, которая будет вызываться каждый раз при завершении IRP . Прототип:
Структура PKEYBOARD_INPUT_DATA используется для описания нажатой клавиши.
Проверяем, удачно завершен запрос или нет
Чтобы достать структуру KEYBOARD_INPUT_DATA нужно обратиться к системному буферу IRP -пакета.
Узнаем количество клавиш
И выводим каждую клавишу:
И не забываем уменьшать количество не обработанных запросов
Возвращаем статус запроса
Разберем функцию завершения работы. Прототип:
Извлекаем устройство из стека:
Проверяем есть незавершенные запросы или нет. Если мы выгрузим драйвер без этой проверки, при первом нажатии на клавишу после выгрузки будет БСоД.
Как запустить драйвер и просмотреть отладочную информацию
Для запуска драйвера я использовал утилиту KmdManager. Для просмотра отладочной информации использовалась утилита DbgView.
P. S. Статью писал давно, ещё на третьем курсе, сейчас уже почти ничего не помню. Но если есть вопросы, постараюсь ответить.
P. P. S. Прошу обратить внимание на комментарии, в частности на этот
Microsoft Windows Server 2003 Service Pack 1 (x86) VL (Standard и Enterprise) (EN, RU) 2005 скачать торрент бесплатно
Год выпуска: 2005
Версия: 5.2.3790.1830
Разработчик: Корпорация Майкрософт
Платформа: x86
Язык интерфейса: английский, русский
Таблэтка: Присутствует
Описание: Windows Server 2003 (кодовое название при разработке — Whistler Server, внутренняя версия — Windows NT 5.2) — операционная система семейства Windows NT от компании Microsoft, предназначенная для работы на серверах. Она была выпущена 24 апреля 2003 года.
Windows Server 2003 является новой версией Windows 2000 Server и серверным вариантом операционной системы Windows XP. Изначально Microsoft планировала назвать этот продукт «Windows .NET Server» с целью продвижения своей новой платформы Microsoft .NET. Однако впоследствии это название было отброшено, чтобы не вызвать неправильное представление о .NET на рынке программного обеспечения.
Windows Server 2003 доступен в четырёх основных изданиях, каждое из которых ориентировано на определённый сектор рынка.
Все эти издания, за исключением Web Edition, доступны также в 64-разрядных вариантах (AMD64 и IA-64). Включение поддержки 64-разрядных процессоров даёт системам возможность использовать большее адресное пространство и увеличивает их производительность.
Standard Edition (стандартное издание) ориентировано на малый и средний бизнес. Оно содержит все основные возможности Windows Server 2003, но в нём недоступны некоторые функции, которые, по мнению Microsoft, необходимы только крупным предприятиям. Поддерживает до 4 гигабайт оперативной памяти и до четырёх процессоров на компьютер.
Enterprise Edition (издание для предприятий) ориентировано на средний и крупный бизнес. В дополнение к возможностям Standard Edition, оно позволяет использовать больший объём оперативной памяти (до 32 гигабайт оперативной памяти) и SMP на 8 процессоров (Standard Edition поддерживает лишь 4). Это издание также поддерживает кластеризацию и добавление оперативной памяти «на лету».
Service Pack 1
30 марта 2005 года Microsoft выпустила пакет обновления 1 (SP1) для Windows Server 2003. Этот пакет включает в себя различные улучшения системы безопасности, в том числе:
Security Configuration Wizard (мастер конфигурации безопасности) — средство, предназначенное для уменьшения поверхности атаки серверов. SCW анализирует роли, выполняемые сервером, и отключает ненужные службы, а также включает некоторые дополнительные средства безопасности.
Windows Firewall — новая версия программного межсетевого экрана, замена Internet Connection Firewall.
Post-Setup Security Updates — средство, снижающее уязвимость только что установленной копии Windows Server 2003 путём блокировки всех сетевых портов до установки обновлений безопасности с веб-сайта Microsoft.
Аутентификация и шифрование для службы Windows Terminal Services с применением SSL.
Представленные в раздаче редакции:
Windows Server 2003 Enterprise Edition with Service Pack 1 — VL (English)
Windows Server 2003 Enterprise Edition with Service Pack 1 — VL (Russian)
Windows Server 2003 Standard Edition with Service Pack 1 — VL (English)
Windows Server 2003 Standard Edition with Service Pack 1 — VL (Russian)
Контрольные суммы образов:
Windows Server 2003 Enterprise Edition with Service Pack 1 — VL (English)
Имя файла: en_ws_2003_ent_sp1_vl.iso
CRC-32: FFFFFFFF
MD5: 8E6EAFFA5BEDDC98203F7146F5EE3D3A
SHA-1: DF5BBF6B9C2EF90A8E9951CFAC7BEE007AA770BA
Windows Server 2003 Enterprise Edition with Service Pack 1 — VL (Russian)
Имя файла: ru_ws_2003_ent_with_sp1_vl.iso
CRC-32: FFFFFFFF
MD5: 6844FE84C1FF1E4AC62140774BD90261
SHA-1: BE3D3FFFCB821061D67C71265A2C277C8C9E677A
Windows Server 2003 Standard Edition with Service Pack 1 — VL (English)
Имя файла: en_ws_2003_std_sp1_vl.iso
CRC-32: FFFFFFFF
MD5: B82D21DF694B4AEBFDAB35D4732C7476
SHA-1: 1E24951086B607EAC3F0CDCAE40396E0948C6A8B
Windows Server 2003 Standard Edition with Service Pack 1 — VL (Russian)
Имя файла: ru_ws_2003_std_with_sp1_vl.iso
CRC-32: FFFFFFFF
MD5: 3285519D2819F3D0BD860D80C2386BD7
SHA-1: F1F5501116D5238F5235DD6F9BC125DAA8A3A61B
Скриншоты:
microsoft-windows-server-2003-service-pack-1-x86-vl-standard-i-enterprise-en-ru.torrent
На этой странице вы сможете скачать Microsoft Windows Server 2003 Service Pack 1 (x86) VL (Standard и Enterprise) (EN, RU) 2005 последняя версия, без регистрации