1 /* 2 * ntdd8042.h 3 * 4 * i8042 IOCTL interface. 5 * 6 * This file is part of the w32api package. 7 * 8 * Contributors: 9 * Created by Casper S. Hornstrup <chorns@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 "ntddkbd.h" 27 #include "ntddmou.h" 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 #define IOCTL_INTERNAL_I8042_CONTROLLER_WRITE_BUFFER \ 34 CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF2, METHOD_NEITHER, FILE_ANY_ACCESS) 35 36 #define IOCTL_INTERNAL_I8042_HOOK_KEYBOARD \ 37 CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF0, METHOD_NEITHER, FILE_ANY_ACCESS) 38 39 #define IOCTL_INTERNAL_I8042_KEYBOARD_START_INFORMATION \ 40 CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF3, METHOD_NEITHER, FILE_ANY_ACCESS) 41 42 #define IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER \ 43 CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0FF1, METHOD_NEITHER, FILE_ANY_ACCESS) 44 45 #define IOCTL_INTERNAL_I8042_HOOK_MOUSE \ 46 CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF0, METHOD_NEITHER, FILE_ANY_ACCESS) 47 48 #define IOCTL_INTERNAL_I8042_MOUSE_START_INFORMATION \ 49 CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF3, METHOD_NEITHER, FILE_ANY_ACCESS) 50 51 #define IOCTL_INTERNAL_I8042_MOUSE_WRITE_BUFFER \ 52 CTL_CODE(FILE_DEVICE_MOUSE, 0x0FF1, METHOD_NEITHER, FILE_ANY_ACCESS) 53 54 #define I8042_POWER_SYS_BUTTON 0x0001 55 #define I8042_SLEEP_SYS_BUTTON 0x0002 56 #define I8042_WAKE_SYS_BUTTON 0x0004 57 #define I8042_SYS_BUTTONS (I8042_POWER_SYS_BUTTON | \ 58 I8042_SLEEP_SYS_BUTTON | \ 59 I8042_WAKE_SYS_BUTTON) 60 61 typedef enum _TRANSMIT_STATE { 62 Idle = 0, 63 SendingBytes 64 } TRANSMIT_STATE; 65 66 typedef struct _OUTPUT_PACKET { 67 PUCHAR Bytes; 68 ULONG CurrentByte; 69 ULONG ByteCount; 70 TRANSMIT_STATE State; 71 } OUTPUT_PACKET, *POUTPUT_PACKET; 72 73 typedef enum _KEYBOARD_SCAN_STATE { 74 Normal, 75 GotE0, 76 GotE1 77 } KEYBOARD_SCAN_STATE, *PKEYBOARD_SCAN_STATE; 78 79 typedef enum _MOUSE_STATE { 80 MouseIdle, 81 XMovement, 82 YMovement, 83 ZMovement, 84 MouseExpectingACK, 85 MouseResetting 86 } MOUSE_STATE, *PMOUSE_STATE; 87 88 typedef enum _MOUSE_RESET_SUBSTATE { 89 ExpectingReset, 90 ExpectingResetId, 91 ExpectingGetDeviceIdACK, 92 ExpectingGetDeviceIdValue, 93 ExpectingSetResolutionDefaultACK, 94 ExpectingSetResolutionDefaultValueACK, 95 ExpectingSetResolutionACK, 96 ExpectingSetResolutionValueACK, 97 ExpectingSetScaling1to1ACK, 98 ExpectingSetScaling1to1ACK2, 99 ExpectingSetScaling1to1ACK3, 100 ExpectingReadMouseStatusACK, 101 ExpectingReadMouseStatusByte1, 102 ExpectingReadMouseStatusByte2, 103 ExpectingReadMouseStatusByte3, 104 StartPnPIdDetection, 105 ExpectingLoopSetSamplingRateACK, 106 ExpectingLoopSetSamplingRateValueACK, 107 ExpectingPnpIdByte1, 108 ExpectingPnpIdByte2, 109 ExpectingPnpIdByte3, 110 ExpectingPnpIdByte4, 111 ExpectingPnpIdByte5, 112 ExpectingPnpIdByte6, 113 ExpectingPnpIdByte7, 114 EnableWheel, 115 Enable5Buttons, 116 ExpectingGetDeviceId2ACK, 117 ExpectingGetDeviceId2Value, 118 ExpectingSetSamplingRateACK, 119 ExpectingSetSamplingRateValueACK, 120 ExpectingEnableACK, 121 ExpectingFinalResolutionACK, 122 ExpectingFinalResolutionValueACK, 123 ExpectingGetDeviceIdDetectACK, 124 ExpectingGetDeviceIdDetectValue, 125 CustomHookStateMinimum = 100, 126 CustomHookStateMaximum = 999, 127 I8042ReservedMinimum = 1000 128 } MOUSE_RESET_SUBSTATE, *PMOUSE_RESET_SUBSTATE; 129 130 typedef struct _INTERNAL_I8042_START_INFORMATION { 131 ULONG Size; 132 PKINTERRUPT InterruptObject; 133 ULONG Reserved[8]; 134 } INTERNAL_I8042_START_INFORMATION, *PINTERNAL_I8042_START_INFORMATION; 135 136 typedef VOID 137 (NTAPI *PI8042_ISR_WRITE_PORT)( 138 IN PVOID Context, 139 IN UCHAR Value); 140 141 typedef VOID 142 (NTAPI *PI8042_QUEUE_PACKET)( 143 IN PVOID Context); 144 145 typedef NTSTATUS 146 (NTAPI *PI8042_SYNCH_READ_PORT) ( 147 IN PVOID Context, 148 OUT PUCHAR Value, 149 IN BOOLEAN WaitForACK); 150 151 typedef NTSTATUS 152 (NTAPI *PI8042_SYNCH_WRITE_PORT)( 153 IN PVOID Context, 154 IN UCHAR Value, 155 IN BOOLEAN WaitForACK); 156 157 158 typedef NTSTATUS 159 (NTAPI *PI8042_KEYBOARD_INITIALIZATION_ROUTINE)( 160 IN PVOID InitializationContext, 161 IN PVOID SynchFuncContext, 162 IN PI8042_SYNCH_READ_PORT ReadPort, 163 IN PI8042_SYNCH_WRITE_PORT WritePort, 164 OUT PBOOLEAN TurnTranslationOn); 165 166 typedef BOOLEAN 167 (NTAPI *PI8042_KEYBOARD_ISR)( 168 PVOID IsrContext, 169 PKEYBOARD_INPUT_DATA CurrentInput, 170 POUTPUT_PACKET CurrentOutput, 171 UCHAR StatusByte, 172 PUCHAR Byte, 173 PBOOLEAN ContinueProcessing, 174 PKEYBOARD_SCAN_STATE ScanState); 175 176 typedef struct _INTERNAL_I8042_HOOK_KEYBOARD { 177 OUT PVOID Context; 178 OUT PI8042_KEYBOARD_INITIALIZATION_ROUTINE InitializationRoutine; 179 OUT PI8042_KEYBOARD_ISR IsrRoutine; 180 IN PI8042_ISR_WRITE_PORT IsrWritePort; 181 IN PI8042_QUEUE_PACKET QueueKeyboardPacket; 182 IN PVOID CallContext; 183 } INTERNAL_I8042_HOOK_KEYBOARD, *PINTERNAL_I8042_HOOK_KEYBOARD; 184 185 typedef BOOLEAN 186 (NTAPI *PI8042_MOUSE_ISR)( 187 PVOID IsrContext, 188 PMOUSE_INPUT_DATA CurrentInput, 189 POUTPUT_PACKET CurrentOutput, 190 UCHAR StatusByte, 191 PUCHAR Byte, 192 PBOOLEAN ContinueProcessing, 193 PMOUSE_STATE MouseState, 194 PMOUSE_RESET_SUBSTATE ResetSubState); 195 196 typedef struct _INTERNAL_I8042_HOOK_MOUSE { 197 OUT PVOID Context; 198 OUT PI8042_MOUSE_ISR IsrRoutine; 199 IN PI8042_ISR_WRITE_PORT IsrWritePort; 200 IN PI8042_QUEUE_PACKET QueueMousePacket; 201 IN PVOID CallContext; 202 } INTERNAL_I8042_HOOK_MOUSE, *PINTERNAL_I8042_HOOK_MOUSE; 203 204 #ifdef __cplusplus 205 } 206 #endif 207 208 #endif /* _NTDD8042_ */ 209