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

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __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;
#ifdef __cplusplus
interface IWbemClassObject;
#endif /* __cplusplus */
#endif

#ifndef __IWbemQualifierSet_FWD_DEFINED__
#define __IWbemQualifierSet_FWD_DEFINED__
typedef interface IWbemQualifierSet IWbemQualifierSet;
#ifdef __cplusplus
interface IWbemQualifierSet;
#endif /* __cplusplus */
#endif

#ifndef __IWbemLocator_FWD_DEFINED__
#define __IWbemLocator_FWD_DEFINED__
typedef interface IWbemLocator IWbemLocator;
#ifdef __cplusplus
interface IWbemLocator;
#endif /* __cplusplus */
#endif

#ifndef __IWbemObjectSink_FWD_DEFINED__
#define __IWbemObjectSink_FWD_DEFINED__
typedef interface IWbemObjectSink IWbemObjectSink;
#ifdef __cplusplus
interface IWbemObjectSink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemObjectSinkEx_FWD_DEFINED__
#define __IWbemObjectSinkEx_FWD_DEFINED__
typedef interface IWbemObjectSinkEx IWbemObjectSinkEx;
#ifdef __cplusplus
interface IWbemObjectSinkEx;
#endif /* __cplusplus */
#endif

#ifndef __IEnumWbemClassObject_FWD_DEFINED__
#define __IEnumWbemClassObject_FWD_DEFINED__
typedef interface IEnumWbemClassObject IEnumWbemClassObject;
#ifdef __cplusplus
interface IEnumWbemClassObject;
#endif /* __cplusplus */
#endif

#ifndef __IWbemContext_FWD_DEFINED__
#define __IWbemContext_FWD_DEFINED__
typedef interface IWbemContext IWbemContext;
#ifdef __cplusplus
interface IWbemContext;
#endif /* __cplusplus */
#endif

#ifndef __IWbemCallResult_FWD_DEFINED__
#define __IWbemCallResult_FWD_DEFINED__
typedef interface IWbemCallResult IWbemCallResult;
#ifdef __cplusplus
interface IWbemCallResult;
#endif /* __cplusplus */
#endif

#ifndef __IWbemServices_FWD_DEFINED__
#define __IWbemServices_FWD_DEFINED__
typedef interface IWbemServices IWbemServices;
#ifdef __cplusplus
interface IWbemServices;
#endif /* __cplusplus */
#endif

#ifndef __IWbemShutdown_FWD_DEFINED__
#define __IWbemShutdown_FWD_DEFINED__
typedef interface IWbemShutdown IWbemShutdown;
#ifdef __cplusplus
interface IWbemShutdown;
#endif /* __cplusplus */
#endif

#ifndef __IWbemObjectTextSrc_FWD_DEFINED__
#define __IWbemObjectTextSrc_FWD_DEFINED__
typedef interface IWbemObjectTextSrc IWbemObjectTextSrc;
#ifdef __cplusplus
interface IWbemObjectTextSrc;
#endif /* __cplusplus */
#endif

#ifndef __IWbemObjectAccess_FWD_DEFINED__
#define __IWbemObjectAccess_FWD_DEFINED__
typedef interface IWbemObjectAccess IWbemObjectAccess;
#ifdef __cplusplus
interface IWbemObjectAccess;
#endif /* __cplusplus */
#endif

#ifndef __IMofCompiler_FWD_DEFINED__
#define __IMofCompiler_FWD_DEFINED__
typedef interface IMofCompiler IMofCompiler;
#ifdef __cplusplus
interface IMofCompiler;
#endif /* __cplusplus */
#endif

#ifndef __IUnsecuredApartment_FWD_DEFINED__
#define __IUnsecuredApartment_FWD_DEFINED__
typedef interface IUnsecuredApartment IUnsecuredApartment;
#ifdef __cplusplus
interface IUnsecuredApartment;
#endif /* __cplusplus */
#endif

