/*** Autogenerated by WIDL 7.7 from include/windows.gaming.input.custom.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 __windows_gaming_input_custom_h__
#define __windows_gaming_input_custom_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink ABI::Windows::Gaming::Input::Custom::IGameControllerInputSink
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IGameControllerInputSink;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider ABI::Windows::Gaming::Input::Custom::IGameControllerProvider
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IGameControllerProvider;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink ABI::Windows::Gaming::Input::Custom::IHidGameControllerInputSink
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IHidGameControllerInputSink;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider ABI::Windows::Gaming::Input::Custom::IHidGameControllerProvider
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IHidGameControllerProvider;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink ABI::Windows::Gaming::Input::Custom::IXusbGameControllerInputSink
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IXusbGameControllerInputSink;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider ABI::Windows::Gaming::Input::Custom::IXusbGameControllerProvider
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IXusbGameControllerProvider;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory ABI::Windows::Gaming::Input::Custom::ICustomGameControllerFactory
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface ICustomGameControllerFactory;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics ABI::Windows::Gaming::Input::Custom::IGameControllerFactoryManagerStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IGameControllerFactoryManagerStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 ABI::Windows::Gaming::Input::Custom::IGameControllerFactoryManagerStatics2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IGameControllerFactoryManagerStatics2;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerFactoryManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerFactoryManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    class GameControllerFactoryManager;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerFactoryManager __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerFactoryManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerFactoryManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CHidGameControllerProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CHidGameControllerProvider_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    class HidGameControllerProvider;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CHidGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CHidGameControllerProvider;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CCustom_CHidGameControllerProvider_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CXusbGameControllerProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CXusbGameControllerProvider_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    class XusbGameControllerProvider;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbGameControllerProvider;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGaming_CInput_CCustom_CXusbGameControllerProvider_FWD_DEFINED__ */

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.gaming.input.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceSubtype __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceSubtype;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceType __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceType;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerVersionInfo __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerVersionInfo;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    typedef struct GameControllerVersionInfo GameControllerVersionInfo;
                }
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink ABI::Windows::Gaming::Input::Custom::IGameControllerInputSink
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IGameControllerInputSink;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider ABI::Windows::Gaming::Input::Custom::IGameControllerProvider
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IGameControllerProvider;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink ABI::Windows::Gaming::Input::Custom::IHidGameControllerInputSink
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IHidGameControllerInputSink;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider ABI::Windows::Gaming::Input::Custom::IHidGameControllerProvider
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IHidGameControllerProvider;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink ABI::Windows::Gaming::Input::Custom::IXusbGameControllerInputSink
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IXusbGameControllerInputSink;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider ABI::Windows::Gaming::Input::Custom::IXusbGameControllerProvider
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IXusbGameControllerProvider;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory ABI::Windows::Gaming::Input::Custom::ICustomGameControllerFactory
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface ICustomGameControllerFactory;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics ABI::Windows::Gaming::Input::Custom::IGameControllerFactoryManagerStatics
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IGameControllerFactoryManagerStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 ABI::Windows::Gaming::Input::Custom::IGameControllerFactoryManagerStatics2
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    interface IGameControllerFactoryManagerStatics2;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    enum XusbDeviceSubtype {
                        XusbDeviceSubtype_Unknown = 0,
                        XusbDeviceSubtype_Gamepad = 1,
                        XusbDeviceSubtype_ArcadePad = 2,
                        XusbDeviceSubtype_ArcadeStick = 3,
                        XusbDeviceSubtype_FlightStick = 4,
                        XusbDeviceSubtype_Wheel = 5,
                        XusbDeviceSubtype_Guitar = 6,
                        XusbDeviceSubtype_GuitarAlternate = 7,
                        XusbDeviceSubtype_GuitarBass = 8,
                        XusbDeviceSubtype_DrumKit = 9,
                        XusbDeviceSubtype_DancePad = 10
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceSubtype {
    XusbDeviceSubtype_Unknown = 0,
    XusbDeviceSubtype_Gamepad = 1,
    XusbDeviceSubtype_ArcadePad = 2,
    XusbDeviceSubtype_ArcadeStick = 3,
    XusbDeviceSubtype_FlightStick = 4,
    XusbDeviceSubtype_Wheel = 5,
    XusbDeviceSubtype_Guitar = 6,
    XusbDeviceSubtype_GuitarAlternate = 7,
    XusbDeviceSubtype_GuitarBass = 8,
    XusbDeviceSubtype_DrumKit = 9,
    XusbDeviceSubtype_DancePad = 10
};
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define XusbDeviceSubtype __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceSubtype
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    enum XusbDeviceType {
                        XusbDeviceType_Unknown = 0,
                        XusbDeviceType_Gamepad = 1
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceType {
    XusbDeviceType_Unknown = 0,
    XusbDeviceType_Gamepad = 1
};
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define XusbDeviceType __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceType
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    struct GameControllerVersionInfo {
                        UINT16 Major;
                        UINT16 Minor;
                        UINT16 Build;
                        UINT16 Revision;
                    };
                }
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerVersionInfo {
    UINT16 Major;
    UINT16 Minor;
    UINT16 Build;
    UINT16 Revision;
};
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define GameControllerVersionInfo __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerVersionInfo
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
/*****************************************************************************
 * IGameControllerInputSink interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink, 0x1ff6f922, 0xc640, 0x4c78, 0xa8,0x20, 0x9a,0x71,0x5c,0x55,0x8b,0xcb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("1ff6f922-c640-4c78-a820-9a715c558bcb")
                    IGameControllerInputSink : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE OnInputResumed(
                            UINT64 timestamp) = 0;

                        virtual HRESULT STDMETHODCALLTYPE OnInputSuspended(
                            UINT64 timestamp) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink, 0x1ff6f922, 0xc640, 0x4c78, 0xa8,0x20, 0x9a,0x71,0x5c,0x55,0x8b,0xcb)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink *This,
        TrustLevel *trustLevel);

    /*** IGameControllerInputSink methods ***/
    HRESULT (STDMETHODCALLTYPE *OnInputResumed)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink *This,
        UINT64 timestamp);

    HRESULT (STDMETHODCALLTYPE *OnInputSuspended)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink *This,
        UINT64 timestamp);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSinkVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGameControllerInputSink methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_OnInputResumed(This,timestamp) (This)->lpVtbl->OnInputResumed(This,timestamp)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_OnInputSuspended(This,timestamp) (This)->lpVtbl->OnInputSuspended(This,timestamp)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGameControllerInputSink methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_OnInputResumed(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink* This,UINT64 timestamp) {
    return This->lpVtbl->OnInputResumed(This,timestamp);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_OnInputSuspended(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink* This,UINT64 timestamp) {
    return This->lpVtbl->OnInputSuspended(This,timestamp);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_IGameControllerInputSink IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink
#define IGameControllerInputSinkVtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSinkVtbl
#define IGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink
#define IGameControllerInputSink_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_QueryInterface
#define IGameControllerInputSink_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_AddRef
#define IGameControllerInputSink_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_Release
#define IGameControllerInputSink_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetIids
#define IGameControllerInputSink_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetRuntimeClassName
#define IGameControllerInputSink_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_GetTrustLevel
#define IGameControllerInputSink_OnInputResumed __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_OnInputResumed
#define IGameControllerInputSink_OnInputSuspended __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_OnInputSuspended
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerInputSink_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IGameControllerProvider interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider, 0xe6d73982, 0x2996, 0x4559, 0xb1,0x6c, 0x3e,0x57,0xd4,0x6e,0x58,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("e6d73982-2996-4559-b16c-3e57d46e58d6")
                    IGameControllerProvider : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_FirmwareVersionInfo(
                            struct GameControllerVersionInfo *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_HardwareProductId(
                            UINT16 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_HardwareVendorId(
                            UINT16 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_HardwareVersionInfo(
                            struct GameControllerVersionInfo *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_IsConnected(
                            boolean *value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider, 0xe6d73982, 0x2996, 0x4559, 0xb1,0x6c, 0x3e,0x57,0xd4,0x6e,0x58,0xd6)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *This,
        TrustLevel *trustLevel);

    /*** IGameControllerProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_FirmwareVersionInfo)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *This,
        struct __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerVersionInfo *value);

    HRESULT (STDMETHODCALLTYPE *get_HardwareProductId)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *This,
        UINT16 *value);

    HRESULT (STDMETHODCALLTYPE *get_HardwareVendorId)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *This,
        UINT16 *value);

    HRESULT (STDMETHODCALLTYPE *get_HardwareVersionInfo)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *This,
        struct __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerVersionInfo *value);

    HRESULT (STDMETHODCALLTYPE *get_IsConnected)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProviderVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGameControllerProvider methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_FirmwareVersionInfo(This,value) (This)->lpVtbl->get_FirmwareVersionInfo(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareProductId(This,value) (This)->lpVtbl->get_HardwareProductId(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareVendorId(This,value) (This)->lpVtbl->get_HardwareVendorId(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareVersionInfo(This,value) (This)->lpVtbl->get_HardwareVersionInfo(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_IsConnected(This,value) (This)->lpVtbl->get_IsConnected(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGameControllerProvider methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_FirmwareVersionInfo(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,struct __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerVersionInfo *value) {
    return This->lpVtbl->get_FirmwareVersionInfo(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareProductId(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,UINT16 *value) {
    return This->lpVtbl->get_HardwareProductId(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareVendorId(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,UINT16 *value) {
    return This->lpVtbl->get_HardwareVendorId(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareVersionInfo(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,struct __x_ABI_CWindows_CGaming_CInput_CCustom_CGameControllerVersionInfo *value) {
    return This->lpVtbl->get_HardwareVersionInfo(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_IsConnected(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider* This,boolean *value) {
    return This->lpVtbl->get_IsConnected(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_IGameControllerProvider IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider
#define IGameControllerProviderVtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProviderVtbl
#define IGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider
#define IGameControllerProvider_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_QueryInterface
#define IGameControllerProvider_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_AddRef
#define IGameControllerProvider_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_Release
#define IGameControllerProvider_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetIids
#define IGameControllerProvider_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetRuntimeClassName
#define IGameControllerProvider_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_GetTrustLevel
#define IGameControllerProvider_get_FirmwareVersionInfo __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_FirmwareVersionInfo
#define IGameControllerProvider_get_HardwareProductId __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareProductId
#define IGameControllerProvider_get_HardwareVendorId __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareVendorId
#define IGameControllerProvider_get_HardwareVersionInfo __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_HardwareVersionInfo
#define IGameControllerProvider_get_IsConnected __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_get_IsConnected
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IHidGameControllerInputSink interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink, 0xf754c322, 0x182d, 0x40e4, 0xa1,0x26, 0xfc,0xee,0x4f,0xfa,0x1e,0x31);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("f754c322-182d-40e4-a126-fcee4ffa1e31")
                    IHidGameControllerInputSink : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE OnInputReportReceived(
                            UINT64 timestamp,
                            BYTE id,
                            UINT32 report_len,
                            BYTE *report_buf) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink, 0xf754c322, 0x182d, 0x40e4, 0xa1,0x26, 0xfc,0xee,0x4f,0xfa,0x1e,0x31)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink *This,
        TrustLevel *trustLevel);

    /*** IHidGameControllerInputSink methods ***/
    HRESULT (STDMETHODCALLTYPE *OnInputReportReceived)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink *This,
        UINT64 timestamp,
        BYTE id,
        UINT32 report_len,
        BYTE *report_buf);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSinkVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHidGameControllerInputSink methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_OnInputReportReceived(This,timestamp,id,report_len,report_buf) (This)->lpVtbl->OnInputReportReceived(This,timestamp,id,report_len,report_buf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHidGameControllerInputSink methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_OnInputReportReceived(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink* This,UINT64 timestamp,BYTE id,UINT32 report_len,BYTE *report_buf) {
    return This->lpVtbl->OnInputReportReceived(This,timestamp,id,report_len,report_buf);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_IHidGameControllerInputSink IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink
#define IHidGameControllerInputSinkVtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSinkVtbl
#define IHidGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink
#define IHidGameControllerInputSink_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_QueryInterface
#define IHidGameControllerInputSink_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_AddRef
#define IHidGameControllerInputSink_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_Release
#define IHidGameControllerInputSink_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetIids
#define IHidGameControllerInputSink_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetRuntimeClassName
#define IHidGameControllerInputSink_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_GetTrustLevel
#define IHidGameControllerInputSink_OnInputReportReceived __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_OnInputReportReceived
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerInputSink_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IHidGameControllerProvider interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider, 0x95ce3af4, 0xabf0, 0x4b68, 0xa0,0x81, 0x3b,0x7d,0xe7,0x3f,0xf0,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("95ce3af4-abf0-4b68-a081-3b7de73ff0e7")
                    IHidGameControllerProvider : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_UsageId(
                            UINT16 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_UsagePage(
                            UINT16 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetFeatureReport(
                            BYTE id,
                            UINT32 report_len,
                            BYTE *report_buf) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SendFeatureReport(
                            BYTE id,
                            UINT32 report_len,
                            BYTE *report_buf) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SendOutputReport(
                            BYTE id,
                            UINT32 report_len,
                            BYTE *report_buf) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider, 0x95ce3af4, 0xabf0, 0x4b68, 0xa0,0x81, 0x3b,0x7d,0xe7,0x3f,0xf0,0xe7)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider *This,
        TrustLevel *trustLevel);

    /*** IHidGameControllerProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UsageId)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider *This,
        UINT16 *value);

    HRESULT (STDMETHODCALLTYPE *get_UsagePage)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider *This,
        UINT16 *value);

    HRESULT (STDMETHODCALLTYPE *GetFeatureReport)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider *This,
        BYTE id,
        UINT32 report_len,
        BYTE *report_buf);

    HRESULT (STDMETHODCALLTYPE *SendFeatureReport)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider *This,
        BYTE id,
        UINT32 report_len,
        BYTE *report_buf);

    HRESULT (STDMETHODCALLTYPE *SendOutputReport)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider *This,
        BYTE id,
        UINT32 report_len,
        BYTE *report_buf);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProviderVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHidGameControllerProvider methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_get_UsageId(This,value) (This)->lpVtbl->get_UsageId(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_get_UsagePage(This,value) (This)->lpVtbl->get_UsagePage(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetFeatureReport(This,id,report_len,report_buf) (This)->lpVtbl->GetFeatureReport(This,id,report_len,report_buf)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_SendFeatureReport(This,id,report_len,report_buf) (This)->lpVtbl->SendFeatureReport(This,id,report_len,report_buf)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_SendOutputReport(This,id,report_len,report_buf) (This)->lpVtbl->SendOutputReport(This,id,report_len,report_buf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHidGameControllerProvider methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_get_UsageId(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,UINT16 *value) {
    return This->lpVtbl->get_UsageId(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_get_UsagePage(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,UINT16 *value) {
    return This->lpVtbl->get_UsagePage(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetFeatureReport(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,BYTE id,UINT32 report_len,BYTE *report_buf) {
    return This->lpVtbl->GetFeatureReport(This,id,report_len,report_buf);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_SendFeatureReport(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,BYTE id,UINT32 report_len,BYTE *report_buf) {
    return This->lpVtbl->SendFeatureReport(This,id,report_len,report_buf);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_SendOutputReport(__x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider* This,BYTE id,UINT32 report_len,BYTE *report_buf) {
    return This->lpVtbl->SendOutputReport(This,id,report_len,report_buf);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_IHidGameControllerProvider IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider
#define IHidGameControllerProviderVtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProviderVtbl
#define IHidGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider
#define IHidGameControllerProvider_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_QueryInterface
#define IHidGameControllerProvider_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_AddRef
#define IHidGameControllerProvider_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_Release
#define IHidGameControllerProvider_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetIids
#define IHidGameControllerProvider_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetRuntimeClassName
#define IHidGameControllerProvider_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetTrustLevel
#define IHidGameControllerProvider_get_UsageId __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_get_UsageId
#define IHidGameControllerProvider_get_UsagePage __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_get_UsagePage
#define IHidGameControllerProvider_GetFeatureReport __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_GetFeatureReport
#define IHidGameControllerProvider_SendFeatureReport __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_SendFeatureReport
#define IHidGameControllerProvider_SendOutputReport __x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_SendOutputReport
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CIHidGameControllerProvider_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IXusbGameControllerInputSink interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink, 0xb2ac1d95, 0x6ecb, 0x42b3, 0x8a,0xab, 0x02,0x54,0x01,0xca,0x47,0x12);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("b2ac1d95-6ecb-42b3-8aab-025401ca4712")
                    IXusbGameControllerInputSink : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE OnInputReceived(
                            UINT64 timestamp,
                            BYTE id,
                            UINT32 report_len,
                            BYTE *report_buf) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink, 0xb2ac1d95, 0x6ecb, 0x42b3, 0x8a,0xab, 0x02,0x54,0x01,0xca,0x47,0x12)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink *This,
        TrustLevel *trustLevel);

    /*** IXusbGameControllerInputSink methods ***/
    HRESULT (STDMETHODCALLTYPE *OnInputReceived)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink *This,
        UINT64 timestamp,
        BYTE id,
        UINT32 report_len,
        BYTE *report_buf);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSinkVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXusbGameControllerInputSink methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_OnInputReceived(This,timestamp,id,report_len,report_buf) (This)->lpVtbl->OnInputReceived(This,timestamp,id,report_len,report_buf)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXusbGameControllerInputSink methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_OnInputReceived(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink* This,UINT64 timestamp,BYTE id,UINT32 report_len,BYTE *report_buf) {
    return This->lpVtbl->OnInputReceived(This,timestamp,id,report_len,report_buf);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_IXusbGameControllerInputSink IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink
#define IXusbGameControllerInputSinkVtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSinkVtbl
#define IXusbGameControllerInputSink __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink
#define IXusbGameControllerInputSink_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_QueryInterface
#define IXusbGameControllerInputSink_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_AddRef
#define IXusbGameControllerInputSink_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_Release
#define IXusbGameControllerInputSink_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetIids
#define IXusbGameControllerInputSink_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetRuntimeClassName
#define IXusbGameControllerInputSink_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_GetTrustLevel
#define IXusbGameControllerInputSink_OnInputReceived __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_OnInputReceived
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerInputSink_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IXusbGameControllerProvider interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider, 0x6e2971eb, 0x0efb, 0x48b4, 0x80,0x8b, 0x83,0x76,0x43,0xb2,0xf2,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("6e2971eb-0efb-48b4-808b-837643b2f216")
                    IXusbGameControllerProvider : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE SetVibration(
                            DOUBLE rumble_intensity,
                            DOUBLE buzz_intensity) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider, 0x6e2971eb, 0x0efb, 0x48b4, 0x80,0x8b, 0x83,0x76,0x43,0xb2,0xf2,0x16)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider *This,
        TrustLevel *trustLevel);

    /*** IXusbGameControllerProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *SetVibration)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider *This,
        DOUBLE rumble_intensity,
        DOUBLE buzz_intensity);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProviderVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXusbGameControllerProvider methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_SetVibration(This,rumble_intensity,buzz_intensity) (This)->lpVtbl->SetVibration(This,rumble_intensity,buzz_intensity)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXusbGameControllerProvider methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_SetVibration(__x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider* This,DOUBLE rumble_intensity,DOUBLE buzz_intensity) {
    return This->lpVtbl->SetVibration(This,rumble_intensity,buzz_intensity);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_IXusbGameControllerProvider IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider
#define IXusbGameControllerProviderVtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProviderVtbl
#define IXusbGameControllerProvider __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider
#define IXusbGameControllerProvider_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_QueryInterface
#define IXusbGameControllerProvider_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_AddRef
#define IXusbGameControllerProvider_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_Release
#define IXusbGameControllerProvider_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetIids
#define IXusbGameControllerProvider_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetRuntimeClassName
#define IXusbGameControllerProvider_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_GetTrustLevel
#define IXusbGameControllerProvider_SetVibration __x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_SetVibration
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CIXusbGameControllerProvider_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ICustomGameControllerFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory, 0x69a0ae5e, 0x758e, 0x4cbe, 0xac,0xe6, 0x62,0x15,0x5f,0xe9,0x12,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("69a0ae5e-758e-4cbe-ace6-62155fe9126f")
                    ICustomGameControllerFactory : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE CreateGameController(
                            ABI::Windows::Gaming::Input::Custom::IGameControllerProvider *provider,
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE OnGameControllerAdded(
                            ABI::Windows::Gaming::Input::IGameController *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE OnGameControllerRemoved(
                            ABI::Windows::Gaming::Input::IGameController *value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory, 0x69a0ae5e, 0x758e, 0x4cbe, 0xac,0xe6, 0x62,0x15,0x5f,0xe9,0x12,0x6f)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *This,
        TrustLevel *trustLevel);

    /*** ICustomGameControllerFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateGameController)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *This,
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *provider,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *OnGameControllerAdded)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *value);

    HRESULT (STDMETHODCALLTYPE *OnGameControllerRemoved)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *This,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactoryVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICustomGameControllerFactory methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_CreateGameController(This,provider,value) (This)->lpVtbl->CreateGameController(This,provider,value)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_OnGameControllerAdded(This,value) (This)->lpVtbl->OnGameControllerAdded(This,value)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_OnGameControllerRemoved(This,value) (This)->lpVtbl->OnGameControllerRemoved(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICustomGameControllerFactory methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_CreateGameController(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This,__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerProvider *provider,IInspectable **value) {
    return This->lpVtbl->CreateGameController(This,provider,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_OnGameControllerAdded(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *value) {
    return This->lpVtbl->OnGameControllerAdded(This,value);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_OnGameControllerRemoved(__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory* This,__x_ABI_CWindows_CGaming_CInput_CIGameController *value) {
    return This->lpVtbl->OnGameControllerRemoved(This,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_ICustomGameControllerFactory IID___x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory
#define ICustomGameControllerFactoryVtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactoryVtbl
#define ICustomGameControllerFactory __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory
#define ICustomGameControllerFactory_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_QueryInterface
#define ICustomGameControllerFactory_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_AddRef
#define ICustomGameControllerFactory_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_Release
#define ICustomGameControllerFactory_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetIids
#define ICustomGameControllerFactory_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetRuntimeClassName
#define ICustomGameControllerFactory_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_GetTrustLevel
#define ICustomGameControllerFactory_CreateGameController __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_CreateGameController
#define ICustomGameControllerFactory_OnGameControllerAdded __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_OnGameControllerAdded
#define ICustomGameControllerFactory_OnGameControllerRemoved __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_OnGameControllerRemoved
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IGameControllerFactoryManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics, 0x36cb66e3, 0xd0a1, 0x4986, 0xa2,0x4c, 0x40,0xb1,0x37,0xde,0xba,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("36cb66e3-d0a1-4986-a24c-40b137deba9e")
                    IGameControllerFactoryManagerStatics : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE RegisterCustomFactoryForGipInterface(
                            ABI::Windows::Gaming::Input::Custom::ICustomGameControllerFactory *factory,
                            GUID interfaceId) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RegisterCustomFactoryForHardwareId(
                            ABI::Windows::Gaming::Input::Custom::ICustomGameControllerFactory *factory,
                            UINT16 vendor_id,
                            UINT16 product_id) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RegisterCustomFactoryForXusbType(
                            ABI::Windows::Gaming::Input::Custom::ICustomGameControllerFactory *factory,
                            enum XusbDeviceType type,
                            enum XusbDeviceSubtype subtype) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics, 0x36cb66e3, 0xd0a1, 0x4986, 0xa2,0x4c, 0x40,0xb1,0x37,0xde,0xba,0x9e)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics *This,
        TrustLevel *trustLevel);

    /*** IGameControllerFactoryManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterCustomFactoryForGipInterface)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics *This,
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *factory,
        GUID interfaceId);

    HRESULT (STDMETHODCALLTYPE *RegisterCustomFactoryForHardwareId)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics *This,
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *factory,
        UINT16 vendor_id,
        UINT16 product_id);

    HRESULT (STDMETHODCALLTYPE *RegisterCustomFactoryForXusbType)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics *This,
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *factory,
        enum __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceType type,
        enum __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceSubtype subtype);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStaticsVtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGameControllerFactoryManagerStatics methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForGipInterface(This,factory,interfaceId) (This)->lpVtbl->RegisterCustomFactoryForGipInterface(This,factory,interfaceId)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForHardwareId(This,factory,vendor_id,product_id) (This)->lpVtbl->RegisterCustomFactoryForHardwareId(This,factory,vendor_id,product_id)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForXusbType(This,factory,type,subtype) (This)->lpVtbl->RegisterCustomFactoryForXusbType(This,factory,type,subtype)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGameControllerFactoryManagerStatics methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForGipInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This,__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *factory,GUID interfaceId) {
    return This->lpVtbl->RegisterCustomFactoryForGipInterface(This,factory,interfaceId);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForHardwareId(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This,__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *factory,UINT16 vendor_id,UINT16 product_id) {
    return This->lpVtbl->RegisterCustomFactoryForHardwareId(This,factory,vendor_id,product_id);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForXusbType(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics* This,__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *factory,enum __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceType type,enum __x_ABI_CWindows_CGaming_CInput_CCustom_CXusbDeviceSubtype subtype) {
    return This->lpVtbl->RegisterCustomFactoryForXusbType(This,factory,type,subtype);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_IGameControllerFactoryManagerStatics IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics
#define IGameControllerFactoryManagerStaticsVtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStaticsVtbl
#define IGameControllerFactoryManagerStatics __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics
#define IGameControllerFactoryManagerStatics_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_QueryInterface
#define IGameControllerFactoryManagerStatics_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_AddRef
#define IGameControllerFactoryManagerStatics_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_Release
#define IGameControllerFactoryManagerStatics_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetIids
#define IGameControllerFactoryManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetRuntimeClassName
#define IGameControllerFactoryManagerStatics_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_GetTrustLevel
#define IGameControllerFactoryManagerStatics_RegisterCustomFactoryForGipInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForGipInterface
#define IGameControllerFactoryManagerStatics_RegisterCustomFactoryForHardwareId __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForHardwareId
#define IGameControllerFactoryManagerStatics_RegisterCustomFactoryForXusbType __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_RegisterCustomFactoryForXusbType
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IGameControllerFactoryManagerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2, 0xeace5644, 0x19df, 0x4115, 0xb3,0x2a, 0x27,0x93,0xe2,0xae,0xa3,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Gaming {
            namespace Input {
                namespace Custom {
                    MIDL_INTERFACE("eace5644-19df-4115-b32a-2793e2aea3bb")
                    IGameControllerFactoryManagerStatics2 : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE TryGetFactoryControllerFromGameController(
                            ABI::Windows::Gaming::Input::Custom::ICustomGameControllerFactory *factory,
                            ABI::Windows::Gaming::Input::IGameController *controller,
                            ABI::Windows::Gaming::Input::IGameController **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2, 0xeace5644, 0x19df, 0x4115, 0xb3,0x2a, 0x27,0x93,0xe2,0xae,0xa3,0xbb)
#endif
#else
typedef struct __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 *This,
        TrustLevel *trustLevel);

    /*** IGameControllerFactoryManagerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *TryGetFactoryControllerFromGameController)(
        __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 *This,
        __x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *factory,
        __x_ABI_CWindows_CGaming_CInput_CIGameController *controller,
        __x_ABI_CWindows_CGaming_CInput_CIGameController **value);

    END_INTERFACE
} __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2Vtbl;

interface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGameControllerFactoryManagerStatics2 methods ***/
#define __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_TryGetFactoryControllerFromGameController(This,factory,controller,value) (This)->lpVtbl->TryGetFactoryControllerFromGameController(This,factory,controller,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_QueryInterface(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_AddRef(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_Release(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetIids(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetTrustLevel(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGameControllerFactoryManagerStatics2 methods ***/
static FORCEINLINE HRESULT __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_TryGetFactoryControllerFromGameController(__x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2* This,__x_ABI_CWindows_CGaming_CInput_CCustom_CICustomGameControllerFactory *factory,__x_ABI_CWindows_CGaming_CInput_CIGameController *controller,__x_ABI_CWindows_CGaming_CInput_CIGameController **value) {
    return This->lpVtbl->TryGetFactoryControllerFromGameController(This,factory,controller,value);
}
#endif
#ifdef WIDL_using_Windows_Gaming_Input_Custom
#define IID_IGameControllerFactoryManagerStatics2 IID___x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2
#define IGameControllerFactoryManagerStatics2Vtbl __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2Vtbl
#define IGameControllerFactoryManagerStatics2 __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2
#define IGameControllerFactoryManagerStatics2_QueryInterface __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_QueryInterface
#define IGameControllerFactoryManagerStatics2_AddRef __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_AddRef
#define IGameControllerFactoryManagerStatics2_Release __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_Release
#define IGameControllerFactoryManagerStatics2_GetIids __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetIids
#define IGameControllerFactoryManagerStatics2_GetRuntimeClassName __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetRuntimeClassName
#define IGameControllerFactoryManagerStatics2_GetTrustLevel __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_GetTrustLevel
#define IGameControllerFactoryManagerStatics2_TryGetFactoryControllerFromGameController __x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_TryGetFactoryControllerFromGameController
#endif /* WIDL_using_Windows_Gaming_Input_Custom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGaming_CInput_CCustom_CIGameControllerFactoryManagerStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.Gaming.Input.Custom.GameControllerFactoryManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_Custom_GameControllerFactoryManager_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_Custom_GameControllerFactoryManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_Custom_GameControllerFactoryManager[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','C','u','s','t','o','m','.','G','a','m','e','C','o','n','t','r','o','l','l','e','r','F','a','c','t','o','r','y','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Custom_GameControllerFactoryManager[] = L"Windows.Gaming.Input.Custom.GameControllerFactoryManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Custom_GameControllerFactoryManager[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','C','u','s','t','o','m','.','G','a','m','e','C','o','n','t','r','o','l','l','e','r','F','a','c','t','o','r','y','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_Custom_GameControllerFactoryManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.Gaming.Input.Custom.HidGameControllerProvider
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_Custom_HidGameControllerProvider_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_Custom_HidGameControllerProvider_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_Custom_HidGameControllerProvider[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','C','u','s','t','o','m','.','H','i','d','G','a','m','e','C','o','n','t','r','o','l','l','e','r','P','r','o','v','i','d','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Custom_HidGameControllerProvider[] = L"Windows.Gaming.Input.Custom.HidGameControllerProvider";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Custom_HidGameControllerProvider[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','C','u','s','t','o','m','.','H','i','d','G','a','m','e','C','o','n','t','r','o','l','l','e','r','P','r','o','v','i','d','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_Custom_HidGameControllerProvider_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.Gaming.Input.Custom.XusbGameControllerProvider
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_Gaming_Input_Custom_XusbGameControllerProvider_DEFINED
#define RUNTIMECLASS_Windows_Gaming_Input_Custom_XusbGameControllerProvider_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Gaming_Input_Custom_XusbGameControllerProvider[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','C','u','s','t','o','m','.','X','u','s','b','G','a','m','e','C','o','n','t','r','o','l','l','e','r','P','r','o','v','i','d','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Custom_XusbGameControllerProvider[] = L"Windows.Gaming.Input.Custom.XusbGameControllerProvider";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Gaming_Input_Custom_XusbGameControllerProvider[] = {'W','i','n','d','o','w','s','.','G','a','m','i','n','g','.','I','n','p','u','t','.','C','u','s','t','o','m','.','X','u','s','b','G','a','m','e','C','o','n','t','r','o','l','l','e','r','P','r','o','v','i','d','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Gaming_Input_Custom_XusbGameControllerProvider_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_gaming_input_custom_h__ */
