Написание универсального драйвера Windows (KMDF) на основе шаблона
В этом разделе описывается, как написать универсальный драйвер Windows с помощью Kernel-Mode Driver Framework (KMDF). Вы начнете с шаблона Microsoft Visual Studio, а затем развернете и установите драйвер на отдельном компьютере.
Прежде чем продолжить, необходимо выполнить действия по установке, перечисленные в разделе Скачивание комплекта драйверов Windows (WDK).
Средства отладки для Windows включаются при установке WDK.
Создание и сборка драйвера
Откройте среду Microsoft Visual Studio. В меню Файл выберите Создать > проект.
В диалоговом окне Создание проекта выберите C++ в раскрывающемся списке слева, windows в среднем раскрывающемся списке и драйвер в правом раскрывающемся списке.
Выберите Драйвер режима ядра (KMDF) в списке типов проектов. Выберите Далее.
В диалоговом окне Настройка нового проекта введите "KmdfDriver" в поле Имя проекта .
Примечание
При создании нового драйвера KMDF или UMDF необходимо выбрать имя драйвера, которое содержит не более 32 символов. Это ограничение длины определяется в wdfglobals.h.
В поле Расположение введите каталог, в котором вы хотите создать проект.
Установите флажок Разместить решение и проект в одном каталоге и выберите Создать.
Visual Studio создает один проект и решение. Вы можете просмотреть их в обозревателе решений. (Если окно Обозреватель решений не отображается, выберите Обозреватель решений в меню Вид.) Решение содержит проект драйвера с именем KmdfDriver. Чтобы просмотреть исходный код драйвера, откройте любой из файлов в разделе Исходные файлы. Driver.c и Device.c — хорошие места для начала.
В окне Обозреватель решений выберите и удерживайте (или щелкните правой кнопкой мыши) KmdfDriver, а затем выберите Пункт Свойства. Перейдите к разделу Свойства > конфигурации Параметры > драйвера Общие и обратите внимание, что целевая платформа по умолчанию использует значение Универсальная.
Чтобы выполнить сборку драйвера, выберите в меню Сборкапункт Сборка решения. Microsoft Visual Studio отображает ход сборки в окне Вывод . (Если окно Вывод не отображается, выберите Вывод в меню Вид .)
Убедитесь, что выходные данные сборки включают:
> Driver is 'Universal'.
Убедись, что решение успешно создано, можно закрыть Visual Studio.
Чтобы просмотреть встроенный драйвер, в проводник перейдите в папку KmdfDriver, а затем в папку x64\Debug\KmdfDriver. Каталог содержит следующие файлы:
- KmdfDriver.sys — файл драйвера в режиме ядра.
- KmdfDriver.inf — информационный файл, который Windows использует при установке драйвера.
Развертывание драйвера
Обычно при тестировании и отладке драйвера отладчик и драйвер запускаются на разных компьютерах. Компьютер, на котором выполняется отладчик, называется главным компьютером, а компьютер с драйвером — конечным компьютером. Целевой компьютер также называется тест-компьютером. Дополнительные сведения об отладке драйверов см. в статье Средства отладки для Windows.
До сих пор вы использовали Visual Studio для создания драйвера на хост-компьютере. Теперь необходимо настроить целевой компьютер.
Следуйте инструкциям в статье Подготовка компьютера для развертывания и тестирования драйверов (WDK 10).
Совет
При выполнении действий по автоматической подготовке целевого компьютера с помощью сетевого кабеля запишите порт и ключ. Вы будете использовать их позже на этапе отладки. В этом примере мы будем использовать 50000 в качестве порта и 1.2.3.4 в качестве ключа.
В реальных сценариях отладки драйверов рекомендуется использовать ключ, созданный KDNET. Дополнительные сведения о том, как использовать KDNET для создания случайного ключа, см. в разделе Драйверы отладки — пошаговая лаборатория (режим ядра Sysvad).
На хост-компьютере откройте решение в Visual Studio. Вы можете дважды щелкнуть файл решения KmdfDriver.sln в папке KmdfDriver.
В окне Обозреватель решений выберите и удерживайте (или щелкните правой кнопкой мыши) проект KmdfDriver, а затем выберите Свойства.
В окне Страницы свойств пакета KmdfDriver в левой области перейдите к разделу Свойства > конфигурации Драйвер Установка > развертывания.
Установите флажок Удалить предыдущие версии драйверов перед развертыванием.
В поле Имя удаленного компьютера выберите имя компьютера, настроенного для тестирования и отладки. В этом упражнении используется компьютер с именем MyTestComputer.
Выберите Hardware ID Driver Update (Обновление драйвера) и введите идентификатор оборудования для драйвера. В этом упражнении используется идентификатор оборудования Root\KmdfDriver. Щелкните ОК.
Примечание
В этом упражнении идентификатор оборудования не идентифицирует реальную часть оборудования. Он определяет мнимое устройство, которому будет предоставлено место в дереве устройств в качестве дочернего по отношению к корневому узлу. Для реального оборудования не выбирайте Обновление драйвера идентификатора оборудования; Вместо этого выберите Установить и проверить. Вы увидите идентификатор оборудования в файле сведений о драйвере (INF). В окне Обозреватель решений перейдите в раздел Файлы драйвера KmdfDriver > и дважды щелкните KmdfDriver.inf. Идентификатор оборудования находится в разделе [Standard.NT$ARCH$].
[Standard.NT$ARCH$] %KmdfDriver.DeviceDesc%=KmdfDriver_Device, Root\KmdfDriver
В меню Сборка выберите Развернуть решение. Visual Studio автоматически копирует файлы, необходимые для установки и запуска драйвера, на целевой компьютер. Это может занять несколько минут.
При развертывании драйвера файлы драйверов копируются в папку %Systemdrive%\drivertest\drivers на тестовом компьютере. Если во время развертывания что-то пойдет не так, можно проверка, чтобы узнать, скопированы ли файлы на тестовый компьютер. Убедитесь, что файлы INF, CAT, test cert и .sys, а также все необходимые файлы находятся в папке %systemdrive%\drivertest\drivers.
Дополнительные сведения о развертывании драйверов см. в статье Развертывание драйвера на тестовом компьютере.
Установка драйвера
Теперь, когда драйвер KMDF развернут на целевом компьютере, вы установите драйвер. Когда вы ранее подготовили целевой компьютер с помощью Visual Studio с помощью параметра "Автоматически ", Visual Studio настраивает целевой компьютер для запуска тестовых драйверов с подписанным знаком в рамках процесса подготовки. Теперь достаточно установить драйвер с помощью средства DevCon.
На хост-компьютере перейдите в папку Сервис в установке WDK и найдите средство DevCon. Например, найдите следующую папку:
C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe
Скопируйте средство DevCon на удаленный компьютер.
На целевом компьютере установите драйвер, перейдя в папку с файлами драйверов, а затем запустив средство DevCon.
Ниже приведен общий синтаксис средства devcon, который будет использоваться для установки драйвера:
Devcon install <INF file><hardware ID>
Inf-файл, необходимый для установки этого драйвера, — KmdfDriver.inf. INF-файл содержит идентификатор оборудования для установки двоичного файла драйвера ,KmdfDriver.sys. Помните, что идентификатор оборудования, расположенный в INF-файле, имеет значение Root\KmdfDriver.
Откройте окно командной строки от имени администратора. Перейдите в папку пакета драйверов и введите следующую команду:
devcon install kmdfdriver.inf root\kmdfdriver
Если появляется сообщение об ошибке о том, что devcon не распознается, попробуйте добавить путь к средству devcon . Например, если вы скопировали его в папку на целевом компьютере с именем C:\Tools, попробуйте использовать следующую команду:
c:\tools\devcon install kmdfdriver.inf root\kmdfdriver
Появится диалоговое окно, указывающее, что тестовый драйвер является драйвером без знака. Выберите Установить этот драйвер в любом случае , чтобы продолжить.
Отладка драйвера
Теперь, когда вы установили драйвер KMDF на целевом компьютере, вы подключите отладчик удаленно с главного компьютера.
На хост-компьютере откройте окно командной строки с правами администратора. Перейдите в каталог WinDbg.exe. Мы будем использовать x64version WinDbg.exe из комплекта драйверов Windows (WDK), который был установлен в рамках установки комплекта Windows. Ниже приведен путь по умолчанию к WinDbg.exe:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
Запустите WinDbg, чтобы подключиться к сеансу отладки ядра на целевом компьютере с помощью следующей команды. Значения порта и ключа должны совпадать с значениями, которые использовались для подготовки целевого компьютера. Мы будем использовать 50000 для порта и 1.2.3.4 для ключа, значения, которые использовались на этапе развертывания. Флаг k указывает, что это сеанс отладки ядра.
WinDbg -k net:port=50000,key=1.2.3.4
В меню Отладка выберите Пункт Прервать. Отладчик на хост-компьютере войдет в целевой компьютер. В окне Команда отладчика отображается командная строка отладки ядра: kd>.
На этом этапе можно поэкспериментировать с отладчиком, введя команды в командной строке kd> . Например, можно попробовать следующие команды:
Чтобы снова запустить целевой компьютер, выберите Перейти в меню Отладка или нажмите клавишу "g", а затем нажмите клавишу "ВВОД".
Чтобы остановить сеанс отладки, выберите в меню Отладкакоманду Отсоединить отладчика.
Важно!
Убедитесь, что вы используете команду go, чтобы позволить целевому компьютеру снова запуститься перед выходом из отладчика, иначе целевой компьютер не будет отвечать на ввод с помощью мыши и клавиатуры, так как он по-прежнему взаимодействует с отладчиком.
Подробное пошаговое руководство по процессу отладки драйверов см. в разделе Отладка универсальных драйверов — пошаговая лабораторная работа (режим ядра Echo).
Дополнительные сведения об удаленной отладке см. в статье Удаленная отладка с помощью WinDbg.
Использование платформы модулей драйверов (DMF)
Платформа модуля драйвера (DMF) — это расширение WDF, которое обеспечивает дополнительные функциональные возможности для разработчиков драйверов WDF. Это помогает разработчикам писать любой тип драйвера WDF лучше и быстрее.
DMF как платформа позволяет создавать объекты WDF, называемые модулями DMF. Код для этих модулей DMF может использоваться разными драйверами. Кроме того, DMF объединяет в себя библиотеку модулей DMF, которые мы разработали для наших драйверов и считаем, что они будут полезной для других разработчиков драйверов.
DMF не заменяет WDF. DMF — это вторая платформа, используемая с WDF. Разработчик, использующий DMF, по-прежнему использует WDF и все его примитивы для записи драйверов устройств.
Дополнительные сведения см. в разделе Driver Module Framework (DMF).