现在介绍下如何枚举系统中所有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属性的方法。
调用上面函数的输出结果如下: