Классическое приложение Windows для USB-устройства

В этой статье вы узнаете, как приложение может вызывать функции WinUSB для взаимодействия с USB-устройством. Для такого приложения в качестве драйвера функции устройства необходимо установить WinUSB (Winusb.sys). WinUSB в стеке устройства в режиме ядра. Этот драйвер включен в Windows в папку \Windows\System32\drivers.

Если вы используете Winusb.sys в качестве драйвера функций USB-устройства, вы можете вызывать функции WinUSB из приложения для взаимодействия с устройством. Эти функции, предоставляемые Winusb.dll DLL в пользовательском режиме, упрощают процесс обмена данными. Вместо создания запросов управления вводом-выводом устройства для выполнения стандартных операций USB (таких как настройка устройства, отправка управляющих запросов и передача данных на устройство или с него), приложения вызывают эквивалентную функцию WinUSB.

Winusb.dll использует предоставленные приложением данные для создания соответствующего запроса на управление вводом-выводом устройства, а затем отправляет запрос в Winusb.sys для обработки. Для взаимодействия с USB-стеком функция WinUSB вызывает функцию DeviceIoControl с соответствующим IOCTL, который соответствует запросу приложения. После завершения запроса функция WinUSB передает все сведения, возвращенные Winusb.sys (например, данные из запроса на чтение), в вызывающий процесс. Если вызов DeviceIoControl выполнен успешно, он возвращает ненулевое значение. Если вызов завершается сбоем или находится в состоянии ожидания (не обрабатывается немедленно), DeviceIoControl возвращает нулевое значение. При возникновении ошибки приложение может вызвать GetLastError для получения более подробного сообщения об ошибке.

Проще использовать функции WinUSB для взаимодействия с устройством, чем для реализации драйвера. Однако обратите внимание на следующие ограничения.

  • Функции WinUSB позволяют одному приложению за раз взаимодействовать с устройством. Если требуется несколько приложений для одновременного взаимодействия с устройством, необходимо реализовать драйвер функции.

  • До Windows 8.1 функции WinUSB не поддерживают потоковую передачу данных в изохронные конечные точки или из нее.

  • Функции WinUSB не поддерживают устройства, которые уже поддерживают режим ядра. Примерами таких устройств являются модемы и сетевые адаптеры, которые поддерживаются API телефонии (TAPI) и NDIS соответственно.

  • Для многофункциональных устройств можно использовать INF-файл устройства, чтобы указать встроенный драйвер режима ядра или Winusb.sys для каждой функции USB отдельно. Однако можно указать только один из этих параметров для конкретной функции, а не оба.

Примечание

Для функций WinUSB требуется Windows XP или более поздней версии. Эти функции можно использовать в приложении C/C++ для взаимодействия с USB-устройством. Сведения о создании приложения UWP, использующего API-интерфейсы WinUSB, см. в статье Приложение UWP для USB-устройства.

Начало работы

  1. Получение средств, необходимых для создания классического приложения Windows для устройств

  2. Получите тестовое USB-устройство и спецификацию его оборудования.

    • Используйте спецификацию для определения функциональных возможностей приложения и связанных проектных решений.

    • Устройства Microsoft USB Test Tool (MUTT) доступны в JJG Technologies. Для этого устройства требуется встроенное ПО корпорации Майкрософт, доступное в разделе Скачать пакет программного обеспечения MUTT.

  3. Напишите скелетное приложение, которое получает дескриптор для устройства.

    Существует два подхода к написанию первого приложения:

  4. Установите Winusb.sys для устройства.

    При использовании Visual Studio установите пакет драйверов на целевом компьютере с помощью развертывания Visual Studio. Инструкции см. в статье Создание классического приложения для Windows на основе шаблона WinUSB. В противном случае вручную установите драйвер в диспетчер устройств, написав пользовательский INF-файл. Дополнительные сведения см. в статье Установка WinUSB (Winusb.sys).

  5. Получите сведения об устройстве и просмотрите его дескрипторы.

    Основные сведения см. в разделе Основные понятия для всех разработчиков USB. Получите сведения о возможностях устройства, считывая дескриптор конфигурации, дескрипторы интерфейса для каждого поддерживаемого альтернативного параметра и их дескрипторы конечных точек. Дополнительные сведения см. в разделе Запрос устройства для дескрипторов USB.

  6. Отправка передачи элементов управления ЧЕРЕЗ USB.

    Отправляйте стандартные управляющие запросы и команды поставщика на устройство. Дополнительные сведения см. в разделе Отправка передачи элементов управления в конечную точку по умолчанию.

  7. Отправка массовых или прерываний передач.

    Выполняйте операции чтения и записи в массовые конечные точки, прерывания и из нее, поддерживаемые вашим устройством. Дополнительные сведения см. в разделе Выдача запросов ввода-вывода.

  8. Отправка изохронных передач.

    Отправлять изохронные запросы на чтение и запись, которые в основном используются для потоковой передачи данных. Эта функция доступна только в Windows 8.1 и более поздних версиях. Дополнительные сведения см. в статье Отправка изохронных передач по USB из классического приложения WinUSB.

См. также раздел