zoukankan      html  css  js  c++  java
  • 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属性的方法。

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

  • 相关阅读:
    day02_05.除数与被除数
    day02_04.算算多少人
    day02_03.五个数字一行输出
    day02_02.能被3整除的个位数为6的数
    day02_01.能被3整除的数
    day05_10 作业
    day05_09 列表内置方法
    day05_08 列表讲解、切片、内置方法
    day05_07 标志位讲解
    day05_06 continue语句、while循环
  • 原文地址:https://www.cnblogs.com/james1207/p/3424277.html
Copyright © 2011-2022 走看看