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

标签 c# c++ winapi interop setupapi

几天来我一直在努力使用 Setup API,但仍有一件事困扰着我:我可以加载设备列表,我可以使用这些设备句柄从驱动程序商店中检索适当驱动程序的列表,但是我如何确定当前加载了哪些?说设备描述与驱动描述相符真的那么简单吗?或者是否有 API 调用?为什么我可以从应该代表驱动程序信息的设备中读取一个 GUID,但我从提到的枚举中获得的驱动程序信息却没有这样的 GUID?

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

最佳答案

这是我在 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 获取有关该服务的更多信息,例如其二进制文件的路径和其他配置选项。

我希望这对仍然想知道如何做到这一点的任何人(我看到这个问题是不久前发布的)有所帮助。

关于c# - 通过 SetupApi 找出为设备加载的驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17464703/

相关文章:

c# - Dnn,客户端资源管理 - 模块路径

c++ - 在 C++ 中使用 utf8 库将 UTF 16 转换为 UTF8

c++ - 管理 Windows XP 和 Vista/Server 2008 之间的 Windows API 差异

c - SetupDiGetDriverInfoDetail 返回 ERROR_INSUFFICIENT_BUFFER

javascript - 将 bootstrap 模态打印为 PDF

c# - CoreWindow.GetForCurrentThread().SizeChanged 和 Window.Current.SizeChanged 事件有什么区别

c# - 如何使用 MVVM 为用户偏好创建程序架构

c++ - VS 2010 中首选的多线程方法/库?

c++ - 如何在链表中生成唯一ID?

delphi - 什么会导致 SysFreeString 遇到 Int 3 断点?