/* Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved Module Name: ptdrvprt.h Abstract: Structures and defines used the RDP remote port driver. Environment: Kernel mode. Revision History: 02/12/99 - Initial Revision based on pnpi8042 driver --*/ #ifndef _PTDRVCOM_ #define _PTDRVCOM_ #include #include #include #include #include #include #include "ptdrvstr.h" // // Define the device types for the first field in the device extensions // #define DEV_TYPE_TERMDD 1 #define DEV_TYPE_PORT 2 #define REMOTE_PORT_POOL_TAG (ULONG) 'PMER' #ifdef ExAllocatePool #undef ExAllocatePool #endif #define ExAllocatePool(type, size) \ ExAllocatePoolWithTag (type, size, REMOTE_PORT_POOL_TAG) // // Set up some debug options // #ifdef PAGED_CODE #undef PAGED_CODE #endif #if DBG #define PTDRV_VERBOSE 1 #define PAGED_CODE() \ if (KeGetCurrentIrql() > APC_LEVEL) { \ KdPrint(( "RemotePrt: Pageable code called at IRQL %d\n", KeGetCurrentIrql() )); \ DbgBreakPoint(); \ } #else #define PAGED_CODE() #endif // // Define device name for our driver // #define RDP_CONSOLE_BASE_NAME0 L"\\Device\\RDP_CONSOLE0" #define RDP_CONSOLE_BASE_NAME1 L"\\Device\\RDP_CONSOLE1" // // Custom resource type used when pruning the fdo's resource lists // #define PD_REMOVE_RESOURCE 0xef // // Mouse reset IOCTL // #define IOCTL_INTERNAL_MOUSE_RESET \ CTL_CODE(FILE_DEVICE_MOUSE, 0x0FFF, METHOD_NEITHER, FILE_ANY_ACCESS) // // Default number of function keys, number of LED indicators, and total // number of keys // #define KEYBOARD_NUM_FUNCTION_KEYS 12 #define KEYBOARD_NUM_INDICATORS 3 #define KEYBOARD_NUM_KEYS_TOTAL 101 // // Default values for keyboard typematic rate and delay. // #define KEYBOARD_TYPEMATIC_RATE_DEFAULT 30 #define KEYBOARD_TYPEMATIC_DELAY_DEFAULT 250 // // Default info for the mouse // #define MOUSE_IDENTIFIER MOUSE_I8042_HARDWARE #define MOUSE_NUM_BUTTONS 2 #define MOUSE_SAMPLE_RATE 60 #define MOUSE_INPUT_QLEN 0 // // Defines and macros for Globals.ControllerData->HardwarePresent. // #define KEYBOARD_HARDWARE_PRESENT 0x001 #define MOUSE_HARDWARE_PRESENT 0x002 #define WHEELMOUSE_HARDWARE_PRESENT 0x008 #define DUP_KEYBOARD_HARDWARE_PRESENT 0x010 #define DUP_MOUSE_HARDWARE_PRESENT 0x020 #define KEYBOARD_HARDWARE_INITIALIZED 0x100 #define MOUSE_HARDWARE_INITIALIZED 0x200 #define TEST_HARDWARE_PRESENT(bits) \ ((Globals.ControllerData->HardwarePresent & (bits)) == (bits)) #define CLEAR_HW_FLAGS(bits) (Globals.ControllerData->HardwarePresent &= ~(bits)) #define SET_HW_FLAGS(bits) (Globals.ControllerData->HardwarePresent |= (bits)) #define KEYBOARD_PRESENT() TEST_HARDWARE_PRESENT(KEYBOARD_HARDWARE_PRESENT) #define MOUSE_PRESENT() TEST_HARDWARE_PRESENT(MOUSE_HARDWARE_PRESENT) #define KEYBOARD_INITIALIZED() TEST_HARDWARE_PRESENT(KEYBOARD_HARDWARE_INITIALIZED) #define MOUSE_INITIALIZED() TEST_HARDWARE_PRESENT(MOUSE_HARDWARE_INITIALIZED) #define CLEAR_MOUSE_PRESENT() CLEAR_HW_FLAGS(MOUSE_HARDWARE_INITIALIZED | MOUSE_HARDWARE_PRESENT | WHEELMOUSE_HARDWARE_PRESENT) #define CLEAR_KEYBOARD_PRESENT() CLEAR_HW_FLAGS(KEYBOARD_HARDWARE_INITIALIZED | KEYBOARD_HARDWARE_PRESENT) #define KBD_POWERED_UP_STARTED 0x0001 #define MOU_POWERED_UP_STARTED 0x0010 #define MOU_POWERED_UP_SUCCESS 0x0100 #define MOU_POWERED_UP_FAILURE 0x0200 #define KBD_POWERED_UP_SUCCESS 0x1000 #define KBD_POWERED_UP_FAILURE 0x2000 #define CLEAR_POWERUP_FLAGS() (Globals.PowerUpFlags = 0x0) #define SET_PWR_FLAGS(bits) (Globals.PowerUpFlags |= (bits)) #define KEYBOARD_POWERED_UP_STARTED() SET_PWR_FLAGS(KBD_POWERED_UP_STARTED) #define MOUSE_POWERED_UP_STARTED() SET_PWR_FLAGS(MOU_POWERED_UP_STARTED) #define KEYBOARD_POWERED_UP_SUCCESSFULLY() SET_PWR_FLAGS(KBD_POWERED_UP_SUCCESS) #define MOUSE_POWERED_UP_SUCCESSFULLY() SET_PWR_FLAGS(MOU_POWERED_UP_SUCCESS) #define KEYBOARD_POWERED_UP_FAILED() SET_PWR_FLAGS(KBD_POWERED_UP_FAILURE) #define MOUSE_POWERED_UP_FAILED() SET_PWR_FLAGS(MOU_POWERED_UP_FAILURE) // // Define the i8042 controller input/output ports. // typedef enum _I8042_IO_PORT_TYPE { DataPort = 0, CommandPort, MaximumPortCount } I8042_IO_PORT_TYPE; // // Intel i8042 configuration information. // typedef struct _I8042_CONFIGURATION_INFORMATION { // // The port/register resources used by this device. // CM_PARTIAL_RESOURCE_DESCRIPTOR PortList[MaximumPortCount]; ULONG PortListCount; } I8042_CONFIGURATION_INFORMATION, *PI8042_CONFIGURATION_INFORMATION; // // Define the common portion of the keyboard/mouse device extension. // typedef struct COMMON_DATA { // // Device type field // ULONG deviceType; // // Pointer back to the this extension's device object. // PDEVICE_OBJECT Self; // // The top of the stack before this filter was added. AKA the location // to which all IRPS should be directed. // PDEVICE_OBJECT TopOfStack; // // "THE PDO" (ejected by root) // PDEVICE_OBJECT PDO; // // Current power state that the device is in // DEVICE_POWER_STATE PowerState; POWER_ACTION ShutdownType; // // Reference count for number of keyboard enables. // LONG EnableCount; // // Class connection data. // CONNECT_DATA ConnectData; // // WMI Information // WMILIB_CONTEXT WmiLibInfo; BOOLEAN Initialized; BOOLEAN IsKeyboard; UNICODE_STRING DeviceName; // // Has it been started? // Has the device been manually removed? // BOOLEAN Started; BOOLEAN ManuallyRemoved; } *PCOMMON_DATA; #define GET_COMMON_DATA(ext) ((PCOMMON_DATA) ext) // // Define the keyboard portion of the port device extension. // typedef struct _PORT_KEYBOARD_EXTENSION { // // Data in common with the mouse extension; // struct COMMON_DATA; } PORT_KEYBOARD_EXTENSION, *PPORT_KEYBOARD_EXTENSION; // // Define the mouse portion of the port device extension. // typedef struct _PORT_MOUSE_EXTENSION { // // Data in common with the keyboard extension; // struct COMMON_DATA; } PORT_MOUSE_EXTENSION, *PPORT_MOUSE_EXTENSION; // // controller specific data used by both devices // typedef struct _CONTROLLER_DATA { // // Indicate which hardware is actually present (keyboard and/or mouse). // ULONG HardwarePresent; // // IOCTL synchronization object // PCONTROLLER_OBJECT ControllerObject; // // Port configuration information. // I8042_CONFIGURATION_INFORMATION Configuration; // // Spin lock to guard powering the devices back up // KSPIN_LOCK PowerUpSpinLock; } CONTROLLER_DATA, *PCONTROLLER_DATA; typedef struct _GLOBALS { #if PTDRV_VERBOSE // // Flags: Bit field for enabling debugging print statements // Level: Legacy way of controllign debugging statements // ULONG DebugFlags; #endif // // Pointer to controller specific data that both extensions may access it // PCONTROLLER_DATA ControllerData; // // The two possible extensions that can be created // PPORT_MOUSE_EXTENSION MouseExtension; PPORT_KEYBOARD_EXTENSION KeyboardExtension; // // Path to the driver's entry in the registry // UNICODE_STRING RegistryPath; // // Keep track of the number of AddDevice and StartDevice calls. Want to // postpone h/w initialization until the last StartDevice is received // (due to some h/w which freezes if initialized more than once) // LONG AddedKeyboards; LONG AddedMice; ULONG ulDeviceNumber; USHORT PowerUpFlags; // // Provide mutual exclusion during dispatch functions // FAST_MUTEX DispatchMutex; } GLOBALS; extern GLOBALS Globals; // // Statically allocate the (known) scancode-to-indicator-light mapping. // This information is returned by the // IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION device control request. // #define KEYBOARD_NUMBER_OF_INDICATORS 3 static const INDICATOR_LIST IndicatorList[KEYBOARD_NUMBER_OF_INDICATORS] = { {0x3A, KEYBOARD_CAPS_LOCK_ON}, {0x45, KEYBOARD_NUM_LOCK_ON}, {0x46, KEYBOARD_SCROLL_LOCK_ON}}; // // Function prototypes. // NTSTATUS PtEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); #if PTDRV_VERBOSE VOID PtServiceParameters( IN PUNICODE_STRING RegistryPath ); #endif VOID PtSendCurrentKeyboardInput( IN PDEVICE_OBJECT DeviceObject, IN PKEYBOARD_INPUT_DATA pInput, IN ULONG ulEntries ); VOID PtSendCurrentMouseInput( IN PDEVICE_OBJECT DeviceObject, IN PMOUSE_INPUT_DATA pInput, IN ULONG ulEntries ); NTSTATUS PtClose ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PtCreate ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PtDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PtInternalDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID PtStartIo( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PtKeyboardConfiguration( IN PPORT_KEYBOARD_EXTENSION KeyboardExtension, IN PCM_RESOURCE_LIST ResourceList ); VOID PtKeyboardRemoveDevice( PDEVICE_OBJECT DeviceObject ); NTSTATUS PtKeyboardStartDevice( IN OUT PPORT_KEYBOARD_EXTENSION KeyboardExtension, IN PCM_RESOURCE_LIST ResourceList ); NTSTATUS PtMouseConfiguration( IN PPORT_MOUSE_EXTENSION MouseExtension, IN PCM_RESOURCE_LIST ResourceList ); NTSTATUS PtMouseStartDevice( PPORT_MOUSE_EXTENSION MouseExtension, IN PCM_RESOURCE_LIST ResourceList ); NTSTATUS PtAddDevice ( IN PDRIVER_OBJECT Driver, IN PDEVICE_OBJECT PDO ); VOID PtFilterResourceRequirements( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PtFindPortCallout( 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 ); LONG PtManuallyRemoveDevice( PCOMMON_DATA CommonData ); NTSTATUS PtPnP ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PtPnPComplete ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT Event ); NTSTATUS PtPower ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PtPowerUpToD0Complete ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); BOOLEAN PtRemovePort( IN PIO_RESOURCE_DESCRIPTOR ResDesc ); NTSTATUS PtSendIrpSynchronously ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID PtUnload( IN PDRIVER_OBJECT DriverObject ); NTSTATUS PtSystemControl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS PtInitWmi( PCOMMON_DATA CommonData ); NTSTATUS PtSetWmiDataBlock( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN ULONG InstanceIndex, IN ULONG BufferSize, IN PUCHAR Buffer ); NTSTATUS PtSetWmiDataItem( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN ULONG InstanceIndex, IN ULONG DataItemId, IN ULONG BufferSize, IN PUCHAR Buffer ); NTSTATUS PtKeyboardQueryWmiDataBlock( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN ULONG InstanceIndex, IN ULONG InstanceCount, IN OUT PULONG InstanceLengthArray, IN ULONG BufferAvail, OUT PUCHAR Buffer ); NTSTATUS PtMouseQueryWmiDataBlock( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN ULONG InstanceIndex, IN ULONG InstanceCount, IN OUT PULONG InstanceLengthArray, IN ULONG BufferAvail, OUT PUCHAR Buffer ); NTSTATUS PtQueryWmiRegInfo( IN PDEVICE_OBJECT DeviceObject, OUT PULONG RegFlags, OUT PUNICODE_STRING InstanceName, OUT PUNICODE_STRING *RegistryPath, OUT PUNICODE_STRING MofResourceName, OUT PDEVICE_OBJECT *Pdo ); extern WMIGUIDREGINFO KbWmiGuidList[1]; extern WMIGUIDREGINFO MouWmiGuidList[1]; #if DBG #define DEFAULT_DEBUG_FLAGS 0x8cc88888 #else #define DEFAULT_DEBUG_FLAGS 0x0 #endif #if PTDRV_VERBOSE // //Debug messaging and breakpoint macros // #define DBG_ALWAYS 0x00000000 #define DBG_STARTUP_SHUTDOWN_MASK 0x0000000F #define DBG_SS_NOISE 0x00000001 #define DBG_SS_TRACE 0x00000002 #define DBG_SS_INFO 0x00000004 #define DBG_SS_ERROR 0x00000008 #define DBG_IOCTL_MASK 0x00000F00 #define DBG_IOCTL_NOISE 0x00000100 #define DBG_IOCTL_TRACE 0x00000200 #define DBG_IOCTL_INFO 0x00000400 #define DBG_IOCTL_ERROR 0x00000800 #define DBG_DPC_MASK 0x0000F000 #define DBG_DPC_NOISE 0x00001000 #define DBG_DPC_TRACE 0x00002000 #define DBG_DPC_INFO 0x00004000 #define DBG_DPC_ERROR 0x00008000 #define DBG_POWER_MASK 0x00F00000 #define DBG_POWER_NOISE 0x00100000 #define DBG_POWER_TRACE 0x00200000 #define DBG_POWER_INFO 0x00400000 #define DBG_POWER_ERROR 0x00800000 #define DBG_PNP_MASK 0x0F000000 #define DBG_PNP_NOISE 0x01000000 #define DBG_PNP_TRACE 0x02000000 #define DBG_PNP_INFO 0x04000000 #define DBG_PNP_ERROR 0x08000000 #define Print(_flags_, _x_) \ if (Globals.DebugFlags & (_flags_) || !(_flags_)) { \ DbgPrint (pDriverName); \ DbgPrint _x_; \ } #define TRAP() DbgBreakPoint() #else #define Print(_l_,_x_) #define TRAP() #endif // PTDRV_VERBOSE #endif // _PTDRVCOM_