更新其中一个相同型号网络适配器的驱动程序

Update driver for one of the same model network adapters

目标计算机中有多个相同型号的网络适配器。如下图,都是Intel I211

PCI\VEN_8086&DEV_1539&SUBSYS_00008086&REV_03[=10=]60E0FFFF6336A000
    Name: Intel(R) I211 Gigabit Network Connection
    Hardware IDs:
        PCI\VEN_8086&DEV_1539&SUBSYS_00008086&REV_03
        PCI\VEN_8086&DEV_1539&SUBSYS_00008086
        PCI\VEN_8086&DEV_1539&CC_020000
        PCI\VEN_8086&DEV_1539&CC_0200
    Compatible IDs:
        PCI\VEN_8086&DEV_1539&REV_03
        PCI\VEN_8086&DEV_1539
        PCI\VEN_8086&CC_020000
        PCI\VEN_8086&CC_0200
        PCI\VEN_8086
        PCI\CC_020000&DT_0
        PCI\CC_020000
        PCI\CC_0200&DT_0
        PCI\CC_0200
PCI\VEN_8086&DEV_1539&SUBSYS_00008086&REV_03[=10=]60E0FFFF6336A100
    Name: Intel(R) I211 Gigabit Network Connection #2
    Hardware IDs:
        PCI\VEN_8086&DEV_1539&SUBSYS_00008086&REV_03
        PCI\VEN_8086&DEV_1539&SUBSYS_00008086
        PCI\VEN_8086&DEV_1539&CC_020000
        PCI\VEN_8086&DEV_1539&CC_0200
    Compatible IDs:
        PCI\VEN_8086&DEV_1539&REV_03
        PCI\VEN_8086&DEV_1539
        PCI\VEN_8086&CC_020000
        PCI\VEN_8086&CC_0200
        PCI\VEN_8086
        PCI\CC_020000&DT_0
        PCI\CC_020000
        PCI\CC_0200&DT_0
        PCI\CC_0200

如何通过 devcon、C++ 或 C# 更新这些相同型号适配器中特定一个的驱动程序?例如,通过唯一 device instance ID (ex: PCI\VEN_8086&DEV_1539&SUBSYS_00008086&REV_03[=42=]60E0FFFF6336A100)

谢谢

编辑: 我已经在 API 中搜索过这个,但他们都使用 hardware ID 来更新驱动程序,这将更新所有相同型号适配器的驱动程序。 例如:C++ 的 UpdateDriverForPlugAndPlayDevicesA and devcon's update 命令。

EDIT2: 这个问题的动机是我们正在使用一个RTOS(real-timeOS,RTX64),我们想和其他人建立一个实时网络通信(EtherCAT连接)设备由 RTOS。我们需要将其中一个适配器的驱动更新为RTX64提供的驱动,使其可以使用此适配器。

我们仅更新其中一个的唯一可行解决方案是使用Windows'"Device Manager"。 (下图中没有同型号适配器,只是展示了如何通过设备管理器手动更新)

我们要求用户在安装我们的软件后进行此手动更新。这对他们来说不方便。所以我们正试图找到一种自动的方法来做到这一点。

既然 Windows 中的设备管理器可以做到这一点,我们假设 API 也可以做到这一点。

这不是一个普通的程序员问题。

驱动程序编程——作为实时编程的一个子集——是一个高度专业化的领域。普通的 C# 或 C++ .NET 程序员很少需要处理指针之类的东西,也不需要使用汇编程序级别的代码。但对于这两个人来说,这是他们每天的面包和黄油。我不能再给你一般的建议了:

我对您的第一个建议是获取其他人的代码来做出决定和安装。通常一个制造商的驱动程序是打包分发的。确实了解如何处理硬件的识别。通常这些安装程序也有静默模式。所以它归结为调用它们并拦截控制台 output/looking 以获得 return 值。

我的第二个建议,是使用设备管理器中列出的名称。可以选择手动重命名它们。它不是那么可靠,因为字符串非常耐心且容易 changed/missmatched,但它会让你从某个地方开始。

但据我了解,您的问题比一般驱动程序更新更严重。您有两个相同硬件的实例,并且想为每个实例使用不同的驱动程序。更糟的是:

  1. 我什至不确定这是否可能。由于驱动程序文件夹仍然使用旧的 "only one file of each name" 方法,因此您不能为同一硬件的不同实例使用不同的驱动程序。除非您定义自己的驱动程序存储位置。

  2. 我不知道你为什么要那样做。普通的最终用户程序甚至不需要担心选择它将使用的接口。它只是将它的请求移交给网络堆栈,并不处理 layer 3 or below。服务器可能不得不选择一个特定的适配器来监听,或者只是并行监听。但即使是那些也不关心正在使用的驱动程序版本。他们甚至不关心它是否是一个真实的物理接口——毕竟错误分类就像早期的蓝牙和虚拟机这样的虚拟设备 Monitors/PDF 打印机是一回事。

所以老实说,这听起来像是你遇到了 XY 问题,这个想法是(可能是错误的)Y,对你真正的 X。

两个解决方法。一种在更新设备驱动程序时最大限度地减少人工客户交互,另一种完全自动化该过程,但需要使用类似 BASIC 的语言进行编码。

第一个包含针对特定设备实例的 automatically showing the Hardware Update Wizard,使用 API 函数 DiShowUpdateDevice,如前一个 link 中所述。

第二种是使用免费AutoIt自动化软件。有了它,您基本上可以自动化 Windows 系统中的所有内容,它非常强大,我已经将它与网络机器人和自动网络测试(非无头)结合使用。我还在双击 Windows 系统和许多系统管理员任务中使用了它。

请注意,您也可以混合使用这两种方法。首先,使用DiShowUpdateDevice显示向导,然后AutoIt脚本可以自动执行UI交互,客户端根本不需要做任何事情。