File:  [WindowsNT SDKs] / ntddk / src / input / i8042prt / i8042prt.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:31:12 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntddk-nov-1993, HEAD
Microsoft Windows NT Build 511 (DDK SDK) 11-01-1993

/*++

Copyright (c) 1990, 1991, 1992, 1993  Microsoft Corporation

Module Name:

    i8042prt.h

Abstract:

    These are the structures and defines that are used in the
    Intel i8042 port driver.

Revision History:

--*/

#ifndef _I8042PRT_
#define _I8042PRT_

#include <ntddkbd.h>
#include <ntddmou.h>
#include "kbdmou.h"
#include "i8042cfg.h"

//
// Define the timer values.
//

#define I8042_ASYNC_NO_TIMEOUT -1
#define I8042_ASYNC_TIMEOUT     3

//
// Define the default number of entries in the input data queue.
//

#define DATA_QUEUE_SIZE    100

//
// Define the default stall value.
//

#define I8042_STALL_DEFAULT      50

//
// Define the default "sync time" used to determine when the start
// of a new mouse data packet is expected.  The value is in units
// of 100 nanoseconds.
//

#define MOUSE_SYNCH_PACKET_100NS 10000000UL // 1 second, in 100 ns units

//
// Define booleans.
//

#define WAIT_FOR_ACKNOWLEDGE    TRUE
#define NO_WAIT_FOR_ACKNOWLEDGE FALSE
#define AND_OPERATION           TRUE
#define OR_OPERATION            FALSE
#define ENABLE_OPERATION        TRUE
#define DISABLE_OPERATION       FALSE

//
// Default keyboard scan code mode.
//

#define KEYBOARD_SCAN_CODE_SET 0x01

//
// Default number of function keys, number of LED indicators, and total
// number of keys located on the known types of keyboard.  
//

#define NUM_KNOWN_KEYBOARD_TYPES                   4
#define KEYBOARD_TYPE_DEFAULT                      4
#define KEYBOARD_INDICATORS_DEFAULT                0

typedef struct _KEYBOARD_TYPE_INFORMATION {
    USHORT NumberOfFunctionKeys;  
    USHORT NumberOfIndicators;
    USHORT NumberOfKeysTotal;
} KEYBOARD_TYPE_INFORMATION, *PKEYBOARD_TYPE_INFORMATION;

static const 
KEYBOARD_TYPE_INFORMATION KeyboardTypeInformation[NUM_KNOWN_KEYBOARD_TYPES] = {
    {10, 3, 84},     // PC/XT 83- 84-key keyboard (and compatibles)
    {12, 3, 102},    // Olivetti M24 102-key keyboard (and compatibles)
    {10, 3, 84},     // All AT type keyboards (84-86 keys)
    {12, 3, 101}     // Enhanced 101- or 102-key keyboards (and compatibles)
};

//
// Minimum, maximum, and default values for keyboard typematic rate and delay.
//

#define KEYBOARD_TYPEMATIC_RATE_MINIMUM     2   
#define KEYBOARD_TYPEMATIC_RATE_MAXIMUM    30
#define KEYBOARD_TYPEMATIC_RATE_DEFAULT    30
#define KEYBOARD_TYPEMATIC_DELAY_MINIMUM  250
#define KEYBOARD_TYPEMATIC_DELAY_MAXIMUM 1000
#define KEYBOARD_TYPEMATIC_DELAY_DEFAULT  250

//
// Define the 8042 mouse status bits.
//

#define LEFT_BUTTON_DOWN   0x01
#define RIGHT_BUTTON_DOWN  0x02
#define MIDDLE_BUTTON_DOWN 0x04
#define X_DATA_SIGN        0x10
#define Y_DATA_SIGN        0x20
#define X_OVERFLOW         0x40
#define Y_OVERFLOW         0x80

#define MOUSE_SIGN_OVERFLOW_MASK (X_DATA_SIGN | Y_DATA_SIGN | X_OVERFLOW | Y_OVERFLOW)

//
// Define the maximum positive and negative values for mouse motion.
//

#define MOUSE_MAXIMUM_POSITIVE_DELTA 0x000000FF
#define MOUSE_MAXIMUM_NEGATIVE_DELTA 0xFFFFFF00

