/*** Autogenerated by WIDL 5.0-rc1 from 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__ */
