12 /*-----------------------------------------------------
14 * --------------------------------------------------*/
16 #define I8042PRT_TAG '2408'
27 typedef struct _I8042_SETTINGS
29 /* Registry settings */
30 ULONG KeyboardDataQueueSize
; /* done */
31 UNICODE_STRING KeyboardDeviceBaseName
;
32 ULONG MouseDataQueueSize
; /* done */
33 ULONG MouseResolution
;
34 ULONG MouseSynchIn100ns
;
35 ULONG NumberOfButtons
;
36 UNICODE_STRING PointerDeviceBaseName
;
37 ULONG PollStatusIterations
; /* done */
38 ULONG OverrideKeyboardType
;
39 ULONG OverrideKeyboardSubtype
;
40 ULONG PollingIterations
; /* done */
41 ULONG PollingIterationsMaximum
;
42 ULONG ResendIterations
; /* done */
44 ULONG CrashOnCtrlScroll
; /* done */
45 } I8042_SETTINGS
, *PI8042_SETTINGS
;
47 typedef enum _MOUSE_TIMEOUT_STATE
52 } MOUSE_TIMEOUT_STATE
, *PMOUSE_TIMEOUT_STATE
;
54 typedef struct _INTERRUPT_DATA
59 KINTERRUPT_MODE InterruptMode
;
60 BOOLEAN ShareInterrupt
;
62 } INTERRUPT_DATA
, *PINTERRUPT_DATA
;
64 #define WHEEL_DELTA 120
66 struct _I8042_KEYBOARD_EXTENSION
;
67 typedef struct _I8042_KEYBOARD_EXTENSION
*PI8042_KEYBOARD_EXTENSION
;
68 struct _I8042_MOUSE_EXTENSION
;
69 typedef struct _I8042_MOUSE_EXTENSION
*PI8042_MOUSE_EXTENSION
;
71 /* PORT_DEVICE_EXTENSION.Flags */
72 #define KEYBOARD_PRESENT 0x01 /* A keyboard is attached */
73 #define KEYBOARD_CONNECTED 0x02 /* Keyboard received IOCTL_INTERNAL_KEYBOARD_CONNECT */
74 #define KEYBOARD_STARTED 0x04 /* Keyboard FDO received IRP_MN_START_DEVICE */
75 #define KEYBOARD_INITIALIZED 0x08 /* Keyboard interrupt is connected */
76 #define MOUSE_PRESENT 0x10 /* A mouse is attached */
77 #define MOUSE_CONNECTED 0x20 /* Mouse received IOCTL_INTERNAL_MOUSE_CONNECT */
78 #define MOUSE_STARTED 0x40 /* Mouse FDO received IRP_MN_START_DEVICE */
79 #define MOUSE_INITIALIZED 0x80 /* Mouse interrupt is connected */
81 typedef struct _PORT_DEVICE_EXTENSION
83 PUCHAR DataPort
; /* Usually 0x60 */
84 PUCHAR ControlPort
; /* Usually 0x64 */
85 I8042_SETTINGS Settings
;
88 PI8042_KEYBOARD_EXTENSION KeyboardExtension
;
89 INTERRUPT_DATA KeyboardInterrupt
;
90 PI8042_MOUSE_EXTENSION MouseExtension
;
91 INTERRUPT_DATA MouseInterrupt
;
92 PKINTERRUPT HighestDIRQLInterrupt
;
98 BOOLEAN PacketComplete
;
99 NTSTATUS PacketResult
;
100 UCHAR PacketBuffer
[16];
104 PDEVICE_OBJECT CurrentIrpDevice
;
105 } PORT_DEVICE_EXTENSION
, *PPORT_DEVICE_EXTENSION
;
107 typedef struct _I8042_DRIVER_EXTENSION
109 UNICODE_STRING RegistryPath
;
111 PORT_DEVICE_EXTENSION Port
;
112 LIST_ENTRY DeviceListHead
;
113 KSPIN_LOCK DeviceListLock
;
114 } I8042_DRIVER_EXTENSION
, *PI8042_DRIVER_EXTENSION
;
116 typedef enum _I8042_DEVICE_TYPE
122 } I8042_DEVICE_TYPE
, *PI8042_DEVICE_TYPE
;
124 typedef struct _FDO_DEVICE_EXTENSION
126 I8042_DEVICE_TYPE Type
;
127 // Linkage in I8042_DRIVER_EXTENSION.DeviceListHead
128 LIST_ENTRY ListEntry
;
129 // Associated device object (FDO)
131 // Associated device object (PDO)
133 // Lower device object
134 PDEVICE_OBJECT LowerDevice
;
135 // Current state of the driver
136 DEVICE_STATE PnpState
;
138 PPORT_DEVICE_EXTENSION PortDeviceExtension
;
139 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
141 typedef struct _I8042_KEYBOARD_EXTENSION
143 FDO_DEVICE_EXTENSION Common
;
144 CONNECT_DATA KeyboardData
;
145 INTERNAL_I8042_HOOK_KEYBOARD KeyboardHook
; /* FIXME: IsrWritePort ignored */
148 KEYBOARD_ATTRIBUTES KeyboardAttributes
;
150 KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators
;
152 KEYBOARD_SCAN_STATE KeyboardScanState
;
154 PKEYBOARD_INPUT_DATA KeyboardBuffer
;
157 /* Power keys items */
161 UNICODE_STRING PowerInterfaceName
;
162 PIO_WORKITEM PowerWorkItem
;
167 PIO_WORKITEM DebugWorkItem
;
169 } I8042_KEYBOARD_EXTENSION
;
171 typedef enum _I8042_MOUSE_TYPE
175 IntellimouseExplorer
,
177 } I8042_MOUSE_TYPE
, *PI8042_MOUSE_TYPE
;
179 typedef struct _I8042_MOUSE_EXTENSION
181 FDO_DEVICE_EXTENSION Common
;
182 CONNECT_DATA MouseData
;
183 INTERNAL_I8042_HOOK_MOUSE MouseHook
;
186 MOUSE_ATTRIBUTES MouseAttributes
;
188 MOUSE_STATE MouseState
;
189 BOOLEAN MouseComplete
;
190 MOUSE_RESET_SUBSTATE MouseResetState
;
191 PMOUSE_INPUT_DATA MouseBuffer
;
193 USHORT MouseButtonState
;
194 ULARGE_INTEGER MousePacketStartTime
;
196 KTIMER TimerMouseTimeout
;
197 KDPC DpcMouseTimeout
;
198 MOUSE_TIMEOUT_STATE MouseTimeoutState
;
199 BOOLEAN MouseTimeoutActive
;
201 UCHAR MouseLogiBuffer
[3];
202 I8042_MOUSE_TYPE MouseType
;
203 } I8042_MOUSE_EXTENSION
;
205 typedef struct _I8042_HOOK_WORKITEM
207 PIO_WORKITEM WorkItem
;
209 } I8042_HOOK_WORKITEM
, *PI8042_HOOK_WORKITEM
;
211 /*-----------------------------------------------------
213 * --------------------------------------------------*/
215 #define MAX(a, b) ((a) >= (b) ? (a) : (b))
217 #define KEYBOARD_POWER_CODE 0x5E
218 #define KEYBOARD_SLEEP_CODE 0x5F
219 #define KEYBOARD_WAKE_CODE 0x63
221 /*-----------------------------------------------------
222 * Controller commands
223 * --------------------------------------------------*/
225 #define KBD_READ_MODE 0x20
226 #define KBD_WRITE_MODE 0x60
227 #define MOUSE_ENAB 0xA8
228 #define MOUSE_LINE_TEST 0xA9
229 #define CTRL_SELF_TEST 0xAA
230 #define CTRL_WRITE_MOUSE 0xD4
232 /*-----------------------------------------------------
234 * --------------------------------------------------*/
236 #define KBD_CMD_SET_LEDS 0xED
237 #define KBD_CMD_GET_ID 0xF2
239 /*-----------------------------------------------------
241 * --------------------------------------------------*/
243 #define KBD_SELF_TEST_OK 0x55
245 #define KBD_NACK 0xFC
246 #define KBD_RESEND 0xFE
248 /*-----------------------------------------------------
249 * Controller status register bits
250 * --------------------------------------------------*/
255 #define KBD_PERR 0x80
257 /*-----------------------------------------------------
258 * Controller command byte bits
259 * --------------------------------------------------*/
261 #define CCB_KBD_INT_ENAB 0x01
262 #define CCB_MOUSE_INT_ENAB 0x02
263 #define CCB_SYSTEM_FLAG 0x04
264 #define CCB_KBD_DISAB 0x10
265 #define CCB_MOUSE_DISAB 0x20
266 #define CCB_TRANSLATE 0x40
268 /*-----------------------------------------------------
270 * --------------------------------------------------*/
272 #define KBD_LED_SCROLL 0x01
273 #define KBD_LED_NUM 0x02
274 #define KBD_LED_CAPS 0x04
276 /*-----------------------------------------------------
278 * --------------------------------------------------*/
280 #define MOU_ENAB 0xF4
281 #define MOU_CMD_RESET 0xFF
283 /*-----------------------------------------------------
285 * --------------------------------------------------*/
287 #define MOUSE_ACK 0xFA
288 #define MOUSE_ERROR 0xFC
289 #define MOUSE_NACK 0xFE
291 /*-----------------------------------------------------
293 * --------------------------------------------------*/
297 IO_WORKITEM_ROUTINE i8042SendHookWorkItem
;
299 DRIVER_DISPATCH i8042Create
;
301 DRIVER_DISPATCH i8042Cleanup
;
303 DRIVER_DISPATCH i8042Close
;
308 i8042SynchWritePortKbd(
311 IN BOOLEAN WaitForAck
);
313 DRIVER_STARTIO i8042KbdStartIo
;
315 DRIVER_DISPATCH i8042KbdDeviceControl
;
317 DRIVER_DISPATCH i8042KbdInternalDeviceControl
;
319 KSERVICE_ROUTINE i8042KbdInterruptService
;
323 DRIVER_ADD_DEVICE i8042AddDevice
;
327 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
332 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
333 IN PFDO_DEVICE_EXTENSION FdoDeviceExtension
,
340 DRIVER_DISPATCH ForwardIrpAndForget
;
342 DRIVER_DISPATCH ForwardIrpAndWait
;
345 DuplicateUnicodeString(
347 IN PCUNICODE_STRING SourceString
,
348 OUT PUNICODE_STRING DestinationString
);
354 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
358 i8042MouHandleButtons(
359 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
364 IN PI8042_MOUSE_EXTENSION DeviceExtension
);
366 DRIVER_DISPATCH i8042MouInternalDeviceControl
;
368 KSERVICE_ROUTINE i8042MouInterruptService
;
374 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
375 IN UCHAR FlagsToDisable
,
376 IN UCHAR FlagsToEnable
);
378 DRIVER_DISPATCH i8042Pnp
;
383 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
390 IN PPORT_DEVICE_EXTENSION DeviceExtension
);
394 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
396 IN UCHAR SelectCmd OPTIONAL
);
400 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
401 IN UCHAR StatusFlags
,
403 #define i8042ReadKeyboardData(DeviceExtension, Data) \
404 i8042ReadData(DeviceExtension, KBD_OBF, Data)
405 #define i8042ReadMouseData(DeviceExtension, Data) \
406 i8042ReadData(DeviceExtension, MOU_OBF, Data)
410 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
415 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
422 IN BOOLEAN WaitForAck
);
426 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
429 IN BOOLEAN WaitForAck
);
433 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
441 IN PUNICODE_STRING RegistryPath
,
442 OUT PI8042_SETTINGS Settings
);
451 i8042AddLegacyKeyboard(
452 IN PDRIVER_OBJECT DriverObject
,
453 IN PUNICODE_STRING RegistryPath
);