X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=libaltos%2Flibaltos.c;h=97b7b3f9bba44037206e409362824131c833bec9;hp=4e3bc2c51b2d5b1f7fcd2eb9c8d090118657a13a;hb=7a7d60d72e2e742fbc364489721f356806966c03;hpb=98db372758470cdaf7b517d670a7ce9186c787bc 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 */