Классическое приложение Windows для USB-устройства
В этой статье вы узнаете, как приложение может вызывать функции WinUSB для взаимодействия с USB-устройством. Для такого приложения необходимо установить WinUSB (Winusb.sys) в качестве драйвера функции устройства. WinUSB в стеке режима ядра устройства. Этот драйвер включен в Windows в папку \Windows\System32\drivers.
Если вы используете Winusb.sys в качестве драйвера функции USB-устройства, вы можете вызвать функции WinUSB из приложения для взаимодействия с устройством. Эти функции, предоставляемые библиотекой DLL в пользовательском режиме Winusb.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-устройства.
Начало работы
Получение средств, необходимых для записи классического приложения Windows для устройств
- Следуйте инструкциям по загрузке комплекта драйверов Windows.
Получите тестовое USB-устройство и спецификацию оборудования.
Используйте спецификацию для определения функциональных возможностей приложения и связанных решений по проектированию.
Устройства Microsoft USB Test Tool (MUTT) доступны в JJG Technologies. Для этого устройства требуется встроенное ПО от Корпорации Майкрософт, доступное в скачивание пакета программного обеспечения MUTT.
Напишите скелетное приложение, которое получает дескриптор на устройстве.
Существует два подхода для написания первого приложения:
Напишите на основе шаблона WinUSB, включенного в Visual Studio. Дополнительные сведения см. в статье "Запись классического приложения Windows" на основе шаблона WinUSB.
Вызов подпрограмм SetupAPI для получения дескриптора устройства и его открытия путем вызова WinUsb_Initialize. Дополнительные сведения см. в статье "Доступ к USB-устройству с помощью функций WinUSB".
Установите Winusb.sys для устройства.
При использовании Visual Studio установите пакет драйвера на целевом компьютере с помощью развертывания Visual Studio. Инструкции см. в статье "Написание классического приложения Windows" на основе шаблона WinUSB. В противном случае вручную установите драйвер в диспетчер устройств, написав пользовательский INF-файл. Дополнительные сведения см. в статье о установке WinUSB (Winusb.sys).
Получите сведения об устройстве и просмотрите его дескрипторы.
Общие сведения см. в разделе "Основные понятия" для всех разработчиков USB. Получите сведения о возможностях устройства, считывая дескриптор конфигурации, дескрипторы интерфейса для каждого поддерживаемого альтернативного параметра и дескрипторы конечных точек. Дополнительные сведения см. в статье "Запрос устройства для дескрипторов USB".
Отправка передачи USB-элемента управления.
Отправьте стандартные запросы управления и команды поставщика на устройство. Дополнительные сведения см. в разделе "Отправка элемента управления" в конечную точку по умолчанию.
Отправка массовых или прерываний передачи.
Выполняйте операции чтения и записи из массовых, прерываний и изохронных конечных точек, поддерживаемых устройством. Дополнительные сведения см. в разделе "Запросы ввода-вывода проблемы".
Отправка инохронных передач.
Отправлять искомые запросы на чтение и запись, в основном используемые для потоковой передачи данных. Эта функция доступна только в Windows 8.1 и более поздних версиях. Дополнительные сведения см. в статье "Отправка usb-isochronous передачи из классического приложения WinUSB".