/*** Autogenerated by WIDL 6.0-rc1 from include/dinputd.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __dinputd_h__
#define __dinputd_h__

/* Forward declarations */

#ifndef __IDirectInputEffectDriver_FWD_DEFINED__
#define __IDirectInputEffectDriver_FWD_DEFINED__
typedef interface IDirectInputEffectDriver IDirectInputEffectDriver;
#ifdef __cplusplus
interface IDirectInputEffectDriver;
#endif /* __cplusplus */
#endif

#ifndef __IDirectInputJoyConfig_FWD_DEFINED__
#define __IDirectInputJoyConfig_FWD_DEFINED__
typedef interface IDirectInputJoyConfig IDirectInputJoyConfig;
#ifdef __cplusplus
interface IDirectInputJoyConfig;
#endif /* __cplusplus */
#endif

#ifndef __IDirectInputJoyConfig8_FWD_DEFINED__
#define __IDirectInputJoyConfig8_FWD_DEFINED__
typedef interface IDirectInputJoyConfig8 IDirectInputJoyConfig8;
#ifdef __cplusplus
interface IDirectInputJoyConfig8;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

#include "winapifamily.h"
#ifndef DIRECTINPUT_VERSION
#define DIRECTINPUT_VERSION 0x0800
#endif
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

typedef struct DIOBJECTATTRIBUTES {
    DWORD dwFlags;
    WORD wUsagePage;
    WORD wUsage;
} DIOBJECTATTRIBUTES;
typedef struct DIOBJECTATTRIBUTES *LPDIOBJECTATTRIBUTES;
typedef const DIOBJECTATTRIBUTES *LPCDIOBJECTATTRIBUTES;

typedef struct DIFFOBJECTATTRIBUTES {
    DWORD dwFFMaxForce;
    DWORD dwFFForceResolution;
} DIFFOBJECTATTRIBUTES;
typedef struct DIFFOBJECTATTRIBUTES *LPDIFFOBJECTATTRIBUTES;
typedef const DIFFOBJECTATTRIBUTES *LPCDIFFOBJECTATTRIBUTES;

typedef struct DIOBJECTCALIBRATION {
    LONG lMin;
    LONG lCenter;
    LONG lMax;
} DIOBJECTCALIBRATION;
typedef struct DIOBJECTCALIBRATION *LPDIOBJECTCALIBRATION;
typedef const DIOBJECTCALIBRATION *LPCDIOBJECTCALIBRATION;

typedef struct DIPOVCALIBRATION {
    LONG lMin[5];
    LONG lMax[5];
} DIPOVCALIBRATION;
typedef struct DIPOVCALIBRATION *LPDIPOVCALIBRATION;
typedef const DIPOVCALIBRATION *LPCDIPOVCALIBRATION;

typedef struct DIEFFECTATTRIBUTES {
    DWORD dwEffectId;
    DWORD dwEffType;
    DWORD dwStaticParams;
    DWORD dwDynamicParams;
    DWORD dwCoords;
} DIEFFECTATTRIBUTES;
typedef struct DIEFFECTATTRIBUTES *LPDIEFFECTATTRIBUTES;
typedef const DIEFFECTATTRIBUTES *LPCDIEFFECTATTRIBUTES;

typedef struct DIFFDEVICEATTRIBUTES {
    DWORD dwFlags;
    DWORD dwFFSamplePeriod;
    DWORD dwFFMinTimeResolution;
} DIFFDEVICEATTRIBUTES;
typedef struct DIFFDEVICEATTRIBUTES *LPDIFFDEVICEATTRIBUTES;
typedef const DIFFDEVICEATTRIBUTES *LPCDIFFDEVICEATTRIBUTES;

typedef struct DIDRIVERVERSIONS {
    DWORD dwSize;
    DWORD dwFirmwareRevision;
    DWORD dwHardwareRevision;
    DWORD dwFFDriverVersion;
} DIDRIVERVERSIONS;
typedef struct DIDRIVERVERSIONS *LPDIDRIVERVERSIONS;
typedef const DIDRIVERVERSIONS *LPCDIDRIVERVERSIONS;

typedef struct DIDEVICESTATE {
    DWORD dwSize;
    DWORD dwState;
    DWORD dwLoad;
} DIDEVICESTATE;
typedef struct DIDEVICESTATE *LPDIDEVICESTATE;
#define DEV_STS_EFFECT_RUNNING DIEGES_PLAYING
#ifndef DIJ_RINGZERO

typedef struct DIHIDFFINITINFO {
    DWORD dwSize;
    LPWSTR pwszDeviceInterface;
    GUID GuidInstance;
} DIHIDFFINITINFO;
typedef struct DIHIDFFINITINFO *LPDIHIDFFINITINFO;
#if 0
typedef struct DIEFFESCAPE DIEFFESCAPE;
typedef struct DIEFFESCAPE *LPDIEFFESCAPE;
typedef struct DIEFFECT DIEFFECT;
typedef struct DIEFFECT *LPDIEFFECT;
typedef const DIEFFECT *LPCDIEFFECT;
#endif

/*****************************************************************************
 * IDirectInputEffectDriver interface
 */