#ifndef __IWbemUnsecuredApartment_FWD_DEFINED__
#define __IWbemUnsecuredApartment_FWD_DEFINED__
typedef interface IWbemUnsecuredApartment IWbemUnsecuredApartment;
#ifdef __cplusplus
interface IWbemUnsecuredApartment;
#endif /* __cplusplus */
#endif

#ifndef __IWbemStatusCodeText_FWD_DEFINED__
#define __IWbemStatusCodeText_FWD_DEFINED__
typedef interface IWbemStatusCodeText IWbemStatusCodeText;
#ifdef __cplusplus
interface IWbemStatusCodeText;
#endif /* __cplusplus */
#endif

#ifndef __IWbemBackupRestore_FWD_DEFINED__
#define __IWbemBackupRestore_FWD_DEFINED__
typedef interface IWbemBackupRestore IWbemBackupRestore;
#ifdef __cplusplus
interface IWbemBackupRestore;
#endif /* __cplusplus */
#endif

#ifndef __IWbemBackupRestoreEx_FWD_DEFINED__
#define __IWbemBackupRestoreEx_FWD_DEFINED__
typedef interface IWbemBackupRestoreEx IWbemBackupRestoreEx;
#ifdef __cplusplus
interface IWbemBackupRestoreEx;
#endif /* __cplusplus */
#endif

#ifndef __IWbemRefresher_FWD_DEFINED__
#define __IWbemRefresher_FWD_DEFINED__
typedef interface IWbemRefresher IWbemRefresher;
#ifdef __cplusplus
interface IWbemRefresher;
#endif /* __cplusplus */
#endif

#ifndef __IWbemHiPerfEnum_FWD_DEFINED__
#define __IWbemHiPerfEnum_FWD_DEFINED__
typedef interface IWbemHiPerfEnum IWbemHiPerfEnum;
#ifdef __cplusplus
interface IWbemHiPerfEnum;
#endif /* __cplusplus */
#endif

#ifndef __IWbemConfigureRefresher_FWD_DEFINED__
#define __IWbemConfigureRefresher_FWD_DEFINED__
typedef interface IWbemConfigureRefresher IWbemConfigureRefresher;
#ifdef __cplusplus
interface IWbemConfigureRefresher;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IEnumWbemClassObject;
#endif /* __cplusplus */
#endif

#ifndef __IUnsecuredApartment_FWD_DEFINED__
#define __IUnsecuredApartment_FWD_DEFINED__
typedef interface IUnsecuredApartment IUnsecuredApartment;
#ifdef __cplusplus
interface IUnsecuredApartment;
#endif /* __cplusplus */
#endif

#ifndef __IWbemBackupRestore_FWD_DEFINED__
#define __IWbemBackupRestore_FWD_DEFINED__
typedef interface IWbemBackupRestore IWbemBackupRestore;
#ifdef __cplusplus
interface IWbemBackupRestore;
#endif /* __cplusplus */
#endif

#ifndef __IWbemBackupRestoreEx_FWD_DEFINED__
#define __IWbemBackupRestoreEx_FWD_DEFINED__
typedef interface IWbemBackupRestoreEx IWbemBackupRestoreEx;
#ifdef __cplusplus
interface IWbemBackupRestoreEx;
#endif /* __cplusplus */
#endif

#ifndef __IWbemCallResult_FWD_DEFINED__
#define __IWbemCallResult_FWD_DEFINED__
typedef interface IWbemCallResult IWbemCallResult;
#ifdef __cplusplus
interface IWbemCallResult;
#endif /* __cplusplus */
#endif

#ifndef __IWbemClassObject_FWD_DEFINED__
#define __IWbemClassObject_FWD_DEFINED__
typedef interface IWbemClassObject IWbemClassObject;
#ifdef __cplusplus
interface IWbemClassObject;
#endif /* __cplusplus */
#endif

#ifndef __IWbemConfigureRefresher_FWD_DEFINED__
#define __IWbemConfigureRefresher_FWD_DEFINED__
typedef interface IWbemConfigureRefresher IWbemConfigureRefresher;
#ifdef __cplusplus
interface IWbemConfigureRefresher;
#endif /* __cplusplus */
#endif

#ifndef __IWbemConnection_FWD_DEFINED__
#define __IWbemConnection_FWD_DEFINED__
typedef interface IWbemConnection IWbemConnection;
#ifdef __cplusplus
interface IWbemConnection;
#endif /* __cplusplus */
#endif

#ifndef __IWbemContext_FWD_DEFINED__
#define __IWbemContext_FWD_DEFINED__
typedef interface IWbemContext IWbemContext;
#ifdef __cplusplus
interface IWbemContext;
#endif /* __cplusplus */
#endif

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

#ifndef __IWbemHiPerfEnum_FWD_DEFINED__
#define __IWbemHiPerfEnum_FWD_DEFINED__
typedef interface IWbemHiPerfEnum IWbemHiPerfEnum;
#ifdef __cplusplus
interface IWbemHiPerfEnum;
#endif /* __cplusplus */
#endif

#ifndef __IWbemLocator_FWD_DEFINED__
#define __IWbemLocator_FWD_DEFINED__
typedef interface IWbemLocator IWbemLocator;
#ifdef __cplusplus
interface IWbemLocator;
#endif /* __cplusplus */
#endif

#ifndef __IWbemObjectAccess_FWD_DEFINED__
#define __IWbemObjectAccess_FWD_DEFINED__
typedef interface IWbemObjectAccess IWbemObjectAccess;
#ifdef __cplusplus
interface IWbemObjectAccess;
#endif /* __cplusplus */
#endif

#ifndef __IWbemObjectSink_FWD_DEFINED__
#define __IWbemObjectSink_FWD_DEFINED__
typedef interface IWbemObjectSink IWbemObjectSink;
#ifdef __cplusplus
interface IWbemObjectSink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemQualifierSet_FWD_DEFINED__
#define __IWbemQualifierSet_FWD_DEFINED__
typedef interface IWbemQualifierSet IWbemQualifierSet;
#ifdef __cplusplus
interface IWbemQualifierSet;
#endif /* __cplusplus */
#endif

#ifndef __IWbemRefresher_FWD_DEFINED__
#define __IWbemRefresher_FWD_DEFINED__
typedef interface IWbemRefresher IWbemRefresher;
#ifdef __cplusplus
interface IWbemRefresher;
#endif /* __cplusplus */
#endif

#ifndef __IWbemSecureObjectSink_FWD_DEFINED__
#define __IWbemSecureObjectSink_FWD_DEFINED__
typedef interface IWbemSecureObjectSink IWbemSecureObjectSink;
#ifdef __cplusplus
interface IWbemSecureObjectSink;
#endif /* __cplusplus */
#endif

#ifndef __IWbemServices_FWD_DEFINED__
#define __IWbemServices_FWD_DEFINED__
typedef interface IWbemServices IWbemServices;
#ifdef __cplusplus
interface IWbemServices;
#endif /* __cplusplus */
#endif

#ifndef __IWbemStatusCodeText_FWD_DEFINED__
#define __IWbemStatusCodeText_FWD_DEFINED__
typedef interface IWbemStatusCodeText IWbemStatusCodeText;
#ifdef __cplusplus
interface IWbemStatusCodeText;
#endif /* __cplusplus */
#endif

#ifndef __IWbemUnsecuredApartment_FWD_DEFINED__
#define __IWbemUnsecuredApartment_FWD_DEFINED__
typedef interface IWbemUnsecuredApartment IWbemUnsecuredApartment;
#ifdef __cplusplus
interface IWbemUnsecuredApartment;
#endif /* __cplusplus */
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __WbemClient_v1_LIBRARY_DEFINED__
#define __WbemClient_v1_LIBRARY_DEFINED__

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

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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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


#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__ */
