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

C# 通过SetupApi找出为设备加载的驱动程序,c#,c++,winapi,interop,setupapi,C#,C++,Winapi,Interop,Setupapi,我已经为安装API苦苦挣扎了好几天,但仍然有一件事困扰着我:我可以加载设备列表,我可以使用这些设备句柄从driverstore检索适当的驱动程序列表,但是我如何确定当前加载了哪些驱动程序?实际上,说设备描述与驱动程序描述匹配一样简单吗?或者有API调用吗?为什么我可以从本应表示驱动程序信息的设备中读取GUID,但从上述枚举中获取的驱动程序信息没有这样的GUID 非常感谢您的帮助,谢谢 我不能100%安全地这么说,但匹配驱动程序描述和设备描述似乎是安全的(我想知道这被认为是好设计的原因是什么…)。

我已经为安装API苦苦挣扎了好几天,但仍然有一件事困扰着我:我可以加载设备列表,我可以使用这些设备句柄从driverstore检索适当的驱动程序列表,但是我如何确定当前加载了哪些驱动程序?实际上,说设备描述与驱动程序描述匹配一样简单吗?或者有API调用吗?为什么我可以从本应表示驱动程序信息的设备中读取GUID,但从上述枚举中获取的驱动程序信息没有这样的GUID


非常感谢您的帮助,谢谢

我不能100%安全地这么说,但匹配驱动程序描述和设备描述似乎是安全的(我想知道这被认为是好设计的原因是什么…)。即使使用相同的硬件,这也会匹配。虽然Devicemanager枚举您的设备(
Adapter#x
),但描述仍然是
Adapter
,因此可以匹配。另一方面,枚举的名称可以从FriendlyName属性中读取。

如果有人能更详细地回答这个问题,我很乐意看到这个答案

这是我在Stackoverflow上的第一篇帖子,如果我的礼仪不规范,请原谅

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

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

我希望这能帮助那些仍然想知道如何做到这一点的人(我看到这个问题不久前已经发布了)