[ros-diffs] [janderwald] 55134: [USBHUB] - Check if the device is a composite device - Report USB\COMPOSITE as compatible id when a usb compsite device is detected

janderwald at svn.reactos.org janderwald at svn.reactos.org
Mon Jan 23 23:29:54 UTC 2012


Author: janderwald
Date: Mon Jan 23 23:29:54 2012
New Revision: 55134

URL: http://svn.reactos.org/svn/reactos?rev=55134&view=rev
Log:
[USBHUB]
- Check if the device is a composite device
- Report USB\COMPOSITE as compatible id when a usb compsite device is detected

Modified:
    branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c

Modified: branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c
URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c?rev=55134&r1=55133&r2=55134&view=diff
==============================================================================
--- branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c [iso-8859-1] (original)
+++ branches/usb-bringup-trunk/drivers/usb/usbhub_new/fdo.c [iso-8859-1] Mon Jan 23 23:29:54 2012
@@ -804,6 +804,34 @@
     return STATUS_SUCCESS;
 }
 
+ULONG
+IsCompositeDevice(
+    PUSB_DEVICE_DESCRIPTOR DeviceDescriptor)
+{
+    if (DeviceDescriptor->bDeviceClass == 0)
+    {
+        //
+        // composite device
+        //
+        return TRUE;
+    }
+
+    if (DeviceDescriptor->bDeviceClass == 0xEF && 
+        DeviceDescriptor->bDeviceSubClass == 0x02 &&
+        DeviceDescriptor->bDeviceProtocol == 0x01)
+    {
+        //
+        // USB-IF association descriptor
+        //
+        return TRUE;
+    }
+
+    //
+    // not a composite device
+    //
+    return FALSE;
+}
+
 NTSTATUS
 CreateDeviceIds(
     PDEVICE_OBJECT UsbChildDeviceObject)
@@ -813,15 +841,22 @@
     PWCHAR BufferPtr;
     WCHAR Buffer[100];
     PHUB_CHILDDEVICE_EXTENSION UsbChildExtension;
-
+    PUSB_DEVICE_DESCRIPTOR DeviceDescriptor;
+
+    //
+    // get child device extension
+    //
     UsbChildExtension = (PHUB_CHILDDEVICE_EXTENSION)UsbChildDeviceObject->DeviceExtension;
 
     //
     // Initialize the CompatibleIds String
     //
-    UsbChildExtension->usCompatibleIds.Length = 144;
+    UsbChildExtension->usCompatibleIds.Length = 144; //FIXME
     UsbChildExtension->usCompatibleIds.MaximumLength = UsbChildExtension->usCompatibleIds.Length;
 
+    //
+    // allocate mem for compatible id string
+    //
     BufferPtr = ExAllocatePoolWithTag(NonPagedPool,
                                       UsbChildExtension->usCompatibleIds.Length,
                                       USB_HUB_TAG);
@@ -832,39 +867,43 @@
     }
 
     RtlZeroMemory(BufferPtr, UsbChildExtension->usCompatibleIds.Length);
-
     Index = 0;
+
+    //
+    // get device descriptor
+    //
+    DeviceDescriptor = &UsbChildExtension->DeviceDesc;
+
     //
     // Construct the CompatibleIds
     //
-    if (UsbChildExtension->DeviceDesc.bDeviceClass == 0)
-    {
-        PUSB_INTERFACE_DESCRIPTOR InterDesc = (PUSB_INTERFACE_DESCRIPTOR)
-            ((ULONG_PTR)UsbChildExtension->FullConfigDesc + sizeof(USB_CONFIGURATION_DESCRIPTOR));
-
+    if (IsCompositeDevice(DeviceDescriptor))
+    {
+        Index += swprintf(&BufferPtr[Index], 
+                          L"USB\\DevClass_%02x&SubClass_%02x&Prot_%02x",
+                          DeviceDescriptor->bDeviceClass, DeviceDescriptor->bDeviceSubClass, DeviceDescriptor->bDeviceProtocol) + 1;
+        Index += swprintf(&BufferPtr[Index],
+                          L"USB\\DevClass_%02x&SubClass_%02x",
+                          DeviceDescriptor->bDeviceClass, DeviceDescriptor->bDeviceSubClass) + 1;
+        Index += swprintf(&BufferPtr[Index],
+                          L"USB\\DevClass_%02x",
+                          DeviceDescriptor->bDeviceClass) + 1;
+        Index += swprintf(&BufferPtr[Index],
+                          L"USB\\COMPOSITE") + 1;
+    }
+    else
+    {
         Index += swprintf(&BufferPtr[Index], 
                           L"USB\\Class_%02x&SubClass_%02x&Prot_%02x",
-                          InterDesc->bInterfaceClass,InterDesc->bInterfaceSubClass,InterDesc->bInterfaceProtocol) + 1;
+                          DeviceDescriptor->bDeviceClass, DeviceDescriptor->bDeviceSubClass, DeviceDescriptor->bDeviceProtocol) + 1;
         Index += swprintf(&BufferPtr[Index],
                           L"USB\\Class_%02x&SubClass_%02x",
-                          InterDesc->bInterfaceClass,InterDesc->bInterfaceSubClass) + 1;
+                          DeviceDescriptor->bDeviceClass, DeviceDescriptor->bDeviceSubClass) + 1;
         Index += swprintf(&BufferPtr[Index],
                           L"USB\\Class_%02x",
-                          InterDesc->bInterfaceClass) + 1;
-    }
-    else
-    {
-        PUSB_DEVICE_DESCRIPTOR DevDesc = &UsbChildExtension->DeviceDesc;
-        Index += swprintf(&BufferPtr[Index], 
-                          L"USB\\Class_%02x&SubClass_%02x&Prot_%02x",
-                          DevDesc->bDeviceClass,DevDesc->bDeviceSubClass,DevDesc->bDeviceProtocol) + 1;
-        Index += swprintf(&BufferPtr[Index],
-                          L"USB\\Class_%02x&SubClass_%02x",
-                          DevDesc->bDeviceClass,DevDesc->bDeviceSubClass) + 1;
-        Index += swprintf(&BufferPtr[Index],
-                          L"USB\\Class_%02x",
-                          DevDesc->bDeviceClass) + 1;
-    }
+                          DeviceDescriptor->bDeviceClass) + 1;
+    }
+
     BufferPtr[Index] = UNICODE_NULL;
     UsbChildExtension->usCompatibleIds.Buffer = BufferPtr;
     DPRINT1("usCompatibleIds %wZ\n", &UsbChildExtension->usCompatibleIds);




More information about the Ros-diffs mailing list