13 /*-----------------------------------------------------
15 * --------------------------------------------------*/
17 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
18 #define I8042PRT_TAG TAG('8', '0', '4', '2')
29 typedef struct _I8042_SETTINGS
31 /* Registry settings */
32 ULONG KeyboardDataQueueSize
; /* done */
33 UNICODE_STRING KeyboardDeviceBaseName
;
34 ULONG MouseDataQueueSize
; /* done */
35 ULONG MouseResolution
;
36 ULONG MouseSynchIn100ns
;
37 ULONG NumberOfButtons
;
38 UNICODE_STRING PointerDeviceBaseName
;
39 ULONG PollStatusIterations
; /* done */
40 ULONG OverrideKeyboardType
;
41 ULONG OverrideKeyboardSubtype
;
42 ULONG PollingIterations
; /* done */
43 ULONG PollingIterationsMaximum
;
44 ULONG ResendIterations
; /* done */
46 ULONG CrashOnCtrlScroll
; /* done */
47 } I8042_SETTINGS
, *PI8042_SETTINGS
;
49 typedef enum _MOUSE_TIMEOUT_STATE
54 } MOUSE_TIMEOUT_STATE
, *PMOUSE_TIMEOUT_STATE
;
56 typedef struct _INTERRUPT_DATA
61 KINTERRUPT_MODE InterruptMode
;
62 BOOLEAN ShareInterrupt
;
64 } INTERRUPT_DATA
, *PINTERRUPT_DATA
;
66 #define WHEEL_DELTA 120
68 struct _I8042_KEYBOARD_EXTENSION
;
69 typedef struct _I8042_KEYBOARD_EXTENSION
*PI8042_KEYBOARD_EXTENSION
;
70 struct _I8042_MOUSE_EXTENSION
;
71 typedef struct _I8042_MOUSE_EXTENSION
*PI8042_MOUSE_EXTENSION
;
73 /* PORT_DEVICE_EXTENSION.Flags */
74 #define KEYBOARD_PRESENT 0x01 /* A keyboard is attached */
75 #define KEYBOARD_CONNECTED 0x02 /* Keyboard received IOCTL_INTERNAL_KEYBOARD_CONNECT */
76 #define KEYBOARD_STARTED 0x04 /* Keyboard FDO received IRP_MN_START_DEVICE */
77 #define KEYBOARD_INITIALIZED 0x08 /* Keyboard interrupt is connected */
78 #define MOUSE_PRESENT 0x10 /* A mouse is attached */
79 #define MOUSE_CONNECTED 0x20 /* Mouse received IOCTL_INTERNAL_MOUSE_CONNECT */
80 #define MOUSE_STARTED 0x40 /* Mouse FDO received IRP_MN_START_DEVICE */
81 #define MOUSE_INITIALIZED 0x80 /* Mouse interrupt is connected */
83 typedef struct _PORT_DEVICE_EXTENSION
85 PUCHAR DataPort
; /* Usually 0x60 */
86 PUCHAR ControlPort
; /* Usually 0x64 */
87 I8042_SETTINGS Settings
;
90 PI8042_KEYBOARD_EXTENSION KeyboardExtension
;
91 INTERRUPT_DATA KeyboardInterrupt
;
92 PI8042_MOUSE_EXTENSION MouseExtension
;
93 INTERRUPT_DATA MouseInterrupt
;
94 PKINTERRUPT HighestDIRQLInterrupt
;
100 BOOLEAN PacketComplete
;
101 NTSTATUS PacketResult
;
102 UCHAR PacketBuffer
[16];
106 PDEVICE_OBJECT CurrentIrpDevice
;
107 } PORT_DEVICE_EXTENSION
, *PPORT_DEVICE_EXTENSION
;
109 typedef struct _I8042_DRIVER_EXTENSION
111 UNICODE_STRING RegistryPath
;
113 PORT_DEVICE_EXTENSION Port
;
114 LIST_ENTRY DeviceListHead
;
115 KSPIN_LOCK DeviceListLock
;
116 } I8042_DRIVER_EXTENSION
, *PI8042_DRIVER_EXTENSION
;
118 typedef enum _I8042_DEVICE_TYPE
124 } I8042_DEVICE_TYPE
, *PI8042_DEVICE_TYPE
;
126 typedef struct _FDO_DEVICE_EXTENSION
128 I8042_DEVICE_TYPE Type
;
129 // Linkage in I8042_DRIVER_EXTENSION.DeviceListHead
130 LIST_ENTRY ListEntry
;
131 // Associated device object (FDO)
133 // Associated device object (PDO)
135 // Lower device object
136 PDEVICE_OBJECT LowerDevice
;
137 // Current state of the driver
138 DEVICE_STATE PnpState
;
140 PPORT_DEVICE_EXTENSION PortDeviceExtension
;
141 } FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
143 typedef struct _I8042_KEYBOARD_EXTENSION
145 FDO_DEVICE_EXTENSION Common
;
146 CONNECT_DATA KeyboardData
;
147 INTERNAL_I8042_HOOK_KEYBOARD KeyboardHook
; /* FIXME: IsrWritePort ignored */
150 KEYBOARD_ATTRIBUTES KeyboardAttributes
;
152 KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicators
;
154 KEYBOARD_SCAN_STATE KeyboardScanState
;
156 PKEYBOARD_INPUT_DATA KeyboardBuffer
;
159 /* Power keys items */
163 UNICODE_STRING PowerInterfaceName
;
164 PIO_WORKITEM PowerWorkItem
;
169 PIO_WORKITEM DebugWorkItem
;
171 } I8042_KEYBOARD_EXTENSION
;
173 typedef enum _I8042_MOUSE_TYPE
177 IntellimouseExplorer
,
179 } I8042_MOUSE_TYPE
, *PI8042_MOUSE_TYPE
;
181 typedef struct _I8042_MOUSE_EXTENSION
183 FDO_DEVICE_EXTENSION Common
;
184 CONNECT_DATA MouseData
;
185 INTERNAL_I8042_HOOK_MOUSE MouseHook
;
188 MOUSE_ATTRIBUTES MouseAttributes
;
190 MOUSE_STATE MouseState
;
191 BOOLEAN MouseComplete
;
192 MOUSE_RESET_SUBSTATE MouseResetState
;
193 PMOUSE_INPUT_DATA MouseBuffer
;
195 USHORT MouseButtonState
;
196 ULARGE_INTEGER MousePacketStartTime
;
198 KTIMER TimerMouseTimeout
;
199 KDPC DpcMouseTimeout
;
200 MOUSE_TIMEOUT_STATE MouseTimeoutState
;
201 BOOLEAN MouseTimeoutActive
;
203 UCHAR MouseLogiBuffer
[3];
204 I8042_MOUSE_TYPE MouseType
;
205 } I8042_MOUSE_EXTENSION
;
207 typedef struct _I8042_HOOK_WORKITEM
209 PIO_WORKITEM WorkItem
;
211 } I8042_HOOK_WORKITEM
, *PI8042_HOOK_WORKITEM
;
213 /*-----------------------------------------------------
215 * --------------------------------------------------*/
217 #define MAX(a, b) ((a) >= (b) ? (a) : (b))
219 #define KEYBOARD_POWER_CODE 0x5E
220 #define KEYBOARD_SLEEP_CODE 0x5F
221 #define KEYBOARD_WAKE_CODE 0x63
223 /*-----------------------------------------------------
224 * Controller commands
225 * --------------------------------------------------*/
227 #define KBD_READ_MODE 0x20
228 #define KBD_WRITE_MODE 0x60
229 #define MOUSE_ENAB 0xA8
230 #define MOUSE_LINE_TEST 0xA9
231 #define CTRL_SELF_TEST 0xAA
232 #define CTRL_WRITE_MOUSE 0xD4
234 /*-----------------------------------------------------
236 * --------------------------------------------------*/
238 #define KBD_CMD_SET_LEDS 0xED
239 #define KBD_CMD_GET_ID 0xF2
241 /*-----------------------------------------------------
243 * --------------------------------------------------*/
245 #define KBD_SELF_TEST_OK 0x55
247 #define KBD_NACK 0xFC
248 #define KBD_RESEND 0xFE
250 /*-----------------------------------------------------
251 * Controller status register bits
252 * --------------------------------------------------*/
257 #define KBD_PERR 0x80
259 /*-----------------------------------------------------
260 * Controller command byte bits
261 * --------------------------------------------------*/
263 #define CCB_KBD_INT_ENAB 0x01
264 #define CCB_MOUSE_INT_ENAB 0x02
265 #define CCB_SYSTEM_FLAG 0x04
266 #define CCB_KBD_DISAB 0x10
267 #define CCB_MOUSE_DISAB 0x20
268 #define CCB_TRANSLATE 0x40
270 /*-----------------------------------------------------
272 * --------------------------------------------------*/
274 #define KBD_LED_SCROLL 0x01
275 #define KBD_LED_NUM 0x02
276 #define KBD_LED_CAPS 0x04
278 /*-----------------------------------------------------
280 * --------------------------------------------------*/
282 #define MOU_ENAB 0xF4
283 #define MOU_CMD_RESET 0xFF
285 /*-----------------------------------------------------
287 * --------------------------------------------------*/
289 #define MOUSE_ACK 0xFA
290 #define MOUSE_ERROR 0xFC
291 #define MOUSE_NACK 0xFE
293 /*-----------------------------------------------------
295 * --------------------------------------------------*/
299 IO_WORKITEM_ROUTINE i8042SendHookWorkItem
;
301 DRIVER_DISPATCH i8042Create
;
303 DRIVER_DISPATCH i8042Cleanup
;
305 DRIVER_DISPATCH i8042Close
;
310 i8042SynchWritePortKbd(
313 IN BOOLEAN WaitForAck
);
315 DRIVER_STARTIO i8042KbdStartIo
;
317 DRIVER_DISPATCH i8042KbdDeviceControl
;
319 DRIVER_DISPATCH i8042KbdInternalDeviceControl
;
321 KSERVICE_ROUTINE i8042KbdInterruptService
;
325 DRIVER_ADD_DEVICE i8042AddDevice
;
329 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
334 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
335 IN PFDO_DEVICE_EXTENSION FdoDeviceExtension
,
342 DRIVER_DISPATCH ForwardIrpAndForget
;
344 DRIVER_DISPATCH ForwardIrpAndWait
;
347 DuplicateUnicodeString(
349 IN PCUNICODE_STRING SourceString
,
350 OUT PUNICODE_STRING DestinationString
);
356 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
360 i8042MouHandleButtons(
361 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
366 IN PI8042_MOUSE_EXTENSION DeviceExtension
);
368 DRIVER_DISPATCH i8042MouInternalDeviceControl
;
370 KSERVICE_ROUTINE i8042MouInterruptService
;
376 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
377 IN UCHAR FlagsToDisable
,
378 IN UCHAR FlagsToEnable
);
380 DRIVER_DISPATCH i8042Pnp
;
385 IN PI8042_MOUSE_EXTENSION DeviceExtension
,
392 IN PPORT_DEVICE_EXTENSION DeviceExtension
);
396 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
398 IN UCHAR SelectCmd OPTIONAL
);
402 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
403 IN UCHAR StatusFlags
,
405 #define i8042ReadKeyboardData(DeviceExtension, Data) \
406 i8042ReadData(DeviceExtension, KBD_OBF, Data)
407 #define i8042ReadMouseData(DeviceExtension, Data) \
408 i8042ReadData(DeviceExtension, MOU_OBF, Data)
412 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
417 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
424 IN BOOLEAN WaitForAck
);
428 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
431 IN BOOLEAN WaitForAck
);
435 IN PPORT_DEVICE_EXTENSION DeviceExtension
,
443 IN PUNICODE_STRING RegistryPath
,
444 OUT PI8042_SETTINGS Settings
);
453 i8042AddLegacyKeyboard(
454 IN PDRIVER_OBJECT DriverObject
,
455 IN PUNICODE_STRING RegistryPath
);
457 #endif // _I8042PRT_H_