/*** Autogenerated by WIDL 6.0-rc3 from include/wbemprov.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 __wbemprov_h__
#define __wbemprov_h__

/* Forward declarations */

#ifndef __WbemAdministrativeLocator_FWD_DEFINED__
#define __WbemAdministrativeLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemAdministrativeLocator WbemAdministrativeLocator;
#else
typedef struct WbemAdministrativeLocator WbemAdministrativeLocator;
#endif /* defined __cplusplus */
#endif /* defined __WbemAdministrativeLocator_FWD_DEFINED__ */

#ifndef __WbemAuthenticatedLocator_FWD_DEFINED__
#define __WbemAuthenticatedLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemAuthenticatedLocator WbemAuthenticatedLocator;
#else
typedef struct WbemAuthenticatedLocator WbemAuthenticatedLocator;
#endif /* defined __cplusplus */
#endif /* defined __WbemAuthenticatedLocator_FWD_DEFINED__ */

#ifndef __WbemUnauthenticatedLocator_FWD_DEFINED__
#define __WbemUnauthenticatedLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemUnauthenticatedLocator WbemUnauthenticatedLocator;
#else
typedef struct WbemUnauthenticatedLocator WbemUnauthenticatedLocator;
#endif /* defined __cplusplus */
#endif /* defined __WbemUnauthenticatedLocator_FWD_DEFINED__ */

#ifndef __WbemDecoupledRegistrar_FWD_DEFINED__
#define __WbemDecoupledRegistrar_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemDecoupledRegistrar WbemDecoupledRegistrar;
#else
typedef struct WbemDecoupledRegistrar WbemDecoupledRegistrar;
#endif /* defined __cplusplus */
#endif /* defined __WbemDecoupledRegistrar_FWD_DEFINED__ */

#ifndef __WbemDecoupledBasicEventProvider_FWD_DEFINED__
#define __WbemDecoupledBasicEventProvider_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemDecoupledBasicEventProvider WbemDecoupledBasicEventProvider;
#else
typedef struct WbemDecoupledBasicEventProvider WbemDecoupledBasicEventProvider;
#endif /* defined __cplusplus */
#endif /* defined __WbemDecoupledBasicEventProvider_FWD_DEFINED__ */

#ifndef __IWbemUnboundObjectSink_FWD_DEFINED__
#define __IWbemUnboundObjectSink_FWD_DEFINED__
typedef interface IWbemUnboundObjectSink IWbemUnboundObjectSink;
#ifdef __cplusplus
interface IWbemUnboundObjectSink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemPropertyProvider_FWD_DEFINED__
#define __IWbemPropertyProvider_FWD_DEFINED__
typedef interface IWbemPropertyProvider IWbemPropertyProvider;
#ifdef __cplusplus
interface IWbemPropertyProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventProvider_FWD_DEFINED__
#define __IWbemEventProvider_FWD_DEFINED__
typedef interface IWbemEventProvider IWbemEventProvider;
#ifdef __cplusplus
interface IWbemEventProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventProviderQuerySink_FWD_DEFINED__
#define __IWbemEventProviderQuerySink_FWD_DEFINED__
typedef interface IWbemEventProviderQuerySink IWbemEventProviderQuerySink;
#ifdef __cplusplus
interface IWbemEventProviderQuerySink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventProviderSecurity_FWD_DEFINED__
#define __IWbemEventProviderSecurity_FWD_DEFINED__
typedef interface IWbemEventProviderSecurity IWbemEventProviderSecurity;
#ifdef __cplusplus
interface IWbemEventProviderSecurity;
#endif /* __cplusplus */
#endif

#ifndef __IWbemProviderIdentity_FWD_DEFINED__
#define __IWbemProviderIdentity_FWD_DEFINED__
typedef interface IWbemProviderIdentity IWbemProviderIdentity;
#ifdef __cplusplus
interface IWbemProviderIdentity;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventConsumerProvider_FWD_DEFINED__
#define __IWbemEventConsumerProvider_FWD_DEFINED__
typedef interface IWbemEventConsumerProvider IWbemEventConsumerProvider;
#ifdef __cplusplus
interface IWbemEventConsumerProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemProviderInitSink_FWD_DEFINED__
#define __IWbemProviderInitSink_FWD_DEFINED__
typedef interface IWbemProviderInitSink IWbemProviderInitSink;
#ifdef __cplusplus
interface IWbemProviderInitSink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemProviderInit_FWD_DEFINED__
#define __IWbemProviderInit_FWD_DEFINED__
typedef interface IWbemProviderInit IWbemProviderInit;
#ifdef __cplusplus
interface IWbemProviderInit;
#endif /* __cplusplus */
#endif

#ifndef __IWbemHiPerfProvider_FWD_DEFINED__
#define __IWbemHiPerfProvider_FWD_DEFINED__
typedef interface IWbemHiPerfProvider IWbemHiPerfProvider;
#ifdef __cplusplus
interface IWbemHiPerfProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemDecoupledRegistrar_FWD_DEFINED__
#define __IWbemDecoupledRegistrar_FWD_DEFINED__
typedef interface IWbemDecoupledRegistrar IWbemDecoupledRegistrar;
#ifdef __cplusplus
interface IWbemDecoupledRegistrar;
#endif /* __cplusplus */
#endif

#ifndef __IWbemDecoupledBasicEventProvider_FWD_DEFINED__
#define __IWbemDecoupledBasicEventProvider_FWD_DEFINED__
typedef interface IWbemDecoupledBasicEventProvider IWbemDecoupledBasicEventProvider;
#ifdef __cplusplus
interface IWbemDecoupledBasicEventProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventSink_FWD_DEFINED__
#define __IWbemEventSink_FWD_DEFINED__
typedef interface IWbemEventSink IWbemEventSink;
#ifdef __cplusplus
interface IWbemEventSink;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <objidl.h>
#include <oleidl.h>
#include <oaidl.h>
#include <wbemcli.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
typedef VARIANT WBEM_VARIANT;
typedef LPWSTR WBEM_WSTR;
typedef LPCWSTR WBEM_CWSTR;
typedef enum tag_WBEM_PROVIDER_REQUIREMENTS_TYPE {
    WBEM_REQUIREMENTS_START_POSTFILTER = 0,
    WBEM_REQUIREMENTS_STOP_POSTFILTER = 1,
    WBEM_REQUIREMENTS_RECHECK_SUBSCRIPTIONS = 2
} WBEM_PROVIDER_REQUIREMENTS_TYPE;
#ifndef __IWbemPropertyProvider_FWD_DEFINED__
#define __IWbemPropertyProvider_FWD_DEFINED__
typedef interface IWbemPropertyProvider IWbemPropertyProvider;
#ifdef __cplusplus
interface IWbemPropertyProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemUnboundObjectSink_FWD_DEFINED__
#define __IWbemUnboundObjectSink_FWD_DEFINED__
typedef interface IWbemUnboundObjectSink IWbemUnboundObjectSink;
#ifdef __cplusplus
interface IWbemUnboundObjectSink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventProvider_FWD_DEFINED__
#define __IWbemEventProvider_FWD_DEFINED__
typedef interface IWbemEventProvider IWbemEventProvider;
#ifdef __cplusplus
interface IWbemEventProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventProviderQuerySink_FWD_DEFINED__
#define __IWbemEventProviderQuerySink_FWD_DEFINED__
typedef interface IWbemEventProviderQuerySink IWbemEventProviderQuerySink;
#ifdef __cplusplus
interface IWbemEventProviderQuerySink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventProviderSecurity_FWD_DEFINED__
#define __IWbemEventProviderSecurity_FWD_DEFINED__
typedef interface IWbemEventProviderSecurity IWbemEventProviderSecurity;
#ifdef __cplusplus
interface IWbemEventProviderSecurity;
#endif /* __cplusplus */
#endif

#ifndef __IWbemEventConsumerProvider_FWD_DEFINED__
#define __IWbemEventConsumerProvider_FWD_DEFINED__
typedef interface IWbemEventConsumerProvider IWbemEventConsumerProvider;
#ifdef __cplusplus
interface IWbemEventConsumerProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemProviderInitSink_FWD_DEFINED__
#define __IWbemProviderInitSink_FWD_DEFINED__
typedef interface IWbemProviderInitSink IWbemProviderInitSink;
#ifdef __cplusplus
interface IWbemProviderInitSink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemProviderInit_FWD_DEFINED__
#define __IWbemProviderInit_FWD_DEFINED__
typedef interface IWbemProviderInit IWbemProviderInit;
#ifdef __cplusplus
interface IWbemProviderInit;
#endif /* __cplusplus */
#endif

#ifndef __IWbemHiPerfProvider_FWD_DEFINED__
#define __IWbemHiPerfProvider_FWD_DEFINED__
typedef interface IWbemHiPerfProvider IWbemHiPerfProvider;
#ifdef __cplusplus
interface IWbemHiPerfProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWbemDecoupledRegistrar_FWD_DEFINED__
#define __IWbemDecoupledRegistrar_FWD_DEFINED__
typedef interface IWbemDecoupledRegistrar IWbemDecoupledRegistrar;
#ifdef __cplusplus
interface IWbemDecoupledRegistrar;
#endif /* __cplusplus */
#endif

#ifndef __WbemProviders_v1_LIBRARY_DEFINED__
#define __WbemProviders_v1_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_WbemProviders_v1, 0x092df710, 0x7010, 0x11d1, 0xad,0x90, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);

/*****************************************************************************
 * WbemAdministrativeLocator coclass
 */

DEFINE_GUID(CLSID_WbemAdministrativeLocator, 0xcb8555cc, 0x9128, 0x11d1, 0xad,0x9b, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);

#ifdef __cplusplus
class DECLSPEC_UUID("cb8555cc-9128-11d1-ad9b-00c04fd8fdff") WbemAdministrativeLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemAdministrativeLocator, 0xcb8555cc, 0x9128, 0x11d1, 0xad,0x9b, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#endif

/*****************************************************************************
 * WbemAuthenticatedLocator coclass
 */

DEFINE_GUID(CLSID_WbemAuthenticatedLocator, 0xcd184336, 0x9128, 0x11d1, 0xad,0x9b, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);

#ifdef __cplusplus
class DECLSPEC_UUID("cd184336-9128-11d1-ad9b-00c04fd8fdff") WbemAuthenticatedLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemAuthenticatedLocator, 0xcd184336, 0x9128, 0x11d1, 0xad,0x9b, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#endif

/*****************************************************************************
 * WbemUnauthenticatedLocator coclass
 */

DEFINE_GUID(CLSID_WbemUnauthenticatedLocator, 0x443e7b79, 0xde31, 0x11d2, 0xb3,0x40, 0x00,0x10,0x4b,0xcc,0x4b,0x4a);

#ifdef __cplusplus
class DECLSPEC_UUID("443e7b79-de31-11d2-b340-00104bcc4b4a") WbemUnauthenticatedLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemUnauthenticatedLocator, 0x443e7b79, 0xde31, 0x11d2, 0xb3,0x40, 0x00,0x10,0x4b,0xcc,0x4b,0x4a)
#endif
#endif

/*****************************************************************************
 * WbemDecoupledRegistrar coclass
 */

DEFINE_GUID(CLSID_WbemDecoupledRegistrar, 0x4cfc7932, 0x0f9d, 0x4bef, 0x9c,0x32, 0x8e,0xa2,0xa6,0xb5,0x6f,0xcb);

#ifdef __cplusplus
class DECLSPEC_UUID("4cfc7932-0f9d-4bef-9c32-8ea2a6b56fcb") WbemDecoupledRegistrar;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemDecoupledRegistrar, 0x4cfc7932, 0x0f9d, 0x4bef, 0x9c,0x32, 0x8e,0xa2,0xa6,0xb5,0x6f,0xcb)
#endif
#endif

/*****************************************************************************
 * WbemDecoupledBasicEventProvider coclass
 */

DEFINE_GUID(CLSID_WbemDecoupledBasicEventProvider, 0xf5f75737, 0x2843, 0x4f22, 0x93,0x3d, 0xc7,0x6a,0x97,0xcd,0xa6,0x2f);

#ifdef __cplusplus
class DECLSPEC_UUID("f5f75737-2843-4f22-933d-c76a97cda62f") WbemDecoupledBasicEventProvider;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemDecoupledBasicEventProvider, 0xf5f75737, 0x2843, 0x4f22, 0x93,0x3d, 0xc7,0x6a,0x97,0xcd,0xa6,0x2f)
#endif
#endif

#endif /* __WbemProviders_v1_LIBRARY_DEFINED__ */
typedef enum tag_WBEM_BATCH_TYPE {
    WBEM_FLAG_BATCH_IF_NEEDED = 0,
    WBEM_FLAG_MUST_BATCH = 0x1,
    WBEM_FLAG_MUST_NOT_BATCH = 0x2
} WBEM_BATCH_TYPE;
typedef enum tag_WBEM_PROVIDER_FLAGS {
    WBEM_FLAG_OWNER_UPDATE = 0x10000
} WBEM_PROVIDER_FLAGS;
typedef enum tag_WBEM_EXTRA_RETURN_CODES {
    WBEM_S_INITIALIZED = 0,
    WBEM_S_LIMITED_SERVICE = 0x43001,
    WBEM_S_INDIRECTLY_UPDATED = 0x43002,
    WBEM_S_SUBJECT_TO_SDS = 0x43003,
    WBEM_E_RETRY_LATER = 0x80043001,
    WBEM_E_RESOURCE_CONTENTION = 0x80043002
} WBEM_EXTRA_RETURN_CODES;
/*****************************************************************************
 * IWbemUnboundObjectSink interface
 */
#ifndef __IWbemUnboundObjectSink_INTERFACE_DEFINED__
#define __IWbemUnboundObjectSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemUnboundObjectSink, 0xe246107b, 0xb06e, 0x11d0, 0xad,0x61, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e246107b-b06e-11d0-ad61-00c04fd8fdff")
IWbemUnboundObjectSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE IndicateToConsumer(
        IWbemClassObject *pLogicalConsumer,
        LONG lNumObjects,
        IWbemClassObject **apObjects) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemUnboundObjectSink, 0xe246107b, 0xb06e, 0x11d0, 0xad,0x61, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#else
typedef struct IWbemUnboundObjectSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemUnboundObjectSink methods ***/
    HRESULT (STDMETHODCALLTYPE *IndicateToConsumer)(
        IWbemUnboundObjectSink *This,
        IWbemClassObject *pLogicalConsumer,
        LONG lNumObjects,
        IWbemClassObject **apObjects);

    END_INTERFACE
} IWbemUnboundObjectSinkVtbl;

interface IWbemUnboundObjectSink {
    CONST_VTBL IWbemUnboundObjectSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemUnboundObjectSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemUnboundObjectSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemUnboundObjectSink_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemUnboundObjectSink methods ***/
#define IWbemUnboundObjectSink_IndicateToConsumer(This,pLogicalConsumer,lNumObjects,apObjects) (This)->lpVtbl->IndicateToConsumer(This,pLogicalConsumer,lNumObjects,apObjects)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemUnboundObjectSink_QueryInterface(IWbemUnboundObjectSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemUnboundObjectSink_AddRef(IWbemUnboundObjectSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemUnboundObjectSink_Release(IWbemUnboundObjectSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemUnboundObjectSink methods ***/
static FORCEINLINE HRESULT IWbemUnboundObjectSink_IndicateToConsumer(IWbemUnboundObjectSink* This,IWbemClassObject *pLogicalConsumer,LONG lNumObjects,IWbemClassObject **apObjects) {
    return This->lpVtbl->IndicateToConsumer(This,pLogicalConsumer,lNumObjects,apObjects);
}
#endif
#endif

#endif


#endif  /* __IWbemUnboundObjectSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemPropertyProvider interface
 */
#ifndef __IWbemPropertyProvider_INTERFACE_DEFINED__
#define __IWbemPropertyProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemPropertyProvider, 0xce61e841, 0x65bc, 0x11d0, 0xb6,0xbd, 0x00,0xaa,0x00,0x32,0x40,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ce61e841-65bc-11d0-b6bd-00aa003240c7")
IWbemPropertyProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetProperty(
        LONG lFlags,
        const BSTR strLocale,
        const BSTR strClassMapping,
        const BSTR strInstMapping,
        const BSTR strPropMapping,
        VARIANT *pvValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutProperty(
        LONG lFlags,
        const BSTR strLocale,
        const BSTR strClassMapping,
        const BSTR strInstMapping,
        const BSTR strPropMapping,
        const VARIANT *pvValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemPropertyProvider, 0xce61e841, 0x65bc, 0x11d0, 0xb6,0xbd, 0x00,0xaa,0x00,0x32,0x40,0xc7)
#endif
#else
typedef struct IWbemPropertyProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemPropertyProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IWbemPropertyProvider *This,
        LONG lFlags,
        const BSTR strLocale,
        const BSTR strClassMapping,
        const BSTR strInstMapping,
        const BSTR strPropMapping,
        VARIANT *pvValue);

    HRESULT (STDMETHODCALLTYPE *PutProperty)(
        IWbemPropertyProvider *This,
        LONG lFlags,
        const BSTR strLocale,
        const BSTR strClassMapping,
        const BSTR strInstMapping,
        const BSTR strPropMapping,
        const VARIANT *pvValue);

    END_INTERFACE
} IWbemPropertyProviderVtbl;

interface IWbemPropertyProvider {
    CONST_VTBL IWbemPropertyProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemPropertyProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemPropertyProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemPropertyProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemPropertyProvider methods ***/
#define IWbemPropertyProvider_GetProperty(This,lFlags,strLocale,strClassMapping,strInstMapping,strPropMapping,pvValue) (This)->lpVtbl->GetProperty(This,lFlags,strLocale,strClassMapping,strInstMapping,strPropMapping,pvValue)
#define IWbemPropertyProvider_PutProperty(This,lFlags,strLocale,strClassMapping,strInstMapping,strPropMapping,pvValue) (This)->lpVtbl->PutProperty(This,lFlags,strLocale,strClassMapping,strInstMapping,strPropMapping,pvValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemPropertyProvider_QueryInterface(IWbemPropertyProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemPropertyProvider_AddRef(IWbemPropertyProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemPropertyProvider_Release(IWbemPropertyProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemPropertyProvider methods ***/
static FORCEINLINE HRESULT IWbemPropertyProvider_GetProperty(IWbemPropertyProvider* This,LONG lFlags,const BSTR strLocale,const BSTR strClassMapping,const BSTR strInstMapping,const BSTR strPropMapping,VARIANT *pvValue) {
    return This->lpVtbl->GetProperty(This,lFlags,strLocale,strClassMapping,strInstMapping,strPropMapping,pvValue);
}
static FORCEINLINE HRESULT IWbemPropertyProvider_PutProperty(IWbemPropertyProvider* This,LONG lFlags,const BSTR strLocale,const BSTR strClassMapping,const BSTR strInstMapping,const BSTR strPropMapping,const VARIANT *pvValue) {
    return This->lpVtbl->PutProperty(This,lFlags,strLocale,strClassMapping,strInstMapping,strPropMapping,pvValue);
}
#endif
#endif

#endif


#endif  /* __IWbemPropertyProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemEventProvider interface
 */
#ifndef __IWbemEventProvider_INTERFACE_DEFINED__
#define __IWbemEventProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemEventProvider, 0xe245105b, 0xb06e, 0x11d0, 0xad,0x61, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e245105b-b06e-11d0-ad61-00c04fd8fdff")
IWbemEventProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ProvideEvents(
        IWbemObjectSink *pSink,
        LONG lFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemEventProvider, 0xe245105b, 0xb06e, 0x11d0, 0xad,0x61, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#else
typedef struct IWbemEventProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemEventProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *ProvideEvents)(
        IWbemEventProvider *This,
        IWbemObjectSink *pSink,
        LONG lFlags);

    END_INTERFACE
} IWbemEventProviderVtbl;

interface IWbemEventProvider {
    CONST_VTBL IWbemEventProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemEventProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemEventProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemEventProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemEventProvider methods ***/
#define IWbemEventProvider_ProvideEvents(This,pSink,lFlags) (This)->lpVtbl->ProvideEvents(This,pSink,lFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemEventProvider_QueryInterface(IWbemEventProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemEventProvider_AddRef(IWbemEventProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemEventProvider_Release(IWbemEventProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemEventProvider methods ***/
static FORCEINLINE HRESULT IWbemEventProvider_ProvideEvents(IWbemEventProvider* This,IWbemObjectSink *pSink,LONG lFlags) {
    return This->lpVtbl->ProvideEvents(This,pSink,lFlags);
}
#endif
#endif

#endif


#endif  /* __IWbemEventProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemEventProviderQuerySink interface
 */
#ifndef __IWbemEventProviderQuerySink_INTERFACE_DEFINED__
#define __IWbemEventProviderQuerySink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemEventProviderQuerySink, 0x580acaf8, 0xfa1c, 0x11d0, 0xad,0x72, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("580acaf8-fa1c-11d0-ad72-00c04fd8fdff")
IWbemEventProviderQuerySink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE NewQuery(
        ULONG dwId,
        WBEM_WSTR wszQueryLanguage,
        WBEM_WSTR wszQuery) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelQuery(
        ULONG dwId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemEventProviderQuerySink, 0x580acaf8, 0xfa1c, 0x11d0, 0xad,0x72, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#else
typedef struct IWbemEventProviderQuerySinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemEventProviderQuerySink methods ***/
    HRESULT (STDMETHODCALLTYPE *NewQuery)(
        IWbemEventProviderQuerySink *This,
        ULONG dwId,
        WBEM_WSTR wszQueryLanguage,
        WBEM_WSTR wszQuery);

    HRESULT (STDMETHODCALLTYPE *CancelQuery)(
        IWbemEventProviderQuerySink *This,
        ULONG dwId);

    END_INTERFACE
} IWbemEventProviderQuerySinkVtbl;

interface IWbemEventProviderQuerySink {
    CONST_VTBL IWbemEventProviderQuerySinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemEventProviderQuerySink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemEventProviderQuerySink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemEventProviderQuerySink_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemEventProviderQuerySink methods ***/
#define IWbemEventProviderQuerySink_NewQuery(This,dwId,wszQueryLanguage,wszQuery) (This)->lpVtbl->NewQuery(This,dwId,wszQueryLanguage,wszQuery)
#define IWbemEventProviderQuerySink_CancelQuery(This,dwId) (This)->lpVtbl->CancelQuery(This,dwId)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemEventProviderQuerySink_QueryInterface(IWbemEventProviderQuerySink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemEventProviderQuerySink_AddRef(IWbemEventProviderQuerySink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemEventProviderQuerySink_Release(IWbemEventProviderQuerySink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemEventProviderQuerySink methods ***/
static FORCEINLINE HRESULT IWbemEventProviderQuerySink_NewQuery(IWbemEventProviderQuerySink* This,ULONG dwId,WBEM_WSTR wszQueryLanguage,WBEM_WSTR wszQuery) {
    return This->lpVtbl->NewQuery(This,dwId,wszQueryLanguage,wszQuery);
}
static FORCEINLINE HRESULT IWbemEventProviderQuerySink_CancelQuery(IWbemEventProviderQuerySink* This,ULONG dwId) {
    return This->lpVtbl->CancelQuery(This,dwId);
}
#endif
#endif

#endif


#endif  /* __IWbemEventProviderQuerySink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemEventProviderSecurity interface
 */
#ifndef __IWbemEventProviderSecurity_INTERFACE_DEFINED__
#define __IWbemEventProviderSecurity_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemEventProviderSecurity, 0x631f7d96, 0xd993, 0x11d2, 0xb3,0x39, 0x00,0x10,0x5a,0x1f,0x4a,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("631f7d96-d993-11d2-b339-00105a1f4aaf")
IWbemEventProviderSecurity : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AccessCheck(
        WBEM_CWSTR wszQueryLanguage,
        WBEM_CWSTR wszQuery,
        LONG lSidLength,
        const BYTE *pSid) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemEventProviderSecurity, 0x631f7d96, 0xd993, 0x11d2, 0xb3,0x39, 0x00,0x10,0x5a,0x1f,0x4a,0xaf)
#endif
#else
typedef struct IWbemEventProviderSecurityVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemEventProviderSecurity methods ***/
    HRESULT (STDMETHODCALLTYPE *AccessCheck)(
        IWbemEventProviderSecurity *This,
        WBEM_CWSTR wszQueryLanguage,
        WBEM_CWSTR wszQuery,
        LONG lSidLength,
        const BYTE *pSid);

    END_INTERFACE
} IWbemEventProviderSecurityVtbl;

interface IWbemEventProviderSecurity {
    CONST_VTBL IWbemEventProviderSecurityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemEventProviderSecurity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemEventProviderSecurity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemEventProviderSecurity_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemEventProviderSecurity methods ***/
#define IWbemEventProviderSecurity_AccessCheck(This,wszQueryLanguage,wszQuery,lSidLength,pSid) (This)->lpVtbl->AccessCheck(This,wszQueryLanguage,wszQuery,lSidLength,pSid)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemEventProviderSecurity_QueryInterface(IWbemEventProviderSecurity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemEventProviderSecurity_AddRef(IWbemEventProviderSecurity* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemEventProviderSecurity_Release(IWbemEventProviderSecurity* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemEventProviderSecurity methods ***/
static FORCEINLINE HRESULT IWbemEventProviderSecurity_AccessCheck(IWbemEventProviderSecurity* This,WBEM_CWSTR wszQueryLanguage,WBEM_CWSTR wszQuery,LONG lSidLength,const BYTE *pSid) {
    return This->lpVtbl->AccessCheck(This,wszQueryLanguage,wszQuery,lSidLength,pSid);
}
#endif
#endif

#endif


#endif  /* __IWbemEventProviderSecurity_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemProviderIdentity interface
 */
#ifndef __IWbemProviderIdentity_INTERFACE_DEFINED__
#define __IWbemProviderIdentity_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemProviderIdentity, 0x631f7d97, 0xd993, 0x11d2, 0xb3,0x39, 0x00,0x10,0x5a,0x1f,0x4a,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("631f7d97-d993-11d2-b339-00105a1f4aaf")
IWbemProviderIdentity : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetRegistrationObject(
        LONG lFlags,
        IWbemClassObject *pProvReg) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemProviderIdentity, 0x631f7d97, 0xd993, 0x11d2, 0xb3,0x39, 0x00,0x10,0x5a,0x1f,0x4a,0xaf)
#endif
#else
typedef struct IWbemProviderIdentityVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemProviderIdentity methods ***/
    HRESULT (STDMETHODCALLTYPE *SetRegistrationObject)(
        IWbemProviderIdentity *This,
        LONG lFlags,
        IWbemClassObject *pProvReg);

    END_INTERFACE
} IWbemProviderIdentityVtbl;

interface IWbemProviderIdentity {
    CONST_VTBL IWbemProviderIdentityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemProviderIdentity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemProviderIdentity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemProviderIdentity_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemProviderIdentity methods ***/
#define IWbemProviderIdentity_SetRegistrationObject(This,lFlags,pProvReg) (This)->lpVtbl->SetRegistrationObject(This,lFlags,pProvReg)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemProviderIdentity_QueryInterface(IWbemProviderIdentity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemProviderIdentity_AddRef(IWbemProviderIdentity* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemProviderIdentity_Release(IWbemProviderIdentity* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemProviderIdentity methods ***/
static FORCEINLINE HRESULT IWbemProviderIdentity_SetRegistrationObject(IWbemProviderIdentity* This,LONG lFlags,IWbemClassObject *pProvReg) {
    return This->lpVtbl->SetRegistrationObject(This,lFlags,pProvReg);
}
#endif
#endif

#endif


#endif  /* __IWbemProviderIdentity_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemEventConsumerProvider interface
 */
#ifndef __IWbemEventConsumerProvider_INTERFACE_DEFINED__
#define __IWbemEventConsumerProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemEventConsumerProvider, 0xe246107a, 0xb06e, 0x11d0, 0xad,0x61, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e246107a-b06e-11d0-ad61-00c04fd8fdff")
IWbemEventConsumerProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FindConsumer(
        IWbemClassObject *pLogicalConsumer,
        IWbemUnboundObjectSink **ppConsumer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemEventConsumerProvider, 0xe246107a, 0xb06e, 0x11d0, 0xad,0x61, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#else
typedef struct IWbemEventConsumerProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemEventConsumerProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *FindConsumer)(
        IWbemEventConsumerProvider *This,
        IWbemClassObject *pLogicalConsumer,
        IWbemUnboundObjectSink **ppConsumer);

    END_INTERFACE
} IWbemEventConsumerProviderVtbl;

interface IWbemEventConsumerProvider {
    CONST_VTBL IWbemEventConsumerProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemEventConsumerProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemEventConsumerProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemEventConsumerProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemEventConsumerProvider methods ***/
#define IWbemEventConsumerProvider_FindConsumer(This,pLogicalConsumer,ppConsumer) (This)->lpVtbl->FindConsumer(This,pLogicalConsumer,ppConsumer)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemEventConsumerProvider_QueryInterface(IWbemEventConsumerProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemEventConsumerProvider_AddRef(IWbemEventConsumerProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemEventConsumerProvider_Release(IWbemEventConsumerProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemEventConsumerProvider methods ***/
static FORCEINLINE HRESULT IWbemEventConsumerProvider_FindConsumer(IWbemEventConsumerProvider* This,IWbemClassObject *pLogicalConsumer,IWbemUnboundObjectSink **ppConsumer) {
    return This->lpVtbl->FindConsumer(This,pLogicalConsumer,ppConsumer);
}
#endif
#endif

#endif


#endif  /* __IWbemEventConsumerProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemProviderInitSink interface
 */
#ifndef __IWbemProviderInitSink_INTERFACE_DEFINED__
#define __IWbemProviderInitSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemProviderInitSink, 0x1be41571, 0x91dd, 0x11d1, 0xae,0xb2, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1be41571-91dd-11d1-aeb2-00c04fb68820")
IWbemProviderInitSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetStatus(
        LONG lStatus,
        LONG lFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemProviderInitSink, 0x1be41571, 0x91dd, 0x11d1, 0xae,0xb2, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#else
typedef struct IWbemProviderInitSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemProviderInitSink methods ***/
    HRESULT (STDMETHODCALLTYPE *SetStatus)(
        IWbemProviderInitSink *This,
        LONG lStatus,
        LONG lFlags);

    END_INTERFACE
} IWbemProviderInitSinkVtbl;

interface IWbemProviderInitSink {
    CONST_VTBL IWbemProviderInitSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemProviderInitSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemProviderInitSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemProviderInitSink_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemProviderInitSink methods ***/
#define IWbemProviderInitSink_SetStatus(This,lStatus,lFlags) (This)->lpVtbl->SetStatus(This,lStatus,lFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemProviderInitSink_QueryInterface(IWbemProviderInitSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemProviderInitSink_AddRef(IWbemProviderInitSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemProviderInitSink_Release(IWbemProviderInitSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemProviderInitSink methods ***/
static FORCEINLINE HRESULT IWbemProviderInitSink_SetStatus(IWbemProviderInitSink* This,LONG lStatus,LONG lFlags) {
    return This->lpVtbl->SetStatus(This,lStatus,lFlags);
}
#endif
#endif

#endif


#endif  /* __IWbemProviderInitSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemProviderInit interface
 */
#ifndef __IWbemProviderInit_INTERFACE_DEFINED__
#define __IWbemProviderInit_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemProviderInit, 0x1be41572, 0x91dd, 0x11d1, 0xae,0xb2, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1be41572-91dd-11d1-aeb2-00c04fb68820")
IWbemProviderInit : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        LPWSTR wszUser,
        LONG lFlags,
        LPWSTR wszNamespace,
        LPWSTR wszLocale,
        IWbemServices *pNamespace,
        IWbemContext *pCtx,
        IWbemProviderInitSink *pInitSink) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemProviderInit, 0x1be41572, 0x91dd, 0x11d1, 0xae,0xb2, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#else
typedef struct IWbemProviderInitVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemProviderInit methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWbemProviderInit *This,
        LPWSTR wszUser,
        LONG lFlags,
        LPWSTR wszNamespace,
        LPWSTR wszLocale,
        IWbemServices *pNamespace,
        IWbemContext *pCtx,
        IWbemProviderInitSink *pInitSink);

    END_INTERFACE
} IWbemProviderInitVtbl;

interface IWbemProviderInit {
    CONST_VTBL IWbemProviderInitVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemProviderInit_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemProviderInit_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemProviderInit_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemProviderInit methods ***/
#define IWbemProviderInit_Initialize(This,wszUser,lFlags,wszNamespace,wszLocale,pNamespace,pCtx,pInitSink) (This)->lpVtbl->Initialize(This,wszUser,lFlags,wszNamespace,wszLocale,pNamespace,pCtx,pInitSink)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemProviderInit_QueryInterface(IWbemProviderInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemProviderInit_AddRef(IWbemProviderInit* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemProviderInit_Release(IWbemProviderInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemProviderInit methods ***/
static FORCEINLINE HRESULT IWbemProviderInit_Initialize(IWbemProviderInit* This,LPWSTR wszUser,LONG lFlags,LPWSTR wszNamespace,LPWSTR wszLocale,IWbemServices *pNamespace,IWbemContext *pCtx,IWbemProviderInitSink *pInitSink) {
    return This->lpVtbl->Initialize(This,wszUser,lFlags,wszNamespace,wszLocale,pNamespace,pCtx,pInitSink);
}
#endif
#endif

#endif


#endif  /* __IWbemProviderInit_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemHiPerfProvider interface
 */
#ifndef __IWbemHiPerfProvider_INTERFACE_DEFINED__
#define __IWbemHiPerfProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemHiPerfProvider, 0x49353c93, 0x516b, 0x11d1, 0xae,0xa6, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("49353c93-516b-11d1-aea6-00c04fb68820")
IWbemHiPerfProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE QueryInstances(
        IWbemServices *pNamespace,
        WCHAR *wszClass,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRefresher(
        IWbemServices *pNamespace,
        LONG lFlags,
        IWbemRefresher **ppRefresher) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRefreshableObject(
        IWbemServices *pNamespace,
        IWbemObjectAccess *pTemplate,
        IWbemRefresher *pRefresher,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemObjectAccess **ppRefreshable,
        LONG *plId) = 0;

    virtual HRESULT STDMETHODCALLTYPE StopRefreshing(
        IWbemRefresher *pRefresher,
        LONG lId,
        LONG lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRefreshableEnum(
        IWbemServices *pNamespace,
        LPCWSTR wszClass,
        IWbemRefresher *pRefresher,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemHiPerfEnum *pHiPerfEnum,
        LONG *plId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjects(
        IWbemServices *pNamespace,
        LONG lNumObjects,
        IWbemObjectAccess **apObj,
        LONG lFlags,
        IWbemContext *pContext) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemHiPerfProvider, 0x49353c93, 0x516b, 0x11d1, 0xae,0xa6, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#else
typedef struct IWbemHiPerfProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemHiPerfProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInstances)(
        IWbemHiPerfProvider *This,
        IWbemServices *pNamespace,
        WCHAR *wszClass,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pSink);

    HRESULT (STDMETHODCALLTYPE *CreateRefresher)(
        IWbemHiPerfProvider *This,
        IWbemServices *pNamespace,
        LONG lFlags,
        IWbemRefresher **ppRefresher);

    HRESULT (STDMETHODCALLTYPE *CreateRefreshableObject)(
        IWbemHiPerfProvider *This,
        IWbemServices *pNamespace,
        IWbemObjectAccess *pTemplate,
        IWbemRefresher *pRefresher,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemObjectAccess **ppRefreshable,
        LONG *plId);

    HRESULT (STDMETHODCALLTYPE *StopRefreshing)(
        IWbemHiPerfProvider *This,
        IWbemRefresher *pRefresher,
        LONG lId,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *CreateRefreshableEnum)(
        IWbemHiPerfProvider *This,
        IWbemServices *pNamespace,
        LPCWSTR wszClass,
        IWbemRefresher *pRefresher,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemHiPerfEnum *pHiPerfEnum,
        LONG *plId);

    HRESULT (STDMETHODCALLTYPE *GetObjects)(
        IWbemHiPerfProvider *This,
        IWbemServices *pNamespace,
        LONG lNumObjects,
        IWbemObjectAccess **apObj,
        LONG lFlags,
        IWbemContext *pContext);

    END_INTERFACE
} IWbemHiPerfProviderVtbl;

interface IWbemHiPerfProvider {
    CONST_VTBL IWbemHiPerfProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemHiPerfProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemHiPerfProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemHiPerfProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemHiPerfProvider methods ***/
#define IWbemHiPerfProvider_QueryInstances(This,pNamespace,wszClass,lFlags,pCtx,pSink) (This)->lpVtbl->QueryInstances(This,pNamespace,wszClass,lFlags,pCtx,pSink)
#define IWbemHiPerfProvider_CreateRefresher(This,pNamespace,lFlags,ppRefresher) (This)->lpVtbl->CreateRefresher(This,pNamespace,lFlags,ppRefresher)
#define IWbemHiPerfProvider_CreateRefreshableObject(This,pNamespace,pTemplate,pRefresher,lFlags,pContext,ppRefreshable,plId) (This)->lpVtbl->CreateRefreshableObject(This,pNamespace,pTemplate,pRefresher,lFlags,pContext,ppRefreshable,plId)
#define IWbemHiPerfProvider_StopRefreshing(This,pRefresher,lId,lFlags) (This)->lpVtbl->StopRefreshing(This,pRefresher,lId,lFlags)
#define IWbemHiPerfProvider_CreateRefreshableEnum(This,pNamespace,wszClass,pRefresher,lFlags,pContext,pHiPerfEnum,plId) (This)->lpVtbl->CreateRefreshableEnum(This,pNamespace,wszClass,pRefresher,lFlags,pContext,pHiPerfEnum,plId)
#define IWbemHiPerfProvider_GetObjects(This,pNamespace,lNumObjects,apObj,lFlags,pContext) (This)->lpVtbl->GetObjects(This,pNamespace,lNumObjects,apObj,lFlags,pContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemHiPerfProvider_QueryInterface(IWbemHiPerfProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemHiPerfProvider_AddRef(IWbemHiPerfProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemHiPerfProvider_Release(IWbemHiPerfProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemHiPerfProvider methods ***/
static FORCEINLINE HRESULT IWbemHiPerfProvider_QueryInstances(IWbemHiPerfProvider* This,IWbemServices *pNamespace,WCHAR *wszClass,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pSink) {
    return This->lpVtbl->QueryInstances(This,pNamespace,wszClass,lFlags,pCtx,pSink);
}
static FORCEINLINE HRESULT IWbemHiPerfProvider_CreateRefresher(IWbemHiPerfProvider* This,IWbemServices *pNamespace,LONG lFlags,IWbemRefresher **ppRefresher) {
    return This->lpVtbl->CreateRefresher(This,pNamespace,lFlags,ppRefresher);
}
static FORCEINLINE HRESULT IWbemHiPerfProvider_CreateRefreshableObject(IWbemHiPerfProvider* This,IWbemServices *pNamespace,IWbemObjectAccess *pTemplate,IWbemRefresher *pRefresher,LONG lFlags,IWbemContext *pContext,IWbemObjectAccess **ppRefreshable,LONG *plId) {
    return This->lpVtbl->CreateRefreshableObject(This,pNamespace,pTemplate,pRefresher,lFlags,pContext,ppRefreshable,plId);
}
static FORCEINLINE HRESULT IWbemHiPerfProvider_StopRefreshing(IWbemHiPerfProvider* This,IWbemRefresher *pRefresher,LONG lId,LONG lFlags) {
    return This->lpVtbl->StopRefreshing(This,pRefresher,lId,lFlags);
}
static FORCEINLINE HRESULT IWbemHiPerfProvider_CreateRefreshableEnum(IWbemHiPerfProvider* This,IWbemServices *pNamespace,LPCWSTR wszClass,IWbemRefresher *pRefresher,LONG lFlags,IWbemContext *pContext,IWbemHiPerfEnum *pHiPerfEnum,LONG *plId) {
    return This->lpVtbl->CreateRefreshableEnum(This,pNamespace,wszClass,pRefresher,lFlags,pContext,pHiPerfEnum,plId);
}
static FORCEINLINE HRESULT IWbemHiPerfProvider_GetObjects(IWbemHiPerfProvider* This,IWbemServices *pNamespace,LONG lNumObjects,IWbemObjectAccess **apObj,LONG lFlags,IWbemContext *pContext) {
    return This->lpVtbl->GetObjects(This,pNamespace,lNumObjects,apObj,lFlags,pContext);
}
#endif
#endif

#endif


#endif  /* __IWbemHiPerfProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemDecoupledRegistrar interface
 */
#ifndef __IWbemDecoupledRegistrar_INTERFACE_DEFINED__
#define __IWbemDecoupledRegistrar_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemDecoupledRegistrar, 0x1005cbcf, 0xe64f, 0x4646, 0xbc,0xd3, 0x3a,0x08,0x9d,0x8a,0x84,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1005cbcf-e64f-4646-bcd3-3a089d8a84b4")
IWbemDecoupledRegistrar : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Register(
        LONG a_Flags,
        IWbemContext *a_Context,
        LPCWSTR a_User,
        LPCWSTR a_Locale,
        LPCWSTR a_Scope,
        LPCWSTR a_Registration,
        IUnknown *pIUnknown) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnRegister(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemDecoupledRegistrar, 0x1005cbcf, 0xe64f, 0x4646, 0xbc,0xd3, 0x3a,0x08,0x9d,0x8a,0x84,0xb4)
#endif
#else
typedef struct IWbemDecoupledRegistrarVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemDecoupledRegistrar methods ***/
    HRESULT (STDMETHODCALLTYPE *Register)(
        IWbemDecoupledRegistrar *This,
        LONG a_Flags,
        IWbemContext *a_Context,
        LPCWSTR a_User,
        LPCWSTR a_Locale,
        LPCWSTR a_Scope,
        LPCWSTR a_Registration,
        IUnknown *pIUnknown);

    HRESULT (STDMETHODCALLTYPE *UnRegister)(
        IWbemDecoupledRegistrar *This);

    END_INTERFACE
} IWbemDecoupledRegistrarVtbl;

interface IWbemDecoupledRegistrar {
    CONST_VTBL IWbemDecoupledRegistrarVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemDecoupledRegistrar_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemDecoupledRegistrar_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemDecoupledRegistrar_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemDecoupledRegistrar methods ***/
#define IWbemDecoupledRegistrar_Register(This,a_Flags,a_Context,a_User,a_Locale,a_Scope,a_Registration,pIUnknown) (This)->lpVtbl->Register(This,a_Flags,a_Context,a_User,a_Locale,a_Scope,a_Registration,pIUnknown)
#define IWbemDecoupledRegistrar_UnRegister(This) (This)->lpVtbl->UnRegister(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemDecoupledRegistrar_QueryInterface(IWbemDecoupledRegistrar* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemDecoupledRegistrar_AddRef(IWbemDecoupledRegistrar* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemDecoupledRegistrar_Release(IWbemDecoupledRegistrar* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemDecoupledRegistrar methods ***/
static FORCEINLINE HRESULT IWbemDecoupledRegistrar_Register(IWbemDecoupledRegistrar* This,LONG a_Flags,IWbemContext *a_Context,LPCWSTR a_User,LPCWSTR a_Locale,LPCWSTR a_Scope,LPCWSTR a_Registration,IUnknown *pIUnknown) {
    return This->lpVtbl->Register(This,a_Flags,a_Context,a_User,a_Locale,a_Scope,a_Registration,pIUnknown);
}
static FORCEINLINE HRESULT IWbemDecoupledRegistrar_UnRegister(IWbemDecoupledRegistrar* This) {
    return This->lpVtbl->UnRegister(This);
}
#endif
#endif

#endif


#endif  /* __IWbemDecoupledRegistrar_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemDecoupledBasicEventProvider interface
 */
#ifndef __IWbemDecoupledBasicEventProvider_INTERFACE_DEFINED__
#define __IWbemDecoupledBasicEventProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemDecoupledBasicEventProvider, 0x86336d20, 0xca11, 0x4786, 0x9e,0xf1, 0xbc,0x8a,0x94,0x6b,0x42,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("86336d20-ca11-4786-9ef1-bc8a946b42fc")
IWbemDecoupledBasicEventProvider : public IWbemDecoupledRegistrar
{
    virtual HRESULT STDMETHODCALLTYPE GetSink(
        LONG a_Flags,
        IWbemContext *a_Context,
        IWbemObjectSink **a_Sink) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetService(
        LONG a_Flags,
        IWbemContext *a_Context,
        IWbemServices **a_Service) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemDecoupledBasicEventProvider, 0x86336d20, 0xca11, 0x4786, 0x9e,0xf1, 0xbc,0x8a,0x94,0x6b,0x42,0xfc)
#endif
#else
typedef struct IWbemDecoupledBasicEventProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemDecoupledRegistrar methods ***/
    HRESULT (STDMETHODCALLTYPE *Register)(
        IWbemDecoupledBasicEventProvider *This,
        LONG a_Flags,
        IWbemContext *a_Context,
        LPCWSTR a_User,
        LPCWSTR a_Locale,
        LPCWSTR a_Scope,
        LPCWSTR a_Registration,
        IUnknown *pIUnknown);

    HRESULT (STDMETHODCALLTYPE *UnRegister)(
        IWbemDecoupledBasicEventProvider *This);

    /*** IWbemDecoupledBasicEventProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSink)(
        IWbemDecoupledBasicEventProvider *This,
        LONG a_Flags,
        IWbemContext *a_Context,
        IWbemObjectSink **a_Sink);

    HRESULT (STDMETHODCALLTYPE *GetService)(
        IWbemDecoupledBasicEventProvider *This,
        LONG a_Flags,
        IWbemContext *a_Context,
        IWbemServices **a_Service);

    END_INTERFACE
} IWbemDecoupledBasicEventProviderVtbl;

interface IWbemDecoupledBasicEventProvider {
    CONST_VTBL IWbemDecoupledBasicEventProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemDecoupledBasicEventProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemDecoupledBasicEventProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemDecoupledBasicEventProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemDecoupledRegistrar methods ***/
#define IWbemDecoupledBasicEventProvider_Register(This,a_Flags,a_Context,a_User,a_Locale,a_Scope,a_Registration,pIUnknown) (This)->lpVtbl->Register(This,a_Flags,a_Context,a_User,a_Locale,a_Scope,a_Registration,pIUnknown)
#define IWbemDecoupledBasicEventProvider_UnRegister(This) (This)->lpVtbl->UnRegister(This)
/*** IWbemDecoupledBasicEventProvider methods ***/
#define IWbemDecoupledBasicEventProvider_GetSink(This,a_Flags,a_Context,a_Sink) (This)->lpVtbl->GetSink(This,a_Flags,a_Context,a_Sink)
#define IWbemDecoupledBasicEventProvider_GetService(This,a_Flags,a_Context,a_Service) (This)->lpVtbl->GetService(This,a_Flags,a_Context,a_Service)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemDecoupledBasicEventProvider_QueryInterface(IWbemDecoupledBasicEventProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemDecoupledBasicEventProvider_AddRef(IWbemDecoupledBasicEventProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemDecoupledBasicEventProvider_Release(IWbemDecoupledBasicEventProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemDecoupledRegistrar methods ***/
static FORCEINLINE HRESULT IWbemDecoupledBasicEventProvider_Register(IWbemDecoupledBasicEventProvider* This,LONG a_Flags,IWbemContext *a_Context,LPCWSTR a_User,LPCWSTR a_Locale,LPCWSTR a_Scope,LPCWSTR a_Registration,IUnknown *pIUnknown) {
    return This->lpVtbl->Register(This,a_Flags,a_Context,a_User,a_Locale,a_Scope,a_Registration,pIUnknown);
}
static FORCEINLINE HRESULT IWbemDecoupledBasicEventProvider_UnRegister(IWbemDecoupledBasicEventProvider* This) {
    return This->lpVtbl->UnRegister(This);
}
/*** IWbemDecoupledBasicEventProvider methods ***/
static FORCEINLINE HRESULT IWbemDecoupledBasicEventProvider_GetSink(IWbemDecoupledBasicEventProvider* This,LONG a_Flags,IWbemContext *a_Context,IWbemObjectSink **a_Sink) {
    return This->lpVtbl->GetSink(This,a_Flags,a_Context,a_Sink);
}
static FORCEINLINE HRESULT IWbemDecoupledBasicEventProvider_GetService(IWbemDecoupledBasicEventProvider* This,LONG a_Flags,IWbemContext *a_Context,IWbemServices **a_Service) {
    return This->lpVtbl->GetService(This,a_Flags,a_Context,a_Service);
}
#endif
#endif

#endif


#endif  /* __IWbemDecoupledBasicEventProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemEventSink interface
 */
#ifndef __IWbemEventSink_INTERFACE_DEFINED__
#define __IWbemEventSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemEventSink, 0x3ae0080a, 0x7e3a, 0x4366, 0xbf,0x89, 0x0f,0xee,0xdc,0x93,0x16,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3ae0080a-7e3a-4366-bf89-0feedc931659")
IWbemEventSink : public IWbemObjectSink
{
    virtual HRESULT STDMETHODCALLTYPE SetSinkSecurity(
        LONG lSDLength,
        BYTE *pSD) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsActive(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestrictedSink(
        LONG lNumQueries,
        const LPCWSTR *awszQueries,
        IUnknown *pCallback,
        IWbemEventSink **ppSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBatchingParameters(
        LONG lFlags,
        DWORD dwMaxBufferSize,
        DWORD dwMaxSendLatency) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemEventSink, 0x3ae0080a, 0x7e3a, 0x4366, 0xbf,0x89, 0x0f,0xee,0xdc,0x93,0x16,0x59)
#endif
#else
typedef struct IWbemEventSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemObjectSink methods ***/
    HRESULT (STDMETHODCALLTYPE *Indicate)(
        IWbemEventSink *This,
        LONG lObjectCount,
        IWbemClassObject **apObjArray);

    HRESULT (STDMETHODCALLTYPE *SetStatus)(
        IWbemEventSink *This,
        LONG lFlags,
        HRESULT hResult,
        BSTR strParam,
        IWbemClassObject *pObjParam);

    /*** IWbemEventSink methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSinkSecurity)(
        IWbemEventSink *This,
        LONG lSDLength,
        BYTE *pSD);

    HRESULT (STDMETHODCALLTYPE *IsActive)(
        IWbemEventSink *This);

    HRESULT (STDMETHODCALLTYPE *GetRestrictedSink)(
        IWbemEventSink *This,
        LONG lNumQueries,
        const LPCWSTR *awszQueries,
        IUnknown *pCallback,
        IWbemEventSink **ppSink);

    HRESULT (STDMETHODCALLTYPE *SetBatchingParameters)(
        IWbemEventSink *This,
        LONG lFlags,
        DWORD dwMaxBufferSize,
        DWORD dwMaxSendLatency);

    END_INTERFACE
} IWbemEventSinkVtbl;

interface IWbemEventSink {
    CONST_VTBL IWbemEventSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemEventSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemEventSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemEventSink_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemObjectSink methods ***/
#define IWbemEventSink_Indicate(This,lObjectCount,apObjArray) (This)->lpVtbl->Indicate(This,lObjectCount,apObjArray)
#define IWbemEventSink_SetStatus(This,lFlags,hResult,strParam,pObjParam) (This)->lpVtbl->SetStatus(This,lFlags,hResult,strParam,pObjParam)
/*** IWbemEventSink methods ***/
#define IWbemEventSink_SetSinkSecurity(This,lSDLength,pSD) (This)->lpVtbl->SetSinkSecurity(This,lSDLength,pSD)
#define IWbemEventSink_IsActive(This) (This)->lpVtbl->IsActive(This)
#define IWbemEventSink_GetRestrictedSink(This,lNumQueries,awszQueries,pCallback,ppSink) (This)->lpVtbl->GetRestrictedSink(This,lNumQueries,awszQueries,pCallback,ppSink)
#define IWbemEventSink_SetBatchingParameters(This,lFlags,dwMaxBufferSize,dwMaxSendLatency) (This)->lpVtbl->SetBatchingParameters(This,lFlags,dwMaxBufferSize,dwMaxSendLatency)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemEventSink_QueryInterface(IWbemEventSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemEventSink_AddRef(IWbemEventSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemEventSink_Release(IWbemEventSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemObjectSink methods ***/
static FORCEINLINE HRESULT IWbemEventSink_Indicate(IWbemEventSink* This,LONG lObjectCount,IWbemClassObject **apObjArray) {
    return This->lpVtbl->Indicate(This,lObjectCount,apObjArray);
}
static FORCEINLINE HRESULT IWbemEventSink_SetStatus(IWbemEventSink* This,LONG lFlags,HRESULT hResult,BSTR strParam,IWbemClassObject *pObjParam) {
    return This->lpVtbl->SetStatus(This,lFlags,hResult,strParam,pObjParam);
}
/*** IWbemEventSink methods ***/
static FORCEINLINE HRESULT IWbemEventSink_SetSinkSecurity(IWbemEventSink* This,LONG lSDLength,BYTE *pSD) {
    return This->lpVtbl->SetSinkSecurity(This,lSDLength,pSD);
}
static FORCEINLINE HRESULT IWbemEventSink_IsActive(IWbemEventSink* This) {
    return This->lpVtbl->IsActive(This);
}
static FORCEINLINE HRESULT IWbemEventSink_GetRestrictedSink(IWbemEventSink* This,LONG lNumQueries,const LPCWSTR *awszQueries,IUnknown *pCallback,IWbemEventSink **ppSink) {
    return This->lpVtbl->GetRestrictedSink(This,lNumQueries,awszQueries,pCallback,ppSink);
}
static FORCEINLINE HRESULT IWbemEventSink_SetBatchingParameters(IWbemEventSink* This,LONG lFlags,DWORD dwMaxBufferSize,DWORD dwMaxSendLatency) {
    return This->lpVtbl->SetBatchingParameters(This,lFlags,dwMaxBufferSize,dwMaxSendLatency);
}
#endif
#endif

#endif


#endif  /* __IWbemEventSink_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wbemprov_h__ */
