在 DLL 中使用 WinUSB?

Using WinUSB within a DLL?

我正在开发一个可以与单个应用程序通信的 USB 设备。看起来我们可能想要一个 Windows 驱动程序来为应用程序提供更好的软件界面。 (与让应用程序本身通过 WinUSB 向设备发送较低级别的命令相反。)

是否可以在 DLL 中使用 WinUSB? Choosing a driver model for developing a USB client driver 没有具体说明。

在这种情况下,我是否应该考虑编写基于 UMDF 或基于 KMDF 的驱动程序,或者调用 WDM 例程的混合驱动程序?

使用 WinUSB 可能是正确的方法。您绝对可以在 DLL 中使用 WinUSB。通常,您可以编写一个调用另一个 DLL 中的函数的 DLL,并且 winusb.dll 没有什么特别之处可以阻止您这样做。此外,它已经在 libusb 和 libusbp 等其他项目中完成,它们编译为使用 winusb.dll.

的 DLL。

我还鼓励您使代码跨平台:不要直接从 DLL 调用 WinUSB,而是使用 USB 抽象库,例如 libusb or libusbp。即使您只想支持 Windows,这些库也比 SetupAPI 和 WinUSB 更易于使用,因此它们应该可以节省开发时间。如果您希望您的代码在不同的操作系统上运行,它们也将节省大量时间。

我认为在这种情况下编写自己的 UMDF 或 KMDF 驱动程序的唯一原因是,如果您需要 WinUSB 不支持的 Windows USB 堆栈的高级功能。例如,如果您需要将设备切换到不同的 USB 配置,或者对电源管理进行棘手的操作,或者允许多个应用程序同时使用该设备。如果你只是想来回发送一些数据,WinUSB 是一个不错的选择。