/*** Autogenerated by WIDL 1.6 from wbemcli.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __wbemcli_h__
#define __wbemcli_h__

/* Forward declarations */

#ifndef __WbemBackupRestore_FWD_DEFINED__
#define __WbemBackupRestore_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemBackupRestore WbemBackupRestore;
#else
typedef struct WbemBackupRestore WbemBackupRestore;
#endif /* defined __cplusplus */
#endif /* defined __WbemBackupRestore_FWD_DEFINED__ */

#ifndef __WbemClassObject_FWD_DEFINED__
#define __WbemClassObject_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemClassObject WbemClassObject;
#else
typedef struct WbemClassObject WbemClassObject;
#endif /* defined __cplusplus */
#endif /* defined __WbemClassObject_FWD_DEFINED__ */

#ifndef __WbemContext_FWD_DEFINED__
#define __WbemContext_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemContext WbemContext;
#else
typedef struct WbemContext WbemContext;
#endif /* defined __cplusplus */
#endif /* defined __WbemContext_FWD_DEFINED__ */

#ifndef __WbemLocator_FWD_DEFINED__
#define __WbemLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemLocator WbemLocator;
#else
typedef struct WbemLocator WbemLocator;
#endif /* defined __cplusplus */
#endif /* defined __WbemLocator_FWD_DEFINED__ */

#ifndef __WbemStatusCodeText_FWD_DEFINED__
#define __WbemStatusCodeText_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemStatusCodeText WbemStatusCodeText;
#else
typedef struct WbemStatusCodeText WbemStatusCodeText;
#endif /* defined __cplusplus */
#endif /* defined __WbemStatusCodeText_FWD_DEFINED__ */

#ifndef __UnsecuredApartment_FWD_DEFINED__
#define __UnsecuredApartment_FWD_DEFINED__
#ifdef __cplusplus
typedef class UnsecuredApartment UnsecuredApartment;
#else
typedef struct UnsecuredApartment UnsecuredApartment;
#endif /* defined __cplusplus */
#endif /* defined __UnsecuredApartment_FWD_DEFINED__ */

#ifndef __MofCompiler_FWD_DEFINED__
#define __MofCompiler_FWD_DEFINED__
#ifdef __cplusplus
typedef class MofCompiler MofCompiler;
#else
typedef struct MofCompiler MofCompiler;
#endif /* defined __cplusplus */
#endif /* defined __MofCompiler_FWD_DEFINED__ */

#ifndef __WbemObjectTextSrc_FWD_DEFINED__
#define __WbemObjectTextSrc_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemObjectTextSrc WbemObjectTextSrc;
#else
typedef struct WbemObjectTextSrc WbemObjectTextSrc;
#endif /* defined __cplusplus */
#endif /* defined __WbemObjectTextSrc_FWD_DEFINED__ */

#ifndef __WbemRefresher_FWD_DEFINED__
#define __WbemRefresher_FWD_DEFINED__
#ifdef __cplusplus
typedef class WbemRefresher WbemRefresher;
#else
typedef struct WbemRefresher WbemRefresher;
#endif /* defined __cplusplus */
#endif /* defined __WbemRefresher_FWD_DEFINED__ */

#ifndef __IWbemClassObject_FWD_DEFINED__
#define __IWbemClassObject_FWD_DEFINED__
typedef interface IWbemClassObject IWbemClassObject;
#endif

#ifndef __IWbemQualifierSet_FWD_DEFINED__
#define __IWbemQualifierSet_FWD_DEFINED__
typedef interface IWbemQualifierSet IWbemQualifierSet;
#endif

#ifndef __IWbemLocator_FWD_DEFINED__
#define __IWbemLocator_FWD_DEFINED__
typedef interface IWbemLocator IWbemLocator;
#endif

#ifndef __IWbemObjectSink_FWD_DEFINED__
#define __IWbemObjectSink_FWD_DEFINED__
typedef interface IWbemObjectSink IWbemObjectSink;
#endif

#ifndef __IWbemObjectSinkEx_FWD_DEFINED__
#define __IWbemObjectSinkEx_FWD_DEFINED__
typedef interface IWbemObjectSinkEx IWbemObjectSinkEx;
#endif

#ifndef __IEnumWbemClassObject_FWD_DEFINED__
#define __IEnumWbemClassObject_FWD_DEFINED__
typedef interface IEnumWbemClassObject IEnumWbemClassObject;
#endif

#ifndef __IWbemContext_FWD_DEFINED__
#define __IWbemContext_FWD_DEFINED__
typedef interface IWbemContext IWbemContext;
#endif

#ifndef __IWbemCallResult_FWD_DEFINED__
#define __IWbemCallResult_FWD_DEFINED__
typedef interface IWbemCallResult IWbemCallResult;
#endif

#ifndef __IWbemServices_FWD_DEFINED__
#define __IWbemServices_FWD_DEFINED__
typedef interface IWbemServices IWbemServices;
#endif

#ifndef __IWbemShutdown_FWD_DEFINED__
#define __IWbemShutdown_FWD_DEFINED__
typedef interface IWbemShutdown IWbemShutdown;
#endif

#ifndef __IWbemObjectTextSrc_FWD_DEFINED__
#define __IWbemObjectTextSrc_FWD_DEFINED__
typedef interface IWbemObjectTextSrc IWbemObjectTextSrc;
#endif

#ifndef __IWbemObjectAccess_FWD_DEFINED__
#define __IWbemObjectAccess_FWD_DEFINED__
typedef interface IWbemObjectAccess IWbemObjectAccess;
#endif

#ifndef __IMofCompiler_FWD_DEFINED__
#define __IMofCompiler_FWD_DEFINED__
typedef interface IMofCompiler IMofCompiler;
#endif

#ifndef __IUnsecuredApartment_FWD_DEFINED__
#define __IUnsecuredApartment_FWD_DEFINED__
typedef interface IUnsecuredApartment IUnsecuredApartment;
#endif

#ifndef __IWbemUnsecuredApartment_FWD_DEFINED__
#define __IWbemUnsecuredApartment_FWD_DEFINED__
typedef interface IWbemUnsecuredApartment IWbemUnsecuredApartment;
#endif

#ifndef __IWbemStatusCodeText_FWD_DEFINED__
#define __IWbemStatusCodeText_FWD_DEFINED__
typedef interface IWbemStatusCodeText IWbemStatusCodeText;
#endif

#ifndef __IWbemBackupRestore_FWD_DEFINED__
#define __IWbemBackupRestore_FWD_DEFINED__
typedef interface IWbemBackupRestore IWbemBackupRestore;
#endif

#ifndef __IWbemBackupRestoreEx_FWD_DEFINED__
#define __IWbemBackupRestoreEx_FWD_DEFINED__
typedef interface IWbemBackupRestoreEx IWbemBackupRestoreEx;
#endif

#ifndef __IWbemRefresher_FWD_DEFINED__
#define __IWbemRefresher_FWD_DEFINED__
typedef interface IWbemRefresher IWbemRefresher;
#endif

#ifndef __IWbemHiPerfEnum_FWD_DEFINED__
#define __IWbemHiPerfEnum_FWD_DEFINED__
typedef interface IWbemHiPerfEnum IWbemHiPerfEnum;
#endif

#ifndef __IWbemConfigureRefresher_FWD_DEFINED__
#define __IWbemConfigureRefresher_FWD_DEFINED__
typedef interface IWbemConfigureRefresher IWbemConfigureRefresher;
#endif

/* Headers for imported files */

#include <ocidl.h>
#include <oleidl.h>
#include <oaidl.h>
#include <servprov.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.
 */

#ifndef __IEnumWbemClassObject_FWD_DEFINED__
#define __IEnumWbemClassObject_FWD_DEFINED__
typedef interface IEnumWbemClassObject IEnumWbemClassObject;
#endif

#ifndef __IUnsecuredApartment_FWD_DEFINED__
#define __IUnsecuredApartment_FWD_DEFINED__
typedef interface IUnsecuredApartment IUnsecuredApartment;
#endif

#ifndef __IWbemBackupRestore_FWD_DEFINED__
#define __IWbemBackupRestore_FWD_DEFINED__
typedef interface IWbemBackupRestore IWbemBackupRestore;
#endif

#ifndef __IWbemBackupRestoreEx_FWD_DEFINED__
#define __IWbemBackupRestoreEx_FWD_DEFINED__
typedef interface IWbemBackupRestoreEx IWbemBackupRestoreEx;
#endif

#ifndef __IWbemCallResult_FWD_DEFINED__
#define __IWbemCallResult_FWD_DEFINED__
typedef interface IWbemCallResult IWbemCallResult;
#endif

#ifndef __IWbemClassObject_FWD_DEFINED__
#define __IWbemClassObject_FWD_DEFINED__
typedef interface IWbemClassObject IWbemClassObject;
#endif

#ifndef __IWbemConfigureRefresher_FWD_DEFINED__
#define __IWbemConfigureRefresher_FWD_DEFINED__
typedef interface IWbemConfigureRefresher IWbemConfigureRefresher;
#endif

#ifndef __IWbemConnection_FWD_DEFINED__
#define __IWbemConnection_FWD_DEFINED__
typedef interface IWbemConnection IWbemConnection;
#endif

#ifndef __IWbemContext_FWD_DEFINED__
#define __IWbemContext_FWD_DEFINED__
typedef interface IWbemContext IWbemContext;
#endif

#ifndef __IWbemEventSink_FWD_DEFINED__
#define __IWbemEventSink_FWD_DEFINED__
typedef interface IWbemEventSink IWbemEventSink;
#endif

#ifndef __IWbemHiPerfEnum_FWD_DEFINED__
#define __IWbemHiPerfEnum_FWD_DEFINED__
typedef interface IWbemHiPerfEnum IWbemHiPerfEnum;
#endif

#ifndef __IWbemLocator_FWD_DEFINED__
#define __IWbemLocator_FWD_DEFINED__
typedef interface IWbemLocator IWbemLocator;
#endif

#ifndef __IWbemObjectAccess_FWD_DEFINED__
#define __IWbemObjectAccess_FWD_DEFINED__
typedef interface IWbemObjectAccess IWbemObjectAccess;
#endif

#ifndef __IWbemObjectSink_FWD_DEFINED__
#define __IWbemObjectSink_FWD_DEFINED__
typedef interface IWbemObjectSink IWbemObjectSink;
#endif

#ifndef __IWbemQualifierSet_FWD_DEFINED__
#define __IWbemQualifierSet_FWD_DEFINED__
typedef interface IWbemQualifierSet IWbemQualifierSet;
#endif

#ifndef __IWbemRefresher_FWD_DEFINED__
#define __IWbemRefresher_FWD_DEFINED__
typedef interface IWbemRefresher IWbemRefresher;
#endif

#ifndef __IWbemSecureObjectSink_FWD_DEFINED__
#define __IWbemSecureObjectSink_FWD_DEFINED__
typedef interface IWbemSecureObjectSink IWbemSecureObjectSink;
#endif

#ifndef __IWbemServices_FWD_DEFINED__
#define __IWbemServices_FWD_DEFINED__
typedef interface IWbemServices IWbemServices;
#endif

#ifndef __IWbemStatusCodeText_FWD_DEFINED__
#define __IWbemStatusCodeText_FWD_DEFINED__
typedef interface IWbemStatusCodeText IWbemStatusCodeText;
#endif

#ifndef __IWbemUnsecuredApartment_FWD_DEFINED__
#define __IWbemUnsecuredApartment_FWD_DEFINED__
typedef interface IWbemUnsecuredApartment IWbemUnsecuredApartment;
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

DEFINE_GUID(LIBID_WbemClient_v1, 0x7ec196fe, 0x7005, 0x11d1, 0xad,0x90, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);

