core: Change pointer type from 'unsigned char' to 'void'

This removes the need for pointer casts when calling backend functions.

Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
diff --git a/libusb/descriptor.c b/libusb/descriptor.c
index b65557f..c926544 100644
--- a/libusb/descriptor.c
+++ b/libusb/descriptor.c
@@ -489,8 +489,7 @@
 {
 	int r, host_endian = 0;
 
-	r = usbi_backend.get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor,
-						&host_endian);
+	r = usbi_backend.get_device_descriptor(dev, &dev->device_descriptor, &host_endian);
 	if (r < 0)
 		return r;
 
@@ -669,9 +668,10 @@
 	uint8_t bConfigurationValue, struct libusb_config_descriptor **config)
 {
 	int r, idx;
-	unsigned char *buf = NULL;
 
 	if (usbi_backend.get_config_descriptor_by_value) {
+		void *buf;
+
 		r = usbi_backend.get_config_descriptor_by_value(dev,
 			bConfigurationValue, &buf);
 		if (r < 0)
diff --git a/libusb/libusbi.h b/libusb/libusbi.h
index 9d1528f..88db762 100644
--- a/libusb/libusbi.h
+++ b/libusb/libusbi.h
@@ -872,8 +872,8 @@
 	 *
 	 * Return 0 on success or a LIBUSB_ERROR code on failure.
 	 */
-	int (*get_device_descriptor)(struct libusb_device *device,
-		unsigned char *buffer, int *host_endian);
+	int (*get_device_descriptor)(struct libusb_device *device, void *buffer,
+		int *host_endian);
 
 	/* Get the ACTIVE configuration descriptor for a device.
 	 *
@@ -895,7 +895,7 @@
 	 * - another LIBUSB_ERROR code on other failure
 	 */
 	int (*get_active_config_descriptor)(struct libusb_device *device,
-		unsigned char *buffer, size_t len);
+		void *buffer, size_t len);
 
 	/* Get a specific configuration descriptor for a device.
 	 *
@@ -918,7 +918,7 @@
 	 * Return the length read on success or a LIBUSB_ERROR code on failure.
 	 */
 	int (*get_config_descriptor)(struct libusb_device *device,
-		uint8_t config_index, unsigned char *buffer, size_t len);
+		uint8_t config_index, void *buffer, size_t len);
 
 	/* Like get_config_descriptor but then by bConfigurationValue instead
 	 * of by index.
@@ -933,7 +933,7 @@
 	 * or a LIBUSB_ERROR code on failure.
 	 */
 	int (*get_config_descriptor_by_value)(struct libusb_device *device,
-		uint8_t bConfigurationValue, unsigned char **buffer);
+		uint8_t bConfigurationValue, void **buffer);
 
 	/* Get the bConfigurationValue for the active configuration for a device.
 	 * Optional. This should only be implemented if you can retrieve it from
@@ -1067,12 +1067,11 @@
 	/* Allocate persistent DMA memory for the given device, suitable for
 	 * zerocopy. May return NULL on failure. Optional to implement.
 	 */
-	unsigned char *(*dev_mem_alloc)(struct libusb_device_handle *handle,
-		size_t len);
+	void *(*dev_mem_alloc)(struct libusb_device_handle *handle, size_t len);
 
 	/* Free memory allocated by dev_mem_alloc. */
-	int (*dev_mem_free)(struct libusb_device_handle *handle,
-		unsigned char *buffer, size_t len);
+	int (*dev_mem_free)(struct libusb_device_handle *handle, void *buffer,
+		size_t len);
 
 	/* Determine if a kernel driver is active on an interface. Optional.
 	 *
diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c
index bbac912..61722c0 100644
--- a/libusb/os/darwin_usb.c
+++ b/libusb/os/darwin_usb.c
@@ -75,7 +75,7 @@
 /* async event thread */
 static pthread_t libusb_darwin_at;
 
-static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len);
+static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, void *buffer, size_t len);
 static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface);
 static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface);
 static int darwin_reset_device(struct libusb_device_handle *dev_handle);
