bool QUsbHidEnumerator::matchAndDispatchChangedDevice(const QString & deviceID, const GUID & guid, WPARAM wParam) { bool rv = false; DWORD dwFlag = (DBT_DEVICEARRIVAL == wParam) ? DIGCF_PRESENT : DIGCF_ALLCLASSES; dwFlag |= DIGCF_INTERFACEDEVICE; HDEVINFO devInfo; QString s; if(m_vid && m_pid){ s = QString("VID_%1&PID_%2").arg((ulong)m_vid,4,16,QChar('0')).arg((ulong)m_pid,4,16,QChar('0')); }else if(m_vid){ s = QString("VID_%1").arg((ulong)m_vid,4,16,QChar('0')); }else if(m_pid){ s = QString("PID_%1").arg((ulong)m_pid,4,16,QChar('0')); } QRegExp idRx(s.toUpper()); if( (devInfo = SetupDiGetClassDevs(&guid,NULL,NULL,dwFlag)) != INVALID_HANDLE_VALUE ) { SP_INTERFACE_DEVICE_DATA ifData; ifData.cbSize=sizeof(ifData); for(int i=0; SetupDiEnumDeviceInterfaces(devInfo, NULL, &guid, i, &ifData); i++) { DWORD needed; SetupDiGetDeviceInterfaceDetail(devInfo, &ifData, NULL, 0, &needed, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA detail=(PSP_INTERFACE_DEVICE_DETAIL_DATA)new BYTE[needed]; detail->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); SP_DEVINFO_DATA did={sizeof(SP_DEVINFO_DATA)}; if (SetupDiGetDeviceInterfaceDetail(devInfo, &ifData, detail, needed, NULL, &did)){ QString path = TCHARToQString(detail->DevicePath); if(deviceID.toUpper().contains(path.toUpper())){ rv = true; QUsbHidInfo info; info.path = path; bool ready = false; if(m_vid || m_pid){ ready = (info.path.toUpper().contains(idRx)); }else{ ready = true; } if(ready){ info.productID = info.vendorID = info.version = 0; getDeviceDetailsWin( &info, devInfo, &did, wParam ); if( wParam == DBT_DEVICEARRIVAL ) emit deviceDiscovered(info); else if( wParam == DBT_DEVICEREMOVECOMPLETE ) emit deviceRemoved(info); } break; } } delete [] detail; } SetupDiDestroyDeviceInfoList(devInfo); } return rv; }
void QUsbHidEnumerator::enumerateDevicesWin( const GUID & guid, QList<QUsbHidInfo>* infoList , unsigned short vid, unsigned short pid) { HDEVINFO devInfo; QString s; if(vid && pid){ s = QString("VID_%1&PID_%2").arg((ulong)vid,4,16,QChar('0')).arg((ulong)pid,4,16,QChar('0')); }else if(vid){ s = QString("VID_%1").arg((ulong)vid,4,16,QChar('0')); }else if(pid){ s = QString("PID_%1").arg((ulong)vid,4,16,QChar('0')); } QRegExp idRx(s.toUpper()); if( (devInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE)) != INVALID_HANDLE_VALUE) { SP_INTERFACE_DEVICE_DATA ifData; ifData.cbSize=sizeof(ifData); for (int devIndex=0;SetupDiEnumDeviceInterfaces(devInfo, NULL, &guid, devIndex, &ifData);++devIndex){ DWORD needed; SetupDiGetDeviceInterfaceDetail(devInfo, &ifData, NULL, 0, &needed, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA detail=(PSP_INTERFACE_DEVICE_DETAIL_DATA)new BYTE[needed]; detail->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); SP_DEVINFO_DATA did={sizeof(SP_DEVINFO_DATA)}; if (SetupDiGetDeviceInterfaceDetail(devInfo, &ifData, detail, needed, NULL, &did)){ QUsbHidInfo info; info.path = TCHARToQString(detail->DevicePath); bool ready = false; if(vid || pid){ ready = (info.path.toUpper().contains(idRx)); }else{ ready = true; } if(ready){ info.vendorID = info.productID = info.version; getDeviceDetailsWin( &info, devInfo, &did ); infoList->append(info); } } delete [] detail; } // SP_DEVINFO_DATA devInfoData; // devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); // for(int i = 0; SetupDiEnumDeviceInfo(devInfo, i, &devInfoData); i++) // { // QUsbHidInfo info; // info.productID = info.vendorID = 0; // getDeviceDetailsWin( &info, devInfo, &devInfoData ); // infoList->append(info); // } SetupDiDestroyDeviceInfoList(devInfo); } }
bool pjrc_rawhid::getDeviceDetailsWin( USBPortInfo* portInfo, HDEVINFO devInfo, PSP_DEVINFO_DATA devData, WPARAM wParam ) { portInfo->friendName = getDeviceProperty(devInfo, devData, SPDRP_FRIENDLYNAME); if( wParam == DBT_DEVICEARRIVAL) portInfo->physName = getDeviceProperty(devInfo, devData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME); portInfo->enumName = getDeviceProperty(devInfo, devData, SPDRP_ENUMERATOR_NAME); QString hardwareIDs = getDeviceProperty(devInfo, devData, SPDRP_HARDWAREID); QRegExp idRx("VID_(\\w+)&PID_(\\w+)"); if( hardwareIDs.toUpper().contains(idRx) ) { bool dummy; portInfo->vendorID = idRx.cap(1).toInt(&dummy, 16); portInfo->productID = idRx.cap(2).toInt(&dummy, 16); } return true; }
bool QextSerialEnumerator::getDeviceDetailsWin( QextPortInfo* portInfo, HDEVINFO devInfo, PSP_DEVINFO_DATA devData, WPARAM wParam ) { portInfo->friendName = getDeviceProperty(devInfo, devData, SPDRP_FRIENDLYNAME); if( wParam == DBT_DEVICEARRIVAL) portInfo->physName = getDeviceProperty(devInfo, devData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME); portInfo->enumName = getDeviceProperty(devInfo, devData, SPDRP_ENUMERATOR_NAME); QString hardwareIDs = getDeviceProperty(devInfo, devData, SPDRP_HARDWAREID); HKEY devKey = SetupDiOpenDevRegKey(devInfo, devData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); portInfo->portName = QextSerialPort::fullPortNameWin( getRegKeyValue(devKey, TEXT("PortName")) ); QRegExp idRx("VID_(\\w+)&PID_(\\w+)&"); if( hardwareIDs.toUpper().contains(idRx) ) { bool dummy; portInfo->vendorID = idRx.cap(1).toInt(&dummy, 16); portInfo->productID = idRx.cap(2).toInt(&dummy, 16); //qDebug() << "got vid:" << vid << "pid:" << pid; } return true; }