#include "usbccgp.h"
+#define NDEBUG
+#include <debug.h>
+
NTSTATUS
NTAPI
USBCCGP_GetDescriptor(
return STATUS_SUCCESS;
}
+VOID
+DumpFullConfigurationDescriptor(
+ IN PFDO_DEVICE_EXTENSION FDODeviceExtension,
+ IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor)
+{
+ PUSB_COMMON_DESCRIPTOR Descriptor;
+
+ Descriptor = (PUSB_COMMON_DESCRIPTOR)ConfigurationDescriptor;
+
+ DbgPrint("Bogus ConfigurationDescriptor Found\n");
+ DbgPrint("InterfaceCount %x\n", ConfigurationDescriptor->bNumInterfaces);
+
+ do
+ {
+ if (((ULONG_PTR)Descriptor) >= ((ULONG_PTR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength))
+ break;
+
+ DbgPrint("Descriptor Type %x Length %lu Offset %lu\n", Descriptor->bDescriptorType, Descriptor->bLength, ((ULONG_PTR)Descriptor - (ULONG_PTR)ConfigurationDescriptor));
+
+ // check for invalid descriptors
+ if (!Descriptor->bLength)
+ {
+ DbgPrint("Bogus Descriptor!!!\n");
+ break;
+ }
+
+ // advance to next descriptor
+ Descriptor = (PUSB_COMMON_DESCRIPTOR)((ULONG_PTR)Descriptor + Descriptor->bLength);
+
+ }while(TRUE);
+
+
+}
+
+
NTSTATUS
NTAPI
USBCCGP_ScanConfigurationDescriptor(
{
PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
ULONG InterfaceIndex = 0;
- PVOID CurrentPosition;
ULONG DescriptorCount;
//
// count all interface descriptors
//
DescriptorCount = ConfigurationDescriptor->bNumInterfaces;
+ if (DescriptorCount == 0)
+ {
+ DPRINT1("[USBCCGP] DescriptorCount is zero\n");
+ return STATUS_INVALID_PARAMETER;
+ }
//
// allocate array holding the interface descriptors
return STATUS_INSUFFICIENT_RESOURCES;
}
- CurrentPosition = ConfigurationDescriptor;
+ //
+ // reset interface list count
+ //
+ FDODeviceExtension->InterfaceListCount = 0;
+
do
{
//
// parse configuration descriptor
//
InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor, ConfigurationDescriptor, InterfaceIndex, -1, -1, -1, -1);
- ASSERT(InterfaceDescriptor);
if (InterfaceDescriptor)
{
//
// store in interface list
//
+ ASSERT(FDODeviceExtension->InterfaceListCount < DescriptorCount);
FDODeviceExtension->InterfaceList[FDODeviceExtension->InterfaceListCount].InterfaceDescriptor = InterfaceDescriptor;
FDODeviceExtension->InterfaceListCount++;
- CurrentPosition = (PVOID)((ULONG_PTR)InterfaceDescriptor + InterfaceDescriptor->bLength);
+ }
+ else
+ {
+ DumpConfigurationDescriptor(ConfigurationDescriptor);
+ DumpFullConfigurationDescriptor(FDODeviceExtension, ConfigurationDescriptor);
+
+ //
+ // see issue
+ // CORE-6574 Test 3 (USB Web Cam)
+ //
+ if (FDODeviceExtension->DeviceDescriptor && FDODeviceExtension->DeviceDescriptor->idVendor == 0x0458 && FDODeviceExtension->DeviceDescriptor->idProduct == 0x705f)
+ ASSERT(FALSE);
}
//
VOID
DumpConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor)
{
- DPRINT1("Dumping ConfigurationDescriptor %x\n", ConfigurationDescriptor);
- DPRINT1("bLength %x\n", ConfigurationDescriptor->bLength);
- DPRINT1("bDescriptorType %x\n", ConfigurationDescriptor->bDescriptorType);
- DPRINT1("wTotalLength %x\n", ConfigurationDescriptor->wTotalLength);
- DPRINT1("bNumInterfaces %x\n", ConfigurationDescriptor->bNumInterfaces);
- DPRINT1("bConfigurationValue %x\n", ConfigurationDescriptor->bConfigurationValue);
- DPRINT1("iConfiguration %x\n", ConfigurationDescriptor->iConfiguration);
- DPRINT1("bmAttributes %x\n", ConfigurationDescriptor->bmAttributes);
- DPRINT1("MaxPower %x\n", ConfigurationDescriptor->MaxPower);
+ DbgPrint("Dumping ConfigurationDescriptor %x\n", ConfigurationDescriptor);
+ DbgPrint("bLength %x\n", ConfigurationDescriptor->bLength);
+ DbgPrint("bDescriptorType %x\n", ConfigurationDescriptor->bDescriptorType);
+ DbgPrint("wTotalLength %x\n", ConfigurationDescriptor->wTotalLength);
+ DbgPrint("bNumInterfaces %x\n", ConfigurationDescriptor->bNumInterfaces);
+ DbgPrint("bConfigurationValue %x\n", ConfigurationDescriptor->bConfigurationValue);
+ DbgPrint("iConfiguration %x\n", ConfigurationDescriptor->iConfiguration);
+ DbgPrint("bmAttributes %x\n", ConfigurationDescriptor->bmAttributes);
+ DbgPrint("MaxPower %x\n", ConfigurationDescriptor->MaxPower);
}
NTSTATUS
Status = USBCCGP_SyncUrbRequest(DeviceExtension->NextDeviceObject, Urb);
//
- // did it succeeed
+ // did it succeed
//
if (NT_SUCCESS(Status))
{
//
return Status;
}
-