【问题标题】:Programmatically Install "Incompatible" Driver For USB Device以编程方式为 USB 设备安装“不兼容”驱动程序
【发布时间】:2017-07-18 17:50:45
【问题描述】:

我有一个在 Windows 7、8、8.1 和 10 计算机上使用的 USB 设备。此设备(最终)在所有这些配置上都被 Windows Update 识别,并且为该设备安装了默认驱动程序。我想强制此设备使用我指定的驱动程序,该驱动程序 不是 Windows 将选择的默认驱动程序。我想以编程方式执行此操作,最好使用 Windows 原生的组件(如批处理或 PowerShell),或者足够小以将它们包含在可部署的安装包中。

我们的目标是找到一些编程方式来复制以下一组步骤调用的功能:

打开设备管理器-->右击想要更新的设备--> "更新驱动软件..." --> "浏览我的电脑以获取驱动程序软件" --> "让我从我电脑上的驱动程序列表中挑选" --> 取消选中“显示兼容硬件”复选框--> 选择制造商和型号。

据我所知,这有效地绕过了设备先前或默认应用的 *.INF 文件中指定的默认硬件 ID。

我尝试使用 devcon.exe 执行此操作(尝试“安装”和“更新”功能),发现每次都失败,无论我如何一般指定设备的硬件 ID(不允许它影响其他设备,当然)。我可以列出设备的驱动程序文件,但不能更改它们。

我也研究了 PnPUtil,但这似乎不适合将 specific 驱动程序应用到 specific 设备的应用程序。

也一直在研究 PowerShell 的文档,并且可以再次列出设备及其所有属性(包括它的驱动程序和驱动程序文件),但我还没有找到一种以编程方式强制安装驱动程序的方法 我的选择。

关于如何实现上述目标的任何想法?提前非常感谢。

【问题讨论】:

  • 投反对票是怎么回事?
  • Dean,你解决了吗?你能发布解决方案吗?

标签: windows powershell batch-file winapi powershell-2.0


【解决方案1】:

USB 主机 (Windows) 根据设备在询问时返回的描述符选择合适的驱动程序(在某些情况下,驱动程序是按接口加载的,在这种情况下,您需要读取接口描述符)。设备描述符可以包含以下信息:

bcdUSB
bDeviceClass
bDeviceSubClass
bDeviceProtocol
bMaxPacketSize0
idVendor
idProduct
bcdDevice
iManufacturer
iProduct
iSerialNumber
bNumConfigurations

通用(默认)类驱动程序通常根据 bDeviceClass、bDeviceSubclass 和其他一些细节来选择。如果设备供应商希望他们的驱动程序覆盖默认驱动程序,他们会为 idVendor 和 idProduct 实现一个 .inf 文件,并将其指向他们的驱动程序。如果您想覆盖默认驱动程序,您应该这样做。我想说,即使您想在代码中执行此操作,也需要生成该 inf 文件。 This 是很好的信息来源,即使您自己没有实现驱动程序。

【讨论】:

  • 如果我尝试使用预先存在的 INF 文件怎么办?比如说,一个与其他第三方软件一起安装的软件?
  • 这取决于 .inf 文件的内容。如果它适用于您正在使用的硬件,它会起作用,我认为您不需要在这里提问。要点是 inf 文件必须与硬件匹配,无论是具体还是在类/接口级别。
【解决方案2】:

如果您的设备不是即插即用的,并且在运行过程中可以插入机器,您可以尝试使用DevCon并执行其InstallUpdate功能。

【讨论】:

  • 谢谢,但我在原始问题中提到我尝试了 DevCon,并且不断失败。我怀疑这是因为所需的 INF 文件不包含我的设备拥有的硬件 ID。
  • 可能我没有仔细阅读。您是否尝试根据您的硬件编辑 INF 文件中的 VID/PID?
  • 我没有尝试在 INF 中编辑 VID/PID。这可能是一个可行的选择,但考虑到我可以使用 Windows 的设备管理器强制设备使用不一定对应于我设备的硬件 ID 的 INF,我希望避免这种选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
相关资源
最近更新 更多