486 lines
8.7 KiB
C
486 lines
8.7 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990, 1991, 1992, 1993 Microsoft Corporation
|
|||
|
Copyright (c) 1992 Logitech Inc.
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
busmouse.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
These are the structures and defines that are used in the
|
|||
|
Microsoft/Logitech Bus mouse port driver.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _BUSMOUSE_
|
|||
|
#define _BUSMOUSE_
|
|||
|
|
|||
|
#include <ntddmou.h>
|
|||
|
#include "kbdmou.h"
|
|||
|
#include "buscfg.h"
|
|||
|
|
|||
|
//
|
|||
|
// Default number of buttons and sample rate for the Inport mouse.
|
|||
|
//
|
|||
|
|
|||
|
#define MOUSE_NUMBER_OF_BUTTONS 3
|
|||
|
#define MOUSE_SAMPLE_RATE_50HZ 50
|
|||
|
|
|||
|
//
|
|||
|
// NOTE: This should be defined in the DDK instead...
|
|||
|
//
|
|||
|
|
|||
|
#define MOUSE_BUS_HARDWARE MOUSE_INPORT_HARDWARE
|
|||
|
#define FILE_DEVICE_BUS_PORT FILE_DEVICE_INPORT_PORT
|
|||
|
#define BUSMOUSE_ERROR_VALUE_BASE INPORT_ERROR_VALUE_BASE
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Define the control port bits.
|
|||
|
//
|
|||
|
|
|||
|
#define BUS_CONTROL_INTERRUPT_DISABLE 0x10
|
|||
|
#define BUS_CONTROL_COUNTER_CAPTURE 0x80
|
|||
|
#define BUS_CONTROL_X_LOW 0x00
|
|||
|
#define BUS_CONTROL_X_HIGH 0x20
|
|||
|
#define BUS_CONTROL_Y_LOW 0x40
|
|||
|
#define BUS_CONTROL_Y_HIGH 0x60
|
|||
|
|
|||
|
//
|
|||
|
// Define the Bus data bits
|
|||
|
//
|
|||
|
|
|||
|
#define BUS_DATA_BUTTON_1 0x80
|
|||
|
#define BUS_DATA_BUTTON_1_SHIFT 0x06
|
|||
|
#define BUS_DATA_BUTTON_2 0x40
|
|||
|
#define BUS_DATA_BUTTON_2_SHIFT 0x04
|
|||
|
#define BUS_DATA_BUTTON_3 0x20
|
|||
|
#define BUS_DATA_BUTTON_3_SHIFT 0x05
|
|||
|
|
|||
|
//
|
|||
|
// Define the Configuration byte
|
|||
|
//
|
|||
|
|
|||
|
#define BUS_CONFIGURATION_VALUE 0x91
|
|||
|
|
|||
|
//
|
|||
|
// Define the registers.
|
|||
|
//
|
|||
|
|
|||
|
#define BUS_DATA_PORT_READ 0x00
|
|||
|
#define BUS_SIGNATURE_PORT_READ_WRITE 0x01
|
|||
|
#define BUS_INTERRUPT_PORT_READ 0x02
|
|||
|
#define BUS_CONTROL_PORT_WRITE 0x02
|
|||
|
#define BUS_CONFIGURATION_PORT_READ_WRITE 0x03
|
|||
|
|
|||
|
//
|
|||
|
// Inport mouse configuration information.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _BUS_CONFIGURATION_INFORMATION {
|
|||
|
|
|||
|
//
|
|||
|
// Bus interface type.
|
|||
|
//
|
|||
|
|
|||
|
INTERFACE_TYPE InterfaceType;
|
|||
|
|
|||
|
//
|
|||
|
// Bus Number.
|
|||
|
//
|
|||
|
|
|||
|
ULONG BusNumber;
|
|||
|
|
|||
|
#ifdef PNP_IDENTIFY
|
|||
|
//
|
|||
|
// Controller type & number
|
|||
|
//
|
|||
|
|
|||
|
CONFIGURATION_TYPE ControllerType;
|
|||
|
ULONG ControllerNumber;
|
|||
|
|
|||
|
//
|
|||
|
// Peripheral type & number
|
|||
|
|
|||
|
CONFIGURATION_TYPE PeripheralType;
|
|||
|
ULONG PeripheralNumber;
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// The port/register resources used by this device.
|
|||
|
//
|
|||
|
|
|||
|
CM_PARTIAL_RESOURCE_DESCRIPTOR PortList[1];
|
|||
|
ULONG PortListCount;
|
|||
|
|
|||
|
//
|
|||
|
// Interrupt resources.
|
|||
|
//
|
|||
|
|
|||
|
CM_PARTIAL_RESOURCE_DESCRIPTOR MouseInterrupt;
|
|||
|
|
|||
|
//
|
|||
|
// The mapped address for the set of this device's registers.
|
|||
|
//
|
|||
|
|
|||
|
PUCHAR DeviceRegisters[1];
|
|||
|
|
|||
|
//
|
|||
|
// Set at intialization to indicate that the base register
|
|||
|
// address must be unmapped when the driver is unloaded.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN UnmapRegistersRequired;
|
|||
|
|
|||
|
//
|
|||
|
// Flag that indicates whether floating point context should be saved.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN FloatingSave;
|
|||
|
|
|||
|
//
|
|||
|
// Mouse attributes.
|
|||
|
//
|
|||
|
|
|||
|
MOUSE_ATTRIBUTES MouseAttributes;
|
|||
|
|
|||
|
} BUS_CONFIGURATION_INFORMATION, *PBUS_CONFIGURATION_INFORMATION;
|
|||
|
|
|||
|
//
|
|||
|
// Port device extension.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _DEVICE_EXTENSION {
|
|||
|
|
|||
|
//
|
|||
|
// If HardwarePresent is TRUE, there is an Inport mouse present in
|
|||
|
// the system.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN HardwarePresent;
|
|||
|
|
|||
|
//
|
|||
|
// Port configuration information.
|
|||
|
//
|
|||
|
|
|||
|
BUS_CONFIGURATION_INFORMATION Configuration;
|
|||
|
|
|||
|
//
|
|||
|
// Reference count for number of mouse enables.
|
|||
|
//
|
|||
|
|
|||
|
LONG MouseEnableCount;
|
|||
|
|
|||
|
//
|
|||
|
// Pointer to the device object.
|
|||
|
//
|
|||
|
|
|||
|
PDEVICE_OBJECT DeviceObject;
|
|||
|
|
|||
|
//
|
|||
|
// Mouse class connection data.
|
|||
|
//
|
|||
|
|
|||
|
CONNECT_DATA ConnectData;
|
|||
|
|
|||
|
//
|
|||
|
// Number of input data items currently in the mouse InputData queue.
|
|||
|
//
|
|||
|
|
|||
|
ULONG InputCount;
|
|||
|
|
|||
|
//
|
|||
|
// Start of the port mouse input data queue (really a circular buffer).
|
|||
|
//
|
|||
|
|
|||
|
PMOUSE_INPUT_DATA InputData;
|
|||
|
|
|||
|
//
|
|||
|
// Insertion pointer for mouse InputData.
|
|||
|
//
|
|||
|
|
|||
|
PMOUSE_INPUT_DATA DataIn;
|
|||
|
|
|||
|
//
|
|||
|
// Removal pointer for mouse InputData.
|
|||
|
//
|
|||
|
|
|||
|
PMOUSE_INPUT_DATA DataOut;
|
|||
|
|
|||
|
//
|
|||
|
// Points one input packet past the end of the InputData buffer.
|
|||
|
//
|
|||
|
|
|||
|
PMOUSE_INPUT_DATA DataEnd;
|
|||
|
|
|||
|
//
|
|||
|
// Current mouse input packet.
|
|||
|
//
|
|||
|
|
|||
|
MOUSE_INPUT_DATA CurrentInput;
|
|||
|
|
|||
|
//
|
|||
|
// Keep track of the previous button state.
|
|||
|
//
|
|||
|
|
|||
|
UCHAR PreviousButtons;
|
|||
|
|
|||
|
//
|
|||
|
// Pointer to interrupt object.
|
|||
|
//
|
|||
|
|
|||
|
PKINTERRUPT InterruptObject;
|
|||
|
|
|||
|
//
|
|||
|
// Mouse ISR DPC queue.
|
|||
|
//
|
|||
|
|
|||
|
KDPC IsrDpc;
|
|||
|
|
|||
|
//
|
|||
|
// Mouse ISR DPC recall queue.
|
|||
|
//
|
|||
|
|
|||
|
KDPC IsrDpcRetry;
|
|||
|
|
|||
|
//
|
|||
|
// Used by the ISR and the ISR DPC (in BusDpcVariableOperation calls)
|
|||
|
// to control processing by the ISR DPC.
|
|||
|
//
|
|||
|
|
|||
|
LONG DpcInterlockVariable;
|
|||
|
|
|||
|
//
|
|||
|
// Spinlock used to protect the DPC interlock variable.
|
|||
|
//
|
|||
|
|
|||
|
KSPIN_LOCK SpinLock;
|
|||
|
|
|||
|
//
|
|||
|
// Timer used to retry the ISR DPC routine when the class
|
|||
|
// driver is unable to consume all the port driver's data.
|
|||
|
//
|
|||
|
|
|||
|
KTIMER DataConsumptionTimer;
|
|||
|
|
|||
|
//
|
|||
|
// DPC queue for logging overrun and internal driver errors.
|
|||
|
//
|
|||
|
|
|||
|
KDPC ErrorLogDpc;
|
|||
|
|
|||
|
//
|
|||
|
// Request sequence number (used for error logging).
|
|||
|
//
|
|||
|
|
|||
|
ULONG SequenceNumber;
|
|||
|
|
|||
|
//
|
|||
|
// Indicates which pointer port device this driver created (UnitId
|
|||
|
// is the suffix appended to the pointer port basename for the
|
|||
|
// call to IoCreateDevice).
|
|||
|
//
|
|||
|
|
|||
|
USHORT UnitId;
|
|||
|
|
|||
|
//
|
|||
|
// Indicates whether it is okay to log overflow errors.
|
|||
|
//
|
|||
|
|
|||
|
BOOLEAN OkayToLogOverflow;
|
|||
|
|
|||
|
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
|||
|
|
|||
|
//
|
|||
|
// Define the port Get/SetDataQueuePointer context structures.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _GET_DATA_POINTER_CONTEXT {
|
|||
|
IN PDEVICE_EXTENSION DeviceExtension;
|
|||
|
OUT PVOID DataIn;
|
|||
|
OUT PVOID DataOut;
|
|||
|
OUT ULONG InputCount;
|
|||
|
} GET_DATA_POINTER_CONTEXT, *PGET_DATA_POINTER_CONTEXT;
|
|||
|
|
|||
|
typedef struct _SET_DATA_POINTER_CONTEXT {
|
|||
|
IN PDEVICE_EXTENSION DeviceExtension;
|
|||
|
IN ULONG InputCount;
|
|||
|
IN PVOID DataOut;
|
|||
|
} SET_DATA_POINTER_CONTEXT, *PSET_DATA_POINTER_CONTEXT;
|
|||
|
|
|||
|
//
|
|||
|
// Define the context structure and operations for BusDpcVariableOperation.
|
|||
|
//
|
|||
|
|
|||
|
typedef enum _OPERATION_TYPE {
|
|||
|
IncrementOperation,
|
|||
|
DecrementOperation,
|
|||
|
WriteOperation,
|
|||
|
ReadOperation
|
|||
|
} OPERATION_TYPE;
|
|||
|
|
|||
|
typedef struct _VARIABLE_OPERATION_CONTEXT {
|
|||
|
IN PLONG VariableAddress;
|
|||
|
IN OPERATION_TYPE Operation;
|
|||
|
IN OUT PLONG NewValue;
|
|||
|
} VARIABLE_OPERATION_CONTEXT, *PVARIABLE_OPERATION_CONTEXT;
|
|||
|
|
|||
|
//
|
|||
|
// Function prototypes.
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DriverEntry(
|
|||
|
IN PDRIVER_OBJECT DriverObject,
|
|||
|
IN PUNICODE_STRING RegistryPath
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DBusFlush(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DBusInternalDeviceControl(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
DBusInterruptService(
|
|||
|
IN PKINTERRUPT Interrupt,
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
DBusIsrDpc(
|
|||
|
IN PKDPC Dpc,
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp,
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DBusOpenClose(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
DBusStartIo(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
DBusUnload(
|
|||
|
IN PDRIVER_OBJECT DriverObject
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusBuildResourceList(
|
|||
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|||
|
OUT PCM_RESOURCE_LIST *ResourceList,
|
|||
|
OUT PULONG ResourceListSize
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusConfiguration(
|
|||
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|||
|
IN PUNICODE_STRING RegistryPath,
|
|||
|
IN PUNICODE_STRING DeviceName
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusDisableInterrupts(
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusDpcVariableOperation(
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusEnableInterrupts(
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusErrorLogDpc(
|
|||
|
IN PKDPC Dpc,
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp,
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusGetDataQueuePointer(
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusInitializeDataQueue(
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
BusInitializeHardware(
|
|||
|
IN PDEVICE_OBJECT DeviceObject
|
|||
|
);
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
BusPeripheralCallout(
|
|||
|
IN PVOID Context,
|
|||
|
IN PUNICODE_STRING PathName,
|
|||
|
IN INTERFACE_TYPE BusType,
|
|||
|
IN ULONG BusNumber,
|
|||
|
IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
|
|||
|
IN CONFIGURATION_TYPE ControllerType,
|
|||
|
IN ULONG ControllerNumber,
|
|||
|
IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
|
|||
|
IN CONFIGURATION_TYPE PeripheralType,
|
|||
|
IN ULONG PeripheralNumber,
|
|||
|
IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusServiceParameters(
|
|||
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|||
|
IN PUNICODE_STRING RegistryPath,
|
|||
|
IN PUNICODE_STRING DeviceName
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
BusSetDataQueuePointer(
|
|||
|
IN PVOID Context
|
|||
|
);
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
BusWriteDataToQueue(
|
|||
|
IN PDEVICE_EXTENSION DeviceExtension,
|
|||
|
IN PMOUSE_INPUT_DATA InputData
|
|||
|
);
|
|||
|
|
|||
|
#if DBG
|
|||
|
|
|||
|
VOID
|
|||
|
BusDebugPrint(
|
|||
|
IN ULONG DebugPrintLevel,
|
|||
|
IN PCCHAR DebugMessage,
|
|||
|
...
|
|||
|
);
|
|||
|
|
|||
|
#define BusPrint(x) BusDebugPrint x
|
|||
|
#else
|
|||
|
#define BusPrint(x)
|
|||
|
#endif
|
|||
|
|
|||
|
#endif // _BUSMOUSE_
|