typedef enum tag_WBEM_GENUS_TYPE {
    WBEM_GENUS_CLASS = 1,
    WBEM_GENUS_INSTANCE = 2
} WBEM_GENUS_TYPE;
typedef enum tag_WBEM_CHANGE_FLAG_TYPE {
    WBEM_FLAG_CREATE_OR_UPDATE = 0,
    WBEM_FLAG_UPDATE_ONLY = 0x1,
    WBEM_FLAG_CREATE_ONLY = 0x2,
    WBEM_FLAG_UPDATE_COMPATIBLE = 0x0,
    WBEM_FLAG_UPDATE_SAFE_MODE = 0x20,
    WBEM_FLAG_UPDATE_FORCE_MODE = 0x40,
    WBEM_MASK_UPDATE_MODE = 0x60,
    WBEM_FLAG_ADVISORY = 0x10000
} WBEM_CHANGE_FLAG_TYPE;
typedef enum tag_WBEM_GENERIC_FLAG_TYPE {
    WBEM_FLAG_RETURN_IMMEDIATELY = 0x10,
    WBEM_FLAG_RETURN_WBEM_COMPLETE = 0,
    WBEM_FLAG_BIDIRECTIONAL = 0,
    WBEM_FLAG_FORWARD_ONLY = 0x20,
    WBEM_FLAG_NO_ERROR_OBJECT = 0x40,
    WBEM_FLAG_RETURN_ERROR_OBJECT = 0,
    WBEM_FLAG_SEND_STATUS = 0x80,
    WBEM_FLAG_DONT_SEND_STATUS = 0,
    WBEM_FLAG_ENSURE_LOCATABLE = 0x100,
    WBEM_FLAG_DIRECT_READ = 0x200,
    WBEM_FLAG_SEND_ONLY_SELECTED = 0,
    WBEM_RETURN_WHEN_COMPLETE = 0,
    WBEM_RETURN_IMMEDIATELY = 0x10,
    WBEM_MASK_RESERVED_FLAGS = 0x1f000,
    WBEM_FLAG_USE_AMENDED_QUALIFIERS = 0x20000,
    WBEM_FLAG_STRONG_VALIDATION = 0x100000
} WBEM_GENERIC_FLAG_TYPE;
typedef enum tag_WBEM_STATUS_TYPE {
    WBEM_STATUS_COMPLETE = 0,
    WBEM_STATUS_REQUIREMENTS = 1,
    WBEM_STATUS_PROGRESS = 2,
    WBEM_STATUS_LOGGING_INFORMATION = 0x100,
    WBEM_STATUS_LOGGING_INFORMATION_PROVIDER = 0x200,
    WBEM_STATUS_LOGGING_INFORMATION_HOST = 0x400,
    WBEM_STATUS_LOGGING_INFORMATION_REPOSITORY = 0x800,
    WBEM_STATUS_LOGGING_INFORMATION_ESS = 0x1000
} WBEM_STATUS_TYPE;
typedef enum tag_WBEM_TIMEOUT_TYPE {
    WBEM_NO_WAIT = 0,
    WBEM_INFINITE = 0xffffffff
} WBEM_TIMEOUT_TYPE;
typedef enum tag_WBEM_CONDITION_FLAG_TYPE {
    WBEM_FLAG_ALWAYS = 0,
    WBEM_FLAG_ONLY_IF_TRUE = 0x1,
    WBEM_FLAG_ONLY_IF_FALSE = 0x2,
    WBEM_FLAG_ONLY_IF_IDENTICAL = 0x3,
    WBEM_MASK_PRIMARY_CONDITION = 0x3,
    WBEM_FLAG_KEYS_ONLY = 0x4,
    WBEM_FLAG_REFS_ONLY = 0x8,
    WBEM_FLAG_LOCAL_ONLY = 0x10,
    WBEM_FLAG_PROPAGATED_ONLY = 0x20,
    WBEM_FLAG_SYSTEM_ONLY = 0x30,
    WBEM_FLAG_NONSYSTEM_ONLY = 0x40,
    WBEM_MASK_CONDITION_ORIGIN = 0x70,
    WBEM_FLAG_CLASS_OVERRIDES_ONLY = 0x100,
    WBEM_FLAG_CLASS_LOCAL_AND_OVERRIDES = 0x200,
    WBEM_MASK_CLASS_CONDITION = 0x300
} WBEM_CONDITION_FLAG_TYPE;
typedef enum tag_WBEM_FLAVOR_TYPE {
    WBEM_FLAVOR_DONT_PROPAGATE = 0,
    WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE = 0x1,
    WBEM_FLAVOR_FLAG_PROPAGATE_TO_DERIVED_CLASS = 0x2,
    WBEM_FLAVOR_MASK_PROPAGATION = 0xf,
    WBEM_FLAVOR_OVERRIDABLE = 0,
    WBEM_FLAVOR_NOT_OVERRIDABLE = 0x10,
    WBEM_FLAVOR_MASK_PERMISSIONS = 0x10,
    WBEM_FLAVOR_ORIGIN_LOCAL = 0,
    WBEM_FLAVOR_ORIGIN_PROPAGATED = 0x20,
    WBEM_FLAVOR_ORIGIN_SYSTEM = 0x40,
    WBEM_FLAVOR_MASK_ORIGIN = 0x60,
    WBEM_FLAVOR_NOT_AMENDED = 0,
    WBEM_FLAVOR_AMENDED = 0x80,
    WBEM_FLAVOR_MASK_AMENDED = 0x80
} WBEM_FLAVOR_TYPE;
typedef enum tag_WBEM_QUERY_FLAG_TYPE {
    WBEM_FLAG_DEEP = 0,
    WBEM_FLAG_SHALLOW = 1,
    WBEM_FLAG_PROTOTYPE = 2
} WBEM_QUERY_FLAG_TYPE;
typedef enum tag_WBEM_SECURITY_FLAGS {
    WBEM_ENABLE = 1,
    WBEM_METHOD_EXECUTE = 2,
    WBEM_FULL_WRITE_REP = 4,
    WBEM_PARTIAL_WRITE_REP = 8,
    WBEM_WRITE_PROVIDER = 0x10,
    WBEM_REMOTE_ACCESS = 0x20,
    WBEM_RIGHT_SUBSCRIBE = 0x40,
    WBEM_RIGHT_PUBLISH = 0x80
} WBEM_SECURITY_FLAGS;
typedef enum tag_WBEM_LIMITATION_FLAG_TYPE {
    WBEM_FLAG_EXCLUDE_OBJECT_QUALIFIERS = 0x10,
    WBEM_FLAG_EXCLUDE_PROPERTY_QUALIFIERS = 0x20
} WBEM_LIMITATION_FLAG_TYPE;
typedef enum tag_WBEM_TEXT_FLAG_TYPE {
    WBEM_FLAG_NO_FLAVORS = 0x1
} WBEM_TEXT_FLAG_TYPE;
typedef enum tag_WBEM_COMPARISON_FLAG {
    WBEM_COMPARISON_INCLUDE_ALL = 0,
    WBEM_FLAG_IGNORE_QUALIFIERS = 0x1,
    WBEM_FLAG_IGNORE_OBJECT_SOURCE = 0x2,
    WBEM_FLAG_IGNORE_DEFAULT_VALUES = 0x4,
    WBEM_FLAG_IGNORE_CLASS = 0x8,
    WBEM_FLAG_IGNORE_CASE = 0x10,
    WBEM_FLAG_IGNORE_FLAVOR = 0x20
} WBEM_COMPARISON_FLAG;
typedef enum tag_WBEM_LOCKING {
    WBEM_FLAG_ALLOW_READ = 0x1
} WBEM_LOCKING_FLAG_TYPE;
typedef enum tag_CIMTYPE_ENUMERATION {
    CIM_ILLEGAL = 0xfff,
    CIM_EMPTY = 0,
    CIM_SINT8 = 16,
    CIM_UINT8 = 17,
    CIM_SINT16 = 2,
    CIM_UINT16 = 18,
    CIM_SINT32 = 3,
    CIM_UINT32 = 19,
    CIM_SINT64 = 20,
    CIM_UINT64 = 21,
    CIM_REAL32 = 4,
    CIM_REAL64 = 5,
    CIM_BOOLEAN = 11,
    CIM_STRING = 8,
    CIM_DATETIME = 101,
    CIM_REFERENCE = 102,
    CIM_CHAR16 = 103,
    CIM_OBJECT = 13,
    CIM_FLAG_ARRAY = 0x2000
} CIMTYPE_ENUMERATION;
typedef enum tag_WBEM_BACKUP_RESTORE_FLAGS {
    WBEM_FLAG_BACKUP_RESTORE_DEFAULT = 0,
    WBEM_FLAG_BACKUP_RESTORE_FORCE_SHUTDOWN = 1
} WBEM_BACKUP_RESTORE_FLAGS;
typedef enum tag_WBEM_REFRESHER_FLAGS {
    WBEM_FLAG_REFRESH_AUTO_RECONNECT = 0,
    WBEM_FLAG_REFRESH_NO_AUTO_RECONNECT = 1
} WBEM_REFRESHER_FLAGS;
typedef enum tag_WBEM_SHUTDOWN_FLAGS {
    WBEM_SHUTDOWN_UNLOAD_COMPONENT = 1,
    WBEM_SHUTDOWN_WMI = 2,
    WBEM_SHUTDOWN_OS = 3
} WBEM_SHUTDOWN_FLAGS;
typedef enum tag_WBEMSTATUS_FORMAT {
    WBEMSTATUS_FORMAT_NEWLINE = 0,
    WBEMSTATUS_FORMAT_NO_NEWLINE = 1
} WBEMSTATUS_FORMAT;
typedef enum tag_WBEM_LIMITS {
    WBEM_MAX_IDENTIFIER = 0x1000,
    WBEM_MAX_QUERY = 0x4000,
    WBEM_MAX_PATH = 0x2000,
    WBEM_MAX_OBJECT_NESTING = 64,
    WBEM_MAX_USER_PROPERTIES = 1024
} WBEM_LIMITS;
typedef enum tag_WBEMSTATUS {
    WBEM_NO_ERROR = 0,
    WBEM_S_NO_ERROR = 0,
    WBEM_S_SAME = 0,
    WBEM_S_FALSE = 1,
    WBEM_S_ALREADY_EXISTS = 0x40001,
    WBEM_S_RESET_TO_DEFAULT = 0x40002,
    WBEM_S_DIFFERENT = 0x40003,
    WBEM_S_TIMEDOUT = 0x40004,
    WBEM_S_NO_MORE_DATA = 0x40005,
    WBEM_S_OPERATION_CANCELLED = 0x40006,
    WBEM_S_PENDING = 0x40007,
    WBEM_S_DUPLICATE_OBJECTS = 0x40008,
    WBEM_S_ACCESS_DENIED = 0x40009,
    WBEM_S_PARTIAL_RESULTS = 0x40010,
    WBEM_S_SOURCE_NOT_AVAILABLE = 0x40017,
    WBEM_E_FAILED = 0x80041001,
    WBEM_E_NOT_FOUND = 0x80041002,
    WBEM_E_ACCESS_DENIED = 0x80041003,
    WBEM_E_PROVIDER_FAILURE = 0x80041004,
    WBEM_E_TYPE_MISMATCH = 0x80041005,
    WBEM_E_OUT_OF_MEMORY = 0x80041006,
    WBEM_E_INVALID_CONTEXT = 0x80041007,
    WBEM_E_INVALID_PARAMETER = 0x80041008,
    WBEM_E_NOT_AVAILABLE = 0x80041009,
    WBEM_E_CRITICAL_ERROR = 0x8004100a,
    WBEM_E_INVALID_STREAM = 0x8004100b,
    WBEM_E_NOT_SUPPORTED = 0x8004100c,
    WBEM_E_INVALID_SUPERCLASS = 0x8004100d,
    WBEM_E_INVALID_NAMESPACE = 0x8004100e,
    WBEM_E_INVALID_OBJECT = 0x8004100f,
    WBEM_E_INVALID_CLASS = 0x80041010,
    WBEM_E_PROVIDER_NOT_FOUND = 0x80041011,
    WBEM_E_INVALID_PROVIDER_REGISTRATION = 0x80041012,
    WBEM_E_PROVIDER_LOAD_FAILURE = 0x80041013,
    WBEM_E_INITIALIZATION_FAILURE = 0x80041014,
    WBEM_E_TRANSPORT_FAILURE = 0x80041015,
    WBEM_E_INVALID_OPERATION = 0x80041016,
    WBEM_E_INVALID_QUERY = 0x80041017,
    WBEM_E_INVALID_QUERY_TYPE = 0x80041018,
    WBEM_E_ALREADY_EXISTS = 0x80041019,
    WBEM_E_OVERRIDE_NOT_ALLOWED = 0x8004101a,
    WBEM_E_PROPAGATED_QUALIFIER = 0x8004101b,
    WBEM_E_PROPAGATED_PROPERTY = 0x8004101c,
    WBEM_E_UNEXPECTED = 0x8004101d,
    WBEM_E_ILLEGAL_OPERATION = 0x8004101e,
    WBEM_E_CANNOT_BE_KEY = 0x8004101f,
    WBEM_E_INCOMPLETE_CLASS = 0x80041020,
    WBEM_E_INVALID_SYNTAX = 0x80041021,
    WBEM_E_NONDECORATED_OBJECT = 0x80041022,
    WBEM_E_READ_ONLY = 0x80041023,
    WBEM_E_PROVIDER_NOT_CAPABLE = 0x80041024,
    WBEM_E_CLASS_HAS_CHILDREN = 0x80041025,
    WBEM_E_CLASS_HAS_INSTANCES = 0x80041026,
    WBEM_E_QUERY_NOT_IMPLEMENTED = 0x80041027,
    WBEM_E_ILLEGAL_NULL = 0x80041028,
    WBEM_E_INVALID_QUALIFIER_TYPE = 0x80041029,
    WBEM_E_INVALID_PROPERTY_TYPE = 0x8004102a,
    WBEM_E_VALUE_OUT_OF_RANGE = 0x8004102b,
    WBEM_E_CANNOT_BE_SINGLETON = 0x8004102c,
    WBEM_E_INVALID_CIM_TYPE = 0x8004102d,
    WBEM_E_INVALID_METHOD = 0x8004102e,
    WBEM_E_INVALID_METHOD_PARAMETERS = 0x8004102f,
    WBEM_E_SYSTEM_PROPERTY = 0x80041030,
    WBEM_E_INVALID_PROPERTY = 0x80041031,
    WBEM_E_CALL_CANCELLED = 0x80041032,
    WBEM_E_SHUTTING_DOWN = 0x80041033,
    WBEM_E_PROPAGATED_METHOD = 0x80041034,
    WBEM_E_UNSUPPORTED_PARAMETER = 0x80041035,
    WBEM_E_MISSING_PARAMETER_ID = 0x80041036,
    WBEM_E_INVALID_PARAMETER_ID = 0x80041037,
    WBEM_E_NONCONSECUTIVE_PARAMETER_IDS = 0x80041038,
    WBEM_E_PARAMETER_ID_ON_RETVAL = 0x80041039,
    WBEM_E_INVALID_OBJECT_PATH = 0x8004103a,
    WBEM_E_OUT_OF_DISK_SPACE = 0x8004103b,
    WBEM_E_BUFFER_TOO_SMALL = 0x8004103c,
    WBEM_E_UNSUPPORTED_PUT_EXTENSION = 0x8004103d,
    WBEM_E_UNKNOWN_OBJECT_TYPE = 0x8004103e,
    WBEM_E_UNKNOWN_PACKET_TYPE = 0x8004103f,
    WBEM_E_MARSHAL_VERSION_MISMATCH = 0x80041040,
    WBEM_E_MARSHAL_INVALID_SIGNATURE = 0x80041041,
    WBEM_E_INVALID_QUALIFIER = 0x80041042,
    WBEM_E_INVALID_DUPLICATE_PARAMETER = 0x80041043,
    WBEM_E_TOO_MUCH_DATA = 0x80041044,
    WBEM_E_SERVER_TOO_BUSY = 0x80041045,
    WBEM_E_INVALID_FLAVOR = 0x80041046,
    WBEM_E_CIRCULAR_REFERENCE = 0x80041047,
    WBEM_E_UNSUPPORTED_CLASS_UPDATE = 0x80041048,
    WBEM_E_CANNOT_CHANGE_KEY_INHERITANCE = 0x80041049,
    WBEM_E_CANNOT_CHANGE_INDEX_INHERITANCE = 0x80041050,
    WBEM_E_TOO_MANY_PROPERTIES = 0x80041051,
    WBEM_E_UPDATE_TYPE_MISMATCH = 0x80041052,
    WBEM_E_UPDATE_OVERRIDE_NOT_ALLOWED = 0x80041053,
    WBEM_E_UPDATE_PROPAGATED_METHOD = 0x80041054,
    WBEM_E_METHOD_NOT_IMPLEMENTED = 0x80041055,
    WBEM_E_METHOD_DISABLED = 0x80041056,
    WBEM_E_REFRESHER_BUSY = 0x80041057,
    WBEM_E_UNPARSABLE_QUERY = 0x80041058,
    WBEM_E_NOT_EVENT_CLASS = 0x80041059,
    WBEM_E_MISSING_GROUP_WITHIN = 0x8004105a,
    WBEM_E_MISSING_AGGREGATION_LIST = 0x8004105b,
    WBEM_E_PROPERTY_NOT_AN_OBJECT = 0x8004105c,
    WBEM_E_AGGREGATING_BY_OBJECT = 0x8004105d,
    WBEM_E_UNINTERPRETABLE_PROVIDER_QUERY = 0x8004105f,
    WBEM_E_BACKUP_RESTORE_WINMGMT_RUNNING = 0x80041060,
    WBEM_E_QUEUE_OVERFLOW = 0x80041061,
    WBEM_E_PRIVILEGE_NOT_HELD = 0x80041062,
    WBEM_E_INVALID_OPERATOR = 0x80041063,
    WBEM_E_LOCAL_CREDENTIALS = 0x80041064,
    WBEM_E_CANNOT_BE_ABSTRACT = 0x80041065,
    WBEM_E_AMENDED_OBJECT = 0x80041066,
    WBEM_E_CLIENT_TOO_SLOW = 0x80041067,
    WBEM_E_NULL_SECURITY_DESCRIPTOR = 0x80041068,
    WBEM_E_TIMED_OUT = 0x80041069,
    WBEM_E_INVALID_ASSOCIATION = 0x8004106a,
    WBEM_E_AMBIGUOUS_OPERATION = 0x8004106b,
    WBEM_E_QUOTA_VIOLATION = 0x8004106c,
    WBEM_E_RESERVED_001 = 0x8004106d,
    WBEM_E_RESERVED_002 = 0x8004106e,
    WBEM_E_UNSUPPORTED_LOCALE = 0x8004106f,
    WBEM_E_HANDLE_OUT_OF_DATE = 0x80041070,
    WBEM_E_CONNECTION_FAILED = 0x80041071,
    WBEM_E_INVALID_HANDLE_REQUEST = 0x80041072,
    WBEM_E_PROPERTY_NAME_TOO_WIDE = 0x80041073,
    WBEM_E_CLASS_NAME_TOO_WIDE = 0x80041074,
    WBEM_E_METHOD_NAME_TOO_WIDE = 0x80041075,
    WBEM_E_QUALIFIER_NAME_TOO_WIDE = 0x80041076,
    WBEM_E_RERUN_COMMAND = 0x80041077,
    WBEM_E_DATABASE_VER_MISMATCH = 0x80041078,
    WBEM_E_VETO_DELETE = 0x80041079,
    WBEM_E_VETO_PUT = 0x8004107a,
    WBEM_E_INVALID_LOCALE = 0x80041080,
    WBEM_E_PROVIDER_SUSPENDED = 0x80041081,
    WBEM_E_SYNCHRONIZATION_REQUIRED = 0x80041082,
    WBEM_E_NO_SCHEMA = 0x80041083,
    WBEM_E_PROVIDER_ALREADY_REGISTERED = 0x80041084,
    WBEM_E_PROVIDER_NOT_REGISTERED = 0x80041085,
    WBEM_E_FATAL_TRANSPORT_ERROR = 0x80041086,
    WBEM_E_ENCRYPTED_CONNECTION_REQUIRED = 0x80041087,
    WBEM_E_PROVIDER_TIMED_OUT = 0x80041088,
    WBEM_E_NO_KEY = 0x80041089,
    WBEM_E_PROVIDER_DISABLED = 0x8004108a,
    WBEMESS_E_REGISTRATION_TOO_BROAD = 0x80042001,
    WBEMESS_E_REGISTRATION_TOO_PRECISE = 0x80042002,
    WBEMESS_E_AUTHZ_NOT_PRIVILEGED = 0x80042003,
    WBEMMOF_E_EXPECTED_QUALIFIER_NAME = 0x80044001,
    WBEMMOF_E_EXPECTED_SEMI = 0x80044002,
    WBEMMOF_E_EXPECTED_OPEN_BRACE = 0x80044003,
    WBEMMOF_E_EXPECTED_CLOSE_BRACE = 0x80044004,
    WBEMMOF_E_EXPECTED_CLOSE_BRACKET = 0x80044005,
    WBEMMOF_E_EXPECTED_CLOSE_PAREN = 0x80044006,
    WBEMMOF_E_ILLEGAL_CONSTANT_VALUE = 0x80044007,
    WBEMMOF_E_EXPECTED_TYPE_IDENTIFIER = 0x80044008,
    WBEMMOF_E_EXPECTED_OPEN_PAREN = 0x80044009,
    WBEMMOF_E_UNRECOGNIZED_TOKEN = 0x8004400a,
    WBEMMOF_E_UNRECOGNIZED_TYPE = 0x8004400b,
    WBEMMOF_E_EXPECTED_PROPERTY_NAME = 0x8004400c,
    WBEMMOF_E_TYPEDEF_NOT_SUPPORTED = 0x8004400d,
    WBEMMOF_E_UNEXPECTED_ALIAS = 0x8004400e,
    WBEMMOF_E_UNEXPECTED_ARRAY_INIT = 0x8004400f,
    WBEMMOF_E_INVALID_AMENDMENT_SYNTAX = 0x80044010,
    WBEMMOF_E_INVALID_DUPLICATE_AMENDMENT = 0x80044011,
    WBEMMOF_E_INVALID_PRAGMA = 0x80044012,
    WBEMMOF_E_INVALID_NAMESPACE_SYNTAX = 0x80044013,
    WBEMMOF_E_EXPECTED_CLASS_NAME = 0x80044014,
    WBEMMOF_E_TYPE_MISMATCH = 0x80044015,
    WBEMMOF_E_EXPECTED_ALIAS_NAME = 0x80044016,
    WBEMMOF_E_INVALID_CLASS_DECLARATION = 0x80044017,
    WBEMMOF_E_INVALID_INSTANCE_DECLARATION = 0x80044018,
    WBEMMOF_E_EXPECTED_DOLLAR = 0x80044019,
    WBEMMOF_E_CIMTYPE_QUALIFIER = 0x8004401a,
    WBEMMOF_E_DUPLICATE_PROPERTY = 0x8004401b,
    WBEMMOF_E_INVALID_NAMESPACE_SPECIFICATION = 0x8004401c,
    WBEMMOF_E_OUT_OF_RANGE = 0x8004401d,
    WBEMMOF_E_INVALID_FILE = 0x8004401e,
    WBEMMOF_E_ALIASES_IN_EMBEDDED = 0x8004401f,
    WBEMMOF_E_NULL_ARRAY_ELEM = 0x80044020,
    WBEMMOF_E_DUPLICATE_QUALIFIER = 0x80044021,
    WBEMMOF_E_EXPECTED_FLAVOR_TYPE = 0x80044022,
    WBEMMOF_E_INCOMPATIBLE_FLAVOR_TYPES = 0x80044023,
    WBEMMOF_E_MULTIPLE_ALIASES = 0x80044024,
    WBEMMOF_E_INCOMPATIBLE_FLAVOR_TYPES2 = 0x80044025,
    WBEMMOF_E_NO_ARRAYS_RETURNED = 0x80044026,
    WBEMMOF_E_MUST_BE_IN_OR_OUT = 0x80044027,
    WBEMMOF_E_INVALID_FLAGS_SYNTAX = 0x80044028,
    WBEMMOF_E_EXPECTED_BRACE_OR_BAD_TYPE = 0x80044029,
    WBEMMOF_E_UNSUPPORTED_CIMV22_QUAL_VALUE = 0x8004402a,
    WBEMMOF_E_UNSUPPORTED_CIMV22_DATA_TYPE = 0x8004402b,
    WBEMMOF_E_INVALID_DELETEINSTANCE_SYNTAX = 0x8004402c,
    WBEMMOF_E_INVALID_QUALIFIER_SYNTAX = 0x8004402d,
    WBEMMOF_E_QUALIFIER_USED_OUTSIDE_SCOPE = 0x8004402e,
    WBEMMOF_E_ERROR_CREATING_TEMP_FILE = 0x8004402f,
    WBEMMOF_E_ERROR_INVALID_INCLUDE_FILE = 0x80044030,
    WBEMMOF_E_INVALID_DELETECLASS_SYNTAX = 0x80044031
} WBEMSTATUS;
typedef enum tag_WMI_OBJ_TEXT {
    WMI_OBJ_TEXT_CIM_DTD_2_0 = 1,
    WMI_OBJ_TEXT_WMI_DTD_2_0 = 2,
    WMI_OBJ_TEXT_WMI_EXT1 = 3,
    WMI_OBJ_TEXT_WMI_EXT2 = 4,
    WMI_OBJ_TEXT_WMI_EXT3 = 5,
    WMI_OBJ_TEXT_WMI_EXT4 = 6,
    WMI_OBJ_TEXT_WMI_EXT5 = 7,
    WMI_OBJ_TEXT_WMI_EXT6 = 8,
    WMI_OBJ_TEXT_WMI_EXT7 = 9,
    WMI_OBJ_TEXT_WMI_EXT8 = 10,
    WMI_OBJ_TEXT_WMI_EXT9 = 11,
    WMI_OBJ_TEXT_WMI_EXT10 = 12,
    WMI_OBJ_TEXT_LAST = 13
} WMI_OBJ_TEXT;
typedef enum tag_WBEM_COMPILER_OPTIONS {
    WBEM_FLAG_CHECK_ONLY = 0x1,
    WBEM_FLAG_AUTORECOVER = 0x2,
    WBEM_FLAG_WMI_CHECK = 0x4,
    WBEM_FLAG_CONSOLE_PRINT = 0x8,
    WBEM_FLAG_DONT_ADD_TO_LIST = 0x10,
    WBEM_FLAG_SPLIT_FILES = 0x20,
    WBEM_FLAG_STORE_FILE = 0x100
} WBEM_COMPILER_OPTIONS;
typedef enum tag_WBEM_CONNECT_OPTIONS {
    WBEM_FLAG_CONNECT_REPOSITORY_ONLY = 0x40,
    WBEM_FLAG_CONNECT_USE_MAX_WAIT = 0x80,
    WBEM_FLAG_CONNECT_PROVIDERS = 0x100
} WBEM_CONNECT_OPTIONS;
typedef enum tag_WBEM_UNSECAPP_FLAG_TYPE {
    WBEM_FLAG_UNSECAPP_DEFAULT_CHECK_ACCESS = 0,
    WBEM_FLAG_UNSECAPP_CHECK_ACCESS = 1,
    WBEM_FLAG_UNSECAPP_DONT_CHECK_ACCESS = 2
} WBEM_UNSECAPP_FLAG_TYPE;
typedef enum tag_WBEM_INFORMATION_FLAG_TYPE {
    WBEM_FLAG_SHORT_NAME = 0x1,
    WBEM_FLAG_LONG_NAME = 0x2
} WBEM_INFORMATION_FLAG_TYPE;
typedef struct tag_CompileStatusInfo {
    LONG lPhaseError;
    HRESULT hRes;
    LONG ObjectNum;
    LONG FirstLine;
    LONG LastLine;
    DWORD dwOutFlags;
} WBEM_COMPILE_STATUS_INFO;
typedef LONG CIMTYPE;
/*****************************************************************************
 * WbemBackupRestore coclass
 */

DEFINE_GUID(CLSID_WbemBackupRestore, 0xc49e32c6, 0xbc8b, 0x11d2, 0x85,0xd4, 0x00,0x10,0x5a,0x1f,0x83,0x04);

#ifdef __cplusplus
class DECLSPEC_UUID("c49e32c6-bc8b-11d2-85d4-00105a1f8304") WbemBackupRestore;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemBackupRestore, 0xc49e32c6, 0xbc8b, 0x11d2, 0x85,0xd4, 0x00,0x10,0x5a,0x1f,0x83,0x04)
#endif
#endif

/*****************************************************************************
 * WbemClassObject coclass
 */

DEFINE_GUID(CLSID_WbemClassObject, 0x9a653086, 0x174f, 0x11d2, 0xb5,0xf9, 0x00,0x10,0x4b,0x70,0x3e,0xfd);

#ifdef __cplusplus
class DECLSPEC_UUID("9a653086-174f-11d2-b5f9-00104b703efd") WbemClassObject;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemClassObject, 0x9a653086, 0x174f, 0x11d2, 0xb5,0xf9, 0x00,0x10,0x4b,0x70,0x3e,0xfd)
#endif
#endif

/*****************************************************************************
 * WbemContext coclass
 */

DEFINE_GUID(CLSID_WbemContext, 0x674b6698, 0xee92, 0x11d0, 0xad,0x71, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);

#ifdef __cplusplus
class DECLSPEC_UUID("674b6698-ee92-11d0-ad71-00c04fd8fdff") WbemContext;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemContext, 0x674b6698, 0xee92, 0x11d0, 0xad,0x71, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#endif

/*****************************************************************************
 * WbemLocator coclass
 */

DEFINE_GUID(CLSID_WbemLocator, 0x4590f811, 0x1d3a, 0x11d0, 0x89,0x1f, 0x00,0xaa,0x00,0x4b,0x2e,0x24);

#ifdef __cplusplus
class DECLSPEC_UUID("4590f811-1d3a-11d0-891f-00aa004b2e24") WbemLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemLocator, 0x4590f811, 0x1d3a, 0x11d0, 0x89,0x1f, 0x00,0xaa,0x00,0x4b,0x2e,0x24)
#endif
#endif

/*****************************************************************************
 * WbemStatusCodeText coclass
 */

DEFINE_GUID(CLSID_WbemStatusCodeText, 0xeb87e1bd, 0x3233, 0x11d2, 0xae,0xc9, 0x00,0xc0,0x4f,0xb6,0x88,0x20);

#ifdef __cplusplus
class DECLSPEC_UUID("eb87e1bd-3233-11d2-aec9-00c04fb68820") WbemStatusCodeText;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemStatusCodeText, 0xeb87e1bd, 0x3233, 0x11d2, 0xae,0xc9, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#endif

/*****************************************************************************
 * UnsecuredApartment coclass
 */

DEFINE_GUID(CLSID_UnsecuredApartment, 0x49bd2028, 0x1523, 0x11d1, 0xad,0x79, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);

#ifdef __cplusplus
class DECLSPEC_UUID("49bd2028-1523-11d1-ad79-00c04fd8fdff") UnsecuredApartment;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UnsecuredApartment, 0x49bd2028, 0x1523, 0x11d1, 0xad,0x79, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#endif

/*****************************************************************************
 * MofCompiler coclass
 */

DEFINE_GUID(CLSID_MofCompiler, 0x6daf9757, 0x2e37, 0x11d2, 0xae,0xc9, 0x00,0xc0,0x4f,0xb6,0x88,0x20);

#ifdef __cplusplus
class DECLSPEC_UUID("6daf9757-2e37-11d2-aec9-00c04fb68820") MofCompiler;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MofCompiler, 0x6daf9757, 0x2e37, 0x11d2, 0xae,0xc9, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#endif

/*****************************************************************************
 * WbemObjectTextSrc coclass
 */

DEFINE_GUID(CLSID_WbemObjectTextSrc, 0x8d1c559d, 0x84f0, 0x4bb3, 0xa7,0xd5, 0x56,0xa7,0x43,0x5a,0x9b,0xa6);

#ifdef __cplusplus
class DECLSPEC_UUID("8d1c559d-84f0-4bb3-a7d5-56a7435a9ba6") WbemObjectTextSrc;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemObjectTextSrc, 0x8d1c559d, 0x84f0, 0x4bb3, 0xa7,0xd5, 0x56,0xa7,0x43,0x5a,0x9b,0xa6)
#endif
#endif

/*****************************************************************************
 * WbemRefresher coclass
 */

DEFINE_GUID(CLSID_WbemRefresher, 0xc71566f2, 0x561e, 0x11d1, 0xad,0x87, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);

#ifdef __cplusplus
class DECLSPEC_UUID("c71566f2-561e-11d1-ad87-00c04fd8fdff") WbemRefresher;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WbemRefresher, 0xc71566f2, 0x561e, 0x11d1, 0xad,0x87, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#endif

/*****************************************************************************
 * IWbemClassObject interface
 */
