winusb: Check for ClassGuid changes on re-enumeration Previously only the dev_id (VID/PID/serial) was checked, but if the bcdDevice has changed, Windows will have re-enumerated the device and possibly attributed another ClassGuid to it. Fixes issue #897. Closes #900 Thanks to Craig Hutchinson for reporting, suggestion and testing. Signed-off-by: Tormod Volden <debian.tormod@gmail.com> Signed-off-by: Nathan Hjelm <hjelmn@google.com>
diff --git a/libusb/os/windows_common.h b/libusb/os/windows_common.h index 2de2b60..792a31e 100644 --- a/libusb/os/windows_common.h +++ b/libusb/os/windows_common.h
@@ -259,6 +259,7 @@ } usb_interface[USB_MAXINTERFACES]; struct hid_device_priv *hid; PUSB_CONFIGURATION_DESCRIPTOR *config_descriptor; // list of pointers to the cached config descriptors + GUID class_guid; // checked for change during re-enumeration }; struct usbdk_device_handle_priv {
diff --git a/libusb/os/windows_winusb.c b/libusb/os/windows_winusb.c index e1e599c..cdca6cb 100644 --- a/libusb/os/windows_winusb.c +++ b/libusb/os/windows_winusb.c
@@ -1721,6 +1721,7 @@ priv = winusb_device_priv_init(dev); priv->dev_id = _strdup(dev_id); + priv->class_guid = dev_info_data.ClassGuid; if (priv->dev_id == NULL) { libusb_unref_device(dev); LOOP_BREAK(LIBUSB_ERROR_NO_MEM); @@ -1735,6 +1736,12 @@ libusb_unref_device(dev); goto alloc_device; } + if (!IsEqualGUID(&priv->class_guid, &dev_info_data.ClassGuid)) { + usbi_dbg("device class GUID for session [%lX] changed", session_id); + usbi_disconnect_device(dev); + libusb_unref_device(dev); + goto alloc_device; + } } track_unref:
diff --git a/libusb/version_nano.h b/libusb/version_nano.h index 3924959..e0c04dc 100644 --- a/libusb/version_nano.h +++ b/libusb/version_nano.h
@@ -1 +1 @@ -#define LIBUSB_NANO 11625 +#define LIBUSB_NANO 11626