几天来,我一直在为 Setup API 苦苦挣扎,但仍有一件事困扰着我:我可以加载设备列表,我可以使用这些设备句柄从驱动程序存储中检索适当的驱动程序列表,但是怎么做我确定当前加载了哪些?是否真的像设备描述与驱动描述匹配一样简单?或者是否有 API 调用?为什么我可以从应该代表驱动程序信息的设备中读取 GUID,但我从提到的枚举中获得的驱动程序信息没有这样的 GUID?
非常感谢任何帮助,谢谢!
我不能以 100% 的安全性这么说,但匹配驱动程序描述和设备描述似乎是安全的(我很想知道为什么这被认为是好的设计......)。即使使用相同的硬件,这也将匹配。虽然 Devicemanager 枚举您的设备 ( Adapter #x
),但描述仍然是Adapter
唯一的,因此可以匹配。另一方面,枚举名称可以从 FriendlyName 属性中读取。
如果有人可以更详细地回答这个问题,我很乐意看到这个答案!
这是我在 Stackoverflow 上的第一篇文章,所以如果我的表单礼仪不妥,请原谅...
我可能有一些额外的方法来实现你所追求的。我使用统一设备模型的 DeviceProperties 来获取此信息。这也可以使用 SetupAPI 来实现。使用 SetupAPI,您可以使用SetupDiCreateDeviceInfoList函数获取“设备信息集”的句柄,其中包含有关所有设备(或属于您选择的“设置类”的设备)的信息。您可以使用SetupDiEnumDevicEInfo函数通过在每次调用后增加 memberindex 变量来“迭代”此列表。每次调用此函数都会为您提供一个SP_DEVINFO_DATA 结构(您必须自己为其分配内存)。此结构唯一标识设备。结合“设备信息集”的句柄,它可以传递给SetupDiGetDevicePropertyW函数以获取在设备中注册的任何属性(如统一设备模型中所述)。函数的 propertyKey 参数可以传递一个指向DEVPKEY_Device_Service常量的指针(它是 DEVPROPKEY 的常量实例,在 devpkey.h 中定义(如果您使用 C#,则必须自己创建此变量,因为您不能包含 .h C# 中的文件,就像在 C/C++ 中一样))。该函数将使用 UTF16 字符串(.net 中的普通字符串(我建议使用 .net StringBuilder)填充缓冲区(由您分配)例如为简单起见))。该字符串现在应该包含为此设备加载的驱动程序(也称为服务)的名称。
如果您愿意,您可以使用 SCManager API 获取有关服务的更多信息,例如其二进制文件的路径和其他配置选项。
我希望这对仍然想知道如何做到这一点的任何人(我看到问题是不久前发布的)有所帮助。