#ifndef __IWbemClassObject_INTERFACE_DEFINED__
#define __IWbemClassObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemClassObject, 0xdc12a681, 0x737f, 0x11cf, 0x88,0x4d, 0x00,0xaa,0x00,0x4b,0x2e,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dc12a681-737f-11cf-884d-00aa004b2e24")
IWbemClassObject : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetQualifierSet(
        IWbemQualifierSet **ppQualSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE Get(
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pVal,
        CIMTYPE *pType,
        LONG *plFlavor) = 0;

    virtual HRESULT STDMETHODCALLTYPE Put(
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pVal,
        CIMTYPE Type) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        LPCWSTR wszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNames(
        LPCWSTR wszQualifierName,
        LONG lFlags,
        VARIANT *pQualifierVal,
        SAFEARRAY **pNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginEnumeration(
        LONG lEnumFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Next(
        LONG lFlags,
        BSTR *strName,
        VARIANT *pVal,
        CIMTYPE *pType,
        LONG *plFlavor) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndEnumeration(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyQualifierSet(
        LPCWSTR wszProperty,
        IWbemQualifierSet **ppQualSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IWbemClassObject **ppCopy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjectText(
        LONG lFlags,
        BSTR *pstrObjectText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SpawnDerivedClass(
        LONG lFlags,
        IWbemClassObject **ppNewClass) = 0;

    virtual HRESULT STDMETHODCALLTYPE SpawnInstance(
        LONG lFlags,
        IWbemClassObject **ppNewInstance) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareTo(
        LONG lFlags,
        IWbemClassObject *pCompareTo) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyOrigin(
        LPCWSTR wszName,
        BSTR *pstrClassName) = 0;

    virtual HRESULT STDMETHODCALLTYPE InheritsFrom(
        LPCWSTR strAncestor) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMethod(
        LPCWSTR wszName,
        LONG lFlags,
        IWbemClassObject **ppInSignature,
        IWbemClassObject **ppOutSignature) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutMethod(
        LPCWSTR wszName,
        LONG lFlags,
        IWbemClassObject *pInSignature,
        IWbemClassObject *pOutSignature) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteMethod(
        LPCWSTR wszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginMethodEnumeration(
        LONG lEnumFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE NextMethod(
        LONG lFlags,
        BSTR *pstrName,
        IWbemClassObject **ppInSignature,
        IWbemClassObject **ppOutSignature) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndMethodEnumeration(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMethodQualifierSet(
        LPCWSTR wszMethod,
        IWbemQualifierSet **ppQualSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMethodOrigin(
        LPCWSTR wszMethodName,
        BSTR *pstrClassName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemClassObject, 0xdc12a681, 0x737f, 0x11cf, 0x88,0x4d, 0x00,0xaa,0x00,0x4b,0x2e,0x24)
#endif
#else
typedef struct IWbemClassObjectVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemClassObject methods ***/
    HRESULT (STDMETHODCALLTYPE *GetQualifierSet)(
        IWbemClassObject* This,
        IWbemQualifierSet **ppQualSet);

    HRESULT (STDMETHODCALLTYPE *Get)(
        IWbemClassObject* This,
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pVal,
        CIMTYPE *pType,
        LONG *plFlavor);

    HRESULT (STDMETHODCALLTYPE *Put)(
        IWbemClassObject* This,
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pVal,
        CIMTYPE Type);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IWbemClassObject* This,
        LPCWSTR wszName);

    HRESULT (STDMETHODCALLTYPE *GetNames)(
        IWbemClassObject* This,
        LPCWSTR wszQualifierName,
        LONG lFlags,
        VARIANT *pQualifierVal,
        SAFEARRAY **pNames);

    HRESULT (STDMETHODCALLTYPE *BeginEnumeration)(
        IWbemClassObject* This,
        LONG lEnumFlags);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IWbemClassObject* This,
        LONG lFlags,
        BSTR *strName,
        VARIANT *pVal,
        CIMTYPE *pType,
        LONG *plFlavor);

    HRESULT (STDMETHODCALLTYPE *EndEnumeration)(
        IWbemClassObject* This);

    HRESULT (STDMETHODCALLTYPE *GetPropertyQualifierSet)(
        IWbemClassObject* This,
        LPCWSTR wszProperty,
        IWbemQualifierSet **ppQualSet);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IWbemClassObject* This,
        IWbemClassObject **ppCopy);

    HRESULT (STDMETHODCALLTYPE *GetObjectText)(
        IWbemClassObject* This,
        LONG lFlags,
        BSTR *pstrObjectText);

    HRESULT (STDMETHODCALLTYPE *SpawnDerivedClass)(
        IWbemClassObject* This,
        LONG lFlags,
        IWbemClassObject **ppNewClass);

    HRESULT (STDMETHODCALLTYPE *SpawnInstance)(
        IWbemClassObject* This,
        LONG lFlags,
        IWbemClassObject **ppNewInstance);

    HRESULT (STDMETHODCALLTYPE *CompareTo)(
        IWbemClassObject* This,
        LONG lFlags,
        IWbemClassObject *pCompareTo);

    HRESULT (STDMETHODCALLTYPE *GetPropertyOrigin)(
        IWbemClassObject* This,
        LPCWSTR wszName,
        BSTR *pstrClassName);

    HRESULT (STDMETHODCALLTYPE *InheritsFrom)(
        IWbemClassObject* This,
        LPCWSTR strAncestor);

    HRESULT (STDMETHODCALLTYPE *GetMethod)(
        IWbemClassObject* This,
        LPCWSTR wszName,
        LONG lFlags,
        IWbemClassObject **ppInSignature,
        IWbemClassObject **ppOutSignature);

    HRESULT (STDMETHODCALLTYPE *PutMethod)(
        IWbemClassObject* This,
        LPCWSTR wszName,
        LONG lFlags,
        IWbemClassObject *pInSignature,
        IWbemClassObject *pOutSignature);

    HRESULT (STDMETHODCALLTYPE *DeleteMethod)(
        IWbemClassObject* This,
        LPCWSTR wszName);

    HRESULT (STDMETHODCALLTYPE *BeginMethodEnumeration)(
        IWbemClassObject* This,
        LONG lEnumFlags);

    HRESULT (STDMETHODCALLTYPE *NextMethod)(
        IWbemClassObject* This,
        LONG lFlags,
        BSTR *pstrName,
        IWbemClassObject **ppInSignature,
        IWbemClassObject **ppOutSignature);

    HRESULT (STDMETHODCALLTYPE *EndMethodEnumeration)(
        IWbemClassObject* This);

    HRESULT (STDMETHODCALLTYPE *GetMethodQualifierSet)(
        IWbemClassObject* This,
        LPCWSTR wszMethod,
        IWbemQualifierSet **ppQualSet);

    HRESULT (STDMETHODCALLTYPE *GetMethodOrigin)(
        IWbemClassObject* This,
        LPCWSTR wszMethodName,
        BSTR *pstrClassName);

    END_INTERFACE
} IWbemClassObjectVtbl;
interface IWbemClassObject {
    CONST_VTBL IWbemClassObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemClassObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemClassObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemClassObject_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemClassObject methods ***/
#define IWbemClassObject_GetQualifierSet(This,ppQualSet) (This)->lpVtbl->GetQualifierSet(This,ppQualSet)
#define IWbemClassObject_Get(This,wszName,lFlags,pVal,pType,plFlavor) (This)->lpVtbl->Get(This,wszName,lFlags,pVal,pType,plFlavor)
#define IWbemClassObject_Put(This,wszName,lFlags,pVal,Type) (This)->lpVtbl->Put(This,wszName,lFlags,pVal,Type)
#define IWbemClassObject_Delete(This,wszName) (This)->lpVtbl->Delete(This,wszName)
#define IWbemClassObject_GetNames(This,wszQualifierName,lFlags,pQualifierVal,pNames) (This)->lpVtbl->GetNames(This,wszQualifierName,lFlags,pQualifierVal,pNames)
#define IWbemClassObject_BeginEnumeration(This,lEnumFlags) (This)->lpVtbl->BeginEnumeration(This,lEnumFlags)
#define IWbemClassObject_Next(This,lFlags,strName,pVal,pType,plFlavor) (This)->lpVtbl->Next(This,lFlags,strName,pVal,pType,plFlavor)
#define IWbemClassObject_EndEnumeration(This) (This)->lpVtbl->EndEnumeration(This)
#define IWbemClassObject_GetPropertyQualifierSet(This,wszProperty,ppQualSet) (This)->lpVtbl->GetPropertyQualifierSet(This,wszProperty,ppQualSet)
#define IWbemClassObject_Clone(This,ppCopy) (This)->lpVtbl->Clone(This,ppCopy)
#define IWbemClassObject_GetObjectText(This,lFlags,pstrObjectText) (This)->lpVtbl->GetObjectText(This,lFlags,pstrObjectText)
#define IWbemClassObject_SpawnDerivedClass(This,lFlags,ppNewClass) (This)->lpVtbl->SpawnDerivedClass(This,lFlags,ppNewClass)
#define IWbemClassObject_SpawnInstance(This,lFlags,ppNewInstance) (This)->lpVtbl->SpawnInstance(This,lFlags,ppNewInstance)
#define IWbemClassObject_CompareTo(This,lFlags,pCompareTo) (This)->lpVtbl->CompareTo(This,lFlags,pCompareTo)
#define IWbemClassObject_GetPropertyOrigin(This,wszName,pstrClassName) (This)->lpVtbl->GetPropertyOrigin(This,wszName,pstrClassName)
#define IWbemClassObject_InheritsFrom(This,strAncestor) (This)->lpVtbl->InheritsFrom(This,strAncestor)
#define IWbemClassObject_GetMethod(This,wszName,lFlags,ppInSignature,ppOutSignature) (This)->lpVtbl->GetMethod(This,wszName,lFlags,ppInSignature,ppOutSignature)
#define IWbemClassObject_PutMethod(This,wszName,lFlags,pInSignature,pOutSignature) (This)->lpVtbl->PutMethod(This,wszName,lFlags,pInSignature,pOutSignature)
#define IWbemClassObject_DeleteMethod(This,wszName) (This)->lpVtbl->DeleteMethod(This,wszName)
#define IWbemClassObject_BeginMethodEnumeration(This,lEnumFlags) (This)->lpVtbl->BeginMethodEnumeration(This,lEnumFlags)
#define IWbemClassObject_NextMethod(This,lFlags,pstrName,ppInSignature,ppOutSignature) (This)->lpVtbl->NextMethod(This,lFlags,pstrName,ppInSignature,ppOutSignature)
#define IWbemClassObject_EndMethodEnumeration(This) (This)->lpVtbl->EndMethodEnumeration(This)
#define IWbemClassObject_GetMethodQualifierSet(This,wszMethod,ppQualSet) (This)->lpVtbl->GetMethodQualifierSet(This,wszMethod,ppQualSet)
#define IWbemClassObject_GetMethodOrigin(This,wszMethodName,pstrClassName) (This)->lpVtbl->GetMethodOrigin(This,wszMethodName,pstrClassName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemClassObject_QueryInterface(IWbemClassObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemClassObject_AddRef(IWbemClassObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemClassObject_Release(IWbemClassObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemClassObject methods ***/
static FORCEINLINE HRESULT IWbemClassObject_GetQualifierSet(IWbemClassObject* This,IWbemQualifierSet **ppQualSet) {
    return This->lpVtbl->GetQualifierSet(This,ppQualSet);
}
static FORCEINLINE HRESULT IWbemClassObject_Get(IWbemClassObject* This,LPCWSTR wszName,LONG lFlags,VARIANT *pVal,CIMTYPE *pType,LONG *plFlavor) {
    return This->lpVtbl->Get(This,wszName,lFlags,pVal,pType,plFlavor);
}
static FORCEINLINE HRESULT IWbemClassObject_Put(IWbemClassObject* This,LPCWSTR wszName,LONG lFlags,VARIANT *pVal,CIMTYPE Type) {
    return This->lpVtbl->Put(This,wszName,lFlags,pVal,Type);
}
static FORCEINLINE HRESULT IWbemClassObject_Delete(IWbemClassObject* This,LPCWSTR wszName) {
    return This->lpVtbl->Delete(This,wszName);
}
static FORCEINLINE HRESULT IWbemClassObject_GetNames(IWbemClassObject* This,LPCWSTR wszQualifierName,LONG lFlags,VARIANT *pQualifierVal,SAFEARRAY **pNames) {
    return This->lpVtbl->GetNames(This,wszQualifierName,lFlags,pQualifierVal,pNames);
}
static FORCEINLINE HRESULT IWbemClassObject_BeginEnumeration(IWbemClassObject* This,LONG lEnumFlags) {
    return This->lpVtbl->BeginEnumeration(This,lEnumFlags);
}
static FORCEINLINE HRESULT IWbemClassObject_Next(IWbemClassObject* This,LONG lFlags,BSTR *strName,VARIANT *pVal,CIMTYPE *pType,LONG *plFlavor) {
    return This->lpVtbl->Next(This,lFlags,strName,pVal,pType,plFlavor);
}
static FORCEINLINE HRESULT IWbemClassObject_EndEnumeration(IWbemClassObject* This) {
    return This->lpVtbl->EndEnumeration(This);
}
static FORCEINLINE HRESULT IWbemClassObject_GetPropertyQualifierSet(IWbemClassObject* This,LPCWSTR wszProperty,IWbemQualifierSet **ppQualSet) {
    return This->lpVtbl->GetPropertyQualifierSet(This,wszProperty,ppQualSet);
}
static FORCEINLINE HRESULT IWbemClassObject_Clone(IWbemClassObject* This,IWbemClassObject **ppCopy) {
    return This->lpVtbl->Clone(This,ppCopy);
}
static FORCEINLINE HRESULT IWbemClassObject_GetObjectText(IWbemClassObject* This,LONG lFlags,BSTR *pstrObjectText) {
    return This->lpVtbl->GetObjectText(This,lFlags,pstrObjectText);
}
static FORCEINLINE HRESULT IWbemClassObject_SpawnDerivedClass(IWbemClassObject* This,LONG lFlags,IWbemClassObject **ppNewClass) {
    return This->lpVtbl->SpawnDerivedClass(This,lFlags,ppNewClass);
}
static FORCEINLINE HRESULT IWbemClassObject_SpawnInstance(IWbemClassObject* This,LONG lFlags,IWbemClassObject **ppNewInstance) {
    return This->lpVtbl->SpawnInstance(This,lFlags,ppNewInstance);
}
static FORCEINLINE HRESULT IWbemClassObject_CompareTo(IWbemClassObject* This,LONG lFlags,IWbemClassObject *pCompareTo) {
    return This->lpVtbl->CompareTo(This,lFlags,pCompareTo);
}
static FORCEINLINE HRESULT IWbemClassObject_GetPropertyOrigin(IWbemClassObject* This,LPCWSTR wszName,BSTR *pstrClassName) {
    return This->lpVtbl->GetPropertyOrigin(This,wszName,pstrClassName);
}
static FORCEINLINE HRESULT IWbemClassObject_InheritsFrom(IWbemClassObject* This,LPCWSTR strAncestor) {
    return This->lpVtbl->InheritsFrom(This,strAncestor);
}
static FORCEINLINE HRESULT IWbemClassObject_GetMethod(IWbemClassObject* This,LPCWSTR wszName,LONG lFlags,IWbemClassObject **ppInSignature,IWbemClassObject **ppOutSignature) {
    return This->lpVtbl->GetMethod(This,wszName,lFlags,ppInSignature,ppOutSignature);
}
static FORCEINLINE HRESULT IWbemClassObject_PutMethod(IWbemClassObject* This,LPCWSTR wszName,LONG lFlags,IWbemClassObject *pInSignature,IWbemClassObject *pOutSignature) {
    return This->lpVtbl->PutMethod(This,wszName,lFlags,pInSignature,pOutSignature);
}
static FORCEINLINE HRESULT IWbemClassObject_DeleteMethod(IWbemClassObject* This,LPCWSTR wszName) {
    return This->lpVtbl->DeleteMethod(This,wszName);
}
static FORCEINLINE HRESULT IWbemClassObject_BeginMethodEnumeration(IWbemClassObject* This,LONG lEnumFlags) {
    return This->lpVtbl->BeginMethodEnumeration(This,lEnumFlags);
}
static FORCEINLINE HRESULT IWbemClassObject_NextMethod(IWbemClassObject* This,LONG lFlags,BSTR *pstrName,IWbemClassObject **ppInSignature,IWbemClassObject **ppOutSignature) {
    return This->lpVtbl->NextMethod(This,lFlags,pstrName,ppInSignature,ppOutSignature);
}
static FORCEINLINE HRESULT IWbemClassObject_EndMethodEnumeration(IWbemClassObject* This) {
    return This->lpVtbl->EndMethodEnumeration(This);
}
static FORCEINLINE HRESULT IWbemClassObject_GetMethodQualifierSet(IWbemClassObject* This,LPCWSTR wszMethod,IWbemQualifierSet **ppQualSet) {
    return This->lpVtbl->GetMethodQualifierSet(This,wszMethod,ppQualSet);
}
static FORCEINLINE HRESULT IWbemClassObject_GetMethodOrigin(IWbemClassObject* This,LPCWSTR wszMethodName,BSTR *pstrClassName) {
    return This->lpVtbl->GetMethodOrigin(This,wszMethodName,pstrClassName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemClassObject_GetQualifierSet_Proxy(
    IWbemClassObject* This,
    IWbemQualifierSet **ppQualSet);
void __RPC_STUB IWbemClassObject_GetQualifierSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_Get_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszName,
    LONG lFlags,
    VARIANT *pVal,
    CIMTYPE *pType,
    LONG *plFlavor);
void __RPC_STUB IWbemClassObject_Get_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_Put_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszName,
    LONG lFlags,
    VARIANT *pVal,
    CIMTYPE Type);
void __RPC_STUB IWbemClassObject_Put_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_Delete_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszName);
void __RPC_STUB IWbemClassObject_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_GetNames_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszQualifierName,
    LONG lFlags,
    VARIANT *pQualifierVal,
    SAFEARRAY **pNames);
void __RPC_STUB IWbemClassObject_GetNames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_BeginEnumeration_Proxy(
    IWbemClassObject* This,
    LONG lEnumFlags);
void __RPC_STUB IWbemClassObject_BeginEnumeration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_Next_Proxy(
    IWbemClassObject* This,
    LONG lFlags,
    BSTR *strName,
    VARIANT *pVal,
    CIMTYPE *pType,
    LONG *plFlavor);
void __RPC_STUB IWbemClassObject_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_EndEnumeration_Proxy(
    IWbemClassObject* This);
void __RPC_STUB IWbemClassObject_EndEnumeration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_GetPropertyQualifierSet_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszProperty,
    IWbemQualifierSet **ppQualSet);
void __RPC_STUB IWbemClassObject_GetPropertyQualifierSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_Clone_Proxy(
    IWbemClassObject* This,
    IWbemClassObject **ppCopy);
void __RPC_STUB IWbemClassObject_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_GetObjectText_Proxy(
    IWbemClassObject* This,
    LONG lFlags,
    BSTR *pstrObjectText);
void __RPC_STUB IWbemClassObject_GetObjectText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_SpawnDerivedClass_Proxy(
    IWbemClassObject* This,
    LONG lFlags,
    IWbemClassObject **ppNewClass);
void __RPC_STUB IWbemClassObject_SpawnDerivedClass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_SpawnInstance_Proxy(
    IWbemClassObject* This,
    LONG lFlags,
    IWbemClassObject **ppNewInstance);
void __RPC_STUB IWbemClassObject_SpawnInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_CompareTo_Proxy(
    IWbemClassObject* This,
    LONG lFlags,
    IWbemClassObject *pCompareTo);
void __RPC_STUB IWbemClassObject_CompareTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_GetPropertyOrigin_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszName,
    BSTR *pstrClassName);
void __RPC_STUB IWbemClassObject_GetPropertyOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_InheritsFrom_Proxy(
    IWbemClassObject* This,
    LPCWSTR strAncestor);
void __RPC_STUB IWbemClassObject_InheritsFrom_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_GetMethod_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszName,
    LONG lFlags,
    IWbemClassObject **ppInSignature,
    IWbemClassObject **ppOutSignature);
void __RPC_STUB IWbemClassObject_GetMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_PutMethod_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszName,
    LONG lFlags,
    IWbemClassObject *pInSignature,
    IWbemClassObject *pOutSignature);
void __RPC_STUB IWbemClassObject_PutMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_DeleteMethod_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszName);
void __RPC_STUB IWbemClassObject_DeleteMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_BeginMethodEnumeration_Proxy(
    IWbemClassObject* This,
    LONG lEnumFlags);
void __RPC_STUB IWbemClassObject_BeginMethodEnumeration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_NextMethod_Proxy(
    IWbemClassObject* This,
    LONG lFlags,
    BSTR *pstrName,
    IWbemClassObject **ppInSignature,
    IWbemClassObject **ppOutSignature);
void __RPC_STUB IWbemClassObject_NextMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_EndMethodEnumeration_Proxy(
    IWbemClassObject* This);
void __RPC_STUB IWbemClassObject_EndMethodEnumeration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_GetMethodQualifierSet_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszMethod,
    IWbemQualifierSet **ppQualSet);
void __RPC_STUB IWbemClassObject_GetMethodQualifierSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemClassObject_GetMethodOrigin_Proxy(
    IWbemClassObject* This,
    LPCWSTR wszMethodName,
    BSTR *pstrClassName);
void __RPC_STUB IWbemClassObject_GetMethodOrigin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemClassObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemQualifierSet interface
 */
#ifndef __IWbemQualifierSet_INTERFACE_DEFINED__
#define __IWbemQualifierSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemQualifierSet, 0xdc12a680, 0x737f, 0x11cf, 0x88,0x4d, 0x00,0xaa,0x00,0x4b,0x2e,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dc12a680-737f-11cf-884d-00aa004b2e24")
IWbemQualifierSet : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Get(
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pVal,
        LONG *plFlavor) = 0;

    virtual HRESULT STDMETHODCALLTYPE Put(
        LPCWSTR wszName,
        VARIANT *pVal,
        LONG lFlavor) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        LPCWSTR wszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNames(
        LONG lFlags,
        SAFEARRAY **pNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginEnumeration(
        LONG lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Next(
        LONG lFlags,
        BSTR *pstrName,
        VARIANT *pVal,
        LONG *plFlavor) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndEnumeration(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemQualifierSet, 0xdc12a680, 0x737f, 0x11cf, 0x88,0x4d, 0x00,0xaa,0x00,0x4b,0x2e,0x24)
#endif
#else
typedef struct IWbemQualifierSetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemQualifierSet methods ***/
    HRESULT (STDMETHODCALLTYPE *Get)(
        IWbemQualifierSet* This,
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pVal,
        LONG *plFlavor);

    HRESULT (STDMETHODCALLTYPE *Put)(
        IWbemQualifierSet* This,
        LPCWSTR wszName,
        VARIANT *pVal,
        LONG lFlavor);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IWbemQualifierSet* This,
        LPCWSTR wszName);

    HRESULT (STDMETHODCALLTYPE *GetNames)(
        IWbemQualifierSet* This,
        LONG lFlags,
        SAFEARRAY **pNames);

    HRESULT (STDMETHODCALLTYPE *BeginEnumeration)(
        IWbemQualifierSet* This,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IWbemQualifierSet* This,
        LONG lFlags,
        BSTR *pstrName,
        VARIANT *pVal,
        LONG *plFlavor);

    HRESULT (STDMETHODCALLTYPE *EndEnumeration)(
        IWbemQualifierSet* This);

    END_INTERFACE
} IWbemQualifierSetVtbl;
interface IWbemQualifierSet {
    CONST_VTBL IWbemQualifierSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemQualifierSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemQualifierSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemQualifierSet_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemQualifierSet methods ***/
#define IWbemQualifierSet_Get(This,wszName,lFlags,pVal,plFlavor) (This)->lpVtbl->Get(This,wszName,lFlags,pVal,plFlavor)
#define IWbemQualifierSet_Put(This,wszName,pVal,lFlavor) (This)->lpVtbl->Put(This,wszName,pVal,lFlavor)
#define IWbemQualifierSet_Delete(This,wszName) (This)->lpVtbl->Delete(This,wszName)
#define IWbemQualifierSet_GetNames(This,lFlags,pNames) (This)->lpVtbl->GetNames(This,lFlags,pNames)
#define IWbemQualifierSet_BeginEnumeration(This,lFlags) (This)->lpVtbl->BeginEnumeration(This,lFlags)
#define IWbemQualifierSet_Next(This,lFlags,pstrName,pVal,plFlavor) (This)->lpVtbl->Next(This,lFlags,pstrName,pVal,plFlavor)
#define IWbemQualifierSet_EndEnumeration(This) (This)->lpVtbl->EndEnumeration(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemQualifierSet_QueryInterface(IWbemQualifierSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemQualifierSet_AddRef(IWbemQualifierSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemQualifierSet_Release(IWbemQualifierSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemQualifierSet methods ***/
static FORCEINLINE HRESULT IWbemQualifierSet_Get(IWbemQualifierSet* This,LPCWSTR wszName,LONG lFlags,VARIANT *pVal,LONG *plFlavor) {
    return This->lpVtbl->Get(This,wszName,lFlags,pVal,plFlavor);
}
static FORCEINLINE HRESULT IWbemQualifierSet_Put(IWbemQualifierSet* This,LPCWSTR wszName,VARIANT *pVal,LONG lFlavor) {
    return This->lpVtbl->Put(This,wszName,pVal,lFlavor);
}
static FORCEINLINE HRESULT IWbemQualifierSet_Delete(IWbemQualifierSet* This,LPCWSTR wszName) {
    return This->lpVtbl->Delete(This,wszName);
}
static FORCEINLINE HRESULT IWbemQualifierSet_GetNames(IWbemQualifierSet* This,LONG lFlags,SAFEARRAY **pNames) {
    return This->lpVtbl->GetNames(This,lFlags,pNames);
}
static FORCEINLINE HRESULT IWbemQualifierSet_BeginEnumeration(IWbemQualifierSet* This,LONG lFlags) {
    return This->lpVtbl->BeginEnumeration(This,lFlags);
}
static FORCEINLINE HRESULT IWbemQualifierSet_Next(IWbemQualifierSet* This,LONG lFlags,BSTR *pstrName,VARIANT *pVal,LONG *plFlavor) {
    return This->lpVtbl->Next(This,lFlags,pstrName,pVal,plFlavor);
}
static FORCEINLINE HRESULT IWbemQualifierSet_EndEnumeration(IWbemQualifierSet* This) {
    return This->lpVtbl->EndEnumeration(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemQualifierSet_Get_Proxy(
    IWbemQualifierSet* This,
    LPCWSTR wszName,
    LONG lFlags,
    VARIANT *pVal,
    LONG *plFlavor);
void __RPC_STUB IWbemQualifierSet_Get_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemQualifierSet_Put_Proxy(
    IWbemQualifierSet* This,
    LPCWSTR wszName,
    VARIANT *pVal,
    LONG lFlavor);
void __RPC_STUB IWbemQualifierSet_Put_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemQualifierSet_Delete_Proxy(
    IWbemQualifierSet* This,
    LPCWSTR wszName);
void __RPC_STUB IWbemQualifierSet_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemQualifierSet_GetNames_Proxy(
    IWbemQualifierSet* This,
    LONG lFlags,
    SAFEARRAY **pNames);
void __RPC_STUB IWbemQualifierSet_GetNames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemQualifierSet_BeginEnumeration_Proxy(
    IWbemQualifierSet* This,
    LONG lFlags);
void __RPC_STUB IWbemQualifierSet_BeginEnumeration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemQualifierSet_Next_Proxy(
    IWbemQualifierSet* This,
    LONG lFlags,
    BSTR *pstrName,
    VARIANT *pVal,
    LONG *plFlavor);
void __RPC_STUB IWbemQualifierSet_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemQualifierSet_EndEnumeration_Proxy(
    IWbemQualifierSet* This);
void __RPC_STUB IWbemQualifierSet_EndEnumeration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemQualifierSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemLocator interface
 */
#ifndef __IWbemLocator_INTERFACE_DEFINED__
#define __IWbemLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemLocator, 0xdc12a687, 0x737f, 0x11cf, 0x88,0x4d, 0x00,0xaa,0x00,0x4b,0x2e,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dc12a687-737f-11cf-884d-00aa004b2e24")
IWbemLocator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ConnectServer(
        const BSTR strNetworkResource,
        const BSTR strUser,
        const BSTR strPassword,
        const BSTR strLocale,
        LONG lSecurityFlags,
        const BSTR strAuthority,
        IWbemContext *pCtx,
        IWbemServices **ppNamespace) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemLocator, 0xdc12a687, 0x737f, 0x11cf, 0x88,0x4d, 0x00,0xaa,0x00,0x4b,0x2e,0x24)
#endif
#else
typedef struct IWbemLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *ConnectServer)(
        IWbemLocator* This,
        const BSTR strNetworkResource,
        const BSTR strUser,
        const BSTR strPassword,
        const BSTR strLocale,
        LONG lSecurityFlags,
        const BSTR strAuthority,
        IWbemContext *pCtx,
        IWbemServices **ppNamespace);

