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

时间:2017-01-13 21:58:32

标签: windows usb driver stm32 winusb

摘要

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

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

问题

  1. 如何在开发PC上使用我想要的VID / PID组合?
  2. Windows缓存USB元数据是导致此PC上枚举失败的原因吗?
  3. 在设备描述符和元数据不断变化的阶段,(Windows)PC端用于测试/开发USB设备固件的最佳实践是什么?是否可以避免为了避免Windows缓存而咀嚼PID?
  4. 详细

    由于Windows在以前的枚举中缓存USB描述符之类的方式,在固件开发期间,每次进行其他更改后,我都会在固件中增加设备产品ID(PID),以确保Windows不是从以前的描述符迭代中缓存一些东西,并弄乱那些原本会起作用的东西。

    现在我已经让设备在Windows 7,8和10台PC上成功枚举为WinUSB设备,并且我建立了通信。但是,当我将固件更改回使用我开始使用的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虚拟机。我不确定那里发生了什么。

    Error enumerating shown in Device Manager

    Device Manager Code 28 - no compatible drivers

    Device Driver properties

5 个答案:

答案 0 :(得分:4)

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

HLKM\SYSTEM\CurrentControlSet\Control\UsbFlags\vvvvpppprrrrr

MSDN文章Microsoft OS Descriptors for USB Devices说:

  

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

答案 1 :(得分:3)

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

无法删除这些密钥的原因是Properties注册表子文件夹归System user所有,因此即使作为管理员运行,也无法删除此子文件夹也不会更改其权限。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

答案 4 :(得分:0)

要删除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上仍然可以使用。

相关问题