windows-nt/Source/XPSP1/NT/public/sdk/inc/gameport.h
2020-09-26 16:20:57 +08:00

442 lines
9.5 KiB
C

/*++
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