//
// Default number of buttons and sample rate for the i8042 mouse.
//

#define MOUSE_NUMBER_OF_BUTTONS     2
#define MOUSE_SAMPLE_RATE           60

//
// Define the mouse resolution specifier.  Note that (2**MOUSE_RESOLUTION)
// specifies counts-per-millimeter.  Counts-per-centimeter is
// (counts-per-millimeter * 10).
//

#define MOUSE_RESOLUTION            3

//
// Defines for DeviceExtension->HardwarePresent.
//

#define KEYBOARD_HARDWARE_PRESENT  1
#define MOUSE_HARDWARE_PRESENT     2
#define BALLPOINT_HARDWARE_PRESENT 4

//
// Define macros for performing I/O on the 8042 command/status and data 
// registers.
//

#define I8X_PUT_COMMAND_BYTE(Address, Byte)                              \
    WRITE_PORT_UCHAR(Address, (UCHAR) Byte)
#define I8X_PUT_DATA_BYTE(Address, Byte)                                 \
    WRITE_PORT_UCHAR(Address, (UCHAR) Byte)
#define I8X_GET_STATUS_BYTE(Address)                                     \
    READ_PORT_UCHAR(Address)
#define I8X_GET_DATA_BYTE(Address)                                       \
    READ_PORT_UCHAR(Address)

//
// Define commands to the 8042 controller.
//

#define I8042_READ_CONTROLLER_COMMAND_BYTE	0x20
#define I8042_WRITE_CONTROLLER_COMMAND_BYTE	0x60
#define I8042_DISABLE_MOUSE_DEVICE              0xA7
#define I8042_ENABLE_MOUSE_DEVICE               0xA8
#define I8042_AUXILIARY_DEVICE_TEST             0xA9
#define I8042_KEYBOARD_DEVICE_TEST              0xAB
#define I8042_DISABLE_KEYBOARD_DEVICE           0xAD
#define I8042_ENABLE_KEYBOARD_DEVICE            0xAE
#define I8042_WRITE_TO_AUXILIARY_DEVICE         0xD4

//
// Define the 8042 Controller Command Byte.
//

#define CCB_ENABLE_KEYBOARD_INTERRUPT 0x01    
#define CCB_ENABLE_MOUSE_INTERRUPT    0x02    
#define CCB_DISABLE_KEYBOARD_DEVICE   0x10    
#define CCB_DISABLE_MOUSE_DEVICE      0x20    
#define CCB_KEYBOARD_TRANSLATE_MODE   0x40    


//
// Define the 8042 Controller Status Register bits.
//

#define OUTPUT_BUFFER_FULL       0x01       
#define INPUT_BUFFER_FULL        0x02      
#define MOUSE_OUTPUT_BUFFER_FULL 0x20    

//
// Define the 8042 responses.
//

#define ACKNOWLEDGE         0xFA	
#define RESEND              0xFE

//
// Define commands to the keyboard (through the 8042 data port).
//

#define SET_KEYBOARD_INDICATORS           0xED
#define SELECT_SCAN_CODE_SET              0xF0
#define READ_KEYBOARD_ID                  0xF2
#define SET_KEYBOARD_TYPEMATIC            0xF3
#define SET_ALL_TYPEMATIC_MAKE_BREAK      0xFA
#define KEYBOARD_RESET                    0xFF

//
// Define the keyboard responses.
//

#define KEYBOARD_COMPLETE_SUCCESS 0xAA
#define KEYBOARD_COMPLETE_FAILURE 0xFC
#define KEYBOARD_BREAK_CODE       0xF0
#define KEYBOARD_DEBUG_HOTKEY_ENH 0x37 // SysReq scan code for Enhanced Keyboard
#define KEYBOARD_DEBUG_HOTKEY_AT  0x54 // SysReq scan code for 84-key Keyboard

//
// Define commands to the mouse (through the 8042 data port).
//

#define SET_MOUSE_RESOLUTION              0xE8
#define SET_MOUSE_SAMPLING_RATE           0xF3
#define MOUSE_RESET                       0xFF
#define ENABLE_MOUSE_TRANSMISSION         0xF4

//
// Define the mouse responses.
//

#define MOUSE_COMPLETE      0xAA
#define MOUSE_ID_BYTE       0x00

//
// Define the i8042 controller input/output ports.
//

typedef enum _I8042_IO_PORT_TYPE {
    DataPort = 0,
    CommandPort,
    MaximumPortCount
    
} I8042_IO_PORT_TYPE;

//
// Define the device types attached to the i8042 controller.
//

typedef enum _I8042_DEVICE_TYPE {
    ControllerDeviceType,
    KeyboardDeviceType,
    MouseDeviceType,
    UndefinedDeviceType
} I8042_DEVICE_TYPE;

//
// Define the keyboard output states.
//

typedef enum _KEYBOARD_STATE {
    Idle,
    SendFirstByte,
    SendLastByte
} KEYBOARD_STATE;

//
// Define the keyboard scan code input states.
//

typedef enum _KEYBOARD_SCAN_STATE {
    Normal,
    GotE0,
    GotE1
} KEYBOARD_SCAN_STATE;

//
// Define the mouse states.
//

typedef enum _MOUSE_STATE {
    MouseIdle,
    XMovement,
    YMovement,
    MouseExpectingACK
} MOUSE_STATE;

//
// Define the keyboard set request packet.
//

typedef struct _KEYBOARD_SET_PACKET {
    USHORT State;
    UCHAR  FirstByte;
    UCHAR  LastByte;
} KEYBOARD_SET_PACKET, *PKEYBOARD_SET_PACKET;

//
// Intel i8042 configuration information.  
//

typedef struct _I8042_CONFIGURATION_INFORMATION {

    //
    // Bus interface type.
    //

    INTERFACE_TYPE InterfaceType;

    //
    // Bus Number.
    //

    ULONG BusNumber;

    //
    // The port/register resources used by this device.
    //

    CM_PARTIAL_RESOURCE_DESCRIPTOR PortList[MaximumPortCount];
    ULONG PortListCount;

    //
    // Keyboard interrupt resources.
    //

    CM_PARTIAL_RESOURCE_DESCRIPTOR KeyboardInterrupt;

    //
    // Mouse interrupt resources.
    //

    CM_PARTIAL_RESOURCE_DESCRIPTOR MouseInterrupt;

    //
    // Flag that indicates whether floating point context should be saved.
    //

    BOOLEAN FloatingSave;

    //
    // Number of retries allowed.
    //

    USHORT ResendIterations;

    //
    // Number of polling iterations allowed.
    //

    USHORT PollingIterations;

    //
    // Maximum number of polling iterations allowed.
    //

    USHORT PollingIterationsMaximum;

    //
    // Maximum number of times to check the Status register in
    // the ISR before deciding the interrupt is spurious.
    //

    USHORT PollStatusIterations;

    //
    // Microseconds to stall in KeStallExecutionProcessor calls.
    //

    USHORT StallMicroseconds;

    //
    // Keyboard attributes.
    //

    KEYBOARD_ATTRIBUTES KeyboardAttributes;

    //
    // Initial values of keyboard typematic rate and delay.
    //

    KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatCurrent;

    //
    // Current indicator (LED) setting.
    //

    KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators;

    //
    // Mouse attributes.
    //

    MOUSE_ATTRIBUTES MouseAttributes;

    USHORT MouseResolution;

} I8042_CONFIGURATION_INFORMATION, *PI8042_CONFIGURATION_INFORMATION;

//
// Define the keyboard portion of the port device extension.
//