@@ -661,7 +661,7 @@
   pthread_mutex_unlock (&libusb_darwin_init_mutex);
 }
 
-static int darwin_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) {
+static int darwin_get_device_descriptor(struct libusb_device *dev, void *buffer, int *host_endian) {
   struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);
 
   /* return cached copy */
@@ -692,7 +692,7 @@
   return LIBUSB_ERROR_NOT_FOUND;
 }
 
-static int darwin_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len) {
+static int darwin_get_active_config_descriptor(struct libusb_device *dev, void *buffer, size_t len) {
   struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);
   int config_index;
 
@@ -707,7 +707,7 @@
   return darwin_get_config_descriptor (dev, (UInt8)config_index, buffer, len);
 }
 
-static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len) {
+static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, void *buffer, size_t len) {
   struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);
   IOUSBConfigurationDescriptorPtr desc;
   IOReturn kresult;
diff --git a/libusb/os/haiku_usb_raw.cpp b/libusb/os/haiku_usb_raw.cpp
index e0a8c9a..b4348e2 100644
--- a/libusb/os/haiku_usb_raw.cpp
+++ b/libusb/os/haiku_usb_raw.cpp
@@ -30,7 +30,7 @@
 int32 gInitCount = 0;
 
 static int haiku_get_config_descriptor(struct libusb_device *, uint8_t,
-    unsigned char *, size_t);
+    void *, size_t);
 
 static int
 haiku_init(struct libusb_context *ctx)
@@ -75,7 +75,7 @@
 }
 
 static int
-haiku_get_device_descriptor(struct libusb_device *device, unsigned char *buffer, int *host_endian)
+haiku_get_device_descriptor(struct libusb_device *device, void *buffer, int *host_endian)
 {
 	USBDevice *dev = *((USBDevice **)usbi_get_device_priv(device));
 	memcpy(buffer, dev->Descriptor(), LIBUSB_DT_DEVICE_SIZE);
@@ -83,14 +83,14 @@
 }
 
 static int
-haiku_get_active_config_descriptor(struct libusb_device *device, unsigned char *buffer, size_t len)
+haiku_get_active_config_descriptor(struct libusb_device *device, void *buffer, size_t len)
 {
 	USBDevice *dev = *((USBDevice **)usbi_get_device_priv(device));
 	return haiku_get_config_descriptor(device, dev->ActiveConfigurationIndex(), buffer, len);
 }
 
 static int
-haiku_get_config_descriptor(struct libusb_device *device, uint8_t config_index, unsigned char *buffer, size_t len)
+haiku_get_config_descriptor(struct libusb_device *device, uint8_t config_index, void *buffer, size_t len)
 {
 	USBDevice *dev = *((USBDevice **)usbi_get_device_priv(device));
 	const usb_configuration_descriptor *config = dev->ConfigurationDescriptor(config_index);
diff --git a/libusb/os/linux_usbfs.c b/libusb/os/linux_usbfs.c
index 435a38b..14963d2 100644
--- a/libusb/os/linux_usbfs.c
+++ b/libusb/os/linux_usbfs.c
@@ -517,7 +517,7 @@
 }
 
 static int op_get_device_descriptor(struct libusb_device *dev,
-	unsigned char *buffer, int *host_endian)
+	void *buffer, int *host_endian)
 {
 	struct linux_device_priv *priv = usbi_get_device_priv(dev);
 
@@ -694,7 +694,7 @@
 }
 
 static int op_get_config_descriptor_by_value(struct libusb_device *dev,
-	uint8_t value, unsigned char **buffer)
+	uint8_t value, void **buffer)
 {
 	struct linux_device_priv *priv = usbi_get_device_priv(dev);
 	unsigned char *descriptors = priv->descriptors;
@@ -724,11 +724,11 @@
 }
 
 static int op_get_active_config_descriptor(struct libusb_device *dev,
-	unsigned char *buffer, size_t len)
+	void *buffer, size_t len)
 {
 	struct linux_device_priv *priv = usbi_get_device_priv(dev);
 	int r, config;
-	unsigned char *config_desc;
+	void *config_desc;
 
 	if (priv->sysfs_dir) {
 		r = sysfs_get_active_config(dev, &config);
@@ -751,7 +751,7 @@
 }
 
 static int op_get_config_descriptor(struct libusb_device *dev,
-	uint8_t config_index, unsigned char *buffer, size_t len)
+	uint8_t config_index, void *buffer, size_t len)
 {
 	struct linux_device_priv *priv = usbi_get_device_priv(dev);
 	unsigned char *descriptors = priv->descriptors;
@@ -1570,11 +1570,10 @@
 				endpoints, num_endpoints);
 }
 
