Запись первого драйвера USB-клиента (KMDF)

В этой статье вы будете использовать шаблон драйвера в режиме USB ядра, предоставленный Microsoft Visual Studio для записи простого драйвера в режиме ядра (KMDF) на основе клиентского драйвера. После создания и установки драйвера клиента вы увидите драйвер клиента в диспетчер устройств и просмотрите выходные данные драйвера в отладчике.

Описание исходного кода, созданного шаблоном, см. в разделе "Общие сведения о коде шаблона KMDF" для usb-клиента.

Необходимые компоненты

Для разработки, отладки и установки драйвера в режиме ядра вам потребуется два компьютера:

  • Главный компьютер под управлением Windows 7 или более поздней версии операционной системы Windows. Главный компьютер — это среда разработки, в которой выполняется запись и отладка драйвера.
  • Целевой компьютер под управлением Windows Vista или более поздней версии Windows. На целевом компьютере есть драйвер режима ядра, который требуется выполнить отладку.

Прежде чем начать, убедитесь, что выполнены следующие требования:

Требования к программному обеспечению

  • Главный компьютер размещает среду разработки и имеет Visual Studio.
  • На хост-компьютере установлена последняя версия комплекта драйверов Windows (WDK). Набор включает заголовки, библиотеки, инструменты, документацию и средства отладки, необходимые для разработки, сборки и отладки драйвера KMDF. Чтобы получить последнюю версию WDK, см. раздел "Скачать комплект драйверов Windows(WDK)".
  • На хост-компьютере установлена последняя версия средств отладки для Windows. Последнюю версию можно получить из WDK или скачать и установить средства отладки для Windows.
  • Целевой компьютер работает под управлением Windows Vista или более поздней версии Windows.
  • Узел и целевые компьютеры настроены для отладки ядра. Дополнительные сведения см. в разделе "Настройка сетевого подключения" в Visual Studio.

Требования к аппаратному обеспечению

Получите USB-устройство, для которого вы будете писать драйвер клиента. В большинстве случаев вы предоставляете USB-устройство и его спецификацию оборудования. Спецификация описывает возможности устройств и поддерживаемые команды поставщика. Используйте спецификацию для определения функциональных возможностей USB-драйвера и связанных решений по проектированию.

Если вы не знакомы с разработкой USB-драйверов, используйте комплект обучения OSR USB FX2 для изучения примеров USB, включенных в WDK. Вы можете получить комплект обучения из OSR Online. Он содержит устройство USB FX2 и все необходимые спецификации оборудования для реализации драйвера клиента.

Вы также можете получить устройства Microsoft USB Test Tool (MUTT). Оборудование MUTT можно приобрести с помощью JJG Technologies. Устройство не установлено встроенное ПО. Чтобы установить встроенное ПО, скачайте пакет программного обеспечения MUTT на этом веб-сайте и запустите MUTTUtil.exe. Дополнительные сведения см. в документации, включенной в пакет.

Шаг 1. Создание кода драйвера KMDF с помощью шаблона USB-драйвера Visual Studio

Инструкции по созданию кода драйвера KMDF см. в инструкциях по написанию драйвера KMDF на основе шаблона.

Для кода, зависяющего от USB, выберите следующие параметры в Visual Studio:

  1. В диалоговом окне "Новый проект" в поле поиска в верхней части введите USB.
  2. В средней области выберите "Драйвер режима ядра", USB (KMDF).
  3. Выберите Далее.
  4. Введите имя проекта, выберите расположение сохранения и нажмите кнопку "Создать".

На следующем снимке экрана показан диалоговое окно "Новый проект " для шаблона драйвера в режиме USB.

Новые параметры проекта visual Studio.

Второй экран новых параметров проекта visual Studio.

В этой статье предполагается, что имя проекта Visual Studio — "MyUSBDriver_". Она содержит следующие файлы:

