首页 文章

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

提问于
浏览
7

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

谢谢,Rich


尝试以下建议后添加:

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

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

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

非常感谢您的帮助 .

1 回答

  • 5

    您正在使用libusb-win32作为过滤器驱动程序;也就是说,为您的设备分配和加载了HidUsb设备驱动程序,但随后libusb-win32驱动程序被加载到顶部并为您提供无障碍访问硬件的权限 .

    如果您不希望HidUsb(或任何其他类驱动程序)执行任何通信"on your behalf",只需将libusb-win32与您的硬件关联为 device driver 即可 . 为此,您必须创建一个.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 )签署驱动程序也不是很困难 .

相关问题