typedef struct _PORT_KEYBOARD_EXTENSION {

    //
    // Keyboard class connection data.
    //

    CONNECT_DATA ConnectData;

    //
    // Number of input data items currently in the keyboard InputData queue.
    //

    ULONG InputCount;

    //
    // Start of the port keyboard input data queue (really a circular buffer).
    //

    PKEYBOARD_INPUT_DATA InputData;

    //
    // Insertion pointer for keyboard InputData.
    //

    PKEYBOARD_INPUT_DATA DataIn;

    //
    // Removal pointer for keyboard InputData.
    //

    PKEYBOARD_INPUT_DATA DataOut;

    //
    // Points one input packet past the end of the InputData buffer.
    //

    PKEYBOARD_INPUT_DATA DataEnd;

    //
    // Current keyboard input packet.
    //

    KEYBOARD_INPUT_DATA CurrentInput;

    //
    // Current keyboard scan input state.
    //

    KEYBOARD_SCAN_STATE CurrentScanState;

    //
    // Current keyboard output packet (for set requests).
    //

    KEYBOARD_SET_PACKET CurrentOutput;

    //
    // Current resend count.
    //

    USHORT ResendCount;

    //
    // Request sequence number (used for error logging).
    //
    
    ULONG SequenceNumber;

    //
    // Timer used to retry the ISR DPC routine when the class
    // driver is unable to consume all the port driver's data.
    //

    KTIMER DataConsumptionTimer;

    //
    // Indicates which keyboard port device this driver created (UnitId
    // is the suffix appended to the keyboard port basename for the
    // call to IoCreateDevice).
    //

    USHORT UnitId;

    //
    // Indicates whether it is okay to log overflow errors.
    //

    BOOLEAN OkayToLogOverflow;

} PORT_KEYBOARD_EXTENSION, *PPORT_KEYBOARD_EXTENSION;

//
// Define the mouse portion of the port device extension.
//

typedef struct _PORT_MOUSE_EXTENSION {

    //
    // Mouse class connection data.
    //

    CONNECT_DATA ConnectData;

    //
    // Number of input data items currently in the mouse InputData queue.
    //

    ULONG InputCount;

    //
    // Start of the port mouse input data queue (really a circular buffer).
    //

    PMOUSE_INPUT_DATA InputData;

    //
    // Insertion pointer for mouse InputData.
    //

    PMOUSE_INPUT_DATA DataIn;

    //
    // Removal pointer for mouse InputData.
    //

    PMOUSE_INPUT_DATA DataOut;

    //
    // Points one input packet past the end of the InputData buffer.
    //

    PMOUSE_INPUT_DATA DataEnd;

    //
    // Current mouse input packet.
    //

    MOUSE_INPUT_DATA CurrentInput;

    //
    // Current mouse input state.
    //

    USHORT InputState;

    //
    // Current mouse sign and overflow data.
    //

    UCHAR CurrentSignAndOverflow;

    //
    // Previous mouse sign and overflow data.
    //

    UCHAR PreviousSignAndOverflow;

    //
    // Previous mouse button data.
    //

    UCHAR PreviousButtons;

    //
    // Request sequence number (used for error logging).
    //
    
    ULONG SequenceNumber;

    //
    // Timer used to retry the ISR DPC routine when the class
    // driver is unable to consume all the port driver's data.
    //

    KTIMER DataConsumptionTimer;

    //
    // The tick count (since system boot) at which the mouse last interrupted.
    // Retrieved via KeQueryTickCount.  Used to determine whether a byte of
    // the mouse data packet has been lost.  Allows the driver to synch
    // up with the true mouse input state.
    //

    LARGE_INTEGER PreviousTick;

    //
    // Indicates which pointer port device this driver created (UnitId
    // is the suffix appended to the pointer port basename for the
    // call to IoCreateDevice).
    //

    USHORT UnitId;

    //
    // Indicates whether it is okay to log overflow errors.
    //

    BOOLEAN OkayToLogOverflow;

    //
    // Number of interval timer ticks to wait before deciding that the 
    // next mouse interrupt is for the start of a new packet.  Used to
    // synch up again if a byte of the mouse packet gets lost.
    //

    ULONG SynchTickCount;
    
} PORT_MOUSE_EXTENSION, *PPORT_MOUSE_EXTENSION;

//
// Port device extension.
//

