From: Keith Packard Date: Fri, 6 Feb 2015 09:29:56 +0000 (-0800) Subject: libaltos: Use more SetupDi API to get Windows 7 listing devices X-Git-Tag: 1.6~31 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=7a7d60d72e2e742fbc364489721f356806966c03 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 --- 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 */