    END_INTERFACE
} IWbemLocatorVtbl;
interface IWbemLocator {
    CONST_VTBL IWbemLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemLocator methods ***/
#define IWbemLocator_ConnectServer(This,strNetworkResource,strUser,strPassword,strLocale,lSecurityFlags,strAuthority,pCtx,ppNamespace) (This)->lpVtbl->ConnectServer(This,strNetworkResource,strUser,strPassword,strLocale,lSecurityFlags,strAuthority,pCtx,ppNamespace)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemLocator_QueryInterface(IWbemLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemLocator_AddRef(IWbemLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemLocator_Release(IWbemLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemLocator methods ***/
static FORCEINLINE HRESULT IWbemLocator_ConnectServer(IWbemLocator* This,const BSTR strNetworkResource,const BSTR strUser,const BSTR strPassword,const BSTR strLocale,LONG lSecurityFlags,const BSTR strAuthority,IWbemContext *pCtx,IWbemServices **ppNamespace) {
    return This->lpVtbl->ConnectServer(This,strNetworkResource,strUser,strPassword,strLocale,lSecurityFlags,strAuthority,pCtx,ppNamespace);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemLocator_ConnectServer_Proxy(
    IWbemLocator* This,
    const BSTR strNetworkResource,
    const BSTR strUser,
    const BSTR strPassword,
    const BSTR strLocale,
    LONG lSecurityFlags,
    const BSTR strAuthority,
    IWbemContext *pCtx,
    IWbemServices **ppNamespace);
void __RPC_STUB IWbemLocator_ConnectServer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemObjectSink interface
 */
#ifndef __IWbemObjectSink_INTERFACE_DEFINED__
#define __IWbemObjectSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemObjectSink, 0x7c857801, 0x7381, 0x11cf, 0x88,0x4d, 0x00,0xaa,0x00,0x4b,0x2e,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7c857801-7381-11cf-884d-00aa004b2e24")
IWbemObjectSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Indicate(
        LONG lObjectCount,
        IWbemClassObject **apObjArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStatus(
        LONG lFlags,
        HRESULT hResult,
        BSTR strParam,
        IWbemClassObject *pObjParam) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemObjectSink, 0x7c857801, 0x7381, 0x11cf, 0x88,0x4d, 0x00,0xaa,0x00,0x4b,0x2e,0x24)
#endif
#else
typedef struct IWbemObjectSinkVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

    END_INTERFACE
} IWbemObjectSinkVtbl;
interface IWbemObjectSink {
    CONST_VTBL IWbemObjectSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemObjectSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemObjectSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemObjectSink_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemObjectSink methods ***/
#define IWbemObjectSink_Indicate(This,lObjectCount,apObjArray) (This)->lpVtbl->Indicate(This,lObjectCount,apObjArray)
#define IWbemObjectSink_SetStatus(This,lFlags,hResult,strParam,pObjParam) (This)->lpVtbl->SetStatus(This,lFlags,hResult,strParam,pObjParam)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemObjectSink_QueryInterface(IWbemObjectSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemObjectSink_AddRef(IWbemObjectSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemObjectSink_Release(IWbemObjectSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemObjectSink methods ***/
static FORCEINLINE HRESULT IWbemObjectSink_Indicate(IWbemObjectSink* This,LONG lObjectCount,IWbemClassObject **apObjArray) {
    return This->lpVtbl->Indicate(This,lObjectCount,apObjArray);
}
static FORCEINLINE HRESULT IWbemObjectSink_SetStatus(IWbemObjectSink* This,LONG lFlags,HRESULT hResult,BSTR strParam,IWbemClassObject *pObjParam) {
    return This->lpVtbl->SetStatus(This,lFlags,hResult,strParam,pObjParam);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemObjectSink_Indicate_Proxy(
    IWbemObjectSink* This,
    LONG lObjectCount,
    IWbemClassObject **apObjArray);
void __RPC_STUB IWbemObjectSink_Indicate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectSink_SetStatus_Proxy(
    IWbemObjectSink* This,
    LONG lFlags,
    HRESULT hResult,
    BSTR strParam,
    IWbemClassObject *pObjParam);
void __RPC_STUB IWbemObjectSink_SetStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemObjectSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemObjectSinkEx interface
 */
#ifndef __IWbemObjectSinkEx_INTERFACE_DEFINED__
#define __IWbemObjectSinkEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemObjectSinkEx, 0xe7d35cfa, 0x348b, 0x485e, 0xb5,0x24, 0x25,0x27,0x25,0xd6,0x97,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e7d35cfa-348b-485e-b524-252725d697ca")
IWbemObjectSinkEx : public IWbemObjectSink
{
    virtual HRESULT STDMETHODCALLTYPE WriteMessage(
        ULONG uChannel,
        const BSTR strMessage) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteError(
        IWbemClassObject *pObjError,
        unsigned char *puReturned) = 0;

    virtual HRESULT STDMETHODCALLTYPE PromptUser(
        const BSTR strMessage,
        unsigned char uPromptType,
        unsigned char *puReturned) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteProgress(
        const BSTR strActivity,
        const BSTR strCurrentOperation,
        const BSTR strStatusDescription,
        ULONG uPercentComplete,
        ULONG uSecondsRemaining) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteStreamParameter(
        const BSTR strName,
        VARIANT *vtValue,
        ULONG ulType,
        ULONG ulFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemObjectSinkEx, 0xe7d35cfa, 0x348b, 0x485e, 0xb5,0x24, 0x25,0x27,0x25,0xd6,0x97,0xca)
#endif
#else
typedef struct IWbemObjectSinkExVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

    /*** IWbemObjectSinkEx methods ***/
    HRESULT (STDMETHODCALLTYPE *WriteMessage)(
        IWbemObjectSinkEx* This,
        ULONG uChannel,
        const BSTR strMessage);

    HRESULT (STDMETHODCALLTYPE *WriteError)(
        IWbemObjectSinkEx* This,
        IWbemClassObject *pObjError,
        unsigned char *puReturned);

    HRESULT (STDMETHODCALLTYPE *PromptUser)(
        IWbemObjectSinkEx* This,
        const BSTR strMessage,
        unsigned char uPromptType,
        unsigned char *puReturned);

    HRESULT (STDMETHODCALLTYPE *WriteProgress)(
        IWbemObjectSinkEx* This,
        const BSTR strActivity,
        const BSTR strCurrentOperation,
        const BSTR strStatusDescription,
        ULONG uPercentComplete,
        ULONG uSecondsRemaining);

    HRESULT (STDMETHODCALLTYPE *WriteStreamParameter)(
        IWbemObjectSinkEx* This,
        const BSTR strName,
        VARIANT *vtValue,
        ULONG ulType,
        ULONG ulFlags);

    END_INTERFACE
} IWbemObjectSinkExVtbl;
interface IWbemObjectSinkEx {
    CONST_VTBL IWbemObjectSinkExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemObjectSinkEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemObjectSinkEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemObjectSinkEx_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemObjectSink methods ***/
#define IWbemObjectSinkEx_Indicate(This,lObjectCount,apObjArray) (This)->lpVtbl->Indicate(This,lObjectCount,apObjArray)
#define IWbemObjectSinkEx_SetStatus(This,lFlags,hResult,strParam,pObjParam) (This)->lpVtbl->SetStatus(This,lFlags,hResult,strParam,pObjParam)
/*** IWbemObjectSinkEx methods ***/
#define IWbemObjectSinkEx_WriteMessage(This,uChannel,strMessage) (This)->lpVtbl->WriteMessage(This,uChannel,strMessage)
#define IWbemObjectSinkEx_WriteError(This,pObjError,puReturned) (This)->lpVtbl->WriteError(This,pObjError,puReturned)
#define IWbemObjectSinkEx_PromptUser(This,strMessage,uPromptType,puReturned) (This)->lpVtbl->PromptUser(This,strMessage,uPromptType,puReturned)
#define IWbemObjectSinkEx_WriteProgress(This,strActivity,strCurrentOperation,strStatusDescription,uPercentComplete,uSecondsRemaining) (This)->lpVtbl->WriteProgress(This,strActivity,strCurrentOperation,strStatusDescription,uPercentComplete,uSecondsRemaining)
#define IWbemObjectSinkEx_WriteStreamParameter(This,strName,vtValue,ulType,ulFlags) (This)->lpVtbl->WriteStreamParameter(This,strName,vtValue,ulType,ulFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemObjectSinkEx_QueryInterface(IWbemObjectSinkEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemObjectSinkEx_AddRef(IWbemObjectSinkEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemObjectSinkEx_Release(IWbemObjectSinkEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemObjectSink methods ***/
static FORCEINLINE HRESULT IWbemObjectSinkEx_Indicate(IWbemObjectSinkEx* This,LONG lObjectCount,IWbemClassObject **apObjArray) {
    return This->lpVtbl->Indicate(This,lObjectCount,apObjArray);
}
static FORCEINLINE HRESULT IWbemObjectSinkEx_SetStatus(IWbemObjectSinkEx* This,LONG lFlags,HRESULT hResult,BSTR strParam,IWbemClassObject *pObjParam) {
    return This->lpVtbl->SetStatus(This,lFlags,hResult,strParam,pObjParam);
}
/*** IWbemObjectSinkEx methods ***/
static FORCEINLINE HRESULT IWbemObjectSinkEx_WriteMessage(IWbemObjectSinkEx* This,ULONG uChannel,const BSTR strMessage) {
    return This->lpVtbl->WriteMessage(This,uChannel,strMessage);
}
static FORCEINLINE HRESULT IWbemObjectSinkEx_WriteError(IWbemObjectSinkEx* This,IWbemClassObject *pObjError,unsigned char *puReturned) {
    return This->lpVtbl->WriteError(This,pObjError,puReturned);
}
static FORCEINLINE HRESULT IWbemObjectSinkEx_PromptUser(IWbemObjectSinkEx* This,const BSTR strMessage,unsigned char uPromptType,unsigned char *puReturned) {
    return This->lpVtbl->PromptUser(This,strMessage,uPromptType,puReturned);
}
static FORCEINLINE HRESULT IWbemObjectSinkEx_WriteProgress(IWbemObjectSinkEx* This,const BSTR strActivity,const BSTR strCurrentOperation,const BSTR strStatusDescription,ULONG uPercentComplete,ULONG uSecondsRemaining) {
    return This->lpVtbl->WriteProgress(This,strActivity,strCurrentOperation,strStatusDescription,uPercentComplete,uSecondsRemaining);
}
static FORCEINLINE HRESULT IWbemObjectSinkEx_WriteStreamParameter(IWbemObjectSinkEx* This,const BSTR strName,VARIANT *vtValue,ULONG ulType,ULONG ulFlags) {
    return This->lpVtbl->WriteStreamParameter(This,strName,vtValue,ulType,ulFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemObjectSinkEx_WriteMessage_Proxy(
    IWbemObjectSinkEx* This,
    ULONG uChannel,
    const BSTR strMessage);
void __RPC_STUB IWbemObjectSinkEx_WriteMessage_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectSinkEx_WriteError_Proxy(
    IWbemObjectSinkEx* This,
    IWbemClassObject *pObjError,
    unsigned char *puReturned);
void __RPC_STUB IWbemObjectSinkEx_WriteError_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectSinkEx_PromptUser_Proxy(
    IWbemObjectSinkEx* This,
    const BSTR strMessage,
    unsigned char uPromptType,
    unsigned char *puReturned);
void __RPC_STUB IWbemObjectSinkEx_PromptUser_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectSinkEx_WriteProgress_Proxy(
    IWbemObjectSinkEx* This,
    const BSTR strActivity,
    const BSTR strCurrentOperation,
    const BSTR strStatusDescription,
    ULONG uPercentComplete,
    ULONG uSecondsRemaining);
void __RPC_STUB IWbemObjectSinkEx_WriteProgress_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectSinkEx_WriteStreamParameter_Proxy(
    IWbemObjectSinkEx* This,
    const BSTR strName,
    VARIANT *vtValue,
    ULONG ulType,
    ULONG ulFlags);
void __RPC_STUB IWbemObjectSinkEx_WriteStreamParameter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemObjectSinkEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumWbemClassObject interface
 */
#ifndef __IEnumWbemClassObject_INTERFACE_DEFINED__
#define __IEnumWbemClassObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumWbemClassObject, 0x027947e1, 0xd731, 0x11ce, 0xa3,0x57, 0x00,0x00,0x00,0x00,0x00,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("027947e1-d731-11ce-a357-000000000001")
IEnumWbemClassObject : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Next(
        LONG lTimeout,
        ULONG uCount,
        IWbemClassObject **apObjects,
        ULONG *puReturned) = 0;

    virtual HRESULT STDMETHODCALLTYPE NextAsync(
        ULONG uCount,
        IWbemObjectSink *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumWbemClassObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        LONG lTimeout,
        ULONG nCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumWbemClassObject, 0x027947e1, 0xd731, 0x11ce, 0xa3,0x57, 0x00,0x00,0x00,0x00,0x00,0x01)
#endif
#else
typedef struct IEnumWbemClassObjectVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumWbemClassObject methods ***/
    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumWbemClassObject* This);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumWbemClassObject* This,
        LONG lTimeout,
        ULONG uCount,
        IWbemClassObject **apObjects,
        ULONG *puReturned);

    HRESULT (STDMETHODCALLTYPE *NextAsync)(
        IEnumWbemClassObject* This,
        ULONG uCount,
        IWbemObjectSink *pSink);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumWbemClassObject* This,
        IEnumWbemClassObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumWbemClassObject* This,
        LONG lTimeout,
        ULONG nCount);

    END_INTERFACE
} IEnumWbemClassObjectVtbl;
interface IEnumWbemClassObject {
    CONST_VTBL IEnumWbemClassObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumWbemClassObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumWbemClassObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumWbemClassObject_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumWbemClassObject methods ***/
#define IEnumWbemClassObject_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumWbemClassObject_Next(This,lTimeout,uCount,apObjects,puReturned) (This)->lpVtbl->Next(This,lTimeout,uCount,apObjects,puReturned)
#define IEnumWbemClassObject_NextAsync(This,uCount,pSink) (This)->lpVtbl->NextAsync(This,uCount,pSink)
#define IEnumWbemClassObject_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#define IEnumWbemClassObject_Skip(This,lTimeout,nCount) (This)->lpVtbl->Skip(This,lTimeout,nCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumWbemClassObject_QueryInterface(IEnumWbemClassObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumWbemClassObject_AddRef(IEnumWbemClassObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumWbemClassObject_Release(IEnumWbemClassObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumWbemClassObject methods ***/
static FORCEINLINE HRESULT IEnumWbemClassObject_Reset(IEnumWbemClassObject* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumWbemClassObject_Next(IEnumWbemClassObject* This,LONG lTimeout,ULONG uCount,IWbemClassObject **apObjects,ULONG *puReturned) {
    return This->lpVtbl->Next(This,lTimeout,uCount,apObjects,puReturned);
}
static FORCEINLINE HRESULT IEnumWbemClassObject_NextAsync(IEnumWbemClassObject* This,ULONG uCount,IWbemObjectSink *pSink) {
    return This->lpVtbl->NextAsync(This,uCount,pSink);
}
static FORCEINLINE HRESULT IEnumWbemClassObject_Clone(IEnumWbemClassObject* This,IEnumWbemClassObject **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
static FORCEINLINE HRESULT IEnumWbemClassObject_Skip(IEnumWbemClassObject* This,LONG lTimeout,ULONG nCount) {
    return This->lpVtbl->Skip(This,lTimeout,nCount);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumWbemClassObject_Reset_Proxy(
    IEnumWbemClassObject* This);
void __RPC_STUB IEnumWbemClassObject_Reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumWbemClassObject_Next_Proxy(
    IEnumWbemClassObject* This,
    LONG lTimeout,
    ULONG uCount,
    IWbemClassObject **apObjects,
    ULONG *puReturned);
void __RPC_STUB IEnumWbemClassObject_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumWbemClassObject_NextAsync_Proxy(
    IEnumWbemClassObject* This,
    ULONG uCount,
    IWbemObjectSink *pSink);
void __RPC_STUB IEnumWbemClassObject_NextAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumWbemClassObject_Clone_Proxy(
    IEnumWbemClassObject* This,
    IEnumWbemClassObject **ppEnum);
void __RPC_STUB IEnumWbemClassObject_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumWbemClassObject_Skip_Proxy(
    IEnumWbemClassObject* This,
    LONG lTimeout,
    ULONG nCount);
void __RPC_STUB IEnumWbemClassObject_Skip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumWbemClassObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemContext interface
 */
#ifndef __IWbemContext_INTERFACE_DEFINED__
#define __IWbemContext_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemContext, 0x44aca674, 0xe8fc, 0x11d0, 0xa0,0x7c, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("44aca674-e8fc-11d0-a07c-00c04fb68820")
IWbemContext : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Clone(
        IWbemContext **ppNewCopy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNames(
        LONG lFlags,
        SAFEARRAY **pNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginEnumeration(
        LONG lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Next(
        LONG lFlags,
        BSTR *pstrName,
        VARIANT *pValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndEnumeration(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetValue(
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetValue(
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteValue(
        LPCWSTR wszName,
        LONG lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAll(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemContext, 0x44aca674, 0xe8fc, 0x11d0, 0xa0,0x7c, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#else
typedef struct IWbemContextVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemContext methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        IWbemContext* This,
        IWbemContext **ppNewCopy);

    HRESULT (STDMETHODCALLTYPE *GetNames)(
        IWbemContext* This,
        LONG lFlags,
        SAFEARRAY **pNames);

    HRESULT (STDMETHODCALLTYPE *BeginEnumeration)(
        IWbemContext* This,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IWbemContext* This,
        LONG lFlags,
        BSTR *pstrName,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *EndEnumeration)(
        IWbemContext* This);

    HRESULT (STDMETHODCALLTYPE *SetValue)(
        IWbemContext* This,
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *GetValue)(
        IWbemContext* This,
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *DeleteValue)(
        IWbemContext* This,
        LPCWSTR wszName,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *DeleteAll)(
        IWbemContext* This);

    END_INTERFACE
} IWbemContextVtbl;
interface IWbemContext {
    CONST_VTBL IWbemContextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemContext_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemContext methods ***/
#define IWbemContext_Clone(This,ppNewCopy) (This)->lpVtbl->Clone(This,ppNewCopy)
#define IWbemContext_GetNames(This,lFlags,pNames) (This)->lpVtbl->GetNames(This,lFlags,pNames)
#define IWbemContext_BeginEnumeration(This,lFlags) (This)->lpVtbl->BeginEnumeration(This,lFlags)
#define IWbemContext_Next(This,lFlags,pstrName,pValue) (This)->lpVtbl->Next(This,lFlags,pstrName,pValue)
#define IWbemContext_EndEnumeration(This) (This)->lpVtbl->EndEnumeration(This)
#define IWbemContext_SetValue(This,wszName,lFlags,pValue) (This)->lpVtbl->SetValue(This,wszName,lFlags,pValue)
#define IWbemContext_GetValue(This,wszName,lFlags,pValue) (This)->lpVtbl->GetValue(This,wszName,lFlags,pValue)
#define IWbemContext_DeleteValue(This,wszName,lFlags) (This)->lpVtbl->DeleteValue(This,wszName,lFlags)
#define IWbemContext_DeleteAll(This) (This)->lpVtbl->DeleteAll(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemContext_QueryInterface(IWbemContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemContext_AddRef(IWbemContext* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemContext_Release(IWbemContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemContext methods ***/
static FORCEINLINE HRESULT IWbemContext_Clone(IWbemContext* This,IWbemContext **ppNewCopy) {
    return This->lpVtbl->Clone(This,ppNewCopy);
}
static FORCEINLINE HRESULT IWbemContext_GetNames(IWbemContext* This,LONG lFlags,SAFEARRAY **pNames) {
    return This->lpVtbl->GetNames(This,lFlags,pNames);
}
static FORCEINLINE HRESULT IWbemContext_BeginEnumeration(IWbemContext* This,LONG lFlags) {
    return This->lpVtbl->BeginEnumeration(This,lFlags);
}
static FORCEINLINE HRESULT IWbemContext_Next(IWbemContext* This,LONG lFlags,BSTR *pstrName,VARIANT *pValue) {
    return This->lpVtbl->Next(This,lFlags,pstrName,pValue);
}
static FORCEINLINE HRESULT IWbemContext_EndEnumeration(IWbemContext* This) {
    return This->lpVtbl->EndEnumeration(This);
}
static FORCEINLINE HRESULT IWbemContext_SetValue(IWbemContext* This,LPCWSTR wszName,LONG lFlags,VARIANT *pValue) {
    return This->lpVtbl->SetValue(This,wszName,lFlags,pValue);
}
static FORCEINLINE HRESULT IWbemContext_GetValue(IWbemContext* This,LPCWSTR wszName,LONG lFlags,VARIANT *pValue) {
    return This->lpVtbl->GetValue(This,wszName,lFlags,pValue);
}
static FORCEINLINE HRESULT IWbemContext_DeleteValue(IWbemContext* This,LPCWSTR wszName,LONG lFlags) {
    return This->lpVtbl->DeleteValue(This,wszName,lFlags);
}
static FORCEINLINE HRESULT IWbemContext_DeleteAll(IWbemContext* This) {
    return This->lpVtbl->DeleteAll(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemContext_Clone_Proxy(
    IWbemContext* This,
    IWbemContext **ppNewCopy);
void __RPC_STUB IWbemContext_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemContext_GetNames_Proxy(
    IWbemContext* This,
    LONG lFlags,
    SAFEARRAY **pNames);
void __RPC_STUB IWbemContext_GetNames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemContext_BeginEnumeration_Proxy(
    IWbemContext* This,
    LONG lFlags);
void __RPC_STUB IWbemContext_BeginEnumeration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemContext_Next_Proxy(
    IWbemContext* This,
    LONG lFlags,
    BSTR *pstrName,
    VARIANT *pValue);
void __RPC_STUB IWbemContext_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemContext_EndEnumeration_Proxy(
    IWbemContext* This);
void __RPC_STUB IWbemContext_EndEnumeration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemContext_SetValue_Proxy(
    IWbemContext* This,
    LPCWSTR wszName,
    LONG lFlags,
    VARIANT *pValue);
void __RPC_STUB IWbemContext_SetValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemContext_GetValue_Proxy(
    IWbemContext* This,
    LPCWSTR wszName,
    LONG lFlags,
    VARIANT *pValue);
void __RPC_STUB IWbemContext_GetValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemContext_DeleteValue_Proxy(
    IWbemContext* This,
    LPCWSTR wszName,
    LONG lFlags);
void __RPC_STUB IWbemContext_DeleteValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemContext_DeleteAll_Proxy(
    IWbemContext* This);
void __RPC_STUB IWbemContext_DeleteAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemContext_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemCallResult interface
 */
#ifndef __IWbemCallResult_INTERFACE_DEFINED__
#define __IWbemCallResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemCallResult, 0x44aca675, 0xe8fc, 0x11d0, 0xa0,0x7c, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("44aca675-e8fc-11d0-a07c-00c04fb68820")
IWbemCallResult : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetResultObject(
        LONG lTimeout,
        IWbemClassObject **ppResultObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResultString(
        LONG lTimeout,
        BSTR *pstrResultString) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResultServices(
        LONG lTimeout,
        IWbemServices **ppServices) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCallStatus(
        LONG lTimeout,
        LONG *plStatus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemCallResult, 0x44aca675, 0xe8fc, 0x11d0, 0xa0,0x7c, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#else
typedef struct IWbemCallResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemCallResult methods ***/
    HRESULT (STDMETHODCALLTYPE *GetResultObject)(
        IWbemCallResult* This,
        LONG lTimeout,
        IWbemClassObject **ppResultObject);

    HRESULT (STDMETHODCALLTYPE *GetResultString)(
        IWbemCallResult* This,
        LONG lTimeout,
        BSTR *pstrResultString);

    HRESULT (STDMETHODCALLTYPE *GetResultServices)(
        IWbemCallResult* This,
        LONG lTimeout,
        IWbemServices **ppServices);

    HRESULT (STDMETHODCALLTYPE *GetCallStatus)(
        IWbemCallResult* This,
        LONG lTimeout,
        LONG *plStatus);

    END_INTERFACE
} IWbemCallResultVtbl;
interface IWbemCallResult {
    CONST_VTBL IWbemCallResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemCallResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemCallResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemCallResult_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemCallResult methods ***/
#define IWbemCallResult_GetResultObject(This,lTimeout,ppResultObject) (This)->lpVtbl->GetResultObject(This,lTimeout,ppResultObject)
#define IWbemCallResult_GetResultString(This,lTimeout,pstrResultString) (This)->lpVtbl->GetResultString(This,lTimeout,pstrResultString)
#define IWbemCallResult_GetResultServices(This,lTimeout,ppServices) (This)->lpVtbl->GetResultServices(This,lTimeout,ppServices)
#define IWbemCallResult_GetCallStatus(This,lTimeout,plStatus) (This)->lpVtbl->GetCallStatus(This,lTimeout,plStatus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemCallResult_QueryInterface(IWbemCallResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemCallResult_AddRef(IWbemCallResult* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemCallResult_Release(IWbemCallResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemCallResult methods ***/
static FORCEINLINE HRESULT IWbemCallResult_GetResultObject(IWbemCallResult* This,LONG lTimeout,IWbemClassObject **ppResultObject) {
    return This->lpVtbl->GetResultObject(This,lTimeout,ppResultObject);
}
static FORCEINLINE HRESULT IWbemCallResult_GetResultString(IWbemCallResult* This,LONG lTimeout,BSTR *pstrResultString) {
    return This->lpVtbl->GetResultString(This,lTimeout,pstrResultString);
}
static FORCEINLINE HRESULT IWbemCallResult_GetResultServices(IWbemCallResult* This,LONG lTimeout,IWbemServices **ppServices) {
    return This->lpVtbl->GetResultServices(This,lTimeout,ppServices);
}
static FORCEINLINE HRESULT IWbemCallResult_GetCallStatus(IWbemCallResult* This,LONG lTimeout,LONG *plStatus) {
    return This->lpVtbl->GetCallStatus(This,lTimeout,plStatus);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemCallResult_GetResultObject_Proxy(
    IWbemCallResult* This,
    LONG lTimeout,
    IWbemClassObject **ppResultObject);
void __RPC_STUB IWbemCallResult_GetResultObject_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemCallResult_GetResultString_Proxy(
    IWbemCallResult* This,
    LONG lTimeout,
    BSTR *pstrResultString);
void __RPC_STUB IWbemCallResult_GetResultString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemCallResult_GetResultServices_Proxy(
    IWbemCallResult* This,
    LONG lTimeout,
    IWbemServices **ppServices);
void __RPC_STUB IWbemCallResult_GetResultServices_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemCallResult_GetCallStatus_Proxy(
    IWbemCallResult* This,
    LONG lTimeout,
    LONG *plStatus);
void __RPC_STUB IWbemCallResult_GetCallStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemCallResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemServices interface
 */
#ifndef __IWbemServices_INTERFACE_DEFINED__
#define __IWbemServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemServices, 0x9556dc99, 0x828c, 0x11cf, 0xa3,0x7e, 0x00,0xaa,0x00,0x32,0x40,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9556dc99-828c-11cf-a37e-00aa003240c7")
IWbemServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OpenNamespace(
        const BSTR strNamespace,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemServices **ppWorkingNamespace,
        IWbemCallResult **ppResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE CancelAsyncCall(
        IWbemObjectSink *pSink) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryObjectSink(
        LONG lFlags,
        IWbemObjectSink **ppResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObject(
        const BSTR strObjectPath,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemClassObject **ppObject,
        IWbemCallResult **ppCallResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjectAsync(
        const BSTR strObjectPath,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutClass(
        IWbemClassObject *pObject,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemCallResult **ppCallResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutClassAsync(
        IWbemClassObject *pObject,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteClass(
        const BSTR strClass,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemCallResult **ppCallResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteClassAsync(
        const BSTR strClass,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateClassEnum(
        const BSTR strSuperclass,
        LONG lFlags,
        IWbemContext *pCtx,
        IEnumWbemClassObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateClassEnumAsync(
        const BSTR strSuperclass,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutInstance(
        IWbemClassObject *pInst,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemCallResult **ppCallResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutInstanceAsync(
        IWbemClassObject *pInst,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteInstance(
        const BSTR strObjectPath,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemCallResult **ppCallResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteInstanceAsync(
        const BSTR strObjectPath,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstanceEnum(
        const BSTR strFilter,
        LONG lFlags,
        IWbemContext *pCtx,
        IEnumWbemClassObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstanceEnumAsync(
        const BSTR strFilter,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecQuery(
        const BSTR strQueryLanguage,
        const BSTR strQuery,
        LONG lFlags,
        IWbemContext *pCtx,
        IEnumWbemClassObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecQueryAsync(
        const BSTR strQueryLanguage,
        const BSTR strQuery,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecNotificationQuery(
        const BSTR strQueryLanguage,
        const BSTR strQuery,
        LONG lFlags,
        IWbemContext *pCtx,
        IEnumWbemClassObject **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecNotificationQueryAsync(
        const BSTR strQueryLanguage,
        const BSTR strQuery,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecMethod(
        const BSTR strObjectPath,
        const BSTR strMethodName,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemClassObject *pInParams,
        IWbemClassObject **ppOutParams,
        IWbemCallResult **ppCallResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecMethodAsync(
        const BSTR strObjectPath,
        const BSTR strMethodName,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemClassObject *pInParams,
        IWbemObjectSink *pResponseHandler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemServices, 0x9556dc99, 0x828c, 0x11cf, 0xa3,0x7e, 0x00,0xaa,0x00,0x32,0x40,0xc7)
#endif
#else
typedef struct IWbemServicesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemServices methods ***/
    HRESULT (STDMETHODCALLTYPE *OpenNamespace)(
        IWbemServices* This,
        const BSTR strNamespace,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemServices **ppWorkingNamespace,
        IWbemCallResult **ppResult);

    HRESULT (STDMETHODCALLTYPE *CancelAsyncCall)(
        IWbemServices* This,
        IWbemObjectSink *pSink);

    HRESULT (STDMETHODCALLTYPE *QueryObjectSink)(
        IWbemServices* This,
        LONG lFlags,
        IWbemObjectSink **ppResponseHandler);

    HRESULT (STDMETHODCALLTYPE *GetObject)(
        IWbemServices* This,
        const BSTR strObjectPath,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemClassObject **ppObject,
        IWbemCallResult **ppCallResult);

    HRESULT (STDMETHODCALLTYPE *GetObjectAsync)(
        IWbemServices* This,
        const BSTR strObjectPath,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *PutClass)(
        IWbemServices* This,
        IWbemClassObject *pObject,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemCallResult **ppCallResult);

    HRESULT (STDMETHODCALLTYPE *PutClassAsync)(
        IWbemServices* This,
        IWbemClassObject *pObject,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *DeleteClass)(
        IWbemServices* This,
        const BSTR strClass,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemCallResult **ppCallResult);

    HRESULT (STDMETHODCALLTYPE *DeleteClassAsync)(
        IWbemServices* This,
        const BSTR strClass,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *CreateClassEnum)(
        IWbemServices* This,
        const BSTR strSuperclass,
        LONG lFlags,
        IWbemContext *pCtx,
        IEnumWbemClassObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *CreateClassEnumAsync)(
        IWbemServices* This,
        const BSTR strSuperclass,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *PutInstance)(
        IWbemServices* This,
        IWbemClassObject *pInst,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemCallResult **ppCallResult);

    HRESULT (STDMETHODCALLTYPE *PutInstanceAsync)(
        IWbemServices* This,
        IWbemClassObject *pInst,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *DeleteInstance)(
        IWbemServices* This,
        const BSTR strObjectPath,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemCallResult **ppCallResult);

    HRESULT (STDMETHODCALLTYPE *DeleteInstanceAsync)(
        IWbemServices* This,
        const BSTR strObjectPath,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *CreateInstanceEnum)(
        IWbemServices* This,
        const BSTR strFilter,
        LONG lFlags,
        IWbemContext *pCtx,
        IEnumWbemClassObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *CreateInstanceEnumAsync)(
        IWbemServices* This,
        const BSTR strFilter,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *ExecQuery)(
        IWbemServices* This,
        const BSTR strQueryLanguage,
        const BSTR strQuery,
        LONG lFlags,
        IWbemContext *pCtx,
        IEnumWbemClassObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *ExecQueryAsync)(
        IWbemServices* This,
        const BSTR strQueryLanguage,
        const BSTR strQuery,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *ExecNotificationQuery)(
        IWbemServices* This,
        const BSTR strQueryLanguage,
        const BSTR strQuery,
        LONG lFlags,
        IWbemContext *pCtx,
        IEnumWbemClassObject **ppEnum);

    HRESULT (STDMETHODCALLTYPE *ExecNotificationQueryAsync)(
        IWbemServices* This,
        const BSTR strQueryLanguage,
        const BSTR strQuery,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemObjectSink *pResponseHandler);

    HRESULT (STDMETHODCALLTYPE *ExecMethod)(
        IWbemServices* This,
        const BSTR strObjectPath,
        const BSTR strMethodName,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemClassObject *pInParams,
        IWbemClassObject **ppOutParams,
        IWbemCallResult **ppCallResult);

    HRESULT (STDMETHODCALLTYPE *ExecMethodAsync)(
        IWbemServices* This,
        const BSTR strObjectPath,
        const BSTR strMethodName,
        LONG lFlags,
        IWbemContext *pCtx,
        IWbemClassObject *pInParams,
        IWbemObjectSink *pResponseHandler);

    END_INTERFACE
} IWbemServicesVtbl;
interface IWbemServices {
    CONST_VTBL IWbemServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemServices_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemServices methods ***/
#define IWbemServices_OpenNamespace(This,strNamespace,lFlags,pCtx,ppWorkingNamespace,ppResult) (This)->lpVtbl->OpenNamespace(This,strNamespace,lFlags,pCtx,ppWorkingNamespace,ppResult)
#define IWbemServices_CancelAsyncCall(This,pSink) (This)->lpVtbl->CancelAsyncCall(This,pSink)
#define IWbemServices_QueryObjectSink(This,lFlags,ppResponseHandler) (This)->lpVtbl->QueryObjectSink(This,lFlags,ppResponseHandler)
#define IWbemServices_GetObject(This,strObjectPath,lFlags,pCtx,ppObject,ppCallResult) (This)->lpVtbl->GetObject(This,strObjectPath,lFlags,pCtx,ppObject,ppCallResult)
#define IWbemServices_GetObjectAsync(This,strObjectPath,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->GetObjectAsync(This,strObjectPath,lFlags,pCtx,pResponseHandler)
#define IWbemServices_PutClass(This,pObject,lFlags,pCtx,ppCallResult) (This)->lpVtbl->PutClass(This,pObject,lFlags,pCtx,ppCallResult)
#define IWbemServices_PutClassAsync(This,pObject,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->PutClassAsync(This,pObject,lFlags,pCtx,pResponseHandler)
#define IWbemServices_DeleteClass(This,strClass,lFlags,pCtx,ppCallResult) (This)->lpVtbl->DeleteClass(This,strClass,lFlags,pCtx,ppCallResult)
#define IWbemServices_DeleteClassAsync(This,strClass,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->DeleteClassAsync(This,strClass,lFlags,pCtx,pResponseHandler)
#define IWbemServices_CreateClassEnum(This,strSuperclass,lFlags,pCtx,ppEnum) (This)->lpVtbl->CreateClassEnum(This,strSuperclass,lFlags,pCtx,ppEnum)
#define IWbemServices_CreateClassEnumAsync(This,strSuperclass,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->CreateClassEnumAsync(This,strSuperclass,lFlags,pCtx,pResponseHandler)
#define IWbemServices_PutInstance(This,pInst,lFlags,pCtx,ppCallResult) (This)->lpVtbl->PutInstance(This,pInst,lFlags,pCtx,ppCallResult)
#define IWbemServices_PutInstanceAsync(This,pInst,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->PutInstanceAsync(This,pInst,lFlags,pCtx,pResponseHandler)
#define IWbemServices_DeleteInstance(This,strObjectPath,lFlags,pCtx,ppCallResult) (This)->lpVtbl->DeleteInstance(This,strObjectPath,lFlags,pCtx,ppCallResult)
#define IWbemServices_DeleteInstanceAsync(This,strObjectPath,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->DeleteInstanceAsync(This,strObjectPath,lFlags,pCtx,pResponseHandler)
#define IWbemServices_CreateInstanceEnum(This,strFilter,lFlags,pCtx,ppEnum) (This)->lpVtbl->CreateInstanceEnum(This,strFilter,lFlags,pCtx,ppEnum)
#define IWbemServices_CreateInstanceEnumAsync(This,strFilter,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->CreateInstanceEnumAsync(This,strFilter,lFlags,pCtx,pResponseHandler)
#define IWbemServices_ExecQuery(This,strQueryLanguage,strQuery,lFlags,pCtx,ppEnum) (This)->lpVtbl->ExecQuery(This,strQueryLanguage,strQuery,lFlags,pCtx,ppEnum)
#define IWbemServices_ExecQueryAsync(This,strQueryLanguage,strQuery,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->ExecQueryAsync(This,strQueryLanguage,strQuery,lFlags,pCtx,pResponseHandler)
#define IWbemServices_ExecNotificationQuery(This,strQueryLanguage,strQuery,lFlags,pCtx,ppEnum) (This)->lpVtbl->ExecNotificationQuery(This,strQueryLanguage,strQuery,lFlags,pCtx,ppEnum)
#define IWbemServices_ExecNotificationQueryAsync(This,strQueryLanguage,strQuery,lFlags,pCtx,pResponseHandler) (This)->lpVtbl->ExecNotificationQueryAsync(This,strQueryLanguage,strQuery,lFlags,pCtx,pResponseHandler)
#define IWbemServices_ExecMethod(This,strObjectPath,strMethodName,lFlags,pCtx,pInParams,ppOutParams,ppCallResult) (This)->lpVtbl->ExecMethod(This,strObjectPath,strMethodName,lFlags,pCtx,pInParams,ppOutParams,ppCallResult)
#define IWbemServices_ExecMethodAsync(This,strObjectPath,strMethodName,lFlags,pCtx,pInParams,pResponseHandler) (This)->lpVtbl->ExecMethodAsync(This,strObjectPath,strMethodName,lFlags,pCtx,pInParams,pResponseHandler)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemServices_QueryInterface(IWbemServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemServices_AddRef(IWbemServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemServices_Release(IWbemServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemServices methods ***/
static FORCEINLINE HRESULT IWbemServices_OpenNamespace(IWbemServices* This,const BSTR strNamespace,LONG lFlags,IWbemContext *pCtx,IWbemServices **ppWorkingNamespace,IWbemCallResult **ppResult) {
    return This->lpVtbl->OpenNamespace(This,strNamespace,lFlags,pCtx,ppWorkingNamespace,ppResult);
}
static FORCEINLINE HRESULT IWbemServices_CancelAsyncCall(IWbemServices* This,IWbemObjectSink *pSink) {
    return This->lpVtbl->CancelAsyncCall(This,pSink);
}
static FORCEINLINE HRESULT IWbemServices_QueryObjectSink(IWbemServices* This,LONG lFlags,IWbemObjectSink **ppResponseHandler) {
    return This->lpVtbl->QueryObjectSink(This,lFlags,ppResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_GetObject(IWbemServices* This,const BSTR strObjectPath,LONG lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject,IWbemCallResult **ppCallResult) {
    return This->lpVtbl->GetObject(This,strObjectPath,lFlags,pCtx,ppObject,ppCallResult);
}
static FORCEINLINE HRESULT IWbemServices_GetObjectAsync(IWbemServices* This,const BSTR strObjectPath,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->GetObjectAsync(This,strObjectPath,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_PutClass(IWbemServices* This,IWbemClassObject *pObject,LONG lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {
    return This->lpVtbl->PutClass(This,pObject,lFlags,pCtx,ppCallResult);
}
static FORCEINLINE HRESULT IWbemServices_PutClassAsync(IWbemServices* This,IWbemClassObject *pObject,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->PutClassAsync(This,pObject,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_DeleteClass(IWbemServices* This,const BSTR strClass,LONG lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {
    return This->lpVtbl->DeleteClass(This,strClass,lFlags,pCtx,ppCallResult);
}
static FORCEINLINE HRESULT IWbemServices_DeleteClassAsync(IWbemServices* This,const BSTR strClass,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->DeleteClassAsync(This,strClass,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_CreateClassEnum(IWbemServices* This,const BSTR strSuperclass,LONG lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {
    return This->lpVtbl->CreateClassEnum(This,strSuperclass,lFlags,pCtx,ppEnum);
}
static FORCEINLINE HRESULT IWbemServices_CreateClassEnumAsync(IWbemServices* This,const BSTR strSuperclass,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->CreateClassEnumAsync(This,strSuperclass,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_PutInstance(IWbemServices* This,IWbemClassObject *pInst,LONG lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {
    return This->lpVtbl->PutInstance(This,pInst,lFlags,pCtx,ppCallResult);
}
static FORCEINLINE HRESULT IWbemServices_PutInstanceAsync(IWbemServices* This,IWbemClassObject *pInst,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->PutInstanceAsync(This,pInst,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_DeleteInstance(IWbemServices* This,const BSTR strObjectPath,LONG lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {
    return This->lpVtbl->DeleteInstance(This,strObjectPath,lFlags,pCtx,ppCallResult);
}
static FORCEINLINE HRESULT IWbemServices_DeleteInstanceAsync(IWbemServices* This,const BSTR strObjectPath,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->DeleteInstanceAsync(This,strObjectPath,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_CreateInstanceEnum(IWbemServices* This,const BSTR strFilter,LONG lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {
    return This->lpVtbl->CreateInstanceEnum(This,strFilter,lFlags,pCtx,ppEnum);
}
static FORCEINLINE HRESULT IWbemServices_CreateInstanceEnumAsync(IWbemServices* This,const BSTR strFilter,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->CreateInstanceEnumAsync(This,strFilter,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_ExecQuery(IWbemServices* This,const BSTR strQueryLanguage,const BSTR strQuery,LONG lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {
    return This->lpVtbl->ExecQuery(This,strQueryLanguage,strQuery,lFlags,pCtx,ppEnum);
}
static FORCEINLINE HRESULT IWbemServices_ExecQueryAsync(IWbemServices* This,const BSTR strQueryLanguage,const BSTR strQuery,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->ExecQueryAsync(This,strQueryLanguage,strQuery,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_ExecNotificationQuery(IWbemServices* This,const BSTR strQueryLanguage,const BSTR strQuery,LONG lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {
    return This->lpVtbl->ExecNotificationQuery(This,strQueryLanguage,strQuery,lFlags,pCtx,ppEnum);
}
static FORCEINLINE HRESULT IWbemServices_ExecNotificationQueryAsync(IWbemServices* This,const BSTR strQueryLanguage,const BSTR strQuery,LONG lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->ExecNotificationQueryAsync(This,strQueryLanguage,strQuery,lFlags,pCtx,pResponseHandler);
}
static FORCEINLINE HRESULT IWbemServices_ExecMethod(IWbemServices* This,const BSTR strObjectPath,const BSTR strMethodName,LONG lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemClassObject **ppOutParams,IWbemCallResult **ppCallResult) {
    return This->lpVtbl->ExecMethod(This,strObjectPath,strMethodName,lFlags,pCtx,pInParams,ppOutParams,ppCallResult);
}
static FORCEINLINE HRESULT IWbemServices_ExecMethodAsync(IWbemServices* This,const BSTR strObjectPath,const BSTR strMethodName,LONG lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemObjectSink *pResponseHandler) {
    return This->lpVtbl->ExecMethodAsync(This,strObjectPath,strMethodName,lFlags,pCtx,pInParams,pResponseHandler);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemServices_OpenNamespace_Proxy(
    IWbemServices* This,
    const BSTR strNamespace,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemServices **ppWorkingNamespace,
    IWbemCallResult **ppResult);
void __RPC_STUB IWbemServices_OpenNamespace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_CancelAsyncCall_Proxy(
    IWbemServices* This,
    IWbemObjectSink *pSink);
void __RPC_STUB IWbemServices_CancelAsyncCall_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_QueryObjectSink_Proxy(
    IWbemServices* This,
    LONG lFlags,
    IWbemObjectSink **ppResponseHandler);
void __RPC_STUB IWbemServices_QueryObjectSink_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_GetObject_Proxy(
    IWbemServices* This,
    const BSTR strObjectPath,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemClassObject **ppObject,
    IWbemCallResult **ppCallResult);
void __RPC_STUB IWbemServices_GetObject_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_GetObjectAsync_Proxy(
    IWbemServices* This,
    const BSTR strObjectPath,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_GetObjectAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_PutClass_Proxy(
    IWbemServices* This,
    IWbemClassObject *pObject,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemCallResult **ppCallResult);
void __RPC_STUB IWbemServices_PutClass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_PutClassAsync_Proxy(
    IWbemServices* This,
    IWbemClassObject *pObject,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_PutClassAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_DeleteClass_Proxy(
    IWbemServices* This,
    const BSTR strClass,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemCallResult **ppCallResult);
void __RPC_STUB IWbemServices_DeleteClass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_DeleteClassAsync_Proxy(
    IWbemServices* This,
    const BSTR strClass,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_DeleteClassAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_CreateClassEnum_Proxy(
    IWbemServices* This,
    const BSTR strSuperclass,
    LONG lFlags,
    IWbemContext *pCtx,
    IEnumWbemClassObject **ppEnum);
void __RPC_STUB IWbemServices_CreateClassEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_CreateClassEnumAsync_Proxy(
    IWbemServices* This,
    const BSTR strSuperclass,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_CreateClassEnumAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_PutInstance_Proxy(
    IWbemServices* This,
    IWbemClassObject *pInst,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemCallResult **ppCallResult);
void __RPC_STUB IWbemServices_PutInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_PutInstanceAsync_Proxy(
    IWbemServices* This,
    IWbemClassObject *pInst,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_PutInstanceAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_DeleteInstance_Proxy(
    IWbemServices* This,
    const BSTR strObjectPath,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemCallResult **ppCallResult);
void __RPC_STUB IWbemServices_DeleteInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_DeleteInstanceAsync_Proxy(
    IWbemServices* This,
    const BSTR strObjectPath,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_DeleteInstanceAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_CreateInstanceEnum_Proxy(
    IWbemServices* This,
    const BSTR strFilter,
    LONG lFlags,
    IWbemContext *pCtx,
    IEnumWbemClassObject **ppEnum);
void __RPC_STUB IWbemServices_CreateInstanceEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_CreateInstanceEnumAsync_Proxy(
    IWbemServices* This,
    const BSTR strFilter,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_CreateInstanceEnumAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_ExecQuery_Proxy(
    IWbemServices* This,
    const BSTR strQueryLanguage,
    const BSTR strQuery,
    LONG lFlags,
    IWbemContext *pCtx,
    IEnumWbemClassObject **ppEnum);
void __RPC_STUB IWbemServices_ExecQuery_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_ExecQueryAsync_Proxy(
    IWbemServices* This,
    const BSTR strQueryLanguage,
    const BSTR strQuery,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_ExecQueryAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_ExecNotificationQuery_Proxy(
    IWbemServices* This,
    const BSTR strQueryLanguage,
    const BSTR strQuery,
    LONG lFlags,
    IWbemContext *pCtx,
    IEnumWbemClassObject **ppEnum);
void __RPC_STUB IWbemServices_ExecNotificationQuery_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_ExecNotificationQueryAsync_Proxy(
    IWbemServices* This,
    const BSTR strQueryLanguage,
    const BSTR strQuery,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_ExecNotificationQueryAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_ExecMethod_Proxy(
    IWbemServices* This,
    const BSTR strObjectPath,
    const BSTR strMethodName,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemClassObject *pInParams,
    IWbemClassObject **ppOutParams,
    IWbemCallResult **ppCallResult);
void __RPC_STUB IWbemServices_ExecMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemServices_ExecMethodAsync_Proxy(
    IWbemServices* This,
    const BSTR strObjectPath,
    const BSTR strMethodName,
    LONG lFlags,
    IWbemContext *pCtx,
    IWbemClassObject *pInParams,
    IWbemObjectSink *pResponseHandler);
void __RPC_STUB IWbemServices_ExecMethodAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemShutdown interface
 */
#ifndef __IWbemShutdown_INTERFACE_DEFINED__
#define __IWbemShutdown_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemShutdown, 0xb7b31df9, 0xd515, 0x11d3, 0xa1,0x1c, 0x00,0x10,0x5a,0x1f,0x51,0x5a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b7b31df9-d515-11d3-a11c-00105a1f515a")
IWbemShutdown : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Shutdown(
        LONG uReason,
        ULONG uMaxMilliseconds,
        IWbemContext *pCtx) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemShutdown, 0xb7b31df9, 0xd515, 0x11d3, 0xa1,0x1c, 0x00,0x10,0x5a,0x1f,0x51,0x5a)
#endif
#else
typedef struct IWbemShutdownVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemShutdown methods ***/
    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        IWbemShutdown* This,
        LONG uReason,
        ULONG uMaxMilliseconds,
        IWbemContext *pCtx);

    END_INTERFACE
} IWbemShutdownVtbl;
interface IWbemShutdown {
    CONST_VTBL IWbemShutdownVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemShutdown_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemShutdown_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemShutdown_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemShutdown methods ***/
#define IWbemShutdown_Shutdown(This,uReason,uMaxMilliseconds,pCtx) (This)->lpVtbl->Shutdown(This,uReason,uMaxMilliseconds,pCtx)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemShutdown_QueryInterface(IWbemShutdown* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemShutdown_AddRef(IWbemShutdown* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemShutdown_Release(IWbemShutdown* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemShutdown methods ***/
static FORCEINLINE HRESULT IWbemShutdown_Shutdown(IWbemShutdown* This,LONG uReason,ULONG uMaxMilliseconds,IWbemContext *pCtx) {
    return This->lpVtbl->Shutdown(This,uReason,uMaxMilliseconds,pCtx);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemShutdown_Shutdown_Proxy(
    IWbemShutdown* This,
    LONG uReason,
    ULONG uMaxMilliseconds,
    IWbemContext *pCtx);
void __RPC_STUB IWbemShutdown_Shutdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemShutdown_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemObjectTextSrc interface
 */
#ifndef __IWbemObjectTextSrc_INTERFACE_DEFINED__
#define __IWbemObjectTextSrc_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemObjectTextSrc, 0xbfbf883a, 0xcad7, 0x11d3, 0xa1,0x1b, 0x00,0x10,0x5a,0x1f,0x51,0x5a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bfbf883a-cad7-11d3-a11b-00105a1f515a")
IWbemObjectTextSrc : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetText(
        LONG lFlags,
        IWbemClassObject *pObj,
        ULONG uObjTextFormat,
        IWbemContext *pCtx,
        BSTR *strText) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFromText(
        LONG lFlags,
        BSTR strText,
        ULONG uObjTextFormat,
        IWbemContext *pCtx,
        IWbemClassObject **pNewObj) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemObjectTextSrc, 0xbfbf883a, 0xcad7, 0x11d3, 0xa1,0x1b, 0x00,0x10,0x5a,0x1f,0x51,0x5a)
#endif
#else
typedef struct IWbemObjectTextSrcVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemObjectTextSrc methods ***/
    HRESULT (STDMETHODCALLTYPE *GetText)(
        IWbemObjectTextSrc* This,
        LONG lFlags,
        IWbemClassObject *pObj,
        ULONG uObjTextFormat,
        IWbemContext *pCtx,
        BSTR *strText);

    HRESULT (STDMETHODCALLTYPE *CreateFromText)(
        IWbemObjectTextSrc* This,
        LONG lFlags,
        BSTR strText,
        ULONG uObjTextFormat,
        IWbemContext *pCtx,
        IWbemClassObject **pNewObj);

    END_INTERFACE
} IWbemObjectTextSrcVtbl;
interface IWbemObjectTextSrc {
    CONST_VTBL IWbemObjectTextSrcVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemObjectTextSrc_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemObjectTextSrc_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemObjectTextSrc_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemObjectTextSrc methods ***/
#define IWbemObjectTextSrc_GetText(This,lFlags,pObj,uObjTextFormat,pCtx,strText) (This)->lpVtbl->GetText(This,lFlags,pObj,uObjTextFormat,pCtx,strText)
#define IWbemObjectTextSrc_CreateFromText(This,lFlags,strText,uObjTextFormat,pCtx,pNewObj) (This)->lpVtbl->CreateFromText(This,lFlags,strText,uObjTextFormat,pCtx,pNewObj)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemObjectTextSrc_QueryInterface(IWbemObjectTextSrc* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemObjectTextSrc_AddRef(IWbemObjectTextSrc* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemObjectTextSrc_Release(IWbemObjectTextSrc* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemObjectTextSrc methods ***/
static FORCEINLINE HRESULT IWbemObjectTextSrc_GetText(IWbemObjectTextSrc* This,LONG lFlags,IWbemClassObject *pObj,ULONG uObjTextFormat,IWbemContext *pCtx,BSTR *strText) {
    return This->lpVtbl->GetText(This,lFlags,pObj,uObjTextFormat,pCtx,strText);
}
static FORCEINLINE HRESULT IWbemObjectTextSrc_CreateFromText(IWbemObjectTextSrc* This,LONG lFlags,BSTR strText,ULONG uObjTextFormat,IWbemContext *pCtx,IWbemClassObject **pNewObj) {
    return This->lpVtbl->CreateFromText(This,lFlags,strText,uObjTextFormat,pCtx,pNewObj);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemObjectTextSrc_GetText_Proxy(
    IWbemObjectTextSrc* This,
    LONG lFlags,
    IWbemClassObject *pObj,
    ULONG uObjTextFormat,
    IWbemContext *pCtx,
    BSTR *strText);
void __RPC_STUB IWbemObjectTextSrc_GetText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectTextSrc_CreateFromText_Proxy(
    IWbemObjectTextSrc* This,
    LONG lFlags,
    BSTR strText,
    ULONG uObjTextFormat,
    IWbemContext *pCtx,
    IWbemClassObject **pNewObj);
void __RPC_STUB IWbemObjectTextSrc_CreateFromText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemObjectTextSrc_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemObjectAccess interface
 */
#ifndef __IWbemObjectAccess_INTERFACE_DEFINED__
#define __IWbemObjectAccess_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemObjectAccess, 0x49353c9a, 0x516b, 0x11d1, 0xae,0xa6, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("49353c9a-516b-11d1-aea6-00c04fb68820")
IWbemObjectAccess : public IWbemClassObject
{
    virtual HRESULT STDMETHODCALLTYPE GetPropertyHandle(
        LPCWSTR wszPropertyName,
        CIMTYPE *pType,
        LONG *plHandle) = 0;

    virtual HRESULT STDMETHODCALLTYPE WritePropertyValue(
        LONG lHandle,
        LONG lNumBytes,
        const byte *aData) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReadPropertyValue(
        LONG lHandle,
        LONG lBufferSize,
        LONG *plNumBytes,
        byte *aData) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReadDWORD(
        LONG lHandle,
        DWORD *pdw) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteDWORD(
        LONG lHandle,
        DWORD dw) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReadQWORD(
        LONG lHandle,
        UINT64 *pqw) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteQWORD(
        LONG lHandle,
        UINT64 pw) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyInfoByHandle(
        LONG lHandle,
        BSTR *pstrName,
        CIMTYPE *pType) = 0;

    virtual HRESULT STDMETHODCALLTYPE Lock(
        LONG lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unlock(
        LONG lFlags) = 0;

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

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

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

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

    /*** IWbemClassObject methods ***/
    HRESULT (STDMETHODCALLTYPE *GetQualifierSet)(
        IWbemObjectAccess* This,
        IWbemQualifierSet **ppQualSet);

    HRESULT (STDMETHODCALLTYPE *Get)(
        IWbemObjectAccess* This,
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pVal,
        CIMTYPE *pType,
        LONG *plFlavor);

    HRESULT (STDMETHODCALLTYPE *Put)(
        IWbemObjectAccess* This,
        LPCWSTR wszName,
        LONG lFlags,
        VARIANT *pVal,
        CIMTYPE Type);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IWbemObjectAccess* This,
        LPCWSTR wszName);

    HRESULT (STDMETHODCALLTYPE *GetNames)(
        IWbemObjectAccess* This,
        LPCWSTR wszQualifierName,
        LONG lFlags,
        VARIANT *pQualifierVal,
        SAFEARRAY **pNames);

    HRESULT (STDMETHODCALLTYPE *BeginEnumeration)(
        IWbemObjectAccess* This,
        LONG lEnumFlags);

    HRESULT (STDMETHODCALLTYPE *Next)(
        IWbemObjectAccess* This,
        LONG lFlags,
        BSTR *strName,
        VARIANT *pVal,
        CIMTYPE *pType,
        LONG *plFlavor);

    HRESULT (STDMETHODCALLTYPE *EndEnumeration)(
        IWbemObjectAccess* This);

    HRESULT (STDMETHODCALLTYPE *GetPropertyQualifierSet)(
        IWbemObjectAccess* This,
        LPCWSTR wszProperty,
        IWbemQualifierSet **ppQualSet);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IWbemObjectAccess* This,
        IWbemClassObject **ppCopy);

    HRESULT (STDMETHODCALLTYPE *GetObjectText)(
        IWbemObjectAccess* This,
        LONG lFlags,
        BSTR *pstrObjectText);

    HRESULT (STDMETHODCALLTYPE *SpawnDerivedClass)(
        IWbemObjectAccess* This,
        LONG lFlags,
        IWbemClassObject **ppNewClass);

    HRESULT (STDMETHODCALLTYPE *SpawnInstance)(
        IWbemObjectAccess* This,
        LONG lFlags,
        IWbemClassObject **ppNewInstance);

    HRESULT (STDMETHODCALLTYPE *CompareTo)(
        IWbemObjectAccess* This,
        LONG lFlags,
        IWbemClassObject *pCompareTo);

    HRESULT (STDMETHODCALLTYPE *GetPropertyOrigin)(
        IWbemObjectAccess* This,
        LPCWSTR wszName,
        BSTR *pstrClassName);

    HRESULT (STDMETHODCALLTYPE *InheritsFrom)(
        IWbemObjectAccess* This,
        LPCWSTR strAncestor);

    HRESULT (STDMETHODCALLTYPE *GetMethod)(
        IWbemObjectAccess* This,
        LPCWSTR wszName,
        LONG lFlags,
        IWbemClassObject **ppInSignature,
        IWbemClassObject **ppOutSignature);

    HRESULT (STDMETHODCALLTYPE *PutMethod)(
        IWbemObjectAccess* This,
        LPCWSTR wszName,
        LONG lFlags,
        IWbemClassObject *pInSignature,
        IWbemClassObject *pOutSignature);

    HRESULT (STDMETHODCALLTYPE *DeleteMethod)(
        IWbemObjectAccess* This,
        LPCWSTR wszName);

    HRESULT (STDMETHODCALLTYPE *BeginMethodEnumeration)(
        IWbemObjectAccess* This,
        LONG lEnumFlags);

    HRESULT (STDMETHODCALLTYPE *NextMethod)(
        IWbemObjectAccess* This,
        LONG lFlags,
        BSTR *pstrName,
        IWbemClassObject **ppInSignature,
        IWbemClassObject **ppOutSignature);

    HRESULT (STDMETHODCALLTYPE *EndMethodEnumeration)(
        IWbemObjectAccess* This);

    HRESULT (STDMETHODCALLTYPE *GetMethodQualifierSet)(
        IWbemObjectAccess* This,
        LPCWSTR wszMethod,
        IWbemQualifierSet **ppQualSet);

    HRESULT (STDMETHODCALLTYPE *GetMethodOrigin)(
        IWbemObjectAccess* This,
        LPCWSTR wszMethodName,
        BSTR *pstrClassName);

    /*** IWbemObjectAccess methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPropertyHandle)(
        IWbemObjectAccess* This,
        LPCWSTR wszPropertyName,
        CIMTYPE *pType,
        LONG *plHandle);

    HRESULT (STDMETHODCALLTYPE *WritePropertyValue)(
        IWbemObjectAccess* This,
        LONG lHandle,
        LONG lNumBytes,
        const byte *aData);

    HRESULT (STDMETHODCALLTYPE *ReadPropertyValue)(
        IWbemObjectAccess* This,
        LONG lHandle,
        LONG lBufferSize,
        LONG *plNumBytes,
        byte *aData);

    HRESULT (STDMETHODCALLTYPE *ReadDWORD)(
        IWbemObjectAccess* This,
        LONG lHandle,
        DWORD *pdw);

    HRESULT (STDMETHODCALLTYPE *WriteDWORD)(
        IWbemObjectAccess* This,
        LONG lHandle,
        DWORD dw);

    HRESULT (STDMETHODCALLTYPE *ReadQWORD)(
        IWbemObjectAccess* This,
        LONG lHandle,
        UINT64 *pqw);

    HRESULT (STDMETHODCALLTYPE *WriteQWORD)(
        IWbemObjectAccess* This,
        LONG lHandle,
        UINT64 pw);

    HRESULT (STDMETHODCALLTYPE *GetPropertyInfoByHandle)(
        IWbemObjectAccess* This,
        LONG lHandle,
        BSTR *pstrName,
        CIMTYPE *pType);

    HRESULT (STDMETHODCALLTYPE *Lock)(
        IWbemObjectAccess* This,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *Unlock)(
        IWbemObjectAccess* This,
        LONG lFlags);

    END_INTERFACE
} IWbemObjectAccessVtbl;
interface IWbemObjectAccess {
    CONST_VTBL IWbemObjectAccessVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemObjectAccess_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemObjectAccess_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemObjectAccess_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemClassObject methods ***/
#define IWbemObjectAccess_GetQualifierSet(This,ppQualSet) (This)->lpVtbl->GetQualifierSet(This,ppQualSet)
#define IWbemObjectAccess_Get(This,wszName,lFlags,pVal,pType,plFlavor) (This)->lpVtbl->Get(This,wszName,lFlags,pVal,pType,plFlavor)
#define IWbemObjectAccess_Put(This,wszName,lFlags,pVal,Type) (This)->lpVtbl->Put(This,wszName,lFlags,pVal,Type)
#define IWbemObjectAccess_Delete(This,wszName) (This)->lpVtbl->Delete(This,wszName)
#define IWbemObjectAccess_GetNames(This,wszQualifierName,lFlags,pQualifierVal,pNames) (This)->lpVtbl->GetNames(This,wszQualifierName,lFlags,pQualifierVal,pNames)
#define IWbemObjectAccess_BeginEnumeration(This,lEnumFlags) (This)->lpVtbl->BeginEnumeration(This,lEnumFlags)
#define IWbemObjectAccess_Next(This,lFlags,strName,pVal,pType,plFlavor) (This)->lpVtbl->Next(This,lFlags,strName,pVal,pType,plFlavor)
#define IWbemObjectAccess_EndEnumeration(This) (This)->lpVtbl->EndEnumeration(This)
#define IWbemObjectAccess_GetPropertyQualifierSet(This,wszProperty,ppQualSet) (This)->lpVtbl->GetPropertyQualifierSet(This,wszProperty,ppQualSet)
#define IWbemObjectAccess_Clone(This,ppCopy) (This)->lpVtbl->Clone(This,ppCopy)
#define IWbemObjectAccess_GetObjectText(This,lFlags,pstrObjectText) (This)->lpVtbl->GetObjectText(This,lFlags,pstrObjectText)
#define IWbemObjectAccess_SpawnDerivedClass(This,lFlags,ppNewClass) (This)->lpVtbl->SpawnDerivedClass(This,lFlags,ppNewClass)
#define IWbemObjectAccess_SpawnInstance(This,lFlags,ppNewInstance) (This)->lpVtbl->SpawnInstance(This,lFlags,ppNewInstance)
#define IWbemObjectAccess_CompareTo(This,lFlags,pCompareTo) (This)->lpVtbl->CompareTo(This,lFlags,pCompareTo)
#define IWbemObjectAccess_GetPropertyOrigin(This,wszName,pstrClassName) (This)->lpVtbl->GetPropertyOrigin(This,wszName,pstrClassName)
#define IWbemObjectAccess_InheritsFrom(This,strAncestor) (This)->lpVtbl->InheritsFrom(This,strAncestor)
#define IWbemObjectAccess_GetMethod(This,wszName,lFlags,ppInSignature,ppOutSignature) (This)->lpVtbl->GetMethod(This,wszName,lFlags,ppInSignature,ppOutSignature)
#define IWbemObjectAccess_PutMethod(This,wszName,lFlags,pInSignature,pOutSignature) (This)->lpVtbl->PutMethod(This,wszName,lFlags,pInSignature,pOutSignature)
#define IWbemObjectAccess_DeleteMethod(This,wszName) (This)->lpVtbl->DeleteMethod(This,wszName)
#define IWbemObjectAccess_BeginMethodEnumeration(This,lEnumFlags) (This)->lpVtbl->BeginMethodEnumeration(This,lEnumFlags)
#define IWbemObjectAccess_NextMethod(This,lFlags,pstrName,ppInSignature,ppOutSignature) (This)->lpVtbl->NextMethod(This,lFlags,pstrName,ppInSignature,ppOutSignature)
#define IWbemObjectAccess_EndMethodEnumeration(This) (This)->lpVtbl->EndMethodEnumeration(This)
#define IWbemObjectAccess_GetMethodQualifierSet(This,wszMethod,ppQualSet) (This)->lpVtbl->GetMethodQualifierSet(This,wszMethod,ppQualSet)
#define IWbemObjectAccess_GetMethodOrigin(This,wszMethodName,pstrClassName) (This)->lpVtbl->GetMethodOrigin(This,wszMethodName,pstrClassName)
/*** IWbemObjectAccess methods ***/
#define IWbemObjectAccess_GetPropertyHandle(This,wszPropertyName,pType,plHandle) (This)->lpVtbl->GetPropertyHandle(This,wszPropertyName,pType,plHandle)
#define IWbemObjectAccess_WritePropertyValue(This,lHandle,lNumBytes,aData) (This)->lpVtbl->WritePropertyValue(This,lHandle,lNumBytes,aData)
#define IWbemObjectAccess_ReadPropertyValue(This,lHandle,lBufferSize,plNumBytes,aData) (This)->lpVtbl->ReadPropertyValue(This,lHandle,lBufferSize,plNumBytes,aData)
#define IWbemObjectAccess_ReadDWORD(This,lHandle,pdw) (This)->lpVtbl->ReadDWORD(This,lHandle,pdw)
#define IWbemObjectAccess_WriteDWORD(This,lHandle,dw) (This)->lpVtbl->WriteDWORD(This,lHandle,dw)
#define IWbemObjectAccess_ReadQWORD(This,lHandle,pqw) (This)->lpVtbl->ReadQWORD(This,lHandle,pqw)
#define IWbemObjectAccess_WriteQWORD(This,lHandle,pw) (This)->lpVtbl->WriteQWORD(This,lHandle,pw)
#define IWbemObjectAccess_GetPropertyInfoByHandle(This,lHandle,pstrName,pType) (This)->lpVtbl->GetPropertyInfoByHandle(This,lHandle,pstrName,pType)
#define IWbemObjectAccess_Lock(This,lFlags) (This)->lpVtbl->Lock(This,lFlags)
#define IWbemObjectAccess_Unlock(This,lFlags) (This)->lpVtbl->Unlock(This,lFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemObjectAccess_QueryInterface(IWbemObjectAccess* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemObjectAccess_AddRef(IWbemObjectAccess* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemObjectAccess_Release(IWbemObjectAccess* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemClassObject methods ***/
static FORCEINLINE HRESULT IWbemObjectAccess_GetQualifierSet(IWbemObjectAccess* This,IWbemQualifierSet **ppQualSet) {
    return This->lpVtbl->GetQualifierSet(This,ppQualSet);
}
static FORCEINLINE HRESULT IWbemObjectAccess_Get(IWbemObjectAccess* This,LPCWSTR wszName,LONG lFlags,VARIANT *pVal,CIMTYPE *pType,LONG *plFlavor) {
    return This->lpVtbl->Get(This,wszName,lFlags,pVal,pType,plFlavor);
}
static FORCEINLINE HRESULT IWbemObjectAccess_Put(IWbemObjectAccess* This,LPCWSTR wszName,LONG lFlags,VARIANT *pVal,CIMTYPE Type) {
    return This->lpVtbl->Put(This,wszName,lFlags,pVal,Type);
}
static FORCEINLINE HRESULT IWbemObjectAccess_Delete(IWbemObjectAccess* This,LPCWSTR wszName) {
    return This->lpVtbl->Delete(This,wszName);
}
static FORCEINLINE HRESULT IWbemObjectAccess_GetNames(IWbemObjectAccess* This,LPCWSTR wszQualifierName,LONG lFlags,VARIANT *pQualifierVal,SAFEARRAY **pNames) {
    return This->lpVtbl->GetNames(This,wszQualifierName,lFlags,pQualifierVal,pNames);
}
static FORCEINLINE HRESULT IWbemObjectAccess_BeginEnumeration(IWbemObjectAccess* This,LONG lEnumFlags) {
    return This->lpVtbl->BeginEnumeration(This,lEnumFlags);
}
static FORCEINLINE HRESULT IWbemObjectAccess_Next(IWbemObjectAccess* This,LONG lFlags,BSTR *strName,VARIANT *pVal,CIMTYPE *pType,LONG *plFlavor) {
    return This->lpVtbl->Next(This,lFlags,strName,pVal,pType,plFlavor);
}
static FORCEINLINE HRESULT IWbemObjectAccess_EndEnumeration(IWbemObjectAccess* This) {
    return This->lpVtbl->EndEnumeration(This);
}
static FORCEINLINE HRESULT IWbemObjectAccess_GetPropertyQualifierSet(IWbemObjectAccess* This,LPCWSTR wszProperty,IWbemQualifierSet **ppQualSet) {
    return This->lpVtbl->GetPropertyQualifierSet(This,wszProperty,ppQualSet);
}
static FORCEINLINE HRESULT IWbemObjectAccess_Clone(IWbemObjectAccess* This,IWbemClassObject **ppCopy) {
    return This->lpVtbl->Clone(This,ppCopy);
}
static FORCEINLINE HRESULT IWbemObjectAccess_GetObjectText(IWbemObjectAccess* This,LONG lFlags,BSTR *pstrObjectText) {
    return This->lpVtbl->GetObjectText(This,lFlags,pstrObjectText);
}
static FORCEINLINE HRESULT IWbemObjectAccess_SpawnDerivedClass(IWbemObjectAccess* This,LONG lFlags,IWbemClassObject **ppNewClass) {
    return This->lpVtbl->SpawnDerivedClass(This,lFlags,ppNewClass);
}
static FORCEINLINE HRESULT IWbemObjectAccess_SpawnInstance(IWbemObjectAccess* This,LONG lFlags,IWbemClassObject **ppNewInstance) {
    return This->lpVtbl->SpawnInstance(This,lFlags,ppNewInstance);
}
static FORCEINLINE HRESULT IWbemObjectAccess_CompareTo(IWbemObjectAccess* This,LONG lFlags,IWbemClassObject *pCompareTo) {
    return This->lpVtbl->CompareTo(This,lFlags,pCompareTo);
}
static FORCEINLINE HRESULT IWbemObjectAccess_GetPropertyOrigin(IWbemObjectAccess* This,LPCWSTR wszName,BSTR *pstrClassName) {
    return This->lpVtbl->GetPropertyOrigin(This,wszName,pstrClassName);
}
static FORCEINLINE HRESULT IWbemObjectAccess_InheritsFrom(IWbemObjectAccess* This,LPCWSTR strAncestor) {
    return This->lpVtbl->InheritsFrom(This,strAncestor);
}
static FORCEINLINE HRESULT IWbemObjectAccess_GetMethod(IWbemObjectAccess* This,LPCWSTR wszName,LONG lFlags,IWbemClassObject **ppInSignature,IWbemClassObject **ppOutSignature) {
    return This->lpVtbl->GetMethod(This,wszName,lFlags,ppInSignature,ppOutSignature);
}
static FORCEINLINE HRESULT IWbemObjectAccess_PutMethod(IWbemObjectAccess* This,LPCWSTR wszName,LONG lFlags,IWbemClassObject *pInSignature,IWbemClassObject *pOutSignature) {
    return This->lpVtbl->PutMethod(This,wszName,lFlags,pInSignature,pOutSignature);
}
static FORCEINLINE HRESULT IWbemObjectAccess_DeleteMethod(IWbemObjectAccess* This,LPCWSTR wszName) {
    return This->lpVtbl->DeleteMethod(This,wszName);
}
static FORCEINLINE HRESULT IWbemObjectAccess_BeginMethodEnumeration(IWbemObjectAccess* This,LONG lEnumFlags) {
    return This->lpVtbl->BeginMethodEnumeration(This,lEnumFlags);
}
static FORCEINLINE HRESULT IWbemObjectAccess_NextMethod(IWbemObjectAccess* This,LONG lFlags,BSTR *pstrName,IWbemClassObject **ppInSignature,IWbemClassObject **ppOutSignature) {
    return This->lpVtbl->NextMethod(This,lFlags,pstrName,ppInSignature,ppOutSignature);
}
static FORCEINLINE HRESULT IWbemObjectAccess_EndMethodEnumeration(IWbemObjectAccess* This) {
    return This->lpVtbl->EndMethodEnumeration(This);
}
static FORCEINLINE HRESULT IWbemObjectAccess_GetMethodQualifierSet(IWbemObjectAccess* This,LPCWSTR wszMethod,IWbemQualifierSet **ppQualSet) {
    return This->lpVtbl->GetMethodQualifierSet(This,wszMethod,ppQualSet);
}
static FORCEINLINE HRESULT IWbemObjectAccess_GetMethodOrigin(IWbemObjectAccess* This,LPCWSTR wszMethodName,BSTR *pstrClassName) {
    return This->lpVtbl->GetMethodOrigin(This,wszMethodName,pstrClassName);
}
/*** IWbemObjectAccess methods ***/
static FORCEINLINE HRESULT IWbemObjectAccess_GetPropertyHandle(IWbemObjectAccess* This,LPCWSTR wszPropertyName,CIMTYPE *pType,LONG *plHandle) {
    return This->lpVtbl->GetPropertyHandle(This,wszPropertyName,pType,plHandle);
}
static FORCEINLINE HRESULT IWbemObjectAccess_WritePropertyValue(IWbemObjectAccess* This,LONG lHandle,LONG lNumBytes,const byte *aData) {
    return This->lpVtbl->WritePropertyValue(This,lHandle,lNumBytes,aData);
}
static FORCEINLINE HRESULT IWbemObjectAccess_ReadPropertyValue(IWbemObjectAccess* This,LONG lHandle,LONG lBufferSize,LONG *plNumBytes,byte *aData) {
    return This->lpVtbl->ReadPropertyValue(This,lHandle,lBufferSize,plNumBytes,aData);
}
static FORCEINLINE HRESULT IWbemObjectAccess_ReadDWORD(IWbemObjectAccess* This,LONG lHandle,DWORD *pdw) {
    return This->lpVtbl->ReadDWORD(This,lHandle,pdw);
}
static FORCEINLINE HRESULT IWbemObjectAccess_WriteDWORD(IWbemObjectAccess* This,LONG lHandle,DWORD dw) {
    return This->lpVtbl->WriteDWORD(This,lHandle,dw);
}
static FORCEINLINE HRESULT IWbemObjectAccess_ReadQWORD(IWbemObjectAccess* This,LONG lHandle,UINT64 *pqw) {
    return This->lpVtbl->ReadQWORD(This,lHandle,pqw);
}
static FORCEINLINE HRESULT IWbemObjectAccess_WriteQWORD(IWbemObjectAccess* This,LONG lHandle,UINT64 pw) {
    return This->lpVtbl->WriteQWORD(This,lHandle,pw);
}
static FORCEINLINE HRESULT IWbemObjectAccess_GetPropertyInfoByHandle(IWbemObjectAccess* This,LONG lHandle,BSTR *pstrName,CIMTYPE *pType) {
    return This->lpVtbl->GetPropertyInfoByHandle(This,lHandle,pstrName,pType);
}
static FORCEINLINE HRESULT IWbemObjectAccess_Lock(IWbemObjectAccess* This,LONG lFlags) {
    return This->lpVtbl->Lock(This,lFlags);
}
static FORCEINLINE HRESULT IWbemObjectAccess_Unlock(IWbemObjectAccess* This,LONG lFlags) {
    return This->lpVtbl->Unlock(This,lFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemObjectAccess_GetPropertyHandle_Proxy(
    IWbemObjectAccess* This,
    LPCWSTR wszPropertyName,
    CIMTYPE *pType,
    LONG *plHandle);
void __RPC_STUB IWbemObjectAccess_GetPropertyHandle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_WritePropertyValue_Proxy(
    IWbemObjectAccess* This,
    LONG lHandle,
    LONG lNumBytes,
    const byte *aData);
void __RPC_STUB IWbemObjectAccess_WritePropertyValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_ReadPropertyValue_Proxy(
    IWbemObjectAccess* This,
    LONG lHandle,
    LONG lBufferSize,
    LONG *plNumBytes,
    byte *aData);
void __RPC_STUB IWbemObjectAccess_ReadPropertyValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_ReadDWORD_Proxy(
    IWbemObjectAccess* This,
    LONG lHandle,
    DWORD *pdw);
void __RPC_STUB IWbemObjectAccess_ReadDWORD_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_WriteDWORD_Proxy(
    IWbemObjectAccess* This,
    LONG lHandle,
    DWORD dw);
void __RPC_STUB IWbemObjectAccess_WriteDWORD_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_ReadQWORD_Proxy(
    IWbemObjectAccess* This,
    LONG lHandle,
    UINT64 *pqw);
void __RPC_STUB IWbemObjectAccess_ReadQWORD_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_WriteQWORD_Proxy(
    IWbemObjectAccess* This,
    LONG lHandle,
    UINT64 pw);
void __RPC_STUB IWbemObjectAccess_WriteQWORD_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_GetPropertyInfoByHandle_Proxy(
    IWbemObjectAccess* This,
    LONG lHandle,
    BSTR *pstrName,
    CIMTYPE *pType);
void __RPC_STUB IWbemObjectAccess_GetPropertyInfoByHandle_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_Lock_Proxy(
    IWbemObjectAccess* This,
    LONG lFlags);
void __RPC_STUB IWbemObjectAccess_Lock_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemObjectAccess_Unlock_Proxy(
    IWbemObjectAccess* This,
    LONG lFlags);
void __RPC_STUB IWbemObjectAccess_Unlock_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemObjectAccess_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMofCompiler interface
 */
#ifndef __IMofCompiler_INTERFACE_DEFINED__
#define __IMofCompiler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMofCompiler, 0x6daf974e, 0x2e37, 0x11d2, 0xae,0xc9, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6daf974e-2e37-11d2-aec9-00c04fb68820")
IMofCompiler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CompileFile(
        LPWSTR FileName,
        LPWSTR ServerAndNamespace,
        LPWSTR User,
        LPWSTR Authority,
        LPWSTR Password,
        LONG lOptionFlags,
        LONG lClassFlags,
        LONG lInstanceFlags,
        WBEM_COMPILE_STATUS_INFO *pInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompileBuffer(
        LONG BuffSize,
        BYTE *pBuffer,
        LPWSTR ServerAndNamespace,
        LPWSTR User,
        LPWSTR Authority,
        LPWSTR Password,
        LONG lOptionFlags,
        LONG lClassFlags,
        LONG lInstanceFlags,
        WBEM_COMPILE_STATUS_INFO *pInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateBMOF(
        LPWSTR TextFileName,
        LPWSTR BMOFFileName,
        LPWSTR ServerAndNamespace,
        LONG lOptionFlags,
        LONG lClassFlags,
        LONG lInstanceFlags,
        WBEM_COMPILE_STATUS_INFO *pInfo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMofCompiler, 0x6daf974e, 0x2e37, 0x11d2, 0xae,0xc9, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#else
typedef struct IMofCompilerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMofCompiler methods ***/
    HRESULT (STDMETHODCALLTYPE *CompileFile)(
        IMofCompiler* This,
        LPWSTR FileName,
        LPWSTR ServerAndNamespace,
        LPWSTR User,
        LPWSTR Authority,
        LPWSTR Password,
        LONG lOptionFlags,
        LONG lClassFlags,
        LONG lInstanceFlags,
        WBEM_COMPILE_STATUS_INFO *pInfo);

    HRESULT (STDMETHODCALLTYPE *CompileBuffer)(
        IMofCompiler* This,
        LONG BuffSize,
        BYTE *pBuffer,
        LPWSTR ServerAndNamespace,
        LPWSTR User,
        LPWSTR Authority,
        LPWSTR Password,
        LONG lOptionFlags,
        LONG lClassFlags,
        LONG lInstanceFlags,
        WBEM_COMPILE_STATUS_INFO *pInfo);

    HRESULT (STDMETHODCALLTYPE *CreateBMOF)(
        IMofCompiler* This,
        LPWSTR TextFileName,
        LPWSTR BMOFFileName,
        LPWSTR ServerAndNamespace,
        LONG lOptionFlags,
        LONG lClassFlags,
        LONG lInstanceFlags,
        WBEM_COMPILE_STATUS_INFO *pInfo);

    END_INTERFACE
} IMofCompilerVtbl;
interface IMofCompiler {
    CONST_VTBL IMofCompilerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMofCompiler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMofCompiler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMofCompiler_Release(This) (This)->lpVtbl->Release(This)
/*** IMofCompiler methods ***/
#define IMofCompiler_CompileFile(This,FileName,ServerAndNamespace,User,Authority,Password,lOptionFlags,lClassFlags,lInstanceFlags,pInfo) (This)->lpVtbl->CompileFile(This,FileName,ServerAndNamespace,User,Authority,Password,lOptionFlags,lClassFlags,lInstanceFlags,pInfo)
#define IMofCompiler_CompileBuffer(This,BuffSize,pBuffer,ServerAndNamespace,User,Authority,Password,lOptionFlags,lClassFlags,lInstanceFlags,pInfo) (This)->lpVtbl->CompileBuffer(This,BuffSize,pBuffer,ServerAndNamespace,User,Authority,Password,lOptionFlags,lClassFlags,lInstanceFlags,pInfo)
#define IMofCompiler_CreateBMOF(This,TextFileName,BMOFFileName,ServerAndNamespace,lOptionFlags,lClassFlags,lInstanceFlags,pInfo) (This)->lpVtbl->CreateBMOF(This,TextFileName,BMOFFileName,ServerAndNamespace,lOptionFlags,lClassFlags,lInstanceFlags,pInfo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMofCompiler_QueryInterface(IMofCompiler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMofCompiler_AddRef(IMofCompiler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMofCompiler_Release(IMofCompiler* This) {
    return This->lpVtbl->Release(This);
}
/*** IMofCompiler methods ***/
static FORCEINLINE HRESULT IMofCompiler_CompileFile(IMofCompiler* This,LPWSTR FileName,LPWSTR ServerAndNamespace,LPWSTR User,LPWSTR Authority,LPWSTR Password,LONG lOptionFlags,LONG lClassFlags,LONG lInstanceFlags,WBEM_COMPILE_STATUS_INFO *pInfo) {
    return This->lpVtbl->CompileFile(This,FileName,ServerAndNamespace,User,Authority,Password,lOptionFlags,lClassFlags,lInstanceFlags,pInfo);
}
static FORCEINLINE HRESULT IMofCompiler_CompileBuffer(IMofCompiler* This,LONG BuffSize,BYTE *pBuffer,LPWSTR ServerAndNamespace,LPWSTR User,LPWSTR Authority,LPWSTR Password,LONG lOptionFlags,LONG lClassFlags,LONG lInstanceFlags,WBEM_COMPILE_STATUS_INFO *pInfo) {
    return This->lpVtbl->CompileBuffer(This,BuffSize,pBuffer,ServerAndNamespace,User,Authority,Password,lOptionFlags,lClassFlags,lInstanceFlags,pInfo);
}
static FORCEINLINE HRESULT IMofCompiler_CreateBMOF(IMofCompiler* This,LPWSTR TextFileName,LPWSTR BMOFFileName,LPWSTR ServerAndNamespace,LONG lOptionFlags,LONG lClassFlags,LONG lInstanceFlags,WBEM_COMPILE_STATUS_INFO *pInfo) {
    return This->lpVtbl->CreateBMOF(This,TextFileName,BMOFFileName,ServerAndNamespace,lOptionFlags,lClassFlags,lInstanceFlags,pInfo);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMofCompiler_CompileFile_Proxy(
    IMofCompiler* This,
    LPWSTR FileName,
    LPWSTR ServerAndNamespace,
    LPWSTR User,
    LPWSTR Authority,
    LPWSTR Password,
    LONG lOptionFlags,
    LONG lClassFlags,
    LONG lInstanceFlags,
    WBEM_COMPILE_STATUS_INFO *pInfo);
void __RPC_STUB IMofCompiler_CompileFile_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMofCompiler_CompileBuffer_Proxy(
    IMofCompiler* This,
    LONG BuffSize,
    BYTE *pBuffer,
    LPWSTR ServerAndNamespace,
    LPWSTR User,
    LPWSTR Authority,
    LPWSTR Password,
    LONG lOptionFlags,
    LONG lClassFlags,
    LONG lInstanceFlags,
    WBEM_COMPILE_STATUS_INFO *pInfo);
void __RPC_STUB IMofCompiler_CompileBuffer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMofCompiler_CreateBMOF_Proxy(
    IMofCompiler* This,
    LPWSTR TextFileName,
    LPWSTR BMOFFileName,
    LPWSTR ServerAndNamespace,
    LONG lOptionFlags,
    LONG lClassFlags,
    LONG lInstanceFlags,
    WBEM_COMPILE_STATUS_INFO *pInfo);
void __RPC_STUB IMofCompiler_CreateBMOF_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMofCompiler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUnsecuredApartment interface
 */
#ifndef __IUnsecuredApartment_INTERFACE_DEFINED__
#define __IUnsecuredApartment_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUnsecuredApartment, 0x1cfaba8c, 0x1523, 0x11d1, 0xad,0x79, 0x00,0xc0,0x4f,0xd8,0xfd,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1cfaba8c-1523-11d1-ad79-00c04fd8fdff")
IUnsecuredApartment : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateObjectStub(
        IUnknown *pObject,
        IUnknown **ppStub) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUnsecuredApartment, 0x1cfaba8c, 0x1523, 0x11d1, 0xad,0x79, 0x00,0xc0,0x4f,0xd8,0xfd,0xff)
#endif
#else
typedef struct IUnsecuredApartmentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUnsecuredApartment methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateObjectStub)(
        IUnsecuredApartment* This,
        IUnknown *pObject,
        IUnknown **ppStub);

    END_INTERFACE
} IUnsecuredApartmentVtbl;
interface IUnsecuredApartment {
    CONST_VTBL IUnsecuredApartmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUnsecuredApartment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUnsecuredApartment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUnsecuredApartment_Release(This) (This)->lpVtbl->Release(This)
/*** IUnsecuredApartment methods ***/
#define IUnsecuredApartment_CreateObjectStub(This,pObject,ppStub) (This)->lpVtbl->CreateObjectStub(This,pObject,ppStub)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUnsecuredApartment_QueryInterface(IUnsecuredApartment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUnsecuredApartment_AddRef(IUnsecuredApartment* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUnsecuredApartment_Release(IUnsecuredApartment* This) {
    return This->lpVtbl->Release(This);
}
/*** IUnsecuredApartment methods ***/
static FORCEINLINE HRESULT IUnsecuredApartment_CreateObjectStub(IUnsecuredApartment* This,IUnknown *pObject,IUnknown **ppStub) {
    return This->lpVtbl->CreateObjectStub(This,pObject,ppStub);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IUnsecuredApartment_CreateObjectStub_Proxy(
    IUnsecuredApartment* This,
    IUnknown *pObject,
    IUnknown **ppStub);
void __RPC_STUB IUnsecuredApartment_CreateObjectStub_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IUnsecuredApartment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemUnsecuredApartment interface
 */
#ifndef __IWbemUnsecuredApartment_INTERFACE_DEFINED__
#define __IWbemUnsecuredApartment_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemUnsecuredApartment, 0x31739d04, 0x3471, 0x4cf4, 0x9a,0x7c, 0x57,0xa4,0x4a,0xe7,0x19,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("31739d04-3471-4cf4-9a7c-57a44ae71956")
IWbemUnsecuredApartment : public IUnsecuredApartment
{
    virtual HRESULT STDMETHODCALLTYPE CreateSinkStub(
        IWbemObjectSink *pSink,
        DWORD dwFlags,
        LPCWSTR wszReserved,
        IWbemObjectSink **ppStub) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemUnsecuredApartment, 0x31739d04, 0x3471, 0x4cf4, 0x9a,0x7c, 0x57,0xa4,0x4a,0xe7,0x19,0x56)
#endif
#else
typedef struct IWbemUnsecuredApartmentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUnsecuredApartment methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateObjectStub)(
        IWbemUnsecuredApartment* This,
        IUnknown *pObject,
        IUnknown **ppStub);

    /*** IWbemUnsecuredApartment methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateSinkStub)(
        IWbemUnsecuredApartment* This,
        IWbemObjectSink *pSink,
        DWORD dwFlags,
        LPCWSTR wszReserved,
        IWbemObjectSink **ppStub);

    END_INTERFACE
} IWbemUnsecuredApartmentVtbl;
interface IWbemUnsecuredApartment {
    CONST_VTBL IWbemUnsecuredApartmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemUnsecuredApartment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemUnsecuredApartment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemUnsecuredApartment_Release(This) (This)->lpVtbl->Release(This)
/*** IUnsecuredApartment methods ***/
#define IWbemUnsecuredApartment_CreateObjectStub(This,pObject,ppStub) (This)->lpVtbl->CreateObjectStub(This,pObject,ppStub)
/*** IWbemUnsecuredApartment methods ***/
#define IWbemUnsecuredApartment_CreateSinkStub(This,pSink,dwFlags,wszReserved,ppStub) (This)->lpVtbl->CreateSinkStub(This,pSink,dwFlags,wszReserved,ppStub)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemUnsecuredApartment_QueryInterface(IWbemUnsecuredApartment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemUnsecuredApartment_AddRef(IWbemUnsecuredApartment* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemUnsecuredApartment_Release(IWbemUnsecuredApartment* This) {
    return This->lpVtbl->Release(This);
}
/*** IUnsecuredApartment methods ***/
static FORCEINLINE HRESULT IWbemUnsecuredApartment_CreateObjectStub(IWbemUnsecuredApartment* This,IUnknown *pObject,IUnknown **ppStub) {
    return This->lpVtbl->CreateObjectStub(This,pObject,ppStub);
}
/*** IWbemUnsecuredApartment methods ***/
static FORCEINLINE HRESULT IWbemUnsecuredApartment_CreateSinkStub(IWbemUnsecuredApartment* This,IWbemObjectSink *pSink,DWORD dwFlags,LPCWSTR wszReserved,IWbemObjectSink **ppStub) {
    return This->lpVtbl->CreateSinkStub(This,pSink,dwFlags,wszReserved,ppStub);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemUnsecuredApartment_CreateSinkStub_Proxy(
    IWbemUnsecuredApartment* This,
    IWbemObjectSink *pSink,
    DWORD dwFlags,
    LPCWSTR wszReserved,
    IWbemObjectSink **ppStub);
void __RPC_STUB IWbemUnsecuredApartment_CreateSinkStub_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemUnsecuredApartment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemStatusCodeText interface
 */
#ifndef __IWbemStatusCodeText_INTERFACE_DEFINED__
#define __IWbemStatusCodeText_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemStatusCodeText, 0xeb87e1bc, 0x3233, 0x11d2, 0xae,0xc9, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eb87e1bc-3233-11d2-aec9-00c04fb68820")
IWbemStatusCodeText : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetErrorCodeText(
        HRESULT hRes,
        LCID LocaleId,
        LONG lFlags,
        BSTR *MessageText) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFacilityCodeText(
        HRESULT hRes,
        LCID LocaleId,
        LONG lFlags,
        BSTR *MessageText) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemStatusCodeText, 0xeb87e1bc, 0x3233, 0x11d2, 0xae,0xc9, 0x00,0xc0,0x4f,0xb6,0x88,0x20)
#endif
#else
typedef struct IWbemStatusCodeTextVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemStatusCodeText methods ***/
    HRESULT (STDMETHODCALLTYPE *GetErrorCodeText)(
        IWbemStatusCodeText* This,
        HRESULT hRes,
        LCID LocaleId,
        LONG lFlags,
        BSTR *MessageText);

    HRESULT (STDMETHODCALLTYPE *GetFacilityCodeText)(
        IWbemStatusCodeText* This,
        HRESULT hRes,
        LCID LocaleId,
        LONG lFlags,
        BSTR *MessageText);

    END_INTERFACE
} IWbemStatusCodeTextVtbl;
interface IWbemStatusCodeText {
    CONST_VTBL IWbemStatusCodeTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemStatusCodeText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemStatusCodeText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemStatusCodeText_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemStatusCodeText methods ***/
#define IWbemStatusCodeText_GetErrorCodeText(This,hRes,LocaleId,lFlags,MessageText) (This)->lpVtbl->GetErrorCodeText(This,hRes,LocaleId,lFlags,MessageText)
#define IWbemStatusCodeText_GetFacilityCodeText(This,hRes,LocaleId,lFlags,MessageText) (This)->lpVtbl->GetFacilityCodeText(This,hRes,LocaleId,lFlags,MessageText)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemStatusCodeText_QueryInterface(IWbemStatusCodeText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemStatusCodeText_AddRef(IWbemStatusCodeText* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemStatusCodeText_Release(IWbemStatusCodeText* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemStatusCodeText methods ***/
static FORCEINLINE HRESULT IWbemStatusCodeText_GetErrorCodeText(IWbemStatusCodeText* This,HRESULT hRes,LCID LocaleId,LONG lFlags,BSTR *MessageText) {
    return This->lpVtbl->GetErrorCodeText(This,hRes,LocaleId,lFlags,MessageText);
}
static FORCEINLINE HRESULT IWbemStatusCodeText_GetFacilityCodeText(IWbemStatusCodeText* This,HRESULT hRes,LCID LocaleId,LONG lFlags,BSTR *MessageText) {
    return This->lpVtbl->GetFacilityCodeText(This,hRes,LocaleId,lFlags,MessageText);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemStatusCodeText_GetErrorCodeText_Proxy(
    IWbemStatusCodeText* This,
    HRESULT hRes,
    LCID LocaleId,
    LONG lFlags,
    BSTR *MessageText);
void __RPC_STUB IWbemStatusCodeText_GetErrorCodeText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemStatusCodeText_GetFacilityCodeText_Proxy(
    IWbemStatusCodeText* This,
    HRESULT hRes,
    LCID LocaleId,
    LONG lFlags,
    BSTR *MessageText);
void __RPC_STUB IWbemStatusCodeText_GetFacilityCodeText_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemStatusCodeText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemBackupRestore interface
 */
#ifndef __IWbemBackupRestore_INTERFACE_DEFINED__
#define __IWbemBackupRestore_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemBackupRestore, 0xc49e32c7, 0xbc8b, 0x11d2, 0x85,0xd4, 0x00,0x10,0x5a,0x1f,0x83,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c49e32c7-bc8b-11d2-85d4-00105a1f8304")
IWbemBackupRestore : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Backup(
        LPCWSTR strBackupToFile,
        LONG lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Restore(
        LPCWSTR strRestoreFromFile,
        LONG lFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemBackupRestore, 0xc49e32c7, 0xbc8b, 0x11d2, 0x85,0xd4, 0x00,0x10,0x5a,0x1f,0x83,0x04)
#endif
#else
typedef struct IWbemBackupRestoreVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemBackupRestore methods ***/
    HRESULT (STDMETHODCALLTYPE *Backup)(
        IWbemBackupRestore* This,
        LPCWSTR strBackupToFile,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *Restore)(
        IWbemBackupRestore* This,
        LPCWSTR strRestoreFromFile,
        LONG lFlags);

    END_INTERFACE
} IWbemBackupRestoreVtbl;
interface IWbemBackupRestore {
    CONST_VTBL IWbemBackupRestoreVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemBackupRestore_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemBackupRestore_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemBackupRestore_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemBackupRestore methods ***/
#define IWbemBackupRestore_Backup(This,strBackupToFile,lFlags) (This)->lpVtbl->Backup(This,strBackupToFile,lFlags)
#define IWbemBackupRestore_Restore(This,strRestoreFromFile,lFlags) (This)->lpVtbl->Restore(This,strRestoreFromFile,lFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemBackupRestore_QueryInterface(IWbemBackupRestore* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemBackupRestore_AddRef(IWbemBackupRestore* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemBackupRestore_Release(IWbemBackupRestore* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemBackupRestore methods ***/
static FORCEINLINE HRESULT IWbemBackupRestore_Backup(IWbemBackupRestore* This,LPCWSTR strBackupToFile,LONG lFlags) {
    return This->lpVtbl->Backup(This,strBackupToFile,lFlags);
}
static FORCEINLINE HRESULT IWbemBackupRestore_Restore(IWbemBackupRestore* This,LPCWSTR strRestoreFromFile,LONG lFlags) {
    return This->lpVtbl->Restore(This,strRestoreFromFile,lFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemBackupRestore_Backup_Proxy(
    IWbemBackupRestore* This,
    LPCWSTR strBackupToFile,
    LONG lFlags);
void __RPC_STUB IWbemBackupRestore_Backup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemBackupRestore_Restore_Proxy(
    IWbemBackupRestore* This,
    LPCWSTR strRestoreFromFile,
    LONG lFlags);
void __RPC_STUB IWbemBackupRestore_Restore_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemBackupRestore_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemBackupRestoreEx interface
 */
#ifndef __IWbemBackupRestoreEx_INTERFACE_DEFINED__
#define __IWbemBackupRestoreEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemBackupRestoreEx, 0xa359dec5, 0xe813, 0x4834, 0x8a,0x2a, 0xba,0x7f,0x1d,0x77,0x7d,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a359dec5-e813-4834-8a2a-ba7f1d777d76")
IWbemBackupRestoreEx : public IWbemBackupRestore
{
    virtual HRESULT STDMETHODCALLTYPE Pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemBackupRestoreEx, 0xa359dec5, 0xe813, 0x4834, 0x8a,0x2a, 0xba,0x7f,0x1d,0x77,0x7d,0x76)
#endif
#else
typedef struct IWbemBackupRestoreExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemBackupRestore methods ***/
    HRESULT (STDMETHODCALLTYPE *Backup)(
        IWbemBackupRestoreEx* This,
        LPCWSTR strBackupToFile,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *Restore)(
        IWbemBackupRestoreEx* This,
        LPCWSTR strRestoreFromFile,
        LONG lFlags);

    /*** IWbemBackupRestoreEx methods ***/
    HRESULT (STDMETHODCALLTYPE *Pause)(
        IWbemBackupRestoreEx* This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IWbemBackupRestoreEx* This);

    END_INTERFACE
} IWbemBackupRestoreExVtbl;
interface IWbemBackupRestoreEx {
    CONST_VTBL IWbemBackupRestoreExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemBackupRestoreEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemBackupRestoreEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemBackupRestoreEx_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemBackupRestore methods ***/
#define IWbemBackupRestoreEx_Backup(This,strBackupToFile,lFlags) (This)->lpVtbl->Backup(This,strBackupToFile,lFlags)
#define IWbemBackupRestoreEx_Restore(This,strRestoreFromFile,lFlags) (This)->lpVtbl->Restore(This,strRestoreFromFile,lFlags)
/*** IWbemBackupRestoreEx methods ***/
#define IWbemBackupRestoreEx_Pause(This) (This)->lpVtbl->Pause(This)
#define IWbemBackupRestoreEx_Resume(This) (This)->lpVtbl->Resume(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemBackupRestoreEx_QueryInterface(IWbemBackupRestoreEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemBackupRestoreEx_AddRef(IWbemBackupRestoreEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemBackupRestoreEx_Release(IWbemBackupRestoreEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemBackupRestore methods ***/
static FORCEINLINE HRESULT IWbemBackupRestoreEx_Backup(IWbemBackupRestoreEx* This,LPCWSTR strBackupToFile,LONG lFlags) {
    return This->lpVtbl->Backup(This,strBackupToFile,lFlags);
}
static FORCEINLINE HRESULT IWbemBackupRestoreEx_Restore(IWbemBackupRestoreEx* This,LPCWSTR strRestoreFromFile,LONG lFlags) {
    return This->lpVtbl->Restore(This,strRestoreFromFile,lFlags);
}
/*** IWbemBackupRestoreEx methods ***/
static FORCEINLINE HRESULT IWbemBackupRestoreEx_Pause(IWbemBackupRestoreEx* This) {
    return This->lpVtbl->Pause(This);
}
static FORCEINLINE HRESULT IWbemBackupRestoreEx_Resume(IWbemBackupRestoreEx* This) {
    return This->lpVtbl->Resume(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemBackupRestoreEx_Pause_Proxy(
    IWbemBackupRestoreEx* This);
void __RPC_STUB IWbemBackupRestoreEx_Pause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemBackupRestoreEx_Resume_Proxy(
    IWbemBackupRestoreEx* This);
void __RPC_STUB IWbemBackupRestoreEx_Resume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemBackupRestoreEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemRefresher interface
 */
#ifndef __IWbemRefresher_INTERFACE_DEFINED__
#define __IWbemRefresher_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemRefresher, 0x49353c99, 0x516b, 0x11d1, 0xae,0xa6, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("49353c99-516b-11d1-aea6-00c04fb68820")
IWbemRefresher : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Refresh(
        LONG lFlags) = 0;

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

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

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

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

    /*** IWbemRefresher methods ***/
    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IWbemRefresher* This,
        LONG lFlags);

    END_INTERFACE
} IWbemRefresherVtbl;
interface IWbemRefresher {
    CONST_VTBL IWbemRefresherVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemRefresher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemRefresher_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemRefresher_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemRefresher methods ***/
#define IWbemRefresher_Refresh(This,lFlags) (This)->lpVtbl->Refresh(This,lFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemRefresher_QueryInterface(IWbemRefresher* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemRefresher_AddRef(IWbemRefresher* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemRefresher_Release(IWbemRefresher* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemRefresher methods ***/
static FORCEINLINE HRESULT IWbemRefresher_Refresh(IWbemRefresher* This,LONG lFlags) {
    return This->lpVtbl->Refresh(This,lFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemRefresher_Refresh_Proxy(
    IWbemRefresher* This,
    LONG lFlags);
void __RPC_STUB IWbemRefresher_Refresh_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemRefresher_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemHiPerfEnum interface
 */
#ifndef __IWbemHiPerfEnum_INTERFACE_DEFINED__
#define __IWbemHiPerfEnum_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemHiPerfEnum, 0x2705c288, 0x79ae, 0x11d2, 0xb3,0x48, 0x00,0x10,0x5a,0x1f,0x81,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2705c288-79ae-11d2-b348-00105a1f8177")
IWbemHiPerfEnum : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddObjects(
        LONG lFlags,
        ULONG uNumObjects,
        LONG *apIds,
        IWbemObjectAccess **apObj) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveObjects(
        LONG lFlags,
        ULONG uNumObjects,
        LONG *apIds) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjects(
        LONG lFlags,
        ULONG uNumObjects,
        IWbemObjectAccess **apObj,
        ULONG *puReturned) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAll(
        LONG lFlags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWbemHiPerfEnum, 0x2705c288, 0x79ae, 0x11d2, 0xb3,0x48, 0x00,0x10,0x5a,0x1f,0x81,0x77)
#endif
#else
typedef struct IWbemHiPerfEnumVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWbemHiPerfEnum methods ***/
    HRESULT (STDMETHODCALLTYPE *AddObjects)(
        IWbemHiPerfEnum* This,
        LONG lFlags,
        ULONG uNumObjects,
        LONG *apIds,
        IWbemObjectAccess **apObj);

    HRESULT (STDMETHODCALLTYPE *RemoveObjects)(
        IWbemHiPerfEnum* This,
        LONG lFlags,
        ULONG uNumObjects,
        LONG *apIds);

    HRESULT (STDMETHODCALLTYPE *GetObjects)(
        IWbemHiPerfEnum* This,
        LONG lFlags,
        ULONG uNumObjects,
        IWbemObjectAccess **apObj,
        ULONG *puReturned);

    HRESULT (STDMETHODCALLTYPE *RemoveAll)(
        IWbemHiPerfEnum* This,
        LONG lFlags);

    END_INTERFACE
} IWbemHiPerfEnumVtbl;
interface IWbemHiPerfEnum {
    CONST_VTBL IWbemHiPerfEnumVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemHiPerfEnum_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemHiPerfEnum_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemHiPerfEnum_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemHiPerfEnum methods ***/
#define IWbemHiPerfEnum_AddObjects(This,lFlags,uNumObjects,apIds,apObj) (This)->lpVtbl->AddObjects(This,lFlags,uNumObjects,apIds,apObj)
#define IWbemHiPerfEnum_RemoveObjects(This,lFlags,uNumObjects,apIds) (This)->lpVtbl->RemoveObjects(This,lFlags,uNumObjects,apIds)
#define IWbemHiPerfEnum_GetObjects(This,lFlags,uNumObjects,apObj,puReturned) (This)->lpVtbl->GetObjects(This,lFlags,uNumObjects,apObj,puReturned)
#define IWbemHiPerfEnum_RemoveAll(This,lFlags) (This)->lpVtbl->RemoveAll(This,lFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemHiPerfEnum_QueryInterface(IWbemHiPerfEnum* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemHiPerfEnum_AddRef(IWbemHiPerfEnum* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemHiPerfEnum_Release(IWbemHiPerfEnum* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemHiPerfEnum methods ***/
static FORCEINLINE HRESULT IWbemHiPerfEnum_AddObjects(IWbemHiPerfEnum* This,LONG lFlags,ULONG uNumObjects,LONG *apIds,IWbemObjectAccess **apObj) {
    return This->lpVtbl->AddObjects(This,lFlags,uNumObjects,apIds,apObj);
}
static FORCEINLINE HRESULT IWbemHiPerfEnum_RemoveObjects(IWbemHiPerfEnum* This,LONG lFlags,ULONG uNumObjects,LONG *apIds) {
    return This->lpVtbl->RemoveObjects(This,lFlags,uNumObjects,apIds);
}
static FORCEINLINE HRESULT IWbemHiPerfEnum_GetObjects(IWbemHiPerfEnum* This,LONG lFlags,ULONG uNumObjects,IWbemObjectAccess **apObj,ULONG *puReturned) {
    return This->lpVtbl->GetObjects(This,lFlags,uNumObjects,apObj,puReturned);
}
static FORCEINLINE HRESULT IWbemHiPerfEnum_RemoveAll(IWbemHiPerfEnum* This,LONG lFlags) {
    return This->lpVtbl->RemoveAll(This,lFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemHiPerfEnum_AddObjects_Proxy(
    IWbemHiPerfEnum* This,
    LONG lFlags,
    ULONG uNumObjects,
    LONG *apIds,
    IWbemObjectAccess **apObj);
void __RPC_STUB IWbemHiPerfEnum_AddObjects_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemHiPerfEnum_RemoveObjects_Proxy(
    IWbemHiPerfEnum* This,
    LONG lFlags,
    ULONG uNumObjects,
    LONG *apIds);
void __RPC_STUB IWbemHiPerfEnum_RemoveObjects_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemHiPerfEnum_GetObjects_Proxy(
    IWbemHiPerfEnum* This,
    LONG lFlags,
    ULONG uNumObjects,
    IWbemObjectAccess **apObj,
    ULONG *puReturned);
void __RPC_STUB IWbemHiPerfEnum_GetObjects_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemHiPerfEnum_RemoveAll_Proxy(
    IWbemHiPerfEnum* This,
    LONG lFlags);
void __RPC_STUB IWbemHiPerfEnum_RemoveAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemHiPerfEnum_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWbemConfigureRefresher interface
 */
#ifndef __IWbemConfigureRefresher_INTERFACE_DEFINED__
#define __IWbemConfigureRefresher_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWbemConfigureRefresher, 0x49353c92, 0x516b, 0x11d1, 0xae,0xa6, 0x00,0xc0,0x4f,0xb6,0x88,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("49353c92-516b-11d1-aea6-00c04fb68820")
IWbemConfigureRefresher : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddObjectByPath(
        IWbemServices *pNamespace,
        LPCWSTR wszPath,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemClassObject **ppRefreshable,
        LONG *plId) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddObjectByTemplate(
        IWbemServices *pNamespace,
        IWbemClassObject *pTemplate,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemClassObject **ppRefreshable,
        LONG *plId) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddRefresher(
        IWbemRefresher *pRefresher,
        LONG lFlags,
        LONG *plId) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        LONG lId,
        LONG lFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddEnum(
        IWbemServices *pNamespace,
        LPCWSTR wszClassName,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemHiPerfEnum **ppEnum,
        LONG *plId) = 0;

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

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

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

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

    /*** IWbemConfigureRefresher methods ***/
    HRESULT (STDMETHODCALLTYPE *AddObjectByPath)(
        IWbemConfigureRefresher* This,
        IWbemServices *pNamespace,
        LPCWSTR wszPath,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemClassObject **ppRefreshable,
        LONG *plId);

    HRESULT (STDMETHODCALLTYPE *AddObjectByTemplate)(
        IWbemConfigureRefresher* This,
        IWbemServices *pNamespace,
        IWbemClassObject *pTemplate,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemClassObject **ppRefreshable,
        LONG *plId);

    HRESULT (STDMETHODCALLTYPE *AddRefresher)(
        IWbemConfigureRefresher* This,
        IWbemRefresher *pRefresher,
        LONG lFlags,
        LONG *plId);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IWbemConfigureRefresher* This,
        LONG lId,
        LONG lFlags);

    HRESULT (STDMETHODCALLTYPE *AddEnum)(
        IWbemConfigureRefresher* This,
        IWbemServices *pNamespace,
        LPCWSTR wszClassName,
        LONG lFlags,
        IWbemContext *pContext,
        IWbemHiPerfEnum **ppEnum,
        LONG *plId);

    END_INTERFACE
} IWbemConfigureRefresherVtbl;
interface IWbemConfigureRefresher {
    CONST_VTBL IWbemConfigureRefresherVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWbemConfigureRefresher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWbemConfigureRefresher_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWbemConfigureRefresher_Release(This) (This)->lpVtbl->Release(This)
/*** IWbemConfigureRefresher methods ***/
#define IWbemConfigureRefresher_AddObjectByPath(This,pNamespace,wszPath,lFlags,pContext,ppRefreshable,plId) (This)->lpVtbl->AddObjectByPath(This,pNamespace,wszPath,lFlags,pContext,ppRefreshable,plId)
#define IWbemConfigureRefresher_AddObjectByTemplate(This,pNamespace,pTemplate,lFlags,pContext,ppRefreshable,plId) (This)->lpVtbl->AddObjectByTemplate(This,pNamespace,pTemplate,lFlags,pContext,ppRefreshable,plId)
#define IWbemConfigureRefresher_AddRefresher(This,pRefresher,lFlags,plId) (This)->lpVtbl->AddRefresher(This,pRefresher,lFlags,plId)
#define IWbemConfigureRefresher_Remove(This,lId,lFlags) (This)->lpVtbl->Remove(This,lId,lFlags)
#define IWbemConfigureRefresher_AddEnum(This,pNamespace,wszClassName,lFlags,pContext,ppEnum,plId) (This)->lpVtbl->AddEnum(This,pNamespace,wszClassName,lFlags,pContext,ppEnum,plId)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWbemConfigureRefresher_QueryInterface(IWbemConfigureRefresher* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWbemConfigureRefresher_AddRef(IWbemConfigureRefresher* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWbemConfigureRefresher_Release(IWbemConfigureRefresher* This) {
    return This->lpVtbl->Release(This);
}
/*** IWbemConfigureRefresher methods ***/
static FORCEINLINE HRESULT IWbemConfigureRefresher_AddObjectByPath(IWbemConfigureRefresher* This,IWbemServices *pNamespace,LPCWSTR wszPath,LONG lFlags,IWbemContext *pContext,IWbemClassObject **ppRefreshable,LONG *plId) {
    return This->lpVtbl->AddObjectByPath(This,pNamespace,wszPath,lFlags,pContext,ppRefreshable,plId);
}
static FORCEINLINE HRESULT IWbemConfigureRefresher_AddObjectByTemplate(IWbemConfigureRefresher* This,IWbemServices *pNamespace,IWbemClassObject *pTemplate,LONG lFlags,IWbemContext *pContext,IWbemClassObject **ppRefreshable,LONG *plId) {
    return This->lpVtbl->AddObjectByTemplate(This,pNamespace,pTemplate,lFlags,pContext,ppRefreshable,plId);
}
static FORCEINLINE HRESULT IWbemConfigureRefresher_AddRefresher(IWbemConfigureRefresher* This,IWbemRefresher *pRefresher,LONG lFlags,LONG *plId) {
    return This->lpVtbl->AddRefresher(This,pRefresher,lFlags,plId);
}
static FORCEINLINE HRESULT IWbemConfigureRefresher_Remove(IWbemConfigureRefresher* This,LONG lId,LONG lFlags) {
    return This->lpVtbl->Remove(This,lId,lFlags);
}
static FORCEINLINE HRESULT IWbemConfigureRefresher_AddEnum(IWbemConfigureRefresher* This,IWbemServices *pNamespace,LPCWSTR wszClassName,LONG lFlags,IWbemContext *pContext,IWbemHiPerfEnum **ppEnum,LONG *plId) {
    return This->lpVtbl->AddEnum(This,pNamespace,wszClassName,lFlags,pContext,ppEnum,plId);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IWbemConfigureRefresher_AddObjectByPath_Proxy(
    IWbemConfigureRefresher* This,
    IWbemServices *pNamespace,
    LPCWSTR wszPath,
    LONG lFlags,
    IWbemContext *pContext,
    IWbemClassObject **ppRefreshable,
    LONG *plId);
void __RPC_STUB IWbemConfigureRefresher_AddObjectByPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemConfigureRefresher_AddObjectByTemplate_Proxy(
    IWbemConfigureRefresher* This,
    IWbemServices *pNamespace,
    IWbemClassObject *pTemplate,
    LONG lFlags,
    IWbemContext *pContext,
    IWbemClassObject **ppRefreshable,
    LONG *plId);
void __RPC_STUB IWbemConfigureRefresher_AddObjectByTemplate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemConfigureRefresher_AddRefresher_Proxy(
    IWbemConfigureRefresher* This,
    IWbemRefresher *pRefresher,
    LONG lFlags,
    LONG *plId);
void __RPC_STUB IWbemConfigureRefresher_AddRefresher_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemConfigureRefresher_Remove_Proxy(
    IWbemConfigureRefresher* This,
    LONG lId,
    LONG lFlags);
void __RPC_STUB IWbemConfigureRefresher_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IWbemConfigureRefresher_AddEnum_Proxy(
    IWbemConfigureRefresher* This,
    IWbemServices *pNamespace,
    LPCWSTR wszClassName,
    LONG lFlags,
    IWbemContext *pContext,
    IWbemHiPerfEnum **ppEnum,
    LONG *plId);
void __RPC_STUB IWbemConfigureRefresher_AddEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IWbemConfigureRefresher_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 /* __wbemcli_h__ */
