[BROWSEUI] SHExplorerParseCmdLine: Fix parsing of /root (#6752)
[reactos.git] / drivers / usb / usbccgp / function.c
index d13c744..63817c5 100644 (file)
@@ -11,6 +11,9 @@
 
 #include "usbccgp.h"
 
+#define NDEBUG
+#include <debug.h>
+
 NTSTATUS
 USBCCGP_QueryInterface(
     IN PDEVICE_OBJECT DeviceObject,
@@ -22,26 +25,18 @@ USBCCGP_QueryInterface(
     IO_STATUS_BLOCK IoStatus;
     PIO_STACK_LOCATION Stack;
 
-    //
-    // sanity checks
-    //
+    /* Sanity checks */
     ASSERT(DeviceObject);
 
-    //
-    // initialize event
-    //
+    /* Initialize event */
     KeInitializeEvent(&Event, NotificationEvent, FALSE);
 
-    //
-    // init interface
-    //
+    /* Init interface */
     RtlZeroMemory(BusInterface, sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1));
     BusInterface->Version = USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1;
     BusInterface->Size = sizeof(USBC_DEVICE_CONFIGURATION_INTERFACE_V1);
 
-    //
-    // create irp
-    //
+    /* Create irp */
     Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
                                        DeviceObject,
                                        NULL,
@@ -64,7 +59,7 @@ USBCCGP_QueryInterface(
     //
     // initialize request
     //
-    Stack=IoGetNextIrpStackLocation(Irp);
+    Stack = IoGetNextIrpStackLocation(Irp);
     Stack->MajorFunction = IRP_MJ_PNP;
     Stack->MinorFunction = IRP_MN_QUERY_INTERFACE;
     Stack->Parameters.QueryInterface.Size = sizeof(BUS_INTERFACE_STANDARD);
@@ -77,7 +72,7 @@ USBCCGP_QueryInterface(
     //
     // call driver
     //
-    Status= IoCallDriver(DeviceObject, Irp);
+    Status = IoCallDriver(DeviceObject, Irp);
 
     //
     // did operation complete
@@ -124,14 +119,14 @@ USBCCGP_CustomEnumWithInterface(
     //
     // invoke callback
     //
-    Status = FDODeviceExtension->BusInterface.StartDeviceCallback(FDODeviceExtension->DeviceDescriptor, 
-                                                                  FDODeviceExtension->ConfigurationDescriptor, 
+    Status = FDODeviceExtension->BusInterface.StartDeviceCallback(FDODeviceExtension->DeviceDescriptor,
+                                                                  FDODeviceExtension->ConfigurationDescriptor,
                                                                   &FunctionDescriptorBuffer,
                                                                   &FunctionDescriptorBufferLength,
                                                                   DeviceObject,
                                                                   FDODeviceExtension->PhysicalDeviceObject);
 
-    DPRINT1("USBCCGP_CustomEnumWithInterface Status %x\n", Status);
+    DPRINT("USBCCGP_CustomEnumWithInterface Status %lx\n", Status);
     if (!NT_SUCCESS(Status))
     {
         //
@@ -140,8 +135,8 @@ USBCCGP_CustomEnumWithInterface(
         return Status;
     }
 
-    DPRINT1("FunctionDescriptorBufferLength %lu\n", FunctionDescriptorBufferLength);
-    DPRINT1("FunctionDescriptorBuffer %p\n", FunctionDescriptorBuffer);
+    DPRINT("FunctionDescriptorBufferLength %lu\n", FunctionDescriptorBufferLength);
+    DPRINT("FunctionDescriptorBuffer %p\n", FunctionDescriptorBuffer);
 
     //
     // assume length % function buffer size
@@ -175,7 +170,7 @@ USBCCGP_CountAssociationDescriptors(
     Offset = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->bLength;
     End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
 
-    while(Offset < End)
+    while (Offset < End)
     {
         //
         // get association descriptor
@@ -217,7 +212,7 @@ USBCCGP_GetAssociationDescriptorAtIndex(
     Offset = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->bLength;
     End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
 
-    while(Offset < End)
+    while (Offset < End)
     {
         //
         // get association descriptor
@@ -268,7 +263,7 @@ USBCCGP_InitInterfaceListOfFunctionDescriptor(
     Offset = (PUCHAR)AssociationDescriptor + AssociationDescriptor->bLength;
     End = (PUCHAR)ConfigurationDescriptor + ConfigurationDescriptor->wTotalLength;
 
-    while(Offset < End)
+    while (Offset < End)
     {
         //
         // get association descriptor
@@ -339,7 +334,7 @@ USBCCGP_InitFunctionDescriptor(
 
     // allocate array for interface count
     FunctionDescriptor->InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * Descriptor->bInterfaceCount);
-    if (FunctionDescriptor->InterfaceDescriptorList)
+    if (!FunctionDescriptor->InterfaceDescriptorList)
     {
         //
         // no memory
@@ -365,12 +360,11 @@ USBCCGP_InitFunctionDescriptor(
         //
         // get interface description
         //
-         Status = USBCCGP_GetDescriptor(FDODeviceExtension->NextDeviceObject, 
-                                        USB_STRING_DESCRIPTOR_TYPE, 
-                                        100 * sizeof(WCHAR), 
-                                        Descriptor->iFunction, 
-                                        0x0409, //FIXME
-                                        (PVOID*)&DescriptionBuffer);
+         Status = USBCCGP_GetStringDescriptor(FDODeviceExtension->NextDeviceObject,
+                                              100 * sizeof(WCHAR),
+                                              Descriptor->iFunction,
+                                              0x0409, //FIXME
+                                              (PVOID*)&DescriptionBuffer);
         if (!NT_SUCCESS(Status))
         {
             //
@@ -395,9 +389,9 @@ USBCCGP_InitFunctionDescriptor(
                                                                          FDODeviceExtension->DeviceDescriptor->idProduct,
                                                                          FDODeviceExtension->DeviceDescriptor->bcdDevice,
                                                                          Descriptor->bFirstInterface) + 1;
-    Index = swprintf(&Buffer[Index], L"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension->DeviceDescriptor->idVendor,
-                                                                        FDODeviceExtension->DeviceDescriptor->idProduct,
-                                                                        Descriptor->bFirstInterface) + 1;
+    Index += swprintf(&Buffer[Index], L"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension->DeviceDescriptor->idVendor,
+                                                                         FDODeviceExtension->DeviceDescriptor->idProduct,
+                                                                         Descriptor->bFirstInterface) + 1;
 
     // allocate result buffer
     DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR));
@@ -410,18 +404,17 @@ USBCCGP_InitFunctionDescriptor(
     }
 
     // copy description
-    RtlCopyMemory(DescriptionBuffer, Buffer, Index * sizeof(WCHAR));
+    RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR));
     FunctionDescriptor->HardwareId.Buffer = DescriptionBuffer;
     FunctionDescriptor->HardwareId.Length = Index * sizeof(WCHAR);
     FunctionDescriptor->HardwareId.MaximumLength = (Index + 1) * sizeof(WCHAR);
 
-
     //
     // now init the compatible id
     //
     Index = swprintf(Buffer, L"USB\\Class_%02x&SubClass_%02x&Prot_%02x", Descriptor->bFunctionClass, Descriptor->bFunctionSubClass, Descriptor->bFunctionProtocol) + 1;
-    Index = swprintf(&Buffer[Index], L"USB\\Class_%04x&SubClass_%04x",  Descriptor->bFunctionClass, Descriptor->bFunctionSubClass) + 1;
-    Index = swprintf(&Buffer[Index], L"USB\\Class_%04x", Descriptor->bFunctionClass) + 1;
+    Index += swprintf(&Buffer[Index], L"USB\\Class_%02x&SubClass_%02x",  Descriptor->bFunctionClass, Descriptor->bFunctionSubClass) + 1;
+    Index += swprintf(&Buffer[Index], L"USB\\Class_%02x", Descriptor->bFunctionClass) + 1;
 
     // allocate result buffer
     DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR));
@@ -434,7 +427,7 @@ USBCCGP_InitFunctionDescriptor(
     }
 
     // copy description
-    RtlCopyMemory(DescriptionBuffer, Buffer, Index * sizeof(WCHAR));
+    RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR));
     FunctionDescriptor->CompatibleId.Buffer = DescriptionBuffer;
     FunctionDescriptor->CompatibleId.Length = Index * sizeof(WCHAR);
     FunctionDescriptor->CompatibleId.MaximumLength = (Index + 1) * sizeof(WCHAR);
@@ -475,7 +468,7 @@ USBCCGP_EnumWithAssociationDescriptor(
     // allocate function descriptor array
     //
     FDODeviceExtension->FunctionDescriptor = AllocateItem(NonPagedPool, sizeof(USBC_FUNCTION_DESCRIPTOR) * DescriptorCount);
-    if (!FDODeviceExtension->FunctionDescriptorCount)
+    if (!FDODeviceExtension->FunctionDescriptor)
     {
         //
         // no memory
@@ -484,7 +477,7 @@ USBCCGP_EnumWithAssociationDescriptor(
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-    for(Index = 0; Index < DescriptorCount; Index++)
+    for (Index = 0; Index < DescriptorCount; Index++)
     {
         //
         // init function descriptors
@@ -530,12 +523,11 @@ USBCCG_InitIdsWithInterfaceDescriptor(
         //
         // get interface description
         //
-         Status = USBCCGP_GetDescriptor(FDODeviceExtension->NextDeviceObject, 
-                                        USB_STRING_DESCRIPTOR_TYPE, 
-                                        100 * sizeof(WCHAR), 
-                                        Descriptor->iInterface, 
-                                        0x0409, //FIXME
-                                        (PVOID*)&DescriptionBuffer);
+         Status = USBCCGP_GetStringDescriptor(FDODeviceExtension->NextDeviceObject,
+                                              100 * sizeof(WCHAR),
+                                              Descriptor->iInterface,
+                                              0x0409, //FIXME
+                                              (PVOID*)&DescriptionBuffer);
         if (!NT_SUCCESS(Status))
         {
             //
@@ -562,8 +554,8 @@ USBCCG_InitIdsWithInterfaceDescriptor(
                                                                          FDODeviceExtension->DeviceDescriptor->bcdDevice,
                                                                          FunctionIndex) + 1;
     Index += swprintf(&Buffer[Index], L"USB\\VID_%04x&PID_%04x&MI_%02x", FDODeviceExtension->DeviceDescriptor->idVendor,
-                                                                        FDODeviceExtension->DeviceDescriptor->idProduct,
-                                                                        FunctionIndex) + 1;
+                                                                         FDODeviceExtension->DeviceDescriptor->idProduct,
+                                                                         FunctionIndex) + 1;
 
     // allocate result buffer
     DescriptionBuffer = AllocateItem(NonPagedPool, (Index + 1) * sizeof(WCHAR));
@@ -576,7 +568,7 @@ USBCCG_InitIdsWithInterfaceDescriptor(
     }
 
     // copy description
-    RtlCopyMemory(DescriptionBuffer, Buffer, Index * sizeof(WCHAR));
+    RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR));
     FunctionDescriptor->HardwareId.Buffer = DescriptionBuffer;
     FunctionDescriptor->HardwareId.Length = Index * sizeof(WCHAR);
     FunctionDescriptor->HardwareId.MaximumLength = (Index + 1) * sizeof(WCHAR);
@@ -599,7 +591,7 @@ USBCCG_InitIdsWithInterfaceDescriptor(
     }
 
     // copy description
-    RtlCopyMemory(DescriptionBuffer, Buffer, Index * sizeof(WCHAR));
+    RtlCopyMemory(DescriptionBuffer, Buffer, (Index + 1) * sizeof(WCHAR));
     FunctionDescriptor->CompatibleId.Buffer = DescriptionBuffer;
     FunctionDescriptor->CompatibleId.Length = Index * sizeof(WCHAR);
     FunctionDescriptor->CompatibleId.MaximumLength = (Index + 1) * sizeof(WCHAR);
@@ -647,7 +639,8 @@ USBCCGP_LegacyEnum(
     //
     // init function descriptors
     //
-    for(Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++)
+    FDODeviceExtension->FunctionDescriptorCount = 0;
+    for (Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++)
     {
         // get interface descriptor
         InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index, 0, -1, -1, -1);
@@ -689,7 +682,7 @@ USBCCGP_LegacyEnum(
             //
             // failed to init ids
             //
-            DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status);
+            DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status);
             return Status;
         }
 
@@ -709,7 +702,7 @@ NTSTATUS
 USBCCGP_EnumWithUnionFunctionDescriptors(
     IN PDEVICE_OBJECT DeviceObject)
 {
-    UNIMPLEMENTED
+    UNIMPLEMENTED;
     return STATUS_NOT_IMPLEMENTED;
 }
 
@@ -721,7 +714,6 @@ USBCCGP_EnumWithAudioLegacy(
     PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, FirstDescriptor = NULL;
     PFDO_DEVICE_EXTENSION FDODeviceExtension;
     NTSTATUS Status = STATUS_SUCCESS;
-    PVOID StartPosition;
 
     //
     // get device extension
@@ -733,21 +725,15 @@ USBCCGP_EnumWithAudioLegacy(
     //
     // first check if all interfaces belong to the same audio class
     //
-    StartPosition = FDODeviceExtension->ConfigurationDescriptor;
-    for(Index = 0; Index < CountInterfaceDescriptors(FDODeviceExtension->ConfigurationDescriptor); Index++)
+    for (Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++)
     {
         //
         // get interface descriptor
         //
-        InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, StartPosition, -1, -1, -1, -1, -1);
+        InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index, 0, -1, -1, -1);
         DPRINT1("Index %lu Descriptor %p\n", Index, InterfaceDescriptor);
         ASSERT(InterfaceDescriptor);
 
-        //
-        // move to next descriptor
-        //
-        StartPosition = (PVOID)((ULONG_PTR)InterfaceDescriptor + InterfaceDescriptor->bLength);
-
         if (InterfaceDescriptor->bInterfaceClass != 0x1)
         {
             //
@@ -777,7 +763,7 @@ USBCCGP_EnumWithAudioLegacy(
     //
     // this is an composite audio device
     //
-    DPRINT1("[USBCCGP] Audio Composite Device detected\n");
+    DPRINT("[USBCCGP] Audio Composite Device detected\n");
 
     //
     // audio interfaces are all grouped into one single function
@@ -806,7 +792,7 @@ USBCCGP_EnumWithAudioLegacy(
         //
         // failed to allocate descriptor array
         //
-        DPRINT1("[USBCCGP] Failed to allocate descriptor array %x\n", Status);
+        DPRINT1("[USBCCGP] Failed to allocate descriptor array %lx\n", Status);
         return Status;
     }
 
@@ -819,14 +805,14 @@ USBCCGP_EnumWithAudioLegacy(
         //
         // failed to init ids
         //
-        DPRINT1("[USBCCGP] Failed to init ids with %x\n", Status);
+        DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status);
         return Status;
     }
 
     //
     // number of interfaces
     //
-    FDODeviceExtension->FunctionDescriptor[0].NumberOfInterfaces = CountInterfaceDescriptors(FDODeviceExtension->ConfigurationDescriptor);
+    FDODeviceExtension->FunctionDescriptor[0].NumberOfInterfaces = FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces;
 
     //
     // store function count