Написание универсального драйвера Windows (KMDF) на основе шаблона

В этом разделе описывается, как написать универсальный драйвер Windows с помощью Kernel-Mode Driver Framework (KMDF). Вы начнете с шаблона Microsoft Visual Studio, а затем развернете и установите драйвер на отдельном компьютере.

Прежде чем продолжить, необходимо выполнить действия по установке, перечисленные в разделе Скачивание комплекта драйверов Windows (WDK).

Средства отладки для Windows включаются при установке WDK.

Создание и сборка драйвера

  1. Откройте среду Microsoft Visual Studio. В меню Файл выберите Создать > проект.

  2. В диалоговом окне Создание проекта выберите C++ в раскрывающемся списке слева, windows в среднем раскрывающемся списке и драйвер в правом раскрывающемся списке.

  3. Выберите Драйвер режима ядра (KMDF) в списке типов проектов. Выберите Далее.

    Снимок экрана: диалоговое окно нового проекта с выбранным драйвером режима ядра.

  4. В диалоговом окне Настройка нового проекта введите "KmdfDriver" в поле Имя проекта .

    Примечание

    При создании нового драйвера KMDF или UMDF необходимо выбрать имя драйвера, которое содержит не более 32 символов. Это ограничение длины определяется в wdfglobals.h.  

  5. В поле Расположение введите каталог, в котором вы хотите создать проект.

  6. Установите флажок Разместить решение и проект в одном каталоге и выберите Создать.

    Снимок экрана: диалоговое окно конфигурации проекта.

    Visual Studio создает один проект и решение. Вы можете просмотреть их в обозревателе решений. (Если окно Обозреватель решений не отображается, выберите Обозреватель решений в меню Вид.) Решение содержит проект драйвера с именем KmdfDriver. Чтобы просмотреть исходный код драйвера, откройте любой из файлов в разделе Исходные файлы. Driver.c и Device.c — хорошие места для начала.

    Снимок экрана: обозреватель решений с файлами в проекте драйвера.

  7. В окне Обозреватель решений выберите и удерживайте (или щелкните правой кнопкой мыши) KmdfDriver, а затем выберите Пункт Свойства. Перейдите к разделу Свойства > конфигурации Параметры > драйвера Общие и обратите внимание, что целевая платформа по умолчанию использует значение Универсальная.

  8. Чтобы выполнить сборку драйвера, выберите в меню Сборкапункт Сборка решения. Microsoft Visual Studio отображает ход сборки в окне Вывод . (Если окно Вывод не отображается, выберите Вывод в меню Вид .)

    Убедитесь, что выходные данные сборки включают:

    >    Driver is 'Universal'.
    

    Убедись, что решение успешно создано, можно закрыть Visual Studio.

  9. Чтобы просмотреть встроенный драйвер, в проводник перейдите в папку KmdfDriver, а затем в папку x64\Debug\KmdfDriver. Каталог содержит следующие файлы:

    • KmdfDriver.sys — файл драйвера в режиме ядра.
    • KmdfDriver.inf — информационный файл, который Windows использует при установке драйвера.

Развертывание драйвера

Обычно при тестировании и отладке драйвера отладчик и драйвер запускаются на разных компьютерах. Компьютер, на котором выполняется отладчик, называется главным компьютером, а компьютер с драйвером — конечным компьютером. Целевой компьютер также называется тест-компьютером. Дополнительные сведения об отладке драйверов см. в статье Средства отладки для Windows.

