未插入设备时如何确定设备驱动程序的版本?

How can I determine the version of a device driver when the device is not plugged in?

多亏了其他一些有用的 Whosebug 问题,我找到了一种查询 WMI 以获取设备驱动程序的方法。但是,在我看来,数据存储在不同的地方,不能很好地结合在一起。

我有一条使用 FTDI 驱动程序的 USB 转串口电缆。我可以查询 Win32_SystemDrivers 来确定驱动程序是否已安装,如下所示:

SelectQuery query = new SelectQuery("Win32_SystemDriver");
query.Condition = "Name = 'FTDIBUS'";

ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection drivers = searcher.Get();
bool installed = (drivers.Count > 0);

但是那个集合并没有告诉我关于版本信息的事情。然后我发现我可以查询 Win32_PnPSignedDriver 来查找设备驱动程序的版本。所以我正在做这样的事情:

SelectQuery query = new SelectQuery("Win32_PnPSignedDriver");
query.Condition = "DriverProviderName = 'FTDI'";

ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection drivers = searcher.Get();

foreach (ManagementBaseObject driverObject in drivers)
{
    ManagementObject driver = (ManagementObject)driverObject;
    string version = driver["DriverVersion"].ToString();
}

但是,第二个代码块只有在实际插入电缆(设备)时才会成功。我想做的是检查安装的设备驱动程序的版本,无论是否设备当前已插入。

我该怎么做?

看来Win32_SystemDriver class 可以给你关联的驱动程序.sys 文件的路径名。

示例:“\SystemRoot\System32\drivers\afd.sys

然后你可以得到.sys文件版本:

String path = @"C:\Windows\System32\drivers\afd.sys"
var myFileVersionInfo = FileVersionInfo.GetVersionInfo(path);
var version = myFileVersionInfo.ProductVersion;

请记住,您要求解决 chicken-and-egg 问题,这对任何程序来说都不是一个非常健康的开始。 Windows 中的即插即用建立在设备驱动程序可以在设备可用时动态定位并在必要时下载的概念之上。那是一只鸡。

如果驱动程序 pre-installed 或以前使用过,您只能希望找到这个蛋。并非完全不常见。在这种情况下,它将在 驱动程序商店 中可用。枚举的时候应该可以找回来。

执行此操作的示例程序是 available here。用 C# 编写,这是您想要的良好开端。我将复制屏幕截图:

注意显示的驱动程序日期和版本,以及您要询问的内容。请记住,可能存在多个版本。您可能想看一下源代码,它 非常 简单。它实际上依赖于 Windows 实用程序来填充 ListView,PnPUtil.exe 和 /e 选项枚举商店。从命令行通过 运行 尝试。

用资源管理器也可以很方便的看到存储内容,文件存储在c:\windows\system32\driverstore\filerepository。阅读 .inf 文件以添加额外的过滤可能很有用。您返回的 .inf 文件名,列在屏幕截图的第一列中,实际上是复制到 c:\windows\inf 目录中的文件名。