要先取 总线控制器 , 然后获取端口信息
BOOL NUsb::GetHostCtrlList(std::vector<NUsb::_HostCtrl> &vHostList)
{
DWORD i;
BOOL bRetVal;
int nError;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DiInfoDat;
CHAR szProp[1024];
DWORD dwPropSize;
DWORD dwType;
NUsb::_HostCtrl OneCtrl; SP_DEVICE_INTERFACE_DATA IntfaceDat;
SP_DEVICE_INTERFACE_DETAIL_DATA_A * pDetail;
nError = ERROR_SUCCESS;
//获取对象集合
hDevInfo = SetupDiGetClassDevs(&GUID_CLASS_USB_HOST_CONTROLLER, NULL, NULL,  DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(hDevInfo == INVALID_HANDLE_VALUE)
return FALSE; //枚举接口
memset(&DiInfoDat, 0, sizeof(DiInfoDat));
DiInfoDat.cbSize = sizeof(DiInfoDat); IntfaceDat.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); for(i=0;
SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, i, &IntfaceDat);
i++)
{
OneCtrl.nIndex = i; SetupDiEnumDeviceInfo(hDevInfo, i, &DiInfoDat); szProp[0] = 0;
dwPropSize = sizeof(szProp);
bRetVal = SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DiInfoDat, SPDRP_DEVICEDESC,
&dwType, (BYTE *)szProp, dwPropSize, &dwPropSize);
strcpy(OneCtrl.szDescrip, szProp); szProp[0] = 0;
dwPropSize = sizeof(szProp);
bRetVal = SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DiInfoDat,  SPDRP_HARDWAREID,
&dwType, (BYTE *)szProp, dwPropSize, &dwPropSize);
strcpy(OneCtrl.szHardId, szProp); szProp[0] = 0;
pDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*)szProp;
pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);
bRetVal = SetupDiGetDeviceInterfaceDetailA(hDevInfo, &IntfaceDat, pDetail, sizeof(szProp), NULL, NULL);
strcpy(OneCtrl.szDevicePath, pDetail->DevicePath); GetHostCtrlInfo(OneCtrl);
vHostList.push_back(OneCtrl);
} if(hDevInfo != INVALID_HANDLE_VALUE)
SetupDiDestroyDeviceInfoList(hDevInfo); return TRUE;
}BOOL NUsb::EnumUsbDevice(USBENUMPROC fnProc, VOID *pParam)
{
std::vector<_HostCtrl> vHostList;
std::vector<_HostCtrl>::iterator HostIter;
std::vector<_PortInfo> vPortList;
std::vector<_PortInfo>::iterator PortIter;
_HostCtrl *pHostCtrl;
_HubInfo HubInfo;
_PortInfo *pProtItem;
BOOL bRetVal;
BOOL bContinue; bRetVal = GetHostCtrlList(vHostList);
if(bRetVal == FALSE)
return FALSE; for(HostIter = vHostList.begin();
HostIter != vHostList.end();
HostIter ++)
{
pHostCtrl = &*HostIter; vPortList.clear();
GetHostCtrlHubInfo(pHostCtrl->szHubPath, HubInfo);
GetHubPortListInfo(pHostCtrl->szHubPath, vPortList); for(PortIter = vPortList.begin();
PortIter != vPortList.end();
PortIter ++)
{
pProtItem = &*PortIter;
bContinue = fnProc(pProtItem, pParam);
if(bContinue == FALSE)
return TRUE;
}
} return TRUE;
}