Home | History | Annotate | Download | only in include
      1 /*
      2  * ntdd8042.h
      3  *
      4  * i8042 IOCTL interface.
      5  *
      6  * This file is part of the mingw-w64 runtime package.
      7  * No warranty is given; refer to the file DISCLAIMER within this package.
      8  *
      9  * Initial contributor is Casper S. Hornstrup <chorns (at) users.sourceforge.net>
     10  *
     11  * THIS SOFTWARE IS NOT COPYRIGHTED
     12  *
     13  * This source code is offered for use in the public domain. You may
     14  * use, modify or distribute it freely.
     15  *
     16  * This code is distributed in the hope that it will be useful but
     17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
     18  * DISCLAIMED. This includes but is not limited to warranties of
     19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     20  *
     21  */
     22 
     23 #ifndef _NTDD8042_
     24 #define _NTDD8042_
     25 
     26 #include <winapifamily.h>
     27 
     28 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
     29 
     30 #include "ntddkbd.h"
     31 #include "ntddmou.h"
     32 
     33 #ifdef __cplusplus
     34 extern "C" {
     35 #endif
     36 
     37 #define IOCTL_INTERNAL_I8042_CONTROLLER_WRITE_BUFFER \
     38   CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF2, METHOD_NEITHER, FILE_ANY_ACCESS)
     39 
     40 #define IOCTL_INTERNAL_I8042_HOOK_KEYBOARD \
     41   CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF0, METHOD_NEITHER, FILE_ANY_ACCESS)
     42 
     43 #define IOCTL_INTERNAL_I8042_KEYBOARD_START_INFORMATION \
     44   CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF3, METHOD_NEITHER, FILE_ANY_ACCESS)
     45 
     46 #define IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER \
     47   CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF1, METHOD_NEITHER, FILE_ANY_ACCESS)
     48 
     49 #define IOCTL_INTERNAL_I8042_HOOK_MOUSE \
     50   CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF0, METHOD_NEITHER, FILE_ANY_ACCESS)
     51 
     52 #define IOCTL_INTERNAL_I8042_MOUSE_START_INFORMATION \
     53   CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF3, METHOD_NEITHER, FILE_ANY_ACCESS)
     54 
     55 #define IOCTL_INTERNAL_I8042_MOUSE_WRITE_BUFFER \
     56   CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF1, METHOD_NEITHER, FILE_ANY_ACCESS)
     57 
     58 #define I8042_POWER_SYS_BUTTON            0x0001
     59 #define I8042_SLEEP_SYS_BUTTON            0x0002
     60 #define I8042_WAKE_SYS_BUTTON             0x0004
     61 #define I8042_SYS_BUTTONS                 (I8042_POWER_SYS_BUTTON | \
     62                                            I8042_SLEEP_SYS_BUTTON | \
     63                                            I8042_WAKE_SYS_BUTTON)
     64 
     65 typedef enum _TRANSMIT_STATE {
     66   Idle = 0,
     67   SendingBytes
     68 } TRANSMIT_STATE;
     69 
     70 typedef struct _OUTPUT_PACKET {
     71   PUCHAR  Bytes;
     72   ULONG  CurrentByte;
     73   ULONG  ByteCount;
     74   TRANSMIT_STATE  State;
     75 } OUTPUT_PACKET, *POUTPUT_PACKET;
     76 
     77 typedef enum _KEYBOARD_SCAN_STATE {
     78   Normal,
     79   GotE0,
     80   GotE1
     81 } KEYBOARD_SCAN_STATE, *PKEYBOARD_SCAN_STATE;
     82 
     83 typedef enum _MOUSE_STATE {
     84   MouseIdle,
     85   XMovement,
     86   YMovement,
     87   ZMovement,
     88   MouseExpectingACK,
     89   MouseResetting
     90 } MOUSE_STATE, *PMOUSE_STATE;
     91 
     92 typedef enum _MOUSE_RESET_SUBSTATE {
     93 	ExpectingReset,
     94 	ExpectingResetId,
     95 	ExpectingGetDeviceIdACK,
     96 	ExpectingGetDeviceIdValue,
     97 	ExpectingSetResolutionDefaultACK,
     98 	ExpectingSetResolutionDefaultValueACK,
     99 	ExpectingSetResolutionACK,
    100 	ExpectingSetResolutionValueACK,
    101 	ExpectingSetScaling1to1ACK,
    102 	ExpectingSetScaling1to1ACK2,
    103 	ExpectingSetScaling1to1ACK3,
    104 	ExpectingReadMouseStatusACK,
    105 	ExpectingReadMouseStatusByte1,
    106 	ExpectingReadMouseStatusByte2,
    107 	ExpectingReadMouseStatusByte3,
    108 	StartPnPIdDetection,
    109 	ExpectingLoopSetSamplingRateACK,
    110 	ExpectingLoopSetSamplingRateValueACK,
    111 	ExpectingPnpIdByte1,
    112 	ExpectingPnpIdByte2,
    113 	ExpectingPnpIdByte3,
    114 	ExpectingPnpIdByte4,
    115 	ExpectingPnpIdByte5,
    116 	ExpectingPnpIdByte6,
    117 	ExpectingPnpIdByte7,
    118 	EnableWheel,
    119 	Enable5Buttons,
    120 	ExpectingGetDeviceId2ACK,
    121 	ExpectingGetDeviceId2Value,
    122 	ExpectingSetSamplingRateACK,
    123 	ExpectingSetSamplingRateValueACK,
    124 	ExpectingEnableACK,
    125 	ExpectingFinalResolutionACK,
    126 	ExpectingFinalResolutionValueACK,
    127 	ExpectingGetDeviceIdDetectACK,
    128 	ExpectingGetDeviceIdDetectValue,
    129 	CustomHookStateMinimum = 100,
    130 	CustomHookStateMaximum = 999,
    131 	I8042ReservedMinimum = 1000
    132 } MOUSE_RESET_SUBSTATE, *PMOUSE_RESET_SUBSTATE;
    133 
    134 typedef struct _INTERNAL_I8042_START_INFORMATION {
    135   ULONG  Size;
    136   PKINTERRUPT  InterruptObject;
    137   ULONG  Reserved[8];
    138 } INTERNAL_I8042_START_INFORMATION, *PINTERNAL_I8042_START_INFORMATION;
    139 
    140 typedef VOID
    141 (NTAPI *PI8042_ISR_WRITE_PORT)(
    142   PVOID  Context,
    143   UCHAR  Value);
    144 
    145 typedef VOID
    146 (NTAPI *PI8042_QUEUE_PACKET)(
    147   PVOID  Context);
    148 
    149 typedef NTSTATUS
    150 (NTAPI *PI8042_SYNCH_READ_PORT) (
    151   PVOID  Context,
    152   PUCHAR  Value,
    153   BOOLEAN  WaitForACK);
    154 
    155 typedef NTSTATUS
    156 (NTAPI *PI8042_SYNCH_WRITE_PORT)(
    157   PVOID  Context,
    158   UCHAR  Value,
    159   BOOLEAN  WaitForACK);
    160 
    161 
    162 typedef NTSTATUS
    163 (NTAPI *PI8042_KEYBOARD_INITIALIZATION_ROUTINE)(
    164   PVOID  InitializationContext,
    165   PVOID  SynchFuncContext,
    166   PI8042_SYNCH_READ_PORT  ReadPort,
    167   PI8042_SYNCH_WRITE_PORT  WritePort,
    168   PBOOLEAN  TurnTranslationOn);
    169 
    170 typedef BOOLEAN
    171 (NTAPI *PI8042_KEYBOARD_ISR)(
    172   PVOID  IsrContext,
    173   PKEYBOARD_INPUT_DATA  CurrentInput,
    174   POUTPUT_PACKET  CurrentOutput,
    175   UCHAR  StatusByte,
    176   PUCHAR  Byte,
    177   PBOOLEAN  ContinueProcessing,
    178   PKEYBOARD_SCAN_STATE  ScanState);
    179 
    180 typedef struct _INTERNAL_I8042_HOOK_KEYBOARD {
    181 	PVOID  Context;
    182 	PI8042_KEYBOARD_INITIALIZATION_ROUTINE  InitializationRoutine;
    183 	PI8042_KEYBOARD_ISR  IsrRoutine;
    184 	PI8042_ISR_WRITE_PORT  IsrWritePort;
    185 	PI8042_QUEUE_PACKET  QueueKeyboardPacket;
    186 	PVOID  CallContext;
    187 } INTERNAL_I8042_HOOK_KEYBOARD, *PINTERNAL_I8042_HOOK_KEYBOARD;
    188 
    189 typedef BOOLEAN
    190 (NTAPI *PI8042_MOUSE_ISR)(
    191   PVOID  IsrContext,
    192   PMOUSE_INPUT_DATA  CurrentInput,
    193   POUTPUT_PACKET  CurrentOutput,
    194   UCHAR  StatusByte,
    195   PUCHAR  Byte,
    196   PBOOLEAN  ContinueProcessing,
    197   PMOUSE_STATE  MouseState,
    198   PMOUSE_RESET_SUBSTATE  ResetSubState);
    199 
    200 typedef struct _INTERNAL_I8042_HOOK_MOUSE {
    201   PVOID  Context;
    202   PI8042_MOUSE_ISR  IsrRoutine;
    203   PI8042_ISR_WRITE_PORT  IsrWritePort;
    204   PI8042_QUEUE_PACKET  QueueMousePacket;
    205   PVOID  CallContext;
    206 } INTERNAL_I8042_HOOK_MOUSE, *PINTERNAL_I8042_HOOK_MOUSE;
    207 
    208 #ifdef __cplusplus
    209 }
    210 #endif
    211 
    212 #endif
    213 
    214 #endif /* _NTDD8042_ */
    215