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属性的方法。

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

  • 相关阅读:
    Android SDK 在线更新镜像服务器
    Android Studio (Gradle)编译错误
    java ZIP压缩文件
    java文件操作(输出目录、查看磁盘符)
    JXL读取写入excel表格数据
    Linux命令zip和unzip
    Linux查看系统基本信息
    Ubuntu C++环境支持
    Linux开机执行bash脚本
    ubuntu中磁盘挂载与卸载
  • 原文地址:https://www.cnblogs.com/james1207/p/3424277.html
Copyright © 2011-2022 走看看