SetupDi API:以编程方式控制设备管理器功能
本文关键字:管理器 功能 控制 方式 API 编程 SetupDi | 更新日期: 2023-09-27 18:19:03
问题:
我有一台带有一堆相同类型的网卡的 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# 人员,他从未离开过托管世界(,但我似乎找不到一种方法来做任何事情,只能启用和禁用设备。如果我有办法删除卡(完全取消它与任何驱动程序的关联(,我很可能能够构建一种解决方法,但我无法弄清楚如何。禁用设备很好,但它保留了驱动程序关联,因此对我没有帮助。
如果您可以帮助我改进我的方法或指出另一条尝试路线,请这样做。即使你的回答不能解决我的问题,你的建议也可能暗示我还没有尝试过的方法,我迫切地尝试了所有这些方法。
确切的问题可以使用setupapi.dll
和newdev.dll
的组合来解决。请注意,后者仅在 Win7 及更高版本上可用。使用 setupapi 中的设备和驱动程序枚举函数,可以从驱动程序存储区获取设备和相应驱动程序的句柄。然后,newdev api 提供了一个安装函数,该函数采用设备和驱动程序对象(之前从 setupapis 检索(并在设备上安装指定的驱动程序。