USB 设备的 Windows 桌面应用

在本文中,你将了解应用程序如何调用 WinUSB 函数 来与 USB 设备通信。 对于此类应用程序, WinUSB (Winusb.sys) 必须作为设备的功能驱动程序安装。 设备的内核模式堆栈中的 WinUSB。 此驱动程序包含在 Windows\System32\drivers 文件夹中的 Windows 中。

如果使用 Winusb.sys 作为 USB 设备的函数驱动程序,则可以从应用程序调用 WinUSB 函数 来与设备通信。 这些由用户模式 DLL Winusb.dll 公开的函数简化了通信过程。 应用程序调用等效的 WinUSB 函数,而不是构造设备 I/O 控制请求来执行标准 USB 操作, (例如配置设备、发送控制请求以及向设备) 传输数据或从设备传输数据。

Winusb.dll 使用应用程序提供的数据构造相应的设备 I/O 控制请求,然后将请求发送到 Winusb.sys 进行处理。 为了与 USB 堆栈通信,WinUSB 函数使用与应用程序请求关联的相应 IOCTL 调用 DeviceIoControl 函数。 请求完成后,WinUSB 函数会将 Winusb.sys (返回的任何信息(例如读取请求) 的数据)传递回调用进程。 如果调用 DeviceIoControl 成功,则返回非零值。 如果调用失败或挂起 (未立即处理 ) ,DeviceIoControl 将返回零值。 如果发生错误,应用程序可以调用 GetLastError 以获取更详细的错误消息。

与实现驱动程序相比,使用 WinUSB 函数与设备通信更简单。 但是,请注意以下限制:

  • WinUSB 函数允许一次一个应用程序与设备通信。 如果需要多个应用程序与设备并发通信,则必须实现函数驱动程序。

  • 在Windows 8.1之前,WinUSB 函数不支持向/从常时等量终结点流式传输数据。

  • WinUSB 函数不支持已有内核模式支持的设备。 此类设备的示例包括调制解调器和网络适配器,分别受电话 API (TAPI) 和 NDIS 支持。

  • 对于多功能设备,可以使用设备的 INF 文件单独为每个 USB 功能指定内置内核模式驱动程序或 Winusb.sys。 但是,只能为特定函数指定其中一个选项,而不能同时指定这两个选项。

注意

WinUSB 函数需要 Windows XP 或更高版本。 可以在 C/C++应用程序中使用这些函数与 USB 设备通信。 若要编写使用 WinUSB API 的 UWP 应用,请参阅 USB 设备的 UWP 应用

入门

  1. 获取编写适用于设备的 Windows 桌面应用所需的工具

  2. 获取测试 USB 设备及其硬件规格。

    • 使用规范确定应用的功能和相关设计决策。

    • Microsoft USB 测试工具 (MUTT) 设备可从 JJG Technologies 获取。 此设备需要 Microsoft 提供的固件,请参阅 下载 MUTT 软件包

  3. 编写获取设备句柄的框架应用。

    可通过两种方法编写第一个应用程序:

  4. 为设备安装 Winusb.sys。

    如果使用 Visual Studio,请使用 Visual Studio 部署在目标计算机上安装驱动程序包。 有关说明,请参阅 基于 WinUSB 模板编写 Windows 桌面应用。 否则,请通过编写自定义 INF 在 设备管理器 中手动安装驱动程序。 有关详细信息,请参阅 WinUSB (Winusb.sys) 安装

  5. 获取有关设备的信息并查看其描述符。

    有关概念信息,请参阅 面向所有 USB 开发人员的概念。 通过读取配置描述符、每个支持的备用设置的接口描述符及其终结点描述符,获取有关设备功能的信息。 有关详细信息,请参阅 查询设备的 USB 描述符

  6. 发送 USB 控制传输。

    将标准控制请求和供应商命令发送到设备。 有关详细信息,请参阅 将控制传输发送到默认终结点

  7. 批量发送或中断传输。

    对设备支持的批量、中断和常时等量终结点执行读取和写入操作。 有关详细信息,请参阅 问题 I/O 请求

  8. 发送常量传输。

    发送常时等量读取和写入请求,主要用于流式处理数据。 此功能仅适用于 Windows 8.1 及更高版本。 有关详细信息,请参阅 从 WinUSB 桌面应用发送 USB 常时等量传输

另请参阅