用自定义驱动程序替换Windows USB类驱动程序?

Ric*_*ter 7 windows usb device-driver winusb

我想知道是否有人可以提供任何帮助,这是一个专家问题.

我有一个应用程序需要读取和分析许多USB设备(不是同时,它们分别在单独的测试中运行,理论上可以在不同的机器上运行).

每个USB设备都基于USB HID类,由不同的公司制造,这些USB设备都不是设计在PC上运行,而是用于不同的平台,但是为了测试设备的目的,客户端已请求从PC运行测试应用程序.

一些设备将启动,被Windows识别,它们将使用内置于Windows中的通用HID类驱动程序初始化并正确启动它们,然后设备将开始发送要测试的数据的正确数据包.

一些设备将启动,被Windows识别,它们会尝试启动它们,但无法完全初始化它们,使它们处于半初始化状态.这是好的,因为我可以用我的小猎犬协议分析仪从真正的平台捕捉初始化分组,然后使用LibUSBDotNet库复制在初始化序列滞留分组,让他们正确地开始发送数据包.

我遇到的问题是使用一个特定的设备(虽然还有一些我还没有测试过,所以很可能其中一个也可能出现同样的问题).问题是Windows HID类驱动程序识别设备并尝试初始化和启动它,这在时尚之后工作并且设备开始发送数据.

问题是发送的数据与发送到真实平台的数据不同(仅包含完整数据的子集).就好像Windows已将设备初始化为不同的模式.

当我使用USB协议分析器从PC和真实平台捕获初始化数据包时,我发现Windows正在发送一些略有不同的初始化数据包.一旦Windows启动,使用LibUSBDotNet重新发送正确的数据包该设备似乎没有任何效果.

我的问题是我需要阻止Windows尝试使用标准HID类驱动程序初始化设备,我尝试在设备管理器中删除驱动程序,但它仍然初始化它(并且驱动程序在设备管理器中神奇地重新分配).我做了一些调查,有可能的选择:

  1. 创建一个特定的驱动程序,窗口将分配给设备的特定VID/PID,但什么都不做,然后我可以使用LibUSBDotNet从我自己的代码中向设备发送正确的初始化序列.

  2. 使用像WinUSB这样的东西为设备创建一个合适的驱动程序(或者可能创建一个像"死"的驱动程序.

Windows中是否会使用具有特定VID/PID的驱动程序,而不是内置的USB HID类驱动程序?如果没有,那么我会浪费时间沿着这条路走?

请注意,我的mac正确地初始化了问题设备,并且我已经询问了客户端是否可以为Mac开发应用程序的问题,他们的答案仅令Windows感到沮丧.

我没有编写正确的Windows驱动程序的经验,尽管我有相对较低级别与USB通信的经验(因此该部分不会太担心).任何人都可以建议一个良好的行动方案(在我可能浪费数周之前调查如何为PC编写驱动程序,但却发现我选择的行动方案无法满足我的要求).

任何帮助或建议非常感谢.

谢谢,Rich


尝试以下建议后添加:

我尝试使用LibUsbDotNet INF向导创建必要的文件和安装它们,这似乎工作 - 当然,该设备现在是出现在设备管理器中作为的libusb-win32的设备 - 不HID设备和相关的驱动程序的libusb驱动程序.即使在这样做之后,设备似乎仍然会被初始化并开始发送错误类型的数据包,尽管现在这些数据包不再由类驱动程序处理而且只是丢失了.

我也遇到了Zadig,它有一个类似于WinUSB的inf创建向导,它有完全相同的结果.

一位同事建议,将设备切换到此模式可能不是Windows本身,而是设备识别它已连接到Windows机器并将其自身切换到此模式.我怀疑是这种情况,在这种情况下我被困住了 - 是时候与客户进行另一次对话了.

非常感谢您的帮助.

Ily*_*lya 5

您正在使用libusb-win32作为筛选器驱动程序;也就是说,已为您的设备分配并加载了HidUsb设备驱动程序,但随后将libusb-win32驱动程序加载到顶部,使您可以畅通无阻地访问硬件。

如果您不希望HidUsb(或任何其他类驱动程序)“代表您”执行任何通信,只需将libusb-win32作为设备驱动程序与您的硬件相关联。为此,您必须创建一个.INF文件,并将其与每个USB设备的VID / PID / Revision关联。如果我没记错的话,libusb-win32甚至附带一个实用程序来生成这样的.INF文件。

如果使用PnpUtil.exe(在Vista或更高版本上提供)安装此.INF文件,则可能会遇到一些问题,尽管您的匹配程度比通用HID驱动程序更好,但仍选择了HID驱动程序。

通用HID驱动程序通过其兼容ID(即USB接口类)来匹配设备,而您将通过硬件ID(具有更高的优先级)进行匹配。但是,Windows可能会优先考虑其他方面,例如未签名驱动程序。阅读:Windows如何选择驱动程序

幸运的是,即使在那种情况下,签署了自我生成的证书驱动程序(使用CertUtil.exeMakeCat.exeSignTool.exe)不是太困难。