#ifndef __IDirectInputEffectDriver_INTERFACE_DEFINED__
#define __IDirectInputEffectDriver_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectInputEffectDriver, 0x02538130, 0x898f, 0x11d0, 0x9a,0xd0, 0x00,0xa0,0xc9,0xa0,0x6e,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("02538130-898f-11d0-9ad0-00a0c9a06e35")
IDirectInputEffectDriver : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE DeviceID(
        DWORD a,
        DWORD b,
        DWORD c,
        DWORD d,
        LPVOID e) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVersions(
        LPDIDRIVERVERSIONS a) = 0;

    virtual HRESULT STDMETHODCALLTYPE Escape(
        DWORD a,
        DWORD b,
        LPDIEFFESCAPE c) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGain(
        DWORD a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendForceFeedbackCommand(
        DWORD a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetForceFeedbackState(
        DWORD a,
        LPDIDEVICESTATE b) = 0;

    virtual HRESULT STDMETHODCALLTYPE DownloadEffect(
        DWORD a,
        DWORD b,
        LPDWORD c,
        LPCDIEFFECT d,
        DWORD e) = 0;

    virtual HRESULT STDMETHODCALLTYPE DestroyEffect(
        DWORD a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE StartEffect(
        DWORD a,
        DWORD b,
        DWORD c,
        DWORD d) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopEffect(
        DWORD a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEffectStatus(
        DWORD a,
        DWORD b,
        LPDWORD c) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectInputEffectDriver, 0x02538130, 0x898f, 0x11d0, 0x9a,0xd0, 0x00,0xa0,0xc9,0xa0,0x6e,0x35)
#endif
#else
typedef struct IDirectInputEffectDriverVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDirectInputEffectDriver *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDirectInputEffectDriver *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDirectInputEffectDriver *This);

    /*** IDirectInputEffectDriver methods ***/
    HRESULT (STDMETHODCALLTYPE *DeviceID)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b,
        DWORD c,
        DWORD d,
        LPVOID e);

    HRESULT (STDMETHODCALLTYPE *GetVersions)(
        IDirectInputEffectDriver *This,
        LPDIDRIVERVERSIONS a);

    HRESULT (STDMETHODCALLTYPE *Escape)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b,
        LPDIEFFESCAPE c);

    HRESULT (STDMETHODCALLTYPE *SetGain)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *SendForceFeedbackCommand)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *GetForceFeedbackState)(
        IDirectInputEffectDriver *This,
        DWORD a,
        LPDIDEVICESTATE b);

    HRESULT (STDMETHODCALLTYPE *DownloadEffect)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b,
        LPDWORD c,
        LPCDIEFFECT d,
        DWORD e);

    HRESULT (STDMETHODCALLTYPE *DestroyEffect)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *StartEffect)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b,
        DWORD c,
        DWORD d);

    HRESULT (STDMETHODCALLTYPE *StopEffect)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *GetEffectStatus)(
        IDirectInputEffectDriver *This,
        DWORD a,
        DWORD b,
        LPDWORD c);

    END_INTERFACE
} IDirectInputEffectDriverVtbl;

