[ros-diffs] [fireball] 39913: - Major cleanup of USB keyboard driver: * Remove huge hack, which is not needed anymore since 39912. * Put all global variables into device extension, allowing support for more than one USB keyboard. * Cleanup driver extension structure. * Remove unneeded endpoint finding code. - Add test code for LEDs support (now puts three of them into ON state).

fireball at svn.reactos.org fireball at svn.reactos.org
Mon Mar 9 11:04:41 CET 2009


Author: fireball
Date: Mon Mar  9 13:04:40 2009
New Revision: 39913

URL: http://svn.reactos.org/svn/reactos?rev=39913&view=rev
Log:
- Major cleanup of USB keyboard driver:
 * Remove huge hack, which is not needed anymore since 39912.
 * Put all global variables into device extension, allowing support for more than one USB keyboard.
 * Cleanup driver extension structure.
 * Remove unneeded endpoint finding code.
- Add test code for LEDs support (now puts three of them into ON state).

Modified:
    trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c
    trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.h

Modified: trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c?rev=39913&r1=39912&r2=39913&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.c [iso-8859-1] Mon Mar  9 13:04:40 2009
@@ -9,11 +9,6 @@
 #include "usbdriver.h"
 #include "kbdmou.h"
 
-/* Data for embedded drivers */
-CONNECT_DATA KbdClassInformation;
-
-PDEVICE_OBJECT KeyboardFdo = NULL;
-
 NTSTATUS
 AddRegistryEntry(IN PCWSTR PortTypeName,
                  IN PUNICODE_STRING DeviceName,
@@ -23,8 +18,9 @@
 BOOLEAN kbd_disconnect(PUSB_DEV_MANAGER dev_mgr, DEV_HANDLE dev_handle);
 BOOLEAN kbd_stop(PUSB_DEV_MANAGER dev_mgr, DEV_HANDLE dev_handle);
 VOID kbd_irq(PURB purb, PVOID pcontext);
+VOID kbd_led(PURB purb, PVOID pcontext);
 static NTSTATUS
-KeyboardCreateDevice(IN PDRIVER_OBJECT DriverObject);
+KeyboardCreateDevice(IN PDRIVER_OBJECT DriverObject, IN PKEYBOARD_DRVR_EXTENSION DriverExtension);
 void * memscan(void * addr, int c, size_t size);
 
 static UCHAR usb_kbd_keycode[256] =
@@ -47,6 +43,18 @@
     150,158,159,128,136,177,178,176,142,152,173,140
 };
 
