[FASTFAT] Lock DirResource when modifying an entry on disk.
[reactos.git] / drivers / input / i8042prt / keyboard.c
index 209836a..198ec8f 100644 (file)
 
 #include "i8042prt.h"
 
+#include <poclass.h>
+#include <ndk/kdfuncs.h>
+
 #include <debug.h>
 
 /* GLOBALS *******************************************************************/
 
 static IO_WORKITEM_ROUTINE i8042PowerWorkItem;
+static KDEFERRED_ROUTINE i8042KbdDpcRoutine;
 
 /* This structure starts with the same layout as KEYBOARD_INDICATOR_TRANSLATION */
 typedef struct _LOCAL_KEYBOARD_INDICATOR_TRANSLATION {
@@ -193,10 +197,11 @@ i8042PowerWorkItem(
        PIRP WaitingIrp;
        NTSTATUS Status;
 
-       DeviceExtension = (PI8042_KEYBOARD_EXTENSION)Context;
-
        UNREFERENCED_PARAMETER(DeviceObject);
 
+       __analysis_assume(Context != NULL);
+       DeviceExtension = Context;
+
        /* See http://blogs.msdn.com/doronh/archive/2006/09/08/746961.aspx */
 
        /* Register GUID_DEVICE_SYS_BUTTON interface and report capability */
@@ -213,7 +218,7 @@ i8042PowerWorkItem(
 
                if (DeviceExtension->PowerInterfaceName.MaximumLength == 0)
                {
-                       /* We have never registred this interface ; do it */
+                       /* We have never registered this interface ; do it */
                        Status = IoRegisterDeviceInterface(
                                DeviceExtension->Common.Pdo,
                                &GUID_DEVICE_SYS_BUTTON,
@@ -242,7 +247,7 @@ i8042PowerWorkItem(
                                return;
                        }
                }
-               /* Enable the interface. This leads to receving a IOCTL_GET_SYS_BUTTON_CAPS,
+               /* Enable the interface. This leads to receiving a IOCTL_GET_SYS_BUTTON_CAPS,
                 * so we can report new capability */
                Status = IoSetDeviceInterfaceState(
                                &DeviceExtension->PowerInterfaceName,
@@ -328,7 +333,8 @@ i8042KbdDpcRoutine(
        UNREFERENCED_PARAMETER(SystemArgument1);
        UNREFERENCED_PARAMETER(SystemArgument2);
 
-       DeviceExtension = (PI8042_KEYBOARD_EXTENSION)DeferredContext;
+       __analysis_assume(DeferredContext != NULL);
+       DeviceExtension = DeferredContext;
        PortDeviceExtension = DeviceExtension->Common.PortDeviceExtension;
 
        if (HandlePowerKeys(DeviceExtension))
@@ -363,7 +369,10 @@ i8042KbdDpcRoutine(
                DeviceExtension->KeyboardBuffer + KeysInBufferCopy,
                &KeysTransferred);
 
-       KeAcquireInterruptSpinLock(PortDeviceExtension->HighestDIRQLInterrupt);
+       /* Validate that the callback didn't change the Irql. */
+       ASSERT(KeGetCurrentIrql() == Irql);
+
+       Irql = KeAcquireInterruptSpinLock(PortDeviceExtension->HighestDIRQLInterrupt);
        DeviceExtension->KeysInBuffer -= KeysTransferred;
        KeReleaseInterruptSpinLock(PortDeviceExtension->HighestDIRQLInterrupt, Irql);
 }
@@ -461,11 +470,11 @@ i8042KbdDeviceControl(
                }
        }
 
-       Irp->IoStatus.Status = Status;
-       if (Status == STATUS_PENDING)
-               IoMarkIrpPending(Irp);
-       else
+       if (Status != STATUS_PENDING)
+       {
+               Irp->IoStatus.Status = Status;
                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+       }
 
        return Status;
 }
@@ -649,9 +658,6 @@ cleanup:
                        Irp->IoStatus.Information = sizeof(KEYBOARD_ATTRIBUTES);
                        Status = STATUS_SUCCESS;
                        break;
-
-                       Status = STATUS_NOT_IMPLEMENTED;
-                       break;
                }
                case IOCTL_KEYBOARD_QUERY_TYPEMATIC:
                {
@@ -691,7 +697,7 @@ cleanup:
                {
                        TRACE_(I8042PRT, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_KEYBOARD_QUERY_INDICATORS\n");
 
-                       if (Stack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KEYBOARD_INDICATOR_PARAMETERS))
+                       if (Stack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KEYBOARD_INDICATOR_PARAMETERS))
                        {
                                Status = STATUS_BUFFER_TOO_SMALL;
                        }
@@ -735,16 +741,18 @@ cleanup:
                }
        }
 
-       Irp->IoStatus.Status = Status;
        if (Status != STATUS_PENDING)
+       {
+               Irp->IoStatus.Status = Status;
                IoCompleteRequest(Irp, IO_NO_INCREMENT);
+       }
        return Status;
 }
 
 /*
- * Call the customization hook. The ToReturn parameter is about wether
+ * Call the customization hook. The ToReturn parameter is about whether
  * we should go on with the interrupt. The return value is what
- * we should return (indicating to the system wether someone else
+ * we should return (indicating to the system whether someone else
  * should try to handle the interrupt)
  */
 static BOOLEAN
@@ -793,7 +801,8 @@ i8042KbdInterruptService(
 
        UNREFERENCED_PARAMETER(Interrupt);
 
-       DeviceExtension = (PI8042_KEYBOARD_EXTENSION)Context;
+       __analysis_assume(Context != NULL);
+       DeviceExtension = Context;
        PortDeviceExtension = DeviceExtension->Common.PortDeviceExtension;
        InputData = DeviceExtension->KeyboardBuffer + DeviceExtension->KeysInBuffer;
        Counter = PortDeviceExtension->Settings.PollStatusIterations;
@@ -851,13 +860,14 @@ i8042KbdInterruptService(
             if (InputData->MakeCode == 0x25)
             {
                 /* k - Breakpoint */
-                DbgBreakPoint();
+                DbgBreakPointWithStatus(DBG_STATUS_SYSRQ);
             }
             else if (InputData->MakeCode == 0x30)
             {
                 /* b - Bugcheck */
                 KeBugCheck(MANUALLY_INITIATED_CRASH);
             }
+#if defined(KDBG)
             else
             {
                            /* Send request to the kernel debugger.
@@ -870,6 +880,7 @@ i8042KbdInterruptService(
                                                 NULL,
                                                 KernelMode);
             }
+#endif
                }
        }