Руководство по написанию универсального драйвера Windows (KMDF) на основе шаблона
В этом разделе описывается, как написать универсальный драйвер Windows с использованием фреймворка драйверов в режиме ядра (KMDF). Вы начнете с шаблона Microsoft Visual Studio, а затем развернете и установите драйвер на отдельном компьютере.
Необходимые условия
Следуйте инструкциям для установки комплекта драйверов Windows (WDK) . Debugging Tools for Windows устанавливаются вместе с WDK.
Установите Visual Studio 2022. При установке Visual Studio 2022 выберите рабочую нагрузку Разработка настольных приложений с использованием C++, а затем в разделе Отдельные компоненты добавьте:
- MSVC версии 143 — библиотеки VS 2022 C++ ARM64/ARM64EC с мерами по защите от Spectre (последняя версия)
- MSVC версии 143 — библиотеки VS 2022 C++ x64/x86 с защитой от Spectre (последняя версия)
- ATL C++ для последних средств сборки версии v143 с методами защиты от Spectre (ARM64/ARM64EC)
- C++ ATL для последних средств сборки v143 с минимизацией уязвимостей Spectre (x86 и x64)
- C++ MFC для самых новых средств сборки версии 143 с мерами по устранению Spectre (ARM64/ARM64EC)
- C++ MFC для новейших средств сборки v143 со снижением рисков уязвимостей Spectre (x86 & x64)
- Комплект драйверов Windows
Создание и сборка драйвера
Откройте Microsoft Visual Studio. В меню файла выберите "Новый проект" >.
В диалоговом окне Создание проекта выберите C++ в раскрывающемся списке слева, выберите Windows в среднем раскрывающемся списке и выберите Driver в правом раскрывающемся списке.
Выберите драйвер режима ядра (KMDF) из списка типов проектов. Выберите Далее.
Совет
Если вы не можете найти шаблоны проектов драйверов в Visual Studio, расширение WDK Visual Studio не было установлено должным образом. Чтобы устранить эту проблему, запустите установщика Visual Studio, выберите Изменить, добавьте комплекты драйверов Windows на вкладке отдельных компонентов и выберите Изменить.
В диалоговом окне Настройка нового проекта в поле имя проекта введите "KmdfDriver".
Заметка
При создании нового драйвера KMDF или UMDF необходимо выбрать имя драйвера с 32 символами или меньше. Это ограничение длины определяется в wdfglobals.h.
В поле расположение введите каталог, в котором нужно создать проект.
Проверьте Разместить решение и проект в том же каталоге и выберите Создать.
Visual Studio создает один проект и решение. Их можно увидеть в окне обозревателя решений. (Если окно обозреватель решений не отображается, выберите Обозреватель решений из меню Вид.) Решение имеет проект драйвера с именем KmdfDriver. Чтобы просмотреть исходный код драйвера, откройте любой из файлов в разделе исходные файлы. Driver.c и Device.c — хорошие места для начала.
В окне обозревателя решений выберите и удерживайте (или щелкните правой кнопкой мыши) KmdfDriverи выберите Свойства. Перейдите к разделу Свойства конфигурации > параметры драйвера > Общиеи обратите внимание, что целевая платформа по умолчанию Universal.
Чтобы создать драйвер, выберите Построить решение в меню Построить. 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.
Выберите обновление драйвера идентификатора оборудования и введите аппаратный идентификатор для драйвера. В этом упражнении идентификатор оборудования — Root\KmdfDriver. Нажмите кнопку ОК.
Заметка
В этом упражнении идентификатор оборудования не определяет реальный элемент оборудования. Он определяет воображаемое устройство, которое будет размещено в дереве устройств в качестве дочернего элемента узла корня. Для реального оборудования не выбирайте обновлениедрайвера идентификатора оборудования; Вместо этого выберите Установить и проверить. Вы увидите идентификатор оборудования в файле сведений о драйвере (INF). В окне обозревателя решений перейдите к > файлам драйверов KmdfDriver и дважды щелкните KmdfDriver.inf. Идентификатор оборудования расположен в разделе [Standard.NT$ARCH$].
[Standard.NT$ARCH$] %KmdfDriver.DeviceDesc%=KmdfDriver_Device, Root\KmdfDriver
В меню сборки выберите пункт "Развернуть решение". Visual Studio автоматически копирует файлы, необходимые для установки и запуска драйвера на целевой компьютер. Это может занять минуту или два.
При развертывании драйвера файлы драйверов копируются в папку %Systemdrive%\drivertest\drivers на тестовом компьютере. Если во время развертывания что-то не так, можно проверить, копируются ли файлы на тестовый компьютер. Убедитесь, что в папке %systemdrive%\drivertest\drivertest\drivers присутствуют файлы INF, CAT, test cert и .sys и любые другие необходимые файлы.
Дополнительные сведения о развертывании драйверов см. в разделе Развертывание драйвера на тестовом компьютере.
Установка драйвера
Теперь, когда ваш драйвер KMDF развернут на целевом компьютере, вы можете установить драйвер. Когда вы ранее подготовили целевой компьютер с помощью Visual Studio, выбрав опцию автоматический, Visual Studio настроила целевой компьютер для запуска тестовых подписанных драйверов, являющихся частью процесса подготовки. Теперь необходимо просто установить драйвер с помощью средства DevCon.
На хост-компьютере перейдите в папку Tools в установке WDK и найдите средство DevCon. Например, просмотрите следующую папку:
C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe
Скопируйте средство DevCon на удаленный компьютер.
На целевом компьютере установите драйвер, перейдя к папке, содержащей файлы драйверов, а затем запустите средство DevCon.
Ниже приведен общий синтаксис средства разработки, который будет использоваться для установки драйвера:
devcon install <INF-файл><идентификатор оборудования>
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>. Например, можно попробовать следующие команды:
Чтобы позволить целевому компьютеру снова запуститься, выберите Go в меню Отладка или нажмите клавишу G, а затем нажмите клавишу ВВОД.
Чтобы остановить сеанс отладки, выберите Отсоединить отладчик в меню Отладка.
Важный
Убедитесь, что вы используете команду go, чтобы позволить целевому компьютеру снова запуститься, прежде чем выйти из отладчика, или целевой компьютер не будет отвечать на ввод мыши и клавиатуры, так как он по-прежнему разговаривает с отладчиком.
Подробное пошаговое руководство по отладке драйвера см. в разделе Отладка универсальных драйверов - шаг за шагом лабораторная работа (Echo Kernel-Mode).
Дополнительные сведения об удаленной отладке см. в разделе "Удаленная отладка с помощью WinDbg".
Использование платформы модулей драйверов (DMF)
Driver Module Framework (DMF) — это расширение WDF, которое обеспечивает дополнительные возможности для разработчика драйверов WDF. Это помогает разработчикам писать любой тип драйвера WDF лучше и быстрее.
DMF в качестве платформы позволяет создавать объекты WDF, называемые модулями DMF. Код для этих модулей DMF можно совместно использовать между различными драйверами. Кроме того, DMF объединяет библиотеку модулей DMF, которые мы разработали для наших драйверов и чувствуем, что обеспечит ценность для других разработчиков драйверов.
DMF не заменяет WDF. DMF — это вторая платформа, используемая с WDF. Разработчик, использующий DMF, по-прежнему использует WDF и все его примитивы для записи драйверов устройств.
Дополнительные сведения см. в разделе Driver Module Framework (DMF).