diff options
| author | Keith Packard <keithp@keithp.com> | 2015-02-06 01:29:56 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2015-02-06 01:34:00 -0800 | 
| commit | 7a7d60d72e2e742fbc364489721f356806966c03 (patch) | |
| tree | 503e68c5b3035288d7e18be9af6a52cb29d7cf15 | |
| parent | 98db372758470cdaf7b517d670a7ce9186c787bc (diff) | |
libaltos: Use more SetupDi API to get Windows 7 listing devices
My Windows 7 box doesn't include 'SymbolicName' in the registry, but
SetupDiGetDeviceInstanceId *does* return something that includes
vid/pid/serial, so use that in preference.
Signed-off-by: Keith Packard <keithp@keithp.com>
| -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 */  | 