+/* This structure starts with the same layout as KEYBOARD_INDICATOR_TRANSLATION */
+typedef struct _LOCAL_KEYBOARD_INDICATOR_TRANSLATION {
+    USHORT NumberOfIndicatorKeys;
+    INDICATOR_LIST IndicatorList[3];
+} LOCAL_KEYBOARD_INDICATOR_TRANSLATION, *PLOCAL_KEYBOARD_INDICATOR_TRANSLATION;
+
+static LOCAL_KEYBOARD_INDICATOR_TRANSLATION IndicatorTranslation = { 3, {
+    {0x3A, KEYBOARD_CAPS_LOCK_ON},
+    {0x45, KEYBOARD_NUM_LOCK_ON},
+    {0x46, KEYBOARD_SCROLL_LOCK_ON}}};
+
+
 BOOLEAN
 kbd_driver_init(PUSB_DEV_MANAGER dev_mgr, PUSB_DRIVER pdriver)
 {
@@ -61,8 +69,8 @@
     pdriver->driver_desc.product_id = 0xffff;   // USB Product ID.
     pdriver->driver_desc.release_num = 0x100;   // Release Number of Device
 
-    pdriver->driver_desc.config_val = 1;            // Configuration Value
-    pdriver->driver_desc.if_num = 1;                // Interface Number
+    pdriver->driver_desc.config_val = 0;            // Configuration Value
+    pdriver->driver_desc.if_num = 0;                // Interface Number
     pdriver->driver_desc.if_class = USB_CLASS_HID;  // Interface Class
     pdriver->driver_desc.if_sub_class = 1;          // Interface SubClass
     pdriver->driver_desc.if_protocol = 1;           // Interface Protocol
@@ -85,11 +93,8 @@
     pdriver->disp_tbl.dev_stop = kbd_stop;
     pdriver->disp_tbl.dev_reserved = NULL;
 
-    // Zero out the class information structure
-    RtlZeroMemory(&KbdClassInformation, sizeof(CONNECT_DATA));
-
     // Create the device
-    KeyboardCreateDevice(dev_mgr->usb_driver_obj);
+    KeyboardCreateDevice(dev_mgr->usb_driver_obj, pdrvr_ext);
 
     usb_dbg_print(DBGLVL_MAXIMUM, ("kbd_driver_init(): keyboard driver is initialized\n"));
     return TRUE;
@@ -123,102 +128,41 @@
     PUSB_DRIVER pdrvr;
     PUSB_DEV pdev;
     PKEYBOARD_DRVR_EXTENSION pdev_ext;
-//    LONG i;
     PUSB_ENDPOINT_DESC pendp_desc = NULL;
     ULONG MaxPacketSize;
+    PUSB_CTRL_SETUP_PACKET psetup;
 
     usb_dbg_print(DBGLVL_MAXIMUM, ("kbd_connect(): entering...\n"));
 
     dev_mgr = param->dev_mgr;
     pdrvr = param->pdriver;
     pdev_ext = (PKEYBOARD_DRVR_EXTENSION)pdrvr->driver_ext;
+    pdev_ext->dev_handle = dev_handle;
 
     // Lock USB Device
     status = usb_query_and_lock_dev(dev_mgr, dev_handle, &pdev);
     if (status != STATUS_SUCCESS)
     {
-        //usb_free_mem(desc_buf);
         usb_dbg_print(DBGLVL_MEDIUM, ("kbd_connect(): unable to query&lock device, status=0x%x\n", status));
         return FALSE;
     }
 
-    // Endpoint-finding code
-    if (param->if_desc)
-    {
-        // Get a pointer to the config packet from compdev
-        PUCHAR Buffer = (PUCHAR)param->if_desc;
-        ULONG Offset = 0;
-        BOOLEAN FoundEndpoint = FALSE;
-
-        // Find our the only needed endpoint descriptor
-        while (Offset < 512)
-        {
-            pendp_desc = (PUSB_ENDPOINT_DESC)&Buffer[Offset];
-            usb_dbg_print(DBGLVL_MAXIMUM, ("kbd_connect(): DescType=0x%x, Attrs=0x%x, Len=%d\n",
-                pendp_desc->bDescriptorType, pendp_desc->bmAttributes, pendp_desc->bLength));
-
-            if (pendp_desc->bDescriptorType == USB_DT_ENDPOINT &&
-                pendp_desc->bLength == sizeof(USB_ENDPOINT_DESC))
-            {
-                // Found it
-                FoundEndpoint = TRUE;
-                break;
-            }
-
-            Offset += pendp_desc->bLength;
-        }
-
-        if (!FoundEndpoint)
-            return FALSE;
-
-        // FIXME: Check if it's INT endpoint
-        // (pendp_desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)
-
-        // endpoint must be IN
-        if ((pendp_desc->bEndpointAddress & USB_DIR_IN) == 0)
-            return FALSE;
-
-        usb_dbg_print(DBGLVL_MAXIMUM, ("kbd_connect(): FoundEndpoint=%d\n", FoundEndpoint));
-    }
-
-    // Endpoint descriptor substitution code
-    {
-        ULONG if_idx, endp_idx;
-        PUSB_ENDPOINT pendp;
-
-            //FoundEndpoint = FALSE;
-            for(if_idx = 0; if_idx < MAX_INTERFACES_PER_CONFIG /*pdev->usb_config->if_count*/; if_idx++)
-            {
-                for(endp_idx = 0; endp_idx < MAX_ENDPS_PER_IF /*pdev->usb_config->interf[if_idx].endp_count*/; endp_idx++)
-                {
-                    pendp = &pdev->usb_config->interf[if_idx].endp[endp_idx];
-
-                    if (pendp->pusb_endp_desc != NULL)
-                    {
-                        //HACKHACK: for some reason this usb driver chooses different and completely wrong
-                        //          endpoint. Since I don't have time to research this, I just find the
-                        //          endpoint descriptor myself and copy it
-                        memcpy(pendp->pusb_endp_desc, pendp_desc, pendp_desc->bLength);
-
-                        usb_dbg_print(DBGLVL_MAXIMUM, ("kbd_connect(): [%i][%i] DescType=0x%x, Attrs=0x%x, Len=%d\n",if_idx, endp_idx,
-                            pendp->pusb_endp_desc->bDescriptorType, pendp->pusb_endp_desc->bmAttributes, pendp->pusb_endp_desc->bLength));
-                    }
-                }
-            }
-    }
+    // Get pointer to the endpoint descriptor
+    pendp_desc = pdev->usb_config->interf[0].endp[0].pusb_endp_desc;
+
+    // Store max packet size
+    MaxPacketSize = pendp_desc->wMaxPacketSize;
+    if (MaxPacketSize > 8)
+        MaxPacketSize = 8;
 
     // Unlock USB Device
     usb_unlock_dev(pdev);
 
-    // Send URB
+    // Send interrupt URB
     purb = usb_alloc_mem(NonPagedPool, sizeof(URB));
     if (purb == NULL)
         return FALSE;
     RtlZeroMemory(purb, sizeof(URB));
-
-    MaxPacketSize = pendp_desc->wMaxPacketSize;
-    if (MaxPacketSize > 8)
-        MaxPacketSize = 8;
 
     RtlZeroMemory(pdev_ext->kbd_old, 8);
 
@@ -228,7 +172,7 @@
                                            (PUCHAR)&pdev_ext->kbd_data,
                                            MaxPacketSize, //use max packet size
                                            kbd_irq,
-                                           pdev_ext,
+                                           pdev_ext->device_ext,
                                            0);
 
     // Call USB driver stack
