diff options
| author | Bdale Garbee <bdale@gag.com> | 2015-02-07 22:39:54 -0700 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2015-02-07 22:39:54 -0700 | 
| commit | f766a457323268857b3f2dfc7f42427437b71cb7 (patch) | |
| tree | 8afc8a661d682fc34b16fc0b1b44f2844d34f336 /libaltos | |
| parent | db51224af01731e7323f6f696a7397d64eb80b92 (diff) | |
| parent | e2cefd8593d269ce603aaf33f4a53a5c2dcb3350 (diff) | |
Merge branch 'branch-1.6' into debian
Conflicts:
	ChangeLog
	altoslib/AltosTelemetryReader.java
	configure.ac
Diffstat (limited to 'libaltos')
| -rw-r--r-- | libaltos/libaltos.c | 35 | 
1 files changed, 28 insertions, 7 deletions
diff --git a/libaltos/libaltos.c b/libaltos/libaltos.c index 4e3bc2c5..97b7b3f9 100644 --- a/libaltos/libaltos.c +++ b/libaltos/libaltos.c @@ -1121,6 +1121,8 @@ altos_list_next(struct altos_list *list, struct altos_device *device)  	HRESULT 	result;  	DWORD		friendlyname_type;  	DWORD		friendlyname_len; +	char		instanceid[1024]; +	DWORD		instanceid_len;  	dev_info_data.cbSize = sizeof (SP_DEVINFO_DATA);  	while(SetupDiEnumDeviceInfo(list->dev_info, list->index, @@ -1141,6 +1143,7 @@ altos_list_next(struct altos_list *list, struct altos_device *device)  			pid = 0x6015;  			serial = 0;  		} else { +			vid = pid = serial = 0;  			/* Fetch symbolic name for this device and parse out  			 * the vid/pid/serial info */  			symbolic_len = sizeof(symbolic); @@ -1148,16 +1151,34 @@ altos_list_next(struct altos_list *list, struct altos_device *device)  						 symbolic, &symbolic_len);  			if (result != 0) {  				altos_set_last_windows_error(); +			} else { +				sscanf((char *) symbolic + sizeof("\\??\\USB#VID_") - 1, +				       "%04X", &vid); +				sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_") - 1, +				       "%04X", &pid); +				sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_XXXX#") - 1, +				       "%d", &serial); +			} +			if (vid == 0 || pid == 0 || serial == 0) { +				if (SetupDiGetDeviceInstanceId(list->dev_info, +							       &dev_info_data, +							       instanceid, +							       sizeof (instanceid), +							       &instanceid_len)) { +					sscanf((char *) instanceid + sizeof("USB\\VID_") - 1, +					       "%04X", &vid); +					sscanf((char *) instanceid + sizeof("USB\\VID_XXXX&PID_") - 1, +					       "%04X", &pid); +					sscanf((char *) instanceid + sizeof("USB\\VID_XXXX&PID_XXXX\\") - 1, +					       "%d", &serial); +				} else { +					altos_set_last_windows_error(); +				} +			} +			if (vid == 0 || pid == 0 || serial == 0) {  				RegCloseKey(dev_key);  				continue;  			} -			vid = pid = serial = 0; -			sscanf((char *) symbolic + sizeof("\\??\\USB#VID_") - 1, -			       "%04X", &vid); -			sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_") - 1, -			       "%04X", &pid); -			sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_XXXX#") - 1, -			       "%d", &serial);  		}  		/* Fetch the com port name */  | 
