目录
2.3 SetupDiGetDeviceRegistryProperty
2.4 SetupDiGetDeviceRegistryProperty
1 简介
Windows开发过程中,有时候需要进行设备信息的管理,那么SetupDi系列函数能够满足你的要求。
1.1 设备接口类
任何一种驱动都要为用户,或者其他使用者提供某种类型的名字。而使用者也通过这种名字来区别不同的设备,并与之进行IO。
在Windows NT 4.0和以前的版本中,驱动程序会为设备对象创建名字,并为之创建设备连接符,并将之注册到系统中。
自Windows 2000开始,驱动程序不再为设备对象命名,而是使用设备接口类。设备接口类可以向使用者提供设备和驱动程序函数的入口,驱动将注册设备接口类,并为设备对象创建设备接口类实例。
每个设备接口类都有一个GUID。系统在device-specific header files中定义了常用设备类与其GUID。但设备开发者可以自定义设备类。
例如,三种不同类型的鼠标可以属于同一个设备接口类,即使他们分别使用了USB口,串口,红外端口。他们的驱动都把他注册为GUID_DEVINTERFACE_MOUSE设备接口类,这个设备接口类的GUID在Ntddmou.h中定义。
特别指出,这些驱动只注册了一个设备类。然而,各种设备的驱动可以有专门的函数以注册除标准接口类以外的接口类,如可安装磁盘驱动必须注册(GUID_DEVINTERFACE_DISK) 接口类以及(MOUNTDEV_MOUNTED_DEVICE_GUID)可安装设备类。
当驱动注册了设备接口的实例后,IO管理器就将设备和设备接口的GUID,符号链接名联系在一起。符号链接名存储在注册表中,在系统启动时即存在。使用某用户可以查询这个接口以获得支持这个接口的设备的符号链接名。使用者可以用这个符号连接名来对设备进行IO.
1.2 枚举设备信息原理
-
注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e97d-e325-11ce-bfc1-08002be10318}获取设备安装类的枚举信息。
-
通过实例获取到实例id。
-
获取HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum下面设备相关信息。
-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class:是设备安装类GUID,代表当前设备类型。
-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses:设备接口类GUID
-
通过注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses获取设备接口的枚举信息。
2 SetupDi系列函数介绍
2.1 SetupDiGetClassDevs
/*
功 能: 获取一个指定类别或全部类别的所有已安装设备的信息。
参 数: ClassGuid - 一个特定类别GUID(需要查询注册表)的指针,
Enumerator - 过滤枚举的内容
hwndParent - 用于关联到集合成员中的用户接口的顶层窗口句柄
Flags - 建立设备信息表的控制选项
返 回:如成功,返回包含所有与指定参数匹配的已经安装设备信息句柄
如失败,则返回INVALID_HANDLE_VALUE
*/
HDEVINFO SetupDiGetClassDevs(
_In_opt_ const GUID *ClassGuid,
_In_opt_ PCTSTR Enumerator,
_In_opt_ HWND hwndParent,
_In_ DWORD Flags
);
2.2 SetupDiEnumDeviceInfo
/*
功 能: 枚举指定设备信息集合的成员,并将数据放在PSP_DEVINFO_DATA中
参 数: DeviceInfoSet - 提供一个设备信息集合的句柄
MemberIndex - 指定一个要取得的设备信息成员序号,从0开始
DeviceInfoData - 指向SP_DEVINFO_DATA结构的指针,关于指定成员的返回信息就放在该结构中
返 回:如果要枚举全部设备信息成员,装载者首先应该将MemberIndex设为0调用SetupDiEnumDeviceInfo,
然后递增MemberIndex(使用一个for循环),调用SetupDiEnumDeviceInfo,
直至所有成员全部遍历(此时函数返回False,并且GetLastError返回ERROR_NO_MORE_ITEMS)。
*/
BOOL SetupDiEnumDeviceInfo(
_In_ HDEVINFO DeviceInfoSet,
_In_ DWORD MemberIndex,
_Out_ PSP_DEVINFO_DATA DeviceInfoData
);
2.3 SetupDiGetDeviceRegistryProperty
/*
功 能:用来检索指定的即插即用设备特性(这个函数主要是使用System\CurrentControlSet\Enum注册表来查询相关硬件信息)
参 数: DeviceInfoSet - 设备信息句柄
DeviceInfoData - SP_DEVINFO_DATA结构体,包含DeviceInfoSet中的设备信息
Property - 待查询的属性
PropertyRegDataType -
PropertyBuffer -
PropertyBufferSize -
RequiredSize -
返 回:成功返回非零,否则返回零
*/
BOOL SetupDiGetDeviceRegistryProperty(
_In_ HDEVINFO DeviceInfoSet,
_In_ PSP_DEVINFO_DATA DeviceInfoData,
_In_ DWORD Property,
_Out_opt_ PDWORD PropertyRegDataType,
_Out_opt_ PBYTE PropertyBuffer,
_In_ DWORD PropertyBufferSize,
_Out_opt_ PDWORD RequiredSize
);
2.4 SetupDiGetDeviceRegistryProperty
/*
功 能: 要释放的设备信息句柄
参 数: DeviceInfoSet - 设备信息句柄
返 回:成功返回非零,否则返回零
*/
BOOL SetupDiDestroyDeviceInfoList( HDEVINFO DeviceInfoSet);
3 演示Demo
3.1 开发环境
-
Visual Studio 2015
-
Windows 10 Pro x64
3.2 功能介绍
演示程序主界面如下图所示,包括过滤设备、枚举设备等功能。
支持HID、虚拟串口、CDROM等多种USB设备。
3.3 下载地址
开发环境:
-
Windows 10 pro x64
-
Visual Studio 2015
下载地址: Windows下枚举USB设备信息Demo