/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: gameport.h Abstract: This module contains the common public declarations for the game port enumerator. @@BEGIN_DDKSPLIT Author: Kenneth Ray @@END_DDKSPLIT Environment: kernel mode only Notes: Revision History: --*/ #ifndef __GAMEPORT_H #define __GAMEPORT_H #define FILE_DEVICE_GAMEENUM FILE_DEVICE_BUS_EXTENDER // *************************************************************************** // IOCTL interface to the bus (fdo) // // Clients use this to tell the enumerator what gaming devices on legacy ports // exist. (like for instance a control panel) // *************************************************************************** // // Define an Interface Guid to access the game port enumerator // #undef FAR #define FAR #undef PHYSICAL_ADDRESS #define PHYSICAL_ADDRESS LARGE_INTEGER DEFINE_GUID (GUID_GAMEENUM_BUS_ENUMERATOR, 0xcae56030, 0x684a, 0x11d0, 0xd6, 0xf6, 0x00, 0xa0, 0xc9, 0x0f, 0x57, 0xda); // cae56030-684a-11d0-b6f6-00a0c90f57da #define GAMEENUM_IOCTL(_index_) \ CTL_CODE (FILE_DEVICE_GAMEENUM, _index_, METHOD_BUFFERED, FILE_ANY_ACCESS) #define GAMEENUM_INTERNAL_IOCTL(_index_) \ CTL_CODE (FILE_DEVICE_GAMEENUM, _index_, METHOD_NEITHER, FILE_ANY_ACCESS) #define IOCTL_GAMEENUM_EXPOSE_HARDWARE GAMEENUM_IOCTL (0x0) #define IOCTL_GAMEENUM_REMOVE_HARDWARE GAMEENUM_IOCTL (0x1) #define IOCTL_GAMEENUM_PORT_DESC GAMEENUM_IOCTL (0x2) // // Private data storage area for OEM devices. Values preserved if supplied to // IOCTL_GAMEENUM_EXPOSE_HARDWARE and GAMEENUM_INTERNAL_IOCTL_EXPOSE_SIBLING, // and set to zero otherwise on initial mini-driver invocation (DriverEntry). // #define SIZE_GAMEENUM_OEM_DATA 8 typedef ULONG GAMEENUM_OEM_DATA[SIZE_GAMEENUM_OEM_DATA]; #if _MSC_VER >= 1200 #pragma warning(push) #endif #pragma warning(disable:4200) typedef struct _GAMEENUM_EXPOSE_HARDWARE { // // sizeof (struct _GAMEENUM_HARDWARE) // IN ULONG Size; // // The handle of the port found in the port desc // IN PVOID PortHandle; // // A handle to the exposed PDO // OUT PVOID HardwareHandle; // // For legacy joysticks only // IN USHORT NumberJoysticks; // // legacy joysticks only (joysticks * axis <= 4). // IN USHORT NumberAxis; // // Unique ID // IN USHORT UnitID; // // Number of buttons present on the device // IN USHORT NumberButtons; // // Bit flags controlling the behavior of the device // USHORT Flags; // // Reserved for future use // USHORT Reserved[5]; // // Specific OEM Data // IN GAMEENUM_OEM_DATA OemData; // // An array of (zero terminated wide character strings). The array itself // also null terminated (ie, MULTI_SZ) // IN WCHAR HardwareIDs[]; } GAMEENUM_EXPOSE_HARDWARE, *PGAMEENUM_EXPOSE_HARDWARE; // // Bit values defined for the Flags field // GAMEENUM_FLAG_NOCOMPATID the default compatibility hardware ID should // not be exposed for this device. // GAMEENUM_FLAG_COMPATIDCTRL if this is zero GAMEENUM_FLAG_NOCOMPATID is // ignored // GAMEENUM_FLAG_RESERVED reserved bits, should be set to zero // #define GAMEENUM_FLAG_NOCOMPATID 0x0001 #define GAMEENUM_FLAG_COMPATIDCTRL 0x0002 #define GAMEENUM_FLAG_RESERVED 0xFFFC #if _MSC_VER >= 1200 #pragma warning(pop) #endif typedef struct _GAMEENUM_REMOVE_HARDWARE { // // sizeof (struct _REMOVE_HARDWARE) // IN ULONG Size; // // Same value as HardwareHandle in GAMEENUM_EXPOSE_HARDWARE // IN PVOID HardwareHandle; } GAMEENUM_REMOVE_HARDWARE, *PGAMEENUM_REMOVE_HARDWARE; typedef struct _GAMEENUM_PORT_DESC { IN ULONG Size; // sizeof (struct _PORT_DESC) OUT PVOID PortHandle; OUT PHYSICAL_ADDRESS PortAddress; ULONG Reserved [5]; } GAMEENUM_PORT_DESC, *PGAMEENUM_PORT_DESC; // ************************************************************************** // Internal IOCTL interface for (pdo) // The HID to legacy game port minidriver uses this interface to // find the address of the device. // ************************************************************************** #define IOCTL_GAMEENUM_PORT_PARAMETERS GAMEENUM_INTERNAL_IOCTL (0x100) #define IOCTL_GAMEENUM_EXPOSE_SIBLING GAMEENUM_INTERNAL_IOCTL (0x101) #define IOCTL_GAMEENUM_REMOVE_SELF GAMEENUM_INTERNAL_IOCTL (0x102) #define IOCTL_GAMEENUM_ACQUIRE_ACCESSORS GAMEENUM_INTERNAL_IOCTL (0x103) // Of which IO_STACK_LOCATION->Parameters.Others.Argument1 is set to // a pointer to struct _GAMEENUM_GAME_PARAMETERS typedef UCHAR (*PGAMEENUM_READPORT) ( PVOID GameContext ); typedef VOID (*PGAMEENUM_WRITEPORT) ( PVOID GameContext, UCHAR Value ); #define GAMEENUM_BUTTON_1 0x01 #define GAMEENUM_BUTTON_2 0x02 #define GAMEENUM_BUTTON_3 0x04 #define GAMEENUM_BUTTON_4 0x08 #define GAMEENUM_AXIS_X 0x10 #define GAMEENUM_AXIS_Y 0x20 #define GAMEENUM_AXIS_R 0x40 #define GAMEENUM_AXIS_Z 0x80 #ifndef NTSTATUS typedef LONG NTSTATUS; #endif typedef NTSTATUS (*PGAMEENUM_READPORT_DIGITAL) ( IN PVOID Context, IN UCHAR ButtonAxisMask, IN BOOLEAN Approximate, IN OUT ULONG AxisState[4], OUT UCHAR ButtonState[4] ); /*++ Routine Description. Will read from the gameport digitally. Arguments: Context - value passed in GAME_PORT_PARAMETERS.GameContext ButtonAxisMask - Mask indicating which axis and buttons are expected to have valid data Approximate - OK to approximate (if polling times out, etc) AxisState - IN = Last valid axis state OUT = Current Axis state Index Maps to Axis 0 X 1 Y 2 R 3 Z ButtonState - OUT = Current button state. --*/ typedef NTSTATUS (*PGAMEENUM_ACQUIRE_PORT) ( PVOID GameContext ); typedef VOID (*PGAMEENUM_RELEASE_PORT) ( PVOID GameContext ); typedef enum _GAMEENUM_PORTION { GameenumFirstHalf, GameenumSecondHalf, GameenumWhole } GAMEENUM_PORTION; typedef struct _GAMEENUM_PORT_PARAMETERS { // // sizeof (GAMEENUM_GET_PORT_PARAMETERS) // IN ULONG Size; // // read the game port (analog) // OUT PGAMEENUM_READPORT ReadAccessor; // // write the game port (analog) // OUT PGAMEENUM_WRITEPORT WriteAccessor; // // token to read/write this game port // OUT PVOID GameContext; // // Which joystick is it? // OUT GAMEENUM_PORTION Portion; // // legacy joysticks only // OUT USHORT NumberAxis; // // unique id // IN USHORT UnitID; // // OEM specific data // IN GAMEENUM_OEM_DATA OemData; // // Number of buttons // OUT USHORT NumberButtons; // // Reserved for future use // USHORT Reserved2; // // Read the game port (digital) // OUT PGAMEENUM_READPORT_DIGITAL ReadAccessorDigital; // // Function to call before reading/writing to the port // OUT PGAMEENUM_ACQUIRE_PORT AcquirePort; // // Function to call when done reading/writing to the port // OUT PGAMEENUM_RELEASE_PORT ReleasePort; // // Context to pass to AcquirePort and ReleasePort // OUT PVOID PortContext; ULONG Reserved[3]; } GAMEENUM_PORT_PARAMETERS, *PGAMEENUM_PORT_PARAMETERS; typedef struct _GAMEENUM_EXPOSE_SIBLING { // // sizeof (struct _GAMEENUM_EXPOSE_SIBLING) // IN ULONG Size; // // A handle to the exposed PDO // OUT PVOID HardwareHandle; // // OEM specific data // IN GAMEENUM_OEM_DATA OemData; // // The id of this device object // IN USHORT UnitID; USHORT Reserved[3]; // // An array of (zero terminated wide character strings). The array itself // also null terminated (ie, MULTI_SZ), // IN PWCHAR HardwareIDs OPTIONAL; } GAMEENUM_EXPOSE_SIBLING, *PGAMEENUM_EXPOSE_SIBLING; // // This struct is sent down to the PDO/lower filters of gameenum via // the internal IOCTL IOCTL_GAMEENUM_ACQUIRE_ACCESSORS. If this IOCTL is // handled, GameContext, ReadAccessor, and WriteAccessor must be filled in. // ReadAccessorDigital is optional // typedef struct _GAMEENUM_ACQUIRE_ACCESSORS { // // sizeof (struct _GAMEENUM_ACQUIRE_ACCESSORS) // IN ULONG Size; // // token to read/write this game port // OUT PVOID GameContext; // // read the game port (analog) // OUT PGAMEENUM_READPORT ReadAccessor; // // write the game port (analog) // OUT PGAMEENUM_WRITEPORT WriteAccessor; // // Read the game port (digital) // OUT PGAMEENUM_READPORT_DIGITAL ReadAccessorDigital; // // Function to call before reading/writing to the port // OUT PGAMEENUM_ACQUIRE_PORT AcquirePort; // // Function to call when done reading/writing to the port // OUT PGAMEENUM_RELEASE_PORT ReleasePort; // // Context to pass to AcquirePort and ReleasePort // OUT PVOID PortContext; OUT ULONG Reserved[3]; } GAMEENUM_ACQUIRE_ACCESSORS, *PGAMEENUM_ACQUIRE_ACCESSORS; #endif