@@ -239,19 +183,54 @@
         purb = NULL;
     }
 
+    // Set LEDs request
+    purb = usb_alloc_mem(NonPagedPool, sizeof(URB));
+    if (purb == NULL) return FALSE;
+    RtlZeroMemory(purb, sizeof(URB));
+
+    pdev_ext->leds_old = 0;
+    pdev_ext->leds = 7;
+
+    // Build a URB for setting LEDs
+    psetup = (PUSB_CTRL_SETUP_PACKET) (purb)->setup_packet;
+    urb_init((purb));
+
+    purb->endp_handle = usb_make_handle((dev_handle >> 16), 0, 0) | 0xffff;
+    purb->data_buffer = &pdev_ext->leds;
+    purb->data_length = 1;
+    purb->completion = NULL;
+    purb->context = NULL;
+    purb->reference = (LONG)pdrvr;
+    psetup->bmRequestType = USB_DT_HID;
+    psetup->bRequest = USB_REQ_SET_CONFIGURATION;
+    psetup->wValue = USB_DT_CONFIG << 8;
+    psetup->wIndex = param->if_desc->bInterfaceNumber;
+    psetup->wLength = 1;
+
+    // Call USB driver stack
+    status = usb_submit_urb(pdev_ext->dev_mgr, purb);
+    if (status != STATUS_PENDING)
+    {
+        usb_free_mem(purb);
+        purb = NULL;
+    }
+
+    usb_dbg_print(DBGLVL_MAXIMUM, ("kbd_connect(): leds urb status 0x%x, Interface number %d\n",
+        status, param->if_desc->bInterfaceNumber));
+
     return TRUE;
 }
 
 VOID
 kbd_irq(PURB purb, PVOID pcontext)
 {
-    KEYBOARD_INPUT_DATA KeyboardInputData[10];
+    KEYBOARD_INPUT_DATA KeyboardInputData[20];
     ULONG DataPrepared=0, DataConsumed, i;
     UCHAR ScanCode;
     NTSTATUS status;
-    PKEYBOARD_DRVR_EXTENSION pdev_ext = (PKEYBOARD_DRVR_EXTENSION)pcontext;
-    PUCHAR data = pdev_ext->kbd_data;
-    PUCHAR data_old = pdev_ext->kbd_old;
+    PKEYBOARD_DRVR_EXTENSION pdev_ext;
+    PKEYBOARD_DEVICE_EXTENSION DeviceExtension = (PKEYBOARD_DEVICE_EXTENSION)pcontext;
+    PUCHAR data, data_old;
     usb_dbg_print(DBGLVL_MAXIMUM, ("kbd_irq(): called\n"));
 
     ASSERT(purb);
@@ -259,8 +238,12 @@
     if (purb->status != STATUS_SUCCESS)
     {
         usb_dbg_print(DBGLVL_MAXIMUM, ("kbd_irq(): purb->status 0x%08X\n", purb->status));
-        //return;
-    }
+        return;
+    }
+
+    pdev_ext = DeviceExtension->DriverExtension;
+    data = pdev_ext->kbd_data;
+    data_old = pdev_ext->kbd_old;
 
     usb_dbg_print(DBGLVL_MAXIMUM, ("Kbd input: %d %d %d %d %d %d %d %d\n", data[0], data[1], data[2], data[3],
         data[4], data[5], data[6], data[7]));
