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

时间:2012-01-30 09:42:04

标签: windows usb device-driver winusb

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

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

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

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

某些设备将启动,被Windows识别,尝试启动它们但无法完全初始化它们,使它们处于半初始化状态。这很好,因为我可以使用我的beagle协议分析器从真正的平台捕获初始化数据包,然后使用LibUSBDotNet库在初始化序列中复制剩余的数据包并让它们开始正确地发送数据包。

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

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

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

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

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

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

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

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

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

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

    谢谢, 富


    在尝试以下建议后添加:

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

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

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

    非常感谢你的帮助。

1 个答案:

答案 0 :(得分:5)

您使用libusb-win32作为过滤器驱动程序;也就是说,HidUsb设备驱动程序是为您的设备分配和加载的,但随后libusb-win32驱动程序被加载到顶部,让您无障碍地访问硬件。

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

如果您安装此.INF文件,例如使用PnpUtil.exe(在Vista或更高版本上可用),您可能仍遇到问题,尽管您比通用HID驱动程序更好,但仍然选择了HID驱动程序。

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

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

相关问题