From 6f88b3d05afdf9278ebf1bbd033dc97ff2367857 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Fri, 5 Jun 2009 13:00:02 +0400 Subject: [PATCH] usbhub.sys: Add support for USB_STRING_DESCRIPTOR_TYPE. --- dlls/usbhub.sys/usbhub.c | 59 ++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/dlls/usbhub.sys/usbhub.c b/dlls/usbhub.sys/usbhub.c index 04e00ada6e..fce8c7ccbb 100644 --- a/dlls/usbhub.sys/usbhub.c +++ b/dlls/usbhub.sys/usbhub.c @@ -77,7 +77,7 @@ struct PdoExtension #ifdef HAVE_LIBUSB -static void add_data( char **dst, ULONG *dst_size, const void *src, ULONG src_size ) +static void add_data( unsigned char **dst, ULONG *dst_size, const void *src, ULONG src_size ) { int copy; @@ -134,13 +134,18 @@ static NTSTATUS WINAPI usbhub_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) struct _URB_CONTROL_DESCRIPTOR_REQUEST *request = &urb->u.UrbControlDescriptorRequest; ULONG size = request->TransferBufferLength; - char *buf = request->TransferBuffer; + unsigned char *buf = request->TransferBuffer; TRACE( "URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n" ); + if (!size) + { + status = STATUS_SUCCESS; + break; + } if (buf == NULL && request->TransferBufferMDL != NULL) buf = request->TransferBufferMDL->MappedSystemVa; - if (buf == NULL && size) + if (buf == NULL) { status = STATUS_INVALID_PARAMETER; break; @@ -199,9 +204,21 @@ static NTSTATUS WINAPI usbhub_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) status = STATUS_SUCCESS; } break; - default: - FIXME( "unsupported descriptor type %x\n", - request->DescriptorType ); + case USB_STRING_DESCRIPTOR_TYPE: + TRACE( "USB_STRING_DESCRIPTOR_TYPE\n" ); + { + libusb_device_handle *husb; + int ret; + + if (!libusb_open( inst->dev, &husb )) + { + ret = libusb_get_string_descriptor( husb, request->Index, + request->LanguageId, buf, size ); + libusb_close( husb ); + if (ret < 0) break; + status = STATUS_SUCCESS; + } + } } } break; @@ -321,13 +338,18 @@ static NTSTATUS WINAPI usbhub_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) struct _URB_CONTROL_DESCRIPTOR_REQUEST *request = &urb->u.UrbControlDescriptorRequest; ULONG size = request->TransferBufferLength; - char *buf = request->TransferBuffer; + unsigned char *buf = request->TransferBuffer; TRACE( "URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n" ); + if (!size) + { + status = STATUS_SUCCESS; + break; + } if (buf == NULL && request->TransferBufferMDL != NULL) buf = request->TransferBufferMDL->MappedSystemVa; - if (buf == NULL && size) + if (buf == NULL) { status = STATUS_INVALID_PARAMETER; break; @@ -378,9 +400,24 @@ static NTSTATUS WINAPI usbhub_internal_ioctl( DEVICE_OBJECT *device, IRP *irp ) status = STATUS_SUCCESS; } break; - default: - FIXME( "unsupported descriptor type %x\n", - request->DescriptorType ); + case USB_STRING_DESCRIPTOR_TYPE: + TRACE( "USB_STRING_DESCRIPTOR_TYPE\n" ); + { + usb_dev_handle *husb; + int ret; + + husb = usb_open( inst->dev ); + if (husb) + { + ret = usb_get_string( husb, request->Index, + request->LanguageId, (void *)buf, size ); + if (ret < 0) + ERR( "%s\n", usb_strerror() ); + else + status = STATUS_SUCCESS; + usb_close( husb ); + } + } } } break; -- 2.33.8