【问题标题】:SetupDi API: Control Device Manager functionality programmaticallySetupDi API:以编程方式控制设备管理器功能
【发布时间】:2013-06-14 15:59:49
【问题描述】:

问题:

我有一台带有一堆相同类型的网卡和两个可以为它们提供服务的驱动程序的 PC。当我让 Windows 7 决定加载哪个驱动程序时,每个驱动程序都加载了制造商的驱动程序,对于 4 块卡中的 3 块,这是所需的行为。但最后一张卡需要加载与其他卡不同的驱动程序。

手动解决:

这个问题可以通过进入设备管理器手动解决,从卡条目的上下文菜单中选择“更新驱动程序”,选择列出每个可用的驱动程序,然后选择 Windows 忽略的驱动程序(因为制造商的驱动程序已签名,而我的不是)。以编程方式执行此操作是我追求的最终目标。

尝试过的方法:

我已经尝试了很多方法来解决这个问题,但我仍然无法完全解决我遇到的问题。

第一个想法是禁用 UPnP 服务或类似地拒绝 Windows 分配驱动程序的努力,但我不能,因为其他卡需要它,并且给定的情况表明驱动程序可能必须定期重新分配。

我尝试使用 DevCon 工具,因为它提供的东西乍一看似乎是一种非常简单的方法来实现我的目标:据说命令行界面与设备管理器本身一样强大。从文档的内容来看,它确实提供了可用的方法,我彻底尝试了。但是识别我想要唯一访问的卡似乎存在问题。使用 DevCon 工具,我可以检索以下格式的设备 ID:

PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XX\X&XXXXXX&X&XXXX

遗憾的是,这并没有多大帮助。在第二个“\”符号之前,所有四个设备的 ID 都是相同的。我可以使用它们来发出 DevCon 提供给我的命令(例如列出兼容的硬件 ID 或只是查找它们)。但似乎 DevCon 没有评估 ID 中第二个“\”之后的部分,这意味着我不能只禁用其中一张卡(我确实可以分辨出哪张卡是我的驱动程序)想改变,所以这方面没有问题)。

一个非常相似的方法是使用 Windows 的 SetupDI Api。实际上,这正是 DevCon 工具使用的 API(好吧,他们就是这么说的)。虽然查找和识别有问题的设备相对容易(即使对于我这样的 C# 人,他从来不必离开托管世界),但除了启用和禁用设备之外,我似乎找不到任何方法来做任何事情。如果我有办法移除卡(完全解除它与任何驱动程序的关联),我很可能能够构建一个解决方法,但我不知道如何。禁用设备很好,但它保留了驱动程序关联,因此对我没有帮助。

如果您可以帮助我改进我的方法或为我指出另一条尝试的路线,请这样做。即使您的回答不能解决我的问题,您的建议也可能会暗示我尚未尝试过的方法,而我已经迫不及待地尝试了所有方法。

【问题讨论】:

    标签: c# c++ winapi windows-7 driver


    【解决方案1】:

    可以使用setupapi.dllnewdev.dll 的组合来解决确切的问题。请注意,后者仅适用于 Win7 及更高版本。使用 setupapi 中的设备和驱动程序枚举函数,您可以从驱动程序存储中获取设备和适当驱动程序的句柄。然后 newdev api 提供了一个 install 函数,该函数接受一个设备和一个驱动程序对象(之前从 setupapis 中检索)并在设备上安装指定的驱动程序。

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2020-11-26
      • 2013-06-05
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      相关资源
      最近更新 更多