@@ -317,13 +300,13 @@
     }
 
     // Commit the input data somewhere...
-    if (KbdClassInformation.ClassService && DataPrepared > 0)
+    if (DeviceExtension->ConnectData.ClassService && DataPrepared > 0)
     {
         KIRQL OldIrql;
 
         KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
-        (*(PSERVICE_CALLBACK_ROUTINE)KbdClassInformation.ClassService)(
-            KbdClassInformation.ClassDeviceObject,
+        (*(PSERVICE_CALLBACK_ROUTINE)DeviceExtension->ConnectData.ClassService)(
+            DeviceExtension->ConnectData.ClassDeviceObject,
             &KeyboardInputData[0],
             (&KeyboardInputData[0])+DataPrepared,
             &DataConsumed);
@@ -376,59 +359,53 @@
     return TRUE;//umss_delete_device(dev_mgr, pdrvr, dev_obj, FALSE);
 }
 
+VOID
+kbd_setleds(PKEYBOARD_DEVICE_EXTENSION DeviceExtension)
+{
+    //DPRINT("%x\n", DevExt->KeyboardIndicators.LedFlags);
+}
+
 // Dispatch routine for our IRPs
 NTSTATUS
 KbdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
 {
     NTSTATUS Status = STATUS_INVALID_DEVICE_REQUEST;
+    PKEYBOARD_DEVICE_EXTENSION DeviceExtension;
+
+    DeviceExtension = DeviceObject->DeviceExtension;
 
     usb_dbg_print(DBGLVL_MAXIMUM, ("KbdDispatch(DO %p, code 0x%lx) called\n",
         DeviceObject,
         IoGetCurrentIrpStackLocation(Irp)->Parameters.DeviceIoControl.IoControlCode));
 
-    if (DeviceObject == KeyboardFdo)
+    if (DeviceObject == DeviceExtension->Fdo)
     {
         // it's keyboard's IOCTL
-        PIO_STACK_LOCATION Stk;
+        PIO_STACK_LOCATION Stack;
 
         Irp->IoStatus.Information = 0;
-        Stk = IoGetCurrentIrpStackLocation(Irp);
-
-        switch (Stk->Parameters.DeviceIoControl.IoControlCode)
+        Stack = IoGetCurrentIrpStackLocation(Irp);
+
+        switch (Stack->Parameters.DeviceIoControl.IoControlCode)
         {
         case IOCTL_INTERNAL_KEYBOARD_CONNECT:
             usb_dbg_print(DBGLVL_MAXIMUM, ("IOCTL_INTERNAL_KEYBOARD_CONNECT\n"));
-            if (Stk->Parameters.DeviceIoControl.InputBufferLength <	sizeof(CONNECT_DATA)) {
+            if (Stack->Parameters.DeviceIoControl.InputBufferLength <	sizeof(CONNECT_DATA)) {
                 usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_INTERNAL_KEYBOARD_CONNECT "
                     "invalid buffer size\n"));
                 Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                 goto intcontfailure;
             }
 
-            RtlCopyMemory(&KbdClassInformation,
-                Stk->Parameters.DeviceIoControl.Type3InputBuffer,
+            RtlCopyMemory(&DeviceExtension->ConnectData,
+                Stack->Parameters.DeviceIoControl.Type3InputBuffer,
                 sizeof(CONNECT_DATA));
 
-            Irp->IoStatus.Status = STATUS_SUCCESS;
-            break;
-#if 0
-        case IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER:
-            usb_dbg_print(DBGLVL_MAXIMUM, ("IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER\n"));
-            if (Stk->Parameters.DeviceIoControl.InputBufferLength <	1) {
-                Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
-                goto intcontfailure;
-            }
-            /*			if (!DevExt->KeyboardInterruptObject) {
-            Irp->IoStatus.Status = STATUS_DEVICE_NOT_READY;
-            goto intcontfailure;
-            }*/
-
-            Irp->IoStatus.Status = STATUS_SUCCESS;
-            break;
-#endif
+            Status = STATUS_SUCCESS;
+            break;
         case IOCTL_KEYBOARD_QUERY_ATTRIBUTES:
             usb_dbg_print(DBGLVL_MAXIMUM, ("IOCTL_KEYBOARD_QUERY_ATTRIBUTES\n"));
-            if (Stk->Parameters.DeviceIoControl.OutputBufferLength <
+            if (Stack->Parameters.DeviceIoControl.OutputBufferLength <
                 sizeof(KEYBOARD_ATTRIBUTES)) {
                     usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_QUERY_ATTRIBUTES: "
                         "invalid buffer size\n"));
@@ -443,22 +420,23 @@
             break;
         case IOCTL_KEYBOARD_QUERY_INDICATORS:
             usb_dbg_print(DBGLVL_MAXIMUM, ("IOCTL_KEYBOARD_QUERY_INDICATORS\n"));
-            if (Stk->Parameters.DeviceIoControl.OutputBufferLength <
-                sizeof(KEYBOARD_INDICATOR_PARAMETERS)) {
-                    usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_QUERY_INDICATORS: "
-                        "invalid buffer size\n"));
-                    Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
-                    goto intcontfailure;
-            }
-            /*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
-            &DevExt->KeyboardIndicators,
-            sizeof(KEYBOARD_INDICATOR_PARAMETERS));*/
-
-            Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+            if (Stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KEYBOARD_INDICATOR_PARAMETERS))
+            {
+                Status = STATUS_BUFFER_TOO_SMALL;
+            }
+            else
+            {
+                RtlCopyMemory(
+                    Irp->AssociatedIrp.SystemBuffer,
+                    &DeviceExtension->KeyboardIndicators,
+                    sizeof(KEYBOARD_INDICATOR_PARAMETERS));
+                Irp->IoStatus.Information = sizeof(KEYBOARD_INDICATOR_PARAMETERS);
+                Status = STATUS_SUCCESS;
+            }
             break;
         case IOCTL_KEYBOARD_QUERY_TYPEMATIC:
             usb_dbg_print(DBGLVL_MAXIMUM, ("IOCTL_KEYBOARD_QUERY_TYPEMATIC\n"));
-            if (Stk->Parameters.DeviceIoControl.OutputBufferLength <
+            if (Stack->Parameters.DeviceIoControl.OutputBufferLength <
                 sizeof(KEYBOARD_TYPEMATIC_PARAMETERS)) {
                     usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_QUERY_TYPEMATIC: "
                         "invalid buffer size\n"));
@@ -469,11 +447,11 @@
             &DevExt->KeyboardTypematic,
             sizeof(KEYBOARD_TYPEMATIC_PARAMETERS));*/
 
