我想知道是否有人能帮忙,这是一个有点专业的问题。
我有一个应用程序,需要读取和分析许多USB设备(不是同时,它们都在单独的测试中运行,理论上可以在不同的机器上运行)。
每个USB设备都基于USB HID类,由不同的公司制造,这些USB设备都不是设计在PC上运行的,而是用于不同的平台,但是为了测试设备,客户要求从PC上运行测试应用程序。
一些设备将启动,被windows识别,windows将使用内置在windows中的通用HID类驱动程序初始化并正确启动它们,然后设备将开始发送待测试数据的正确数据包。
一些设备将启动,被窗口识别,窗口将尝试启动它们,但未能完全初始化,使它们处于半初始化状态。这很好,因为我可以使用我的beagle协议分析器从真正的平台捕获初始化数据包,然后使用LibUSBDotNet库复制初始化序列中的剩余数据包,让它们开始正确发送数据包。
我遇到的问题是一个特定的设备(尽管还有一些我还没有测试过,所以很可能其中一个也会出现同样的问题)。问题是Windows HID类驱动程序识别设备并尝试初始化和启动它,这在某种程度上起作用,设备开始发送数据。
问题是,发送的数据与发送到真正平台的数据不同(只包含完整数据的一个子集)。就好像windows已经将设备初始化为不同的模式。
当我使用USB协议分析器从PC和正版平台捕获初始化数据包时,我发现Windows发送的初始化数据包略有不同。一旦Windows已经启动该设备,使用LibUSBDotNet重新发送正确的数据包似乎没有效果。
我的问题是,我需要阻止windows尝试使用标准HID类驱动程序初始化设备,我已经尝试在设备管理器中删除驱动程序,但它仍然会初始化它(并且驱动程序在设备管理中被神奇地重新分配)。我做了一些调查,有可能的替代方案:
-
创建一个特定的驱动程序,windows会将其分配给设备的特定VID/PID,但这什么都不做,然后我可以使用LibUSBDotNet从我自己的代码中向设备发送正确的初始化序列。
-
使用类似WinUSB的东西为设备创建一个合适的驱动程序(或者可能创建一个像1这样的"死"驱动程序。
windows是否会优先使用定义了特定VID/PID的驱动程序,而不是内置的USB HID类驱动程序?如果不是这样,我会浪费时间走这条路吗?
注意,我的mac正确地初始化了有问题的设备,我问过客户端是否可以为mac开发应用程序的问题,他们的回答只是让Windows感到沮丧。
我没有编写合适的Windows驱动程序的经验,尽管我有在相对较低级别上与USB通信的经验(所以这部分不太担心)。有人能提出一个好的行动方案吗(在我可能浪费数周时间研究如何为电脑编写驱动程序,却发现我选择的行动方案无法满足我的要求之前)。
非常感谢任何帮助或建议。
谢谢,富
尝试以下建议后添加:
我尝试使用LibUsbDotNet-inf向导创建必要的文件并安装它们,这似乎奏效了——当然,该设备现在在设备管理器中显示为libusb-win32设备——而不是HID设备,相关的驱动程序是libusb驱动程序。即使在这样做之后,设备似乎仍然被初始化并开始发送错误类型的数据包,尽管现在这些数据包不再由类驱动程序处理,只是丢失了。
我还遇到了Zadig,它有一个类似的WinUSB inf创建向导,结果完全相同。
一位同事建议,可能不是windows本身将设备切换到这种模式,而是设备识别出它连接到了windows机器,并将自己切换到了这种模式。我怀疑是这样的,在这种情况下,我陷入了与客户进行另一次对话的时间。
非常感谢你的帮助。
您正在使用libusb-win32作为筛选器驱动程序;也就是说,为您的设备分配并加载HidUsb设备驱动程序,但随后在顶部加载libusb-win32驱动程序,使您可以畅通无阻地访问硬件。
如果您不希望HidUsb(或任何其他类驱动程序)"代表您"执行任何通信,只需将libusb-win32作为设备驱动程序与硬件关联即可。为此,您必须创建一个.INF文件,将其与每个USB设备的VID/PID/修订版相关联。如果我没有记错的话,libusb-win32甚至附带了一个生成此类.INF文件的实用程序。
如果你安装这个.INF文件,例如使用PnpUtil.exe
(在Vista或更高版本上可用),你可能仍然会遇到这样的问题:尽管你比普通HID驱动程序更匹配,但仍然选择HID驱动。
通用HID驱动程序通过兼容ID(即USB接口类)匹配设备,而您则通过硬件ID(优先级更高)进行匹配。但是,Windows可能会优先考虑其他方面,例如驱动程序未签名。阅读:Windows如何选择驱动程序
幸运的是,即使在这种情况下,使用自己生成的证书(使用CertUtil.exe
、MakeCat.exe
和SignTool.exe
)对驱动程序进行签名也不太困难。