typedef struct _DEVICE_EXTENSION {

    //
    // Indicate which hardware is actually present (keyboard and/or mouse).
    //

    ULONG HardwarePresent;

    //
    // Reference count for number of keyboard enables.
    //

    LONG KeyboardEnableCount;

    //
    // Reference count for number of mouse enables.
    //

    LONG MouseEnableCount;

    //
    // Pointer to the device object.
    //

    PDEVICE_OBJECT DeviceObject;

    //
    // The mapped addresses for this device's registers.
    //

    PUCHAR DeviceRegisters[MaximumPortCount];

    //
    // Keyboard-specific port connection data.
    //
    
    PORT_KEYBOARD_EXTENSION KeyboardExtension;

    //
    // Mouse-specific port connection data.
    //
    
    PORT_MOUSE_EXTENSION MouseExtension;

    //
    // Port configuration information.
    //

    I8042_CONFIGURATION_INFORMATION Configuration;

    //
    // i8042 keyboard and mouse interrupt objects.
    //

    PKINTERRUPT KeyboardInterruptObject;
    PKINTERRUPT MouseInterruptObject;
    KSPIN_LOCK SharedInterruptSpinLock;

    //
    // DPC queue for completion of requests that fail by exceeding
    // the maximum number of retries.
    //

    KDPC RetriesExceededDpc;

    //
    // DPC queue for logging overrun and internal driver errors.
    //

    KDPC ErrorLogDpc;

    //
    // Keyboard ISR DPC queue.
    //

    KDPC KeyboardIsrDpc;

    //
    // Keyboard ISR DPC recall queue.
    //

    KDPC KeyboardIsrDpcRetry;

    //
    // Used by the ISR and the ISR DPC (in I8xDpcVariableOperation calls)
    // to control processing by the ISR DPC.
    //

    LONG DpcInterlockKeyboard;

    //
    // Mouse ISR DPC queue.
    //

    KDPC MouseIsrDpc;

    //
    // Mouse ISR DPC recall queue.
    //

    KDPC MouseIsrDpcRetry;

    //
    // Used by the ISR and the ISR DPC (in I8xDpcVariableOperation calls)
    // to control processing by the ISR DPC.
    //

    LONG DpcInterlockMouse;

    //
    // DPC queue for command timeouts.
    //

    KDPC TimeOutDpc;

    //
    // Timer used to timeout i8042 commands.
    //

    KTIMER CommandTimer;

    //
    // Timer count used by the command time out routine.
    //

    LONG TimerCount;

    //
    // Set at intialization to indicate that the register
    // addresses must be unmapped when the driver is unloaded.
    //

    BOOLEAN UnmapRegistersRequired;

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

//
// Define the port InitializeDataQueue context structure.
//

typedef struct _I8042_INITIALIZE_DATA_CONTEXT {
    IN PDEVICE_EXTENSION DeviceExtension;
    IN CCHAR DeviceType;
} I8042_INITIALIZE_DATA_CONTEXT, *PI8042_INITIALIZE_DATA_CONTEXT;

//
// Define the port TransmitControllerCommandByte context structure.
//

typedef struct _I8042_TRANSMIT_CCB_CONTEXT {
    IN ULONG HardwareDisableEnableMask;
    IN BOOLEAN AndOperation; 
    IN UCHAR ByteMask;
    OUT NTSTATUS Status;
} I8042_TRANSMIT_CCB_CONTEXT, *PI8042_TRANSMIT_CCB_CONTEXT;

//
// Define the port DeviceEnableDisable context structure.
//

typedef struct _I8042_DEVICE_ENABLE_DISABLE_CONTEXT {
    IN PDEVICE_EXTENSION DeviceExtension;
    IN ULONG EnableMask;
    IN BOOLEAN AndOperation;
    OUT NTSTATUS Status;
} I8042_DEVICE_ENABLE_DISABLE_CONTEXT, 
  *PI8042_DEVICE_ENABLE_DISABLE_CONTEXT;

//
// Define the port Get/SetDataQueuePointer context structures.
//

typedef struct _GET_DATA_POINTER_CONTEXT {
    IN PDEVICE_EXTENSION DeviceExtension;
    IN CCHAR DeviceType;
    OUT PVOID DataIn;
    OUT PVOID DataOut;
    OUT ULONG InputCount;
} GET_DATA_POINTER_CONTEXT, *PGET_DATA_POINTER_CONTEXT;

typedef struct _SET_DATA_POINTER_CONTEXT {
    IN PDEVICE_EXTENSION DeviceExtension;
    IN CCHAR DeviceType;
    IN ULONG InputCount;
    IN PVOID DataOut;
} SET_DATA_POINTER_CONTEXT, *PSET_DATA_POINTER_CONTEXT;

//
// Define the port timer context structure.
//
 
typedef struct _TIMER_CONTEXT {
    IN PDEVICE_OBJECT DeviceObject;
    IN PLONG TimerCounter;
    OUT LONG NewTimerCount;
} TIMER_CONTEXT, *PTIMER_CONTEXT;

//
// Define the port KeyboardInitiate context structure.
//

typedef struct _KEYBOARD_INITIATE_CONTEXT {
    IN PDEVICE_OBJECT DeviceObject;
    IN UCHAR FirstByte;
    IN UCHAR LastByte;
} KEYBOARD_INITIATE_CONTEXT, *PKEYBOARD_INITIATE_CONTEXT;

//
// Statically allocate the (known) scancode-to-indicator-light mapping.
// This information is returned by the 
// IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION device control request.
//

#define KEYBOARD_NUMBER_OF_INDICATORS              3

static const INDICATOR_LIST IndicatorList[KEYBOARD_NUMBER_OF_INDICATORS] = {
        {0x3A, KEYBOARD_CAPS_LOCK_ON},
        {0x45, KEYBOARD_NUM_LOCK_ON},
        {0x46, KEYBOARD_SCROLL_LOCK_ON}};

//
// Define the context structure and operations for I8xDpcVariableOperation.
//

typedef enum _OPERATION_TYPE {
        IncrementOperation,
        DecrementOperation,
        WriteOperation,
        ReadOperation
} OPERATION_TYPE;

typedef struct _VARIABLE_OPERATION_CONTEXT {
    IN PLONG VariableAddress;
    IN OPERATION_TYPE Operation;
    IN OUT PLONG NewValue;
} VARIABLE_OPERATION_CONTEXT, *PVARIABLE_OPERATION_CONTEXT;

//
// Function prototypes.
//


NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    );

