Windows下USB磁盘开发系列二:枚举系统中所有USB设备

上篇 《Windows下USB磁盘开发系列一:枚举系统中U盘的盘符》介绍了很简单的获取系统U盘盘符的办法,现在介绍下如何枚举系统中所有USB设备(不光是U盘)。

主要调用的API如下:

1,调用SetupDiGetClassDevs()获取指定设备类型的句柄;

2,调用SetupDiEnumDeviceInfo()枚举设备信息;

3,调用SetupDiGetDeviceRegistryProperty()获取设备信息。

 

具体实现函数如下:

int enum_usb_device_info()
{		
	int i = 0;
	int res = 0;
	HDEVINFO hDevInfo;  
	SP_DEVINFO_DATA DeviceInfoData = {sizeof(DeviceInfoData)};   
 
	// get device class information handle
	hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_USB,0, 0, DIGCF_PRESENT);       
	if (hDevInfo == INVALID_HANDLE_VALUE)     
	{         
		res = GetLastError();     
		return res;
	}  
 
	// enumerute device information
	DWORD required_size = 0;
	for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
	{		
		DWORD DataT;         
		char friendly_name[2046] = {0};         
		DWORD buffersize = 2046;        
		DWORD req_bufsize = 0;      
		
		// get device description information
		if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, &DataT, (LPBYTE)friendly_name, buffersize, &req_bufsize))
		{
			res = GetLastError();
			continue;
		}
		
		char temp[512] = {0};
		sprintf_s(temp, 512, "USB device %d: %s", i, friendly_name);
		puts(temp);
	}
 
	return 0;
}

 

注意:如果使用SetupDiGetDeviceRegistryProperty()试图获取SPDRP_FRIENDLYNAME属性时,有些设备回返回ERROR_INVALID_DATA(13)的错误,因为可能Friendly Name不存在,所以本例中采用获取SPDRP_DEVICEDESC属性的方法。

 

调用上面函数的输出结果如下:
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值