1、首先使用 SetupDiGetClassDevs 函數獲得 設備信息集句柄。
HDEVINFO SetupDiGetClassDevs(
_In_opt_ const GUID *ClassGuid,
_In_opt_ PCTSTR Enumerator,
_In_opt_ HWND hwndParent,
_In_ DWORD Flags
);
參照 MSDN 對該函數的解釋。
ClassGuid: 是某個設備的 GUID,該參數可以爲 NULL,而且如果 Flags 參數設置了DIGCF_ALLCLASSES 標誌,表示返回所有已安裝的設備。
Enumerator:一個標識符(ID)的即插即用(PnP)枚舉器。這個ID可以是值的全局唯一標識符(GUID)或符號名稱。例如,“PCI”可以用於指定PCI PnP型值。其他符號名稱PnP型值的例子包括“USB、”“PCMCIA,”和“SCSI”。這個參數是可選的,可以爲空。如果一個枚舉值不是用於選擇設備,枚舉器設置爲NULL。(因爲我們是獲取 usb 設備所以該參數爲 “USB”)
hwndParent:頂級窗口句柄用於用戶界面與安裝設備實例相關聯的設備信息集。該句柄是可選的,可以爲空。
Flages:
// 獲取 所有當前存在 usb 設備的信息集句柄。
HDEVINFO devinfo = SetupDiGetClassDevs(NULL, "USB", NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
2、從0 開始獲取每個設備的信息
SP_DEVINFO_DATA dev_info;
dev_info.cbSize = sizeof(SP_DEVINFO_DATA);
for(int index = 0; ; ++index)
{
if( !SetupDiEnumDevicesInfo(devinfo, index, &dev_info)
break;
// 獲取設備的實例句柄
char devid[MAX_DEVICE_ID_LEN];
SetupDiGetInstanceId(devinfo, &dev_info, devid, MAX_DEVICE_ID_LEN, NULL);
// 獲取設備的服務名
char servicename[256];
SetupDiGetDeviceRegistryProperty(devinfo, &dev_info, SPDRP_SERVICE, NULL, (PBYTE)service_name, sizeof(service_name), NULL);
// 獲取設備的兼容ID
char compatible_id[1024];
SetupDiGetDeviceRegistryProperty(devinfo, &dev_info, SPDRP_COMPATIBLEIDS, NULL, (PBYTE)compatiable_id, sizeof(compatiable_id), NULL)
}
3、銷燬設備信息集句柄。
SetupDiDestoryInfoList(devinfo);