До сих пор вы использовали Visual Studio для создания драйвера на хост-компьютере. Теперь необходимо настроить целевой компьютер.

  1. Следуйте инструкциям в статье Подготовка компьютера для развертывания и тестирования драйверов (WDK 10).

    Совет

    При выполнении действий по автоматической подготовке целевого компьютера с помощью сетевого кабеля запишите порт и ключ. Вы будете использовать их позже на этапе отладки. В этом примере мы будем использовать 50000 в качестве порта и 1.2.3.4 в качестве ключа.

    В реальных сценариях отладки драйверов рекомендуется использовать ключ, созданный KDNET. Дополнительные сведения о том, как использовать KDNET для создания случайного ключа, см. в разделе Драйверы отладки — пошаговая лаборатория (режим ядра Sysvad).

  2. На хост-компьютере откройте решение в Visual Studio. Вы можете дважды щелкнуть файл решения KmdfDriver.sln в папке KmdfDriver.

  3. В окне Обозреватель решений выберите и удерживайте (или щелкните правой кнопкой мыши) проект KmdfDriver, а затем выберите Свойства.

  4. В окне Страницы свойств пакета KmdfDriver в левой области перейдите к разделу Свойства > конфигурации Драйвер Установка > развертывания.

  5. Установите флажок Удалить предыдущие версии драйверов перед развертыванием.

  6. В поле Имя удаленного компьютера выберите имя компьютера, настроенного для тестирования и отладки. В этом упражнении используется компьютер с именем MyTestComputer.

  7. Выберите Hardware ID Driver Update (Обновление драйвера) и введите идентификатор оборудования для драйвера. В этом упражнении используется идентификатор оборудования Root\KmdfDriver. Щелкните ОК.

    Снимок экрана: окно страниц свойств пакета kmdfdriver с выбранным параметром установки драйвера развертывания

    Примечание

    В этом упражнении идентификатор оборудования не идентифицирует реальную часть оборудования. Он определяет мнимое устройство, которому будет предоставлено место в дереве устройств в качестве дочернего по отношению к корневому узлу. Для реального оборудования не выбирайте Обновление драйвера идентификатора оборудования; Вместо этого выберите Установить и проверить. Вы увидите идентификатор оборудования в файле сведений о драйвере (INF). В окне Обозреватель решений перейдите в раздел Файлы драйвера KmdfDriver > и дважды щелкните KmdfDriver.inf. Идентификатор оборудования находится в разделе [Standard.NT$ARCH$].

    [Standard.NT$ARCH$]
    %KmdfDriver.DeviceDesc%=KmdfDriver_Device, Root\KmdfDriver
    
  8. В меню Сборка выберите Развернуть решение. Visual Studio автоматически копирует файлы, необходимые для установки и запуска драйвера, на целевой компьютер. Это может занять несколько минут.

    При развертывании драйвера файлы драйверов копируются в папку %Systemdrive%\drivertest\drivers на тестовом компьютере. Если во время развертывания что-то пойдет не так, можно проверка, чтобы узнать, скопированы ли файлы на тестовый компьютер. Убедитесь, что файлы INF, CAT, test cert и .sys, а также все необходимые файлы находятся в папке %systemdrive%\drivertest\drivers.

    Дополнительные сведения о развертывании драйверов см. в статье Развертывание драйвера на тестовом компьютере.

Установка драйвера

Теперь, когда драйвер KMDF развернут на целевом компьютере, вы установите драйвер. Когда вы ранее подготовили целевой компьютер с помощью Visual Studio с помощью параметра "Автоматически ", Visual Studio настраивает целевой компьютер для запуска тестовых драйверов с подписанным знаком в рамках процесса подготовки. Теперь достаточно установить драйвер с помощью средства DevCon.

  1. На хост-компьютере перейдите в папку Сервис в установке WDK и найдите средство DevCon. Например, найдите следующую папку:

    C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe

    Скопируйте средство DevCon на удаленный компьютер.

  2. На целевом компьютере установите драйвер, перейдя в папку с файлами драйверов, а затем запустив средство DevCon.

    1. Ниже приведен общий синтаксис средства devcon, который будет использоваться для установки драйвера:

      Devcon install <INF file><hardware ID>

      Inf-файл, необходимый для установки этого драйвера, — KmdfDriver.inf. INF-файл содержит идентификатор оборудования для установки двоичного файла драйвера ,KmdfDriver.sys. Помните, что идентификатор оборудования, расположенный в INF-файле, имеет значение Root\KmdfDriver.

    2. Откройте окно командной строки от имени администратора. Перейдите в папку пакета драйверов и введите следующую команду:

      devcon install kmdfdriver.inf root\kmdfdriver

      Если появляется сообщение об ошибке о том, что devcon не распознается, попробуйте добавить путь к средству devcon . Например, если вы скопировали его в папку на целевом компьютере с именем C:\Tools, попробуйте использовать следующую команду:

      c:\tools\devcon install kmdfdriver.inf root\kmdfdriver

      Появится диалоговое окно, указывающее, что тестовый драйвер является драйвером без знака. Выберите Установить этот драйвер в любом случае , чтобы продолжить.

      Снимок экрана: предупреждение об установке драйвера.

