几天来,我一直在为安装API而苦苦挣扎,还有一件事困扰着我:我可以加载一个设备列表,我可以使用这些设备句柄从驱动程序存储中检索适当的驱动程序列表,但我如何确定哪些驱动程序当前已加载?是否真的像说设备描述与驱动程序描述匹配那么简单?或者有API调用吗?为什么我可以从设备中读取应该表示驱动程序信息的GUID,但从上面提到的枚举中获得的驱动程序信息却没有这样的GUID?
非常感谢您的帮助,谢谢!
发布于 2013-07-06 06:12:11
我不能说这是100%的安全性,但它似乎是安全的匹配驱动程序描述和设备描述(我很想知道这是什么原因被认为是好的设计…)。即使使用相同的硬件,这也是匹配的。虽然设备管理器枚举您的设备(Adapter #x),但描述仍然是Adapter,因此可以匹配。另一方面,枚举的名称可以从FriendlyName属性中读取。
如果有人能更详细地回答这个问题,我很乐意看到答案!
发布于 2019-08-17 20:52:27
这是我在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应用程序接口来获取有关该服务的更多信息,例如其二进制文件的路径和其他配置选项。
我希望这能帮助任何人(我看到这个问题是在一段时间之前发布的),他们仍然想知道如何做到这一点。
https://stackoverflow.com/questions/17464703
复制相似问题