-            Irp->IoStatus.Status = STATUS_SUCCESS;
+            Status = STATUS_SUCCESS;
             break;
         case IOCTL_KEYBOARD_SET_INDICATORS:
             usb_dbg_print(DBGLVL_MAXIMUM, ("IOCTL_KEYBOARD_SET_INDICATORS\n"));
-            if (Stk->Parameters.DeviceIoControl.InputBufferLength <
+            if (Stack->Parameters.DeviceIoControl.InputBufferLength <
                 sizeof(KEYBOARD_INDICATOR_PARAMETERS)) {
                     usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_SET_INDICTATORS: "
                         "invalid buffer size\n"));
@@ -481,17 +459,17 @@
                     goto intcontfailure;
             }
 
-            /*RtlCopyMemory(&DevExt->KeyboardIndicators,
-            Irp->AssociatedIrp.SystemBuffer,
-            sizeof(KEYBOARD_INDICATOR_PARAMETERS));*/
+            RtlCopyMemory(&DeviceExtension->KeyboardIndicators,
+                          Irp->AssociatedIrp.SystemBuffer,
+                          sizeof(KEYBOARD_INDICATOR_PARAMETERS));
 
             //DPRINT("%x\n", DevExt->KeyboardIndicators.LedFlags);
-
-            Irp->IoStatus.Status = STATUS_SUCCESS;
+            kbd_setleds(DeviceExtension);
+            Status = STATUS_SUCCESS;
             break;
         case IOCTL_KEYBOARD_SET_TYPEMATIC:
             usb_dbg_print(DBGLVL_MAXIMUM, ("IOCTL_KEYBOARD_SET_TYPEMATIC\n"));