-static unsigned char *op_dev_mem_alloc(struct libusb_device_handle *handle,
-	size_t len)
+static void *op_dev_mem_alloc(struct libusb_device_handle *handle, size_t len)
 {
 	struct linux_device_handle_priv *hpriv = usbi_get_device_handle_priv(handle);
-	unsigned char *buffer;
+	void *buffer;
 
 	buffer = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, hpriv->fd, 0);
 	if (buffer == MAP_FAILED) {
@@ -1584,8 +1583,8 @@
 	return buffer;
 }
 
-static int op_dev_mem_free(struct libusb_device_handle *handle,
-	unsigned char *buffer, size_t len)
+static int op_dev_mem_free(struct libusb_device_handle *handle, void *buffer,
+	size_t len)
 {
 	if (munmap(buffer, len) != 0) {
 		usbi_err(HANDLE_CTX(handle), "free dev mem failed, errno=%d", errno);
diff --git a/libusb/os/netbsd_usb.c b/libusb/os/netbsd_usb.c
index dab7692..91f2472 100644
--- a/libusb/os/netbsd_usb.c
+++ b/libusb/os/netbsd_usb.c
@@ -36,7 +36,7 @@
 	char devnode[16];
 	int fd;
 
-	unsigned char *cdesc;			/* active config descriptor */
+	usb_config_descriptor_t *cdesc;		/* active config descriptor */
 	usb_device_descriptor_t ddesc;		/* usb device descriptor */
 };
 
@@ -52,12 +52,12 @@
 static int netbsd_open(struct libusb_device_handle *);
 static void netbsd_close(struct libusb_device_handle *);
 
-static int netbsd_get_device_descriptor(struct libusb_device *, unsigned char *,
+static int netbsd_get_device_descriptor(struct libusb_device *, void *,
     int *);
 static int netbsd_get_active_config_descriptor(struct libusb_device *,
-    unsigned char *, size_t);
+    void *, size_t);
 static int netbsd_get_config_descriptor(struct libusb_device *, uint8_t,
-    unsigned char *, size_t);
+    void *, size_t);
 
 static int netbsd_get_configuration(struct libusb_device_handle *, int *);
 static int netbsd_set_configuration(struct libusb_device_handle *, int);
@@ -162,7 +162,6 @@
 				goto error;
 			}
 
-			dpriv->cdesc = NULL;
 			if (_cache_active_config_descriptor(dev, fd)) {
 				err = errno;
 				goto error;
@@ -221,7 +220,7 @@
 }
 
 int
