#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;
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;
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;
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;
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;