Файлы Description
Public.h Предоставляет общие объявления, общие для клиентских драйверов и пользовательских приложений, взаимодействующих с USB-устройством.
<Имя> проекта.inf Содержит сведения, необходимые для установки драйвера клиента на целевом компьютере.
Trace.h Объявляет функции трассировки и макросы.
Driver.h; Driver.c Объявляет и определяет точки входа драйвера и подпрограммы обратного вызова событий.
Device.h; Device.c Объявляет и определяет подпрограмму обратного вызова событий для события подготовки оборудования.
Queue.h; Queue.c Объявляет и определяет подпрограмму обратного вызова события для события, вызываемого объектом очереди платформы.

Шаг 2. Изменение INF-файла для добавления сведений об устройстве

Перед сборкой драйвера необходимо изменить INF-файл шаблона с информацией об устройстве, в частности строку идентификатора оборудования.

В Обозреватель решений в разделе "Файлы драйверов" дважды щелкните INF-файл.

В INF-файле можно указать такие сведения, как имя производителя и поставщика, класс установки устройства и т. д. Одна часть информации, которую необходимо указать, — это идентификатор оборудования устройства.

Чтобы указать строку идентификатора оборудования, выполните указанные ниже действия.

  1. Подключите USB-устройство к хост-компьютеру и позвольте Windows перечислить устройство.

  2. Откройте диспетчер устройств и откройте свойства для устройства.

  3. На вкладке "Сведения" выберите "Жесткие идентификаторы" в разделе "Свойство".

    Идентификатор оборудования для устройства отображается в списке. Выберите и удерживайте (или щелкните правой кнопкой мыши) и скопируйте строку идентификатора оборудования.

  4. Замените USB\VID_vvvv&PID_pppp в следующей строке строкой идентификатора оборудования.

    [Standard.NT$ARCH$] %MyUSBDriver_.DeviceDesc%=MyUSBDriver__Device, USB\VID_vvvv&PID_pppp

Шаг 3. Создание кода драйвера USB-клиента

Чтобы создать драйвер, выполните приведенные действия.

  1. Открытие проекта драйвера или решения в Visual Studio
  2. Выберите и удерживайте решение (или щелкните правой кнопкой мыши) в Обозреватель решений и выберите Configuration Manager.
  3. В Configuration Manager выберите активную конфигурацию решения (например, отладку или выпуск) и платформу активных решений (например, Win32), соответствующую типу нужной сборки.
  4. В меню Построение выберите пункт Построить решение.

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

Шаг 4. Настройка компьютера для тестирования и отладки

Для тестирования и отладки драйвера необходимо запустить отладчик на хост-компьютере и драйвере на целевом компьютере. До сих пор вы использовали Visual Studio на хост-компьютере для создания драйвера. Затем необходимо настроить целевой компьютер. Чтобы настроить целевой компьютер, следуйте инструкциям в статье "Подготовка компьютера для развертывания и тестирования драйверов".

Шаг 5. Включение трассировки для отладки ядра

Код шаблона содержит несколько сообщений трассировки (TraceEvents), которые помогают отслеживать вызовы функций. Все функции в исходном коде содержат сообщения трассировки, которые помечают запись и выход подпрограммы. Для ошибок сообщение трассировки содержит код ошибки и значимую строку. Так как трассировка WPP включена для проекта драйвера, файл символов PDB, созданный во время процесса сборки, содержит инструкции по форматированию сообщений трассировки. Если настроить хост-компьютеры и целевые компьютеры для трассировки WPP, драйвер может отправлять сообщения трассировки в файл или отладчик.

Чтобы настроить главный компьютер для трассировки WPP, выполните следующие действия.

  1. Создайте файлы формата сообщения трассировки (TMF), извлекая инструкции по форматированию сообщений трассировки из файла символов PDB.

    Вы можете использовать Tracepdb.exe для создания файлов TMF. Средство находится в папке <>установки Windows Kits\10.0\bin\<architecture> папки WDK. Следующая команда создает файлы TMF для проекта драйвера.

    tracepdb -f <PDBFiles> -p <TMFDirectory>

    Параметр -f указывает расположение и имя файла символов PDB. Параметр -p указывает расположение файлов TMF, созданных Tracepdb. Дополнительные сведения см. в разделе "Команды Tracepdb".

    В указанном расположении вы увидите три файла (один на C-файл в проекте). Им присваиваются имена ФАЙЛОВ GUID.

  2. В отладчике введите следующие команды:

    1. .load Wmitrace

      Загружает расширение Wmitrace.dll.

    2. .цепь

      Убедитесь, что расширение отладчика загружено.

    3. !wmitrace.searchpath +<расположение файла TMF>

      Добавьте расположение файлов TMF в путь поиска расширения отладчика.

      Результат будет примерно таким:

      Trace Format search path is: 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE;c:\drivers\tmf'

