/*
 *  dinput.h    DirectInput interfaces
 *
 * =========================================================================
 *
 *                          Open Watcom Project
 *
 * Copyright (c) 2004-2010 The Open Watcom Contributors. All Rights Reserved.
 *
 *    This file is automatically generated. Do not edit directly.
 *
 * =========================================================================
 */

#ifndef __DINPUT_INCLUDED__
#define __DINPUT_INCLUDED__

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file;
#endif

#define COM_NO_WINDOWS_H
#include <objbase.h>

#ifdef __cplusplus
extern "C" {
#endif

/* DirectInput version number */
#define DIRECTINPUT_HEADER_VERSION  0x0800
#ifndef DIRECTINPUT_VERSION
    #define DIRECTINPUT_VERSION     DIRECTINPUT_HEADER_VERSION
#endif

/* Forward declarations */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef interface IDirectInputEffect    IDirectInputEffect;
#endif
#if (DIRECTINPUT_VERSION >= 0x0800)
typedef interface IDirectInputDevice8A  IDirectInputDevice8A;
typedef interface IDirectInputDevice8W  IDirectInputDevice8W;
#endif

/* Direct3D color data type */
#if (DIRECTINPUT_VERSION >= 0x0700)
#ifndef D3DCOLOR_DEFINED
#define D3DCOLOR_DEFINED
typedef DWORD   D3DCOLOR;
#endif
#endif

/* DirectInput effect types */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIEFT_ALL                   0x00000000L
    #define DIEFT_CONSTANTFORCE         0x00000001L
    #define DIEFT_RAMPFORCE             0x00000002L
    #define DIEFT_PERIODIC              0x00000003L
    #define DIEFT_CONDITION             0x00000004L
    #define DIEFT_CUSTOMFORCE           0x00000005L
    #define DIEFT_HARDWARE              0x000000FFL
    #define DIEFT_FFATTACK              0x00000200L
    #define DIEFT_FFFADE                0x00000400L
    #define DIEFT_SATURATION            0x00000800L
    #define DIEFT_POSNEGCOEFFICIENTS    0x00001000L
    #define DIEFT_POSNEGSATURATION      0x00002000L
    #define DIEFT_DEADBAND              0x00004000L
    #define DIEFT_STARTDELAY            0x00008000L
    #define DIEFT_GETTYPE( x )          LOBYTE( x )
#endif

/* DirectInput units */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DI_DEGREES      100
    #define DI_FFNOMINALMAX 10000
    #define DI_SECONDS      1000000
#endif

/* DirectInput effect flags */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIEFF_OBJECTIDS     0x00000001L
    #define DIEFF_OBJECTOFFSETS 0x00000002L
    #define DIEFF_CARTESIAN     0x00000010L
    #define DIEFF_POLAR         0x00000020L
    #define DIEFF_SPHERICAL     0x00000040L
#endif

/* DirectInput effect parameters */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIEP_DURATION               0x00000001L
    #define DIEP_SAMPLEPERIOD           0x00000002L
    #define DIEP_GAIN                   0x00000004L
    #define DIEP_TRIGGERBUTTON          0x00000008L
    #define DIEP_TRIGGERREPEATINTERVAL  0x00000010L
    #define DIEP_AXES                   0x00000020L
    #define DIEP_DIRECTION              0x00000040L
    #define DIEP_ENVELOPE               0x00000080L
    #define DIEP_TYPESPECIFICPARAMS     0x00000100L
    #if (DIRECTINPUT_VERSION >= 0x0600)
        #define DIEP_STARTDELAY         0x00000200L
        #define DIEP_ALLPARAMS_DX5      0x000001FFL
        #define DIEP_ALLPARAMS          0x000003FFL
    #else
        #define DIEP_ALLPARAMS          0x000001FFL
    #endif
    #define DIEP_START                  0x20000000L
    #define DIEP_NORESTART              0x40000000L
    #define DIEP_NODOWNLOAD             0x80000000L
#endif

/* DirectInput effect trigger button special value */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIEB_NOTRIGGER  0xFFFFFFFFL
#endif

/* DirectInput effect start modes */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIES_SOLO       0x00000001L
    #define DIES_NODOWNLOAD 0x80000000L
#endif

/* DirectInput effect status flags */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIEGES_PLAYING  0x00000001L
    #define DIEGES_EMULATED 0x00000002L
#endif

/* DirectInput device types */
#if (DIRECTINPUT_VERSION <= 0x0700)
    #define DIDEVTYPE_DEVICE            1
    #define DIDEVTYPE_MOUSE             2
    #define DIDEVTYPE_KEYBOARD          3
    #define DIDEVTYPE_JOYSTICK          4
#else
    #define DI8DEVCLASS_ALL             0
    #define DI8DEVCLASS_DEVICE          1
    #define DI8DEVCLASS_POINTER         2
    #define DI8DEVCLASS_KEYBOARD        3
    #define DI8DEVCLASS_GAMECTRL        4
    #define DI8DEVTYPE_DEVICE           0x11
    #define DI8DEVTYPE_MOUSE            0x12
    #define DI8DEVTYPE_KEYBOARD         0x13
    #define DI8DEVTYPE_JOYSTICK         0x14
    #define DI8DEVTYPE_GAMEPAD          0x15
    #define DI8DEVTYPE_DRIVING          0x16
    #define DI8DEVTYPE_FLIGHT           0x17
    #define DI8DEVTYPE_1STPERSON        0x18
    #define DI8DEVTYPE_DEVICECTRL       0x19
    #define DI8DEVTYPE_SCREENPOINTER    0x1A
    #define DI8DEVTYPE_REMOTE           0x1B
    #define DI8DEVTYPE_SUPPLEMENTAL     0x1C
#endif
#define DIDEVTYPE_HID                   0x00010000L

/* DirectInput mouse device types */
#if (DIRECTINPUT_VERSION <= 0x0700)
    #define DIDEVTYPEMOUSE_UNKNOWN      1
    #define DIDEVTYPEMOUSE_TRADITIONAL  2
    #define DIDEVTYPEMOUSE_FINGERSTICK  3
    #define DIDEVTYPEMOUSE_TOUCHPAD     4
    #define DIDEVTYPEMOUSE_TRACKBALL    5
#else
    #define DI8DEVTYPEMOUSE_UNKNOWN     1
    #define DI8DEVTYPEMOUSE_TRADITIONAL 2
    #define DI8DEVTYPEMOUSE_FINGERSTICK 3
    #define DI8DEVTYPEMOUSE_TOUCHPAD    4
    #define DI8DEVTYPEMOUSE_TRACKBALL   5
    #define DI8DEVTYPEMOUSE_ABSOLUTE    6
#endif

/* DirectInput keyboard device types */
#if (DIRECTINPUT_VERSION <= 0x0700)
    #define DIDEVTYPEKEYBOARD_UNKNOWN       0
    #define DIDEVTYPEKEYBOARD_PCXT          1
    #define DIDEVTYPEKEYBOARD_OLIVETTI      2
    #define DIDEVTYPEKEYBOARD_PCAT          3
    #define DIDEVTYPEKEYBOARD_PCENH         4
    #define DIDEVTYPEKEYBOARD_NOKIA1050     5
    #define DIDEVTYPEKEYBOARD_NOKIA9140     6
    #define DIDEVTYPEKEYBOARD_NEC98         7
    #define DIDEVTYPEKEYBOARD_NEC98LAPTOP   8
    #define DIDEVTYPEKEYBOARD_NEC98106      9
    #define DIDEVTYPEKEYBOARD_JAPAN106      10
    #define DIDEVTYPEKEYBOARD_JAPANAX       11
    #define DIDEVTYPEKEYBOARD_J3100         12
#else
    #define DI8DEVTYPEKEYBOARD_UNKNOWN      0
    #define DI8DEVTYPEKEYBOARD_PCXT         1
    #define DI8DEVTYPEKEYBOARD_OLIVETTI     2
    #define DI8DEVTYPEKEYBOARD_PCAT         3
    #define DI8DEVTYPEKEYBOARD_PCENH        4
    #define DI8DEVTYPEKEYBOARD_NOKIA1050    5
    #define DI8DEVTYPEKEYBOARD_NOIKA9140    6
    #define DI8DEVTYPEKEYBOARD_NEC98        7
    #define DI8DEVTYPEKEYBOARD_NEC98LAPTOP  8
    #define DI8DEVTYPEKEYBOARD_NEC98106     9
    #define DI8DEVTYPEKEYBOARD_JAPAN106     10
    #define DI8DEVTYPEKEYBOARD_JAPANAX      11
    #define DI8DEVTYPEKEYBOARD_J3100        12
#endif

/* DirectInput joystick device types */
#if (DIRECTINPUT_VERSION <= 0x0700)
    #define DIDEVTYPEJOYSTICK_UNKNOWN               1
    #define DIDEVTYPEJOYSTICK_TRADITIONAL           2
    #define DIDEVTYPEJOYSTICK_FLIGHTSTICK           3
    #define DIDEVTYPEJOYSTICK_GAMEPAD               4
    #define DIDEVTYPEJOYSTICK_RUDDER                5
    #define DIDEVTYPEJOYSTICK_WHEEL                 6
    #define DIDEVTYPEJOYSTICK_HEADTRACKER           7
#else
    #define DI8DEVTYPE_LIMITEDGAMESUBTYPE           1
    #define DI8DEVTYPEJOYSTICK_LIMITED              DI8DEVTYPE_LIMITEDGAMESUBTYPE
    #define DI8DEVTYPEJOYSTICK_STANDARD             2
    #define DI8DEVTYPEGAMEPAD_LIMITED               DI8DEVTYPE_LIMITEDGAMESUBTYPE
    #define DI8DEVTYPEGAMEPAD_STANDARD              2
    #define DI8DEVTYPEGAMEPAD_TILT                  3
    #define DI8DEVTYPEDRIVING_LIMITED               DI8DEVTYPE_LIMITEDGAMESUBTYPE
    #define DI8DEVTYPEDRIVING_COMBINEDPEDALS        2
    #define DI8DEVTYPEDRIVING_DUALPEDALS            3
    #define DI8DEVTYPEDRIVING_THREEPEDALS           4
    #define DI8DEVTYPEDRIVING_HANDHELD              5
    #define DI8DEVTYPEFLIGHT_LIMITED                DI8DEVTYPE_LIMITEDGAMESUBTYPE
    #define DI8DEVTYPEFLIGHT_STICK                  2
    #define DI8DEVTYPEFLIGHT_YOKE                   3
    #define DI8DEVTYPEFLIGHT_RC                     4
    #define DI8DEVTYPE1STPERSON_LIMITED             DI8DEVTYPE_LIMITEDGAMESUBTYPE
    #define DI8DEVTYPE1STPERSON_UNKNOWN             2
    #define DI8DEVTYPE1STPERSON_SIXDOF              3
    #define DI8DEVTYPE1STPERSON_SHOOTER             4
    #define DI8DEVTYPESCREENPTR_UNKNOWN             2
    #define DI8DEVTYPESCREENPTR_LIGHTGUN            3
    #define DI8DEVTYPESCREENPTR_LIGHTPEN            4
    #define DI8DEVTYPESCREENPTR_TOUCH               5
    #define DI8DEVTYPEREMOTE_UNKNOWN                2
    #define DI8DEVTYPEDEVICECTRL_UNKNOWN            2
    #define DI8DEVTYPEDEVICECTRL_COMMSSELECTION     3
    #define DI8DEVTYPEDEVICECTRL_COMMSSELECTION_HARDWIRED   4
    #define DI8DEVTYPESUPPLEMENTAL_UNKNOWN          2
    #define DI8DEVTYPESUPPLEMENTAL_2NDHANDCONTROLLER    3
    #define DI8DEVTYPESUPPLEMENTAL_HEADTRACKER      4
    #define DI8DEVTYPESUPPLEMENTAL_HANDTRACKER      5
    #define DI8DEVTYPESUPPLEMENTAL_SHIFTSTICKGATE   6
    #define DI8DEVTYPESUPPLEMENTAL_SHIFTER          7
    #define DI8DEVTYPESUPPLEMENTAL_THROTTLE         8
    #define DI8DEVTYPESUPPLEMENTAL_SPLITTHROTTLE    9
    #define DI8DEVTYPESUPPLEMENTAL_COMBINEDPEDALS   10
    #define DI8DEVTYPESUPPLEMENTAL_DUALPEDALS       11
    #define DI8DEVTYPESUPPLEMENTAL_THREEPEDALS      12
    #define DI8DEVTYPESUPPLEMENTAL_RUDDERPEDALS     13
#endif

/* Macros to manipulate DirectInput device types */
#define GET_DIDEVICE_TYPE( x )      LOBYTE( x )
#define GET_DIDEVICE_SUBTYPE( x )   HIBYTE( x )

/* DirectInput device capability flags */
#define DIDC_ATTACHED               0x00000001L
#define DIDC_POLLEDDEVICE           0x00000002L
#define DIDC_EMULATED               0x00000004L
#define DIDC_POLLEDDATAFORMAT       0x00000008L
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIDC_FORCEFEEDBACK      0x00000100L
    #define DIDC_FFATTACK           0x00000200L
    #define DIDC_FFFADE             0x00000400L
    #define DIDC_SATURATION         0x00000800L
    #define DIDC_POSNEGCOEFFICIENTS 0x00001000L
    #define DIDC_POSNEGSATURATION   0x00002000L
    #define DIDC_DEADBAND           0x00004000L
#endif
#define DIDC_STARTDELAY             0x00008000L
#if (DIRECTINPUT_VERSION >= 0x050A)
    #define DIDC_ALIAS              0x00010000L
    #define DIDC_PHANTOM            0x00020000L
#endif
#if (DIRECTINPUT_VERSION >= 0x0800)
    #define DIDC_HIDDEN             0x00040000L
#endif

/* DirectInput device object type flags */
#define DIDFT_ALL               0x00000000L
#define DIDFT_RELAXIS           0x00000001L
#define DIDFT_ABSAXIS           0x00000002L
#define DIDFT_AXIS              0x00000003L
#define DIDFT_PSHBUTTON         0x00000004L
#define DIDFT_TGLBUTTON         0x00000008L
#define DIDFT_BUTTON            0x0000000CL
#define DIDFT_POV               0x00000010L
#define DIDFT_COLLECTION        0x00000040L
#define DIDFT_NODATA            0x00000080L
#define DIDFT_ANYINSTANCE       0x00FFFF00L
#define DIDFT_INSTANCEMASK      DIDFT_ANYINSTANCE
#define DIDFT_FFACTUATOR        0x01000000L
#define DIDFT_FFEFFECTTRIGGER   0x02000000L
#if (DIRECTINPUT_VERSION >= 0x050A)
    #define DIDFT_OUTPUT        0x10000000L
    #define DIDFT_VENDORDEFINED 0x04000000L
    #define DIDFT_ALIAS         0x08000000L
#endif
#ifndef DIDFT_OPTIONAL
    #define DIDFT_OPTIONAL      0x80000000L
#endif
#define DIDFT_NOCOLLECTION      0x00FFFF00L

/* Macros to manipulate DirectInput device object type flags */
#define DIDFT_MAKEINSTANCE( x )     ((WORD)(x) << 8)
#define DIDFT_GETTYPE( x )          LOBYTE( x )
#define DIDFT_GETINSTANCE( x )      LOWORD( (x) >> 8 )
#define DIDFT_ENUMCOLLECTION( x )   ((WORD)(x) << 8)

/* DirectInput data format flags */
#define DIDF_ABSAXIS    0x00000001L
#define DIDF_RELAXIS    0x00000002L

/* DirectInput action flags */
#if (DIRECTINPUT_VERSION > 0x0700)
    #define DIA_FORCEFEEDBACK   0x00000001L
    #define DIA_APPMAPPED       0x00000002L
    #define DIA_APPNOMAP        0x00000004L
    #define DIA_NORANGE         0x00000008L
    #define DIA_APPFIXED        0x00000010L
#endif

/* DirectInput action how flags */
#if (DIRECTINPUT_VERSION > 0x0700)
    #define DIAH_UNMAPPED       0x00000000L
    #define DIAH_USERCONFIG     0x00000001L
    #define DIAH_APPREQUESTED   0x00000002L
    #define DIAH_HWAPP          0x00000004L
    #define DIAH_HWDEFAULT      0x00000008L
    #define DIAH_DEFAULT        0x00000020L
    #define DIAH_ERROR          0x80000000L
#endif

/* DirectInput action format timestamp special values */
#if (DIRECTINPUT_VERSION > 0x0700)
    #define DIAFTS_NEWDEVICELOW     0xFFFFFFFFL
    #define DIAFTS_NEWDEVICEHIGH    0xFFFFFFFFL
    #define DIAFTS_UNUSEDDEVICELOW  0x00000000L
    #define DIAFTS_UNUSEDDEVICEHIGH 0x00000000L
#endif

/* IDirectInputDevice8::BuildActionMap() flags */
#if (DIRECTINPUT_VERSION > 0x0700)
    #define DIDBAM_DEFAULT      0x00000000L
    #define DIDBAM_PRESERVE     0x00000001L
    #define DIDBAM_INITIALIZE   0x00000002L
    #define DIDBAM_HWDEFAULTS   0x00000004L
#endif

/* IDirectInputDevice8::SetActionMap() flags */
#if (DIRECTINPUT_VERSION > 0x0700)
    #define DIDSAM_DEFAULT      0x00000000L
    #define DIDSAM_NOUSER       0x00000001L
    #define DIDSAM_FORCESAVE    0x00000002L
#endif

/* IDirectInput8::ConfigureDevices() flags */
#if (DIRECTINPUT_VERSION > 0x0700)
    #define DICD_DEFAULT    0x00000000L
    #define DICD_EDIT       0x00000001L
#endif

/* DirectInput device image information flags */
#if (DIRECTINPUT_VERSION > 0x0700)
    #define DIDIFT_CONFIGURATION    0x00000001L
    #define DIDIFT_OVERLAY          0x00000002L
#endif

/* DirectInput device image information alignment flags */
#if (DIRECTINPUT_VERSION > 0x0700)
    #define DIDAL_CENTERED      0x00000000L
    #define DIDAL_LEFTALIGNED   0x00000001L
    #define DIDAL_RIGHTALIGNED  0x00000002L
    #define DIDAL_MIDDLE        0x00000000L
    #define DIDAL_TOPALIGNED    0x00000004L
    #define DIDAL_BOTTOMALIGNED 0x00000008L
#endif

/* DirectInput device object instance flags */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIDOI_FFACTUATOR        0x00000001L
    #define DIDOI_FFEFFECTTRIGGER   0x00000002L
    #define DIDOI_POLLED            0x00008000L
    #define DIDOI_ASPECTPOSITION    0x00000100L
    #define DIDOI_ASPECTVELOCITY    0x00000200L
    #define DIDOI_ASPECTACCEL       0x00000300L
    #define DIDOI_ASPECTFORCE       0x00000400L
    #define DIDOI_ASPECTMASK        0x00000F00L
#endif
#if (DIRECTINPUT_VERSION >= 0x050A)
    #define DIDOI_GUIDISUSAGE       0x00010000L
#endif

/* DirectInput property header how constants */
#define DIPH_DEVICE         0
#define DIPH_BYOFFSET       1
#define DIPH_BYID           2
#if (DIRECTINPUT_VERSION >= 0x050A)
    #define DIPH_BYUSAGE    3
#endif

/* Macro to make a DirectInput usage DWORD */
#if (DIRECTINPUT_VERSION >= 0x050A)
    #define DIMAKEUSAGEDWORD( p1, p2 )  (DWORD)MAKELONG( p1, p2 )
#endif

/* DirectInput property range special values */
#define DIPROPRANGE_NOMIN   0x80000000L
#define DIPROPRANGE_NOMAX   0x7FFFFFFFL

/* Maximum number of calibration points */
#if (DIRECTINPUT_VERSION >= 0x0800)
    #define MAXCPOINTSNUM   8
#endif

/* Macro to make DirectInput properties */
#ifdef __cplusplus
    #define MAKEDIPROP( x ) (*(const GUID *)(x))
#else
    #define MAKEDIPROP( x ) ((REFGUID)(x))
#endif

/* DirectInput properties */
#define DIPROP_BUFFERSIZE           MAKEDIPROP( 1 )
#define DIPROP_AXISMODE             MAKEDIPROP( 2 )
#define DIPROP_GRANULARITY          MAKEDIPROP( 3 )
#define DIPROP_RANGE                MAKEDIPROP( 4 )
#define DIPROP_DEADZONE             MAKEDIPROP( 5 )
#define DIPROP_SATURATION           MAKEDIPROP( 6 )
#define DIPROP_FFGAIN               MAKEDIPROP( 7 )
#define DIPROP_FFLOAD               MAKEDIPROP( 8 )
#define DIPROP_AUTOCENTER           MAKEDIPROP( 9 )
#define DIPROP_CALIBRATIONMODE      MAKEDIPROP( 10 )
#if (DIRECTINPUT_VERSION >= 0x050A)
    #define DIPROP_CALIBRATION      MAKEDIPROP( 11 )
    #define DIPROP_GUIDANDPATH      MAKEDIPROP( 12 )
    #define DIPROP_INSTANCENAME     MAKEDIPROP( 13 )
    #define DIPROP_PRODUCTNAME      MAKEDIPROP( 14 )
#endif
#if (DIRECTINPUT_VERSION >= 0x05B2)
    #define DIPROP_JOYSTICKID       MAKEDIPROP( 15 )
    #define DIPROP_GETPORTDISPLAYNAME   MAKEDIPROP( 16 )
#endif
#if (DIRECTINPUT_VERSION >= 0x0700)
    #define DIPROP_PHYSICALRANGE    MAKEDIPROP( 18 )
    #define DIPROP_LOGICALRANGE     MAKEDIPROP( 19 )
#endif
#if (DIRECTINPUT_VERSION >= 0x0800)
    #define DIPROP_KEYNAME          MAKEDIPROP( 20 )
    #define DIPROP_CPOINTS          MAKEDIPROP( 21 )
    #define DIPROP_APPDATA          MAKEDIPROP( 22 )
    #define DIPROP_SCANCODE         MAKEDIPROP( 23 )
    #define DIPROP_VIDPID           MAKEDIPROP( 24 )
    #define DIPROP_USERNAME         MAKEDIPROP( 25 )
    #define DIPROP_TYPENAME         MAKEDIPROP( 26 )
#endif

/* DirectInput axis mode property values */
#define DIPROPAXISMODE_ABS  0
#define DIPROPAXISMODE_REL  1

/* DirectInput autocenter property values */
#define DIPROPAUTOCENTER_OFF    0
#define DIPROPAUTOCENTER_ON     1

/* DirectInput calibration mode property values */
#define DIPROPCALIBRATIONMODE_COOKED    0
#define DIPROPCALIBRATIONMODE_RAW       1

/* IDirectInputDevice8::GetDeviceData() flags */
#define DIGDD_PEEK  0x00000001L

/* Macro to compare DirectInput sequences */
#define DISEQUENCE_COMPARE( p1, p2, p3 )    ((int)((p1) - (p3)) p2 0)

/* IDirectInputDevice::SetCooperativeLevel() flags */
#define DISCL_EXCLUSIVE     0x00000001L
#define DISCL_NONEXCLUSIVE  0x00000002L
#define DISCL_FOREGROUND    0x00000004L
#define DISCL_BACKGROUND    0x00000008L
#define DISCL_NOWINKEY      0x00000010L

/* IDirectInputDevice2::SendForceFeedbackCommand() flags */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DISFFC_RESET            0x00000001L
    #define DISFFC_STOPALL          0x00000002L
    #define DISFFC_PAUSE            0x00000004L
    #define DISFFC_CONTINUE         0x00000008L
    #define DISFFC_SETACTUATORSON   0x00000010L
    #define DISFFC_SETACUTATORSOFF  0x00000020L
#endif

/* IDirectInputDevice2::GetForceFeedbackState() flags */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIGFFS_EMPTY            0x00000001L
    #define DIGFFS_STOPPED          0x00000002L
    #define DIGFFS_PAUSED           0x00000004L
    #define DIGFFS_ACTUATORSON      0x00000010L
    #define DIGFFS_ACTUATORSOFF     0x00000020L
    #define DIGFFS_POWERON          0x00000040L
    #define DIGFFS_POWEROFF         0x00000080L
    #define DIGFFS_SAFETYSWITCHON   0x00000100L
    #define DIGFFS_SAFETYSWITCHOFF  0x00000200L
    #define DIGFFS_USERFFSWITCHON   0x00000400L
    #define DIGFFS_USERFFSWITCHOFF  0x00000800L
    #define DIGFFS_DEVICELOST       0x80000000L
#endif

/* IDirectInputDevice2::SendDeviceData() flags */
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DISDD_CONTINUE  0x00000001L
#endif

/* DirectInput effect flags */
#if (DIRECTINPUT_VERSION >= 0x0700)
    #define DIFEF_DEFAULT               0x00000000L
    #define DIFEF_INCLUDENONSTANDARD    0x00000001L
    #define DIFEF_MODIFYIFNEEDED        0x00000010L
#endif

/* DirectInput keyboard scan codes */
#define DIK_ESCAPE          0x01
#define DIK_1               0x02
#define DIK_2               0x03
#define DIK_3               0x04
#define DIK_4               0x05
#define DIK_5               0x06
#define DIK_6               0x07
#define DIK_7               0x08
#define DIK_8               0x09
#define DIK_9               0x0A
#define DIK_0               0x0B
#define DIK_MINUS           0x0C
#define DIK_EQUALS          0x0D
#define DIK_BACK            0x0E
#define DIK_TAB             0x0F
#define DIK_Q               0x10
#define DIK_W               0x11
#define DIK_E               0x12
#define DIK_R               0x13
#define DIK_T               0x14
#define DIK_Y               0x15
#define DIK_U               0x16
#define DIK_I               0x17
#define DIK_O               0x18
#define DIK_P               0x19
#define DIK_LBRACKET        0x1A
#define DIK_RBRACKET        0x1B
#define DIK_RETURN          0x1C
#define DIK_LCONTROL        0x1D
#define DIK_A               0x1E
#define DIK_S               0x1F
#define DIK_D               0x20
#define DIK_F               0x21
#define DIK_G               0x22
#define DIK_H               0x23
#define DIK_J               0x24
#define DIK_K               0x25
#define DIK_L               0x26
#define DIK_SEMICOLON       0x27
#define DIK_APOSTROPHE      0x28
#define DIK_GRAVE           0x29
#define DIK_LSHIFT          0x2A
#define DIK_BACKSLASH       0x2B
#define DIK_Z               0x2C
#define DIK_X               0x2D
#define DIK_C               0x2E
#define DIK_V               0x2F
#define DIK_B               0x30
#define DIK_N               0x31
#define DIK_M               0x32
#define DIK_COMMA           0x33
#define DIK_PERIOD          0x34
#define DIK_SLASH           0x35
#define DIK_RSHIFT          0x36
#define DIK_MULTIPLY        0x37
#define DIK_LMENU           0x38
#define DIK_SPACE           0x39
#define DIK_CAPITAL         0x3A
#define DIK_F1              0x3B
#define DIK_F2              0x3C
#define DIK_F3              0x3D
#define DIK_F4              0x3E
#define DIK_F5              0x3F
#define DIK_F6              0x40
#define DIK_F7              0x41
#define DIK_F8              0x42
#define DIK_F9              0x43
#define DIK_F10             0x44
#define DIK_NUMLOCK         0x45
#define DIK_SCROLL          0x46
#define DIK_NUMPAD7         0x47
#define DIK_NUMPAD8         0x48
#define DIK_NUMPAD9         0x49
#define DIK_SUBTRACT        0x4A
#define DIK_NUMPAD4         0x4B
#define DIK_NUMPAD5         0x4C
#define DIK_NUMPAD6         0x4D
#define DIK_ADD             0x4E
#define DIK_NUMPAD1         0x4F
#define DIK_NUMPAD2         0x50
#define DIK_NUMPAD3         0x51
#define DIK_NUMPAD0         0x52
#define DIK_DECIMAL         0x53
#define DIK_OEM_102         0x56
#define DIK_F11             0x57
#define DIK_F12             0x58
#define DIK_F13             0x64
#define DIK_F14             0x65
#define DIK_F15             0x66
#define DIK_KANA            0x70
#define DIK_ABNT_C1         0x73
#define DIK_CONVERT         0x79
#define DIK_NOCONVERT       0x7B
#define DIK_YEN             0x7D
#define DIK_ABNT_C2         0x7E
#define DIK_NUMPADEQUALS    0x8D
#define DIK_PREVTRACK       0x90
#define DIK_AT              0x91
#define DIK_COLON           0x92
#define DIK_UNDERLINE       0x93
#define DIK_KANJI           0x94
#define DIK_STOP            0x95
#define DIK_AX              0x96
#define DIK_UNLABELED       0x97
#define DIK_NEXTTRACK       0x99
#define DIK_NUMPADENTER     0x9C
#define DIK_RCONTROL        0x9D
#define DIK_MUTE            0xA0
#define DIK_CALCULATOR      0xA1
#define DIK_PLAYPAUSE       0xA2
#define DIK_MEDIASTOP       0xA4
#define DIK_VOLUMEDOWN      0xAE
#define DIK_VOLUMEUP        0xB0
#define DIK_WEBHOME         0xB2
#define DIK_NUMPADCOMMA     0xB3
#define DIK_DIVIDE          0xB5
#define DIK_SYSRQ           0xB7
#define DIK_RMENU           0xB8
#define DIK_PAUSE           0xC5
#define DIK_HOME            0xC7
#define DIK_UP              0xC8
#define DIK_PRIOR           0xC9
#define DIK_LEFT            0xCB
#define DIK_RIGHT           0xCD
#define DIK_END             0xCF
#define DIK_DOWN            0xD0
#define DIK_NEXT            0xD1
#define DIK_INSERT          0xD2
#define DIK_DELETE          0xD3
#define DIK_LWIN            0xDB
#define DIK_RWIN            0xDC
#define DIK_APPS            0xDD
#define DIK_POWER           0xDE
#define DIK_SLEEP           0xDF
#define DIK_WAKE            0xE3
#define DIK_WEBSEARCH       0xE5
#define DIK_WEBFAVORITES    0xE6
#define DIK_WEBREFRESH      0xE7
#define DIK_WEBSTOP         0xE8
#define DIK_WEBFORWARD      0xE9
#define DIK_WEBBACK         0xEA
#define DIK_MYCOMPUTER      0xEB
#define DIK_MAIL            0xEC
#define DIK_MEDIASELECT     0xED
#define DIK_BACKSPACE       DIK_BACK
#define DIK_NUMPADSTAR      DIK_MULTIPLY
#define DIK_LALT            DIK_LMENU
#define DIK_CAPSLOCK        DIK_CAPITAL
#define DIK_NUMPADMINUS     DIK_SUBTRACT
#define DIK_NUMPADPLUS      DIK_ADD
#define DIK_NUMPADPERIOD    DIK_DECIMAL
#define DIK_NUMPADSLASH     DIK_DIVIDE
#define DIK_RALT            DIK_RMENU
#define DIK_UPARROW         DIK_UP
#define DIK_PGUP            DIK_PRIOR
#define DIK_LEFTARROW       DIK_LEFT
#define DIK_RIGHTARROW      DIK_RIGHT
#define DIK_DOWNARROW       DIK_DOWN
#define DIK_PGDN            DIK_NEXT
#define DIK_CIRCUMFLEX      DIK_PREVTRACK

/* DirectInput enumeration constants */
#define DIENUM_STOP     0
#define DIENUM_CONTINUE 1

/* DirectInput device enumeration flags */
#define DIEDFL_ALLDEVICES           0x00000000L
#define DIEDFL_ATTACHEDONLY         0x00000001L
#if (DIRECTINPUT_VERSION >= 0x0500)
    #define DIEDFL_FORCEFEEDBACK    0x00000100L
#endif
#if (DIRECTINPUT_VERSION >= 0x050A)
    #define DIEDFL_INCLUDEALIASES   0x00010000L
    #define DIEDFL_INCLUDEPHANTOMS  0x00020000L
#endif
#if (DIRECTINPUT_VERSION >= 0x0800)
    #define DIEDFL_INCLUDEHIDDEN    0x00040000L
#endif

/* DirectInput device enumeration by semantics flags */
#if (DIRECTINPUT_VERSION >= 0x0800)
    #define DIEDBS_MAPPEDPRI1           0x00000001L
    #define DIEDBS_MAPPEDPRI2           0x00000002L
    #define DIEDBS_RECENTDEVICE         0x00000010L
    #define DIEDBS_NEWDEVICE            0x00000020L
    #define DIEDBSFL_ATTACHEDONLY       0x00000000L
    #define DIEDBSFL_THISUSER           0x00000010L
    #define DIEDBSFL_FORCEFEEDBACK      DIEDFL_FORCEFEEDBACK
    #define DIEDBSFL_AVAILABLEDEVICES   0x00001000L
    #define DIEDBSFL_MULTIMICEKEYBOARDS 0x00002000L
    #define DIEDBSFL_NONGAMINGDEVICES   0x00004000L
    #define DIEDBSFL_VALID              0x00007110L
#endif

/* DirectInput return codes */
#define DI_OK                       S_OK
#define DI_NOTATTACHED              S_FALSE
#define DI_BUFFEROVERFLOW           S_FALSE
#define DI_PROPNOEFFECT             S_FALSE
#define DI_NOEFFECT                 S_FALSE
#define DI_POLLEDDEVICE             0x00000002L
#define DI_DOWNLOADSKIPPED          0x00000003L
#define DI_EFFECTRESTARTED          0x00000004L
#define DI_TRUNCATED                0x00000008L
#define DI_SETTINGSNOTSAVED         0x0000000BL
#define DI_TRUNCATEDANDRESTARTED    0x0000000CL
#define DI_WRITEPROTECT             0x00000013L
#define DIERR_OLDDIRECTINPUTVERSION \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION )
#define DIERR_BETADIRECTINPUTVERSION \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP )
#define DIERR_BADDRIVERVER \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL )
#define DIERR_DEVICENOTREG          REGDB_E_CLASSNOTREG
#define DIERR_NOTFOUND \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND )
#define DIERR_OBJECTNOTFOUND \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND )
#define DIERR_INVALIDPARAM          E_INVALIDARG
#define DIERR_NOINTERFACE           E_NOINTERFACE
#define DIERR_GENERIC               E_FAIL
#define DIERR_OUTOFMEMORY           E_OUTOFMEMORY
#define DIERR_UNSUPPORTED           E_NOTIMPL
#define DIERR_NOTINITIALIZED \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY )
#define DIERR_ALREADYINITIALIZED \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED )
#define DIERR_NOAGGREGATION         CLASS_E_NOAGGREGATION
#define DIERR_OTHERAPPHASPRIO       E_ACCESSDENIED
#define DIERR_INPUTLOST \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT )
#define DIERR_ACQUIRED \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY )
#define DIERR_NOTACQUIRED \
    MAKE_HRESULT( SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS )
#define DIERR_READONLY              E_ACCESSDENIED
#define DIERR_HANDLEEXISTS          E_ACCESSDENIED
#define DIERR_INSUFFICIENTPRIVS     0x80040200L
#define DIERR_DEVICEFULL            0x80040201L
#define DIERR_MOREDATA              0x80040202L
#define DIERR_NOTDOWNLOADED         0x80040203L
#define DIERR_HASEFFECTS            0x80040204L
#define DIERR_NOTEXCLUSIVEACQUIRED  0x80040205L
#define DIERR_INCOMPLETEEFFECT      0x80040206L
#define DIERR_NOTBUFFERED           0x80040207L
#define DIERR_EFFECTPLAYING         0x80040208L
#define DIERR_UNPLUGGED             0x80040209L
#define DIERR_REPORTFULL            0x8004020AL
#define DIERR_MAPFILEFAIL           0x8004020BL

/* DirectInput keyboard mapping constants */
#define DIKEYBOARD_ESCAPE       0x81000401L
#define DIKEYBOARD_1            0x81000402L
#define DIKEYBOARD_2            0x81000403L
#define DIKEYBOARD_3            0x81000404L
#define DIKEYBOARD_4            0x81000405L
#define DIKEYBOARD_5            0x81000406L
#define DIKEYBOARD_6            0x81000407L
#define DIKEYBOARD_7            0x81000408L
#define DIKEYBOARD_8            0x81000409L
#define DIKEYBOARD_9            0x8100040AL
#define DIKEYBOARD_0            0x8100040BL
#define DIKEYBOARD_MINUS        0x8100040CL
#define DIKEYBOARD_EQUALS       0x8100040DL
#define DIKEYBOARD_BACK         0x8100040EL
#define DIKEYBOARD_TAB          0x8100040FL
#define DIKEYBOARD_Q            0x81000410L
#define DIKEYBOARD_W            0x81000411L
#define DIKEYBOARD_E            0x81000412L
#define DIKEYBOARD_R            0x81000413L
#define DIKEYBOARD_T            0x81000414L
#define DIKEYBOARD_Y            0x81000415L
#define DIKEYBOARD_U            0x81000416L
#define DIKEYBOARD_I            0x81000417L
#define DIKEYBOARD_O            0x81000418L
#define DIKEYBOARD_P            0x81000419L
#define DIKEYBOARD_LBRACKET     0x8100041AL
#define DIKEYBOARD_RBRACKET     0x8100041BL
#define DIKEYBOARD_RETURN       0x8100041CL
#define DIKEYBOARD_LCONTROL     0x8100041DL
#define DIKEYBOARD_A            0x8100041EL
#define DIKEYBOARD_S            0x8100041FL
#define DIKEYBOARD_D            0x81000420L
#define DIKEYBOARD_F            0x81000421L
#define DIKEYBOARD_G            0x81000422L
#define DIKEYBOARD_H            0x81000423L
#define DIKEYBOARD_J            0x81000424L
#define DIKEYBOARD_K            0x81000425L
#define DIKEYBOARD_L            0x81000426L
#define DIKEYBOARD_SEMICOLON    0x81000427L
#define DIKEYBOARD_APOSTROPHE   0x81000428L
#define DIKEYBOARD_GRAVE        0x81000429L
#define DIKEYBOARD_LSHIFT       0x8100042AL
#define DIKEYBOARD_BACKSLASH    0x8100042BL
#define DIKEYBOARD_Z            0x8100042CL
#define DIKEYBOARD_X            0x8100042DL
#define DIKEYBOARD_C            0x8100042EL
#define DIKEYBOARD_V            0x8100042FL
#define DIKEYBOARD_B            0x81000430L
#define DIKEYBOARD_N            0x81000431L
#define DIKEYBOARD_M            0x81000432L
#define DIKEYBOARD_COMMA        0x81000433L
#define DIKEYBOARD_PERIOD       0x81000434L
#define DIKEYBOARD_SLASH        0x81000435L
#define DIKEYBOARD_RSHIFT       0x81000436L
#define DIKEYBOARD_MULTIPLY     0x81000437L
#define DIKEYBOARD_LMENU        0x81000438L
#define DIKEYBOARD_SPACE        0x81000439L
#define DIKEYBOARD_CAPITAL      0x8100043AL
#define DIKEYBOARD_F1           0x8100043BL
#define DIKEYBOARD_F2           0x8100043CL
#define DIKEYBOARD_F3           0x8100043DL
#define DIKEYBOARD_F4           0x8100043EL
#define DIKEYBOARD_F5           0x8100043FL
#define DIKEYBOARD_F6           0x81000440L
#define DIKEYBOARD_F7           0x81000441L
#define DIKEYBOARD_F8           0x81000442L
#define DIKEYBOARD_F9           0x81000443L
#define DIKEYBOARD_F10          0x81000444L
#define DIKEYBOARD_NUMLOCK      0x81000445L
#define DIKEYBOARD_SCROLL       0x81000446L
#define DIKEYBOARD_NUMPAD7      0x81000447L
#define DIKEYBOARD_NUMPAD8      0x81000448L
#define DIKEYBOARD_NUMPAD9      0x81000449L
#define DIKEYBOARD_SUBTRACT     0x8100044AL
#define DIKEYBOARD_NUMPAD4      0x8100044BL
#define DIKEYBOARD_NUMPAD5      0x8100044CL
#define DIKEYBOARD_NUMPAD6      0x8100044DL
#define DIKEYBOARD_ADD          0x8100044EL
#define DIKEYBOARD_NUMPAD1      0x8100044FL
#define DIKEYBOARD_NUMPAD2      0x81000450L
#define DIKEYBOARD_NUMPAD3      0x81000451L
#define DIKEYBOARD_NUMPAD0      0x81000452L
#define DIKEYBOARD_DECIMAL      0x81000453L
#define DIKEYBOARD_OEM_102      0x81000456L
#define DIKEYBOARD_F11          0x81000457L
#define DIKEYBOARD_F12          0x81000458L
#define DIKEYBOARD_F13          0x81000464L
#define DIKEYBOARD_F14          0x81000465L
#define DIKEYBOARD_F15          0x81000466L
#define DIKEYBOARD_KANA         0x81000470L
#define DIKEYBOARD_ABNT_C1      0x81000473L
#define DIKEYBOARD_CONVERT      0x81000479L
#define DIKEYBOARD_NOCONVERT    0x8100047BL
#define DIKEYBOARD_YEN          0x8100047DL
#define DIKEYBOARD_ABNT_C2      0x8100047EL
#define DIKEYBOARD_NUMPADEQUALS 0x8100048DL
#define DIKEYBOARD_PREVTRACK    0x81000490L
#define DIKEYBOARD_AT           0x81000491L
#define DIKEYBOARD_COLON        0x81000492L
#define DIKEYBOARD_UNDERLINE    0x81000493L
#define DIKEYBOARD_KANJI        0x81000494L
#define DIKEYBOARD_STOP         0x81000495L
#define DIKEYBOARD_AX           0x81000496L
#define DIKEYBOARD_UNLABELED    0x81000497L
#define DIKEYBOARD_NEXTTRACK    0x81000499L
#define DIKEYBOARD_NUMPADENTER  0x8100049CL
#define DIKEYBOARD_RCONTROL     0x8100049DL
#define DIKEYBOARD_MUTE         0x810004A0L
#define DIKEYBOARD_CALCULATOR   0x810004A1L
#define DIKEYBOARD_PLAYPAUSE    0x810004A2L
#define DIKEYBOARD_MEDIASTOP    0x810004A4L
#define DIKEYBOARD_VOLUMEDOWN   0x810004AEL
#define DIKEYBOARD_VOLUMEUP     0x810004B0L
#define DIKEYBOARD_WEBHOME      0x810004B2L
#define DIKEYBOARD_NUMPADCOMMA  0x810004B3L
#define DIKEYBOARD_DIVIDE       0x810004B5L
#define DIKEYBOARD_SYSRQ        0x810004B7L
#define DIKEYBOARD_RMENU        0x810004B8L
#define DIKEYBOARD_PAUSE        0x810004C5L
#define DIKEYBOARD_HOME         0x810004C7L
#define DIKEYBOARD_UP           0x810004C8L
#define DIKEYBOARD_PRIOR        0x810004C9L
#define DIKEYBOARD_LEFT         0x810004CBL
#define DIKEYBOARD_RIGHT        0x810004CDL
#define DIKEYBOARD_END          0x810004CFL
#define DIKEYBOARD_DOWN         0x810004D0L
#define DIKEYBOARD_NEXT         0x810004D1L
#define DIKEYBOARD_INSERT       0x810004D2L
#define DIKEYBOARD_DELETE       0x810004D3L
#define DIKEYBOARD_LWIN         0x810004DBL
#define DIKEYBOARD_RWIN         0x810004DCL
#define DIKEYBOARD_APPS         0x810004DDL
#define DIKEYBOARD_POWER        0x810004DEL
#define DIKEYBOARD_SLEEP        0x810004DFL
#define DIKEYBOARD_WAKE         0x810004E3L
#define DIKEYBOARD_WEBSEARCH    0x810004E5L
#define DIKEYBOARD_WEBFAVORITES 0x810004E6L
#define DIKEYBOARD_WEBREFRESH   0x810004E7L
#define DIKEYBOARD_WEBSTOP      0x810004E8L
#define DIKEYBOARD_WEBFORWARD   0x810004E9L
#define DIKEYBOARD_WEBBACK      0x810004EAL
#define DIKEYBOARD_MYCOMPUTER   0x810004EBL
#define DIKEYBOARD_MAIL         0x810004ECL
#define DIKEYBOARD_MEDIASELECT  0x810004EDL

/* DirectInput mouse mapping constants */
#define DIMOUSE_XAXISAB (0x82000200L | DIMOFS_X)
#define DIMOUSE_YAXISAB (0x82000200L | DIMOFS_Y)
#define DIMOUSE_XAXIS   (0x82000300L | DIMOFS_X)
#define DIMOUSE_YAXIS   (0x82000300L | DIMOFS_Y)
#define DIMOUSE_WHEEL   (0x82000300L | DIMOFS_Z)
#define DIMOUSE_BUTTON0 (0x82000400L | DIMOFS_BUTTON0)
#define DIMOUSE_BUTTON1 (0x82000400L | DIMOFS_BUTTON1)
#define DIMOUSE_BUTTON2 (0x82000400L | DIMOFS_BUTTON2)
#define DIMOUSE_BUTTON3 (0x82000400L | DIMOFS_BUTTON3)
#define DIMOUSE_BUTTON4 (0x82000400L | DIMOFS_BUTTON4)
#define DIMOUSE_BUTTON5 (0x82000400L | DIMOFS_BUTTON5)
#define DIMOUSE_BUTTON6 (0x82000400L | DIMOFS_BUTTON6)
#define DIMOUSE_BUTTON7 (0x82000400L | DIMOFS_BUTTON7)

/* DirectInput voice mapping constants */
#define DIVOICE_CHANNEL1        0x83000401L
#define DIVOICE_CHANNEL2        0x83000402L
#define DIVOICE_CHANNEL3        0x83000403L
#define DIVOICE_CHANNEL4        0x83000404L
#define DIVOICE_CHANNEL5        0x83000405L
#define DIVOICE_CHANNEL6        0x83000406L
#define DIVOICE_CHANNEL7        0x83000407L
#define DIVOICE_CHANNEL8        0x83000408L
#define DIVOICE_TEAM            0x83000409L
#define DIVOICE_ALL             0x8300040AL
#define DIVOICE_RECORDMUTE      0x8300040BL
#define DIVOICE_PLAYBACKMUTE    0x8300040CL
#define DIVOICE_TRANSMIT        0x8300040DL
#define DIVOICE_VOICECOMMAND    0x83000410L

/* DirectInput genre and control constants */
#define DIVIRTUAL_DRIVING_RACE              0x01000000L
#define DIAXIS_DRIVINGR_STEER               0x01008A01L
#define DIAXIS_DRIVINGR_ACCELERATE          0x01039202L
#define DIAXIS_DRIVINGR_BRAKE               0x01041203L
#define DIBUTTON_DRIVINGR_SHIFTUP           0x01000C01L
#define DIBUTTON_DRIVINGR_SHIFTDOWN         0x01000C02L
#define DIBUTTON_DRIVINGR_VIEW              0x01001C03L
#define DIBUTTON_DRIVINGR_MENU              0x010004FDL
#define DIAXIS_DRIVINGR_ACCEL_AND_BRAKE     0x01014A04L
#define DIHATSWITCH_DRIVINGR_GLANCE         0x01004601L
#define DIBUTTON_DRIVINGR_BRAKE             0x01004C04L
#define DIBUTTON_DRIVINGR_DASHBOARD         0x01004405L
#define DIBUTTON_DRIVINGR_AIDS              0x01004406L
#define DIBUTTON_DRIVINGR_MAP               0x01004407L
#define DIBUTTON_DRIVINGR_BOOST             0x01004408L
#define DIBUTTON_DRIVINGR_PIT               0x01004409L
#define DIBUTTON_DRIVINGR_ACCELERATE_LINK   0x0103D4E0L
#define DIBUTTON_DRIVINGR_STEER_LEFT_LINK   0x0100CCE4L
#define DIBUTTON_DRIVINGR_STEER_RIGHT_LINK  0x0100CCECL
#define DIBUTTON_DRIVINGR_GLANCE_LEFT_LINK  0x0107C4E4L
#define DIBUTTON_DRIVINGR_GLANCE_RIGHT_LINK 0x0107C4ECL
#define DIBUTTON_DRIVINGR_DEVICE            0x010044FEL
#define DIBUTTON_DRIVINGR_PAUSE             0x010044FCL
#define DIVIRTUAL_DRIVING_COMBAT            0x02000000L
#define DIAXIS_DRIVINGC_STEER               0x02008A01L
#define DIAXIS_DRIVINGC_ACCELERATE          0x02039202L
#define DIAXIS_DRIVINGC_BRAKE               0x02041203L
#define DIBUTTON_DRIVINGC_FIRE              0x02000C01L
#define DIBUTTON_DRIVINGC_WEAPONS           0x02000C02L
#define DIBUTTON_DRIVINGC_TARGET            0x02000C03L
#define DIBUTTON_DRIVINGC_MENU              0x000002FDL
#define DIAXIS_DRIVINGC_ACCEL_AND_BRAKE     0x02014A04L
#define DIHATSWITCH_DRIVINGC_GLANCE         0x02004601L
#define DIBUTTON_DRIVINGC_SHIFTUP           0x02004C04L
#define DIBUTTON_DRIVINGC_SHIFTDOWN         0x02004C05L
#define DIBUTTON_DRIVINGC_DASHBOARD         0x02004406L
#define DIBUTTON_DRIVINGC_AIDS              0x02004407L
#define DIBUTTON_DRIVINGC_BRAKE             0x02004C08L
#define DIBUTTON_DRIVINGC_FIRESECONDARY     0x02004C09L
#define DIBUTTON_DRIVINGC_ACCELERATE_LINK   0x0203D4E0L
#define DIBUTTON_DRIVINGC_STEER_LEFT_LINK   0x0200CCE4L
#define DIBUTTON_DRIVINGC_STEER_RIGHT_LINK  0x0200CCECL
#define DIBUTTON_DRIVINGC_GLANCE_LEFT_LINK  0x0207C4E4L
#define DIBUTTON_DRIVINGC_GLANCE_RIGHT_LINK 0x0207C4ECL
#define DIBUTTON_DRIVINGC_DEVICE            0x020044FEL
#define DIBUTTON_DRIVINGC_PAUSE             0x020044FCL
#define DIVIRTUAL_DRIVING_TANK              0x03000000L
#define DIAXIS_DRIVINGT_STEER               0x03008A01L
#define DIAXIS_DRIVINGT_BARREL              0x03010202L
#define DIAXIS_DRIVINGT_ACCELERATE          0x03039203L
#define DIAXIS_DRIVINGT_ROTATE              0x03020204L
#define DIBUTTON_DRIVINGT_FIRE              0x03000C01L
#define DIBUTTON_DRIVINGT_WEAPONS           0x03000C02L
#define DIBUTTON_DRIVINGT_TARGET            0x03000C03L
#define DIBUTTON_DRIVINGT_MENU              0x030004FDL
#define DIHATSWITCH_DRIVINGT_GLANCE         0x03004601L
#define DIAXIS_DRIVINGT_BRAKE               0x03045205L
#define DIAXIS_DRIVINGT_ACCEL_AND_BRAKE     0x03014A06L
#define DIBUTTON_DRIVINGT_VIEW              0x03005C04L
#define DIBUTTON_DRIVINGT_DASHBOARD         0x03005C05L
#define DIBUTTON_DRIVINGT_BRAKE             0x03004C06L
#define DIBUTTON_DRIVINGT_FIRESECONDARY     0x03004C07L
#define DIBUTTON_DRIVINGT_ACCELERATE_LINK   0x0303D4E0L
#define DIBUTTON_DRIVINGT_STEER_LEFT_LINK   0x0300CCE4L
#define DIBUTTON_DRIVINGT_STEER_RIGHT_LINK  0x0300CCECL
#define DIBUTTON_DRIVINGT_BARREL_UP_LINK    0x030144E0L
#define DIBUTTON_DRIVINGT_BARREL_DOWN_LINK  0x030144E8L
#define DIBUTTON_DRIVINGT_ROTATE_LEFT_LINK  0x030244E4L
#define DIBUTTON_DRIVINGT_ROTATE_RIGHT_LINK 0x030244ECL
#define DIBUTTON_DRIVINGT_GLANCE_LEFT_LINK  0x0307C4E4L
#define DIBUTTON_DRIVINGT_GLANCE_RIGHT_LINK 0x0307C4ECL
#define DIBUTTON_DRIVINGT_DEVICE            0x030044FEL
#define DIBUTTON_DRIVINGT_PAUSE             0x030044FCL
#define DIVIRTUAL_FLYING_CIVILIAN           0x04000000L
#define DIAXIS_FLYINGC_BANK                 0x04008A01L
#define DIAXIS_FLYINGC_PITCH                0x04010A02L
#define DIAXIS_FLYINGC_THROTTLE             0x04039203L
#define DIBUTTON_FLYINGC_VIEW               0x04002401L
#define DIBUTTON_FLYINGC_DISPLAY            0x04002402L
#define DIBUTTON_FLYINGC_GEAR               0x04002C03L
#define DIBUTTON_FLYINGC_MENU               0x040004FDL
#define DIHATSWITCH_FLYINGC_GLANCE          0x04004601L
#define DIAXIS_FLYINGC_BRAKE                0x04046A04L
#define DIAXIS_FLYINGC_RUDDER               0x04025205L
#define DIAXIS_FLYINGC_FLAPS                0x04055A06L
#define DIBUTTON_FLYINGC_FLAPSUP            0x04006404L
#define DIBUTTON_FLYINGC_FLAPSDOWN          0x04006405L
#define DIBUTTON_FLYINGC_BRAKE_LINK         0x04046CE0L
#define DIBUTTON_FLYINGC_FASTER_LINK        0x0403D4E0L
#define DIBUTTON_FLYINGC_SLOWER_LINK        0x0403D4E8L
#define DIBUTTON_FLYINGC_GLANCE_LEFT_LINK   0x0407C4E4L
#define DIBUTTON_FLYINGC_GLANCE_RIGHT_LINK  0x0407C4ECL
#define DIBUTTON_FLYINGC_GLANCE_UP_LINK     0x0407C4E0L
#define DIBUTTON_FLYINGC_GLANCE_DOWN_LINK   0x0407C4E8L
#define DIBUTTON_FLYINGC_DEVICE             0x040044FEL
#define DIBUTTON_FLYINGC_PAUSE              0x040044FCL
#define DIVIRTUAL_FLYING_MILITARY           0x05000000L
#define DIAXIS_FLYINGM_BANK                 0x05008A01L
#define DIAXIS_FLYINGM_PITCH                0x05010A02L
#define DIAXIS_FLYINGM_THROTTLE             0x05039203L
#define DIBUTTON_FLYINGM_FIRE               0x05000C01L
#define DIBUTTON_FLYINGM_WEAPONS            0x05000C02L
#define DIBUTTON_FLYINGM_TARGET             0x05000C03L
#define DIBUTTON_FLYINGM_MENU               0x050004FDL
#define DIHATSWITCH_FLYINGM_GLANCE          0x05004601L
#define DIBUTTON_FLYINGM_COUNTER            0x05005C04L
#define DIAXIS_FLYINGM_RUDDER               0x05024A04L
#define DIAXIS_FLYINGM_BRAKE                0x05046205L
#define DIBUTTON_FLYINGM_VIEW               0x05006405L
#define DIBUTTON_FLYINGM_DISPLAY            0x05006406L
#define DIAXIS_FLYINGM_FLAPS                0x05055206L
#define DIBUTTON_FLYINGM_FLAPSUP            0x05005407L
#define DIBUTTON_FLYINGM_FLAPSDOWN          0x05005408L
#define DIBUTTON_FLYINGM_FIRESECONDARY      0x05004C09L
#define DIBUTTON_FLYINGM_GEAR               0x0500640AL
#define DIBUTTON_FLYINGM_BRAKE_LINK         0x050464E0L
#define DIBUTTON_FLYINGM_FASTER_LINK        0x0503D4E0L
#define DIBUTTON_FLYINGM_SLOWER_LINK        0x0503D4E8L
#define DIBUTTON_FLYINGM_GLANCE_LEFT_LINK   0x0507C4E4L
#define DIBUTTON_FLYINGM_GLANCE_RIGHT_LINK  0x0507C4ECL
#define DIBUTTON_FLYINGM_GLANCE_UP_LINK     0x0507C4E0L
#define DIBUTTON_FLYINGM_GLANCE_DOWN_LINK   0x0507C4E8L
#define DIBUTTON_FLYINGM_DEVICE             0x050044FEL
#define DIBUTTON_FLYINGM_PAUSE              0x050044FCL
#define DIVIRTUAL_FLYING_HELICOPTER         0x06000000L
#define DIAXIS_FLYINGH_BANK                 0x06008A01L
#define DIAXIS_FLYINGH_PITCH                0x06010A02L
#define DIAXIS_FLYINGH_COLLECTIVE           0x06018A03L
#define DIBUTTON_FLYINGH_FIRE               0x06001401L
#define DIBUTTON_FLYINGH_WEAPONS            0x06001402L
#define DIBUTTON_FLYINGH_TARGET             0x06001403L
#define DIBUTTON_FLYINGH_MENU               0x060004FDL
#define DIHATSWITCH_FLYINGH_GLANCE          0x06004601L
#define DIAXIS_FLYINGH_TORQUE               0x06025A04L
#define DIAXIS_FLYINGH_THROTTLE             0x0603DA05L
#define DIBUTTON_FLYINGH_COUNTER            0x06005404L
#define DIBUTTON_FLYINGH_VIEW               0x06006405L
#define DIBUTTON_FLYINGH_GEAR               0x06006406L
#define DIBUTTON_FLYINGH_FIRESECONDARY      0x06004C07L
#define DIBUTTON_FLYINGH_FASTER_LINK        0x0603DCE0L
#define DIBUTTON_FLYINGH_SLOWER_LINK        0x0603DCE8L
#define DIBUTTON_FLYINGH_GLANCE_LEFT_LINK   0x0607C4E4L
#define DIBUTTON_FLYINGH_GLANCE_RIGHT_LINK  0x0607C4ECL
#define DIBUTTON_FLYINGH_GLANCE_UP_LINK     0x0607C4E0L
#define DIBUTTON_FLYINGH_GLANCE_DOWN_LINK   0x0607C4E8L
#define DIBUTTON_FLYINGH_DEVICE             0x060044FEL
#define DIBUTTON_FLYINGH_PAUSE              0x060044FCL
#define DIVIRTUAL_SPACESIM                  0x07000000L
#define DIAXIS_SPACESIM_LATERAL             0x07008201L
#define DIAXIS_SPACESIM_MOVE                0x07010202L
#define DIAXIS_SPACESIM_THROTTLE            0x07038203L
#define DIBUTTON_SPACESIM_FIRE              0x07000401L
#define DIBUTTON_SPACESIM_WEAPONS           0x07000402L
#define DIBUTTON_SPACESIM_TARGET            0x07000403L
#define DIBUTTON_SPACESIM_MENU              0x070004FDL
#define DIHATSWITCH_SPACESIM_GLANCE         0x07004601L
#define DIAXIS_SPACESIM_CLIMB               0x0701C204L
#define DIAXIS_SPACESIM_ROTATE              0x07024205L
#define DIBUTTON_SPACESIM_VIEW              0x07004404L
#define DIBUTTON_SPACESIM_DISPLAY           0x07004405L
#define DIBUTTON_SPACESIM_RAISE             0x07004406L
#define DIBUTTON_SPACESIM_LOWER             0x07004407L
#define DIBUTTON_SPACESIM_GEAR              0x07004408L
#define DIBUTTON_SPACESIM_FIRESECONDARY     0x07004409L
#define DIBUTTON_SPACESIM_LEFT_LINK         0x0700C4E4L
#define DIBUTTON_SPACESIM_RIGHT_LINK        0x0700C4ECL
#define DIBUTTON_SPACESIM_FORWARD_LINK      0x070144E0L
#define DIBUTTON_SPACESIM_BACKWARD_LINK     0x070144E8L
#define DIBUTTON_SPACESIM_FASTER_LINK       0x0703C4E0L
#define DIBUTTON_SPACESIM_SLOWER_LINK       0x0703C4E8L
#define DIBUTTON_SPACESIM_TURN_LEFT_LINK    0x070244E4L
#define DIBUTTON_SPACESIM_TURN_RIGHT_LINK   0x070244ECL
#define DIBUTTON_SPACESIM_GLANCE_LEFT_LINK  0x0707C4E4L
#define DIBUTTON_SPACESIM_GLANCE_RIGHT_LINK 0x0707C4ECL
#define DIBUTTON_SPACESIM_GLANCE_UP_LINK    0x0707C4E0L
#define DIBUTTON_SPACESIM_GLANCE_DOWN_LINK  0x0707C4E8L
#define DIBUTTON_SPACESIM_DEVICE            0x070044FEL
#define DIBUTTON_SPACESIM_PAUSE             0x070044FCL
#define DIVIRTUAL_FIGHTING_HAND2HAND        0x08000000L
#define DIAXIS_FIGHTINGH_LATERAL            0x08008201L
#define DIAXIS_FIGHTINGH_MOVE               0x08010202L
#define DIBUTTON_FIGHTINGH_PUNCH            0x08000401L
#define DIBUTTON_FIGHTINGH_KICK             0x08000402L
#define DIBUTTON_FIGHTINGH_BLOCK            0x08000403L
#define DIBUTTON_FIGHTINGH_CROUCH           0x08000404L
#define DIBUTTON_FIGHTINGH_JUMP             0x08000405L
#define DIBUTTON_FIGHTINGH_SPECIAL1         0x08000406L
#define DIBUTTON_FIGHTINGH_SPECIAL2         0x08000407L
#define DIBUTTON_FIGHTINGH_MENU             0x080004FDL
#define DIBUTTON_FIGHTINGH_SELECT           0x08004408L
#define DIHATSWITCH_FIGHTINGH_SLIDE         0x08004601L
#define DIBUTTON_FIGHTINGH_DISPLAY          0x08004409L
#define DIAXIS_FIGHTINGH_ROTATE             0x08024203L
#define DIBUTTON_FIGHTINGH_DODGE            0x0800440AL
#define DIBUTTON_FIGHTINGH_LEFT_LINK        0x0800C4E4L
#define DIBUTTON_FIGHTINGH_RIGHT_LINK       0x0800C4ECL
#define DIBUTTON_FIGHTINGH_FORWARD_LINK     0x080144E0L
#define DIBUTTON_FIGHTINGH_BACKWARD_LINK    0x080114E8L
#define DIBUTTON_FIGHTINGH_DEVICE           0x080044FEL
#define DIBUTTON_FIGHTINGH_PAUSE            0x080044FCL
#define DIVIRTUAL_FIGHTING_FPS              0x09000000L
#define DIAXIS_FPS_ROTATE                   0x09008201L
#define DIAXIS_FPS_MOVE                     0x09010202L
#define DIBUTTON_FPS_FIRE                   0x09000401L
#define DIBUTTON_FPS_WEAPONS                0x09000402L
#define DIBUTTON_FPS_APPLY                  0x09000403L
#define DIBUTTON_FPS_SELECT                 0x09000404L
#define DIBUTTON_FPS_CROUCH                 0x09000405L
#define DIBUTTON_FPS_JUMP                   0x09000406L
#define DIAXIS_FPS_LOOKUPDOWN               0x09018203L
#define DIBUTTON_FPS_STRAFE                 0x09000407L
#define DIBUTTON_FPS_MENU                   0x900004FDL
#define DIHATSWITCH_FPS_GLANCE              0x09004601L
#define DIBUTTON_FPS_DISPLAY                0x09004408L
#define DIAXIS_FPS_SIDESTEP                 0x09024204L
#define DIBUTTON_FPS_DODGE                  0x09004409L
#define DIBUTTON_FPS_GLANCEL                0x0900440AL
#define DIBUTTON_FPS_GLANCER                0x0900440BL
#define DIBUTTON_FPS_FIRESECONDARY          0x0900440CL
#define DIBUTTON_FPS_ROTATE_LEFT_LINK       0x0900C4E4L
#define DIBUTTON_FPS_ROTATE_RIGHT_LINK      0x0900C4ECL
#define DIBUTTON_FPS_FORWARD_LINK           0x090144E0L
#define DIBUTTON_FPS_BACKWARD_LINK          0x090144E8L
#define DIBUTTON_FPS_GLANCE_UP_LINK         0x0901C4E0L
#define DIBUTTON_FPS_GLANCE_DOWN_LINK       0x0901C4E8L
#define DIBUTTON_FPS_STEP_LEFT_LINK         0x090244E4L
#define DIBUTTON_FPS_STEP_RIGHT_LINK        0x090244ECL
#define DIBUTTON_FPS_DEVICE                 0x090044FEL
#define DIBUTTON_FPS_PAUSE                  0x090044FCL
#define DIVIRTUAL_FIGHTING_THIRDPERSON      0x0A000000L
#define DIAXIS_TPS_TURN                     0x0A020201L
#define DIAXIS_TPS_MOVE                     0x0A010202L
#define DIBUTTON_TPS_RUN                    0x0A000401L
#define DIBUTTON_TPS_ACTION                 0x0A000402L
#define DIBUTTON_TPS_SELECT                 0x0A000403L
#define DIBUTTON_TPS_USE                    0x0A000404L
#define DIBUTTON_TPS_JUMP                   0x0A000405L
#define DIBUTTON_TPS_MENU                   0x0A0004FDL
#define DIHATSWITCH_TPS_GLANCE              0x0A004601L
#define DIBUTTON_TPS_VIEW                   0x0A004406L
#define DIBUTTON_TPS_STEPLEFT               0x0A004407L
#define DIBUTTON_TPS_STEPRIGHT              0x0A004408L
#define DIAXIS_TPS_STEP                     0x0A00C203L
#define DIBUTTON_TPS_DODGE                  0x0A004409L
#define DIBUTTON_TPS_INVENTORY              0x0A00440AL
#define DIBUTTON_TPS_TURN_LEFT_LINK         0x0A0244E4L
#define DIBUTTON_TPS_TURN_RIGHT_LINK        0x0A0244ECL
#define DIBUTTON_TPS_FORWARD_LINK           0x0A0144E0L
#define DIBUTTON_TPS_BACKWARD_LINK          0x0A0144E8L
#define DIBUTTON_TPS_GLANCE_UP_LINK         0x0A07C4E0L
#define DIBUTTON_TPS_GLANCE_DOWN_LINK       0x0A07C4E8L
#define DIBUTTON_TPS_GLANCE_LEFT_LINK       0x0A07C4E4L
#define DIBUTTON_TPS_GLANCE_RIGHT_LINK      0x0A07C4ECL
#define DIBUTTON_TPS_DEVICE                 0x0A0044FEL
#define DIBUTTON_TPS_PAUSE                  0x0A0044FCL
#define DIVIRTUAL_STRATEGY_ROLEPLAYING      0x0B000000L
#define DIAXIS_STRATEGYR_LATERAL            0x0B008201L
#define DIAXIS_STRATEGYR_MOVE               0x0B010202L
#define DIBUTTON_STRATEGYR_GET              0x0B000401L
#define DIBUTTON_STRATEGYR_APPLY            0x0B000402L
#define DIBUTTON_STRATEGYR_SELECT           0x0B000403L
#define DIBUTTON_STRATEGYR_ATTACK           0x0B000404L
#define DIBUTTON_STRATEGYR_CAST             0x0B000405L
#define DIBUTTON_STRATEGYR_CROUCH           0x0B000406L
#define DIBUTTON_STRATEGYR_JUMP             0x0B000407L
#define DIBUTTON_STRATEGYR_MENU             0x0B0004FDL
#define DIHATSWITCH_STRATEGYR_GLANCE        0x0B004601L
#define DIBUTTON_STRATEGYR_MAP              0x0B004408L
#define DIBUTTON_STRATEGYR_DISPLAY          0x0B004409L
#define DIAXIS_STRATEGYR_ROTATE             0x0B024203L
#define DIBUTTON_STRATEGYR_LEFT_LINK        0x0B00C4E4L
#define DIBUTTON_STRATEGYR_RIGHT_LINK       0x0B00C4ECL
#define DIBUTTON_STRATEGYR_FORWARD_LINK     0x0B0144E0L
#define DIBUTTON_STRATEGYR_BACK_LINK        0x0B0144E8L
#define DIBUTTON_STRATEGYR_ROTATE_LEFT_LINK 0x0B0244E4L
#define DIBUTTON_STRATEGYR_ROTATE_RIGHT_LINK    0x0B0244ECL
#define DIBUTTON_STRATEGYR_DEVICE           0x0B0044FEL
#define DIBUTTON_STRATEGYR_PAUSE            0x0B0044FCL
#define DIVIRTUAL_STRATEGY_TURN             0x0C000000L
#define DIAXIS_STRATEGYT_LATERAL            0x0C008201L
#define DIAXIS_STRATEGYT_MOVE               0x0C010202L
#define DIBUTTON_STRATEGYT_SELECT           0x0C000401L
#define DIBUTTON_STRATEGYT_INSTRUCT         0x0C000402L
#define DIBUTTON_STRATEGYT_APPLY            0x0C000403L
#define DIBUTTON_STRATEGYT_TEAM             0x0C000404L
#define DIBUTTON_STRATEGYT_TURN             0x0C000405L
#define DIBUTTON_STRATEGYT_MENU             0x0C0004FDL
#define DIBUTTON_STRATEGYT_ZOOM             0x0C004406L
#define DIBUTTON_STRATEGYT_MAP              0x0C004407L
#define DIBUTTON_STRATEGYT_DISPLAY          0x0C004408L
#define DIBUTTON_STRATEGYT_LEFT_LINK        0x0C00C4E4L
#define DIBUTTON_STRATEGYT_RIGHT_LINK       0x0C00C4ECL
#define DIBUTTON_STRATEGYT_FORWARD_LINK     0x0C0144E0L
#define DIBUTTON_STRATEGYT_BACK_LINK        0x0C0144E8L
#define DIBUTTON_STRATEGYT_DEVICE           0x0C0044FEL
#define DIBUTTON_STRATEGYT_PAUSE            0x0C0044FCL
#define DIVIRTUAL_SPORTS_HUNTING            0x0D000000L
#define DIAXIS_HUNTING_LATERAL              0x0D008201L
#define DIAXIS_HUNTING_MOVE                 0x0D010202L
#define DIBUTTON_HUNTING_FIRE               0x0D000401L
#define DIBUTTON_HUNTING_AIM                0x0D000402L
#define DIBUTTON_HUNTING_WEAPON             0x0D000403L
#define DIBUTTON_HUNTING_BINOCULAR          0x0D000404L
#define DIBUTTON_HUNTING_CALL               0x0D000405L
#define DIBUTTON_HUNTING_MAP                0x0D000406L
#define DIBUTTON_HUNTING_SPECIAL            0x0D000407L
#define DIBUTTON_HUNTING_MENU               0x0D0004FDL
#define DIHATSWITCH_HUNTING_GLANCE          0x0D004601L
#define DIBUTTON_HUNTING_DISPLAY            0x0D004408L
#define DIAXIS_HUNTING_ROTATE               0x0D024203L
#define DIBUTTON_HUNTING_CROUCH             0x0D004409L
#define DIBUTTON_HUNTING_JUMP               0x0D00440AL
#define DIBUTTON_HUNTING_FIRESECONDARY      0x0D00440BL
#define DIBUTTON_HUNTING_LEFT_LINK          0x0D00C4E4L
#define DIBUTTON_HUNTING_RIGHT_LINK         0x0D00C4ECL
#define DIBUTTON_HUNTING_FORWARD_LINK       0x0D0144E0L
#define DIBUTTON_HUNTING_BACK_LINK          0x0D0144E8L
#define DIBUTTON_HUNTING_ROTATE_LEFT_LINK   0x0D0244E4L
#define DIBUTTON_HUNTING_ROTATE_RIGHT_LINK  0x0D0244ECL
#define DIBUTTON_HUNTING_DEVICE             0x0D0044FEL
#define DIBUTTON_HUNTING_PAUSE              0x0D0044FCL
#define DIVIRTUAL_SPORTS_FISHING            0x0E000000L
#define DIAXIS_FISHING_LATERAL              0x0E008201L
#define DIAXIS_FISHING_MOVE                 0x0E010202L
#define DIBUTTON_FISHING_CAST               0x0E000401L
#define DIBUTTON_FISHING_TYPE               0x0E000402L
#define DIBUTTON_FISHING_BINOCULAR          0x0E000403L
#define DIBUTTON_FISHING_BAIT               0x0E000404L
#define DIBUTTON_FISHING_MAP                0x0E000405L
#define DIBUTTON_FISHING_MENU               0x0E0004FDL
#define DIHATSWITCH_FISHING_GLANCE          0x0E004601L
#define DIBUTTON_FISHING_DISPLAY            0x0E004406L
#define DIAXIS_FISHING_ROTATE               0x0E024203L
#define DIBUTTON_FISHING_CROUCH             0x0E004407L
#define DIBUTTON_FISHING_JUMP               0x0E004408L
#define DIBUTTON_FISHING_LEFT_LINK          0x0E00C4E4L
#define DIBUTTON_FISHING_RIGHT_LINK         0x0E00C4ECL
#define DIBUTTON_FISHING_FORWARD_LINK       0x0E0144E0L
#define DIBUTTON_FISHING_BACK_LINK          0x0E0144E8L
#define DIBUTTON_FISHING_ROTATE_LEFT_LINK   0x0E0244E4L
#define DIBUTTON_FISHING_ROTATE_RIGHT_LINK  0x0E0244ECL
#define DIBUTTON_FISHING_DEVICE             0x0E0044FEL
#define DIBUTTON_FISHING_PAUSE              0x0E0044FCL
#define DIVIRTUAL_SPORTS_BASEBALL_BAT       0x0F000000L
#define DIAXIS_BASEBALLB_LATERAL            0x0F008201L
#define DIAXIS_BASEBALLB_MOVE               0x0F010202L
#define DIBUTTON_BASEBALLB_SELECT           0x0F000401L
#define DIBUTTON_BASEBALLB_NORMAL           0x0F000402L
#define DIBUTTON_BASEBALLB_POWER            0x0F000403L
#define DIBUTTON_BASEBALLB_BUNT             0x0F000404L
#define DIBUTTON_BASEBALLB_STEAL            0x0F000405L
#define DIBUTTON_BASEBALLB_BURST            0x0F000406L
#define DIBUTTON_BASEBALLB_SLIDE            0x0F000407L
#define DIBUTTON_BASEBALLB_CONTACT          0x0F000408L
#define DIBUTTON_BASEBALLB_MENU             0x0F0004FDL
#define DIBUTTON_BASEBALLB_NOSTEAL          0x0F004409L
#define DIBUTTON_BASEBALLB_BOX              0x0F00440AL
#define DIBUTTON_BASEBALLB_LEFT_LINK        0x0F00C4E4L
#define DIBUTTON_BASEBALLB_RIGHT_LINK       0x0F00C4ECL
#define DIBUTTON_BASEBALLB_FORWARD_LINK     0x0F0144E0L
#define DIBUTTON_BASEBALLB_BACK_LINK        0x0F0144E8L
#define DIBUTTON_BASEBALLB_DEVICE           0x0F0044FEL
#define DIBUTTON_BASEBALLB_PAUSE            0x0F0044FCL
#define DIVIRTUAL_SPORTS_BASEBALL_PITCH     0x10000000L
#define DIAXIS_BASEBALLP_LATERAL            0x10008201L
#define DIAXIS_BASEBALLP_MOVE               0x10010202L
#define DIBUTTON_BASEBALLP_SELECT           0x10000401L
#define DIBUTTON_BASEBALLP_PITCH            0x10000402L
#define DIBUTTON_BASEBALLP_BASE             0x10000403L
#define DIBUTTON_BASEBALLP_THROW            0x10000404L
#define DIBUTTON_BASEBALLP_FAKE             0x10000405L
#define DIBUTTON_BASEBALLP_MENU             0x100004FDL
#define DIBUTTON_BASEBALLP_WALK             0x10004406L
#define DIBUTTON_BASEBALLP_LOOK             0x10004407L
#define DIBUTTON_BASEBALLP_LEFT_LINK        0x1000C4E4L
#define DIBUTTON_BASEBALLP_RIGHT_LINK       0x1000C4ECL
#define DIBUTTON_BASEBALLP_FORWARD_LINK     0x100144E0L
#define DIBUTTON_BASEBALLP_BACK_LINK        0x100144E8L
#define DIBUTTON_BASEBALLP_DEVICE           0x100044FEL
#define DIBUTTON_BASEBALLP_PAUSE            0x100044FCL
#define DIVIRTUAL_SPORTS_BASEBALL_FIELD     0x11000000L
#define DIAXIS_BASEBALLF_LATERAL            0x11008201L
#define DIAXIS_BASEBALLF_MOVE               0x11010202L
#define DIBUTTON_BASEBALLF_NEAREST          0x11000401L
#define DIBUTTON_BASEBALLF_THROW1           0x11000402L
#define DIBUTTON_BASEBALLF_THROW2           0x11000403L
#define DIBUTTON_BASEBALLF_BURST            0x11000404L
#define DIBUTTON_BASEBALLF_JUMP             0x11000405L
#define DIBUTTON_BASEBALLF_DIVE             0x11000406L
#define DIBUTTON_BASEBALLF_MENU             0x110004FDL
#define DIBUTTON_BASEBALLF_SHIFTIN          0x11004407L
#define DIBUTTON_BASEBALLF_SHIFTOUT         0x11004408L
#define DIBUTTON_BASEBALLF_AIM_LEFT_LINK    0x1100C4E4L
#define DIBUTTON_BASEBALLF_AIM_RIGHT_LINK   0x1100C4ECL
#define DIBUTTON_BASEBALLF_FORWARD_LINK     0x110144E0L
#define DIBUTTON_BASEBALLF_BACK_LINK        0x110144E8L
#define DIBUTTON_BASEBALLF_DEVICE           0x110044FEL
#define DIBUTTON_BASEBALLF_PAUSE            0x110044FCL
#define DIVIRTUAL_SPORTS_BASKETBALL_OFFENSE 0x12000000L
#define DIAXIS_BBALLO_LATERAL               0x12008201L
#define DIAXIS_BBALLO_MOVE                  0x12010202L
#define DIBUTTON_BBALLO_SHOOT               0x12000401L
#define DIBUTTON_BBALLO_DUNK                0x12000402L
#define DIBUTTON_BBALLO_PASS                0x12000403L
#define DIBUTTON_BBALLO_FAKE                0x12000404L
#define DIBUTTON_BBALLO_SPECIAL             0x12000405L
#define DIBUTTON_BBALLO_PLAYER              0x12000406L
#define DIBUTTON_BBALLO_BURST               0x12000407L
#define DIBUTTON_BBALLO_CALL                0x12000408L
#define DIBUTTON_BBALLO_MENU                0x120004FDL
#define DIHATSWITCH_BBALLO_GLANCE           0x12004601L
#define DIBUTTON_BBALLO_SCREEN              0x12004409L
#define DIBUTTON_BBALLO_PLAY                0x1200440AL
#define DIBUTTON_BBALLO_JAB                 0x1200440BL
#define DIBUTTON_BBALLO_POST                0x1200440CL
#define DIBUTTON_BBALLO_TIMEOUT             0x1200440DL
#define DIBUTTON_BBALLO_SUBSTITUTE          0x1200440EL
#define DIBUTTON_BBALLO_LEFT_LINK           0x1200C4E4L
#define DIBUTTON_BBALLO_RIGHT_LINK          0x1200C4ECL
#define DIBUTTON_BBALLO_FORWARD_LINK        0x120144E0L
#define DIBUTTON_BBALLO_BACK_LINK           0x120144E8L
#define DIBUTTON_BBALLO_DEVICE              0x120044FEL
#define DIBUTTON_BBALLO_PAUSE               0x120044FCL
#define DIVIRTUAL_SPORTS_BASKETBALL_DEFENSE 0x13000000L
#define DIAXIS_BBALLD_LATERAL               0x13008201L
#define DIAXIS_BBALLD_MOVE                  0x13010202L
#define DIBUTTON_BBALLD_JUMP                0x13000401L
#define DIBUTTON_BBALLD_STEAL               0x13000402L
#define DIBUTTON_BBALLD_FAKE                0x13000403L
#define DIBUTTON_BBALLD_SPECIAL             0x13000404L
#define DIBUTTON_BBALLD_PLAYER              0x13000405L
#define DIBUTTON_BBALLD_BURST               0x13000406L
#define DIBUTTON_BBALLD_PLAY                0x13000407L
#define DIBUTTON_BBALLD_MENU                0x130004FDL
#define DIHATSWITCH_BBALLD_GLANCE           0x13004601L
#define DIBUTTON_BBALLD_TIMEOUT             0x13004408L
#define DIBUTTON_BBALLD_SUBSTITUTE          0x13004409L
#define DIBUTTON_BBALLD_LEFT_LINK           0x1300C4E4L
#define DIBUTTON_BBALLD_RIGHT_LINK          0x1300C4ECL
#define DIBUTTON_BBALLD_FORWARD_LINK        0x130144E0L
#define DIBUTTON_BBALLD_BACK_LINK           0x130144E8L
#define DIBUTTON_BBALLD_DEVICE              0x130044FEL
#define DIBUTTON_BBALLD_PAUSE               0x130044FCL
#define DIVIRTUAL_SPORTS_FOOTBALL_FIELD     0x14000000L
#define DIBUTTON_FOOTBALLP_PLAY             0x14000401L
#define DIBUTTON_FOOTBALLP_SELECT           0x14000402L
#define DIBUTTON_FOOTBALLP_HELP             0x14000403L
#define DIBUTTON_FOOTBALLP_MENU             0x140004FDL
#define DIBUTTON_FOOTBALLP_DEVICE           0x140044FEL
#define DIBUTTON_FOOTBALLP_PAUSE            0x140044FCL
#define DIVIRTUAL_SPORTS_FOOTBALL_QBCK      0x15000000L
#define DIAXIS_FOOTBALLQ_LATERAL            0x15008201L
#define DIAXIS_FOOTBALLQ_MOVE               0x15010202L
#define DIBUTTON_FOOTBALLQ_SELECT           0x15000401L
#define DIBUTTON_FOOTBALLQ_SNAP             0x15000402L
#define DIBUTTON_FOOTBALLQ_JUMP             0x15000403L
#define DIBUTTON_FOOTBALLQ_SLIDE            0x15000404L
#define DIBUTTON_FOOTBALLQ_PASS             0x15000405L
#define DIBUTTON_FOOTBALLQ_FAKE             0x15000406L
#define DIBUTTON_FOOTBALLQ_MENU             0x150004FDL
#define DIBUTTON_FOOTBALLQ_FAKESNAP         0x15004407L
#define DIBUTTON_FOOTBALLQ_MOTION           0x15004408L
#define DIBUTTON_FOOTBALLQ_AUDIBLE          0x15004409L
#define DIBUTTON_FOOTBALLQ_LEFT_LINK        0x1500C4E4L
#define DIBUTTON_FOOTBALLQ_RIGHT_LINK       0x1500C4ECL
#define DIBUTTON_FOOTBALLQ_FORWARD_LINK     0x150144E0L
#define DIBUTTON_FOOTBALLQ_BACK_LINK        0x150144E8L
#define DIBUTTON_FOOTBALLQ_DEVICE           0x150044FEL
#define DIBUTTON_FOOTBALLQ_PAUSE            0x150044FCL
#define DIVIRTUAL_SPORTS_FOOTBALL_OFFENSE   0x16000000L
#define DIAXIS_FOOTBALLO_LATERAL            0x16008201L
#define DIAXIS_FOOTBALLO_MOVE               0x16010202L
#define DIBUTTON_FOOTBALLO_JUMP             0x16000401L
#define DIBUTTON_FOOTBALLO_LEFTARM          0x16000402L
#define DIBUTTON_FOOTBALLO_RIGHTARM         0x16000403L
#define DIBUTTON_FOOTBALLO_THROW            0x16000404L
#define DIBUTTON_FOOTBALLO_SPIN             0x16000405L
#define DIBUTTON_FOOTBALLO_MENU             0x160004FDL
#define DIBUTTON_FOOTBALLO_JUKE             0x16004406L
#define DIBUTTON_FOOTBALLO_SHOULDER         0x16004407L
#define DIBUTTON_FOOTBALLO_TURBO            0x16004408L
#define DIBUTTON_FOOTBALLO_DIVE             0x16004409L
#define DIBUTTON_FOOTBALLO_ZOOM             0x1600440AL
#define DIBUTTON_FOOTBALLO_SUBSTITUTE       0x1600440BL
#define DIBUTTON_FOOTBALLO_LEFT_LINK        0x1600C4E4L
#define DIBUTTON_FOOTBALLO_RIGHT_LINK       0x1600C4ECL
#define DIBUTTON_FOOTBALLO_FORWARD_LINK     0x160144E0L
#define DIBUTTON_FOOTBALLO_BACK_LINK        0x160144E8L
#define DIBUTTON_FOOTBALLO_DEVICE           0x160044FEL
#define DIBUTTON_FOOTBALLO_PAUSE            0x160044FCL
#define DIVIRTUAL_SPORTS_FOOTBALL_DEFENSE   0x17000000L
#define DIAXIS_FOOTBALLD_LATERAL            0x17008201L
#define DIAXIS_FOOTBALLD_MOVE               0x17010202L
#define DIBUTTON_FOOTBALLD_PLAY             0x17000401L
#define DIBUTTON_FOOTBALLD_SELECT           0x17000402L
#define DIBUTTON_FOOTBALLD_JUMP             0x17000403L
#define DIBUTTON_FOOTBALLD_TACKLE           0x17000404L
#define DIBUTTON_FOOTBALLD_FAKE             0x17000405L
#define DIBUTTON_FOOTBALLD_SUPERTACKLE      0x17000406L
#define DIBUTTON_FOOTBALLD_MENU             0x170004FDL
#define DIBUTTON_FOOTBALLD_SPIN             0x17004407L
#define DIBUTTON_FOOTBALLD_SWIM             0x17004408L
#define DIBUTTON_FOOTBALLD_BULLRUSH         0x17004409L
#define DIBUTTON_FOOTBALLD_RIP              0x1700440AL
#define DIBUTTON_FOOTBALLD_AUDIBLE          0x1700440BL
#define DIBUTTON_FOOTBALLD_ZOOM             0x1700440CL
#define DIBUTTON_FOOTBALLD_SUBSTITUTE       0x1700440DL
#define DIBUTTON_FOOTBALLD_LEFT_LINK        0x1700C4E4L
#define DIBUTTON_FOOTBALLD_RIGHT_LINK       0x1700C4ECL
#define DIBUTTON_FOOTBALLD_FORWARD_LINK     0x170144E0L
#define DIBUTTON_FOOTBALLD_BACK_LINK        0x170144F8L
#define DIBUTTON_FOOTBALLD_DEVICE           0x170044FEL
#define DIBUTTON_FOOTBALLD_PAUSE            0x170044FCL
#define DIVIRTUAL_SPORTS_GOLF               0x18000000L
#define DIAXIS_GOLF_LATERAL                 0x18008201L
#define DIAXIS_GOLF_MOVE                    0x18010202L
#define DIBUTTON_GOLF_SWING                 0x18000401L
#define DIBUTTON_GOLF_SELECT                0x18000402L
#define DIBUTTON_GOLF_UP                    0x18000403L
#define DIBUTTON_GOLF_DOWN                  0x18000404L
#define DIBUTTON_GOLF_TERRAIN               0x18000405L
#define DIBUTTON_GOLF_FLYBY                 0x18000406L
#define DIBUTTON_GOLF_MENU                  0x180004FDL
#define DIHATSWITCH_GOLF_SCROLL             0x18004601L
#define DIBUTTON_GOLF_ZOOM                  0x18004407L
#define DIBUTTON_GOLF_TIMEOUT               0x18004408L
#define DIBUTTON_GOLF_SUBSTITUTE            0x18004409L
#define DIBUTTON_GOLF_LEFT_LINK             0x1800C4E4L
#define DIBUTTON_GOLF_RIGHT_LINK            0x1800C4ECL
#define DIBUTTON_GOLF_FORWARD_LINK          0x180144E0L
#define DIBUTTON_GOLF_BACK_LINK             0x180144E8L
#define DIBUTTON_GOLF_DEVICE                0x180044FEL
#define DIBUTTON_GOLF_PAUSE                 0x180044FCL
#define DIVIRTUAL_SPORTS_HOCKEY_OFFENSE     0x19000000L
#define DIAXIS_HOCKEYO_LATERAL              0x19008201L
#define DIAXIS_HOCKEYO_MOVE                 0x19010202L
#define DIBUTTON_HOCKEYO_SHOOT              0x19000401L
#define DIBUTTON_HOCKEYO_PASS               0x19000402L
#define DIBUTTON_HOCKEYO_BURST              0x19000403L
#define DIBUTTON_HOCKEYO_SPECIAL            0x19000404L
#define DIBUTTON_HOCKEYO_FAKE               0x19000405L
#define DIBUTTON_HOCKEYO_MENU               0x190004FDL
#define DIHATSWITCH_HOCKEYO_SCROLL          0x19004601L
#define DIBUTTON_HOCKEYO_ZOOM               0x19004406L
#define DIBUTTON_HOCKEYO_STRATEGY           0x19004407L
#define DIBUTTON_HOCKEYO_TIMEOUT            0x19004408L
#define DIBUTTON_HOCKEYO_SUBSTITUTE         0x19004409L
#define DIBUTTON_HOCKEYO_LEFT_LINK          0x1900C4E4L
#define DIBUTTON_HOCKEYO_RIGHT_LINK         0x1900C4ECL
#define DIBUTTON_HOCKEYO_FORWARD_LINK       0x190144E0L
#define DIBUTTON_HOCKEYO_BACK_LINK          0x190144E8L
#define DIBUTTON_HOCKEYO_DEVICE             0x190044FEL
#define DIBUTTON_HOCKEYO_PAUSE              0x190044FCL
#define DIVIRTUAL_SPORTS_HOCKEY_DEFENSE     0x1A000000L
#define DIAXIS_HOCKEYD_LATERAL              0x1A008201L
#define DIAXIS_HOCKEYD_MOVE                 0x1A010202L
#define DIBUTTON_HOCKEYD_PLAYER             0x1A000401L
#define DIBUTTON_HOCKEYD_STEAL              0x1A000402L
#define DIBUTTON_HOCKEYD_BURST              0x1A000403L
#define DIBUTTON_HOCKEYD_BLOCK              0x1A000404L
#define DIBUTTON_HOCKEYD_FAKE               0x1A000405L
#define DIBUTTON_HOCKEYD_MENU               0x1A0004FDL
#define DIHATSWITCH_HOCKEYD_SCROLL          0x1A004601L
#define DIBUTTON_HOCKEYD_ZOOM               0x1A004406L
#define DIBUTTON_HOCKEYD_STRATEGY           0x1A004407L
#define DIBUTTON_HOCKEYD_TIMEOUT            0x1A004408L
#define DIBUTTON_HOCKEYD_SUBSTITUTE         0x1A004409L
#define DIBUTTON_HOCKEYD_LEFT_LINK          0x1A00C4E4L
#define DIBUTTON_HOCKEYD_RIGHT_LINK         0x1A00C4ECL
#define DIBUTTON_HOCKEYD_FORWARD_LINK       0x1A0144E0L
#define DIBUTTON_HOCKEYD_BACK_LINK          0x1A0144E8L
#define DIBUTTON_HOCKEYD_DEVICE             0x1A0044FEL
#define DIBUTTON_HOCKEYD_PAUSE              0x1A0044FCL
#define DIVIRTUAL_SPORTS_HOCKEY_GOALIE      0x1B000000L
#define DIAXIS_HOCKEYG_LATERAL              0x1B008201L
#define DIAXIS_HOCKEYG_MOVE                 0x1B010202L
#define DIBUTTON_HOCKEYG_PASS               0x1B000401L
#define DIBUTTON_HOCKEYG_POKE               0x1B000402L
#define DIBUTTON_HOCKEYG_STEAL              0x1B000403L
#define DIBUTTON_HOCKEYG_BLOCK              0x1B000404L
#define DIBUTTON_HOCKEYG_MENU               0x1B0004FDL
#define DIHATSWITCH_HOCKEYG_SCROLL          0x1B004601L
#define DIBUTTON_HOCKEYG_ZOOM               0x1B004405L
#define DIBUTTON_HOCKEYG_STRATEGY           0x1B004406L
#define DIBUTTON_HOCKEYG_TIMEOUT            0x1B004407L
#define DIBUTTON_HOCKEYG_SUBSTITUTE         0x1B004408L
#define DIBUTTON_HOCKEYG_LEFT_LINK          0x1B00C4E4L
#define DIBUTTON_HOCKEYG_RIGHT_LINK         0x1B00C4ECL
#define DIBUTTON_HOCKEYG_FORWARD_LINK       0x1B0144E0L
#define DIBUTTON_HOCKEYG_BACK_LINK          0x1B0144E8L
#define DIBUTTON_HOCKEYG_DEVICE             0x1B0044FEL
#define DIBUTTON_HOCKEYG_PAUSE              0x1B0044FCL
#define DIVIRTUAL_SPORTS_BIKING_MOUNTAIN    0x1C000000L
#define DIAXIS_BIKINGM_TURN                 0x1C008201L
#define DIAXIS_BIKINGM_PEDAL                0x1C010202L
#define DIBUTTON_BIKINGM_JUMP               0x1C000401L
#define DIBUTTON_BIKINGM_CAMERA             0x1C000402L
#define DIBUTTON_BIKINGM_SPECIAL1           0x1C000403L
#define DIBUTTON_BIKINGM_SELECT             0x1C000404L
#define DIBUTTON_BIKINGM_SPECIAL2           0x1C000405L
#define DIBUTTON_BIKINGM_MENU               0x1C0004FDL
#define DIHATSWITCH_BIKINGM_SCROLL          0x1C004601L
#define DIBUTTON_BIKINGM_ZOOM               0x1C004406L
#define DIAXIS_BIKINGM_BRAKE                0x1C044203L
#define DIBUTTON_BIKINGM_LEFT_LINK          0x1C00C4E4L
#define DIBUTTON_BIKINGM_RIGHT_LINK         0x1C00C4ECL
#define DIBUTTON_BIKINGM_FASTER_LINK        0x1C0144E0L
#define DIBUTTON_BIKINGM_SLOWER_LINK        0x1C0144E8L
#define DIBUTTON_BIKINGM_BRAKE_BUTTON_LINK  0x1C0444E8L
#define DIBUTTON_BIKINGM_DEVICE             0x1C0044FEL
#define DIBUTTON_BIKINGM_PAUSE              0x1C0044FCL
#define DIVIRTUAL_SPORTS_SKIING             0x1D000000L
#define DIAXIS_SKIING_TURN                  0x1D008201L
#define DIAXIS_SKIING_SPEED                 0x1D010202L
#define DIBUTTON_SKIING_JUMP                0x1D000401L
#define DIBUTTON_SKIING_CROUCH              0x1D000402L
#define DIBUTTON_SKIING_CAMERA              0x1D000403L
#define DIBUTTON_SKIING_SPECIAL1            0x1D000404L
#define DIBUTTON_SKIING_SELECT              0x1D000405L
#define DIBUTTON_SKIING_SPECIAL2            0x1D000406L
#define DIBUTTON_SKIING_MENU                0x1D0004FDL
#define DIHATSWITCH_SKIING_GLANCE           0x1D004601L
#define DIBUTTON_SKIING_ZOOM                0x1D004407L
#define DIBUTTON_SKIING_LEFT_LINK           0x1D00C4E4L
#define DIBUTTON_SKIING_RIGHT_LINK          0x1D00C4ECL
#define DIBUTTON_SKIING_FASTER_LINK         0x1D0144E0L
#define DIBUTTON_SKIING_SLOWER_LINK         0x1D0144E8L
#define DIBUTTON_SKIING_DEVICE              0x1D0044FEL
#define DIBUTTON_SKIING_PAUSE               0x1D0044FCL
#define DIVIRTUAL_SPORTS_SOCCER_OFFENSE     0x1E000000L
#define DIAXIS_SOCCERO_LATERAL              0x1E008201L
#define DIAXIS_SOCCERO_MOVE                 0x1E010202L
#define DIAXIS_SOCCERO_BEND                 0x1E010203L
#define DIBUTTON_SOCCERO_SHOOT              0x1E000401L
#define DIBUTTON_SOCCERO_PASS               0x1E000402L
#define DIBUTTON_SOCCERO_FAKE               0x1E000403L
#define DIBUTTON_SOCCERO_PLAYER             0x1E000404L
#define DIBUTTON_SOCCERO_SPECIAL1           0x1E000405L
#define DIBUTTON_SOCCERO_SELECT             0x1E000406L
#define DIBUTTON_SOCCERO_MENU               0x1E0004FDL
#define DIHATSWITCH_SOCCERO_GLANCE          0x1E004601L
#define DIBUTTON_SOCCERO_SUBSTITUTE         0x1E004407L
#define DIBUTTON_SOCCERO_SHOOTLOW           0x1E004408L
#define DIBUTTON_SOCCERO_SHOOTHIGH          0x1E004409L
#define DIBUTTON_SOCCERO_PASSTHRU           0x1E00440AL
#define DIBUTTON_SOCCERO_SPRINT             0x1E00440BL
#define DIBUTTON_SOCCERO_CONTROL            0x1E00440CL
#define DIBUTTON_SOCCERO_HEAD               0x1E00440DL
#define DIBUTTON_SOCCERO_LEFT_LINK          0x1E00C4E4L
#define DIBUTTON_SOCCERO_RIGHT_LINK         0x1E00C4ECL
#define DIBUTTON_SOCCERO_FORWARD_LINK       0x1E0144E0L
#define DIBUTTON_SOCCERO_BACK_LINK          0x1E0144E8L
#define DIBUTTON_SOCCERO_DEVICE             0x1E0044FEL
#define DIBUTTON_SOCCERO_PAUSE              0x1E0044FCL
#define DIVIRTUAL_SPORTS_SOCCER_DEFENSE     0x1F000000L
#define DIAXIS_SOCCERD_LATERAL              0x1F008201L
#define DIAXIS_SOCCERD_MOVE                 0x1F010202L
#define DIBUTTON_SOCCERD_BLOCK              0x1F000401L
#define DIBUTTON_SOCCERD_STEAL              0x1F000402L
#define DIBUTTON_SOCCERD_FAKE               0x1F000403L
#define DIBUTTON_SOCCERD_PLAYER             0x1F000404L
#define DIBUTTON_SOCCERD_SPECIAL            0x1F000405L
#define DIBUTTON_SOCCERD_SELECT             0x1F000406L
#define DIBUTTON_SOCCERD_SLIDE              0x1F000407L
#define DIBUTTON_SOCCERD_MENU               0x1F0004FDL
#define DIHATSWITCH_SOCCERD_GLANCE          0x1F004601L
#define DIBUTTON_SOCCERD_FOUL               0x1F004408L
#define DIBUTTON_SOCCERD_HEAD               0x1F004409L
#define DIBUTTON_SOCCERD_CLEAR              0x1F00440AL
#define DIBUTTON_SOCCERD_GOALIECHARGE       0x1F00440BL
#define DIBUTTON_SOCCERD_SUBSTITUTE         0x1F00440CL
#define DIBUTTON_SOCCERD_LEFT_LINK          0x1F00C4E4L
#define DIBUTTON_SOCCERD_RIGHT_LINK         0x1F00C4ECL
#define DIBUTTON_SOCCERD_FORWARD_LINK       0x1F0144E0L
#define DIBUTTON_SOCCERD_BACK_LINK          0x1F0144E8L
#define DIBUTTON_SOCCERD_DEVICE             0x1F0044FEL
#define DIBUTTON_SOCCERD_PAUSE              0x1F0044FCL
#define DIVIRTUAL_SPORTS_RACQUET            0x20000000L
#define DIAXIS_RACQUET_LATERAL              0x20008201L
#define DIAXIS_RACQUET_MOVE                 0x20010202L
#define DIBUTTON_RACQUET_SWING              0x20000401L
#define DIBUTTON_RACQUET_BACKSWING          0x20000402L
#define DIBUTTON_RACQUET_SMASH              0x20000403L
#define DIBUTTON_RACQUET_SPECIAL            0x20000404L
#define DIBUTTON_RACQUET_SELECT             0x20000405L
#define DIBUTTON_RACQUET_MENU               0x200004FDL
#define DIHATSWITCH_RACQUET_GLANCE          0x20004601L
#define DIBUTTON_RACQUET_TIMEOUT            0x20004406L
#define DIBUTTON_RACQUET_SUBSTITUTE         0x20004407L
#define DIBUTTON_RACQUET_LEFT_LINK          0x2000C4E4L
#define DIBUTTON_RACQUET_RIGHT_LINK         0x2000C4ECL
#define DIBUTTON_RACQUET_FORWARD_LINK       0x200144E0L
#define DIBUTTON_RACQUET_BACK_LINK          0x200144E8L
#define DIBUTTON_RACQUET_DEVICE             0x200044FEL
#define DIBUTTON_RACQUET_PAUSE              0x200044FCL
#define DIVIRTUAL_ARCADE_SIDE2SIDE          0x21000000L
#define DIAXIS_ARCADES_LATERAL              0x21008201L
#define DIAXIS_ARCADES_MOVE                 0x21010202L
#define DIBUTTON_ARCADES_THROW              0x21000401L
#define DIBUTTON_ARCADES_CARRY              0x21000402L
#define DIBUTTON_ARCADES_ATTACK             0x21000403L
#define DIBUTTON_ARCADES_SPECIAL            0x21000404L
#define DIBUTTON_ARCADES_SELECT             0x21000405L
#define DIBUTTON_ARCADES_MENU               0x210004FDL
#define DIHATSWITCH_ARCADES_VIEW            0x21004601L
#define DIBUTTON_ARCADES_LEFT_LINK          0x2100C4E4L
#define DIBUTTON_ARCADES_RIGHT_LINK         0x2100C4ECL
#define DIBUTTON_ARCADES_FORWARD_LINK       0x210144E0L
#define DIBUTTON_ARCADES_BACK_LINK          0x210144E8L
#define DIBUTTON_ARCADES_VIEW_UP_LINK       0x2107C4E0L
#define DIBUTTON_ARCADES_VIEW_DOWN_LINK     0x2107C4E8L
#define DIBUTTON_ARCADES_VIEW_LEFT_LINK     0x2107C4E4L
#define DIBUTTON_ARCADES_VIEW_RIGHT_LINK    0x2107C4ECL
#define DIBUTTON_ARCADES_DEVICE             0x210044FEL
#define DIBUTTON_ARCADES_PAUSE              0x210044FCL
#define DIVIRTUAL_ARCADE_PLATFORM           0x22000000L
#define DIAXIS_ARCADEP_LATERAL              0x22008201L
#define DIAXIS_ARCADEP_MOVE                 0x22010202L
#define DIBUTTON_ARCADEP_JUMP               0x22000401L
#define DIBUTTON_ARCADEP_FIRE               0x22000402L
#define DIBUTTON_ARCADEP_CROUCH             0x22000403L
#define DIBUTTON_ARCADEP_SPECIAL            0x22000404L
#define DIBUTTON_ARCADEP_SELECT             0x22000405L
#define DIBUTTON_ARCADEP_MENU               0x220004FDL
#define DIHATSWITCH_ARCADEP_VIEW            0x22004601L
#define DIBUTTON_ARCADEP_FIRESECONDARY      0x22004406L
#define DIBUTTON_ARCADEP_LEFT_LINK          0x2200C4E4L
#define DIBUTTON_ARCADEP_RIGHT_LINK         0x2200C4ECL
#define DIBUTTON_ARCADEP_FORWARD_LINK       0x220144E0L
#define DIBUTTON_ARCADEP_BACK_LINK          0x220144E8L
#define DIBUTTON_ARCADEP_VIEW_UP_LINK       0x2207C4E0L
#define DIBUTTON_ARCADEP_VIEW_DOWN_LINK     0x2207C4E8L
#define DIBUTTON_ARCADEP_VIEW_LEFT_LINK     0x2207C4E4L
#define DIBUTTON_ARCADEP_VIEW_RIGHT_LINK    0x2207C4ECL
#define DIBUTTON_ARCADEP_DEVICE             0x220044FEL
#define DIBUTTON_ARCADEP_PAUSE              0x220044FCL
#define DIVIRTUAL_CAD_2DCONTROL             0x23000000L
#define DIAXIS_2DCONTROL_LATERAL            0x23008201L
#define DIAXIS_2DCONTROL_MOVE               0x23010202L
#define DIAXIS_2DCONTROL_INOUT              0x23010203L
#define DIBUTTON_2DCONTROL_SELECT           0x23000401L
#define DIBUTTON_2DCONTROL_SPECIAL1         0x23000402L
#define DIBUTTON_2DCONTROL_SPECIAL          0x23000403L
#define DIBUTTON_2DCONTROL_SPECIAL2         0x23000404L
#define DIBUTTON_2DCONTROL_MENU             0x230004FDL
#define DIHATSWITCH_2DCONTROL_HATSWITCH     0x23004601L
#define DIAXIS_2DCONTROL_ROTATEZ            0x23024204L
#define DIBUTTON_2DCONTROL_DISPLAY          0x23004405L
#define DIBUTTON_2DCONTROL_DEVICE           0x230044FEL
#define DIBUTTON_2DCONTROL_PAUSE            0x230044FCL
#define DIVIRTUAL_CAD_3DCONTROL             0x24000000L
#define DIAXIS_3DCONTROL_LATERAL            0x24008201L
#define DIAXIS_3DCONTROL_MOVE               0x24010202L
#define DIAXIS_3DCONTROL_INOUT              0x24018203L
#define DIBUTTON_3DCONTROL_SELECT           0x24000401L
#define DIBUTTON_3DCONTROL_SPECIAL1         0x24000402L
#define DIBUTTON_3DCONTROL_SPECIAL          0x24000403L
#define DIBUTTON_3DCONTROL_SPECIAL2         0x24000404L
#define DIBUTTON_3DCONTROL_MENU             0x240004FDL
#define DIHATSWITCH_3DCONTROL_HATSWITCH     0x24004601L
#define DIAXIS_3DCONTROL_ROTATEX            0x24034204L
#define DIAXIS_3DCONTROL_ROTATEY            0x2402C205L
#define DIAXIS_3DCONTROL_ROTATEZ            0x24024206L
#define DIBUTTON_3DCONTROL_DISPLAY          0x24004405L
#define DIBUTTON_3DCONTROL_DEVICE           0x240044FEL
#define DIBUTTON_3DCONTROL_PAUSE            0x240044FCL
#define DIVIRTUAL_CAD_FLYBY                 0x25000000L
#define DIAXIS_CADF_LATERAL                 0x25008201L
#define DIAXIS_CADF_MOVE                    0x25010202L
#define DIAXIS_CADF_INOUT                   0x25018203L
#define DIBUTTON_CADF_SELECT                0x25000401L
#define DIBUTTON_CADF_SPECIAL1              0x25000402L
#define DIBUTTON_CADF_SPECIAL               0x25000403L
#define DIBUTTON_CADF_SPECIAL2              0x25000404L
#define DIBUTTON_CADF_MENU                  0x250004FDL
#define DIHATSWITCH_CADF_HATSWITCH          0x25004601L
#define DIAXIS_CADF_ROTATEX                 0x25034204L
#define DIAXIS_CADF_ROTATEY                 0x2502C205L
#define DIAXIS_CADF_ROTATEZ                 0x25024206L
#define DIBUTTON_CADF_DISPLAY               0x25004405L
#define DIBUTTON_CADF_DEVICE                0x250044FEL
#define DIBUTTON_CADF_PAUSE                 0x250044FCL
#define DIVIRTUAL_CAD_MODEL                 0x26000000L
#define DIAXIS_CADM_LATERAL                 0x26008201L
#define DIAXIS_CADM_MOVE                    0x26010202L
#define DIAXIS_CADM_INOUT                   0x26010203L
#define DIBUTTON_CADM_SELECT                0x26000401L
#define DIBUTTON_CADM_SPECIAL1              0x26000402L
#define DIBUTTON_CADM_SPECIAL               0x26000403L
#define DIBUTTON_CADM_SPECIAL2              0x26000404L
#define DIBUTTON_CADM_MENU                  0x260004FDL
#define DIHATSWITCH_CADM_HATSWITCH          0x26004601L
#define DIAXIS_CADM_ROTATEX                 0x26034204L
#define DIAXIS_CADM_ROTATEY                 0x2602C205L
#define DIAXIS_CADM_ROTATEZ                 0x26024206L
#define DIBUTTON_CADM_DISPLAY               0x26004405L
#define DIBUTTON_CADM_DEVICE                0x260044FEL
#define DIBUTTON_CADM_PAUSE                 0x260044FCL
#define DIVIRTUAL_REMOTE_CONTROL            0x27000000L
#define DIAXIS_REMOTE_SLIDER                0x27050201L
#define DIBUTTON_REMOTE_MUTE                0x27000401L
#define DIBUTTON_REMOTE_SELECT              0x27000402L
#define DIBUTTON_REMOTE_PLAY                0x27002403L
#define DIBUTTON_REMOTE_CUE                 0x27002404L
#define DIBUTTON_REMOTE_REVIEW              0x27002405L
#define DIBUTTON_REMOTE_CHANGE              0x27002406L
#define DIBUTTON_REMOTE_RECORD              0x27002407L
#define DIBUTTON_REMOTE_MENU                0x270004FDL
#define DIAXIS_REMOTE_SLIDER2               0x27054202L
#define DIBUTTON_REMOTE_TV                  0x27005C08L
#define DIBUTTON_REMOTE_CABLE               0x27005C09L
#define DIBUTTON_REMOTE_CD                  0x27005C0AL
#define DIBUTTON_REMOTE_VCR                 0x27005C0BL
#define DIBUTTON_REMOTE_TUNER               0x27005C0CL
#define DIBUTTON_REMOTE_DVD                 0x27005C0DL
#define DIBUTTON_REMOTE_ADJUST              0x27005C0EL
#define DIBUTTON_REMOTE_DIGIT0              0x2700540FL
#define DIBUTTON_REMOTE_DIGIT1              0x27005410L
#define DIBUTTON_REMOTE_DIGIT2              0x27005411L
#define DIBUTTON_REMOTE_DIGIT3              0x27005412L
#define DIBUTTON_REMOTE_DIGIT4              0x27005413L
#define DIBUTTON_REMOTE_DIGIT5              0x27005414L
#define DIBUTTON_REMOTE_DIGIT6              0x27005415L
#define DIBUTTON_REMOTE_DIGIT7              0x27005416L
#define DIBUTTON_REMOTE_DIGIT8              0x27005417L
#define DIBUTTON_REMOTE_DIGIT9              0x27005418L
#define DIBUTTON_REMOTE_DEVICE              0x270044FEL
#define DIBUTTON_REMOTE_PAUSE               0x270044FCL
#define DIVIRTUAL_BROWSER_CONTROL           0x28000000L
#define DIAXIS_BROWSER_LATERAL              0x28008201L
#define DIAXIS_BROWSER_MOVE                 0x28010202L
#define DIBUTTON_BROWSER_SELECT             0x28000401L
#define DIAXIS_BROWSER_VIEW                 0x28018203L
#define DIBUTTON_BROWSER_REFRESH            0x28000402L
#define DIBUTTON_BROWSER_MENU               0x280004FDL
#define DIBUTTON_BROWSER_SEARCH             0x28004403L
#define DIBUTTON_BROWSER_STOP               0x28004404L
#define DIBUTTON_BROWSER_HOME               0x28004405L
#define DIBUTTON_BROWSER_FAVORITES          0x28004406L
#define DIBUTTON_BROWSER_NEXT               0x28004407L
#define DIBUTTON_BROWSER_PREVIOUS           0x28004408L
#define DIBUTTON_BROWSER_HISTORY            0x28004409L
#define DIBUTTON_BROWSER_PRINT              0x2800440AL
#define DIBUTTON_BROWSER_DEVICE             0x280044FEL
#define DIBUTTON_BROWSER_PAUSE              0x280044FCL
#define DIVIRTUAL_DRIVING_MECHA             0x29000000L
#define DIAXIS_MECHA_STEER                  0x29008201L
#define DIAXIS_MECHA_TORSO                  0x29010202L
#define DIAXIS_MECHA_ROTATE                 0x29020203L
#define DIAXIS_MECHA_THROTTLE               0x29038204L
#define DIBUTTON_MECHA_FIRE                 0x29000401L
#define DIBUTTON_MECHA_WEAPONS              0x29000402L
#define DIBUTTON_MECHA_TARGET               0x29000403L
#define DIBUTTON_MECHA_REVERSE              0x29000404L
#define DIBUTTON_MECHA_ZOOM                 0x29000405L
#define DIBUTTON_MECHA_JUMP                 0x29000406L
#define DIBUTTON_MECHA_MENU                 0x290004FDL
#define DIBUTTON_MECHA_CENTER               0x29004407L
#define DIHATSWITCH_MECHA_GLANCE            0x29004601L
#define DIBUTTON_MECHA_VIEW                 0x29004408L
#define DIBUTTON_MECHA_FIRESECONDARY        0x29004409L
#define DIBUTTON_MECHA_LEFT_LINK            0x2900C4E4L
#define DIBUTTON_MECHA_RIGHT_LINK           0x2900C4ECL
#define DIBUTTON_MECHA_FORWARD_LINK         0x290144E0L
#define DIBUTTON_MECHA_BACK_LINK            0x290144E8L
#define DIBUTTON_MECHA_ROTATE_LEFT_LINK     0x290244E4L
#define DIBUTTON_MECHA_ROTATE_RIGHT_LINK    0x290244ECL
#define DIBUTTON_MECHA_FASTER_LINK          0x2903C4E0L
#define DIBUTTON_MECHA_SLOWER_LINK          0x2903C4E8L
#define DIBUTTON_MECHA_DEVICE               0x290044FEL
#define DIBUTTON_MECHA_PAUSE                0x290044FCL
#define DIAXIS_ANY_X_1                      0xFF00C201L
#define DIAXIS_ANY_X_2                      0xFF00C202L
#define DIAXIS_ANY_Y_1                      0xFF014201L
#define DIAXIS_ANY_Y_2                      0xFF014202L
#define DIAXIS_ANY_Z_1                      0xFF01C201L
#define DIAXIS_ANY_Z_2                      0xFF01C202L
#define DIAXIS_ANY_R_1                      0xFF024201L
#define DIAXIS_ANY_R_2                      0xFF024202L
#define DIAXIS_ANY_U_1                      0xFF02C201L
#define DIAXIS_ANY_U_2                      0xFF02C202L
#define DIAXIS_ANY_V_1                      0xFF034201L
#define DIAXIS_ANY_V_2                      0xFF034202L
#define DIAXIS_ANY_A_1                      0xFF03C201L
#define DIAXIS_ANY_A_2                      0xFF03C202L
#define DIAXIS_ANY_B_1                      0xFF044201L
#define DIAXIS_ANY_B_2                      0xFF044202L
#define DIAXIS_ANY_C_1                      0xFF04C201L
#define DIAXIS_ANY_C_2                      0xFF04C202L
#define DIAXIS_ANY_S_1                      0xFF054201L
#define DIAXIS_ANY_S_2                      0xFF054202L
#define DIAXIS_ANY_1                        0xFF004201L
#define DIAXIS_ANY_2                        0xFF004202L
#define DIAXIS_ANY_3                        0xFF004203L
#define DIAXIS_ANY_4                        0xFF004204L
#define DIPOV_ANY_1                         0xFF004601L
#define DIPOV_ANY_2                         0xFF004602L
#define DIPOV_ANY_3                         0xFF004603L
#define DIPOV_ANY_4                         0xFF004604L
#define DIBUTTON_ANY( x )                   (0xFF004400L | (x))

/* DirectInput constant force effect */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DICONSTANTFORCE {
    LONG    lMagnitude;
} DICONSTANTFORCE;
typedef DICONSTANTFORCE         *LPDICONSTANTFORCE;
typedef const DICONSTANTFORCE   *LPCDICONSTANTFORCE;
#endif

/* DirectInput ramp force effect */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIRAMPFORCE {
    LONG    lStart;
    LONG    lEnd;
} DIRAMPFORCE;
typedef DIRAMPFORCE         *LPDIRAMPFORCE;
typedef const DIRAMPFORCE   *LPCDIRAMPFORCE;
#endif

/* DirectInput periodic effect */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIPERIODIC {
    DWORD   dwMagnitude;
    LONG    lOffset;
    DWORD   dwPhase;
    DWORD   dwPeriod;
} DIPERIODIC;
typedef DIPERIODIC          *LPDIPERIODIC;
typedef const DIPERIODIC    *LPCDIPERIODIC;
#endif

/* DirectInput condition effect */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DICONDITION {
    LONG    lOffset;
    LONG    lPositiveCoefficient;
    LONG    lNegativeCoefficient;
    DWORD   dwPositiveSaturation;
    DWORD   dwNegativeSaturation;
    LONG    lDeadBand;
} DICONDITION;
typedef DICONDITION         *LPDICONDITION;
typedef const DICONDITION   *LPCDICONDITION;
#endif

/* DirectInput custom force effect */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DICUSTOMFORCE {
    DWORD   cChannels;
    DWORD   dwSamplePeriod;
    DWORD   cSamples;
    LPLONG  rglForceData;
} DICUSTOMFORCE;
typedef DICUSTOMFORCE       *LPDICUSTOMFORCE;
typedef const DICUSTOMFORCE *LPCDICUSTOMFORCE;
#endif

/* DirectInput envelope */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIENVELOPE {
    DWORD   dwSize;
    DWORD   dwAttackLevel;
    DWORD   dwAttackTime;
    DWORD   dwFadeLevel;
    DWORD   dwFadeTime;
} DIENVELOPE;
typedef DIENVELOPE          *LPDIENVELOPE;
typedef const DIENVELOPE    *LPCDIENVELOPE;
#endif

/* DirectInput effect for DirectX 5 compatibility */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIEFFECT_DX5 {
    DWORD           dwSize;
    DWORD           dwFlags;
    DWORD           dwDuration;
    DWORD           dwSamplePeriod;
    DWORD           dwGain;
    DWORD           dwTriggerButton;
    DWORD           dwTriggerRepeatInterval;
    DWORD           cAxes;
    LPDWORD         rgdwAxes;
    LPLONG          rglDirection;
    LPDIENVELOPE    lpEnvelope;
    DWORD           cbTypeSpecificParams;
    LPVOID          lpvTypeSpecificParams;
} DIEFFECT_DX5;
typedef DIEFFECT_DX5        *LPDIEFFECT_DX5;
typedef const DIEFFECT_DX5  *LPCDIEFFECT_DX5;
#endif

/* DirectInput effect */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIEFFECT {
    DWORD           dwSize;
    DWORD           dwFlags;
    DWORD           dwDuration;
    DWORD           dwSamplePeriod;
    DWORD           dwGain;
    DWORD           dwTriggerButton;
    DWORD           dwTriggerRepeatInterval;
    DWORD           cAxes;
    LPDWORD         rgdwAxes;
    LPLONG          rglDirection;
    LPDIENVELOPE    lpEnvelope;
    DWORD           cbTypeSpecificParams;
    LPVOID          lpvTypeSpecificParams;
#if (DIRECTINPUT_VERSION >= 0x0600)
    DWORD           dwStartDelay;
#endif
} DIEFFECT;
typedef DIEFFECT        *LPDIEFFECT;
typedef DIEFFECT        DIEFFECT_DX6;
typedef LPDIEFFECT      LPDIEFFECT_DX6;
typedef const DIEFFECT  *LPCDIEFFECT;
#endif

/* DirectInput file effect */
#if (DIRECTINPUT_VERSION >= 0x0700)
typedef struct DIFILEEFFECT {
    DWORD       dwSize;
    GUID        GuidEffect;
    LPCDIEFFECT lpDiEffect;
    CHAR        szFriendlyName[MAX_PATH];
} DIFILEEFFECT;
typedef DIFILEEFFECT        *LPDIFILEEFFECT;
typedef const DIFILEEFFECT  *LPCDIFILEEFFECT;
#endif

/* DirectInput effect enumeration callback */
#if (DIRECTINPUT_VERSION >= 0x0700)
typedef BOOL (PASCAL *LPDIENUMEFFECTSINFILECALLBACK)( LPCDIFILEEFFECT, LPVOID );
#endif

/* DirectInput effect escape */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIEFFESCAPE {
    DWORD   dwSize;
    DWORD   dwCommand;
    LPVOID  lpvInBuffer;
    DWORD   cbInBuffer;
    LPVOID  lpvOutBuffer;
    DWORD   cbOutBuffer;
} DIEFFESCAPE;
typedef DIEFFESCAPE *LPDIEFFESCAPE;
#endif

/* DirectInput device capabilities for DirectX 3 compatibility */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIDEVCAPS_DX3 {
    DWORD   dwSize;
    DWORD   dwFlags;
    DWORD   dwDevType;
    DWORD   dwAxes;
    DWORD   dwButtons;
    DWORD   dwPOVs;
} DIDEVCAPS_DX3;
typedef DIDEVCAPS_DX3   *LPDIDEVCAPS_DX3;
#endif

/* DirectInput device capabilities */
typedef struct DIDEVCAPS {
    DWORD   dwSize;
    DWORD   dwFlags;
    DWORD   dwDevType;
    DWORD   dwAxes;
    DWORD   dwButtons;
    DWORD   dwPOVs;
#if (DIRECTINPUT_VERSION >= 0x0500)
    DWORD   dwFFSamplePeriod;
    DWORD   dwFFMinTimeResolution;
    DWORD   dwFirmwareRevision;
    DWORD   dwHardwareRevision;
    DWORD   dwFFDriverRevision;
#endif
} DIDEVCAPS;
typedef DIDEVCAPS   *LPDIDEVCAPS;

/* DirectInput object data format */
typedef struct _DIOBJECTDATAFORMAT {
    const GUID  *pguid;
    DWORD       dwOfs;
    DWORD       dwType;
    DWORD       dwFlags;
} DIOBJECTDATAFORMAT;
typedef DIOBJECTDATAFORMAT          *LPDIOBJECTDATAFORMAT;
typedef const DIOBJECTDATAFORMAT    *LPCDIOBJECTDATAFORMAT;

/* DirectInput data format */
typedef struct _DIDATAFORMAT {
    DWORD                   dwSize;
    DWORD                   dwObjSize;
    DWORD                   dwFlags;
    DWORD                   dwDataSize;
    DWORD                   dwNumObjs;
    LPDIOBJECTDATAFORMAT    rgodf;
} DIDATAFORMAT;
typedef DIDATAFORMAT        *LPDIDATAFORMAT;
typedef const DIDATAFORMAT  *LPCDIDATAFORMAT;

/* DirectInput action */
#if (DIRECTINPUT_VERSION > 0x0700)
typedef struct _DIACTIONA {
    UINT_PTR    uAppData;
    DWORD       dwSemantic;
    DWORD       dwFlags;
    union {
        LPCSTR  lptszActionName;
        UINT    uResIdString;
    };
    GUID        guidInstance;
    DWORD       dwObjID;
    DWORD       dwHow;
} DIACTIONA;
typedef DIACTIONA       *LPDIACTIONA;
typedef const DIACTIONA *LPCDIACTIONA;
typedef struct _DIACTIONW {
    UINT_PTR    uAppData;
    DWORD       dwSemantic;
    DWORD       dwFlags;
    union {
        LPCWSTR lptszActionName;
        UINT    uResIdString;
    };
    GUID        guidInstance;
    DWORD       dwObjID;
    DWORD       dwHow;
} DIACTIONW;
typedef DIACTIONW       *LPDIACTIONW;
typedef const DIACTIONW *LPCDIACTIONW;
#ifdef UNICODE
typedef DIACTIONW       DIACTION;
typedef LPDIACTIONW     LPDIACTION;
typedef LPCDIACTIONW    LPCDIACTION;
#else
typedef DIACTIONA       DIACTION;
typedef LPDIACTIONA     LPDIACTION;
typedef LPCDIACTIONA    LPCDIACTION;
#endif
#endif

/* DirectInput action format */
#if (DIRECTINPUT_VERSION > 0x0700)
typedef struct _DIACTIONFORMATA {
    DWORD       dwSize;
    DWORD       dwActionSize;
    DWORD       dwDataSize;
    DWORD       dwNumActions;
    LPDIACTIONA rgoAction;
    GUID        guidActionMap;
    DWORD       dwGenre;
    DWORD       dwBufferSize;
    LONG        lAxisMin;
    LONG        lAxisMax;
    HINSTANCE   hInstString;
    FILETIME    ftTimeStamp;
    DWORD       dwCRC;
    CHAR        tszActionMap[MAX_PATH];
} DIACTIONFORMATA;
typedef DIACTIONFORMATA         *LPDIACTIONFORMATA;
typedef const DIACTIONFORMATA   *LPCDIACTIONFORMATA;
typedef struct _DIACTIONFORMATW {
    DWORD       dwSize;
    DWORD       dwActionSize;
    DWORD       dwDataSize;
    DWORD       dwNumActions;
    LPDIACTIONW rgoAction;
    GUID        guidActionMap;
    DWORD       dwGenre;
    DWORD       dwBufferSize;
    LONG        lAxisMin;
    LONG        lAxisMax;
    HINSTANCE   hInstString;
    FILETIME    ftTimeStamp;
    DWORD       dwCRC;
    WCHAR       tszActionMap[MAX_PATH];
} DIACTIONFORMATW;
typedef DIACTIONFORMATW         *LPDIACTIONFORMATW;
typedef const DIACTIONFORMATW   *LPCDIACTIONFORMATW;
#ifdef UNICODE
typedef DIACTIONFORMATW         DIACTIONFORMAT;
typedef LPDIACTIONFORMATW       LPDIACTIONFORMAT;
typedef LPCDIACTIONFORMATW      LPCDIACTIONFORMAT;
#else
typedef DIACTIONFORMATA         DIACTIONFORMAT;
typedef LPDIACTIONFORMATA       LPDIACTIONFORMAT;
typedef LPCDIACTIONFORMATA      LPCDIACTIONFORMAT;
#endif
#endif

/* DirectInput color set */
#if (DIRECTINPUT_VERSION > 0x0700)
typedef struct _DICOLORSET {
    DWORD       dwSize;
    D3DCOLOR    cTextFore;
    D3DCOLOR    cTextHighlight;
    D3DCOLOR    cCalloutLine;
    D3DCOLOR    cCalloutHighlight;
    D3DCOLOR    cBorder;
    D3DCOLOR    cControlFill;
    D3DCOLOR    cHighlightFill;
    D3DCOLOR    cAreaFill;
} DICOLORSET;
typedef DICOLORSET          *LPDICOLORSET;
typedef const DICOLORSET    *LPCDICOLORSET;
#endif

/* DirectInput configure devices parameters */
#if (DIRECTINPUT_VERSION > 0x0700)
typedef struct _DICONFIGUREDEVICESPARAMSA {
    DWORD               dwSize;
    DWORD               dwcUsers;
    LPSTR               lptszUserNames;
    DWORD               dwcFormats;
    LPDIACTIONFORMATA   lprgFormats;
    HWND                hwnd;
    DICOLORSET          dics;
    IUnknown            *lpUnkDDSTarget;
} DICONFIGUREDEVICESPARAMSA;
typedef DICONFIGUREDEVICESPARAMSA       *LPDICONFIGUREDEVICESPARAMSA;
typedef const DICONFIGUREDEVICESPARAMSA *LPCDICONFIGUREDEVICESPARAMSA;
typedef struct _DICONFIGUREDEVICESPARAMW {
    DWORD               dwSize;
    DWORD               dwcUsers;
    LPWSTR              lptszUserNames;
    DWORD               dwcFormats;
    LPDIACTIONFORMATW   lprgFormats;
    HWND                hwnd;
    DICOLORSET          dics;
    IUnknown            *lpUnkDDSTarget;
} DICONFIGUREDEVICESPARAMSW;
typedef DICONFIGUREDEVICESPARAMSW       *LPDICONFIGUREDEVICESPARAMSW;
typedef const DICONFIGUREDEVICESPARAMSW *LPCDICONFIGUREDEVICESPARAMSW;
#ifdef UNICODE
typedef DICONFIGUREDEVICESPARAMSW       DICONFIGUREDEVICESPARAMS;
typedef LPDICONFIGUREDEVICESPARAMSW     LPDICONFIGUREDEVICESPARAMS;
typedef LPCDICONFIGUREDEVICESPARAMSW    LPCDICONFIGUREDEVICESPARAMS;
#else
typedef DICONFIGUREDEVICESPARAMSA       DICONFIGUREDEVICESPARAMS;
typedef LPDICONFIGUREDEVICESPARAMSA     LPDICONFIGUREDEVICESPARAMS;
typedef LPCDICONFIGUREDEVICESPARAMSA    LPCDICONFIGUREDEVICESPARAMS;
#endif
#endif

/* DirectInput device image information */
#if (DIRECTINPUT_VERSION > 0x0700)
typedef struct _DIDEVICEIMAGEINFOA {
    CHAR    tszImagePath[MAX_PATH];
    DWORD   dwFlags;
    DWORD   dwViewID;
    RECT    rcOverlay;
    DWORD   dwObjID;
    DWORD   dwcValidPts;
    POINT   rgptCalloutLine[5];
    RECT    rcCalloutRect;
    DWORD   dwTextAlign;
} DIDEVICEIMAGEINFOA;
typedef DIDEVICEIMAGEINFOA          *LPDIDEVICEIMAGEINFOA;
typedef const DIDEVICEIMAGEINFOA    *LPCDIDEVICEIMAGEINFOA;
typedef struct _DIDEVICEIMAGEINFOW {
    WCHAR   tszImagePath[MAX_PATH];
    DWORD   dwFlags;
    DWORD   dwViewID;
    RECT    rcOverlay;
    DWORD   dwObjID;
    DWORD   dwcValidPts;
    POINT   rgptCalloutLine[5];
    RECT    rcCalloutRect;
    DWORD   dwTextAlign;
} DIDEVICEIMAGEINFOW;
typedef DIDEVICEIMAGEINFOW          *LPDIDEVICEIMAGEINFOW;
typedef const DIDEVICEIMAGEINFOW    *LPCDIDEVICEIMAGEINFOW;
#ifdef UNICODE
typedef DIDEVICEIMAGEINFOW          DIDEVICEIMAGEINFO;
typedef LPDIDEVICEIMAGEINFOW        LPDIDEVICEIMAGEINFO;
typedef LPCDIDEVICEIMAGEINFOW       LPCDIDEVICEIMAGEINFO;
#else
typedef DIDEVICEIMAGEINFOA          DIDEVICEIMAGEINFO;
typedef LPDIDEVICEIMAGEINFOA        LPDIDEVICEIMAGEINFO;
typedef LPCDIDEVICEIMAGEINFOA       LPCDIDEVICEIMAGEINFO;
#endif
#endif

/* DirectInput device image information header */
#if (DIRECTINPUT_VERSION > 0x0700)
typedef struct _DIDEVICEIMAGEINFOHEADERA {
    DWORD                   dwSize;
    DWORD                   dwSizeImageInfo;
    DWORD                   dwcViews;
    DWORD                   dwcButtons;
    DWORD                   dwcAxes;
    DWORD                   dwcPOVs;
    DWORD                   dwBufferSize;
    DWORD                   dwBufferUsed;
    LPDIDEVICEIMAGEINFOA    lprgImageInfoArray;
} DIDEVICEIMAGEINFOHEADERA;
typedef DIDEVICEIMAGEINFOHEADERA        *LPDIDEVICEIMAGEINFOHEADERA;
typedef const DIDEVICEIMAGEINFOHEADERA  *LPCDIDEVICEIMAGEINFOHEADERA;
typedef struct _DIDEVICEIMAGEINFOHEADERW {
    DWORD                   dwSize;
    DWORD                   dwSizeImageInfo;
    DWORD                   dwcViews;
    DWORD                   dwcButtons;
    DWORD                   dwcAxes;
    DWORD                   dwcPOVs;
    DWORD                   dwBufferSize;
    DWORD                   dwBufferUsed;
    LPDIDEVICEIMAGEINFOW    lprgImageInfoArray;
} DIDEVICEIMAGEINFOHEADERW;
typedef DIDEVICEIMAGEINFOHEADERW        *LPDIDEVICEIMAGEINFOHEADERW;
typedef const DIDEVICEIMAGEINFOHEADERW  *LPCDIDEVICEIMAGEINFOHEADERW;
#ifdef UNICODE
typedef DIDEVICEIMAGEINFOHEADERW        DIDEVICEIMAGEINFOHEADER;
typedef LPDIDEVICEIMAGEINFOHEADERW      LPDIDEVICEIMAGEINFOHEADER;
typedef LPCDIDEVICEIMAGEINFOHEADERW     LPCDIDEVICEIMAGEINFOHEADER;
#else
typedef DIDEVICEIMAGEINFOHEADERA        DIDEVICEIMAGEINFOHEADER;
typedef LPDIDEVICEIMAGEINFOHEADERA      LPDIDEVICEIMAGEINFOHEADER;
typedef LPCDIDEVICEIMAGEINFOHEADERA     LPCDIDEVICEIMAGEINFOHEADER;
#endif
#endif

/* DirectInput device object instance for DirectX 3 compatibility */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIDEVICEOBJECTINSTANCE_DX3A {
    DWORD   dwSize;
    GUID    guidType;
    DWORD   dwOfs;
    DWORD   dwType;
    DWORD   dwFlags;
    CHAR    tszName[MAX_PATH];
} DIDEVICEOBJECTINSTANCE_DX3A;
typedef DIDEVICEOBJECTINSTANCE_DX3A         *LPDIDEVICEOBJECTINSTANCE_DX3A;
typedef const DIDEVICEOBJECTINSTANCE_DX3A   *LPCDIDEVICEOBJECTINSTANCE_DX3A;
typedef struct DIDEVICEOBJECTINSTANCE_DX3W {
    DWORD   dwSize;
    GUID    guidType;
    DWORD   dwOfs;
    DWORD   dwType;
    DWORD   dwFlags;
    WCHAR   tszName[MAX_PATH];
} DIDEVICEOBJECTINSTANCE_DX3W;
typedef DIDEVICEOBJECTINSTANCE_DX3W         *LPDIDEVICEOBJECTINSTANCE_DX3W;
typedef const DIDEVICEOBJECTINSTANCE_DX3W   *LPCDIDEVICEOBJECTINSTANCE_DX3W;
#ifdef UNICODE
typedef DIDEVICEOBJECTINSTANCE_DX3W         DIDEVICEOBJECTINSTANCE_DX3;
typedef LPDIDEVICEOBJECTINSTACE_DX3W        LPDIDEVICEOBJECTINSTANCE_DX3;
typedef LPCDIDEVICEOBJECTINSTANCE_DX3W      LPCDIDEVICEOBJECTINSTANCE_DX3;
#else
typedef DIDEVICEOBJECTINSTANCE_DX3A         DIDEVICEOBJECTINSTANCE_DX3;
typedef LPDIDEVICEOBJECTINSTANCE_DX3A       LPDIDEVICEOBJECTINSTANCE_DX3;
typedef LPCDIDEVICEOBJECTINSTANCE_DX3A      LPCDIDEVICEOBJECTINSTANCE_DX3;
#endif
#endif

/* DirectInput device object instance */
typedef struct DIDEVICEOBJECTINSTANCEA {
    DWORD   dwSize;
    GUID    guidType;
    DWORD   dwOfs;
    DWORD   dwType;
    DWORD   dwFlags;
    CHAR    tszName[MAX_PATH];
#if (DIRECTINPUT_VERSION >= 0x0500)
    DWORD   dwFFMaxForce;
    DWORD   dwFFForceResolution;
    WORD    wCollectionNumber;
    WORD    wDesignatorIndex;
    WORD    wUsagePage;
    WORD    wUsage;
    DWORD   dwDimension;
    WORD    wExponent;
    WORD    wReportId;
#endif
} DIDEVICEOBJECTINSTANCEA;
typedef DIDEVICEOBJECTINSTANCEA         *LPDIDEVICEOBJECTINSTANCEA;
typedef const DIDEVICEOBJECTINSTANCEA   *LPCDIDEVICEOBJECTINSTANCEA;
typedef struct DIDEVICEOBJECTINSTANCEW {
    DWORD   dwSize;
    GUID    guidType;
    DWORD   dwOfs;
    DWORD   dwType;
    DWORD   dwFlags;
    WCHAR   tszName[MAX_PATH];
#if (DIRECTINPUT_VERSION >= 0x0500)
    DWORD   dwFFMaxForce;
    DWORD   dwFFForceResolution;
    WORD    wCollectionNumber;
    WORD    wDesignatorIndex;
    WORD    wUsagePage;
    WORD    wUsage;
    DWORD   dwDimension;
    WORD    wExponent;
    WORD    wReportId;
#endif
} DIDEVICEOBJECTINSTANCEW;
typedef DIDEVICEOBJECTINSTANCEW         *LPDIDEVICEOBJECTINSTANCEW;
typedef const DIDEVICEOBJECTINSTANCEW   *LPCDIDEVICEOBJECTINSTANCEW;
#ifdef UNICODE
typedef DIDEVICEOBJECTINSTANCEW         DIDEVICEOBJECTINSTANCE;
typedef LPDIDEVICEOBJECTINSTANCEW       LPDIDEVICEOBJECTINSTANCE;
typedef LPCDIDEVICEOBJECTINSTANCEW      LPCDIDEVICEOBJECTINSTANCE;
#else
typedef DIDEVICEOBJECTINSTANCEA         DIDEVICEOBJECTINSTANCE;
typedef LPDIDEVICEOBJECTINSTANCEA       LPDIDEVICEOBJECTINSTANCE;
typedef LPCDIDEVICEOBJECTINSTANCEA      LPCDIDEVICEOBJECTINSTANCE;
#endif

/* DirectInput device object enumeration callback */
typedef BOOL (PASCAL *LPDIENUMDEVICEOBJECTSCALLBACKA)( LPCDIDEVICEOBJECTINSTANCEA, LPVOID );
typedef BOOL (PASCAL *LPDIENUMDEVICEOBJECTSCALLBACKW)( LPCDIDEVICEOBJECTINSTANCEW, LPVOID );
#ifdef UNICODE
    #define LPDIENUMDEVICEOBJECTSCALLBACK   LPDIENUMDEVICEOBJECTSCALLBACKW
#else
    #define LPDIENUMDEVICEOBJECTSCALLBACK   LPDIENUMDEVICEOBJECTSCALLBACKA
#endif

/* DirectInput property header */
typedef struct DIPROPHEADER {
    DWORD   dwSize;
    DWORD   dwHeaderSize;
    DWORD   dwObj;
    DWORD   dwHow;
} DIPROPHEADER;
typedef DIPROPHEADER        *LPDIPROPHEADER;
typedef const DIPROPHEADER  *LPCDIPROPHEADER;

/* DirectInput property DWORD */
typedef struct DIPROPDWORD {
    DIPROPHEADER    diph;
    DWORD           dwData;
} DIPROPDWORD;
typedef DIPROPDWORD         *LPDIPROPDWORD;
typedef const DIPROPDWORD   *LPCDIPROPDWORD;

/* DirectInput property pointer */
#if (DIRECTINPUT_VERSION >= 0x0800)
typedef struct DIPROPPOINTER {
    DIPROPHEADER    diph;
    UINT_PTR        uData;
} DIPROPPOINTER;
typedef DIPROPPOINTER       *LPDIPROPPOINTER;
typedef const DIPROPPOINTER *LPCDIPROPPOINTER;
#endif

/* DirectInput property range */
typedef struct DIPROPRANGE {
    DIPROPHEADER    diph;
    LONG            lMin;
    LONG            lMax;
} DIPROPRANGE;
typedef DIPROPRANGE         *LPDIPROPRANGE;
typedef const DIPROPRANGE   *LPCDIPROPRANGE;

/* DirectInput property calibration */
#if (DIRECTINPUT_VERSION >= 0x050A)
typedef struct DIPROPCAL {
    DIPROPHEADER    diph;
    LONG            lMin;
    LONG            lCenter;
    LONG            lMax;
} DIPROPCAL;
typedef DIPROPCAL       *LPDIPROPCAL;
typedef const DIPROPCAL *LPCDIPROPCAL;
#endif

/* DirectInput property calibration point-of-view */
#if (DIRECTINPUT_VERSION >= 0x050A)
typedef struct DIPROPCALPOV {
    DIPROPHEADER    diph;
    LONG            lMin[5];
    LONG            lMax[5];
} DIPROPCALPOV;
typedef DIPROPCALPOV        *LPDIPROPCALPOV;
typedef const DIPROPCALPOV  *LPCDIPROPCALPOV;
#endif

/* DirectInput property GUID and path */
#if (DIRECTINPUT_VERSION >= 0x050A)
typedef struct DIPROPGUIDANDPATH {
    DIPROPHEADER    diph;
    GUID            guidClass;
    WCHAR           wszPath[MAX_PATH];
} DIPROPGUIDANDPATH;
typedef DIPROPGUIDANDPATH       *LPDIPROPGUIDANDPATH;
typedef const DIPROPGUIDANDPATH *LPCDIPROPGUIDANDPATH;
#endif

/* DirectInput property string */
#if (DIRECTINPUT_VERSION >= 0x050A)
typedef struct DIPROPSTRING {
    DIPROPHEADER    diph;
    WCHAR           wsz[MAX_PATH];
} DIPROPSTRING;
typedef DIPROPSTRING        *LPDIPROPSTRING;
typedef const DIPROPSTRING  *LPCDIPROPSTRING;
#endif

/* Calibration point */
#if (DIRECTINPUT_VERSION >= 0x0800)
typedef struct _CPOINT {
    LONG    lP;
    DWORD   dwLog;
} CPOINT;
typedef CPOINT  *PCPOINT;
#endif

/* DirectInput property calibration points */
#if (DIRECTINPUT_VERSION >= 0x0800)
typedef struct DIPROPCPOINTS {
    DIPROPHEADER    diph;
    DWORD           dwCPointsNum;
    CPOINT          cp[MAXCPOINTSNUM];
} DIPROPCPOINTS;
typedef DIPROPCPOINTS       *LPDIPROPCPOINTS;
typedef const DIPROPCPOINTS *LPCDIPROPCPOINTS;
#endif

/* DirectInput device object data for DirectX 3 compatibility */
typedef struct DIDEVICEOBJECTDATA_DX3 {
    DWORD   dwOfs;
    DWORD   dwData;
    DWORD   dwTimeStamp;
    DWORD   dwSequence;
} DIDEVICEOBJECTDATA_DX3;
typedef DIDEVICEOBJECTDATA_DX3          *LPDIDEVICEOBJECTDATA_DX3;
typedef const DIDEVICEOBJECTDATA_DX3    *LPCDIDEVICEOBJECTDATA_DX3;

/* DirectInput device object data */
typedef struct DIDEVICEOBJECTDATA {
    DWORD       dwOfs;
    DWORD       dwData;
    DWORD       dwTimeStamp;
    DWORD       dwSequence;
#if (DIRECTINPUT_VERSION >= 0x0800)
    UINT_PTR    uAppData;
#endif
} DIDEVICEOBJECTDATA;
typedef DIDEVICEOBJECTDATA          *LPDIDEVICEOBJECTDATA;
typedef const DIDEVICEOBJECTDATA    *LPCDIDEVICEOBJECTDATA;

/* DirectInput device instance for DirectX 3 compatibility */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIDEVICEINSTANCE_DX3A {
    DWORD   dwSize;
    GUID    guidInstance;
    GUID    guidProduct;
    DWORD   dwDevType;
    CHAR    tszInstanceName[MAX_PATH];
    CHAR    tszProductName[MAX_PATH];
} DIDEVICEINSTANCE_DX3A;
typedef DIDEVICEINSTANCE_DX3A       *LPDIDEVICEINSTANCE_DX3A;
typedef const DIDEVICEINSTANCE_DX3A *LPCDIDEVICEINSTANCE_DX3A;
typedef struct DIDEVICEINSTANCE_DX3W {
    DWORD   dwSize;
    GUID    guidInstance;
    GUID    guidProduct;
    DWORD   dwDevType;
    WCHAR   tszInstanceName[MAX_PATH];
    WCHAR   tszProductName[MAX_PATH];
} DIDEVICEINSTANCE_DX3W;
typedef DIDEVICEINSTANCE_DX3W       *LPDIDEVICEINSTANCE_DX3W;
typedef const DIDEVICEINSTANCE_DX3W *LPCDIDEVICEINSTANCE_DX3W;
#ifdef UNICODE
typedef DIDEVICEINSTANCE_DX3W       DIDEVICEINSTANCE_DX3;
typedef LPDIDEVICEINSTANCE_DX3W     LPDIDEVICEINSTANCE_DX3;
typedef LPCDIDEVICEINSTANCE_DX3W    LPCDIDEVICEINSTANCE_DX3;
#else
typedef DIDEVICEINSTANCE_DX3A       DIDEVICEINSTANCE_DX3;
typedef LPDIDEVICEINSTANCE_DX3A     LPDIDEVICEINSTANCE_DX3;
typedef LPCDIDEVICEINSTANCE_DX3A    LPCDIDEVICEINSTANCE_DX3;
#endif
#endif

/* DirectInput device instance */
typedef struct DIDEVICEINSTANCEA {
    DWORD   dwSize;
    GUID    guidInstance;
    GUID    guidProduct;
    DWORD   dwDevType;
    CHAR    tszInstanceName[MAX_PATH];
    CHAR    tszProductName[MAX_PATH];
#if (DIRECTINPUT_VERSION >= 0x0500)
    GUID    guidFFDriver;
    WORD    wUsagePage;
    WORD    wUsage;
#endif
} DIDEVICEINSTANCEA;
typedef DIDEVICEINSTANCEA       *LPDIDEVICEINSTANCEA;
typedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA;
typedef struct DIDEVICEINSTANCEW {
    DWORD   dwSize;
    GUID    guidInstance;
    GUID    guidProduct;
    DWORD   dwDevType;
    WCHAR   tszInstanceName[MAX_PATH];
    WCHAR   tszProductName[MAX_PATH];
#if (DIRECTINPUT_VERSION >= 0x0500)
    GUID    guidFFDriver;
    WORD    wUsagePage;
    WORD    wUsage;
#endif
} DIDEVICEINSTANCEW;
typedef DIDEVICEINSTANCEW       *LPDIDEVICEINSTANCEW;
typedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW;
#ifdef UNICODE
typedef DIDEVICEINSTANCEW       DIDEVICEINSTANCE;
typedef LPDIDEVICEINSTANCEW     LPDIDEVICEINSTANCE;
typedef LPCDIDEVICEINSTANCEW    LPCDIDEVICEINSTANCE;
#else
typedef DIDEVICEINSTANCEA       DIDEVICEINSTANCE;
typedef LPDIDEVICEINSTANCEA     LPDIDEVICEINSTANCE;
typedef LPCDIDEVICEINSTANCEA    LPCDIDEVICEINSTANCE;
#endif

/* DirectInput effect information */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef struct DIEFFECTINFOA {
    DWORD   dwSize;
    GUID    guid;
    DWORD   dwEffType;
    DWORD   dwStaticParams;
    DWORD   dwDynamicParams;
    CHAR    tszName[MAX_PATH];
} DIEFFECTINFOA;
typedef DIEFFECTINFOA       *LPDIEFFECTINFOA;
typedef const DIEFFECTINFOA *LPCDIEFFECTINFOA;
typedef struct DIEFFECTINFOW {
    DWORD   dwSize;
    GUID    guid;
    DWORD   dwEffType;
    DWORD   dwStaticParams;
    DWORD   dwDynamicParams;
    WCHAR   tszName[MAX_PATH];
} DIEFFECTINFOW;
typedef DIEFFECTINFOW       *LPDIEFFECTINFOW;
typedef const DIEFFECTINFOW *LPCDIEFFECTINFOW;
#ifdef UNICODE
typedef DIEFFECTINFOW       DIEFFECTINFO;
typedef LPDIEFFECTINFOW     LPDIEFFECTINFO;
typedef LPCDIEFFECTINFOW    LPCDIEFFECTINFO;
#else
typedef DIEFFECTINFOA       DIEFFECTINFO;
typedef LPDIEFFECTINFOA     LPDIEFFECTINFO;
typedef LPCDIEFFECTINFOA    LPCDIEFFECTINFO;
#endif
#endif

/* DirectInput effect enumeration callbacks */
#if (DIRECTINPUT_VERSION >= 0x0500)
typedef BOOL (PASCAL *LPDIENUMEFFECTSCALLBACKA)( LPCDIEFFECTINFOA, LPVOID );
typedef BOOL (PASCAL *LPDIENUMEFFECTSCALLBACKW)( LPCDIEFFECTINFOW, LPVOID );
typedef BOOL (PASCAL *LPDIENUMCREATEDEFFECTOBJECTSCALLBACK)( IDirectInputEffect *, LPVOID );
#ifdef UNICODE
    #define LPDIENUMEFFECTSCALLBACK LPDIENUMEFFECTSCALLBACKW
#else
    #define LPDIENUMEFFECTSCALLBACK LPDIENUMEFFECTSCALLBACKA
#endif
#endif

/* DirectInput mouse state */
typedef struct _DIMOUSESTATE {
    LONG    lX;
    LONG    lY;
    LONG    lZ;
    BYTE    rgbButtons[4];
} DIMOUSESTATE;
typedef DIMOUSESTATE    *LPDIMOUSESTATE;

/* DirectInput mouse state (version 2) */
#if (DIRECTINPUT_VERSION >= 0x0700)
typedef struct _DIMOUSESTATE2 {
    LONG    lX;
    LONG    lY;
    LONG    lZ;
    BYTE    rgbButtons[8];
} DIMOUSESTATE2;
typedef DIMOUSESTATE2   *LPDIMOUSESTATE2;
#endif

/* DirectInput mouse state field offsets */
#define DIMOFS_X            FIELD_OFFSET( DIMOUSESTATE, lX )
#define DIMOFS_Y            FIELD_OFFSET( DIMOUSESTATE, lY )
#define DIMOFS_Z            FIELD_OFFSET( DIMOUSESTATE, lZ )
#define DIMOFS_BUTTON0      (FIELD_OFFSET( DIMOUSESTATE, rgbButtons ) + 0)
#define DIMOFS_BUTTON1      (FIELD_OFFSET( DIMOUSESTATE, rgbButtons ) + 1)
#define DIMOFS_BUTTON2      (FIELD_OFFSET( DIMOUSESTATE, rgbButtons ) + 2)
#define DIMOFS_BUTTON3      (FIELD_OFFSET( DIMOUSESTATE, rgbButtons ) + 3)
#if (DIRECTINPUT_VERSION >= 0x0700)
    #define DIMOFS_BUTTON4  (FIELD_OFFSET( DIMOUSESTATE2, rgbButtons ) + 4)
    #define DIMOFS_BUTTON5  (FIELD_OFFSET( DIMOUSESTATE2, rgbButtons ) + 5)
    #define DIMOFS_BUTTON6  (FIELD_OFFSET( DIMOUSESTATE2, rgbButtons ) + 6)
    #define DIMOFS_BUTTON7  (FIELD_OFFSET( DIMOUSESTATE2, rgbButtons ) + 7)
#endif

/* DirectInput joystick state */
typedef struct DIJOYSTATE {
    LONG    lX;
    LONG    lY;
    LONG    lZ;
    LONG    lRx;
    LONG    lRy;
    LONG    lRz;
    LONG    rglSlider[2];
    DWORD   rgdwPOV[4];
    BYTE    rgbButtons[32];
} DIJOYSTATE;
typedef DIJOYSTATE  *LPDIJOYSTATE;

/* DirectInput joystick state (version 2) */
typedef struct DIJOYSTATE2 {
    LONG    lX;
    LONG    lY;
    LONG    lZ;
    LONG    lRx;
    LONG    lRy;
    LONG    lRz;
    LONG    rglSlider[2];
    DWORD   rgdwPOV[4];
    BYTE    rgbButtons[128];
    LONG    lVX;
    LONG    lVY;
    LONG    lVZ;
    LONG    lVRx;
    LONG    lVRy;
    LONG    lVRz;
    LONG    rglVSlider[2];
    LONG    lAX;
    LONG    lAY;
    LONG    lAZ;
    LONG    lARx;
    LONG    lARy;
    LONG    lARz;
    LONG    rglASlider[2];
    LONG    lFX;
    LONG    lFY;
    LONG    lFZ;
    LONG    lFRx;
    LONG    lFRy;
    LONG    lFRz;
    LONG    rglFSlider[2];
} DIJOYSTATE2;
typedef DIJOYSTATE2 *LPDIJOYSTATE2;

/* DirectInput joystick state field offsets */
#define DIJOFS_X            FIELD_OFFSET( DIJOYSTATE, lX )
#define DIJOFS_Y            FIELD_OFFSET( DIJOYSTATE, lY )
#define DIJOFS_Z            FIELD_OFFSET( DIJOYSTATE, lZ )
#define DIJOFS_RX           FIELD_OFFSET( DIJOYSTATE, lRx )
#define DIJOFS_RY           FIELD_OFFSET( DIJOYSTATE, lRy )
#define DIJOFS_RZ           FIELD_OFFSET( DIJOYSTATE, lRz )
#define DIJOFS_SLIDER( x )  (FIELD_OFFSET( DIJOYSTATE, rglSlider ) + (x) * sizeof( LONG ))
#define DIJOFS_POV( x )     (FIELD_OFFSET( DIJOYSTATE, rgdwPOV ) + (x) * sizeof( DWORD ))
#define DIJOFS_BUTTON( x )  (FIELD_OFFSET( DIJOYSTATE, rgbButtons ) + (x))
#define DIJOFS_BUTTON0      DIJOFS_BUTTON( 0 )
#define DIJOFS_BUTTON1      DIJOFS_BUTTON( 1 )
#define DIJOFS_BUTTON2      DIJOFS_BUTTON( 2 )
#define DIJOFS_BUTTON3      DIJOFS_BUTTON( 3 )
#define DIJOFS_BUTTON4      DIJOFS_BUTTON( 4 )
#define DIJOFS_BUTTON5      DIJOFS_BUTTON( 5 )
#define DIJOFS_BUTTON6      DIJOFS_BUTTON( 6 )
#define DIJOFS_BUTTON7      DIJOFS_BUTTON( 7 )
#define DIJOFS_BUTTON8      DIJOFS_BUTTON( 8 )
#define DIJOFS_BUTTON9      DIJOFS_BUTTON( 9 )
#define DIJOFS_BUTTON10     DIJOFS_BUTTON( 10 )
#define DIJOFS_BUTTON11     DIJOFS_BUTTON( 11 )
#define DIJOFS_BUTTON12     DIJOFS_BUTTON( 12 )
#define DIJOFS_BUTTON13     DIJOFS_BUTTON( 13 )
#define DIJOFS_BUTTON14     DIJOFS_BUTTON( 14 )
#define DIJOFS_BUTTON15     DIJOFS_BUTTON( 15 )
#define DIJOFS_BUTTON16     DIJOFS_BUTTON( 16 )
#define DIJOFS_BUTTON17     DIJOFS_BUTTON( 17 )
#define DIJOFS_BUTTON18     DIJOFS_BUTTON( 18 )
#define DIJOFS_BUTTON19     DIJOFS_BUTTON( 19 )
#define DIJOFS_BUTTON20     DIJOFS_BUTTON( 20 )
#define DIJOFS_BUTTON21     DIJOFS_BUTTON( 21 )
#define DIJOFS_BUTTON22     DIJOFS_BUTTON( 22 )
#define DIJOFS_BUTTON23     DIJOFS_BUTTON( 23 )
#define DIJOFS_BUTTON24     DIJOFS_BUTTON( 24 )
#define DIJOFS_BUTTON25     DIJOFS_BUTTON( 25 )
#define DIJOFS_BUTTON26     DIJOFS_BUTTON( 26 )
#define DIJOFS_BUTTON27     DIJOFS_BUTTON( 27 )
#define DIJOFS_BUTTON28     DIJOFS_BUTTON( 28 )
#define DIJOFS_BUTTON29     DIJOFS_BUTTON( 29 )
#define DIJOFS_BUTTON30     DIJOFS_BUTTON( 30 )
#define DIJOFS_BUTTON31     DIJOFS_BUTTON( 31 )

/* DirectInput device callbacks */
typedef BOOL (PASCAL *LPDIENUMDEVICESCALLBACKA)( LPCDIDEVICEINSTANCEA, LPVOID );
typedef BOOL (PASCAL *LPDIENUMDEVICESCALLBACKW)( LPCDIDEVICEINSTANCEW, LPVOID );
typedef BOOL (PASCAL *LPDICONFIGUREDEVICESCALLBACK)( IUnknown *, LPVOID );
typedef BOOL (PASCAL *LPDIENUMDEVICESBYSEMANTICSCBA)( LPCDIDEVICEINSTANCEA, IDirectInputDevice8A *, DWORD, DWORD, LPVOID );
typedef BOOL (PASCAL *LPDIENUMDEVICESBYSEMANTICSCBW)( LPCDIDEVICEINSTANCEW, IDirectInputDevice8W *, DWORD, DWORD, LPVOID );
#ifdef UNICODE
    #define LPDIENUMDEVICESCALLBACK         LPDIENUMDEVICESCALLBACKW
    #define LPDIENUMDEVICESBYSEMANTICSCB    LPDIENUMDEVICESBYSEMANTICSCBW
#else
    #define LPDIENUMDEVICESCALLBACK         LPDIENUMDEVICESCALLBACKA
    #define LPDIENUMDEVICESBYSEMANTICSCB    LPDIENUMDEVICESBYSEMANTICSCBA
#endif

/* GUIDs */
EXTERN_C const CLSID    CLSID_DirectInput;
EXTERN_C const CLSID    CLSID_DirectInputDevice;
EXTERN_C const CLSID    CLSID_DirectInput8;
EXTERN_C const CLSID    CLSID_DirectInputDevice8;
EXTERN_C const IID      IID_IDirectInputA;
EXTERN_C const IID      IID_IDirectInputW;
EXTERN_C const IID      IID_IDirectInput2A;
EXTERN_C const IID      IID_IDirectInput2W;
EXTERN_C const IID      IID_IDirectInput7A;
EXTERN_C const IID      IID_IDirectInput7W;
EXTERN_C const IID      IID_IDirectInput8A;
EXTERN_C const IID      IID_IDirectInput8W;
EXTERN_C const IID      IID_IDirectInputDeviceA;
EXTERN_C const IID      IID_IDirectInputDeviceW;
EXTERN_C const IID      IID_IDirectInputDevice2A;
EXTERN_C const IID      IID_IDirectInputDevice2W;
EXTERN_C const IID      IID_IDirectInputDevice7A;
EXTERN_C const IID      IID_IDirectInputDevice7W;
EXTERN_C const IID      IID_IDirectInputDevice8A;
EXTERN_C const IID      IID_IDirectInputDevice8W;
EXTERN_C const IID      IID_IDirectInputEffect;
EXTERN_C const GUID     GUID_XAxis;
EXTERN_C const GUID     GUID_YAxis;
EXTERN_C const GUID     GUID_ZAxis;
EXTERN_C const GUID     GUID_RxAxis;
EXTERN_C const GUID     GUID_RyAxis;
EXTERN_C const GUID     GUID_RzAxis;
EXTERN_C const GUID     GUID_Slider;
EXTERN_C const GUID     GUID_Button;
EXTERN_C const GUID     GUID_Key;
EXTERN_C const GUID     GUID_POV;
EXTERN_C const GUID     GUID_Unknown;
EXTERN_C const GUID     GUID_SysMouse;
EXTERN_C const GUID     GUID_SysKeyboard;
EXTERN_C const GUID     GUID_Joystick;
EXTERN_C const GUID     GUID_SysMouseEm;
EXTERN_C const GUID     GUID_SysMouseEm2;
EXTERN_C const GUID     GUID_SysKeyboardEm;
EXTERN_C const GUID     GUID_SysKeyboardEm2;
EXTERN_C const GUID     GUID_ConstantForce;
EXTERN_C const GUID     GUID_RampForce;
EXTERN_C const GUID     GUID_Square;
EXTERN_C const GUID     GUID_Sine;
EXTERN_C const GUID     GUID_Triangle;
EXTERN_C const GUID     GUID_SawtoothUp;
EXTERN_C const GUID     GUID_SawtoothDown;
EXTERN_C const GUID     GUID_Spring;
EXTERN_C const GUID     GUID_Damper;
EXTERN_C const GUID     GUID_Inertia;
EXTERN_C const GUID     GUID_Friction;
EXTERN_C const GUID     GUID_CustomForce;
#ifdef UNICODE
    #define IID_IDirectInputDevice  IID_IDirectInputDeviceW
    #define IID_IDirectInputDevice2 IID_IDirectInputDevice2W
    #define IID_IDirectInputDevice7 IID_IDirectInputDevice7W
    #define IID_IDirectInputDevice8 IID_IDirectInputDevice8W
    #define IID_IDirectInput        IID_IDirectInputW
    #define IID_IDirectInput2       IID_IDirectInput2W
    #define IID_IDirectInput7       IID_IDirectInput7W
    #define IID_IDirectInput8       IID_IDirectInput8W
#else
    #define IID_IDirectInputDevice  IID_IDirectInputDeviceA
    #define IID_IDirectInputDevice2 IID_IDirectInputDevice2A
    #define IID_IDirectInputDevice7 IID_IDirectInputDevice7A
    #define IID_IDirectInputDevice8 IID_IDirectInputDevice8A
    #define IID_IDirectInput        IID_IDirectInputA
    #define IID_IDirectInput2       IID_IDirectInput2A
    #define IID_IDirectInput7       IID_IDirectInput7A
    #define IID_IDirectInput8       IID_IDirectInput8A
#endif

/* IDirectInputEffect interface */
#if (DIRECTINPUT_VERSION >= 0x0500)
#undef INTERFACE
#define INTERFACE   IDirectInputEffect
DECLARE_INTERFACE_( IDirectInputEffect, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputEffect methods */
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;
    STDMETHOD( GetEffectGuid )( THIS_ LPGUID ) PURE;
    STDMETHOD( GetParameters )( THIS_ LPDIEFFECT, DWORD ) PURE;
    STDMETHOD( SetParameters )( THIS_ LPCDIEFFECT, DWORD ) PURE;
    STDMETHOD( Start )( THIS_ DWORD, DWORD ) PURE;
    STDMETHOD( Stop )( THIS ) PURE;
    STDMETHOD( GetEffectStatus )( THIS_ LPDWORD ) PURE;
    STDMETHOD( Download )( THIS ) PURE;
    STDMETHOD( Unload )( THIS ) PURE;
    STDMETHOD( Escape )( THIS_ LPDIEFFESCAPE ) PURE;
};
typedef IDirectInputEffect  *LPDIRECTINPUTEFFECT;
#endif

/* IDirectInputDevice interface */
#undef INTERFACE
#define INTERFACE   IDirectInputDeviceA
DECLARE_INTERFACE_( IDirectInputDeviceA, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputDeviceA methods */
    STDMETHOD( GetCapabilities )( THIS_ LPDIDEVCAPS ) PURE;
    STDMETHOD( EnumObjects )( THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetProperty )( THIS_ REFGUID, LPDIPROPHEADER ) PURE;
    STDMETHOD( SetProperty )( THIS_ REFGUID, LPCDIPROPHEADER ) PURE;
    STDMETHOD( Acquire )( THIS ) PURE;
    STDMETHOD( Unacquire )( THIS ) PURE;
    STDMETHOD( GetDeviceState )( THIS_ DWORD, LPVOID ) PURE;
    STDMETHOD( GetDeviceData )( THIS_ DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( SetDataFormat )( THIS_ LPCDIDATAFORMAT ) PURE;
    STDMETHOD( SetEventNotification )( THIS_ HANDLE ) PURE;
    STDMETHOD( SetCooperativeLevel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( GetObjectInfo )( THIS_ LPDIDEVICEOBJECTINSTANCEA, DWORD, DWORD ) PURE;
    STDMETHOD( GetDeviceInfo )( THIS_ LPDIDEVICEINSTANCEA ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;
};
typedef IDirectInputDeviceA         *LPDIRECTINPUTDEVICEA;
#undef INTERFACE
#define INTERFACE   IDirectInputDeviceW
DECLARE_INTERFACE_( IDirectInputDeviceW, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputDeviceW methods */
    STDMETHOD( GetCapabilities )( THIS_ LPDIDEVCAPS ) PURE;
    STDMETHOD( EnumObjects )( THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetProperty )( THIS_ REFGUID, LPDIPROPHEADER ) PURE;
    STDMETHOD( SetProperty )( THIS_ REFGUID, LPCDIPROPHEADER ) PURE;
    STDMETHOD( Acquire )( THIS ) PURE;
    STDMETHOD( Unacquire )( THIS ) PURE;
    STDMETHOD( GetDeviceState )( THIS_ DWORD, LPVOID ) PURE;
    STDMETHOD( GetDeviceData )( THIS_ DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( SetDataFormat )( THIS_ LPCDIDATAFORMAT ) PURE;
    STDMETHOD( SetEventNotification )( THIS_ HANDLE ) PURE;
    STDMETHOD( SetCooperativeLevel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( GetObjectInfo )( THIS_ LPDIDEVICEOBJECTINSTANCEW, DWORD, DWORD ) PURE;
    STDMETHOD( GetDeviceInfo )( THIS_ LPDIDEVICEINSTANCEW ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;
};
typedef IDirectInputDeviceW         *LPDIRECTINPUTDEVICEW;
#ifdef UNICODE
    #define IDirectInputDevice      IDirectInputDeviceW
    #define IDirectInputDeviceVtbl  IDirectInputDeviceWVtbl
#else
    #define IDirectInputDevice      IDirectInputDeviceA
    #define IDirectInputDeviceVtbl  IDirectInputDeviceAVtbl
#endif
typedef IDirectInputDevice          *LPDIRECTINPUTDEVICE;

/* IDirectInputDevice2 interface */
#if (DIRECTINPUT_VERSION >= 0x0500)
#undef INTERFACE
#define INTERFACE   IDirectInputDevice2A
DECLARE_INTERFACE_( IDirectInputDevice2A, IDirectInputDeviceA ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputDeviceA methods */
    STDMETHOD( GetCapabilities )( THIS_ LPDIDEVCAPS ) PURE;
    STDMETHOD( EnumObjects )( THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetProperty )( THIS_ REFGUID, LPDIPROPHEADER ) PURE;
    STDMETHOD( SetProperty )( THIS_ REFGUID, LPCDIPROPHEADER ) PURE;
    STDMETHOD( Acquire )( THIS ) PURE;
    STDMETHOD( Unacquire )( THIS ) PURE;
    STDMETHOD( GetDeviceState )( THIS_ DWORD, LPVOID ) PURE;
    STDMETHOD( GetDeviceData )( THIS_ DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( SetDataFormat )( THIS_ LPCDIDATAFORMAT ) PURE;
    STDMETHOD( SetEventNotification )( THIS_ HANDLE ) PURE;
    STDMETHOD( SetCooperativeLevel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( GetObjectInfo )( THIS_ LPDIDEVICEOBJECTINSTANCEA, DWORD, DWORD ) PURE;
    STDMETHOD( GetDeviceInfo )( THIS_ LPDIDEVICEINSTANCEA ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;

    /* IDirectInputDevice2A methods */
    STDMETHOD( CreateEffect )( THIS_ REFGUID, LPCDIEFFECT, LPDIRECTINPUTEFFECT *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumEffects )( THIS_ LPDIENUMEFFECTSCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetEffectInfo )( THIS_ LPDIEFFECTINFOA, REFGUID ) PURE;
    STDMETHOD( GetForceFeedbackState )( THIS_ LPDWORD ) PURE;
    STDMETHOD( SendForceFeedbackCommand )( THIS_ DWORD ) PURE;
    STDMETHOD( EnumCreatedEffectObjects )( THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( Escape )( THIS_ LPDIEFFESCAPE ) PURE;
    STDMETHOD( Poll )( THIS ) PURE;
    STDMETHOD( SendDeviceData )( THIS_ DWORD, LPCDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
};
typedef IDirectInputDevice2A        *LPDIRECTINPUTDEVICE2A;
#undef INTERFACE
#define INTERFACE   IDirectInputDevice2W
DECLARE_INTERFACE_( IDirectInputDevice2W, IDirectInputDeviceW ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputDeviceW methods */
    STDMETHOD( GetCapabilities )( THIS_ LPDIDEVCAPS ) PURE;
    STDMETHOD( EnumObjects )( THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetProperty )( THIS_ REFGUID, LPDIPROPHEADER ) PURE;
    STDMETHOD( SetProperty )( THIS_ REFGUID, LPCDIPROPHEADER ) PURE;
    STDMETHOD( Acquire )( THIS ) PURE;
    STDMETHOD( Unacquire )( THIS ) PURE;
    STDMETHOD( GetDeviceState )( THIS_ DWORD, LPVOID ) PURE;
    STDMETHOD( GetDeviceData )( THIS_ DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( SetDataFormat )( THIS_ LPCDIDATAFORMAT ) PURE;
    STDMETHOD( SetEventNotification )( THIS_ HANDLE ) PURE;
    STDMETHOD( SetCooperativeLevel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( GetObjectInfo )( THIS_ LPDIDEVICEOBJECTINSTANCEW, DWORD, DWORD ) PURE;
    STDMETHOD( GetDeviceInfo )( THIS_ LPDIDEVICEINSTANCEW ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;

    /* IDirectInputDevice2W methods */
    STDMETHOD( CreateEffect )( THIS_ REFGUID, LPCDIEFFECT, LPDIRECTINPUTEFFECT *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumEffects )( THIS_ LPDIENUMEFFECTSCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetEffectInfo )( THIS_ LPDIEFFECTINFOW, REFGUID ) PURE;
    STDMETHOD( GetForceFeedbackState )( THIS_ LPDWORD ) PURE;
    STDMETHOD( SendForceFeedbackCommand )( THIS_ DWORD ) PURE;
    STDMETHOD( EnumCreatedEffectObjects )( THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( Escape )( THIS_ LPDIEFFESCAPE ) PURE;
    STDMETHOD( Poll )( THIS ) PURE;
    STDMETHOD( SendDeviceData )( THIS_ DWORD, LPCDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
};
typedef IDirectInputDevice2W        *LPDIRECTINPUTDEVICE2W;
#ifdef UNICODE
    #define IDirectInputDevice2     IDirectInputDevice2W
    #define IDirectInputDevice2Vtbl IDirectInputDevice2WVtbl
#else
    #define IDirectInputDevice2     IDirectInputDevice2A
    #define IDirectInputDevice2Vtbl IDirectInputDevice2AVtbl
#endif
typedef IDirectInputDevice2         *LPDIRECTINPUTDEVICE2;
#endif

/* IDirectInputDevice7 interface */
#if (DIRECTINPUT_VERSION >= 0x0700)
#undef INTERFACE
#define INTERFACE   IDirectInputDevice7A
DECLARE_INTERFACE_( IDirectInputDevice7A, IDirectInputDevice2A ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputDeviceA methods */
    STDMETHOD( GetCapabilities )( THIS_ LPDIDEVCAPS ) PURE;
    STDMETHOD( EnumObjects )( THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetProperty )( THIS_ REFGUID, LPDIPROPHEADER ) PURE;
    STDMETHOD( SetProperty )( THIS_ REFGUID, LPCDIPROPHEADER ) PURE;
    STDMETHOD( Acquire )( THIS ) PURE;
    STDMETHOD( Unacquire )( THIS ) PURE;
    STDMETHOD( GetDeviceState )( THIS_ DWORD, LPVOID ) PURE;
    STDMETHOD( GetDeviceData )( THIS_ DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( SetDataFormat )( THIS_ LPCDIDATAFORMAT ) PURE;
    STDMETHOD( SetEventNotification )( THIS_ HANDLE ) PURE;
    STDMETHOD( SetCooperativeLevel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( GetObjectInfo )( THIS_ LPDIDEVICEOBJECTINSTANCEA, DWORD, DWORD ) PURE;
    STDMETHOD( GetDeviceInfo )( THIS_ LPDIDEVICEINSTANCEA ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;

    /* IDirectInputDevice2A methods */
    STDMETHOD( CreateEffect )( THIS_ REFGUID, LPCDIEFFECT, LPDIRECTINPUTEFFECT *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumEffects )( THIS_ LPDIENUMEFFECTSCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetEffectInfo )( THIS_ LPDIEFFECTINFOA, REFGUID ) PURE;
    STDMETHOD( GetForceFeedbackState )( THIS_ LPDWORD ) PURE;
    STDMETHOD( SendForceFeedbackCommand )( THIS_ DWORD ) PURE;
    STDMETHOD( EnumCreatedEffectObjects )( THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( Escape )( THIS_ LPDIEFFESCAPE ) PURE;
    STDMETHOD( Poll )( THIS ) PURE;
    STDMETHOD( SendDeviceData )( THIS_ DWORD, LPCDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;

    /* IDirectInputDevice7A methods */
    STDMETHOD( EnumEffectsInFile )( THIS_ LPCSTR, LPDIENUMEFFECTSINFILECALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( WriteEffectToFile )( THIS_ LPCSTR, DWORD, LPDIFILEEFFECT, DWORD ) PURE;
};
typedef IDirectInputDevice7A        *LPDIRECTINPUTDEVICE7A;
#undef INTERFACE
#define INTERFACE   IDirectInputDevice7W
DECLARE_INTERFACE_( IDirectInputDevice7W, IDirectInputDevice2W ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputDeviceW methods */
    STDMETHOD( GetCapabilities )( THIS_ LPDIDEVCAPS ) PURE;
    STDMETHOD( EnumObjects )( THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetProperty )( THIS_ REFGUID, LPDIPROPHEADER ) PURE;
    STDMETHOD( SetProperty )( THIS_ REFGUID, LPCDIPROPHEADER ) PURE;
    STDMETHOD( Acquire )( THIS ) PURE;
    STDMETHOD( Unacquire )( THIS ) PURE;
    STDMETHOD( GetDeviceState )( THIS_ DWORD, LPVOID ) PURE;
    STDMETHOD( GetDeviceData )( THIS_ DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( SetDataFormat )( THIS_ LPCDIDATAFORMAT ) PURE;
    STDMETHOD( SetEventNotification )( THIS_ HANDLE ) PURE;
    STDMETHOD( SetCooperativeLevel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( GetObjectInfo )( THIS_ LPDIDEVICEOBJECTINSTANCEW, DWORD, DWORD ) PURE;
    STDMETHOD( GetDeviceInfo )( THIS_ LPDIDEVICEINSTANCEW ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;

    /* IDirectInputDevice2W methods */
    STDMETHOD( CreateEffect )( THIS_ REFGUID, LPCDIEFFECT, LPDIRECTINPUTEFFECT *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumEffects )( THIS_ LPDIENUMEFFECTSCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetEffectInfo )( THIS_ LPDIEFFECTINFOW, REFGUID ) PURE;
    STDMETHOD( GetForceFeedbackState )( THIS_ LPDWORD ) PURE;
    STDMETHOD( SendForceFeedbackCommand )( THIS_ DWORD ) PURE;
    STDMETHOD( EnumCreatedEffectObjects )( THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( Escape )( THIS_ LPDIEFFESCAPE ) PURE;
    STDMETHOD( Poll )( THIS ) PURE;
    STDMETHOD( SendDeviceData )( THIS_ DWORD, LPCDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;

    /* IDirectInputDevice7W methods */
    STDMETHOD( EnumEffectsInFile )( THIS_ LPCWSTR, LPDIENUMEFFECTSINFILECALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( WriteEffectToFile )( THIS_ LPCWSTR, DWORD, LPDIFILEEFFECT, DWORD ) PURE;
};
typedef IDirectInputDevice7W        *LPDIRECTINPUTDEVICE7W;
#ifdef UNICODE
    #define IDirectInputDevice7     IDirectInputDevice7W
    #define IDirectInputDevice7Vtbl IDirectInputDevice7WVtbl
#else
    #define IDirectInputDevice7     IDirectInputDevice7A
    #define IDirectInputDevice7Vtbl IDirectInputDevice7AVtbl
#endif
typedef IDirectInputDevice7         *LPDIRECTINPUTDEVICE7;
#endif

/* IDirectInputDevice8 interface */
#if (DIRECTINPUT_VERSION >= 0x0800)
#undef INTERFACE
#define INTERFACE   IDirectInputDevice8A
DECLARE_INTERFACE_( IDirectInputDevice8A, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputDevice8A methods */
    STDMETHOD( GetCapabilities )( THIS_ LPDIDEVCAPS ) PURE;
    STDMETHOD( EnumObjects )( THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetProperty )( THIS_ REFGUID, LPDIPROPHEADER ) PURE;
    STDMETHOD( SetProperty )( THIS_ REFGUID, LPCDIPROPHEADER ) PURE;
    STDMETHOD( Acquire )( THIS ) PURE;
    STDMETHOD( Unacquire )( THIS ) PURE;
    STDMETHOD( GetDeviceState )( THIS_ DWORD, LPVOID ) PURE;
    STDMETHOD( GetDeviceData )( THIS_ DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( SetDataFormat )( THIS_ LPCDIDATAFORMAT ) PURE;
    STDMETHOD( SetEventNotification )( THIS_ HANDLE ) PURE;
    STDMETHOD( SetCooperativeLevel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( GetObjectInfo )( THIS_ LPDIDEVICEOBJECTINSTANCEA, DWORD, DWORD ) PURE;
    STDMETHOD( GetDeviceInfo )( THIS_ LPDIDEVICEINSTANCEA ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;
    STDMETHOD( CreateEffect )( THIS_ REFGUID, LPCDIEFFECT, LPDIRECTINPUTEFFECT *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumEffects )( THIS_ LPDIENUMEFFECTSCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetEffectInfo )( THIS_ LPDIEFFECTINFOA, REFGUID ) PURE;
    STDMETHOD( GetForceFeedbackState )( THIS_ LPDWORD ) PURE;
    STDMETHOD( SendForceFeedbackCommand )( THIS_ DWORD ) PURE;
    STDMETHOD( EnumCreatedEffectObjects )( THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( Escape )( THIS_ LPDIEFFESCAPE ) PURE;
    STDMETHOD( Poll )( THIS ) PURE;
    STDMETHOD( SendDeviceData )( THIS_ DWORD, LPCDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( EnumEffectsInFile )( THIS_ LPCSTR, LPDIENUMEFFECTSINFILECALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( WriteEffectToFile )( THIS_ LPCSTR, DWORD, LPDIFILEEFFECT, DWORD ) PURE;
    STDMETHOD( BuildActionMap )( THIS_ LPDIACTIONFORMATA, LPCSTR, DWORD ) PURE;
    STDMETHOD( SetActionMap )( THIS_ LPDIACTIONFORMATA, LPCSTR, DWORD ) PURE;
    STDMETHOD( GetImageInfo )( THIS_ LPDIDEVICEIMAGEINFOHEADERA ) PURE;
};
typedef IDirectInputDevice8A        *LPDIRECTINPUTDEVICE8A;
#undef INTERFACE
#define INTERFACE   IDirectInputDevice8W
DECLARE_INTERFACE_( IDirectInputDevice8W, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputDevice8W methods */
    STDMETHOD( GetCapabilities )( THIS_ LPDIDEVCAPS ) PURE;
    STDMETHOD( EnumObjects )( THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetProperty )( THIS_ REFGUID, LPDIPROPHEADER ) PURE;
    STDMETHOD( SetProperty )( THIS_ REFGUID, LPCDIPROPHEADER ) PURE;
    STDMETHOD( Acquire )( THIS ) PURE;
    STDMETHOD( Unacquire )( THIS ) PURE;
    STDMETHOD( GetDeviceState )( THIS_ DWORD, LPVOID ) PURE;
    STDMETHOD( GetDeviceData )( THIS_ DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( SetDataFormat )( THIS_ LPCDIDATAFORMAT ) PURE;
    STDMETHOD( SetEventNotification )( THIS_ HANDLE ) PURE;
    STDMETHOD( SetCooperativeLevel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( GetObjectInfo )( THIS_ LPDIDEVICEOBJECTINSTANCEW, DWORD, DWORD ) PURE;
    STDMETHOD( GetDeviceInfo )( THIS_ LPDIDEVICEINSTANCEW ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD, REFGUID ) PURE;
    STDMETHOD( CreateEffect )( THIS_ REFGUID, LPCDIEFFECT, LPDIRECTINPUTEFFECT *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumEffects )( THIS_ LPDIENUMEFFECTSCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetEffectInfo )( THIS_ LPDIEFFECTINFOW, REFGUID ) PURE;
    STDMETHOD( GetForceFeedbackState )( THIS_ LPDWORD ) PURE;
    STDMETHOD( SendForceFeedbackCommand )( THIS_ DWORD ) PURE;
    STDMETHOD( EnumCreatedEffectObjects )( THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( Escape )( THIS_ LPDIEFFESCAPE ) PURE;
    STDMETHOD( Poll )( THIS ) PURE;
    STDMETHOD( SendDeviceData )( THIS_ DWORD, LPCDIDEVICEOBJECTDATA, LPDWORD, DWORD ) PURE;
    STDMETHOD( EnumEffectsInFile )( THIS_ LPCWSTR, LPDIENUMEFFECTSINFILECALLBACK, LPVOID, DWORD ) PURE;
    STDMETHOD( WriteEffectToFile )( THIS_ LPCWSTR, DWORD, LPDIFILEEFFECT, DWORD ) PURE;
    STDMETHOD( BuildActionMap )( THIS_ LPDIACTIONFORMATW, LPCWSTR, DWORD ) PURE;
    STDMETHOD( SetActionMap )( THIS_ LPDIACTIONFORMATW, LPCWSTR, DWORD ) PURE;
    STDMETHOD( GetImageInfo )( THIS_ LPDIDEVICEIMAGEINFOHEADERW ) PURE;
};
typedef IDirectInputDevice8W        *LPDIRECTINPUTDEVICE8W;
#ifdef UNICODE
    #define IDirectInputDevice8     IDirectInputDevice8W
    #define IDirectInputDevice8Vtbl IDirectInputDevice8WVtbl
#else
    #define IDirectInputDevice8     IDirectInputDevice8A
    #define IDirectInputDevice8Vtbl IDirectInputDevice8AVtbl
#endif
typedef IDirectInputDevice8         *LPDIRECTINPUTDEVICE8;
#endif

/* IDirectInput interface */
#undef INTERFACE
#define INTERFACE   IDirectInputA
DECLARE_INTERFACE_( IDirectInputA, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputW methods */
    STDMETHOD( CreateDevice )( THIS_ REFGUID, LPDIRECTINPUTDEVICEA *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumDevices )( THIS_ DWORD, LPDIENUMDEVICESCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetDeviceStatus )( THIS_ REFGUID ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD ) PURE;
};
typedef IDirectInputA           *LPDIRECTINPUTA;
#undef INTERFACE
#define INTERFACE   IDirectInputW
DECLARE_INTERFACE_( IDirectInputW, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputW methods */
    STDMETHOD( CreateDevice )( THIS_ REFGUID, LPDIRECTINPUTDEVICEW *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumDevices )( THIS_ DWORD, LPDIENUMDEVICESCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetDeviceStatus )( THIS_ REFGUID ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD ) PURE;
};
typedef IDirectInputW           *LPDIRECTINPUTW;
#ifdef UNICODE
    #define IDirectInput        IDirectInputW
    #define IDirectInputVtbl    IDirectInputWVtbl
#else
    #define IDirectInput        IDirectInputA
    #define IDirectInputVtbl    IDirectInputAVtbl
#endif

/* IDirectInput2 interface */
#undef INTERFACE
#define INTERFACE   IDirectInput2A
DECLARE_INTERFACE_( IDirectInput2A, IDirectInputA ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputA methods */
    STDMETHOD( CreateDevice )( THIS_ REFGUID, LPDIRECTINPUTDEVICEA *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumDevices )( THIS_ DWORD, LPDIENUMDEVICESCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetDeviceStatus )( THIS_ REFGUID ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD ) PURE;

    /* IDirectInput2A methods */
    STDMETHOD( FindDevice )( THIS_ REFGUID, LPCSTR, LPGUID ) PURE;
};
typedef IDirectInput2A          *LPDIRECTINPUT2A;
#undef INTERFACE
#define INTERFACE   IDirectInput2W
DECLARE_INTERFACE_( IDirectInput2W, IDirectInputW ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputW methods */
    STDMETHOD( CreateDevice )( THIS_ REFGUID, LPDIRECTINPUTDEVICEW *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumDevices )( THIS_ DWORD, LPDIENUMDEVICESCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetDeviceStatus )( THIS_ REFGUID ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD ) PURE;

    /* IDirectInput2W methods */
    STDMETHOD( FindDevice )( THIS_ REFGUID, LPCWSTR, LPGUID ) PURE;
};
typedef IDirectInput2W          *LPDIRECTINPUT2W;
#ifdef UNICODE
    #define IDirectInput2       IDirectInput2W
    #define IDirectInput2Vtbl   IDirectInput2WVtbl
#else
    #define IDirectInput2       IDirectInput2A
    #define IDirectInput2Vtbl   IDirectInput2AVtbl
#endif
typedef IDirectInput2           *LPDIRECTINPUT2;

/* IDirectInput7 interface */
#undef INTERFACE
#define INTERFACE   IDirectInput7A
DECLARE_INTERFACE_( IDirectInput7A, IDirectInput2A ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputA methods */
    STDMETHOD( CreateDevice )( THIS_ REFGUID, LPDIRECTINPUTDEVICEA *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumDevices )( THIS_ DWORD, LPDIENUMDEVICESCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetDeviceStatus )( THIS_ REFGUID ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD ) PURE;

    /* IDirectInput2A methods */
    STDMETHOD( FindDevice )( THIS_ REFGUID, LPCSTR, LPGUID ) PURE;

    /* IDirectInput7A methods */
    STDMETHOD( CreateDeviceEx )( THIS_ REFGUID, REFIID, LPVOID *, LPUNKNOWN ) PURE;
};
typedef IDirectInput7A          *LPDIRECTINPUT7A;
#undef INTERFACE
#define INTERFACE   IDirectInput7W
DECLARE_INTERFACE_( IDirectInput7W, IDirectInput2W ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInputW methods */
    STDMETHOD( CreateDevice )( THIS_ REFGUID, LPDIRECTINPUTDEVICEW *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumDevices )( THIS_ DWORD, LPDIENUMDEVICESCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetDeviceStatus )( THIS_ REFGUID ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD ) PURE;

    /* IDirectInput2W methods */
    STDMETHOD( FindDevice )( THIS_ REFGUID, LPCWSTR, LPGUID ) PURE;

    /* IDirectInput7W methods */
    STDMETHOD( CreateDeviceEx )( THIS_ REFGUID, REFIID, LPVOID *, LPUNKNOWN ) PURE;
};
typedef IDirectInput7W          *LPDIRECTINPUT7W;
#ifdef UNICODE
    #define IDirectInput7       IDirectInput7W
    #define IDirectInput7Vtbl   IDirectInput7WVtbl
#else
    #define IDirectInput7       IDirectInput7A
    #define IDirectInput7Vtbl   IDirectInput7AVtbl
#endif
typedef IDirectInput7           *LPDIRECTINPUT7;

/* IDirectInput8 interface */
#if (DIRECTINPUT_VERSION >= 0x0800)
#undef INTERFACE
#define INTERFACE   IDirectInput8A
DECLARE_INTERFACE_( IDirectInput8A, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInput8A methods */
    STDMETHOD( CreateDevice )( THIS_ REFGUID, LPDIRECTINPUTDEVICE8A *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumDevices )( THIS_ DWORD, LPDIENUMDEVICESCALLBACKA, LPVOID, DWORD ) PURE;
    STDMETHOD( GetDeviceStatus )( THIS_ REFGUID ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD ) PURE;
    STDMETHOD( FindDevice )( THIS_ REFGUID, LPCSTR, LPGUID ) PURE;
    STDMETHOD( EnumDevicesBySemantics )( THIS_ LPCSTR, LPDIACTIONFORMATA, LPDIENUMDEVICESBYSEMANTICSCBA, LPVOID, DWORD ) PURE;
    STDMETHOD( ConfigureDevices )( THIS_ LPDICONFIGUREDEVICESCALLBACK, LPDICONFIGUREDEVICESPARAMSA, DWORD, LPVOID ) PURE;
};
typedef IDirectInput8A          *LPDIRECTINPUT8A;
#undef INTERFACE
#define INTERFACE   IDirectInput8W
DECLARE_INTERFACE_( IDirectInput8W, IUnknown ) {
    /* IUnknown methods */
    STDMETHOD( QueryInterface )( THIS_ REFIID, void ** ) PURE;
    STDMETHOD_( ULONG, AddRef )( THIS ) PURE;
    STDMETHOD_( ULONG, Release )( THIS ) PURE;

    /* IDirectInput8W methods */
    STDMETHOD( CreateDevice )( THIS_ REFGUID, LPDIRECTINPUTDEVICE8W *, LPUNKNOWN ) PURE;
    STDMETHOD( EnumDevices )( THIS_ DWORD, LPDIENUMDEVICESCALLBACKW, LPVOID, DWORD ) PURE;
    STDMETHOD( GetDeviceStatus )( THIS_ REFGUID ) PURE;
    STDMETHOD( RunControlPanel )( THIS_ HWND, DWORD ) PURE;
    STDMETHOD( Initialize )( THIS_ HINSTANCE, DWORD ) PURE;
    STDMETHOD( FindDevice )( THIS_ REFGUID, LPCWSTR, LPGUID ) PURE;
    STDMETHOD( EnumDevicesBySemantics )( THIS_ LPCWSTR, LPDIACTIONFORMATW, LPDIENUMDEVICESBYSEMANTICSCBW, LPVOID, DWORD ) PURE;
    STDMETHOD( ConfigureDevices )( THIS_ LPDICONFIGUREDEVICESCALLBACK, LPDICONFIGUREDEVICESPARAMSW, DWORD, LPVOID ) PURE;
};
typedef IDirectInput8W          *LPDIRECTINPUT8W;
#ifdef UNICODE
    #define IDirectInput8       IDirectInput8W
    #define IDirectInput8Vtbl   IDirectInput8WVtbl
#else
    #define IDirectInput8       IDirectInput8A
    #define IDirectInput8Vtbl   IDirectInput8AVtbl
#endif
typedef IDirectInput8           *LPDIRECTINPUT8;
#endif

/* C/C++ object macros */
#if !defined( __cplusplus ) || defined( CINTERFACE )
    #if (DIRECTINPUT_VERSION >= 0x0500)
        #define IDirectInputEffect_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IDirectInputEffect_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IDirectInputEffect_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IDirectInputEffect_Initialize( x, p1, p2, p3 ) \
            (x)->lpVtbl->Initialize( x, p1, p2, p3 )
        #define IDirectInputEffect_GetEffectGuid( x, p ) \
            (x)->lpVtbl->GetEffectGuid( x, p )
        #define IDirectInputEffect_GetParameters( x, p1, p2 ) \
            (x)->lpVtbl->GetParameters( x, p1, p2 )
        #define IDirectInputEffect_SetParameters( x, p1, p2 ) \
            (x)->lpVtbl->SetParameters( x, p1, p2 )
        #define IDirectInputEffect_Start( x, p1, p2 ) \
            (x)->lpVtbl->Start( x, p1, p2 )
        #define IDirectInputEffect_Stop( x ) \
            (x)->lpVtbl->Stop( x )
        #define IDirectInputEffect_GetEffectStatus( x, p ) \
            (x)->lpVtbl->GetEffectStatus( x, p )
        #define IDirectInputEffect_Download( x ) \
            (x)->lpVtbl->Download( x )
        #define IDirectInputEffect_Unload( x ) \
            (x)->lpVtbl->Unload( x )
        #define IDirectInputEffect_Escape( x, p ) \
            (x)->lpVtbl->Escape( x, p )
    #endif
    #define IDirectInputDevice_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IDirectInputDevice_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IDirectInputDevice_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IDirectInputDevice_GetCapabilities( x, p ) \
        (x)->lpVtbl->GetCapabilities( x, p )
    #define IDirectInputDevice_EnumObjects( x, p1, p2, p3 ) \
        (x)->lpVtbl->EnumObjects( x, p1, p2, p3 )
    #define IDirectInputDevice_GetProperty( x, p1, p2 ) \
        (x)->lpVtbl->GetProperty( x, p1, p2 )
    #define IDirectInputDevice_SetProperty( x, p1, p2 ) \
        (x)->lpVtbl->SetProperty( x, p1, p2 )
    #define IDirectInputDevice_Acquire( x ) \
        (x)->lpVtbl->Acquire( x )
    #define IDirectInputDevice_Unacquire( x ) \
        (x)->lpVtbl->Unacquire( x )
    #define IDirectInputDevice_GetDeviceState( x, p1, p2 ) \
        (x)->lpVtbl->GetDeviceState( x, p1, p2 )
    #define IDirectInputDevice_GetDeviceData( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->GetDeviceData( x, p1, p2, p3, p4 )
    #define IDirectInputDevice_SetDataFormat( x, p ) \
        (x)->lpVtbl->SetDataFormat( x, p )
    #define IDirectInputDevice_SetEventNotification( x, p ) \
        (x)->lpVtbl->SetEventNotification( x, p )
    #define IDirectInputDevice_SetCooperativeLevel( x, p1, p2 ) \
        (x)->lpVtbl->SetCooperativeLevel( x, p1, p2 )
    #define IDirectInputDevice_GetObjectInfo( x, p1, p2, p3 ) \
        (x)->lpVtbl->GetObjectInfo( x, p1, p2, p3 )
    #define IDirectInputDevice_GetDeviceInfo( x, p ) \
        (x)->lpVtbl->GetDeviceInfo( x, p )
    #define IDirectInputDevice_RunControlPanel( x, p1, p2 ) \
        (x)->lpVtbl->RunControlPanel( x, p1, p2 )
    #define IDirectInputDevice_Initialize( x, p1, p2, p3 ) \
        (x)->lpVtbl->Initialize( x, p1, p2, p3 )
    #if (DIRECTINPUT_VERSION >= 0x0500)
        #define IDirectInputDevice2_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IDirectInputDevice2_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IDirectInputDevice2_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IDirectInputDevice2_GetCapabilities( x, p ) \
            (x)->lpVtbl->GetCapabilities( x, p )
        #define IDirectInputDevice2_EnumObjects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumObjects( x, p1, p2, p3 )
        #define IDirectInputDevice2_GetProperty( x, p1, p2 ) \
            (x)->lpVtbl->GetProperty( x, p1, p2 )
        #define IDirectInputDevice2_SetProperty( x, p1, p2 ) \
            (x)->lpVtbl->SetProperty( x, p1, p2 )
        #define IDirectInputDevice2_Acquire( x ) \
            (x)->lpVtbl->Acquire( x )
        #define IDirectInputDevice2_Unacquire( x ) \
            (x)->lpVtbl->Unacquire( x )
        #define IDirectInputDevice2_GetDeviceState( x, p1, p2 ) \
            (x)->lpVtbl->GetDeviceState( x, p1, p2 )
        #define IDirectInputDevice2_GetDeviceData( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->GetDeviceData( x, p1, p2, p3, p4 )
        #define IDirectInputDevice2_SetDataFormat( x, p ) \
            (x)->lpVtbl->SetDataFormat( x, p )
        #define IDirectInputDevice2_SetEventNotification( x, p ) \
            (x)->lpVtbl->SetEventNotification( x, p )
        #define IDirectInputDevice2_SetCooperativeLevel( x, p1, p2 ) \
            (x)->lpVtbl->SetCooperativeLevel( x, p1, p2 )
        #define IDirectInputDevice2_GetObjectInfo( x, p1, p2, p3 ) \
            (x)->lpVtbl->GetObjectInfo( x, p1, p2, p3 )
        #define IDirectInputDevice2_GetDeviceInfo( x, p ) \
            (x)->lpVtbl->GetDeviceInfo( x, p )
        #define IDirectInputDevice2_RunControlPanel( x, p1, p2 ) \
            (x)->lpVtbl->RunControlPanel( x, p1, p2 )
        #define IDirectInputDevice2_Initialize( x, p1, p2, p3 ) \
            (x)->lpVtbl->Initialize( x, p1, p2, p3 )
        #define IDirectInputDevice2_CreateEffect( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->CreateEffect( x, p1, p2, p3, p4 )
        #define IDirectInputDevice2_EnumEffects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumEffects( x, p1, p2, p3 )
        #define IDirectInputDevice2_GetEffectInfo( x, p1, p2 ) \
            (x)->lpVtbl->GetEffectInfo( x, p1, p2 )
        #define IDirectInputDevice2_GetForceFeedbackState( x, p ) \
            (x)->lpVtbl->GetForceFeedbackState( x, p )
        #define IDirectInputDevice2_SendForceFeedbackCommand( x, p ) \
            (x)->lpVtbl->SendForceFeedbackCommand( x, p )
        #define IDirectInputDevice2_EnumCreatedEffectObjects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumCreatedEffectObjects( x, p1, p2, p3 )
        #define IDirectInputDevice2_Escape( x, p ) \
            (x)->lpVtbl->Escape( x, p )
        #define IDirectInputDevice2_Poll( x ) \
            (x)->lpVtbl->Poll( x )
        #define IDirectInputDevice2_SendDeviceData( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->SendDeviceData( x, p1, p2, p3, p4 )
    #endif
    #if (DIRECTINPUT_VERSION >= 0x0700)
        #define IDirectInputDevice7_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IDirectInputDevice7_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IDirectInputDevice7_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IDirectInputDevice7_GetCapabilities( x, p ) \
            (x)->lpVtbl->GetCapabilities( x, p )
        #define IDirectInputDevice7_EnumObjects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumObjects( x, p1, p2, p3 )
        #define IDirectInputDevice7_GetProperty( x, p1, p2 ) \
            (x)->lpVtbl->GetProperty( x, p1, p2 )
        #define IDirectInputDevice7_SetProperty( x, p1, p2 ) \
            (x)->lpVtbl->SetProperty( x, p1, p2 )
        #define IDirectInputDevice7_Acquire( x ) \
            (x)->lpVtbl->Acquire( x )
        #define IDirectInputDevice7_Unacquire( x ) \
            (x)->lpVtbl->Unacquire( x )
        #define IDirectInputDevice7_GetDeviceState( x, p1, p2 ) \
            (x)->lpVtbl->GetDeviceState( x, p1, p2 )
        #define IDirectInputDevice7_GetDeviceData( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->GetDeviceData( x, p1, p2, p3, p4 )
        #define IDirectInputDevice7_SetDataFormat( x, p ) \
            (x)->lpVtbl->SetDataFormat( x, p )
        #define IDirectInputDevice7_SetEventNotification( x, p ) \
            (x)->lpVtbl->SetEventNotification( x, p )
        #define IDirectInputDevice7_SetCooperativeLevel( x, p1, p2 ) \
            (x)->lpVtbl->SetCooperativeLevel( x, p1, p2 )
        #define IDirectInputDevice7_GetObjectInfo( x, p1, p2, p3 ) \
            (x)->lpVtbl->GetObjectInfo( x, p1, p2, p3 )
        #define IDirectInputDevice7_GetDeviceInfo( x, p ) \
            (x)->lpVtbl->GetDeviceInfo( x, p )
        #define IDirectInputDevice7_RunControlPanel( x, p1, p2 ) \
            (x)->lpVtbl->RunControlPanel( x, p1, p2 )
        #define IDirectInputDevice7_Initialize( x, p1, p2, p3 ) \
            (x)->lpVtbl->Initialize( x, p1, p2, p3 )
        #define IDirectInputDevice7_CreateEffect( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->CreateEffect( x, p1, p2, p3, p4 )
        #define IDirectInputDevice7_EnumEffects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumEffects( x, p1, p2, p3 )
        #define IDirectInputDevice7_GetEffectInfo( x, p1, p2 ) \
            (x)->lpVtbl->GetEffectInfo( x, p1, p2 )
        #define IDirectInputDevice7_GetForceFeedbackState( x, p ) \
            (x)->lpVtbl->GetForceFeedbackState( x, p )
        #define IDirectInputDevice7_SendForceFeedbackCommand( x, p ) \
            (x)->lpVtbl->SendForceFeedbackCommand( x, p )
        #define IDirectInputDevice7_EnumCreatedEffectObjects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumCreatedEffectObjects( x, p1, p2, p3 )
        #define IDirectInputDevice7_Escape( x, p ) \
            (x)->lpVtbl->Escape( x, p )
        #define IDirectInputDevice7_Poll( x ) \
            (x)->lpVtbl->Poll( x )
        #define IDirectInputDevice7_SendDeviceData( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->SendDeviceData( x, p1, p2, p3, p4 )
        #define IDirectInputDevice7_EnumEffectsInFile( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->EnumEffectsInFile( x, p1, p2, p3, p4 )
        #define IDirectInputDevice7_WriteEffectToFile( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->WriteEffectToFile( x, p1, p2, p3, p4 )
    #endif
    #if (DIRECTINPUT_VERSION >= 0x0800)
        #define IDirectInputDevice8_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IDirectInputDevice8_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IDirectInputDevice8_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IDirectInputDevice8_GetCapabilities( x, p ) \
            (x)->lpVtbl->GetCapabilities( x, p )
        #define IDirectInputDevice8_EnumObjects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumObjects( x, p1, p2, p3 )
        #define IDirectInputDevice8_GetProperty( x, p1, p2 ) \
            (x)->lpVtbl->GetProperty( x, p1, p2 )
        #define IDirectInputDevice8_SetProperty( x, p1, p2 ) \
            (x)->lpVtbl->SetProperty( x, p1, p2 )
        #define IDirectInputDevice8_Acquire( x ) \
            (x)->lpVtbl->Acquire( x )
        #define IDirectInputDevice8_Unacquire( x ) \
            (x)->lpVtbl->Unacquire( x )
        #define IDirectInputDevice8_GetDeviceState( x, p1, p2 ) \
            (x)->lpVtbl->GetDeviceState( x, p1, p2 )
        #define IDirectInputDevice8_GetDeviceData( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->GetDeviceData( x, p1, p2, p3, p4 )
        #define IDirectInputDevice8_SetDataFormat( x, p ) \
            (x)->lpVtbl->SetDataFormat( x, p )
        #define IDirectInputDevice8_SetEventNotification( x, p ) \
            (x)->lpVtbl->SetEventNotification( x, p )
        #define IDirectInputDevice8_SetCooperativeLevel( x, p1, p2 ) \
            (x)->lpVtbl->SetCooperativeLevel( x, p1, p2 )
        #define IDirectInputDevice8_GetObjectInfo( x, p1, p2, p3 ) \
            (x)->lpVtbl->GetObjectInfo( x, p1, p2, p3 )
        #define IDirectInputDevice8_GetDeviceInfo( x, p ) \
            (x)->lpVtbl->GetDeviceInfo( x, p )
        #define IDirectInputDevice8_RunControlPanel( x, p1, p2 ) \
            (x)->lpVtbl->RunControlPanel( x, p1, p2 )
        #define IDirectInputDevice8_Initialize( x, p1, p2, p3 ) \
            (x)->lpVtbl->Initialize( x, p1, p2, p3 )
        #define IDirectInputDevice8_CreateEffect( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->CreateEffect( x, p1, p2, p3, p4 )
        #define IDirectInputDevice8_EnumEffects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumEffects( x, p1, p2, p3 )
        #define IDirectInputDevice8_GetEffectInfo( x, p1, p2 ) \
            (x)->lpVtbl->GetEffectInfo( x, p1, p2 )
        #define IDirectInputDevice8_GetForceFeedbackState( x, p ) \
            (x)->lpVtbl->GetForceFeedbackState( x, p )
        #define IDirectInputDevice8_SendForceFeedbackCommand( x, p ) \
            (x)->lpVtbl->SendForceFeedbackCommand( x, p )
        #define IDirectInputDevice8_EnumCreatedEffectObjects( x, p1, p2, p3 ) \
            (x)->lpVtbl->EnumCreatedEffectObjects( x, p1, p2, p3 )
        #define IDirectInputDevice8_Escape( x, p ) \
            (x)->lpVtbl->Escape( x, p )
        #define IDirectInputDevice8_Poll( x ) \
            (x)->lpVtbl->Poll( x )
        #define IDirectInputDevice8_SendDeviceData( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->SendDeviceData( x, p1, p2, p3, p4 )
        #define IDirectInputDevice8_EnumEffectsInFile( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->EnumEffectsInFile( x, p1, p2, p3, p4 )
        #define IDirectInputDevice8_WriteEffectToFile( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->WriteEffectToFile( x, p1, p2, p3, p4 )
        #define IDirectInputDevice8_BuildActionMap( x, p1, p2, p3 ) \
            (x)->lpVtbl->BuildActionMap( x, p1, p2, p3 )
        #define IDirectInputDevice8_SetActionMap( x, p1, p2, p3 ) \
            (x)->lpVtbl->SetActionMap( x, p1, p2, p3 )
        #define IDirectInputDevice8_GetImageInfo( x, p ) \
            (x)->lpVtbl->GetImageInfo( x, p )
    #endif
    #define IDirectInput_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IDirectInput_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IDirectInput_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IDirectInput_CreateDevice( x, p1, p2, p3 ) \
        (x)->lpVtbl->CreateDevice( x, p1, p2, p3 )
    #define IDirectInput_EnumDevices( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->EnumDevices( x, p1, p2, p3, p4 )
    #define IDirectInput_GetDeviceStatus( x, p ) \
        (x)->lpVtbl->GetDeviceStatus( x, p )
    #define IDirectInput_RunControlPanel( x, p1, p2 ) \
        (x)->lpVtbl->RunControlPanel( x, p1, p2 )
    #define IDirectInput_Initialize( x, p1, p2 ) \
        (x)->lpVtbl->Initialize( x, p1, p2 )
    #define IDirectInput2_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IDirectInput2_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IDirectInput2_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IDirectInput2_CreateDevice( x, p1, p2, p3 ) \
        (x)->lpVtbl->CreateDevice( x, p1, p2, p3 )
    #define IDirectInput2_EnumDevices( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->EnumDevices( x, p1, p2, p3, p4 )
    #define IDirectInput2_GetDeviceStatus( x, p ) \
        (x)->lpVtbl->GetDeviceStatus( x, p )
    #define IDirectInput2_RunControlPanel( x, p1, p2 ) \
        (x)->lpVtbl->RunControlPanel( x, p1, p2 )
    #define IDirectInput2_Initialize( x, p1, p2 ) \
        (x)->lpVtbl->Initialize( x, p1, p2 )
    #define IDirectInput2_FindDevice( x, p1, p2, p3 ) \
        (x)->lpVtbl->FindDevice( x, p1, p2, p3 )
    #define IDirectInput7_QueryInterface( x, p1, p2 ) \
        (x)->lpVtbl->QueryInterface( x, p1, p2 )
    #define IDirectInput7_AddRef( x ) \
        (x)->lpVtbl->AddRef( x )
    #define IDirectInput7_Release( x ) \
        (x)->lpVtbl->Release( x )
    #define IDirectInput7_CreateDevice( x, p1, p2, p3 ) \
        (x)->lpVtbl->CreateDevice( x, p1, p2, p3 )
    #define IDirectInput7_EnumDevices( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->EnumDevices( x, p1, p2, p3, p4 )
    #define IDirectInput7_GetDeviceStatus( x, p ) \
        (x)->lpVtbl->GetDeviceStatus( x, p )
    #define IDirectInput7_RunControlPanel( x, p1, p2 ) \
        (x)->lpVtbl->RunControlPanel( x, p1, p2 )
    #define IDirectInput7_Initialize( x, p1, p2 ) \
        (x)->lpVtbl->Initialize( x, p1, p2 )
    #define IDirectInput7_FindDevice( x, p1, p2, p3 ) \
        (x)->lpVtbl->FindDevice( x, p1, p2, p3 )
    #define IDirectInput7_CreateDeviceEx( x, p1, p2, p3, p4 ) \
        (x)->lpVtbl->CreateDeviceEx( x, p1, p2, p3, p4 )
    #if (DIRECTINPUT_VERSION >= 0x0800)
        #define IDirectInput8_QueryInterface( x, p1, p2 ) \
            (x)->lpVtbl->QueryInterface( x, p1, p2 )
        #define IDirectInput8_AddRef( x ) \
            (x)->lpVtbl->AddRef( x )
        #define IDirectInput8_Release( x ) \
            (x)->lpVtbl->Release( x )
        #define IDirectInput8_CreateDevice( x, p1, p2, p3 ) \
            (x)->lpVtbl->CreateDevice( x, p1, p2, p3 )
        #define IDirectInput8_EnumDevices( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->EnumDevices( x, p1, p2, p3, p4 )
        #define IDirectInput8_GetDeviceStatus( x, p ) \
            (x)->lpVtbl->GetDeviceStatus( x, p )
        #define IDirectInput8_RunControlPanel( x, p1, p2 ) \
            (x)->lpVtbl->RunControlPanel( x, p1, p2 )
        #define IDirectInput8_Initialize( x, p1, p2 ) \
            (x)->lpVtbl->Initialize( x, p1, p2 )
        #define IDirectInput8_FindDevice( x, p1, p2, p3 ) \
            (x)->lpVtbl->FindDevice( x, p1, p2, p3 )
        #define IDirectInput8_EnumDevicesBySemantics( x, p1, p2, p3, p4, p5 ) \
            (x)->lpVtbl->EnumDevicesBySemantics( x, p1, p2, p3, p4, p5 )
        #define IDirectInput8_ConfigureDevices( x, p1, p2, p3, p4 ) \
            (x)->lpVtbl->ConfigureDevices( x, p1, p2, p3, p4 )
    #endif
#else
    #if (DIRECTINPUT_VERSION >= 0x0500)
        #define IDirectInputEffect_QueryInterface( x, p1, p2 ) \
            (x)->QueryInterface( p1, p2 )
        #define IDirectInputEffect_AddRef( x ) \
            (x)->AddRef()
        #define IDirectInputEffect_Release( x ) \
            (x)->Release()
        #define IDirectInputEffect_Initialize( x, p1, p2, p3 ) \
            (x)->Initialize( p1, p2, p3 )
        #define IDirectInputEffect_GetEffectGuid( x, p ) \
            (x)->GetEffectGuid( p )
        #define IDirectInputEffect_GetParameters( x, p1, p2 ) \
            (x)->GetParameters( p1, p2 )
        #define IDirectInputEffect_SetParameters( x, p1, p2 ) \
            (x)->SetParameters( p1, p2 )
        #define IDirectInputEffect_Start( x, p1, p2 ) \
            (x)->Start( p1, p2 )
        #define IDirectInputEffect_Stop( x ) \
            (x)->Stop()
        #define IDirectInputEffect_GetEffectStatus( x, p ) \
            (x)->GetEffectStatus( p )
        #define IDirectInputEffect_Download( x ) \
            (x)->Download()
        #define IDirectInputEffect_Unload( x ) \
            (x)->Unload()
        #define IDirectInputEffect_Escape( x, p ) \
            (x)->Escape( p )
    #endif
    #define IDirectInputDevice_QueryInterface( x, p1, p2 ) \
        (x)->QueryInterface( p1, p2 )
    #define IDirectInputDevice_AddRef( x ) \
        (x)->AddRef()
    #define IDirectInputDevice_Release( x ) \
        (x)->Release()
    #define IDirectInputDevice_GetCapabilities( x, p ) \
        (x)->GetCapabilities( p )
    #define IDirectInputDevice_EnumObjects( x, p1, p2, p3 ) \
        (x)->EnumObjects( p1, p2, p3 )
    #define IDirectInputDevice_GetProperty( x, p1, p2 ) \
        (x)->GetProperty( p1, p2 )
    #define IDirectInputDevice_SetProperty( x, p1, p2 ) \
        (x)->SetProperty( p1, p2 )
    #define IDirectInputDevice_Acquire( x ) \
        (x)->Acquire()
    #define IDirectInputDevice_Unacquire( x ) \
        (x)->Unacquire()
    #define IDirectInputDevice_GetDeviceState( x, p1, p2 ) \
        (x)->GetDeviceState( p1, p2 )
    #define IDirectInputDevice_GetDeviceData( x, p1, p2, p3, p4 ) \
        (x)->GetDeviceData( p1, p2, p3, p4 )
    #define IDirectInputDevice_SetDataFormat( x, p ) \
        (x)->SetDataFormat( p )
    #define IDirectInputDevice_SetEventNotification( x, p ) \
        (x)->SetEventNotification( p )
    #define IDirectInputDevice_SetCooperativeLevel( x, p1, p2 ) \
        (x)->SetCooperativeLevel( p1, p2 )
    #define IDirectInputDevice_GetObjectInfo( x, p1, p2, p3 ) \
        (x)->GetObjectInfo( p1, p2, p3 )
    #define IDirectInputDevice_GetDeviceInfo( x, p ) \
        (x)->GetDeviceInfo( p )
    #define IDirectInputDevice_RunControlPanel( x, p1, p2 ) \
        (x)->RunControlPanel( p1, p2 )
    #define IDirectInputDevice_Initialize( x, p1, p2, p3 ) \
        (x)->Initialize( p1, p2, p3 )
    #if (DIRECTINPUT_VERSION >= 0x0500)
        #define IDirectInputDevice2_QueryInterface( x, p1, p2 ) \
            (x)->QueryInterface( p1, p2 )
        #define IDirectInputDevice2_AddRef( x ) \
            (x)->AddRef()
        #define IDirectInputDevice2_Release( x ) \
            (x)->Release()
        #define IDirectInputDevice2_GetCapabilities( x, p ) \
            (x)->GetCapabilities( p )
        #define IDirectInputDevice2_EnumObjects( x, p1, p2, p3 ) \
            (x)->EnumObjects( p1, p2, p3 )
        #define IDirectInputDevice2_GetProperty( x, p1, p2 ) \
            (x)->GetProperty( p1, p2 )
        #define IDirectInputDevice2_SetProperty( x, p1, p2 ) \
            (x)->SetProperty( p1, p2 )
        #define IDirectInputDevice2_Acquire( x ) \
            (x)->Acquire()
        #define IDirectInputDevice2_Unacquire( x ) \
            (x)->Unacquire()
        #define IDirectInputDevice2_GetDeviceState( x, p1, p2 ) \
            (x)->GetDeviceState( p1, p2 )
        #define IDirectInputDevice2_GetDeviceData( x, p1, p2, p3, p4 ) \
            (x)->GetDeviceData( p1, p2, p3, p4 )
        #define IDirectInputDevice2_SetDataFormat( x, p ) \
            (x)->SetDataFormat( p )
        #define IDirectInputDevice2_SetEventNotification( x, p ) \
            (x)->SetEventNotification( p )
        #define IDirectInputDevice2_SetCooperativeLevel( x, p1, p2 ) \
            (x)->SetCooperativeLevel( p1, p2 )
        #define IDirectInputDevice2_GetObjectInfo( x, p1, p2, p3 ) \
            (x)->GetObjectInfo( p1, p2, p3 )
        #define IDirectInputDevice2_GetDeviceInfo( x, p ) \
            (x)->GetDeviceInfo( p )
        #define IDirectInputDevice2_RunControlPanel( x, p1, p2 ) \
            (x)->RunControlPanel( p1, p2 )
        #define IDirectInputDevice2_Initialize( x, p1, p2, p3 ) \
            (x)->Initialize( p1, p2, p3 )
        #define IDirectInputDevice2_CreateEffect( x, p1, p2, p3, p4 ) \
            (x)->CreateEffect( p1, p2, p3, p4 )
        #define IDirectInputDevice2_EnumEffects( x, p1, p2, p3 ) \
            (x)->EnumEffects( p1, p2, p3 )
        #define IDirectInputDevice2_GetEffectInfo( x, p1, p2 ) \
            (x)->GetEffectInfo( p1, p2 )
        #define IDirectInputDevice2_GetForceFeedbackState( x, p ) \
            (x)->GetForceFeedbackState( p )
        #define IDirectInputDevice2_SendForceFeedbackCommand( x, p ) \
            (x)->SendForceFeedbackCommand( p )
        #define IDirectInputDevice2_EnumCreatedEffectObjects( x, p1, p2, p3 ) \
            (x)->EnumCreatedEffectObjects( p1, p2, p3 )
        #define IDirectInputDevice2_Escape( x, p ) \
            (x)->Escape( p )
        #define IDirectInputDevice2_Poll( x ) \
            (x)->Poll()
        #define IDirectInputDevice2_SendDeviceData( x, p1, p2, p3, p4 ) \
            (x)->SendDeviceData( p1, p2, p3, p4 )
    #endif
    #if (DIRECTINPUT_VERSION >= 0x0500)
        #define IDirectInputDevice7_QueryInterface( x, p1, p2 ) \
            (x)->QueryInterface( p1, p2 )
        #define IDirectInputDevice7_AddRef( x ) \
            (x)->AddRef()
        #define IDirectInputDevice7_Release( x ) \
            (x)->Release()
        #define IDirectInputDevice7_GetCapabilities( x, p ) \
            (x)->GetCapabilities( p )
        #define IDirectInputDevice7_EnumObjects( x, p1, p2, p3 ) \
            (x)->EnumObjects( p1, p2, p3 )
        #define IDirectInputDevice7_GetProperty( x, p1, p2 ) \
            (x)->GetProperty( p1, p2 )
        #define IDirectInputDevice7_SetProperty( x, p1, p2 ) \
            (x)->SetProperty( p1, p2 )
        #define IDirectInputDevice7_Acquire( x ) \
            (x)->Acquire()
        #define IDirectInputDevice7_Unacquire( x ) \
            (x)->Unacquire()
        #define IDirectInputDevice7_GetDeviceState( x, p1, p2 ) \
            (x)->GetDeviceState( p1, p2 )
        #define IDirectInputDevice7_GetDeviceData( x, p1, p2, p3, p4 ) \
            (x)->GetDeviceData( p1, p2, p3, p4 )
        #define IDirectInputDevice7_SetDataFormat( x, p ) \
            (x)->SetDataFormat( p )
        #define IDirectInputDevice7_SetEventNotification( x, p ) \
            (x)->SetEventNotification( p )
        #define IDirectInputDevice7_SetCooperativeLevel( x, p1, p2 ) \
            (x)->SetCooperativeLevel( p1, p2 )
        #define IDirectInputDevice7_GetObjectInfo( x, p1, p2, p3 ) \
            (x)->GetObjectInfo( p1, p2, p3 )
        #define IDirectInputDevice7_GetDeviceInfo( x, p ) \
            (x)->GetDeviceInfo( p )
        #define IDirectInputDevice7_RunControlPanel( x, p1, p2 ) \
            (x)->RunControlPanel( p1, p2 )
        #define IDirectInputDevice7_Initialize( x, p1, p2, p3 ) \
            (x)->Initialize( p1, p2, p3 )
        #define IDirectInputDevice7_CreateEffect( x, p1, p2, p3, p4 ) \
            (x)->CreateEffect( p1, p2, p3, p4 )
        #define IDirectInputDevice7_EnumEffects( x, p1, p2, p3 ) \
            (x)->EnumEffects( p1, p2, p3 )
        #define IDirectInputDevice7_GetEffectInfo( x, p1, p2 ) \
            (x)->GetEffectInfo( p1, p2 )
        #define IDirectInputDevice7_GetForceFeedbackState( x, p ) \
            (x)->GetForceFeedbackState( p )
        #define IDirectInputDevice7_SendForceFeedbackCommand( x, p ) \
            (x)->SendForceFeedbackCommand( p )
        #define IDirectInputDevice7_EnumCreatedEffectObjects( x, p1, p2, p3 ) \
            (x)->EnumCreatedEffectObjects( p1, p2, p3 )
        #define IDirectInputDevice7_Escape( x, p ) \
            (x)->Escape( p )
        #define IDirectInputDevice7_Poll( x ) \
            (x)->Poll()
        #define IDirectInputDevice7_SendDeviceData( x, p1, p2, p3, p4 ) \
            (x)->SendDeviceData( p1, p2, p3, p4 )
        #define IDirectInputDevice7_EnumEffectsInFile( x, p1, p2, p3, p4 ) \
            (x)->EnumEffectsInFile( p1, p2, p3, p4 )
        #define IDirectInputDevice7_WriteEffectToFile( x, p1, p2, p3, p4 ) \
            (x)->WriteEffectToFile( p1, p2, p3, p4 )
    #endif
    #if (DIRECTINPUT_VERSION >= 0x0800)
        #define IDirectInputDevice8_QueryInterface( x, p1, p2 ) \
            (x)->QueryInterface( p1, p2 )
        #define IDirectInputDevice8_AddRef( x ) \
            (x)->AddRef()
        #define IDirectInputDevice8_Release( x ) \
            (x)->Release()
        #define IDirectInputDevice8_GetCapabilities( x, p ) \
            (x)->GetCapabilities( p )
        #define IDirectInputDevice8_EnumObjects( x, p1, p2, p3 ) \
            (x)->EnumObjects( p1, p2, p3 )
        #define IDirectInputDevice8_GetProperty( x, p1, p2 ) \
            (x)->GetProperty( p1, p2 )
        #define IDirectInputDevice8_SetProperty( x, p1, p2 ) \
            (x)->SetProperty( p1, p2 )
        #define IDirectInputDevice8_Acquire( x ) \
            (x)->Acquire()
        #define IDirectInputDevice8_Unacquire( x ) \
            (x)->Unacquire()
        #define IDirectInputDevice8_GetDeviceState( x, p1, p2 ) \
            (x)->GetDeviceState( p1, p2 )
        #define IDirectInputDevice8_GetDeviceData( x, p1, p2, p3, p4 ) \
            (x)->GetDeviceData( p1, p2, p3, p4 )
        #define IDirectInputDevice8_SetDataFormat( x, p ) \
            (x)->SetDataFormat( p )
        #define IDirectInputDevice8_SetEventNotification( x, p ) \
            (x)->SetEventNotification( p )
        #define IDirectInputDevice8_SetCooperativeLevel( x, p1, p2 ) \
            (x)->SetCooperativeLevel( p1, p2 )
        #define IDirectInputDevice8_GetObjectInfo( x, p1, p2, p3 ) \
            (x)->GetObjectInfo( p1, p2, p3 )
        #define IDirectInputDevice8_GetDeviceInfo( x, p ) \
            (x)->GetDeviceInfo( p )
        #define IDirectInputDevice8_RunControlPanel( x, p1, p2 ) \
            (x)->RunControlPanel( p1, p2 )
        #define IDirectInputDevice8_Initialize( x, p1, p2, p3 ) \
            (x)->Initialize( p1, p2, p3 )
        #define IDirectInputDevice8_CreateEffect( x, p1, p2, p3, p4 ) \
            (x)->CreateEffect( p1, p2, p3, p4 )
        #define IDirectInputDevice8_EnumEffects( x, p1, p2, p3 ) \
            (x)->EnumEffects( p1, p2, p3 )
        #define IDirectInputDevice8_GetEffectInfo( x, p1, p2 ) \
            (x)->GetEffectInfo( p1, p2 )
        #define IDirectInputDevice8_GetForceFeedbackState( x, p ) \
            (x)->GetForceFeedbackState( p )
        #define IDirectInputDevice8_SendForceFeedbackCommand( x, p ) \
            (x)->SendForceFeedbackCommand( p )
        #define IDirectInputDevice8_EnumCreatedEffectObjects( x, p1, p2, p3 ) \
            (x)->EnumCreatedEffectObjects( p1, p2, p3 )
        #define IDirectInputDevice8_Escape( x, p ) \
            (x)->Escape( p )
        #define IDirectInputDevice8_Poll( x ) \
            (x)->Poll()
        #define IDirectInputDevice8_SendDeviceData( x, p1, p2, p3, p4 ) \
            (x)->SendDeviceData( p1, p2, p3, p4 )
        #define IDirectInputDevice8_EnumEffectsInFile( x, p1, p2, p3, p4 ) \
            (x)->EnumEffectsInFile( p1, p2, p3, p4 )
        #define IDirectInputDevice8_WriteEffectToFile( x, p1, p2, p3, p4 ) \
            (x)->WriteEffectToFile( p1, p2, p3, p4 )
        #define IDirectInputDevice8_BuildActionMap( x, p1, p2, p3 ) \
            (x)->BuildActionMap( p1, p2, p3 )
        #define IDirectInputDevice8_SetActionMap( x, p1, p2, p3 ) \
            (x)->SetActionMap( p1, p2, p3 )
        #define IDirectInputDevice8_GetImageInfo( x, p ) \
            (x)->GetImageInfo( p )
    #endif
    #define IDirectInput_QueryInterface( x, p1, p2 ) \
        (x)->QueryInterface( p1, p2 )
    #define IDirectInput_AddRef( x ) \
        (x)->AddRef()
    #define IDirectInput_Release( x ) \
        (x)->Release()
    #define IDirectInput_CreateDevice( x, p1, p2, p3 ) \
        (x)->CreateDevice( p1, p2, p3 )
    #define IDirectInput_EnumDevices( x, p1, p2, p3, p4 ) \
        (x)->EnumDevices( p1, p2, p3, p4 )
    #define IDirectInput_GetDeviceStatus( x, p ) \
        (x)->GetDeviceStatus( p )
    #define IDirectInput_RunControlPanel( x, p1, p2 ) \
        (x)->RunControlPanel( p1, p2 )
    #define IDirectInput_Initialize( x, p1, p2 ) \
        (x)->Initialize( p1, p2 )
    #define IDirectInput2_QueryInterface( x, p1, p2 ) \
        (x)->QueryInterface( p1, p2 )
    #define IDirectInput2_AddRef( x ) \
        (x)->AddRef()
    #define IDirectInput2_Release( x ) \
        (x)->Release()
    #define IDirectInput2_CreateDevice( x, p1, p2, p3 ) \
        (x)->CreateDevice( p1, p2, p3 )
    #define IDirectInput2_EnumDevices( x, p1, p2, p3, p4 ) \
        (x)->EnumDevices( p1, p2, p3, p4 )
    #define IDirectInput2_GetDeviceStatus( x, p ) \
        (x)->GetDeviceStatus( p )
    #define IDirectInput2_RunControlPanel( x, p1, p2 ) \
        (x)->RunControlPanel( p1, p2 )
    #define IDirectInput2_Initialize( x, p1, p2 ) \
        (x)->Initialize( p1, p2 )
    #define IDirectInput2_FindDevice( x, p1, p2, p3 ) \
        (x)->FindDevice( p1, p2, p3 )
    #define IDirectInput7_QueryInterface( x, p1, p2 ) \
        (x)->QueryInterface( p1, p2 )
    #define IDirectInput7_AddRef( x ) \
        (x)->AddRef()
    #define IDirectInput7_Release( x ) \
        (x)->Release()
    #define IDirectInput7_CreateDevice( x, p1, p2, p3 ) \
        (x)->CreateDevice( p1, p2, p3 )
    #define IDirectInput7_EnumDevices( x, p1, p2, p3, p4 ) \
        (x)->EnumDevices( p1, p2, p3, p4 )
    #define IDirectInput7_GetDeviceStatus( x, p ) \
        (x)->GetDeviceStatus( p )
    #define IDirectInput7_RunControlPanel( x, p1, p2 ) \
        (x)->RunControlPanel( p1, p2 )
    #define IDirectInput7_Initialize( x, p1, p2 ) \
        (x)->Initialize( p1, p2 )
    #define IDirectInput7_FindDevice( x, p1, p2, p3 ) \
        (x)->FindDevice( p1, p2, p3 )
    #define IDirectInput7_CreateDeviceEx( x, p1, p2, p3, p4 ) \
        (x)->CreateDeviceEx( p1, p2, p3, p4 )
    #if (DIRECTINPUT_VERSION >= 0x0800)
        #define IDirectInput8_QueryInterface( x, p1, p2 ) \
            (x)->QueryInterface( p1, p2 )
        #define IDirectInput8_AddRef( x ) \
            (x)->AddRef()
        #define IDirectInput8_Release( x ) \
            (x)->Release()
        #define IDirectInput8_CreateDevice( x, p1, p2, p3 ) \
            (x)->CreateDevice( p1, p2, p3 )
        #define IDirectInput8_EnumDevices( x, p1, p2, p3, p4 ) \
            (x)->EnumDevices( p1, p2, p3, p4 )
        #define IDirectInput8_GetDeviceStatus( x, p ) \
            (x)->GetDeviceStatus( p )
        #define IDirectInput8_RunControlPanel( x, p1, p2 ) \
            (x)->RunControlPanel( p1, p2 )
        #define IDirectInput8_Initialize( x, p1, p2 ) \
            (x)->Initialize( p1, p2 )
        #define IDirectInput8_FindDevice( x, p1, p2, p3 ) \
            (x)->FindDevice( p1, p2, p3 )
        #define IDirectInput8_EnumDevicesBySemantics( x, p1, p2, p3, p4, p5 ) \
            (x)->EnumDevicesBySemantics( p1, p2, p3, p4, p5 )
        #define IDirectInput8_ConfigureDevices( x, p1, p2, p3, p4 ) \
            (x)->ConfigureDevices( p1, p2, p3, p4 )
    #endif
#endif

/* Global variables in DINPUT.LIB and DINPUT8.LIB */
extern const DIDATAFORMAT   c_dfDIMouse;
extern const DIDATAFORMAT   c_dfDIKeyboard;
#if (DIRECTINPUT_VERSION >= 0x0500)
extern const DIDATAFORMAT   c_dfDIJoystick;
extern const DIDATAFORMAT   c_dfDIJoystick2;
#endif
#if (DIRECTINPUT_VERSION >= 0x0700)
extern const DIDATAFORMAT   c_dfDIMouse2;
#endif

/* Functions in DINPUT.DLL */
extern HRESULT WINAPI   DirectInputCreateA( HINSTANCE, DWORD, LPDIRECTINPUTA *, LPUNKNOWN );
extern HRESULT WINAPI   DirectInputCreateEx( HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN );
extern HRESULT WINAPI   DirectInputCreateW( HINSTANCE, DWORD, LPDIRECTINPUTW *, LPUNKNOWN );

/* Functions in DINPUT8.DLL */
#if (DIRECTINPUT_VERSION > 0x0700)
extern HRESULT WINAPI   DirectInput8Create( HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN );
#endif

/* Map generic function names to the appropriate ANSI or Unicode version. */
#ifdef UNICODE
    #define DirectInputCreate   DirectInputCreateW
#else
    #define DirectInputCreate   DirectInputCreateA
#endif

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* __DINPUT_INCLUDED__ */