VOID
I8042CompletionDpc(
    IN PKDPC Dpc,
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

VOID
I8042ErrorLogDpc(
    IN PKDPC Dpc,
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

NTSTATUS
I8042Flush(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
I8042InternalDeviceControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

BOOLEAN
I8042KeyboardInterruptService(
    IN PKINTERRUPT Interrupt,
    IN PVOID Context
    );

VOID
I8042KeyboardIsrDpc(
    IN PKDPC Dpc,
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

BOOLEAN
I8042MouseInterruptService(
    IN PKINTERRUPT Interrupt,
    IN PVOID Context
    );

VOID
I8042MouseIsrDpc(
    IN PKDPC Dpc,
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

NTSTATUS
I8042OpenCloseDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

VOID
I8042RetriesExceededDpc(
    IN PKDPC Dpc,
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

VOID
I8042StartIo(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

VOID
I8042TimeOutDpc(
    IN PKDPC Dpc,
    IN PDEVICE_OBJECT DeviceObject,
    IN PVOID SystemContext1,
    IN PVOID SystemContext2
    );

VOID
I8042Unload(
    IN PDRIVER_OBJECT DriverObject
    );

VOID
I8xBuildResourceList(
    IN PDEVICE_EXTENSION DeviceExtension,
    OUT PCM_RESOURCE_LIST *ResourceList,
    OUT PULONG ResourceListSize 
    );

UCHAR
I8xConvertTypematicParameters(
    IN USHORT Rate,
    IN USHORT Delay
    );

#if DBG

VOID
I8xDebugPrint(
    ULONG DebugPrintLevel,
    PCCHAR DebugMessage,
    ...
    );

extern ULONG i8042Debug;
#define I8xPrint(x) I8xDebugPrint x
#else
#define I8xPrint(x)
#endif

VOID
I8xDecrementTimer(
    IN PTIMER_CONTEXT Context
    );

VOID
I8xDeviceEnableDisable(
    IN PVOID Context
    );

VOID
I8xDpcVariableOperation(
    IN  PVOID Context
    );

VOID
I8xDrainOutputBuffer(
    IN PUCHAR DataAddress,
    IN PUCHAR CommandAddress
    );

VOID
I8xGetByteAsynchronous(
    IN CCHAR DeviceType,
    IN PDEVICE_EXTENSION DeviceExtension,
    OUT PUCHAR Byte
    );

NTSTATUS
I8xGetBytePolled(
    IN CCHAR DeviceType,
    IN PDEVICE_EXTENSION DeviceExtension,
    OUT PUCHAR Byte
    );

NTSTATUS
I8xGetControllerCommand(
    IN ULONG HardwareDisableEnableMask,
    IN PDEVICE_EXTENSION DeviceExtension,
    OUT PUCHAR Byte
    );

VOID
I8xGetDataQueuePointer(
    IN PVOID Context
    );

VOID
I8xInitializeDataQueue(
    IN PVOID Context
    );

VOID
I8xInitializeHardware(
    IN PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
I8xInitializeKeyboard(
    IN PDEVICE_OBJECT DeviceObject
    );

NTSTATUS
I8xInitializeMouse(
    IN PDEVICE_OBJECT DeviceObject
    );

VOID
I8xKeyboardConfiguration(
    IN PDEVICE_EXTENSION DeviceExtension,
    IN PUNICODE_STRING RegistryPath,
    IN PUNICODE_STRING KeyboardDeviceName,
    IN PUNICODE_STRING PointerDeviceName
    );

VOID
I8xKeyboardInitiateIo(
    IN PVOID Context
    );

VOID
I8xKeyboardInitiateWrapper(
    IN PVOID Context
    );

NTSTATUS 
I8xKeyboardPeripheralCallout(
    IN PVOID Context,
    IN PUNICODE_STRING PathName,
    IN INTERFACE_TYPE BusType,
    IN ULONG BusNumber,
    IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
    IN CONFIGURATION_TYPE ControllerType,
    IN ULONG ControllerNumber,
    IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
    IN CONFIGURATION_TYPE PeripheralType,
    IN ULONG PeripheralNumber,
    IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
    );

VOID
I8xLogError(
    IN PDEVICE_OBJECT DeviceObject,
    IN NTSTATUS ErrorCode,
    IN ULONG UniqueErrorValue,
    IN NTSTATUS FinalStatus,
    IN PULONG DumpData,
    IN ULONG DumpCount
    );

VOID
I8xMouseConfiguration(
    IN PDEVICE_EXTENSION DeviceExtension,
    IN PUNICODE_STRING RegistryPath,
    IN PUNICODE_STRING KeyboardDeviceName,
    IN PUNICODE_STRING PointerDeviceName
    );

NTSTATUS
I8xMouseEnableTransmission(
    IN PDEVICE_OBJECT DeviceObject
    );

NTSTATUS 
I8xMousePeripheralCallout(
    IN PVOID Context,
    IN PUNICODE_STRING PathName,
    IN INTERFACE_TYPE BusType,
    IN ULONG BusNumber,
    IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
    IN CONFIGURATION_TYPE ControllerType,
    IN ULONG ControllerNumber,
    IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
    IN CONFIGURATION_TYPE PeripheralType,
    IN ULONG PeripheralNumber,
    IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
    );

VOID
I8xPutByteAsynchronous(
    IN CCHAR PortType,
    IN PDEVICE_EXTENSION DeviceExtension,
    IN UCHAR Byte
    );

NTSTATUS
I8xPutBytePolled(
    IN CCHAR PortType,
    IN BOOLEAN WaitForAcknowledge,
    IN CCHAR AckDeviceType,
    IN PDEVICE_EXTENSION DeviceExtension,
    IN UCHAR Byte
    );

NTSTATUS
I8xPutControllerCommand(
    IN PDEVICE_EXTENSION DeviceExtension,
    IN UCHAR Byte
    );

VOID
I8xServiceParameters(
    IN PDEVICE_EXTENSION DeviceExtension,
    IN PUNICODE_STRING RegistryPath,
    IN PUNICODE_STRING KeyboardDeviceName,
    IN PUNICODE_STRING PointerDeviceName
    );

VOID
I8xSetDataQueuePointer(
    IN PVOID Context
    );

VOID
I8xTransmitControllerCommand(
    IN PDEVICE_EXTENSION DeviceExtension,
    IN PVOID Context
    );

BOOLEAN
I8xWriteDataToKeyboardQueue(
    IN PPORT_KEYBOARD_EXTENSION KeyboardExtension,
    IN PKEYBOARD_INPUT_DATA InputData
    );

BOOLEAN
I8xWriteDataToMouseQueue(
    IN PPORT_MOUSE_EXTENSION MouseExtension,
    IN PMOUSE_INPUT_DATA InputData
    );

#endif // _I8042PRT_

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.