Windows 10 - 清除 USB 枚举/驱动程序垃圾

Posted

技术标签:

【中文标题】Windows 10 - 清除 USB 枚举/驱动程序垃圾【英文标题】:Windows 10 - clean out USB enumeration/driver cruft 【发布时间】:2017-05-29 09:13:41 【问题描述】:

总结

我正在使用STM32F072 Discovery board 为自定义 USB 设备开发固件和 PC 测试应用程序。该设备包含PC上WinUSB驱动的MicrosoftWindows Compatible IDs (WCIDs) to enable automatic installation。

在其他 Windows 10 主机上正确枚举了该设备,但在我的 Windows 10 开发 PC 上却没有。我的开发 PC 之前曾尝试枚举具有相同 VID/PID 组合但具有不同描述符/元数据的设备。如果我将 PID 更改为其他数字(对我的开发 PC 来说是新的),它确实正确枚举。

问题

    如何让它与我的开发 PC 上所需的 VID/PID 组合一起工作? Windows 缓存 USB 元数据是否是这台 PC 上枚举失败的原因? 在设备描述符和元数据不断变化的阶段,在 (Windows) PC 端测试/开发 USB 设备固件的最佳做法是什么?是否可以避免仅仅为了避免 Windows 缓存而咀嚼 PID?

详情

由于 Windows 从以前的枚举中缓存 USB 描述符等的方式,在固件开发过程中,每次我进行其他更改后,我都会在固件中增加设备产品 ID (PID),以确保 Windows 没有从描述符的先前迭代中缓存东西,并弄乱原本可以工作的东西。

现在我已经让设备作为 WinUSB 设备在 Windows 7、8 和 10 PC 上成功枚举,并且我已经建立了通信。但是,当我将固件改回使用我开始使用的 VID/PID,然后将设备连接到 我的开发 PC 时,它会在设备管理器中的“其他设备”下显示一个错误图标.我认为这是因为我的 (Windows 10) 开发 PC 之前已经看到这个 VID/PID 组合具有不同的描述符,所以它被一些糟糕的缓存内容弄糊涂了。

我尝试使用regedit 删除HKLM\SYSTEM\CurrentControlSet\Enum\USB\VID_xxxx&PID_yyyy 下的设备注册表项,但问题仍然存在。 (另外,我收到一个错误,因为它无法删除 VID_xxxx&PID_yyyy\zzzzzzzzzzzzz\Properties 子文件夹。)我还尝试使用 USBDeview 卸载设备的旧版本,但这也没有任何区别。

另外值得注意的是,我无法再将设备传递给 Virtual Box 虚拟机。我不确定那里发生了什么。

【问题讨论】:

我首先断开设备configuring Device Manager to show it anyway,然后使用“完全删除”选项删除驱动程序。然后检查注册表是否有任何引用,如果您有权限问题,您可能需要在本地系统上下文中运行 regedit。 您还需要检查 c:\windows\inf 并删除旧 inf 文件的所有副本以及引用该设备的任何 oem*.inf 文件。 可能还有其他地方,但这些是我知道的那些。当然,您需要重新启动。 :-) @HarryJohnston, deleting the driver with the "remove completely" option - 您是指“确认设备卸载”对话框中的“删除此设备的驱动程序软件”复选框吗? 是的,这就是我的意思。 @HarryJohnston,我尝试了你的建议,但没有奏效。我认为任何oem*.inf 文件都与我的设备无关,因为我使用的是WCID。顺便说一句,当我卸载设备时,“删除此设备的驱动程序软件”选项不可用。 您是否尝试在注册表中搜索相关 PID 的任何其他实例?还是你的 VID? 【参考方案1】:

我知道 OP 已经解决了他的问题,但供遇到此问题的其他人将来参考:我在开发具有供应商特定类的 USB 设备时遇到了类似问题。具体来说,(类似于您的经历)我HKLM\SYSTEM\CurrentControlSet\Enum\USB\VID_xxxx&PID_yyyy无法删除密钥, 所以我每次修改设备代码时都必须增加 PID。

无法删除这些键的原因是Properties注册表子文件夹归System user所有,所以即使以管理员身份运行你也不能删除这个子文件夹也不能改变它的权限。

通过PsExec(Mark Russinovich 的SysInternals suite 的一部分)从提升的命令提示符运行Regeditpsexec -s -i regedit.exe 运行 regedit 作为系统用户,这意味着您可以删除那个讨厌的 Properties 子文件夹和父 VID_xxxx&PID_yyyy 键。

【讨论】:

此方法似乎不再起作用:导致:The handle is invalid. Error establishing communication with PsExec service on xxxx 显然,当您禁用此 prog AFAICT 使用的 SMB 共享(您应该这样做!)时会发生这种情况。 您是否从提升的命令提示符运行命令(即以管理员身份运行...)?从常规命令提示符运行会导致错误 Couldn't install PSEXESVC service: Access is denied.【参考方案2】:

尝试删除表单的任何相关注册表项:

HLKM\SYSTEM\CurrentControlSet\Control\UsbFlags\vvvvpppprrrrr

MSDN 文章Microsoft OS Descriptors for USB Devices 说:

操作系统在此注册表项下创建一个名为 osvc 的注册表项,指示设备是否支持 Microsoft 操作系统描述符。如果设备在操作系统第一次向其查询 Microsoft OS 字符串描述符时未提供有效响应,则操作系统将不再对该描述符进行请求。

【讨论】:

除此之外,我还删除了 HKLM\ControlSet001\Control\usbflags\vvvv*HKU\.DEFAULT\Software\Microsoft\TelemetryClient\ThrottleStore\watson\generic\generic\pnpdeviceproblemcode\*vid_????* 中的注册表项以使其正常工作。不过,我不确定这两个是否都是必需的。你知道这些吗?另外,关于我的问题 #3 有什么意见吗? 我很高兴你能够让它工作。我对其他标志了解不多,当然ControlSet001 可能是由ControlSet 的副本制成的。 pnpdeviceproblemcode 的东西看起来很相关。对于问题 #3,我没有太多要说的:通常卸载 Windows 设备管理器中的所有相关设备节点就足以测试您的新描述符(不要忘记卸载 USB 复合设备的任何复合父节点)。但如果遇到问题,请记得清除这些注册表项。 谢谢。我的问题现在已经解决了(我赞成这个答案),但如果没有更正式的东西(注册表项的综合列表和 Q#3),我会犹豫接受它——似乎没有人这样做。想法?看起来公平吗?关于 Q#3,我觉得应该有一个“禁用描述符缓存”模式。似乎对这个设备开发阶段没有太多考虑。【参考方案3】:

我遇到了同样的问题,卸载设备没有帮助。 弄乱注册表让我感到不安。 我仍然没有看到问题 #3 的真正答案。 在我的情况下有效:打开设备管理器,选择非工作设备并执行“更新驱动程序”。从本地可用 (Microsoft) 驱动程序列表中手动选择驱动程序。 这并没有解决我所有的问题,但至少 Windows 不再忽略我的设备,我可以继续开发。

编辑:我在 Pete Batard 的名为 WCID Devices 的 github 项目上找到了一个非常有用的描述。我强烈建议阅读此页面上的实施部分和以下内容WCID Devices

【讨论】:

【参考方案4】:

有一些工具可以删除 USB 设备的隐藏痕迹,例如 USBOblivion http://www.thewindowsclub.com/usboblivion-remove-usb-traces-windows 、USBDeview、...

USBOblivion 的来源在这里:https://sourceforge.net/projects/usboblivion/ (https://www.openhub.net/p/usboblivion)

http://www.techerator.com/2010/05/how-to-remove-hidden-duplicate-copies-of-usb-device-drivers-in-windows/

【讨论】:

这本身并没有解决我的问题,但是 USBOblivion 上的注册表项列表提示了我在哪里查找要删除的键,这导致我解决了问题。 @cp.engr - 你如何分享你的发现? @ericfrazer,从来没有一个明确的权威综合答案。我的发现在这里的 cmets 中。一年多了,我手头没有这个开发环境了,所以我只能提供这些了。 【参考方案5】:

删除 TrustedInstaller 拥有的注册表项

不幸的是,运行 RegEdit 的旧 PsExec 技巧并不总是有效。在这种情况下尝试使用:

ExecTI - 以 TrustedInstaller 身份运行 运行它以打开 ExecTI GUI 并输入:C:\Windows\regedit.exe

修复文件和注册表权限

您也可以尝试使用非常旧的工具:subinacl.exe示例subinacl.exe /subkeyreg HKEY_LOCAL_MACHINE\SYSTEM\ControlSet\Enum\USB\VID_0000&PID_0002\

进一步描述here。并且已经证明在 Win10 上仍然可以工作。

【讨论】:

以上是关于Windows 10 - 清除 USB 枚举/驱动程序垃圾的主要内容,如果未能解决你的问题,请参考以下文章

windows下JAVA语言怎么操作USB设备进行数据收发。求指教~~~~~

Windows 10 上的 USB-MIDI 驱动程序

android平台 usb设备开发 动态枚举pc端的usb端口?

windows - 如何枚举所有连接的 USB 设备的设备路径?

从USB驱动器运行Windows 10

USB设备驱动之设备初始化(设备枚举)