summaryrefslogtreecommitdiff
path: root/libaltos/libaltos.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2015-02-06 01:29:56 -0800
committerKeith Packard <keithp@keithp.com>2015-02-06 01:34:00 -0800
commit7a7d60d72e2e742fbc364489721f356806966c03 (patch)
tree503e68c5b3035288d7e18be9af6a52cb29d7cf15 /libaltos/libaltos.c
parent98db372758470cdaf7b517d670a7ce9186c787bc (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>
Diffstat (limited to 'libaltos/libaltos.c')
-rw-r--r--libaltos/libaltos.c35
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 */