Отладка драйвера

Теперь, когда вы установили драйвер KMDF на целевом компьютере, вы подключите отладчик удаленно с главного компьютера.

  1. На хост-компьютере откройте окно командной строки с правами администратора. Перейдите в каталог WinDbg.exe. Мы будем использовать x64version WinDbg.exe из комплекта драйверов Windows (WDK), который был установлен в рамках установки комплекта Windows. Ниже приведен путь по умолчанию к WinDbg.exe:

    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

  2. Запустите WinDbg, чтобы подключиться к сеансу отладки ядра на целевом компьютере с помощью следующей команды. Значения порта и ключа должны совпадать с значениями, которые использовались для подготовки целевого компьютера. Мы будем использовать 50000 для порта и 1.2.3.4 для ключа, значения, которые использовались на этапе развертывания. Флаг k указывает, что это сеанс отладки ядра.

    WinDbg -k net:port=50000,key=1.2.3.4

  3. В меню Отладка выберите Пункт Прервать. Отладчик на хост-компьютере войдет в целевой компьютер. В окне Команда отладчика отображается командная строка отладки ядра: kd>.

  4. На этом этапе можно поэкспериментировать с отладчиком, введя команды в командной строке kd> . Например, можно попробовать следующие команды:

  5. Чтобы снова запустить целевой компьютер, выберите Перейти в меню Отладка или нажмите клавишу "g", а затем нажмите клавишу "ВВОД".

  6. Чтобы остановить сеанс отладки, выберите в меню Отладкакоманду Отсоединить отладчика.

    Важно!

    Убедитесь, что вы используете команду go, чтобы позволить целевому компьютеру снова запуститься перед выходом из отладчика, иначе целевой компьютер не будет отвечать на ввод с помощью мыши и клавиатуры, так как он по-прежнему взаимодействует с отладчиком.

Подробное пошаговое руководство по процессу отладки драйверов см. в разделе Отладка универсальных драйверов — пошаговая лабораторная работа (режим ядра Echo).

Дополнительные сведения об удаленной отладке см. в статье Удаленная отладка с помощью WinDbg.

Использование платформы модулей драйверов (DMF)

Платформа модуля драйвера (DMF) — это расширение WDF, которое обеспечивает дополнительные функциональные возможности для разработчиков драйверов WDF. Это помогает разработчикам писать любой тип драйвера WDF лучше и быстрее.

DMF как платформа позволяет создавать объекты WDF, называемые модулями DMF. Код для этих модулей DMF может использоваться разными драйверами. Кроме того, DMF объединяет в себя библиотеку модулей DMF, которые мы разработали для наших драйверов и считаем, что они будут полезной для других разработчиков драйверов.

DMF не заменяет WDF. DMF — это вторая платформа, используемая с WDF. Разработчик, использующий DMF, по-прежнему использует WDF и все его примитивы для записи драйверов устройств.

Дополнительные сведения см. в разделе Driver Module Framework (DMF).