Чтобы настроить целевой компьютер для трассировки WPP, выполните следующие действия.

  1. Убедитесь, что на целевом компьютере есть средство Tracelog. Средство находится в папке WDK install_folder>Windows Kits\8.0\Tools\<arch>.< Дополнительные сведения см. в разделе "Синтаксис команды Tracelog".

  2. Откройте командное окно и запустите от имени администратора.

  3. Введите следующую команду:

    tracelog -start MyTrace -guid #c918ee71-68c7-4140-8f7d-c907abbcb05d -flag 0xFFFF -level 7-rt -kd

    Команда запускает сеанс трассировки с именем MyTrace.

    Аргумент GUID указывает GUID поставщика трассировки, который является драйвером клиента. Guid можно получить из Trace.h в проекте Visual Studio Professional 2019. В качестве другого варианта можно ввести следующую команду и указать GUID в GUID-файле. Файл содержит GUID в формате дефиса:

    tracelog -start MyTrace -guid c:\drivers\Provider.guid -flag 0xFFFF -level 7-rt -kd

    Сеанс трассировки можно остановить, введя следующую команду:

    tracelog -stop MyTrace

Шаг 6. Развертывание драйвера на целевом компьютере

  1. В окне Обозреватель решений выберите и удерживайте (или щелкните правой кнопкой мыши)< имя> проекта*Пакет и выберите "Свойства".
  2. В левой области перейдите к развертыванию драйвера >установки свойств > конфигурации.
  3. Проверьте включение развертывания и проверьте импорт в хранилище драйверов.
  4. Для имени удаленного компьютера укажите имя целевого компьютера.
  5. Выберите " Установить и проверить".
  6. Нажмите OK.
  7. В меню отладки выберите "Начать отладку" или нажмите клавишу F5 на клавиатуре.

Примечание.

Не указывайте идентификатор оборудования устройства в разделе "Обновление драйвера оборудования". Идентификатор оборудования должен быть указан только в файле сведений о драйвере (INF).

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

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

  • PnPUtil

    Это средство поставляется с Windows. Он находится в Windows\System32. Эту программу можно использовать для добавления драйвера в хранилище драйверов.

    C:\>pnputil /a m:\MyDriver_.inf
    Microsoft PnP Utility
    
    Processing inf : MyDriver_.inf
    Driver package added successfully.
    Published name : oem22.inf
    

    Дополнительные сведения см. в примерах PnPUtil.

  • Обновление DevCon

    Это средство поставляется с WDK. Его можно использовать для установки и обновления драйверов.

    devcon update c:\windows\inf\MyDriver_.inf USB\VID_0547&PID_1002\5&34B08D76&0&6
    

Шаг 7. Просмотр драйвера в диспетчер устройств

  1. Введите следующую команду, чтобы открыть диспетчер устройств:

    devmgmt
    
  2. Убедитесь, что диспетчер устройств отображает узел для следующего узла:

    Примеры

    MyUSBDriver_Device

Шаг 8. Просмотр выходных данных в отладчике

Visual Studio сначала отображает ход выполнения в окне вывода . Затем откроется окно интерпретации отладчика. Убедитесь, что сообщения трассировки отображаются в отладчике на хост-компьютере. Выходные данные должны выглядеть следующим образом, где "MyUSBDriver_" — это имя модуля драйвера:

[3]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]MyUSBDriver_EvtDriverContextCleanup Entry
[1]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]MyUSBDriver_EvtDriverDeviceAdd Entry
[1]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]MyUSBDriver_EvtDriverDeviceAdd Exit
[0]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]DriverEntry Entry
[0]0004.0054::00/00/0000-00:00:00.000 [MyUSBDriver_]DriverEntry Exit