[ros-diffs] [janderwald] 55965: [USBD] - Rewrite broken USBD_CreateConfigurationRequestEx - It did not calculate the required urb size correctly - It did not store the correct number of provided interfaces - L...

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sat Mar 3 14:41:14 UTC 2012


Author: janderwald
Date: Sat Mar  3 14:41:12 2012
New Revision: 55965

URL: http://svn.reactos.org/svn/reactos?rev=55965&view=rev
Log:
[USBD]
- Rewrite broken USBD_CreateConfigurationRequestEx
- It did not calculate the required urb size correctly 
- It did not store the correct number of provided interfaces
- Length of each interface information was wrong

Modified:
    trunk/reactos/drivers/usb/usbd/usbd.c

Modified: trunk/reactos/drivers/usb/usbd/usbd.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbd/usbd.c?rev=55965&r1=55964&r2=55965&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbd/usbd.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbd/usbd.c [iso-8859-1] Sat Mar  3 14:41:12 2012
@@ -32,17 +32,15 @@
  *    USBD_GetPdoRegistryParameters (implemented)
  */
 
+#define _USBD_
+#define NDEBUG
 #include <ntddk.h>
 #include <usbdi.h>
-#define NDEBUG
+#include <usbdlib.h>
 #include <debug.h>
 #ifndef PLUGPLAY_REGKEY_DRIVER
 #define PLUGPLAY_REGKEY_DRIVER              2
 #endif
-typedef struct _USBD_INTERFACE_LIST_ENTRY {
-    PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
-    PUSBD_INTERFACE_INFORMATION Interface;
-} USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY;
 
 NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
@@ -335,39 +333,61 @@
 {
     PURB Urb;
     ULONG UrbSize = 0;
-    ULONG InterfaceCount;
+    ULONG InterfaceCount = 0, PipeCount = 0;
     ULONG InterfaceNumber, EndPointNumber;
     PUSBD_INTERFACE_INFORMATION InterfaceInfo;
 
-    for (InterfaceCount = 0;
-         InterfaceList[InterfaceCount].InterfaceDescriptor != NULL;
-         InterfaceCount++)
-    {
-        UrbSize += sizeof(USBD_INTERFACE_INFORMATION);
-        UrbSize += (InterfaceList[InterfaceCount].InterfaceDescriptor->bNumEndpoints - 1) * sizeof(USBD_PIPE_INFORMATION);
-    }
-
-    UrbSize += sizeof(URB) + sizeof(USBD_INTERFACE_INFORMATION);
-
+    while(InterfaceList[InterfaceCount].InterfaceDescriptor)
+    {
+        // pipe count
+        PipeCount += InterfaceList[InterfaceCount].InterfaceDescriptor->bNumEndpoints;
+
+        // interface count
+        InterfaceCount++;
+    }
+
+    // size of urb
+    UrbSize = GET_SELECT_CONFIGURATION_REQUEST_SIZE(InterfaceCount, PipeCount);
+
+    // allocate urb
     Urb = ExAllocatePool(NonPagedPool, UrbSize);
+    if (!Urb)
+    {
+        // no memory
+        return NULL;
+    }
+
+    // zero urb
     RtlZeroMemory(Urb, UrbSize);
+
+    // init urb header
     Urb->UrbSelectConfiguration.Hdr.Function =  URB_FUNCTION_SELECT_CONFIGURATION;
-    Urb->UrbSelectConfiguration.Hdr.Length = sizeof(Urb->UrbSelectConfiguration);
+    Urb->UrbSelectConfiguration.Hdr.Length = UrbSize;
     Urb->UrbSelectConfiguration.ConfigurationDescriptor = ConfigurationDescriptor;
 
+    // init interface information
     InterfaceInfo = &Urb->UrbSelectConfiguration.Interface;
     for (InterfaceNumber = 0; InterfaceNumber < InterfaceCount; InterfaceNumber++)
     {
+        // init interface info
         InterfaceList[InterfaceNumber].Interface = InterfaceInfo;
-        InterfaceInfo->Length = sizeof(USBD_INTERFACE_INFORMATION) +
-                                ((InterfaceList[InterfaceNumber].InterfaceDescriptor->bNumEndpoints - 1) * sizeof(USBD_PIPE_INFORMATION));
         InterfaceInfo->InterfaceNumber = InterfaceList[InterfaceNumber].InterfaceDescriptor->bInterfaceNumber;
         InterfaceInfo->AlternateSetting = InterfaceList[InterfaceNumber].InterfaceDescriptor->bAlternateSetting;
         InterfaceInfo->NumberOfPipes = InterfaceList[InterfaceNumber].InterfaceDescriptor->bNumEndpoints;
+
+        // store length
+        InterfaceInfo->Length = GET_USBD_INTERFACE_SIZE(InterfaceList[InterfaceNumber].InterfaceDescriptor->bNumEndpoints);
+
+        // sanity check
+        //C_ASSERT(FIELD_OFFSET(USBD_INTERFACE_INFORMATION, Pipes) == 16);
+
         for (EndPointNumber = 0; EndPointNumber < InterfaceInfo->NumberOfPipes; EndPointNumber++)
         {
+            // init max transfer size
             InterfaceInfo->Pipes[EndPointNumber].MaximumTransferSize = PAGE_SIZE;
         }
+
+        // next interface info
         InterfaceInfo = (PUSBD_INTERFACE_INFORMATION) ((ULONG_PTR)InterfaceInfo + InterfaceInfo->Length);
     }
 




More information about the Ros-diffs mailing list