2012-01-30 284 views
6

我想知道是否有人可以帮忙,这有点专家的问题。我有一个应用程序,需要阅读和分析一些USB设备(不同时,他们每个运行在单独的测试,理论上可以在不同的机器上运行)。用自定义驱动程序替换Windows USB类驱动程序?

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

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

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

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

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

当我使用USB协议分析器从PC和正版平台捕获初始化数据包时,我发现Windows正在发送一些稍微不同的初始化数据包。一旦Windows已经启动设备,使用LibUSBDotNet重新发送正确的数据包似乎没有效果。

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

  1. 创建的Windows将分配给特定的VID特定的驱动程序/设备的PID,但是这并没有什么,然后我可以使用LibUSBDotNet发送正确从我自己的代码中初始化设备到设备。

  2. 使用类似了WinUSB来创建用于该设备的合适的驱动程序(或可能创建像1.

“死”驱动程序将具有特定VID驾驶员/ PID限定通过使用Windows优先于它的内置USB HID类驱动程序?如果没有,那么我会浪费我的时间沿着这条路线?

请注意,我的Mac初始化问题设备正确,我问客户的问题是否该应用程序可以为Mac开发,他们的答案令人沮丧的只有Windows。

我在编写适当的Windows驱动程序方面没有任何经验,尽管我有相当低的USB通话经验(所以部分不用太担心)。任何人都可以提出一个好的行动方案(在我可能浪费数周的时间来研究如何为PC写驱动程序,但仅仅发现我选择的行动方案不能满足我的要求)。

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

感谢, 丰富


新增尝试以下建议后:

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

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

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

非常感谢您的帮助。

+1

你可以提出这个问题更简洁吗?我怀疑很多人会阅读所有这些。 – 2012-01-30 09:43:44

回答

4

您正在使用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可能会优先考虑其他方面,例如您的驱动程序未经签名。阅读:How Windows Selects Drivers

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

+0

谢谢,那里有很多真正有用的信息。是的,我正在使用我通过LibUSBDotNet安装的过滤器。我会按照你的建议尝试并通过一个inf文件进行安装。我调查你的所有建议,并让你知道我如何继续。 – 2012-02-02 14:48:30

+0

请参阅上面的添加注释,解决方案的工作原理是阻止类驱动程序被加载并停止类驱动程序的后续处理,不幸的是,窗口需要识别设备并加载替代驱动程序的最低限度仍然足以触发问题。感谢您的帮助,这是学习设备驱动程序等非常有用的练习。 – 2012-02-02 16:44:52

+0

在一个简单的设备上,Windows只会执行一个平常的“获取设备描述符”和“获取配置描述符”。如果它是一个复合设备,则会获取更多描述符。在任何情况下,Windows都不会在此阶段读取/写入端点或执行奇怪的控制请求。 当你说“替代驱动程序”,替代驱动程序是否真的为设备加载,如果是,它是哪个驱动程序? – Ilya 2012-02-08 08:29:47