Index: drivers/input/i8042prt/keyboard.c =================================================================== --- drivers/input/i8042prt/keyboard.c (revision 74227) +++ drivers/input/i8042prt/keyboard.c (working copy) @@ -369,7 +369,7 @@ DeviceExtension->KeyboardBuffer + KeysInBufferCopy, &KeysTransferred); - KeAcquireInterruptSpinLock(PortDeviceExtension->HighestDIRQLInterrupt); + Irql = KeAcquireInterruptSpinLock(PortDeviceExtension->HighestDIRQLInterrupt); DeviceExtension->KeysInBuffer -= KeysTransferred; KeReleaseInterruptSpinLock(PortDeviceExtension->HighestDIRQLInterrupt, Irql); } Index: drivers/input/i8042prt/pnp.c =================================================================== --- drivers/input/i8042prt/pnp.c (revision 74227) +++ drivers/input/i8042prt/pnp.c (working copy) @@ -303,8 +303,11 @@ return Status; } - if (DirqlMax == PortDeviceExtension->KeyboardInterrupt.Dirql) + if (!PortDeviceExtension->HighestDIRQLInterrupt || + (PortDeviceExtension->HighestDIRQLInterrupt && PortDeviceExtension->KeyboardInterrupt.Dirql > PortDeviceExtension->HighestDIRQLInterrupt->Irql)) + { PortDeviceExtension->HighestDIRQLInterrupt = PortDeviceExtension->KeyboardInterrupt.Object; + } PortDeviceExtension->Flags |= KEYBOARD_INITIALIZED; return STATUS_SUCCESS; } @@ -353,9 +356,11 @@ goto cleanup; } - if (DirqlMax == PortDeviceExtension->MouseInterrupt.Dirql) + if (!PortDeviceExtension->HighestDIRQLInterrupt || + (PortDeviceExtension->HighestDIRQLInterrupt && PortDeviceExtension->MouseInterrupt.Dirql > PortDeviceExtension->HighestDIRQLInterrupt->Irql)) + { PortDeviceExtension->HighestDIRQLInterrupt = PortDeviceExtension->MouseInterrupt.Object; - + } PortDeviceExtension->Flags |= MOUSE_INITIALIZED; Status = STATUS_SUCCESS; @@ -477,16 +482,23 @@ WARN_(I8042PRT, "i8042ConnectMouseInterrupt failed: %lx\n", Status); } - /* Start the mouse */ - Irql = KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt); - /* HACK: the mouse has already been reset in i8042DetectMouse. This second - reset prevents some touchpads/mice from working (Dell D531, D600). - See CORE-6901 */ - if (!(i8042HwFlags & FL_INITHACK)) + if (DeviceExtension->HighestDIRQLInterrupt) { - i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE); + /* Start the mouse */ + Irql = KeAcquireInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt); + /* HACK: the mouse has already been reset in i8042DetectMouse. This second + reset prevents some touchpads/mice from working (Dell D531, D600). + See CORE-6901 */ + if (!(i8042HwFlags & FL_INITHACK)) + { + i8042IsrWritePort(DeviceExtension, MOU_CMD_RESET, CTRL_WRITE_MOUSE); + } + KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, Irql); } - KeReleaseInterruptSpinLock(DeviceExtension->HighestDIRQLInterrupt, Irql); + else + { + WARN_(I8042PRT, "HighestDIRQLInterrupt is null\n"); + } } return Status;