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; }
//static void QextSerialEnumerator::setupAPIScan(QList<QextPortInfo> & infoList) { HDEVINFO devInfo = INVALID_HANDLE_VALUE; DWORD dwGuids = 0; SetupDiClassGuidsFromName(TEXT("Ports"), NULL, 0, &dwGuids); if (dwGuids == 0) { qCritical("SetupDiClassGuidsFromName failed. Error code: %ld", GetLastError()); return; } GUID *pGuids = new GUID[dwGuids]; if (!SetupDiClassGuidsFromName(TEXT("Ports"), pGuids, dwGuids, &dwGuids)) { qCritical("SetupDiClassGuidsFromName second call failed. Error code: %ld", GetLastError()); return; } devInfo = SetupDiGetClassDevs(pGuids, NULL, NULL, DIGCF_PRESENT); if(devInfo == INVALID_HANDLE_VALUE) { qCritical("SetupDiGetClassDevs failed. Error code: %ld", GetLastError()); return; } //enumerate the devices bool ok = true; SP_DEVICE_INTERFACE_DATA ifcData; ifcData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); SP_DEVICE_INTERFACE_DETAIL_DATA * detData = NULL; SP_DEVINFO_DATA devData = {sizeof(SP_DEVINFO_DATA)}; for (DWORD i = 0; ok; i++) { ok = SetupDiEnumDeviceInfo(devInfo, i, &devData); if (ok) { // Got a device. Get the details. QextPortInfo info; info.friendName = getDeviceProperty(devInfo, & devData, SPDRP_FRIENDLYNAME); info.physName = getDeviceProperty(devInfo, & devData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME); info.enumName = getDeviceProperty(devInfo, & devData, SPDRP_ENUMERATOR_NAME); //anyway, to get the port name we must still open registry directly :( ??? //Eh... HKEY devKey = SetupDiOpenDevRegKey(devInfo, & devData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); info.portName = getRegKeyValue(devKey, TEXT("PortName")); RegCloseKey(devKey); if(info.portName.startsWith("COM")) { infoList.append(info); } } else { if (GetLastError() != ERROR_NO_MORE_ITEMS) { delete [] detData; qCritical("SetupDiEnumDeviceInfo failed. Error code: %ld", GetLastError()); return; } } } delete [] detData; delete[] pGuids; }
//static void QextSerialEnumerator::setupAPIScan(QList<QextPortInfo> & infoList) { HDEVINFO devInfo = INVALID_HANDLE_VALUE; GUID * guidDev = (GUID *) & GUID_CLASS_COMPORT; devInfo = SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if(devInfo == INVALID_HANDLE_VALUE) { qCritical("SetupDiGetClassDevs failed. Error code: %ld", GetLastError()); return; } //enumerate the devices bool ok = true; SP_DEVICE_INTERFACE_DATA ifcData; ifcData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); SP_DEVICE_INTERFACE_DETAIL_DATA * detData = NULL; DWORD detDataSize = 0; DWORD oldDetDataSize = 0; for (DWORD i = 0; ok; i++) { ok = SetupDiEnumDeviceInterfaces(devInfo, NULL, guidDev, i, &ifcData); if (ok) { SP_DEVINFO_DATA devData = {sizeof(SP_DEVINFO_DATA)}; //check for required detData size SetupDiGetDeviceInterfaceDetail(devInfo, & ifcData, NULL, 0, & detDataSize, & devData); //if larger than old detData size then reallocate the buffer if (detDataSize > oldDetDataSize) { delete [] detData; detData = (SP_DEVICE_INTERFACE_DETAIL_DATA *) new char[detDataSize]; detData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); oldDetDataSize = detDataSize; } //check the details if (SetupDiGetDeviceInterfaceDetail(devInfo, & ifcData, detData, detDataSize, NULL, & devData)) { // Got a device. Get the details. QextPortInfo info; info.friendName = getDeviceProperty(devInfo, & devData, SPDRP_FRIENDLYNAME); info.physName = getDeviceProperty(devInfo, & devData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME); info.enumName = getDeviceProperty(devInfo, & devData, SPDRP_ENUMERATOR_NAME); //anyway, to get the port name we must still open registry directly :( ??? //Eh... HKEY devKey = SetupDiOpenDevRegKey(devInfo, & devData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); info.portName = getRegKeyValue(devKey, TEXT("PortName")); RegCloseKey(devKey); infoList.append(info); } else { qCritical("SetupDiGetDeviceInterfaceDetail failed. Error code: %ld", GetLastError()); delete [] detData; return; } } else { if (GetLastError() != ERROR_NO_MORE_ITEMS) { delete [] detData; qCritical("SetupDiEnumDeviceInterfaces failed. Error code: %ld", GetLastError()); return; } } } delete [] detData; }