[HIDPARSER]
[reactos.git] / drivers / usb / usbd / usbd.c
index 1988a99..a62ed93 100644 (file)
@@ -5,6 +5,7 @@
  * PURPOSE:     Helper Library for USB
  * PROGRAMMERS:
  *              Filip Navara <xnavara@volny.cz>
+ *              Michael Martin <michael.martin@reactos.org>
  *
  */
 
@@ -31,8 +32,9 @@
  *    USBD_GetPdoRegistryParameters (implemented)
  */
 
-#include <ntddk.h>
+#include <wdm.h>
 #include <usbdi.h>
+
 #ifndef PLUGPLAY_REGKEY_DRIVER
 #define PLUGPLAY_REGKEY_DRIVER              2
 #endif
@@ -41,7 +43,7 @@ typedef struct _USBD_INTERFACE_LIST_ENTRY {
     PUSBD_INTERFACE_INFORMATION Interface;
 } USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY;
 
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 DriverEntry(PDRIVER_OBJECT DriverObject,
             PUNICODE_STRING RegistryPath)
 {
@@ -51,8 +53,8 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
 /*
  * @implemented
  */
-DWORD STDCALL
-DllInitialize(DWORD Unknown)
+ULONG NTAPI
+DllInitialize(ULONG Unknown)
 {
     return 0;
 }
@@ -60,7 +62,7 @@ DllInitialize(DWORD Unknown)
 /*
  * @implemented
  */
-DWORD STDCALL
+ULONG NTAPI
 DllUnload(VOID)
 {
     return 0;
@@ -69,9 +71,9 @@ DllUnload(VOID)
 /*
  * @implemented
  */
-PVOID STDCALL
-USBD_Debug_GetHeap(DWORD Unknown1, POOL_TYPE PoolType, ULONG NumberOfBytes,
-       ULONG Tag)
+PVOID NTAPI
+USBD_Debug_GetHeap(ULONG Unknown1, POOL_TYPE PoolType, ULONG NumberOfBytes,
+                   ULONG Tag)
 {
     return ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag);
 }
@@ -79,8 +81,8 @@ USBD_Debug_GetHeap(DWORD Unknown1, POOL_TYPE PoolType, ULONG NumberOfBytes,
 /*
  * @implemented
  */
-VOID STDCALL
-USBD_Debug_RetHeap(PVOID Heap, DWORD Unknown2, DWORD Unknown3)
+VOID NTAPI
+USBD_Debug_RetHeap(PVOID Heap, ULONG Unknown2, ULONG Unknown3)
 {
     ExFreePool(Heap);
 }
@@ -88,7 +90,7 @@ USBD_Debug_RetHeap(PVOID Heap, DWORD Unknown2, DWORD Unknown3)
 /*
  * @implemented
  */
-VOID STDCALL
+VOID NTAPI
 USBD_Debug_LogEntry(PCHAR Name, ULONG_PTR Info1, ULONG_PTR Info2,
     ULONG_PTR Info3)
 {
@@ -97,8 +99,8 @@ USBD_Debug_LogEntry(PCHAR Name, ULONG_PTR Info1, ULONG_PTR Info2,
 /*
  * @implemented
  */
-PVOID STDCALL
-USBD_AllocateDeviceName(DWORD Unknown)
+PVOID NTAPI
+USBD_AllocateDeviceName(ULONG Unknown)
 {
     return NULL;
 }
@@ -106,20 +108,20 @@ USBD_AllocateDeviceName(DWORD Unknown)
 /*
  * @implemented
  */
-DWORD STDCALL
+ULONG NTAPI
 USBD_CalculateUsbBandwidth(
     ULONG MaxPacketSize,
     UCHAR EndpointType,
     BOOLEAN LowSpeed
     )
 {
-    DWORD OverheadTable[] = {
+    ULONG OverheadTable[] = {
             0x00, /* UsbdPipeTypeControl */
             0x09, /* UsbdPipeTypeIsochronous */
             0x00, /* UsbdPipeTypeBulk */
             0x0d  /* UsbdPipeTypeInterrupt */
         };
-    DWORD Result;
+    ULONG Result;
 
     if (OverheadTable[EndpointType] != 0)
     {
@@ -134,8 +136,8 @@ USBD_CalculateUsbBandwidth(
 /*
  * @implemented
  */
-DWORD STDCALL
-USBD_Dispatch(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4)
+ULONG NTAPI
+USBD_Dispatch(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3, ULONG Unknown4)
 {
     return 1;
 }
@@ -143,7 +145,7 @@ USBD_Dispatch(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4)
 /*
  * @implemented
  */
-VOID STDCALL
+VOID NTAPI
 USBD_FreeDeviceMutex(PVOID Unknown)
 {
 }
@@ -151,7 +153,7 @@ USBD_FreeDeviceMutex(PVOID Unknown)
 /*
  * @implemented
  */
-VOID STDCALL
+VOID NTAPI
 USBD_FreeDeviceName(PVOID Unknown)
 {
 }
@@ -159,7 +161,7 @@ USBD_FreeDeviceName(PVOID Unknown)
 /*
  * @implemented
  */
-VOID STDCALL
+VOID NTAPI
 USBD_WaitDeviceMutex(PVOID Unknown)
 {
 }
@@ -167,8 +169,8 @@ USBD_WaitDeviceMutex(PVOID Unknown)
 /*
  * @implemented
  */
-DWORD STDCALL
-USBD_GetSuspendPowerState(DWORD Unknown1)
+ULONG NTAPI
+USBD_GetSuspendPowerState(ULONG Unknown1)
 {
     return 0;
 }
@@ -176,9 +178,9 @@ USBD_GetSuspendPowerState(DWORD Unknown1)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-USBD_InitializeDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3,
-    DWORD Unknown4, DWORD Unknown5, DWORD Unknown6)
+NTSTATUS NTAPI
+USBD_InitializeDevice(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3,
+    ULONG Unknown4, ULONG Unknown5, ULONG Unknown6)
 {
     return STATUS_NOT_SUPPORTED;
 }
@@ -186,10 +188,10 @@ USBD_InitializeDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-USBD_RegisterHostController(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3,
-    DWORD Unknown4, DWORD Unknown5, DWORD Unknown6, DWORD Unknown7,
-    DWORD Unknown8, DWORD Unknown9, DWORD Unknown10)
+NTSTATUS NTAPI
+USBD_RegisterHostController(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3,
+    ULONG Unknown4, ULONG Unknown5, ULONG Unknown6, ULONG Unknown7,
+    ULONG Unknown8, ULONG Unknown9, ULONG Unknown10)
 {
     return STATUS_NOT_SUPPORTED;
 }
@@ -197,8 +199,8 @@ USBD_RegisterHostController(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-USBD_GetDeviceInformation(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3)
+NTSTATUS NTAPI
+USBD_GetDeviceInformation(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3)
 {
     return STATUS_NOT_SUPPORTED;
 }
@@ -206,9 +208,9 @@ USBD_GetDeviceInformation(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-USBD_CreateDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3,
-    DWORD Unknown4, DWORD Unknown5)
+NTSTATUS NTAPI
+USBD_CreateDevice(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3,
+    ULONG Unknown4, ULONG Unknown5)
 {
     return STATUS_NOT_SUPPORTED;
 }
@@ -216,8 +218,8 @@ USBD_CreateDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-USBD_RemoveDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3)
+NTSTATUS NTAPI
+USBD_RemoveDevice(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3)
 {
     return STATUS_NOT_SUPPORTED;
 }
@@ -225,15 +227,15 @@ USBD_RemoveDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3)
 /*
  * @implemented
  */
-VOID STDCALL
-USBD_CompleteRequest(DWORD Unknown1, DWORD Unknown2)
+VOID NTAPI
+USBD_CompleteRequest(ULONG Unknown1, ULONG Unknown2)
 {
 }
 
 /*
  * @implemented
  */
-VOID STDCALL
+VOID NTAPI
 USBD_RegisterHcFilter(
     PDEVICE_OBJECT DeviceObject,
     PDEVICE_OBJECT FilterDeviceObject
@@ -244,16 +246,16 @@ USBD_RegisterHcFilter(
 /*
  * @implemented
  */
-VOID STDCALL
-USBD_SetSuspendPowerState(DWORD Unknown1, DWORD Unknown2)
+VOID NTAPI
+USBD_SetSuspendPowerState(ULONG Unknown1, ULONG Unknown2)
 {
 }
 
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-USBD_MakePdoName(DWORD Unknown1, DWORD Unknown2)
+NTSTATUS NTAPI
+USBD_MakePdoName(ULONG Unknown1, ULONG Unknown2)
 {
     return STATUS_NOT_SUPPORTED;
 }
@@ -261,7 +263,7 @@ USBD_MakePdoName(DWORD Unknown1, DWORD Unknown2)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 USBD_QueryBusTime(
     PDEVICE_OBJECT RootHubPdo,
     PULONG CurrentFrame
@@ -273,7 +275,7 @@ USBD_QueryBusTime(
 /*
  * @implemented
  */
-VOID STDCALL
+VOID NTAPI
 USBD_GetUSBDIVersion(
     PUSBD_VERSION_INFORMATION Version
     )
@@ -288,8 +290,8 @@ USBD_GetUSBDIVersion(
 /*
  * @implemented
  */
-NTSTATUS STDCALL
-USBD_RestoreDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3)
+NTSTATUS NTAPI
+USBD_RestoreDevice(ULONG Unknown1, ULONG Unknown2, ULONG Unknown3)
 {
     return STATUS_NOT_SUPPORTED;
 }
@@ -297,65 +299,79 @@ USBD_RestoreDevice(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3)
 /*
  * @implemented
  */
-VOID STDCALL
-USBD_RegisterHcDeviceCapabilities(DWORD Unknown1, DWORD Unknown2,
-    DWORD Unknown3)
+VOID NTAPI
+USBD_RegisterHcDeviceCapabilities(ULONG Unknown1, ULONG Unknown2,
+    ULONG Unknown3)
 {
 }
 
 /*
  * @implemented
- * FIXME: Test
  */
-PURB
-STDCALL
+PURB NTAPI
 USBD_CreateConfigurationRequestEx(
     PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
     PUSBD_INTERFACE_LIST_ENTRY InterfaceList
     )
 {
     PURB Urb;
-    DWORD UrbSize;
-    DWORD InterfaceCount;
+    ULONG UrbSize = 0;
+    ULONG InterfaceCount;
+    ULONG InterfaceNumber, EndPointNumber;
+    PUSBD_INTERFACE_INFORMATION InterfaceInfo;
 
     for (InterfaceCount = 0;
          InterfaceList[InterfaceCount].InterfaceDescriptor != NULL;
-         ++InterfaceCount)
-       ;
-    /* Include the NULL entry */
-    ++InterfaceCount;
+         InterfaceCount++)
+    {
+        UrbSize += FIELD_OFFSET(USBD_INTERFACE_INFORMATION, Pipes);
+        UrbSize += (InterfaceList[InterfaceCount].InterfaceDescriptor->bNumEndpoints) * sizeof(USBD_PIPE_INFORMATION);
+    }
+
+    UrbSize += sizeof(URB) + sizeof(USBD_INTERFACE_INFORMATION);
 
-    UrbSize = sizeof(Urb->UrbSelectConfiguration) +
-       (InterfaceCount * sizeof(PUSBD_INTERFACE_LIST_ENTRY));
     Urb = ExAllocatePool(NonPagedPool, UrbSize);
-    Urb->UrbSelectConfiguration.Hdr.Function =
-        URB_FUNCTION_SELECT_CONFIGURATION;
-    Urb->UrbSelectConfiguration.Hdr.Length =
-        sizeof(Urb->UrbSelectConfiguration);
-    Urb->UrbSelectConfiguration.ConfigurationDescriptor =
-       ConfigurationDescriptor;
-    memcpy((PVOID)&Urb->UrbSelectConfiguration.Interface, (PVOID)InterfaceList,
-       InterfaceCount * sizeof(PUSBD_INTERFACE_LIST_ENTRY));
+    RtlZeroMemory(Urb, UrbSize);
+    Urb->UrbSelectConfiguration.Hdr.Function =  URB_FUNCTION_SELECT_CONFIGURATION;
+    Urb->UrbSelectConfiguration.Hdr.Length = sizeof(Urb->UrbSelectConfiguration);
+    Urb->UrbSelectConfiguration.ConfigurationDescriptor = ConfigurationDescriptor;
+
+    InterfaceInfo = &Urb->UrbSelectConfiguration.Interface;
+    for (InterfaceNumber = 0; InterfaceNumber < InterfaceCount; InterfaceNumber++)
+    {
+        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;
+        for (EndPointNumber = 0; EndPointNumber < InterfaceInfo->NumberOfPipes; EndPointNumber++)
+        {
+            InterfaceInfo->Pipes[EndPointNumber].MaximumTransferSize = PAGE_SIZE;
+        }
+        InterfaceInfo = (PUSBD_INTERFACE_INFORMATION) ((ULONG_PTR)InterfaceInfo + InterfaceInfo->Length);
+    }
 
     return Urb;
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
-PURB STDCALL
+PURB NTAPI
 USBD_CreateConfigurationRequest(
     PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
     PUSHORT Size
     )
 {
+    /* WindowsXP returns NULL */
     return NULL;
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
-ULONG STDCALL
+ULONG NTAPI
 USBD_GetInterfaceLength(
     PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor,
     PUCHAR BufferEnd
@@ -363,25 +379,30 @@ USBD_GetInterfaceLength(
 {
     ULONG_PTR Current;
     PUSB_INTERFACE_DESCRIPTOR CurrentDescriptor = InterfaceDescriptor;
-    DWORD Length = CurrentDescriptor->bLength;
+    ULONG Length = 0;
+    BOOLEAN InterfaceFound = FALSE;
 
-    // USB_ENDPOINT_DESCRIPTOR_TYPE
-    if (CurrentDescriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE)
+    for (Current = (ULONG_PTR)CurrentDescriptor;
+         Current < (ULONG_PTR)BufferEnd;
+         Current += CurrentDescriptor->bLength)
     {
-        for (Current = (ULONG_PTR)CurrentDescriptor;
-             Current < (ULONG_PTR)BufferEnd;
-             Current += CurrentDescriptor->bLength)
-            CurrentDescriptor = (PUSB_INTERFACE_DESCRIPTOR)Current;
-            Length += CurrentDescriptor->bLength;
+        CurrentDescriptor = (PUSB_INTERFACE_DESCRIPTOR)Current;
+
+        if ((CurrentDescriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE) && (InterfaceFound))
+            break;
+        else if (CurrentDescriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE)
+            InterfaceFound = TRUE;
 
+        Length += CurrentDescriptor->bLength;
     }
+
     return Length;
 }
 
 /*
  * @implemented
  */
-PUSB_COMMON_DESCRIPTOR STDCALL
+PUSB_COMMON_DESCRIPTOR NTAPI
 USBD_ParseDescriptors(
     PVOID  DescriptorBuffer,
     ULONG  TotalLength,
@@ -397,7 +418,7 @@ USBD_ParseDescriptors(
                             ((PLONG)DescriptorBuffer + TotalLength) ) break;
        if (PComDes->bDescriptorType == DescriptorType) return PComDes;
        if (PComDes->bLength == 0) break;
-       PComDes = PComDes + PComDes->bLength;
+       PComDes = (PUSB_COMMON_DESCRIPTOR)((ULONG_PTR)PComDes + PComDes->bLength);
     }
     return NULL;
 }
@@ -406,7 +427,7 @@ USBD_ParseDescriptors(
 /*
  * @implemented
  */
-PUSB_INTERFACE_DESCRIPTOR STDCALL
+PUSB_INTERFACE_DESCRIPTOR NTAPI
 USBD_ParseConfigurationDescriptorEx(
     PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
     PVOID StartPosition,
@@ -462,7 +483,7 @@ USBD_ParseConfigurationDescriptorEx(
 /*
  * @implemented
  */
-PUSB_INTERFACE_DESCRIPTOR STDCALL
+PUSB_INTERFACE_DESCRIPTOR NTAPI
 USBD_ParseConfigurationDescriptor(
     PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
     UCHAR InterfaceNumber,
@@ -478,7 +499,7 @@ USBD_ParseConfigurationDescriptor(
 /*
  * @implemented
  */
-DWORD STDCALL
+ULONG NTAPI
 USBD_GetPdoRegistryParameter(
     PDEVICE_OBJECT PhysicalDeviceObject,
     PVOID Parameter,