-netbsd_get_device_descriptor(struct libusb_device *dev, unsigned char *buf,
+netbsd_get_device_descriptor(struct libusb_device *dev, void *buf,
     int *host_endian)
 {
 	struct device_priv *dpriv = usbi_get_device_priv(dev);
@@ -235,13 +234,11 @@
 
 int
 netbsd_get_active_config_descriptor(struct libusb_device *dev,
-    unsigned char *buf, size_t len)
+    void *buf, size_t len)
 {
 	struct device_priv *dpriv = usbi_get_device_priv(dev);
-	usb_config_descriptor_t *ucd;
 
-	ucd = (usb_config_descriptor_t *) dpriv->cdesc;
-	len = MIN(len, UGETW(ucd->wTotalLength));
+	len = MIN(len, UGETW(dpriv->cdesc->wTotalLength));
 
 	usbi_dbg("len %d", len);
 
@@ -252,7 +249,7 @@
 
 int
 netbsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx,
-    unsigned char *buf, size_t len)
+    void *buf, size_t len)
 {
 	struct device_priv *dpriv = usbi_get_device_priv(dev);
 	struct usb_full_desc ufd;
@@ -477,7 +474,7 @@
 	struct device_priv *dpriv = usbi_get_device_priv(dev);
 	struct usb_config_desc ucd;
 	struct usb_full_desc ufd;
-	unsigned char* buf;
+	void *buf;
 	int len;
 
 	usbi_dbg("fd %d", fd);
@@ -490,7 +487,7 @@
 	usbi_dbg("active bLength %d", ucd.ucd_desc.bLength);
 
 	len = UGETW(ucd.ucd_desc.wTotalLength);
-	buf = malloc(len);
+	buf = malloc((size_t)len);
 	if (buf == NULL)
 		return (LIBUSB_ERROR_NO_MEM);
 
diff --git a/libusb/os/null_usb.c b/libusb/os/null_usb.c
index bb6d981..8952f3b 100644
--- a/libusb/os/null_usb.c
+++ b/libusb/os/null_usb.c
@@ -37,7 +37,7 @@
 }
 
 static int
-null_get_device_descriptor(struct libusb_device *dev, unsigned char *buf,
+null_get_device_descriptor(struct libusb_device *dev, void *buf,
     int *host_endian)
 {
 	return LIBUSB_ERROR_NOT_SUPPORTED;
@@ -45,14 +45,14 @@
 
 static int
 null_get_active_config_descriptor(struct libusb_device *dev,
-    unsigned char *buf, size_t len)
+    void *buf, size_t len)
 {
 	return LIBUSB_ERROR_NOT_SUPPORTED;
 }
 
 static int
 null_get_config_descriptor(struct libusb_device *dev, uint8_t idx,
-    unsigned char *buf, size_t len)
+    void *buf, size_t len)
 {
 	return LIBUSB_ERROR_NOT_SUPPORTED;
 }
diff --git a/libusb/os/openbsd_usb.c b/libusb/os/openbsd_usb.c
index e10d656..8f9c4e7 100644
--- a/libusb/os/openbsd_usb.c
+++ b/libusb/os/openbsd_usb.c
@@ -36,7 +36,7 @@
 	char *devname;				/* name of the ugen(4) node */
 	int fd;					/* device file descriptor */
 
-	unsigned char *cdesc;			/* active config descriptor */
+	usb_config_descriptor_t *cdesc;		/* active config descriptor */
 	usb_device_descriptor_t ddesc;		/* usb device descriptor */
 };
 
@@ -52,12 +52,12 @@
 static int obsd_open(struct libusb_device_handle *);
 static void obsd_close(struct libusb_device_handle *);
 
-static int obsd_get_device_descriptor(struct libusb_device *, unsigned char *,
+static int obsd_get_device_descriptor(struct libusb_device *, void *,
     int *);
 static int obsd_get_active_config_descriptor(struct libusb_device *,
-    unsigned char *, size_t);
+    void *, size_t);
 static int obsd_get_config_descriptor(struct libusb_device *, uint8_t,
-    unsigned char *, size_t);
+    void *, size_t);
 
 static int obsd_get_configuration(struct libusb_device_handle *, int *);
 static int obsd_set_configuration(struct libusb_device_handle *, int);
@@ -180,7 +180,6 @@
 
 				dpriv = usbi_get_device_priv(dev);
 				dpriv->fd = -1;
-				dpriv->cdesc = NULL;
 				dpriv->devname = udevname;
 
 				dd.udd_bus = di.udi_bus;
@@ -256,7 +255,7 @@
 }
 
 int
