442 lines
9.9 KiB
C
442 lines
9.9 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
|
|
|
|
|