#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 {
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 */
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,
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,
UNREFERENCED_PARAMETER(SystemArgument1);
UNREFERENCED_PARAMETER(SystemArgument2);
- DeviceExtension = (PI8042_KEYBOARD_EXTENSION)DeferredContext;
+ __analysis_assume(DeferredContext != NULL);
+ DeviceExtension = DeferredContext;
PortDeviceExtension = DeviceExtension->Common.PortDeviceExtension;
if (HandlePowerKeys(DeviceExtension))
}
}
- 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;
}
+VOID
+NTAPI
+i8042InitializeKeyboardAttributes(
+ PI8042_KEYBOARD_EXTENSION DeviceExtension)
+{
+ PPORT_DEVICE_EXTENSION PortDeviceExtension;
+ PI8042_SETTINGS Settings;
+ PKEYBOARD_ATTRIBUTES KeyboardAttributes;
+
+ PortDeviceExtension = DeviceExtension->Common.PortDeviceExtension;
+ Settings = &PortDeviceExtension->Settings;
+
+ KeyboardAttributes = &DeviceExtension->KeyboardAttributes;
+
+ KeyboardAttributes->KeyboardIdentifier.Type = (UCHAR)Settings->OverrideKeyboardType;
+ KeyboardAttributes->KeyboardIdentifier.Subtype = (UCHAR)Settings->OverrideKeyboardSubtype;
+ KeyboardAttributes->NumberOfFunctionKeys = 4;
+ KeyboardAttributes->NumberOfIndicators = 3;
+ KeyboardAttributes->NumberOfKeysTotal = 101;
+ KeyboardAttributes->InputDataQueueLength = Settings->KeyboardDataQueueSize;
+ KeyboardAttributes->KeyRepeatMinimum.UnitId = 0;
+ KeyboardAttributes->KeyRepeatMinimum.Rate = (USHORT)Settings->SampleRate;
+ KeyboardAttributes->KeyRepeatMinimum.Delay = 0;
+ KeyboardAttributes->KeyRepeatMinimum.UnitId = 0;
+ KeyboardAttributes->KeyRepeatMinimum.Rate = (USHORT)Settings->SampleRate;
+ KeyboardAttributes->KeyRepeatMinimum.Delay = 0;
+}
+
/*
* Runs the keyboard IOCTL_INTERNAL dispatch.
*/
DeviceExtension->Common.PortDeviceExtension->KeyboardExtension = DeviceExtension;
DeviceExtension->Common.PortDeviceExtension->Flags |= KEYBOARD_CONNECTED;
+ i8042InitializeKeyboardAttributes(DeviceExtension);
+
IoMarkIrpPending(Irp);
/* FIXME: DeviceExtension->KeyboardHook.IsrWritePort = ; */
DeviceExtension->KeyboardHook.QueueKeyboardPacket = i8042KbdQueuePacket;
}
case IOCTL_KEYBOARD_QUERY_ATTRIBUTES:
{
- DPRINT1("IOCTL_KEYBOARD_QUERY_ATTRIBUTES not implemented\n");
-#if 0
+ PKEYBOARD_ATTRIBUTES KeyboardAttributes;
+
/* FIXME: KeyboardAttributes are not initialized anywhere */
TRACE_(I8042PRT, "IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_KEYBOARD_QUERY_ATTRIBUTES\n");
if (Stack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KEYBOARD_ATTRIBUTES))
break;
}
- *(PKEYBOARD_ATTRIBUTES) Irp->AssociatedIrp.SystemBuffer = DeviceExtension->KeyboardAttributes;
+ KeyboardAttributes = Irp->AssociatedIrp.SystemBuffer;
+ *KeyboardAttributes = DeviceExtension->KeyboardAttributes;
+
Irp->IoStatus.Information = sizeof(KEYBOARD_ATTRIBUTES);
Status = STATUS_SUCCESS;
break;
-#endif
- Status = STATUS_NOT_IMPLEMENTED;
- break;
}
case IOCTL_KEYBOARD_QUERY_TYPEMATIC:
{
{
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;
}
}
}
- 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
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;
else if (DeviceExtension->TabPressed)
{
DeviceExtension->TabPressed = FALSE;
-
+
/* Check which action to do */
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.
+ /* Send request to the kernel debugger.
* Unknown requests will be ignored. */
KdSystemDebugControl(' soR',
(PVOID)(ULONG_PTR)InputData->MakeCode,
NULL,
KernelMode);
}
+#endif
}
}