使用SetupDI* API列举系统中的设备
原文链接地址:https://blog.csdn.net/clteng/article/details/801012?utm_source=blogxgwz8
在Windows系统中提供一组有用的函数来撷取以安装设备(Device)的信息与增加或解除设备(Device)的安装。在本文中,我将显示如何使用SetupDIXXX与CM_XXX 等API来列举本机上的设备。
在范例程序中并无复杂的画面,只有一个简单的TreeView与ListView控件。TreeLivew控件用来显示所有安装的设备名称,ListView控件则用来显示在TreeView控件中所指定项目的相关信息。所有设备的相关信息(例如:名称,资源与图示等)都是从SetupDiXXX API中所取得的。
SetupDiXXX
设定安装程序接口(Setup Application Programming Interface)提供一组函数来让您的设定安装程序能执行安装的动作或取得设备的相关信息,类别(Class)与它的GUID值。
首先要取的所列举的设备的位图(Bitmap),我们可以呼叫以下的函数:
WINSETUPAPI BOOL SetupDiGetClassImageList(
PSP_CLASSIMAGELIST_DATA ClassImageListData
);
呼叫这个函数会取得每一个已安装设备的位图并建立位图串行。
BOOL SetupDiDestroyDeviceInfoList(
HDEVINFO DeviceInfoSet
);
呼叫这个函数会释放之前呼叫SetupDiGetClassImageList所占有的资源。
WINSETUPAPI BOOL SetupDiGetClassImageIndex(
PSP_CLASSIMAGELIST_DATA ClassImageListData,
const GUID *ClassGuid,
PINT ImageIndex
);
呼叫这个函数会取得每一个已安装设备的位图的索引值。
hDevInfo = SetupDiGetClassDevs(0L, 0L, _hDlg, DIGCF_PRESENT |
DIGCF_ALLCLASSES | DIGCF_PROFILE);
取得设备的信息。首次呼叫时,第一个参数与第二个参数将它们设为”0”,而第三个参数则设定DIGCF_ALLCLASSES旗标,设定此旗标代表要取得所有设备的信息。如果有设定此旗标此时第一个参数将会被忽略。
Geting the Info
呼叫SetupDiEnumDeviceInfo来列举本机上所有的设备。
SetupDiEnumDeviceInfo(hDevInfo, wIndex, &spDevInfoData))
第一个参数为之前呼叫SetupDiGetDevs函数所传回的代码(Handle)。第二个参数为以”0”为基底的索引值,第三个参数为指向SP_DEVINFO_DATA结构的指针。使用此结构时须先设定结构大小。
spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SetupDiGetDeviceRegistryProperty(hDevInfo,
&spDevInfoData,
// Supplies one of the following values, indicating the property to be retrieved.
SPDRP_CLASS,
0L,
(PBYTE)szBuf,
,
);
呼叫SetupDiGetDeviceRegistreProperty函数从Registry中取得设备名称。第三个参数为指定要取得何种信息。
Device Resource
在系统中所有的设备会与类别设备结合在一起。请参下图。这个类别可以是GUID(可以在Registry中寻获)或是设备的描述。例如:”Ports”类别是描述(COM与LPT)。
要取得目前的设备的结构(Configuartion)我们可以呼叫CM_Get_First_Log_Conf函数来取得。然后呼叫CM_Get_Next_res_Des来取得目前设备结构的描述,重复呼叫直到浏览完所有的结构为止。
当此函数成功执行后,我们接着呼叫CM_Get_Res_Des_Data函数来取的资源的数据。
要安装驱动程序,我们可以透过Service API来达成,如果要安装WDM的程序,此时呼叫SetupDiGetINFClass函数先取得此驱动的GUID值,在呼叫SetupDiCreateDeviceInfoList来建立一个新的设备。如下列片断程序代码:
if (!SetupDiGetINFClass(szINFName, &guid, className, MAX_CLASS_NAME_LEN, )){
ShowErrorMsg(_hDlg, GetLastError(), "SetupDiGetINFClass");
return ;
};
hDevInfo = SetupDiCreateDeviceInfoList(&guid, );
if (hDevInfo == (void*)-) {
ShowErrorMsg(_hDlg, GetLastError(), "SetupDiCreateDeviceInfoList");
return ;
};
spDevData.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiCreateDeviceInfo(hDevInfo,
className,
&guid,
0L, 0L, DICD_GENERATE_ID,
&spDevData))
.
.
.
接下来我们要呼叫SetupDiSetDeviceRegistryProperty函数来设定Registry中的内容。设定完成后,呼叫SetupDiCallClassInstaller函数依据Registry的内容来安装驱动程序。最后呼叫UpdateDriverForPlugAndPlayDevices函数来更新设备串行的内容。
if (!SetupDiSetDeviceRegistryProperty(hDevInfo,
&spDevData,
SPDRP_HARDWAREID,
(PBYTE)pHID,
(strlen(_szHardware[wLoop])**sizeof(char)))) {
ShowErrorMsg(_hDlg, GetLastError(), "SetupDiSetDeviceRegistryProperty");
SetupDiDestroyDeviceInfoList(hDevInfo);
LocalFree(pHID);
return ;
};
if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE,
hDevInfo, &spDevData)) {
ShowErrorMsg(_hDlg, GetLastError(), "SetupDiCallClassInstaller");
SetupDiDestroyDeviceInfoList(hDevInfo);
LocalFree(pHID);
return ;
};
bRebootRequired = ;
if (!UpdateDriverForPlugAndPlayDevices(0L, _szHardware[wLoop],
.
.
.
使用SetupDI* API列举系统中的设备的更多相关文章
- Linux系统中存储设备的两种表示方法
转:https://blog.csdn.net/holybin/article/details/38637381 一.对于IDE接口的硬盘的两种表示方法: 1.IDE接口硬盘,对于整块硬盘的两种表示方 ...
- Web系统中Mic设备的应用实例
>>>>>>>>>>>>>>>>>>>>>>>>> ...
- 重新指派usb转串口模块在linux系统中的设备调用名称
How to remap /dev/ttyUSB* to a specific name to be called by my program. How to map /dev/ttyUSB* to ...
- 【转载】取得系统中网卡MAC地址的三种方法
From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- Fedora 手动删除系统中不再需要的包
最新文章:Virson‘s Blog 1.安装yum-utils yum install yum-utils 2.使用package-cleanup --leaves列举系统中不再需要的包 packa ...
- Windows下USB磁盘开发系列二:枚举系统中所有USB设备
上篇 <Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>介绍了很简单的获取系统U盘盘符的办法,现在介绍下如何枚举系统中所有USB设备(不光是U盘). 主要调用的API如下: 1 ...
- Windows下USB磁盘开发系列三:枚举系统中U盘、并获取其设备信息
前面我们介绍了枚举系统中的U盘盘符(见<Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>).以及获取USB设备的信息(见<Windows下USB磁盘开发系列二:枚举系统中 ...
随机推荐
- Q&As:1.cocos2d-html5如何获得鼠标划过事件
不喜欢按部就班学东西,感觉各种框架各种技术就应该是拿到手用的,这应该是导致我现在学了这么多却没一样精通的缘故吧. 发现自己喜欢在QQ群回答一些菜鸟的问题,就算自己不清楚也会乐意看代码帮助解决╮(╯_╰ ...
- Tp框架之命名空间
命名空间,相当于虚拟目录 实现自动加载类的机制 初始命名空间:Library文件夹 初始命名空间下面有很多根命名空间: 1.Library里面的文件夹 2.APP的模块文件夹 在tp框架中,只有这两个 ...
- MindMaster安装教程以及激活破解教程
原文地址:https://www.jianshu.com/p/16d2fc7d8e45 第一.激活必须首先断网 第二.运行安装程序,安装完成后先不要打开 第三.把Cracks文件夹下的文件复制到软件安 ...
- 基于日志报警插件 elastalert 实现告警
1.官方http://elastalert.readthedocs.io/en/latest/ 2.报警规则示例 http://elastalert.readthedocs.io/en/latest/ ...
- python错误记录
在主函数里调用其他函数时形参顺序要一致 错例如下:
- 后端编程语言PHP
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.PHP 简介 PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言. PHP 脚本在服务器上执行. 什么是 PHP?(超文本预处理器 ...
- 20172330 2017-2018-1 《Java程序设计》第十周学习总结
20172330 2017-2018-1 <程序设计与数据结构>第十周学习总结 教材学习内容总结 本周的学习内容为集合 集合 对象具有定义良好的接口,从而成为一种实现集合的完善体制. 动态 ...
- 2018软工实践—Alpha冲刺(8)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 多次测试软件运行 学习OPENMP ...
- JSON:JavaScript 对象表示法
JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...
- div跟随鼠标移动
1.目标是实现div跟随鼠标而移动,分三种情况进行实现 a)首先获取div,进行绑定鼠标移动事件,给div开启定位功能 第一种实现方式,假如body的大小跟页面大小一样,则可以用这个方法. 1)获取鼠 ...