-            if (Stk->Parameters.DeviceIoControl.InputBufferLength <
+            if (Stack->Parameters.DeviceIoControl.InputBufferLength <
                 sizeof(KEYBOARD_TYPEMATIC_PARAMETERS)) {
                     usb_dbg_print(DBGLVL_MAXIMUM, ("Keyboard IOCTL_KEYBOARD_SET_TYPEMATIC "
                         "invalid buffer size\n"));
@@ -503,20 +481,25 @@
             Irp->AssociatedIrp.SystemBuffer,
             sizeof(KEYBOARD_TYPEMATIC_PARAMETERS));*/
 
-            Irp->IoStatus.Status = STATUS_SUCCESS;
+            Status = STATUS_SUCCESS;
             break;
         case IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION:
-            /* We should check the UnitID, but it's	kind of	pointless as
-            * all keyboards are supposed to have the same one
-            */
-            /*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
-            &IndicatorTranslation,
-            sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION));*/
-
-            Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+            if (Stack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION))
+            {
+                Status = STATUS_BUFFER_TOO_SMALL;
+            }
+            else
+            {
+                RtlCopyMemory(
+                    Irp->AssociatedIrp.SystemBuffer,
+                    &IndicatorTranslation,
+                    sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION));
+                Irp->IoStatus.Information = sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION);
+                Status = STATUS_SUCCESS;
+            }
             break;
         default:
-            Irp->IoStatus.Status = STATUS_SUCCESS;//STATUS_INVALID_DEVICE_REQUEST;
+            Status = STATUS_SUCCESS;//STATUS_INVALID_DEVICE_REQUEST;
             break;
         }
 intcontfailure:
@@ -529,6 +512,7 @@
         usb_dbg_print(DBGLVL_MINIMUM, ("Invalid internal device request!\n"));
     }
 
+    Irp->IoStatus.Status = Status;
     if (Status != STATUS_PENDING)
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
@@ -536,10 +520,10 @@
 }
 
 static NTSTATUS
-KeyboardCreateDevice(IN PDRIVER_OBJECT DriverObject)
+KeyboardCreateDevice(IN PDRIVER_OBJECT DriverObject, IN PKEYBOARD_DRVR_EXTENSION DriverExtension)
 {
     UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\KeyboardPortUSB");
-    PDEVEXT_HEADER DeviceExtension;
+    PKEYBOARD_DEVICE_EXTENSION DeviceExtension;
     PDEVICE_OBJECT Fdo;
     NTSTATUS Status;
 
@@ -551,7 +535,7 @@
     }
 
     Status = IoCreateDevice(DriverObject,
-        sizeof(DEVEXT_HEADER),
+        sizeof(KEYBOARD_DEVICE_EXTENSION),
         &DeviceName,
         FILE_DEVICE_KEYBOARD,
         FILE_DEVICE_SECURE_OPEN,
@@ -563,12 +547,14 @@
         usb_dbg_print(DBGLVL_MINIMUM, ("IoCreateDevice() for usb keyboard driver failed with status 0x%08lx\n", Status));
         return Status;
     }
-    DeviceExtension = (PDEVEXT_HEADER)Fdo->DeviceExtension;
-    RtlZeroMemory(DeviceExtension, sizeof(DEVEXT_HEADER));
-
-    DeviceExtension->dispatch = KbdDispatch;
-
-    KeyboardFdo = Fdo;
+    DeviceExtension = (PKEYBOARD_DEVICE_EXTENSION)Fdo->DeviceExtension;
+    RtlZeroMemory(DeviceExtension, sizeof(KEYBOARD_DEVICE_EXTENSION));
+
+    DeviceExtension->hdr.dispatch = KbdDispatch;
+    DeviceExtension->DriverExtension = DriverExtension;
+    DriverExtension->device_ext = DeviceExtension;
+
+    DeviceExtension->Fdo = Fdo;
     Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
     usb_dbg_print(DBGLVL_MEDIUM, ("Created keyboard Fdo: %p\n", Fdo));
 

Modified: trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.h?rev=39913&r1=39912&r2=39913&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/nt4compat/usbdriver/keyboard.h [iso-8859-1] Mon Mar  9 13:04:40 2009
@@ -3,16 +3,19 @@
 
 typedef struct _KEYBOARD_DRVR_EXTENSION
 {
-    //INTERRUPT_DATA_BLOCK    idb;
     PUSB_INTERFACE_DESC pif_desc;
-    UCHAR               if_idx, out_endp_idx, in_endp_idx, int_endp_idx;
-    PUSB_ENDPOINT_DESC  pout_endp_desc, pin_endp_desc, pint_endp_desc;
+    DEV_HANDLE dev_handle;
 
     PUSB_DEV_MANAGER dev_mgr;
+
     UCHAR kbd_data[8];
     UCHAR kbd_old[8];
+
+    UCHAR leds;
+    UCHAR leds_old;
+
+    struct _KEYBOARD_DEVICE_EXTENSION *device_ext; // back pointer
 } KEYBOARD_DRVR_EXTENSION, *PKEYBOARD_DRVR_EXTENSION;
-
 
 BOOLEAN
 kbd_driver_init(PUSB_DEV_MANAGER dev_mgr, PUSB_DRIVER pdriver);



More information about the Ros-diffs mailing list