|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1989, 1990, 1991, 1992, 1993 Microsoft Corporation ! 4: Copyright (c) 1993 Logitech Inc. ! 5: ! 6: Module Name: ! 7: ! 8: sermouse.h ! 9: ! 10: Abstract: ! 11: ! 12: These are the structures and defines that are used in the ! 13: i8250 serial mouse port driver. ! 14: ! 15: Revision History: ! 16: ! 17: ! 18: --*/ ! 19: ! 20: #ifndef _SERMOUSE_ ! 21: #define _SERMOUSE_ ! 22: ! 23: #include <ntddmou.h> ! 24: #include "kbdmou.h" ! 25: #include "sermcfg.h" ! 26: #include "uart.h" ! 27: ! 28: // ! 29: // Default number of buttons and sample rate for the serial mouse. ! 30: // ! 31: ! 32: #define MOUSE_NUMBER_OF_BUTTONS 2 ! 33: #define MOUSE_SAMPLE_RATE 40 // 1200 baud ! 34: ! 35: ! 36: // ! 37: // Protocol handler state constants. ! 38: // ! 39: ! 40: #define STATE0 0 ! 41: #define STATE1 1 ! 42: #define STATE2 2 ! 43: #define STATE3 3 ! 44: #define STATE_MAX 4 ! 45: ! 46: // ! 47: // Useful constants. ! 48: // ! 49: ! 50: #define MOUSE_BUTTON_1 0x01 ! 51: #define MOUSE_BUTTON_2 0x02 ! 52: #define MOUSE_BUTTON_3 0x04 ! 53: ! 54: // ! 55: // Conversion factor for milliseconds to microseconds. ! 56: // ! 57: ! 58: #define MS_TO_MICROSECONDS 1000 ! 59: ! 60: // ! 61: // Protocol handler static data. ! 62: // ! 63: ! 64: typedef struct _HANDLER_DATA { ! 65: ULONG Error; // Error count ! 66: ULONG State; // Keep the current state ! 67: ULONG PreviousButtons; // The previous button state ! 68: UCHAR Raw[STATE_MAX]; // Accumulate raw data ! 69: } HANDLER_DATA, *PHANDLER_DATA; ! 70: ! 71: ! 72: // ! 73: // Define the protocol handler type. ! 74: // ! 75: ! 76: typedef BOOLEAN ! 77: (*PPROTOCOL_HANDLER)( ! 78: IN PMOUSE_INPUT_DATA CurrentInput, ! 79: IN PHANDLER_DATA HandlerData, ! 80: IN UCHAR Value, ! 81: IN UCHAR LineState); ! 82: ! 83: // ! 84: // Defines for DeviceExtension->HardwarePresent. ! 85: // ! 86: ! 87: #define MOUSE_HARDWARE_PRESENT 1 ! 88: ! 89: // ! 90: // Serial mouse configuration information. ! 91: // ! 92: ! 93: typedef struct _SERIAL_MOUSE_CONFIGURATION_INFORMATION { ! 94: ! 95: // ! 96: // Bus interface type. ! 97: // ! 98: ! 99: INTERFACE_TYPE InterfaceType; ! 100: ! 101: // ! 102: // Bus Number. ! 103: // ! 104: ! 105: ULONG BusNumber; ! 106: ! 107: // ! 108: // The port/register resources used by this device. ! 109: // ! 110: ! 111: CM_PARTIAL_RESOURCE_DESCRIPTOR PortList[1]; ! 112: ULONG PortListCount; ! 113: ! 114: // ! 115: // Interrupt resources. ! 116: // ! 117: ! 118: CM_PARTIAL_RESOURCE_DESCRIPTOR MouseInterrupt; ! 119: ! 120: // ! 121: // The mapped address for the set of this device's registers. ! 122: // ! 123: ! 124: PUCHAR DeviceRegisters[1]; ! 125: ! 126: // ! 127: // The external frequency at which the UART is being driven. ! 128: // ! 129: ! 130: ULONG BaudClock; ! 131: ! 132: // ! 133: // The saved initial UART state. ! 134: // ! 135: ! 136: UART UartSaved; ! 137: ! 138: // ! 139: // Set at intialization to indicate that the base register ! 140: // address must be unmapped when the driver is unloaded. ! 141: // ! 142: ! 143: BOOLEAN UnmapRegistersRequired; ! 144: ! 145: // ! 146: // Flag set through the registry to force the type of hardware ! 147: // (bypassing NtDetect). ! 148: // ! 149: ! 150: LONG OverrideHardwarePresent; ! 151: ! 152: // ! 153: // Flag that indicates whether floating point context should be saved. ! 154: // ! 155: ! 156: BOOLEAN FloatingSave; ! 157: ! 158: // ! 159: // Mouse attributes. ! 160: // ! 161: ! 162: MOUSE_ATTRIBUTES MouseAttributes; ! 163: ! 164: } SERIAL_MOUSE_CONFIGURATION_INFORMATION, ! 165: *PSERIAL_MOUSE_CONFIGURATION_INFORMATION; ! 166: ! 167: // ! 168: // Port device extension. ! 169: // ! 170: ! 171: typedef struct _DEVICE_EXTENSION { ! 172: ! 173: // ! 174: // If HardwarePresent is non-zero, there is some sort of serial ! 175: // pointing device present in the system, either a serial mouse ! 176: // (MOUSE_HARDWARE_PRESENT) or a serial ballpoint ! 177: // (BALLPOINT_HARDWARE_PRESENT). ! 178: // ! 179: ! 180: BOOLEAN HardwarePresent; ! 181: ! 182: // ! 183: // Port configuration information. ! 184: // ! 185: ! 186: SERIAL_MOUSE_CONFIGURATION_INFORMATION Configuration; ! 187: ! 188: // ! 189: // Reference count for number of mouse enables. ! 190: // ! 191: ! 192: LONG MouseEnableCount; ! 193: ! 194: // ! 195: // Pointer to the device object. ! 196: // ! 197: ! 198: PDEVICE_OBJECT DeviceObject; ! 199: ! 200: // ! 201: // Mouse class connection data. ! 202: // ! 203: ! 204: CONNECT_DATA ConnectData; ! 205: ! 206: // ! 207: // Number of input data items currently in the mouse InputData queue. ! 208: // ! 209: ! 210: ULONG InputCount; ! 211: ! 212: // ! 213: // Start of the port mouse input data queue (really a circular buffer). ! 214: // ! 215: ! 216: PMOUSE_INPUT_DATA InputData; ! 217: ! 218: // ! 219: // Insertion pointer for mouse InputData. ! 220: // ! 221: ! 222: PMOUSE_INPUT_DATA DataIn; ! 223: ! 224: // ! 225: // Removal pointer for mouse InputData. ! 226: // ! 227: ! 228: PMOUSE_INPUT_DATA DataOut; ! 229: ! 230: // ! 231: // Points one input packet past the end of the InputData buffer. ! 232: // ! 233: ! 234: PMOUSE_INPUT_DATA DataEnd; ! 235: ! 236: // ! 237: // Current mouse input packet. ! 238: // ! 239: ! 240: MOUSE_INPUT_DATA CurrentInput; ! 241: ! 242: // ! 243: // Pointer to interrupt object. ! 244: // ! 245: ! 246: PKINTERRUPT InterruptObject; ! 247: ! 248: // ! 249: // Mouse ISR DPC queue. ! 250: // ! 251: ! 252: KDPC IsrDpc; ! 253: ! 254: // ! 255: // Mouse ISR DPC recall queue. ! 256: // ! 257: ! 258: KDPC IsrDpcRetry; ! 259: ! 260: // ! 261: // Used by the ISR and the ISR DPC (in SerMouDpcVariableOperation calls) ! 262: // to control processing by the ISR DPC. ! 263: // ! 264: ! 265: LONG DpcInterlockVariable; ! 266: ! 267: // ! 268: // Spinlock used to protect the DPC interlock variable. ! 269: // ! 270: ! 271: KSPIN_LOCK SpinLock; ! 272: ! 273: // ! 274: // Timer used to retry the ISR DPC routine when the class ! 275: // driver is unable to consume all the port driver's data. ! 276: // ! 277: ! 278: KTIMER DataConsumptionTimer; ! 279: ! 280: // ! 281: // DPC queue for logging overrun and internal driver errors. ! 282: // ! 283: ! 284: KDPC ErrorLogDpc; ! 285: ! 286: // ! 287: // Request sequence number (used for error logging). ! 288: // ! 289: ! 290: ULONG SequenceNumber; ! 291: ! 292: // ! 293: // Pointer to the interrupt protocol handler routine. ! 294: // ! 295: ! 296: PPROTOCOL_HANDLER ProtocolHandler; ! 297: ! 298: // ! 299: // Static state machine handler data. ! 300: // ! 301: ! 302: HANDLER_DATA HandlerData; ! 303: ! 304: // ! 305: // Indicates which pointer port device this driver created (UnitId ! 306: // is the suffix appended to the pointer port basename for the ! 307: // call to IoCreateDevice). ! 308: // ! 309: ! 310: USHORT UnitId; ! 311: ! 312: // ! 313: // Indicates whether it is okay to log overflow errors. ! 314: // ! 315: ! 316: BOOLEAN OkayToLogOverflow; ! 317: ! 318: } DEVICE_EXTENSION, *PDEVICE_EXTENSION; ! 319: ! 320: // ! 321: // Define the port Get/SetDataQueuePointer context structures. ! 322: // ! 323: ! 324: typedef struct _GET_DATA_POINTER_CONTEXT { ! 325: IN PDEVICE_EXTENSION DeviceExtension; ! 326: OUT PVOID DataIn; ! 327: OUT PVOID DataOut; ! 328: OUT ULONG InputCount; ! 329: } GET_DATA_POINTER_CONTEXT, *PGET_DATA_POINTER_CONTEXT; ! 330: ! 331: typedef struct _SET_DATA_POINTER_CONTEXT { ! 332: IN PDEVICE_EXTENSION DeviceExtension; ! 333: IN ULONG InputCount; ! 334: IN PVOID DataOut; ! 335: } SET_DATA_POINTER_CONTEXT, *PSET_DATA_POINTER_CONTEXT; ! 336: ! 337: // ! 338: // Define the context structure and operations for SerMouDpcVariableOperation. ! 339: // ! 340: ! 341: typedef enum _OPERATION_TYPE { ! 342: IncrementOperation, ! 343: DecrementOperation, ! 344: WriteOperation, ! 345: ReadOperation ! 346: } OPERATION_TYPE; ! 347: ! 348: typedef struct _VARIABLE_OPERATION_CONTEXT { ! 349: IN PLONG VariableAddress; ! 350: IN OPERATION_TYPE Operation; ! 351: IN OUT PLONG NewValue; ! 352: } VARIABLE_OPERATION_CONTEXT, *PVARIABLE_OPERATION_CONTEXT; ! 353: ! 354: // ! 355: // Function prototypes. ! 356: // ! 357: ! 358: ! 359: NTSTATUS ! 360: DriverEntry( ! 361: IN PDRIVER_OBJECT DriverObject, ! 362: IN PUNICODE_STRING RegistryPath ! 363: ); ! 364: ! 365: VOID ! 366: SerialMouseErrorLogDpc( ! 367: IN PKDPC Dpc, ! 368: IN PDEVICE_OBJECT DeviceObject, ! 369: IN PIRP Irp, ! 370: IN PVOID Context ! 371: ); ! 372: ! 373: NTSTATUS ! 374: SerialMouseFlush( ! 375: IN PDEVICE_OBJECT DeviceObject, ! 376: IN PIRP Irp ! 377: ); ! 378: NTSTATUS ! 379: SerialMouseInternalDeviceControl( ! 380: IN PDEVICE_OBJECT DeviceObject, ! 381: IN PIRP Irp ! 382: ); ! 383: ! 384: BOOLEAN ! 385: SerialMouseInterruptService( ! 386: IN PKINTERRUPT Interrupt, ! 387: IN PVOID Context ! 388: ); ! 389: ! 390: VOID ! 391: SerialMouseIsrDpc( ! 392: IN PKDPC Dpc, ! 393: IN PDEVICE_OBJECT DeviceObject, ! 394: IN PIRP Irp, ! 395: IN PVOID Context ! 396: ); ! 397: ! 398: NTSTATUS ! 399: SerialMouseOpenClose( ! 400: IN PDEVICE_OBJECT DeviceObject, ! 401: IN PIRP Irp ! 402: ); ! 403: ! 404: VOID ! 405: SerialMouseStartIo( ! 406: IN PDEVICE_OBJECT DeviceObject, ! 407: IN PIRP Irp ! 408: ); ! 409: ! 410: VOID ! 411: SerialMouseUnload( ! 412: IN PDRIVER_OBJECT DriverObject ! 413: ); ! 414: ! 415: VOID ! 416: SerMouBuildResourceList( ! 417: IN PDEVICE_EXTENSION DeviceExtension, ! 418: OUT PCM_RESOURCE_LIST *ResourceList, ! 419: OUT PULONG ResourceListSize ! 420: ); ! 421: ! 422: VOID ! 423: SerMouConfiguration( ! 424: IN PDEVICE_EXTENSION DeviceExtension, ! 425: IN PUNICODE_STRING RegistryPath, ! 426: IN PUNICODE_STRING DeviceName ! 427: ); ! 428: ! 429: VOID ! 430: SerMouDisableInterrupts( ! 431: IN PVOID Context ! 432: ); ! 433: ! 434: VOID ! 435: SerMouDpcVariableOperation( ! 436: IN PVOID Context ! 437: ); ! 438: ! 439: VOID ! 440: SerMouEnableInterrupts( ! 441: IN PVOID Context ! 442: ); ! 443: ! 444: VOID ! 445: SerMouGetDataQueuePointer( ! 446: IN PVOID Context ! 447: ); ! 448: ! 449: VOID ! 450: SerMouInitializeDataQueue( ! 451: IN PVOID Context ! 452: ); ! 453: ! 454: NTSTATUS ! 455: SerMouInitializeHardware( ! 456: IN PDEVICE_OBJECT DeviceObject ! 457: ); ! 458: ! 459: NTSTATUS ! 460: SerMouPeripheralCallout( ! 461: IN PVOID Context, ! 462: IN PUNICODE_STRING PathName, ! 463: IN INTERFACE_TYPE BusType, ! 464: IN ULONG BusNumber, ! 465: IN PKEY_VALUE_FULL_INFORMATION *BusInformation, ! 466: IN CONFIGURATION_TYPE ControllerType, ! 467: IN ULONG ControllerNumber, ! 468: IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, ! 469: IN CONFIGURATION_TYPE PeripheralType, ! 470: IN ULONG PeripheralNumber, ! 471: IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation ! 472: ); ! 473: ! 474: VOID ! 475: SerMouSendReport( ! 476: IN PDEVICE_OBJECT DeviceObject ! 477: ); ! 478: ! 479: VOID ! 480: SerMouServiceParameters( ! 481: IN PDEVICE_EXTENSION DeviceExtension, ! 482: IN PUNICODE_STRING RegistryPath, ! 483: IN PUNICODE_STRING DeviceName ! 484: ); ! 485: ! 486: VOID ! 487: SerMouSetDataQueuePointer( ! 488: IN PVOID Context ! 489: ); ! 490: ! 491: BOOLEAN ! 492: SerMouWriteDataToQueue( ! 493: IN PDEVICE_EXTENSION DeviceExtension, ! 494: IN PMOUSE_INPUT_DATA InputData ! 495: ); ! 496: ! 497: #endif // _SERMOUSE_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.