From eadaa2c3de3a5495538784d4a873a1cf06dbb13f Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 22 Feb 2012 21:26:36 +0000 Subject: [PATCH] [USBCCGP] - Fix retrieving string descriptors svn path=/trunk/; revision=55818 --- reactos/drivers/usb/usbccgp/descriptor.c | 58 ++++++++++++++++++++++++ reactos/drivers/usb/usbccgp/function.c | 10 ++-- reactos/drivers/usb/usbccgp/usbccgp.h | 9 ++++ 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/usb/usbccgp/descriptor.c b/reactos/drivers/usb/usbccgp/descriptor.c index e8e74f8ba5f..2a9e4953887 100644 --- a/reactos/drivers/usb/usbccgp/descriptor.c +++ b/reactos/drivers/usb/usbccgp/descriptor.c @@ -94,6 +94,64 @@ USBCCGP_GetDescriptor( return Status; } +NTSTATUS +NTAPI +USBCCGP_GetStringDescriptor( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DescriptorLength, + IN UCHAR DescriptorIndex, + IN LANGID LanguageId, + OUT PVOID *OutDescriptor) +{ + NTSTATUS Status; + PUSB_STRING_DESCRIPTOR StringDescriptor; + ULONG Size; + PVOID Buffer; + + // retrieve descriptor + Status = USBCCGP_GetDescriptor(DeviceObject, USB_STRING_DESCRIPTOR_TYPE, DescriptorLength, DescriptorIndex, LanguageId, OutDescriptor); + if (!NT_SUCCESS(Status)) + { + // failed + return Status; + } + + // get descriptor structure + StringDescriptor = (PUSB_STRING_DESCRIPTOR)*OutDescriptor; + + // sanity check + ASSERT(StringDescriptor->bLength < DescriptorLength - 2); + + if (StringDescriptor->bLength == 2) + { + // invalid descriptor + FreeItem(StringDescriptor); + return STATUS_DEVICE_DATA_ERROR; + } + + // calculate size + Size = StringDescriptor->bLength + sizeof(WCHAR); + + // allocate buffer + Buffer = AllocateItem(NonPagedPool, Size); + if (!Buffer) + { + // no memory + FreeItem(StringDescriptor); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // copy result + RtlCopyMemory(Buffer, StringDescriptor->bString, Size - FIELD_OFFSET(USB_STRING_DESCRIPTOR, bString)); + + // free buffer + FreeItem(StringDescriptor); + + // store result + *OutDescriptor = (PVOID)Buffer; + return STATUS_SUCCESS; +} + NTSTATUS USBCCGP_GetDescriptors( diff --git a/reactos/drivers/usb/usbccgp/function.c b/reactos/drivers/usb/usbccgp/function.c index 2840166b803..2783bf65869 100644 --- a/reactos/drivers/usb/usbccgp/function.c +++ b/reactos/drivers/usb/usbccgp/function.c @@ -365,8 +365,7 @@ USBCCGP_InitFunctionDescriptor( // // get interface description // - Status = USBCCGP_GetDescriptor(FDODeviceExtension->NextDeviceObject, - USB_STRING_DESCRIPTOR_TYPE, + Status = USBCCGP_GetStringDescriptor(FDODeviceExtension->NextDeviceObject, 100 * sizeof(WCHAR), Descriptor->iFunction, 0x0409, //FIXME @@ -530,10 +529,9 @@ USBCCG_InitIdsWithInterfaceDescriptor( // // get interface description // - Status = USBCCGP_GetDescriptor(FDODeviceExtension->NextDeviceObject, - USB_STRING_DESCRIPTOR_TYPE, - 100 * sizeof(WCHAR), - Descriptor->iInterface, + Status = USBCCGP_GetStringDescriptor(FDODeviceExtension->NextDeviceObject, + 100 * sizeof(WCHAR), + Descriptor->iInterface, 0x0409, //FIXME (PVOID*)&DescriptionBuffer); if (!NT_SUCCESS(Status)) diff --git a/reactos/drivers/usb/usbccgp/usbccgp.h b/reactos/drivers/usb/usbccgp/usbccgp.h index 2208dfe8b49..b4d47fa8c52 100644 --- a/reactos/drivers/usb/usbccgp/usbccgp.h +++ b/reactos/drivers/usb/usbccgp/usbccgp.h @@ -84,6 +84,15 @@ USBCCGP_GetDescriptor( IN LANGID LanguageId, OUT PVOID *OutDescriptor); +NTSTATUS +NTAPI +USBCCGP_GetStringDescriptor( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DescriptorLength, + IN UCHAR DescriptorIndex, + IN LANGID LanguageId, + OUT PVOID *OutDescriptor); + ULONG CountInterfaceDescriptors( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);