通过SetupApi找出为设备加载的驱动程序

时间:2013-07-04 07:51:15

标签: c# c++ winapi interop setupapi

我几天来一直在努力使用Setup API,但仍然有一件事让我感到困惑:我可以加载一个设备列表,我可以使用这些设备句柄从driverstore中检索适当的驱动程序列表,但是如何确定当前加载了哪些?它实际上就像说设备描述与驱动程序描述相匹配一样容易吗?或者是否有API调用?为什么我可以从应该代表驱动程序信息的设备中读取GUID,但是我从提到的枚举中获得的驱动程序信息没有这样的GUID?

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

我不能用100%的安全性来说这个,但是匹配驱动程序描述和设备描述似乎是安全的(我很想知道这被认为是好设计的原因......)。即使使用相同的硬件,也会匹配。虽然Devicemanager枚举了您的设备(Adapter #x),但说明仅为Adapter,因此可以进行匹配。另一方面,枚举名称可以从FriendlyName属性中读取 如果有人能够更详细地回答这个问题,我很乐意看到答案!

答案 1 :(得分:0)

这是我关于Stackoverflow的第一篇文章,因此,如果我的礼节礼节关闭,请原谅...

我可能还有其他方法来实现您的追求。 我使用统一设备模型的DeviceProperties来获取此信息。 这也可以使用SetupAPI来实现。 使用SetupAPI,您可以使用SetupDiCreateDeviceInfoList函数来获取“设备信息集”的句柄,其中包含有关所有设备(或您选择的属于“安装程序类”的设备)的信息。您可以使用SetupDiEnumDevicEInfo函数通过在每次调用后增加memberindex变量来“迭代”此列表。每次调用此函数都会为您提供一个SP_DEVINFO_DATA  结构(您必须自己分配内存)。该结构唯一地标识设备。可以将其与“设备信息集”的句柄结合使用,将其传递给SetupDiGetDevicePropertyW函数,以获取向设备注册的任何属性(如“统一设备模型”中所述)。可以将函数的propertyKey参数传递给指向DEVPKEY_Device_Service常量的指针(它是DEVPROPKEY的常量实例,并在devpkey.h中定义(如果您使用的是C#,则必须自己创建此变量,因为您可以像在C / C ++中一样在C#中包含.h文件)。该函数将使用UTF16字符串(.net中的普通字符串(为简单起见,我建议使用.net StringBuilder实例))填充缓冲区(由您分配)。现在,该字符串应包含为此设备加载的驱动程序(也称为服务)的名称。

如果愿意,可以使用SCManager API来获取有关该服务的更多信息,例如其二进制文件的路径和其他配置选项。

我希望这对仍在想办法的人(我看到问题是不久前发布的)有所帮助。