上篇 《Windows下USB磁盤開發系列一:枚舉系統中U盤的盤符》介紹了很簡單的獲取系統U盤盤符的辦法,如今介紹下如何枚舉系統中全部USB設備(不光是U盤)。函數
主要調用的API以下:ui
1,調用SetupDiGetClassDevs()獲取指定設備類型的句柄;spa
2,調用SetupDiEnumDeviceInfo()枚舉設備信息;.net
3,調用SetupDiGetDeviceRegistryProperty()獲取設備信息。code
具體實現函數以下:orm
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屬性的方法。blog
調用上面函數的輸出結果以下:ip