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

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

/* Forward declarations */

#ifndef __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 __WIDL_INLINE HRESULT IWbemUnboundObjectSink_QueryInterface(IWbemUnboundObjectSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemUnboundObjectSink_AddRef(IWbemUnboundObjectSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemUnboundObjectSink_Release(IWbemUnboundObjectSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemUnboundObjectSink methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemPropertyProvider_QueryInterface(IWbemPropertyProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemPropertyProvider_AddRef(IWbemPropertyProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemPropertyProvider_Release(IWbemPropertyProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemPropertyProvider methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemEventProvider_QueryInterface(IWbemEventProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemEventProvider_AddRef(IWbemEventProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemEventProvider_Release(IWbemEventProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemEventProvider methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemEventProviderQuerySink_QueryInterface(IWbemEventProviderQuerySink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemEventProviderQuerySink_AddRef(IWbemEventProviderQuerySink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemEventProviderQuerySink_Release(IWbemEventProviderQuerySink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemEventProviderQuerySink methods ***/
static __WIDL_INLINE HRESULT IWbemEventProviderQuerySink_NewQuery(IWbemEventProviderQuerySink* This,ULONG dwId,WBEM_WSTR wszQueryLanguage,WBEM_WSTR wszQuery) {
    return This->lpVtbl->NewQuery(This,dwId,wszQueryLanguage,wszQuery);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemEventProviderSecurity_QueryInterface(IWbemEventProviderSecurity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemEventProviderSecurity_AddRef(IWbemEventProviderSecurity* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemEventProviderSecurity_Release(IWbemEventProviderSecurity* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemEventProviderSecurity methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemProviderIdentity_QueryInterface(IWbemProviderIdentity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemProviderIdentity_AddRef(IWbemProviderIdentity* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemProviderIdentity_Release(IWbemProviderIdentity* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemProviderIdentity methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemEventConsumerProvider_QueryInterface(IWbemEventConsumerProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemEventConsumerProvider_AddRef(IWbemEventConsumerProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemEventConsumerProvider_Release(IWbemEventConsumerProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemEventConsumerProvider methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemProviderInitSink_QueryInterface(IWbemProviderInitSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemProviderInitSink_AddRef(IWbemProviderInitSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemProviderInitSink_Release(IWbemProviderInitSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemProviderInitSink methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemProviderInit_QueryInterface(IWbemProviderInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemProviderInit_AddRef(IWbemProviderInit* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemProviderInit_Release(IWbemProviderInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemProviderInit methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemHiPerfProvider_QueryInterface(IWbemHiPerfProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemHiPerfProvider_AddRef(IWbemHiPerfProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemHiPerfProvider_Release(IWbemHiPerfProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemHiPerfProvider methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemHiPerfProvider_CreateRefresher(IWbemHiPerfProvider* This,IWbemServices *pNamespace,LONG lFlags,IWbemRefresher **ppRefresher) {
    return This->lpVtbl->CreateRefresher(This,pNamespace,lFlags,ppRefresher);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemHiPerfProvider_StopRefreshing(IWbemHiPerfProvider* This,IWbemRefresher *pRefresher,LONG lId,LONG lFlags) {
    return This->lpVtbl->StopRefreshing(This,pRefresher,lId,lFlags);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemDecoupledRegistrar_QueryInterface(IWbemDecoupledRegistrar* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemDecoupledRegistrar_AddRef(IWbemDecoupledRegistrar* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemDecoupledRegistrar_Release(IWbemDecoupledRegistrar* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemDecoupledRegistrar methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemDecoupledBasicEventProvider_QueryInterface(IWbemDecoupledBasicEventProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemDecoupledBasicEventProvider_AddRef(IWbemDecoupledBasicEventProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemDecoupledBasicEventProvider_Release(IWbemDecoupledBasicEventProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemDecoupledRegistrar methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemDecoupledBasicEventProvider_UnRegister(IWbemDecoupledBasicEventProvider* This) {
    return This->lpVtbl->UnRegister(This);
}
/*** IWbemDecoupledBasicEventProvider methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemEventSink_QueryInterface(IWbemEventSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWbemEventSink_AddRef(IWbemEventSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWbemEventSink_Release(IWbemEventSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemObjectSink methods ***/
static __WIDL_INLINE HRESULT IWbemEventSink_Indicate(IWbemEventSink* This,LONG lObjectCount,IWbemClassObject **apObjArray) {
    return This->lpVtbl->Indicate(This,lObjectCount,apObjArray);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWbemEventSink_SetSinkSecurity(IWbemEventSink* This,LONG lSDLength,BYTE *pSD) {
    return This->lpVtbl->SetSinkSecurity(This,lSDLength,pSD);
}
static __WIDL_INLINE HRESULT IWbemEventSink_IsActive(IWbemEventSink* This) {
    return This->lpVtbl->IsActive(This);
}
static __WIDL_INLINE HRESULT IWbemEventSink_GetRestrictedSink(IWbemEventSink* This,LONG lNumQueries,const LPCWSTR *awszQueries,IUnknown *pCallback,IWbemEventSink **ppSink) {
    return This->lpVtbl->GetRestrictedSink(This,lNumQueries,awszQueries,pCallback,ppSink);
}
static __WIDL_INLINE 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__ */
