我的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#的人,他们从未离开过托管世界),我似乎无法找到除了启用和禁用设备之外的任何方法。如果我有办法移除卡(完全取消与任何驱动程序的关联),我很可能能够构建一个解决方法,但我无法弄清楚如何。禁用该设备很不错,但它保留了驱动程序关联,因此对我没有帮助。
如果您可以帮助我改进我的方法或指向我尝试的其他途径,请这样做。即使你的答案没有解决我的问题,你的建议可能会暗示我尚未尝试的方法,而且我非常绝望地尝试所有这些。
答案 0 :(得分:0)
使用setupapi.dll
和newdev.dll
的组合可以解决确切的问题。请注意,后者仅适用于Win7及更高版本。使用setupapi中的设备和驱动程序枚举函数,您可以从驱动程序存储中获取设备和适当驱动程序的句柄。然后newdev api提供一个安装功能,它接受设备和驱动程序对象(之前从setupapis检索)并在设备上安装指定的驱动程序。