-obsd_get_device_descriptor(struct libusb_device *dev, unsigned char *buf,
+obsd_get_device_descriptor(struct libusb_device *dev, void *buf,
     int *host_endian)
 {
 	struct device_priv *dpriv = usbi_get_device_priv(dev);
@@ -270,12 +269,11 @@
 
 int
 obsd_get_active_config_descriptor(struct libusb_device *dev,
-    unsigned char *buf, size_t len)
+    void *buf, size_t len)
 {
 	struct device_priv *dpriv = usbi_get_device_priv(dev);
-	usb_config_descriptor_t *ucd = (usb_config_descriptor_t *)dpriv->cdesc;
 
-	len = MIN(len, UGETW(ucd->wTotalLength));
+	len = MIN(len, UGETW(dpriv->cdesc->wTotalLength));
 
 	usbi_dbg("len %zu", len);
 
@@ -286,7 +284,7 @@
 
 int
 obsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx,
-    unsigned char *buf, size_t len)
+    void *buf, size_t len)
 {
 	struct usb_device_fdesc udf;
 	int fd, err;
@@ -316,9 +314,8 @@
 obsd_get_configuration(struct libusb_device_handle *handle, int *config)
 {
 	struct device_priv *dpriv = usbi_get_device_priv(handle->dev);
-	usb_config_descriptor_t *ucd = (usb_config_descriptor_t *)dpriv->cdesc;
 
-	*config = ucd->bConfigurationValue;
+	*config = dpriv->cdesc->bConfigurationValue;
 
 	usbi_dbg("bConfigurationValue %d", *config);
 
@@ -515,7 +512,7 @@
 	struct device_priv *dpriv = usbi_get_device_priv(dev);
 	struct usb_device_cdesc udc;
 	struct usb_device_fdesc udf;
-	unsigned char* buf;
+	void *buf;
 	int fd, len, err;
 
 	if ((fd = _bus_open(dev->bus_number)) < 0)
@@ -535,7 +532,7 @@
 	usbi_dbg("active bLength %d", udc.udc_desc.bLength);
 
 	len = UGETW(udc.udc_desc.wTotalLength);
-	buf = malloc(len);
+	buf = malloc((size_t)len);
 	if (buf == NULL)
 		return (LIBUSB_ERROR_NO_MEM);
 
diff --git a/libusb/os/sunos_usb.c b/libusb/os/sunos_usb.c
index 0d8198f..9a148ca 100644
--- a/libusb/os/sunos_usb.c
+++ b/libusb/os/sunos_usb.c
@@ -63,11 +63,11 @@
 static int sunos_open(struct libusb_device_handle *);
 static void sunos_close(struct libusb_device_handle *);
 static int sunos_get_device_descriptor(struct libusb_device *,
-    uint8_t *, int *);
+    void *, int *);
 static int sunos_get_active_config_descriptor(struct libusb_device *,
-    uint8_t *, size_t);
+    void *, size_t);
 static int sunos_get_config_descriptor(struct libusb_device *, uint8_t,
-    uint8_t *, size_t);
+    void *, size_t);
 static int sunos_get_configuration(struct libusb_device_handle *, int *);
 static int sunos_set_configuration(struct libusb_device_handle *, int);
 static int sunos_claim_interface(struct libusb_device_handle *, int);
@@ -1020,7 +1020,7 @@
 }
 
 int
