列舉 usb 設備的信息

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:

提供在設備信息結構中使用的控制選項。可以是以下數值:
DIGCF_PRESENT - 只返回當前存在的設備。
DIGCF_ALLCLASSES - 返回所有已安裝的設備。如果這個標誌設置了,ClassGuid參數將被忽略。
DIGCF_PROFILE - 只返回當前硬件配置文件中的設備。
DIGCF_INTERFACEDEVICE - 返回所有支持的設備。
DIGCF_DEFAULT - 只返回與系統默認設備相關的設備。

// 獲取 所有當前存在 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);

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章