/*** Autogenerated by WIDL 9.5 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__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* 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 __WIDL_INLINE HRESULT IDirectInputEffectDriver_QueryInterface(IDirectInputEffectDriver* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectInputEffectDriver_AddRef(IDirectInputEffectDriver* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectInputEffectDriver_Release(IDirectInputEffectDriver* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectInputEffectDriver methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDirectInputEffectDriver_GetVersions(IDirectInputEffectDriver* This,LPDIDRIVERVERSIONS a) {
    return This->lpVtbl->GetVersions(This,a);
}
static __WIDL_INLINE HRESULT IDirectInputEffectDriver_Escape(IDirectInputEffectDriver* This,DWORD a,DWORD b,LPDIEFFESCAPE c) {
    return This->lpVtbl->Escape(This,a,b,c);
}
static __WIDL_INLINE HRESULT IDirectInputEffectDriver_SetGain(IDirectInputEffectDriver* This,DWORD a,DWORD b) {
    return This->lpVtbl->SetGain(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputEffectDriver_SendForceFeedbackCommand(IDirectInputEffectDriver* This,DWORD a,DWORD b) {
    return This->lpVtbl->SendForceFeedbackCommand(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputEffectDriver_GetForceFeedbackState(IDirectInputEffectDriver* This,DWORD a,LPDIDEVICESTATE b) {
    return This->lpVtbl->GetForceFeedbackState(This,a,b);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDirectInputEffectDriver_DestroyEffect(IDirectInputEffectDriver* This,DWORD a,DWORD b) {
    return This->lpVtbl->DestroyEffect(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputEffectDriver_StartEffect(IDirectInputEffectDriver* This,DWORD a,DWORD b,DWORD c,DWORD d) {
    return This->lpVtbl->StartEffect(This,a,b,c,d);
}
static __WIDL_INLINE HRESULT IDirectInputEffectDriver_StopEffect(IDirectInputEffectDriver* This,DWORD a,DWORD b) {
    return This->lpVtbl->StopEffect(This,a,b);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDirectInputJoyConfig_QueryInterface(IDirectInputJoyConfig* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectInputJoyConfig_AddRef(IDirectInputJoyConfig* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectInputJoyConfig_Release(IDirectInputJoyConfig* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectInputJoyConfig methods ***/
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_Acquire(IDirectInputJoyConfig* This) {
    return This->lpVtbl->Acquire(This);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_Unacquire(IDirectInputJoyConfig* This) {
    return This->lpVtbl->Unacquire(This);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_SetCooperativeLevel(IDirectInputJoyConfig* This,HWND a,DWORD b) {
    return This->lpVtbl->SetCooperativeLevel(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_SendNotify(IDirectInputJoyConfig* This) {
    return This->lpVtbl->SendNotify(This);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_EnumTypes(IDirectInputJoyConfig* This,LPVOID a,LPVOID b) {
    return This->lpVtbl->EnumTypes(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_GetTypeInfo(IDirectInputJoyConfig* This,LPCWSTR a,LPDIJOYTYPEINFO b,DWORD c) {
    return This->lpVtbl->GetTypeInfo(This,a,b,c);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_SetTypeInfo(IDirectInputJoyConfig* This,LPCWSTR a,LPCDIJOYTYPEINFO b,DWORD c) {
    return This->lpVtbl->SetTypeInfo(This,a,b,c);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_DeleteType(IDirectInputJoyConfig* This,LPCWSTR a) {
    return This->lpVtbl->DeleteType(This,a);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_GetConfig(IDirectInputJoyConfig* This,UINT a,LPDIJOYCONFIG b,DWORD c) {
    return This->lpVtbl->GetConfig(This,a,b,c);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_SetConfig(IDirectInputJoyConfig* This,UINT a,LPCDIJOYCONFIG b,DWORD c) {
    return This->lpVtbl->SetConfig(This,a,b,c);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_DeleteConfig(IDirectInputJoyConfig* This,UINT a) {
    return This->lpVtbl->DeleteConfig(This,a);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_GetUserValues(IDirectInputJoyConfig* This,LPDIJOYUSERVALUES a,DWORD b) {
    return This->lpVtbl->GetUserValues(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_SetUserValues(IDirectInputJoyConfig* This,LPCDIJOYUSERVALUES a,DWORD b) {
    return This->lpVtbl->SetUserValues(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_AddNewHardware(IDirectInputJoyConfig* This,HWND a,REFGUID b) {
    return This->lpVtbl->AddNewHardware(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig_OpenTypeKey(IDirectInputJoyConfig* This,LPCWSTR a,DWORD b,HKEY *c) {
    return This->lpVtbl->OpenTypeKey(This,a,b,c);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDirectInputJoyConfig8_QueryInterface(IDirectInputJoyConfig8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDirectInputJoyConfig8_AddRef(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDirectInputJoyConfig8_Release(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectInputJoyConfig8 methods ***/
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_Acquire(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->Acquire(This);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_Unacquire(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->Unacquire(This);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_SetCooperativeLevel(IDirectInputJoyConfig8* This,HWND a,DWORD b) {
    return This->lpVtbl->SetCooperativeLevel(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_SendNotify(IDirectInputJoyConfig8* This) {
    return This->lpVtbl->SendNotify(This);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_EnumTypes(IDirectInputJoyConfig8* This,LPVOID a,LPVOID b) {
    return This->lpVtbl->EnumTypes(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_GetTypeInfo(IDirectInputJoyConfig8* This,LPCWSTR a,LPDIJOYTYPEINFO b,DWORD c) {
    return This->lpVtbl->GetTypeInfo(This,a,b,c);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_SetTypeInfo(IDirectInputJoyConfig8* This,LPCWSTR a,LPCDIJOYTYPEINFO b,DWORD c,LPWSTR d) {
    return This->lpVtbl->SetTypeInfo(This,a,b,c,d);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_DeleteType(IDirectInputJoyConfig8* This,LPCWSTR a) {
    return This->lpVtbl->DeleteType(This,a);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_GetConfig(IDirectInputJoyConfig8* This,UINT a,LPDIJOYCONFIG b,DWORD c) {
    return This->lpVtbl->GetConfig(This,a,b,c);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_SetConfig(IDirectInputJoyConfig8* This,UINT a,LPCDIJOYCONFIG b,DWORD c) {
    return This->lpVtbl->SetConfig(This,a,b,c);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_DeleteConfig(IDirectInputJoyConfig8* This,UINT a) {
    return This->lpVtbl->DeleteConfig(This,a);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_GetUserValues(IDirectInputJoyConfig8* This,LPDIJOYUSERVALUES a,DWORD b) {
    return This->lpVtbl->GetUserValues(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_SetUserValues(IDirectInputJoyConfig8* This,LPCDIJOYUSERVALUES a,DWORD b) {
    return This->lpVtbl->SetUserValues(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_AddNewHardware(IDirectInputJoyConfig8* This,HWND a,REFGUID b) {
    return This->lpVtbl->AddNewHardware(This,a,b);
}
static __WIDL_INLINE HRESULT IDirectInputJoyConfig8_OpenTypeKey(IDirectInputJoyConfig8* This,LPCWSTR a,DWORD b,HKEY *c) {
    return This->lpVtbl->OpenTypeKey(This,a,b,c);
}
static __WIDL_INLINE 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__ */
