首页 > 解决方案 > 更新同一型号网络适配器之一的驱动程序

问题描述

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

PCI\VEN_8086&DEV_1539&SUBSYS_00008086&REV_03\0060E0FFFF6336A000
    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\0060E0FFFF6336A100
    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# 更新这些相同型号适配器中的特定一个的驱动程序?例如,通过唯一的设备实例 ID进行更新(例如:PCI\VEN_8086&DEV_1539&SUBSYS_00008086&REV_03\0060E0FFFF6336A100

谢谢

编辑:我已经为此搜索了 API,但它们都使用硬件 ID来更新驱动程序,这将更新所有相同型号适配器的驱动程序。例如:C++ 的UpdateDriverForPlugAndPlayDevicesA和 devcon 的更新命令。

EDIT2:这个问题的动机是我们正在使用 RTOS(实时操作系统,RTX64),我们希望通过 RTOS 与其他设备建立实时网络通信(EtherCAT 连接)。我们需要将其中一个适配器的驱动程序更新为RTX64提供的驱动程序,以便它可以使用该适配器。

我们只更新其中一个的唯一可行解决方案是使用 Windows 的“设备管理器”。(下图没有同型号的适配器,只是展示了如何通过设备管理器手动更新) 在此处输入图像描述

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

由于 Windows 中的设备管理器可以做到这一点,我们假设有一个 API 也可以做到这一点。

标签: c#c++windowsreal-timedevcon

解决方案


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

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

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

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

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

  1. 我什至不确定这是可能的。由于驱动程序文件夹仍然使用旧的“每个名称只有一个文件”方法,因此您可能无法对同一硬件的不同实例使用不同的驱动程序。除非您定义自己的驱动程序存储位置。

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

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


推荐阅读