-sunos_get_device_descriptor(struct libusb_device *dev, uint8_t *buf,
+sunos_get_device_descriptor(struct libusb_device *dev, void *buf,
     int *host_endian)
 {
 	sunos_dev_priv_t *dpriv = usbi_get_device_priv(dev);
@@ -1032,7 +1032,7 @@
 
 int
 sunos_get_active_config_descriptor(struct libusb_device *dev,
-    uint8_t *buf, size_t len)
+    void *buf, size_t len)
 {
 	sunos_dev_priv_t *dpriv = usbi_get_device_priv(dev);
 	struct libusb_config_descriptor *cfg;
@@ -1076,7 +1076,7 @@
 
 int
 sunos_get_config_descriptor(struct libusb_device *dev, uint8_t idx,
-    uint8_t *buf, size_t len)
+    void *buf, size_t len)
 {
 	/* XXX */
 	return(sunos_get_active_config_descriptor(dev, buf, len));
diff --git a/libusb/os/windows_common.c b/libusb/os/windows_common.c
index 3d1175d..9352091 100644
--- a/libusb/os/windows_common.c
+++ b/libusb/os/windows_common.c
@@ -599,28 +599,28 @@
 }
 
 static int windows_get_device_descriptor(struct libusb_device *dev,
-	unsigned char *buffer, int *host_endian)
+	void *buffer, int *host_endian)
 {
 	struct windows_context_priv *priv = usbi_get_context_priv(DEVICE_CTX(dev));
 	return priv->backend->get_device_descriptor(dev, buffer);
 }
 
 static int windows_get_active_config_descriptor(struct libusb_device *dev,
-	unsigned char *buffer, size_t len)
+	void *buffer, size_t len)
 {
 	struct windows_context_priv *priv = usbi_get_context_priv(DEVICE_CTX(dev));
 	return priv->backend->get_active_config_descriptor(dev, buffer, len);
 }
 
 static int windows_get_config_descriptor(struct libusb_device *dev,
-	uint8_t config_index, unsigned char *buffer, size_t len)
+	uint8_t config_index, void *buffer, size_t len)
 {
 	struct windows_context_priv *priv = usbi_get_context_priv(DEVICE_CTX(dev));
 	return priv->backend->get_config_descriptor(dev, config_index, buffer, len);
 }
 
 static int windows_get_config_descriptor_by_value(struct libusb_device *dev,
-	uint8_t bConfigurationValue, unsigned char **buffer)
+	uint8_t bConfigurationValue, void **buffer)
 {
 	struct windows_context_priv *priv = usbi_get_context_priv(DEVICE_CTX(dev));
 	return priv->backend->get_config_descriptor_by_value(dev, bConfigurationValue, buffer);
diff --git a/libusb/os/windows_common.h b/libusb/os/windows_common.h
index b2da4d9..e48f7a9 100644
--- a/libusb/os/windows_common.h
+++ b/libusb/os/windows_common.h
@@ -299,13 +299,13 @@
 		struct discovered_devs **discdevs);
 	int (*open)(struct libusb_device_handle *dev_handle);
 	void (*close)(struct libusb_device_handle *dev_handle);
-	int (*get_device_descriptor)(struct libusb_device *device, unsigned char *buffer);
+	int (*get_device_descriptor)(struct libusb_device *device, void *buffer);
 	int (*get_active_config_descriptor)(struct libusb_device *device,
-		unsigned char *buffer, size_t len);
+		void *buffer, size_t len);
 	int (*get_config_descriptor)(struct libusb_device *device,
-		uint8_t config_index, unsigned char *buffer, size_t len);
+		uint8_t config_index, void *buffer, size_t len);
 	int (*get_config_descriptor_by_value)(struct libusb_device *device,
-		uint8_t bConfigurationValue, unsigned char **buffer);
+		uint8_t bConfigurationValue, void **buffer);
 	int (*get_configuration)(struct libusb_device_handle *dev_handle, int *config);
 	int (*set_configuration)(struct libusb_device_handle *dev_handle, int config);
 	int (*claim_interface)(struct libusb_device_handle *dev_handle, int interface_number);
diff --git a/libusb/os/windows_usbdk.c b/libusb/os/windows_usbdk.c
index ac11496..15783b0 100644
--- a/libusb/os/windows_usbdk.c
+++ b/libusb/os/windows_usbdk.c
@@ -357,7 +357,7 @@
 	return r;
 }
 
-static int usbdk_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer)
+static int usbdk_get_device_descriptor(struct libusb_device *dev, void *buffer)
 {
 	struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
 
@@ -366,7 +366,7 @@
 	return LIBUSB_SUCCESS;
 }
 