interface IDirectInputEffectDriver {
    CONST_VTBL IDirectInputEffectDriverVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectInputEffectDriver_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectInputEffectDriver_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectInputEffectDriver_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectInputEffectDriver methods ***/
#define IDirectInputEffectDriver_DeviceID(This,a,b,c,d,e) (This)->lpVtbl->DeviceID(This,a,b,c,d,e)
#define IDirectInputEffectDriver_GetVersions(This,a) (This)->lpVtbl->GetVersions(This,a)
#define IDirectInputEffectDriver_Escape(This,a,b,c) (This)->lpVtbl->Escape(This,a,b,c)
#define IDirectInputEffectDriver_SetGain(This,a,b) (This)->lpVtbl->SetGain(This,a,b)
#define IDirectInputEffectDriver_SendForceFeedbackCommand(This,a,b) (This)->lpVtbl->SendForceFeedbackCommand(This,a,b)
#define IDirectInputEffectDriver_GetForceFeedbackState(This,a,b) (This)->lpVtbl->GetForceFeedbackState(This,a,b)
#define IDirectInputEffectDriver_DownloadEffect(This,a,b,c,d,e) (This)->lpVtbl->DownloadEffect(This,a,b,c,d,e)
#define IDirectInputEffectDriver_DestroyEffect(This,a,b) (This)->lpVtbl->DestroyEffect(This,a,b)
#define IDirectInputEffectDriver_StartEffect(This,a,b,c,d) (This)->lpVtbl->StartEffect(This,a,b,c,d)
#define IDirectInputEffectDriver_StopEffect(This,a,b) (This)->lpVtbl->StopEffect(This,a,b)
#define IDirectInputEffectDriver_GetEffectStatus(This,a,b,c) (This)->lpVtbl->GetEffectStatus(This,a,b,c)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectInputEffectDriver_QueryInterface(IDirectInputEffectDriver* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectInputEffectDriver_AddRef(IDirectInputEffectDriver* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectInputEffectDriver_Release(IDirectInputEffectDriver* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectInputEffectDriver methods ***/
static FORCEINLINE HRESULT IDirectInputEffectDriver_DeviceID(IDirectInputEffectDriver* This,DWORD a,DWORD b,DWORD c,DWORD d,LPVOID e) {
    return This->lpVtbl->DeviceID(This,a,b,c,d,e);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_GetVersions(IDirectInputEffectDriver* This,LPDIDRIVERVERSIONS a) {
    return This->lpVtbl->GetVersions(This,a);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_Escape(IDirectInputEffectDriver* This,DWORD a,DWORD b,LPDIEFFESCAPE c) {
    return This->lpVtbl->Escape(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_SetGain(IDirectInputEffectDriver* This,DWORD a,DWORD b) {
    return This->lpVtbl->SetGain(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_SendForceFeedbackCommand(IDirectInputEffectDriver* This,DWORD a,DWORD b) {
    return This->lpVtbl->SendForceFeedbackCommand(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_GetForceFeedbackState(IDirectInputEffectDriver* This,DWORD a,LPDIDEVICESTATE b) {
    return This->lpVtbl->GetForceFeedbackState(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_DownloadEffect(IDirectInputEffectDriver* This,DWORD a,DWORD b,LPDWORD c,LPCDIEFFECT d,DWORD e) {
    return This->lpVtbl->DownloadEffect(This,a,b,c,d,e);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_DestroyEffect(IDirectInputEffectDriver* This,DWORD a,DWORD b) {
    return This->lpVtbl->DestroyEffect(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_StartEffect(IDirectInputEffectDriver* This,DWORD a,DWORD b,DWORD c,DWORD d) {
    return This->lpVtbl->StartEffect(This,a,b,c,d);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_StopEffect(IDirectInputEffectDriver* This,DWORD a,DWORD b) {
    return This->lpVtbl->StopEffect(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputEffectDriver_GetEffectStatus(IDirectInputEffectDriver* This,DWORD a,DWORD b,LPDWORD c) {
    return This->lpVtbl->GetEffectStatus(This,a,b,c);
}
#endif
#endif

#endif


#endif  /* __IDirectInputEffectDriver_INTERFACE_DEFINED__ */

#endif /* DIJ_RINGZERO */
#ifndef JOY_HW_NONE
#define JOY_HW_NONE 0
#define JOY_HW_CUSTOM 1
#define JOY_HW_2A_2B_GENERIC 2
#define JOY_HW_2A_4B_GENERIC 3
#define JOY_HW_2B_GAMEPAD 4
#define JOY_HW_2B_FLIGHTYOKE 5
#define JOY_HW_2B_FLIGHTYOKETHROTTLE 6
#define JOY_HW_3A_2B_GENERIC 7
#define JOY_HW_3A_4B_GENERIC 8
#define JOY_HW_4B_GAMEPAD 9
#define JOY_HW_4B_FLIGHTYOKE 10
#define JOY_HW_4B_FLIGHTYOKETHROTTLE 11
#define JOY_HW_TWO_2A_2B_WITH_Y 12
#define JOY_HW_LASTENTRY 13
#define JOY_ISCAL_XY 0x00000001
#define JOY_ISCAL_Z 0x00000002
#define JOY_ISCAL_R 0x00000004
#define JOY_ISCAL_U 0x00000008
#define JOY_ISCAL_V 0x00000010
#define JOY_ISCAL_POV 0x00000020
#define JOY_POVVAL_FORWARD (0)

#define JOY_POVVAL_BACKWARD (1)

#define JOY_POVVAL_LEFT (2)

#define JOY_POVVAL_RIGHT (3)

#define JOY_POV_NUMDIRS (4)

#define JOY_HWS_HASZ 0x00000001
#define JOY_HWS_HASPOV 0x00000002
#define JOY_HWS_POVISBUTTONCOMBOS 0x00000004
#define JOY_HWS_POVISPOLL 0x00000008
#define JOY_HWS_ISYOKE 0x00000010
#define JOY_HWS_ISGAMEPAD 0x00000020
#define JOY_HWS_ISCARCTRL 0x00000040
#define JOY_HWS_XISJ1Y 0x00000080
#define JOY_HWS_XISJ2X 0x00000100
#define JOY_HWS_XISJ2Y 0x00000200
#define JOY_HWS_YISJ1X 0x00000400
#define JOY_HWS_YISJ2X 0x00000800
#define JOY_HWS_YISJ2Y 0x00001000
#define JOY_HWS_ZISJ1X 0x00002000
#define JOY_HWS_ZISJ1Y 0x00004000
#define JOY_HWS_ZISJ2X 0x00008000
#define JOY_HWS_POVISJ1X 0x00010000
#define JOY_HWS_POVISJ1Y 0x00020000
#define JOY_HWS_POVISJ2X 0x00040000
#define JOY_HWS_HASR 0x00080000
#define JOY_HWS_RISJ1X 0x00100000
#define JOY_HWS_RISJ1Y 0x00200000
#define JOY_HWS_RISJ2Y 0x00400000
#define JOY_HWS_HASU 0x00800000
#define JOY_HWS_HASV 0x01000000
#define JOY_US_HASRUDDER 0x00000001
#define JOY_US_PRESENT 0x00000002
#define JOY_US_ISOEM 0x00000004
#define JOY_US_RESERVED 0x80000000
#define JOYTYPE_ZEROGAMEENUMOEMDATA 0x00000001
#define JOYTYPE_NOAUTODETECTGAMEPORT 0x00000002
#define JOYTYPE_NOHIDDIRECT 0x00000004
#define JOYTYPE_ANALOGCOMPAT 0x00000008
#define JOYTYPE_DEFAULTPROPSHEET 0x80000000
#define JOYTYPE_DEVICEHIDE 0x00010000
#define JOYTYPE_MOUSEHIDE 0x00020000
#define JOYTYPE_KEYBHIDE 0x00040000
#define JOYTYPE_GAMEHIDE 0x00080000
#define JOYTYPE_HIDEACTIVE 0x00100000
#define JOYTYPE_INFOMASK 0x00E00000
#define JOYTYPE_INFODEFAULT 0x00000000
#define JOYTYPE_INFOYYPEDALS 0x00200000
#define JOYTYPE_INFOZYPEDALS 0x00400000
#define JOYTYPE_INFOYRPEDALS 0x00600000
#define JOYTYPE_INFOZRPEDALS 0x00800000
#define JOYTYPE_INFOZISSLIDER 0x00200000
#define JOYTYPE_INFOZISZ 0x00400000
#define JOYTYPE_ENABLEINPUTREPORT 0x01000000

typedef struct joypos_tag {
    DWORD dwX;
    DWORD dwY;
    DWORD dwZ;
    DWORD dwR;
    DWORD dwU;
    DWORD dwV;
} JOYPOS;
typedef struct joypos_tag *LPJOYPOS;

typedef struct joyrange_tag {
    JOYPOS jpMin;
    JOYPOS jpMax;
    JOYPOS jpCenter;
} JOYRANGE;
typedef struct joyrange_tag *LPJOYRANGE;

typedef struct joyreguservalues_tag {
    DWORD dwTimeOut;
    JOYRANGE jrvRanges;
    JOYPOS jpDeadZone;
} JOYREGUSERVALUES;
typedef struct joyreguservalues_tag *LPJOYREGUSERVALUES;

typedef struct joyreghwsettings_tag {
    DWORD dwFlags;
    DWORD dwNumButtons;
} JOYREGHWSETTINGS;
typedef struct joyreghwsettings_tag *LPJOYHWSETTINGS;

typedef struct joyreghwvalues_tag {
    JOYRANGE jrvHardware;
    DWORD dwPOVValues[4];
    DWORD dwCalFlags;
} JOYREGHWVALUES;
typedef struct joyreghwvalues_tag *LPJOYREGHWVALUES;

typedef struct joyreghwconfig_tag {
    JOYREGHWSETTINGS hws;
    DWORD dwUsageSettings;
    JOYREGHWVALUES hwv;
    DWORD dwType;
    DWORD dwReserved;
} JOYREGHWCONFIG;
typedef struct joyreghwconfig_tag *LPJOYREGHWCONFIG;

typedef struct joycalibrate_tag {
    UINT wXbase;
    UINT wXdelta;
    UINT wYbase;
    UINT wYdelta;
    UINT wZbase;
    UINT wZdelta;
} JOYCALIBRATE;
typedef struct joycalibrate_tag *LPJOYCALIBRATE;
#endif /* JOY_HW_NONE */
#ifndef DIJ_RINGZERO
#define MAX_JOYSTRING (256)

typedef WINBOOL (WINAPI *LPDIJOYTYPECALLBACK)(LPCWSTR, LPVOID);
#if 0
#define MAX_JOYSTICKOEMVXDNAME (260)

#endif
#ifndef MAX_JOYSTICKOEMVXDNAME
#define MAX_JOYSTICKOEMVXDNAME 260
#endif
#define DITC_REGHWSETTINGS 0x00000001
#define DITC_CLSIDCONFIG 0x00000002
#define DITC_DISPLAYNAME 0x00000004
#define DITC_CALLOUT 0x00000008
#define DITC_HARDWAREID 0x00000010
#define DITC_FLAGS1 0x00000020
#define DITC_FLAGS2 0x00000040
#define DITC_MAPFILE 0x00000080

typedef struct DIJOYTYPEINFO_DX5 {
    DWORD dwSize;
    JOYREGHWSETTINGS hws;
    CLSID clsidConfig;
    WCHAR wszDisplayName[256];
    WCHAR wszCallout[260];
} DIJOYTYPEINFO_DX5;
typedef struct DIJOYTYPEINFO_DX5 *LPDIJOYTYPEINFO_DX5;
typedef const DIJOYTYPEINFO_DX5 *LPCDIJOYTYPEINFO_DX5;

typedef struct DIJOYTYPEINFO_DX6 {
    DWORD dwSize;
    JOYREGHWSETTINGS hws;
    CLSID clsidConfig;
    WCHAR wszDisplayName[256];
    WCHAR wszCallout[260];
    WCHAR wszHardwareId[256];
    DWORD dwFlags1;
} DIJOYTYPEINFO_DX6;
typedef struct DIJOYTYPEINFO_DX6 *LPDIJOYTYPEINFO_DX6;
typedef const DIJOYTYPEINFO_DX6 *LPCDIJOYTYPEINFO_DX6;

typedef struct DIJOYTYPEINFO {
    DWORD dwSize;
    JOYREGHWSETTINGS hws;
    CLSID clsidConfig;
    WCHAR wszDisplayName[256];
    WCHAR wszCallout[260];
    WCHAR wszHardwareId[256];
    DWORD dwFlags1;
    DWORD dwFlags2;
    WCHAR wszMapFile[256];
} DIJOYTYPEINFO;
typedef struct DIJOYTYPEINFO *LPDIJOYTYPEINFO;
typedef const DIJOYTYPEINFO *LPCDIJOYTYPEINFO;
#define DIJC_GUIDINSTANCE 0x00000001
#define DIJC_REGHWCONFIGTYPE 0x00000002
#define DIJC_GAIN 0x00000004
#define DIJC_CALLOUT 0x00000008
#define DIJC_WDMGAMEPORT 0x00000010

typedef struct DIJOYCONFIG_DX5 {
    DWORD dwSize;
    GUID guidInstance;
    JOYREGHWCONFIG hwc;
    DWORD dwGain;
    WCHAR wszType[256];
    WCHAR wszCallout[256];
} DIJOYCONFIG_DX5;
typedef struct DIJOYCONFIG_DX5 *LPDIJOYCONFIG_DX5;
typedef const DIJOYCONFIG_DX5 *LPCDIJOYCONFIG_DX5;

typedef struct DIJOYCONFIG {
    DWORD dwSize;
    GUID guidInstance;
    JOYREGHWCONFIG hwc;
    DWORD dwGain;
    WCHAR wszType[256];
    WCHAR wszCallout[256];
    GUID guidGameport;
} DIJOYCONFIG;
typedef struct DIJOYCONFIG *LPDIJOYCONFIG;
typedef const DIJOYCONFIG *LPCDIJOYCONFIG;
#define DIJU_USERVALUES 0x00000001
#define DIJU_GLOBALDRIVER 0x00000002
#define DIJU_GAMEPORTEMULATOR 0x00000004

typedef struct DIJOYUSERVALUES {
    DWORD dwSize;
    JOYREGUSERVALUES ruv;
    WCHAR wszGlobalDriver[256];
    WCHAR wszGameportEmulator[256];
} DIJOYUSERVALUES;
typedef struct DIJOYUSERVALUES *LPDIJOYUSERVALUES;
typedef const DIJOYUSERVALUES *LPCDIJOYUSERVALUES;
DEFINE_GUID(GUID_KeyboardClass, 0x4d36e96b,0xe325,0x11ce,0xbf,0xc1,0x08,0x00,0x2b,0xe1,0x03,0x18);
DEFINE_GUID(GUID_MediaClass, 0x4d36e96c,0xe325,0x11ce,0xbf,0xc1,0x08,0x00,0x2b,0xe1,0x03,0x18);
DEFINE_GUID(GUID_MouseClass, 0x4d36e96f,0xe325,0x11ce,0xbf,0xc1,0x08,0x00,0x2b,0xe1,0x03,0x18);
DEFINE_GUID(GUID_HIDClass, 0x745a17a0,0x74d3,0x11d0,0xb6,0xfe,0x00,0xa0,0xc9,0x0f,0x57,0xda);

/*****************************************************************************
 * IDirectInputJoyConfig interface
 */
#ifndef __IDirectInputJoyConfig_INTERFACE_DEFINED__
#define __IDirectInputJoyConfig_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectInputJoyConfig, 0x1de12ab1, 0xc9f5, 0x11cf, 0xbf,0xc7, 0x44,0x45,0x53,0x54,0x00,0x00);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1de12ab1-c9f5-11cf-bfc7-444553540000")
IDirectInputJoyConfig : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Acquire(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unacquire(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCooperativeLevel(
        HWND a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendNotify(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumTypes(
        LPVOID a,
        LPVOID b) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
        LPCWSTR a,
        LPDIJOYTYPEINFO b,
        DWORD c) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTypeInfo(
        LPCWSTR a,
        LPCDIJOYTYPEINFO b,
        DWORD c) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteType(
        LPCWSTR a) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConfig(
        UINT a,
        LPDIJOYCONFIG b,
        DWORD c) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetConfig(
        UINT a,
        LPCDIJOYCONFIG b,
        DWORD c) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteConfig(
        UINT a) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserValues(
        LPDIJOYUSERVALUES a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUserValues(
        LPCDIJOYUSERVALUES a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddNewHardware(
        HWND a,
        REFGUID b) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenTypeKey(
        LPCWSTR a,
        DWORD b,
        HKEY *c) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenConfigKey(
        UINT a,
        DWORD b,
        HKEY *c) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectInputJoyConfig, 0x1de12ab1, 0xc9f5, 0x11cf, 0xbf,0xc7, 0x44,0x45,0x53,0x54,0x00,0x00)
#endif
#else
typedef struct IDirectInputJoyConfigVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDirectInputJoyConfig *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDirectInputJoyConfig *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDirectInputJoyConfig *This);

    /*** IDirectInputJoyConfig methods ***/
    HRESULT (STDMETHODCALLTYPE *Acquire)(
        IDirectInputJoyConfig *This);

    HRESULT (STDMETHODCALLTYPE *Unacquire)(
        IDirectInputJoyConfig *This);

    HRESULT (STDMETHODCALLTYPE *SetCooperativeLevel)(
        IDirectInputJoyConfig *This,
        HWND a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *SendNotify)(
        IDirectInputJoyConfig *This);

    HRESULT (STDMETHODCALLTYPE *EnumTypes)(
        IDirectInputJoyConfig *This,
        LPVOID a,
        LPVOID b);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDirectInputJoyConfig *This,
        LPCWSTR a,
        LPDIJOYTYPEINFO b,
        DWORD c);

    HRESULT (STDMETHODCALLTYPE *SetTypeInfo)(
        IDirectInputJoyConfig *This,
        LPCWSTR a,
        LPCDIJOYTYPEINFO b,
        DWORD c);

    HRESULT (STDMETHODCALLTYPE *DeleteType)(
        IDirectInputJoyConfig *This,
        LPCWSTR a);

    HRESULT (STDMETHODCALLTYPE *GetConfig)(
        IDirectInputJoyConfig *This,
        UINT a,
        LPDIJOYCONFIG b,
        DWORD c);

    HRESULT (STDMETHODCALLTYPE *SetConfig)(
        IDirectInputJoyConfig *This,
        UINT a,
        LPCDIJOYCONFIG b,
        DWORD c);

    HRESULT (STDMETHODCALLTYPE *DeleteConfig)(
        IDirectInputJoyConfig *This,
        UINT a);

    HRESULT (STDMETHODCALLTYPE *GetUserValues)(
        IDirectInputJoyConfig *This,
        LPDIJOYUSERVALUES a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *SetUserValues)(
        IDirectInputJoyConfig *This,
        LPCDIJOYUSERVALUES a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *AddNewHardware)(
        IDirectInputJoyConfig *This,
        HWND a,
        REFGUID b);

    HRESULT (STDMETHODCALLTYPE *OpenTypeKey)(
        IDirectInputJoyConfig *This,
        LPCWSTR a,
        DWORD b,
        HKEY *c);

    HRESULT (STDMETHODCALLTYPE *OpenConfigKey)(
        IDirectInputJoyConfig *This,
        UINT a,
        DWORD b,
        HKEY *c);

    END_INTERFACE
} IDirectInputJoyConfigVtbl;

interface IDirectInputJoyConfig {
    CONST_VTBL IDirectInputJoyConfigVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectInputJoyConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectInputJoyConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectInputJoyConfig_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectInputJoyConfig methods ***/
#define IDirectInputJoyConfig_Acquire(This) (This)->lpVtbl->Acquire(This)
#define IDirectInputJoyConfig_Unacquire(This) (This)->lpVtbl->Unacquire(This)
#define IDirectInputJoyConfig_SetCooperativeLevel(This,a,b) (This)->lpVtbl->SetCooperativeLevel(This,a,b)
#define IDirectInputJoyConfig_SendNotify(This) (This)->lpVtbl->SendNotify(This)
#define IDirectInputJoyConfig_EnumTypes(This,a,b) (This)->lpVtbl->EnumTypes(This,a,b)
#define IDirectInputJoyConfig_GetTypeInfo(This,a,b,c) (This)->lpVtbl->GetTypeInfo(This,a,b,c)
#define IDirectInputJoyConfig_SetTypeInfo(This,a,b,c) (This)->lpVtbl->SetTypeInfo(This,a,b,c)
#define IDirectInputJoyConfig_DeleteType(This,a) (This)->lpVtbl->DeleteType(This,a)
#define IDirectInputJoyConfig_GetConfig(This,a,b,c) (This)->lpVtbl->GetConfig(This,a,b,c)
#define IDirectInputJoyConfig_SetConfig(This,a,b,c) (This)->lpVtbl->SetConfig(This,a,b,c)
#define IDirectInputJoyConfig_DeleteConfig(This,a) (This)->lpVtbl->DeleteConfig(This,a)
#define IDirectInputJoyConfig_GetUserValues(This,a,b) (This)->lpVtbl->GetUserValues(This,a,b)
#define IDirectInputJoyConfig_SetUserValues(This,a,b) (This)->lpVtbl->SetUserValues(This,a,b)
#define IDirectInputJoyConfig_AddNewHardware(This,a,b) (This)->lpVtbl->AddNewHardware(This,a,b)
#define IDirectInputJoyConfig_OpenTypeKey(This,a,b,c) (This)->lpVtbl->OpenTypeKey(This,a,b,c)
#define IDirectInputJoyConfig_OpenConfigKey(This,a,b,c) (This)->lpVtbl->OpenConfigKey(This,a,b,c)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectInputJoyConfig_QueryInterface(IDirectInputJoyConfig* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectInputJoyConfig_AddRef(IDirectInputJoyConfig* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectInputJoyConfig_Release(IDirectInputJoyConfig* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectInputJoyConfig methods ***/
static FORCEINLINE HRESULT IDirectInputJoyConfig_Acquire(IDirectInputJoyConfig* This) {
    return This->lpVtbl->Acquire(This);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_Unacquire(IDirectInputJoyConfig* This) {
    return This->lpVtbl->Unacquire(This);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_SetCooperativeLevel(IDirectInputJoyConfig* This,HWND a,DWORD b) {
    return This->lpVtbl->SetCooperativeLevel(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_SendNotify(IDirectInputJoyConfig* This) {
    return This->lpVtbl->SendNotify(This);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_EnumTypes(IDirectInputJoyConfig* This,LPVOID a,LPVOID b) {
    return This->lpVtbl->EnumTypes(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_GetTypeInfo(IDirectInputJoyConfig* This,LPCWSTR a,LPDIJOYTYPEINFO b,DWORD c) {
    return This->lpVtbl->GetTypeInfo(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_SetTypeInfo(IDirectInputJoyConfig* This,LPCWSTR a,LPCDIJOYTYPEINFO b,DWORD c) {
    return This->lpVtbl->SetTypeInfo(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_DeleteType(IDirectInputJoyConfig* This,LPCWSTR a) {
    return This->lpVtbl->DeleteType(This,a);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_GetConfig(IDirectInputJoyConfig* This,UINT a,LPDIJOYCONFIG b,DWORD c) {
    return This->lpVtbl->GetConfig(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_SetConfig(IDirectInputJoyConfig* This,UINT a,LPCDIJOYCONFIG b,DWORD c) {
    return This->lpVtbl->SetConfig(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_DeleteConfig(IDirectInputJoyConfig* This,UINT a) {
    return This->lpVtbl->DeleteConfig(This,a);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_GetUserValues(IDirectInputJoyConfig* This,LPDIJOYUSERVALUES a,DWORD b) {
    return This->lpVtbl->GetUserValues(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_SetUserValues(IDirectInputJoyConfig* This,LPCDIJOYUSERVALUES a,DWORD b) {
    return This->lpVtbl->SetUserValues(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_AddNewHardware(IDirectInputJoyConfig* This,HWND a,REFGUID b) {
    return This->lpVtbl->AddNewHardware(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_OpenTypeKey(IDirectInputJoyConfig* This,LPCWSTR a,DWORD b,HKEY *c) {
    return This->lpVtbl->OpenTypeKey(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig_OpenConfigKey(IDirectInputJoyConfig* This,UINT a,DWORD b,HKEY *c) {
    return This->lpVtbl->OpenConfigKey(This,a,b,c);
}
#endif
#endif

#endif


#endif  /* __IDirectInputJoyConfig_INTERFACE_DEFINED__ */


/*****************************************************************************
 * IDirectInputJoyConfig8 interface
 */
#ifndef __IDirectInputJoyConfig8_INTERFACE_DEFINED__
#define __IDirectInputJoyConfig8_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectInputJoyConfig8, 0xeb0d7dfa, 0x1990, 0x4f27, 0xb4,0xd6, 0xed,0xf2,0xee,0xc4,0xa4,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eb0d7dfa-1990-4f27-b4d6-edf2eec4a44c")
IDirectInputJoyConfig8 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Acquire(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unacquire(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCooperativeLevel(
        HWND a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE SendNotify(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumTypes(
        LPVOID a,
        LPVOID b) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
        LPCWSTR a,
        LPDIJOYTYPEINFO b,
        DWORD c) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTypeInfo(
        LPCWSTR a,
        LPCDIJOYTYPEINFO b,
        DWORD c,
        LPWSTR d) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteType(
        LPCWSTR a) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConfig(
        UINT a,
        LPDIJOYCONFIG b,
        DWORD c) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetConfig(
        UINT a,
        LPCDIJOYCONFIG b,
        DWORD c) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteConfig(
        UINT a) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUserValues(
        LPDIJOYUSERVALUES a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUserValues(
        LPCDIJOYUSERVALUES a,
        DWORD b) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddNewHardware(
        HWND a,
        REFGUID b) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenTypeKey(
        LPCWSTR a,
        DWORD b,
        HKEY *c) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenAppStatusKey(
        HKEY *a) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectInputJoyConfig8, 0xeb0d7dfa, 0x1990, 0x4f27, 0xb4,0xd6, 0xed,0xf2,0xee,0xc4,0xa4,0x4c)
#endif
#else
typedef struct IDirectInputJoyConfig8Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDirectInputJoyConfig8 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDirectInputJoyConfig8 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDirectInputJoyConfig8 *This);

    /*** IDirectInputJoyConfig8 methods ***/
    HRESULT (STDMETHODCALLTYPE *Acquire)(
        IDirectInputJoyConfig8 *This);

    HRESULT (STDMETHODCALLTYPE *Unacquire)(
        IDirectInputJoyConfig8 *This);

    HRESULT (STDMETHODCALLTYPE *SetCooperativeLevel)(
        IDirectInputJoyConfig8 *This,
        HWND a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *SendNotify)(
        IDirectInputJoyConfig8 *This);

    HRESULT (STDMETHODCALLTYPE *EnumTypes)(
        IDirectInputJoyConfig8 *This,
        LPVOID a,
        LPVOID b);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDirectInputJoyConfig8 *This,
        LPCWSTR a,
        LPDIJOYTYPEINFO b,
        DWORD c);

    HRESULT (STDMETHODCALLTYPE *SetTypeInfo)(
        IDirectInputJoyConfig8 *This,
        LPCWSTR a,
        LPCDIJOYTYPEINFO b,
        DWORD c,
        LPWSTR d);

    HRESULT (STDMETHODCALLTYPE *DeleteType)(
        IDirectInputJoyConfig8 *This,
        LPCWSTR a);

    HRESULT (STDMETHODCALLTYPE *GetConfig)(
        IDirectInputJoyConfig8 *This,
        UINT a,
        LPDIJOYCONFIG b,
        DWORD c);

    HRESULT (STDMETHODCALLTYPE *SetConfig)(
        IDirectInputJoyConfig8 *This,
        UINT a,
        LPCDIJOYCONFIG b,
        DWORD c);

    HRESULT (STDMETHODCALLTYPE *DeleteConfig)(
        IDirectInputJoyConfig8 *This,
        UINT a);

    HRESULT (STDMETHODCALLTYPE *GetUserValues)(
        IDirectInputJoyConfig8 *This,
        LPDIJOYUSERVALUES a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *SetUserValues)(
        IDirectInputJoyConfig8 *This,
        LPCDIJOYUSERVALUES a,
        DWORD b);

    HRESULT (STDMETHODCALLTYPE *AddNewHardware)(
        IDirectInputJoyConfig8 *This,
        HWND a,
        REFGUID b);

    HRESULT (STDMETHODCALLTYPE *OpenTypeKey)(
        IDirectInputJoyConfig8 *This,
        LPCWSTR a,
        DWORD b,
        HKEY *c);

    HRESULT (STDMETHODCALLTYPE *OpenAppStatusKey)(
        IDirectInputJoyConfig8 *This,
        HKEY *a);

    END_INTERFACE
} IDirectInputJoyConfig8Vtbl;

interface IDirectInputJoyConfig8 {
    CONST_VTBL IDirectInputJoyConfig8Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectInputJoyConfig8_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectInputJoyConfig8_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectInputJoyConfig8_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectInputJoyConfig8 methods ***/
#define IDirectInputJoyConfig8_Acquire(This) (This)->lpVtbl->Acquire(This)
#define IDirectInputJoyConfig8_Unacquire(This) (This)->lpVtbl->Unacquire(This)
#define IDirectInputJoyConfig8_SetCooperativeLevel(This,a,b) (This)->lpVtbl->SetCooperativeLevel(This,a,b)
#define IDirectInputJoyConfig8_SendNotify(This) (This)->lpVtbl->SendNotify(This)
#define IDirectInputJoyConfig8_EnumTypes(This,a,b) (This)->lpVtbl->EnumTypes(This,a,b)
#define IDirectInputJoyConfig8_GetTypeInfo(This,a,b,c) (This)->lpVtbl->GetTypeInfo(This,a,b,c)
#define IDirectInputJoyConfig8_SetTypeInfo(This,a,b,c,d) (This)->lpVtbl->SetTypeInfo(This,a,b,c,d)
#define IDirectInputJoyConfig8_DeleteType(This,a) (This)->lpVtbl->DeleteType(This,a)
#define IDirectInputJoyConfig8_GetConfig(This,a,b,c) (This)->lpVtbl->GetConfig(This,a,b,c)
#define IDirectInputJoyConfig8_SetConfig(This,a,b,c) (This)->lpVtbl->SetConfig(This,a,b,c)
#define IDirectInputJoyConfig8_DeleteConfig(This,a) (This)->lpVtbl->DeleteConfig(This,a)
#define IDirectInputJoyConfig8_GetUserValues(This,a,b) (This)->lpVtbl->GetUserValues(This,a,b)
#define IDirectInputJoyConfig8_SetUserValues(This,a,b) (This)->lpVtbl->SetUserValues(This,a,b)
#define IDirectInputJoyConfig8_AddNewHardware(This,a,b) (This)->lpVtbl->AddNewHardware(This,a,b)
#define IDirectInputJoyConfig8_OpenTypeKey(This,a,b,c) (This)->lpVtbl->OpenTypeKey(This,a,b,c)
#define IDirectInputJoyConfig8_OpenAppStatusKey(This,a) (This)->lpVtbl->OpenAppStatusKey(This,a)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectInputJoyConfig8_QueryInterface(IDirectInputJoyConfig8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectInputJoyConfig8_AddRef(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectInputJoyConfig8_Release(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectInputJoyConfig8 methods ***/
static FORCEINLINE HRESULT IDirectInputJoyConfig8_Acquire(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->Acquire(This);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_Unacquire(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->Unacquire(This);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_SetCooperativeLevel(IDirectInputJoyConfig8* This,HWND a,DWORD b) {
    return This->lpVtbl->SetCooperativeLevel(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_SendNotify(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->SendNotify(This);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_EnumTypes(IDirectInputJoyConfig8* This,LPVOID a,LPVOID b) {
    return This->lpVtbl->EnumTypes(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_GetTypeInfo(IDirectInputJoyConfig8* This,LPCWSTR a,LPDIJOYTYPEINFO b,DWORD c) {
    return This->lpVtbl->GetTypeInfo(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_SetTypeInfo(IDirectInputJoyConfig8* This,LPCWSTR a,LPCDIJOYTYPEINFO b,DWORD c,LPWSTR d) {
    return This->lpVtbl->SetTypeInfo(This,a,b,c,d);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_DeleteType(IDirectInputJoyConfig8* This,LPCWSTR a) {
    return This->lpVtbl->DeleteType(This,a);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_GetConfig(IDirectInputJoyConfig8* This,UINT a,LPDIJOYCONFIG b,DWORD c) {
    return This->lpVtbl->GetConfig(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_SetConfig(IDirectInputJoyConfig8* This,UINT a,LPCDIJOYCONFIG b,DWORD c) {
    return This->lpVtbl->SetConfig(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_DeleteConfig(IDirectInputJoyConfig8* This,UINT a) {
    return This->lpVtbl->DeleteConfig(This,a);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_GetUserValues(IDirectInputJoyConfig8* This,LPDIJOYUSERVALUES a,DWORD b) {
    return This->lpVtbl->GetUserValues(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_SetUserValues(IDirectInputJoyConfig8* This,LPCDIJOYUSERVALUES a,DWORD b) {
    return This->lpVtbl->SetUserValues(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_AddNewHardware(IDirectInputJoyConfig8* This,HWND a,REFGUID b) {
    return This->lpVtbl->AddNewHardware(This,a,b);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_OpenTypeKey(IDirectInputJoyConfig8* This,LPCWSTR a,DWORD b,HKEY *c) {
    return This->lpVtbl->OpenTypeKey(This,a,b,c);
}
static FORCEINLINE HRESULT IDirectInputJoyConfig8_OpenAppStatusKey(IDirectInputJoyConfig8* This,HKEY *a) {
    return This->lpVtbl->OpenAppStatusKey(This,a);
}
#endif
#endif

#endif


#endif  /* __IDirectInputJoyConfig8_INTERFACE_DEFINED__ */

#endif /* DIJ_RINGZERO */
#define DIRECTINPUT_NOTIFICATION_MSGSTRINGA "DIRECTINPUT_NOTIFICATION_MSGSTRING"
#define DIRECTINPUT_NOTIFICATION_MSGSTRINGW L"DIRECTINPUT_NOTIFICATION_MSGSTRING"
#define DIRECTINPUT_NOTIFICATION_MSGSTRING __MINGW_NAME_AW(DIRECTINPUT_NOTIFICATION_MSGSTRING)
#define DIMSGWP_NEWAPPSTART 0x00000001
#define DIMSGWP_DX8APPSTART 0x00000002
#define DIMSGWP_DX8MAPPERAPPSTART 0x00000003
#define DIAPPIDFLAG_NOTIME 0x00000001
#define DIAPPIDFLAG_NOSIZE 0x00000002
#define DIRECTINPUT_REGSTR_VAL_APPIDFLAGA "AppIdFlag"
#define DIRECTINPUT_REGSTR_KEY_LASTAPPA "MostRecentApplication"
#define DIRECTINPUT_REGSTR_KEY_LASTMAPAPPA "MostRecentMapperApplication"
#define DIRECTINPUT_REGSTR_VAL_VERSIONA "Version"
#define DIRECTINPUT_REGSTR_VAL_NAMEA "Name"
#define DIRECTINPUT_REGSTR_VAL_IDA "Id"
#define DIRECTINPUT_REGSTR_VAL_MAPPERA "UsesMapper"
#define DIRECTINPUT_REGSTR_VAL_LASTSTARTA "MostRecentStart"
#define DIRECTINPUT_REGSTR_VAL_APPIDFLAGW L"AppIdFlag"
#define DIRECTINPUT_REGSTR_KEY_LASTAPPW L"MostRecentApplication"
#define DIRECTINPUT_REGSTR_KEY_LASTMAPAPPW L"MostRecentMapperApplication"
#define DIRECTINPUT_REGSTR_VAL_VERSIONW L"Version"
#define DIRECTINPUT_REGSTR_VAL_NAMEW L"Name"
#define DIRECTINPUT_REGSTR_VAL_IDW L"Id"
#define DIRECTINPUT_REGSTR_VAL_MAPPERW L"UsesMapper"
#define DIRECTINPUT_REGSTR_VAL_LASTSTARTW L"MostRecentStart"
#define DIRECTINPUT_REGSTR_VAL_APPIDFLAG __MINGW_NAME_AW(DIRECTINPUT_REGSTR_VAL_APPIDFLAG)
#define DIRECTINPUT_REGSTR_KEY_LASTAPP __MINGW_NAME_AW(DIRECTINPUT_REGSTR_KEY_LASTAPP)
#define DIRECTINPUT_REGSTR_KEY_LASTMAPAPP __MINGW_NAME_AW(DIRECTINPUT_REGSTR_KEY_LASTMAPAPP)
#define DIRECTINPUT_REGSTR_VAL_VERSION __MINGW_NAME_AW(DIRECTINPUT_REGSTR_VAL_VERSION)
#define DIRECTINPUT_REGSTR_VAL_NAME __MINGW_NAME_AW(DIRECTINPUT_REGSTR_VAL_NAME)
#define DIRECTINPUT_REGSTR_VAL_ID __MINGW_NAME_AW(DIRECTINPUT_REGSTR_VAL_ID)
#define DIRECTINPUT_REGSTR_VAL_MAPPER __MINGW_NAME_AW(DIRECTINPUT_REGSTR_VAL_MAPPER)
#define DIRECTINPUT_REGSTR_VAL_LASTSTART __MINGW_NAME_AW(DIRECTINPUT_REGSTR_VAL_LASTSTART)
#define DIERR_NOMOREITEMS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NO_MORE_ITEMS)
#define DIERR_DRIVERFIRST __MSABI_LONG(0x80040300)
#define DIERR_DRIVERLAST __MSABI_LONG(0x800403FF)
#define DIERR_INVALIDCLASSINSTALLER __MSABI_LONG(0x80040400)
#define DIERR_CANCELLED __MSABI_LONG(0x80040401)
#define DIERR_BADINF __MSABI_LONG(0x80040402)
#define DIDIFT_DELETE __MSABI_LONG(0x01000000)
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __dinputd_h__ */
