8

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

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

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

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

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

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

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

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

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

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

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

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

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

我没有编写适当的 Windows 驱动程序的经验,尽管我有在相对较低的水平上与 USB 通信的经验(所以这部分不用太担心)。任何人都可以提出一个好的行动方案(在我可能会浪费数周时间研究如何为 PC 编写驱动程序只是发现我选择的行动方案无法满足我的要求之前)。

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

谢谢,丰富


尝试以下建议后添加:

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

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

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

非常感谢您的帮助。

4

1 回答 1

8

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

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

于 2012-01-30T12:22:14.067 回答