-static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len)
+static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, void *buffer, size_t len)
 {
 	struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
 	PUSB_CONFIGURATION_DESCRIPTOR config_header;
@@ -380,7 +380,7 @@
 }
 
 static int usbdk_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue,
-	unsigned char **buffer)
+	void **buffer)
 {
 	struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
 	PUSB_CONFIGURATION_DESCRIPTOR config_header;
@@ -389,7 +389,7 @@
 	for (index = 0; index < dev->device_descriptor.bNumConfigurations; index++) {
 		config_header = priv->config_descriptors[index];
 		if (config_header->bConfigurationValue == bConfigurationValue) {
-			*buffer = (unsigned char *)priv->config_descriptors[index];
+			*buffer = priv->config_descriptors[index];
 			return (int)config_header->wTotalLength;
 		}
 	}
@@ -397,7 +397,7 @@
 	return LIBUSB_ERROR_NOT_FOUND;
 }
 
-static int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len)
+static int usbdk_get_active_config_descriptor(struct libusb_device *dev, void *buffer, size_t len)
 {
 	struct usbdk_device_priv *priv = usbi_get_device_priv(dev);
 
diff --git a/libusb/os/windows_winusb.c b/libusb/os/windows_winusb.c
index ec7c025..d2e3893 100644
--- a/libusb/os/windows_winusb.c
+++ b/libusb/os/windows_winusb.c
@@ -1515,7 +1515,7 @@
 	return r;
 }
 
-static int winusb_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer)
+static int winusb_get_device_descriptor(struct libusb_device *dev, void *buffer)
 {
 	struct winusb_device_priv *priv = usbi_get_device_priv(dev);
 
@@ -1523,24 +1523,23 @@
 	return LIBUSB_SUCCESS;
 }
 
-static int winusb_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len)
+static int winusb_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, void *buffer, size_t len)
 {
 	struct winusb_device_priv *priv = usbi_get_device_priv(dev);
 	PUSB_CONFIGURATION_DESCRIPTOR config_header;
-	size_t size;
 
 	if ((priv->config_descriptor == NULL) || (priv->config_descriptor[config_index] == NULL))
 		return LIBUSB_ERROR_NOT_FOUND;
 
 	config_header = priv->config_descriptor[config_index];
 
-	size = MIN(config_header->wTotalLength, len);
-	memcpy(buffer, priv->config_descriptor[config_index], size);
-	return (int)size;
+	len = MIN(len, config_header->wTotalLength);
+	memcpy(buffer, config_header, len);
+	return (int)len;
 }
 
 static int winusb_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue,
-	unsigned char **buffer)
+	void **buffer)
 {
 	struct winusb_device_priv *priv = usbi_get_device_priv(dev);
 	PUSB_CONFIGURATION_DESCRIPTOR config_header;
@@ -1554,7 +1553,7 @@
 		if (config_header == NULL)
 			continue;
 		if (config_header->bConfigurationValue == bConfigurationValue) {
-			*buffer = (unsigned char *)priv->config_descriptor[index];
+			*buffer = config_header;
 			return (int)config_header->wTotalLength;
 		}
 	}
@@ -1565,10 +1564,10 @@
 /*
  * return the cached copy of the active config descriptor
  */
-static int winusb_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len)
+static int winusb_get_active_config_descriptor(struct libusb_device *dev, void *buffer, size_t len)
 {
 	struct winusb_device_priv *priv = usbi_get_device_priv(dev);
-	unsigned char *config_desc;
+	void *config_desc;
 	int r;
 
 	if (priv->active_config == 0)
@@ -1578,7 +1577,7 @@
 	if (r < 0)
 		return r;
 
-	len = MIN((size_t)r, len);
+	len = MIN(len, (size_t)r);
 	memcpy(buffer, config_desc, len);
 	return (int)len;
 }
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index 49b7a05..6188f4f 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11507
+#define LIBUSB_NANO 11508