我正在尝试检查是否在安装过程中为特定USB设备安装了驱动程序。不幸的是,制造商为同一个驱动程序提供了几个不同的安装程序,并且注册表中似乎没有一致的位置来检查驱动程序是否已安装。但是很明显,Windows 必须知道是否为给定的USB设备ID(例如VID和PID)安装了驱动程序,并且我认为这是记录在注册表中的?
如何仅通过查询注册表来检查驱动程序是否安装,而不依赖于查找特定于安装程序的密钥,例如对卸载程序的引用(不可靠)或调用Windows API函数?
答案 0 :(得分:1)
不要查询注册表。没有记录的位置,它会发生变化。绝对是版本之间,可能是服务包。
正确的方法是使用Windows API函数,并且不清楚为什么要拒绝此解决方案。
答案 1 :(得分:0)
我遇到了与您想在Installshield中检查是否存在设备驱动程序相同的问题。
我首先尝试了USB Device Registry Entries中提到的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\
路径,它在我尝试过的2个Windows 10系统上都有效,但是在第3个系统上,它不再不但是在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceMigration\Devices\USB\
中,我认为它具有Windows 10更新,但我不确定…
我终于发现,在所有系统上,我能够在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class
中找到VID / PID文本(在我的情况下为VID_0483&PID_DF11),这几乎是人们通过编程的方式来完成的。 here。
无论如何,正如MSaters所建议的那样,我宁愿使用类似System.Management.SelectQuery query = new System.Management.SelectQuery("Win32_SystemDriver");
(请参阅How to check whether a driver is installed?)的C#Windows查询,因为我不确定注册表查询始终可以正常工作,但是在我看来,这是不可能的。
编辑:
我发现,即使没有安装驱动程序,Windows也会在连接设备后立即在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\
下创建注册表项,这意味着检查驱动程序是否已安装是不正确的方式。
不过,还有另一种方法,注册表项包含“ VID_XXXX&PID_YYYY”,然后包含“ SERIAL”作为子文件夹,在我的情况下(VID = 1FC9,PID = 000C,SERIAL = ABCD)\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_1FC9&PID_000C\ABCD
,您可以检查存在名为Driver
的条目,似乎只有在安装驱动程序后才创建。
由于某种原因,要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceMigration\Devices\USB\VID_1FC9&PID_000C\ABCD
下查找的条目似乎不是Driver
,而是DriverInfName