summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Dickens <christopher.a.dickens@gmail.com>2015-07-28 22:51:09 -0700
committerChris Dickens <christopher.a.dickens@gmail.com>2015-07-28 23:10:24 -0700
commit649a500750654ec89c9488d20b4ea3cf649068f9 (patch)
tree10db6e2b1802825e546ef7e81a67c4d910098d53
parentb31e7f871287a0927f0391a4d7c4334570b2c5f1 (diff)
downloadlibusb-649a500750654ec89c9488d20b4ea3cf649068f9.tar.gz
Windows: Close HID handles when closing composite devices
* Closes #81 Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
-rw-r--r--libusb/os/windows_usb.c25
-rw-r--r--libusb/version_nano.h2
2 files changed, 17 insertions, 10 deletions
diff --git a/libusb/os/windows_usb.c b/libusb/os/windows_usb.c
index 734c47e..f505139 100644
--- a/libusb/os/windows_usb.c
+++ b/libusb/os/windows_usb.c
@@ -4425,24 +4425,31 @@ static void composite_close(int sub_api, struct libusb_device_handle *dev_handle
{
struct windows_device_priv *priv = _device_priv(dev_handle->dev);
uint8_t i;
- bool available[SUB_API_MAX];
-
- for (i = 0; i<SUB_API_MAX; i++) {
- available[i] = false;
- }
+ // SUB_API_MAX+1 as the SUB_API_MAX pos is used to indicate availability of HID
+ bool available[SUB_API_MAX+1] = {0};
for (i=0; i<USB_MAXINTERFACES; i++) {
- if ( (priv->usb_interface[i].apib->id == USB_API_WINUSBX)
- && (priv->usb_interface[i].sub_api != SUB_API_NOTSET) ) {
- available[priv->usb_interface[i].sub_api] = true;
+ switch (priv->usb_interface[i].apib->id) {
+ case USB_API_WINUSBX:
+ if (priv->usb_interface[i].sub_api != SUB_API_NOTSET)
+ available[priv->usb_interface[i].sub_api] = true;
+ break;
+ case USB_API_HID:
+ available[SUB_API_MAX] = true;
+ break;
+ default:
+ break;
}
}
- for (i=0; i<SUB_API_MAX; i++) {
+ for (i=0; i<SUB_API_MAX; i++) { // WinUSB-like drivers
if (available[i]) {
usb_api_backend[USB_API_WINUSBX].close(i, dev_handle);
}
}
+ if (available[SUB_API_MAX]) { // HID driver
+ hid_close(SUB_API_NOTSET, dev_handle);
+ }
}
static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index 1135a18..248dd43 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 10987
+#define LIBUSB_NANO 10988