
/*++

Copyright (C) 1996-2001 Microsoft Corporation

Module Name:

    WBEMINT.IDL

Abstract:

    WMI Core Internal Interfaces

History:

--*/

import "objidl.idl";
import "oleidl.idl";
import "oaidl.idl";

import "wmiutils.idl";
import "wbemtran.idl";
import "wbemcli.idl";
import "wbemprov.idl";

typedef VARIANT WBEM_VARIANT;
typedef [string] WCHAR* WBEM_WSTR;
typedef [string] const WCHAR* WBEM_CWSTR;

#define OPTIONAL in, unique

//==============================================================================
//
//  IWbemPropertySource
//
//  Makes the object look like a property set to enable condition testing
//  (see IWbemCondition below).  It is useful when a provider wants to test a
//  a condition without the expense of constructing IWbemClassObject.
//
//  Used: by WBEMOM inside standard IWbemCondition implementation
//  Implemented: by providers who wish to check if their objects satisfy a
//      condition without constructing IWbemClassObjects.
//
//==============================================================================
//
//  GetPropertyValue
//
//  Retrieves the value of a property by name.  In the case where embedded
//  objects may be present, the name can be a complex one, e.g.
//  "OldVersion.Manufacturer".
//
//  PARAMETERS:
//
//      WCHAR wszPropertyName   The name of the property to retrieve
//      long lFlags             Reserved. For future compatibility, use 0.
//      WBEM_VARIANT* pvValue    Destination for the value of the property. The
//                              caller must VariantClear it on success.
//  RETURNS:
//
//      WBEM_S_NO_ERROR              On Success
//      WBEM_E_NOT_FOUND             No such property
//      WBEM_E_NOT_AVAILABLE         The value is not available. Condition
//                                  evaluators should attempt to evaluate the
//                                  condition without it.
//      WBEM_E_FAILED                Other critical error.
//
//==============================================================================


interface _IWmiCoreHandle;
interface _IWmiObject;

typedef [v1_enum] enum tag_WBEM_GENERIC_FLAG_TYPE_INT
{
  WBEM_FLAG_USE_SECURITY_DESCRIPTOR = 0x40000
} WBEM_GENERIC_FLAG_TYPE_INT;

typedef [v1_enum] enum tag_CIMTYPE_ENUMERATION_INT
{
  CIM_IUNKNOWN = 104
} CIMTYPE_ENUMERATION_INT;

typedef enum
{
	WBEM_NAME_ELEMENT_TYPE_PROPERTY = 0,
	WBEM_NAME_ELEMENT_TYPE_INDEX = 1
} WBEM_NAME_ELEMENT_TYPE;

typedef enum
{
	WBEM_CONN_TYPE_ADMINISTRATIVE = 1,       // Always conncts, doesnt add to client count
	WBEM_CONN_TYPE_UNAUTHENTICATED = 2,      // User is check for access, doesnt add to client list
} WBEM_CONNECTION_TYPE;

typedef [v1_enum] enum tag_WBEM_GET_SYSTEM_OBJECTS_FLAG
{
      GET_SYSTEM_STD_OBJECTS           = 0x1,   // the normal list of std classes
      GET_SYSTEM_SECURITY_OBJECTS      = 0x2,   // old root\security namespace classes
      GET_SYSTEM_ROOT_OBJECTS          = 0x4,   // root specific objects
      GET_SYSTEM_STD_INSTANCES         = 0x8,   // __systemSecurity and __thisnamespace
} tag_WBEM_GET_SYSTEM_OBJECTS_FLAG;

typedef [switch_type(short)] union tag_NameElementUnion
{
	[case(WBEM_NAME_ELEMENT_TYPE_PROPERTY)] WBEM_WSTR m_wszPropertyName;
	[case(WBEM_NAME_ELEMENT_TYPE_INDEX)] long m_lArrayIndex;
} WBEM_NAME_ELEMENT_UNION;

typedef struct tag_NameElement
{
	short m_nType;
	[switch_is(m_nType)] WBEM_NAME_ELEMENT_UNION Element;
} WBEM_NAME_ELEMENT;

typedef struct _tag_WbemPropertyName
{
    long m_lNumElements;
    [size_is(m_lNumElements)] WBEM_NAME_ELEMENT* m_aElements;
} WBEM_PROPERTY_NAME;

[restricted, object, uuid(e2451054-b06e-11d0-ad61-00c04fd8fdff)]
interface IWbemPropertySource : IUnknown
{
    HRESULT GetPropertyValue(
                [in] WBEM_PROPERTY_NAME* pName,
                [in] long lFlags,
                [in, unique, out] WBEM_WSTR* pwszCimType,
                [out] WBEM_VARIANT* pvValue);
	HRESULT InheritsFrom([in] WBEM_CWSTR wszClassName);
};

//==============================================================================
//
//  QL operators
//
//==============================================================================


typedef enum _tag_Ql1ComparisonOperator
{
	QL1_OPERATOR_NONE = 0,
    QL1_OPERATOR_EQUALS = 1,
	QL1_OPERATOR_NOTEQUALS,
    QL1_OPERATOR_GREATER,
	QL1_OPERATOR_LESS,
	QL1_OPERATOR_LESSOREQUALS,
	QL1_OPERATOR_GREATEROREQUALS,
	QL1_OPERATOR_LIKE,
	QL1_OPERATOR_UNLIKE,
    QL1_OPERATOR_ISA,
	QL1_OPERATOR_ISNOTA,
    QL1_OPERATOR_INV_ISA,
	QL1_OPERATOR_INV_ISNOTA,
} WBEM_QL1_COMPARISON_OPERATOR;

typedef enum _tag_Ql1Function
{
	QL1_FUNCTION_NONE = 0,
	QL1_FUNCTION_UPPER,
	QL1_FUNCTION_LOWER
} WBEM_QL1_FUNCTION;

typedef enum _tag_Ql1TokenType
{
	QL1_NONE = 0,
	QL1_OR = 1,
	QL1_AND,
	QL1_NOT,
	QL1_OP_EXPRESSION
} WBEM_QL1_TOKEN_TYPE;
					
typedef struct _tag_WbemQl1Token
{
	long m_lTokenType;        // WbemSql1TokenType

    WBEM_PROPERTY_NAME m_PropertyName;
    WBEM_PROPERTY_NAME m_PropertyName2;
    long m_lOperator;	      // WbemSql1ComparisonOperator
    WBEM_VARIANT m_vConstValue;
	long m_lPropertyFunction; // WbemSql1Function
	long m_lConstFunction;	  // WbemSql1Function
    long m_bQuoted;
    long m_bPropComp;
} WBEM_QL1_TOKEN;

typedef struct _tag_WbemQl1Tolerance
{
    boolean m_bExact;
    double m_fTolerance;
} WBEM_QL1_TOLERANCE;

typedef enum tag_WBEM_EVENT_TYPE{
    WBEM_EVENTTYPE_Invalid = 0,
    WBEM_EVENTTYPE_Extrinsic = 5,
    WBEM_EVENTTYPE_Timer,
    WBEM_EVENTTYPE_NamespaceCreation,
    WBEM_EVENTTYPE_NamespaceDeletion,
    WBEM_EVENTTYPE_NamespaceModification,
    WBEM_EVENTTYPE_ClassCreation,
    WBEM_EVENTTYPE_ClassDeletion,
    WBEM_EVENTTYPE_ClassModification,
    WBEM_EVENTTYPE_InstanceCreation,
    WBEM_EVENTTYPE_InstanceDeletion,
    WBEM_EVENTTYPE_InstanceModification,
    WBEM_EVENTTYPE_System
} WBEM_EVENT_TYPE;

typedef enum tag_WBEM_HOOK_FLAGS
{	
	WBEM_FLAG_INST_PUT     = 1 ,
	WBEM_FLAG_INST_DELETE  = 2 ,
	WBEM_FLAG_CLASS_PUT    = 4 ,
	WBEM_FLAG_CLASS_DELETE = 8

} WBEM_HOOK_FLAGS ;

typedef [v1_enum] enum tag_WMI_THREAD_SECURITY_ORIGIN
{
	WMI_ORIGIN_UNDEFINED	= 0x0,
	WMI_ORIGIN_RPC			= 0x1,		// Obtain token from RPC server security
    WMI_ORIGIN_THREAD		= 0x2,		// Obtain token from thread/process
    WMI_ORIGIN_EXISTING		= 0x4		// Obtain token from existing internal server security

} WMI_THREAD_SECURITY_ORIGIN ;

typedef [v1_enum] enum tag_WMI_CORE_HANDLE
{
    WMI_HANDLE_TASK				= 0x1,
    WMI_HANDLE_USER				= 0x2,
    WMI_HANDLE_THREAD_SECURITY 	= 0x3

}   WMI_CORE_HANDLE ;

typedef enum tag_WMI_TASK_TYPE
{
    WMICORE_TASK_NULL = 0,

    WMICORE_TASK_GET_OBJECT         = 1,
    WMICORE_TASK_GET_INSTANCE       = 2,
    WMICORE_TASK_PUT_INSTANCE       = 3,
    WMICORE_TASK_DELETE_INSTANCE    = 4,
    WMICORE_TASK_ENUM_INSTANCES     = 5,

    WMICORE_TASK_GET_CLASS          = 6,
    WMICORE_TASK_PUT_CLASS          = 7,
    WMICORE_TASK_DELETE_CLASS       = 8,
    WMICORE_TASK_ENUM_CLASSES       = 9,

    WMICORE_TASK_EXEC_QUERY                 = 10,
    WMICORE_TASK_EXEC_METHOD                = 11,

    WMICORE_TASK_OPEN                       = 12,
    WMICORE_TASK_OPEN_SCOPE                 = 13,
    WMICORE_TASK_OPEN_NAMESPACE             = 14,
    WMICORE_TASK_OPEN_COLLECTION            = 15,

    WMICORE_TASK_ADD                        = 16,
    WMICORE_TASK_REMOVE                     = 17,
    WMICORE_TASK_REFRESH_OBJECT             = 18,
    WMICORE_TASK_RENAME_OBJECT              = 19,

    WMICORE_TASK_ATOMIC_DYN_INST_GET        = 20,
    WMICORE_TASK_ATOMIC_DYN_INST_ENUM       = 21,
    WMICORE_TASK_ATOMIC_DYN_INST_QUERY      = 22,
    WMICORE_TASK_ATOMIC_DYN_INST_PUT        = 23,

    WMICORE_TASK_DYN_CLASS_ENUM             = 24,

    WMICORE_TASK_EXEC_NOTIFICATION_QUERY    = 25,

    // Bit mask ORed with above values.
    // ================================

    WMICORE_TASK_TYPE_SYNC              = 0x01000000,
    WMICORE_TASK_TYPE_SEMISYNC          = 0x02000000,
    WMICORE_TASK_TYPE_ASYNC             = 0x04000000,

    WMICORE_TASK_TYPE_PRIMARY           = 0x10000000,
    WMICORE_TASK_TYPE_SUBTASK           = 0x20000000,
    WMICORE_TASK_TYPE_DEPENDENT         = 0x40000000

}   WMI_TASK_TYPE;


typedef enum tag_WMICORE_TASK_STATUS
{
    WMICORE_TASK_STATUS_NEW = 1,            // Uncommitted
    WMICORE_TASK_STATUS_VALIDATED,          // Added to task list
    WMICORE_TASK_STATUS_SUSPENDED,          // Asleep
    WMICORE_TASK_STATUS_EXECUTING,              // Busy
    WMICORE_TASK_STATUS_WAITING_ON_SUBTASKS,    // Waiting for subtasks
    WMICORE_TASK_STATUS_TIMED_OUT,              // Failed
    WMICORE_TASK_STATUS_CORE_COMPLETED,              // Successful
    WMICORE_TASK_STATUS_CLIENT_COMPLETED,

    WMICORE_TASK_STATUS_CANCELLED,          // Cancelled
    WMICORE_TASK_STATUS_FAILED              // Failed with error

}   WMICORE_TASK_STATUS;


typedef [v1_enum] enum tag_WBEM_NOTIFICATION_FLAG_TYPE
{
    WBEM_FLAG_MONITOR = 0x800
} WBEM_NOTIFICATION_FLAG_TYPE;


    typedef [v1_enum] enum tag_WBEM_CONNECT
    {
        WBEM_FLAG_CREDENTIALS_SPECIFIED         = 0x1,
        WBEM_FLAG_CONNECT_SETUP_MODE            = 0x2,
        WBEM_FLAG_CONNECT_CIM_COMPLIANCE_MODE   = 0x4,

        WBEM_FLAG_OPEN_COLLECTION               = 0x10,
        WBEM_FLAG_OPEN_SCOPE                    = 0x20,
        WBEM_FLAG_OPEN_NESTED_ONLY              = 0x40,
        WBEM_FLAG_OPEN_NAMESPACE                = 0x80,
        WBEM_FLAG_OPEN_VECTOR                   = 0x100,
        WBEM_FLAG_OPEN_ALLOW_NS_TRAVERSAL       = 0x200,
        WBEM_FLAG_OPEN_ALLOW_MACHINE_TRAVERSAL  = 0x400,

    } WBEM_CONNECT_FLAG_TYPE;

    typedef [v1_enum] enum tag_WBEM_GET_FLAGS
    {
        WBEM_FLAG_GET_DEFAULT = 0x0,
        WBEM_FLAG_SPAWN_INSTANCE = 0x1
    }   WBEM_GET_FLAGS;

    typedef [v1_enum] enum tag_WBEM_PUT_FLAGS
    {
        WBEM_FLAG_USE_CURRENT_TIME = 0x1,
    }   WBEM_PUT_FLAGS;


    typedef [v1_enum] enum tag_WBEM_PUTEX_FLAGS
    {
        WBEM_FLAG_PUTEX_APPEND = 0x0,
        WBEM_FLAG_PUTEX_INSERTAT = 0x1,

		WBEM_MASK_PUTEX_OPERATION = 0x1
    }   WBEM_PUTEX_FLAGS;

    typedef [v1_enum] enum tag_WBEM_DELETEEX_FLAGS
    {
        WBEM_FLAG_PUTEX_DELETE = 0x0,
        WBEM_FLAG_PUTEX_DELETE_FIRST_MATCH = 0x1,
		WBEM_FLAG_DELETE_ALL_MATCHES = 0x2,

		WBEM_MASK_DELETEEX_OPERATION = 0x2
    }   WBEM_DELETEEX_FLAGS;

    typedef [v1_enum] enum tag_WBEM_MULTI_FLAG
    {
        WBEM_MULTI_FLAG_NO_OP          = 0x0,
        WBEM_MULTI_FLAG_ARRAY_ALL      = 0x1,
        WBEM_MULTI_FLAG_ARRAY_SUBRANGE = 0x2
    }   WBEM_MULTI_FLAG;



typedef [v1_enum] enum tag_WBEMINTERNALSTATUS
{

    // Non-error status codes.
    // ~~~~~~~~~~~~~~~~~~~~~~

	WBEM_S_ARB_NOTHROTTLING	= 0x41000,


	// Errors.
    // ~~~~~~~
	WBEM_E_ARB_THROTTLE					= 0x80043001,
	WBEM_E_ARB_CANCEL					= 0x80043002,
	WBEM_E_CALL_CANCELLED_CLIENT		= 0x80043003


} WBEMINTERNALSTATUS;


typedef struct _tag_WmiInternalContext
{
    unsigned __int64 m_IdentifyHandle ;
	unsigned long m_ProcessIdentifier ;

} WmiInternalContext ;


[object, restricted, uuid(c1e2d758-cabd-11d3-a11b-00105a1f515a)]

interface IWbemCallResultEx : IWbemCallResult
{
    HRESULT GetResult(
        [in] long lTimeout,
        [in] long lFlags,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvResult
        );
};

[object, restricted, uuid(dd0be256-50dc-48a8-9866-b559f279d0f6)]

interface IWbemObjectSinkEx : IWbemObjectSink
{
    HRESULT Set(
        [in] long lFlags,
        [in] REFIID riid,
        [in, iid_is(riid)] void *pComObject
        );
};


[object, local, uuid(180d6598-e042-4b71-b0a2-6e2d16daf293)]
interface IWbemConnection : IUnknown
{
    HRESULT Open(
        [in]  const BSTR strObject,
        [in]  const BSTR strUser,
        [in]  const BSTR strPassword,
        [in]  const BSTR strLocale,
        [in]  long lFlags,
        [in]  IWbemContext *pCtx,
        [in]  REFIID riid,
        [out, iid_is(riid)] void **pInterface,
        [out] IWbemCallResultEx **pCallRes
        );

    HRESULT OpenAsync(
        [in]  const BSTR strObject,
        [in]  const BSTR strUser,
        [in]  const BSTR strPassword,
        [in]  const BSTR strLocale,
        [in]  long lFlags,
        [in]  IWbemContext *pCtx,
        [in]  REFIID riid,
        [in]  IWbemObjectSinkEx *pResponseHandler
        );

    HRESULT Cancel(
        [in] long lFlags,
        [in] IWbemObjectSinkEx *pHandler
        );

};


[object, restricted, local, uuid(0E130F89-81D9-4386-B3BE-092651D04588)]

interface IWbemClassObjectEx : IUnknown
{
	HRESULT PutEx(
		[in]  LPCWSTR wszName,
		[in]  long lFlags,
		[in]  VARIANT* pvFilter,
		[in]  VARIANT* pvInVals
		);

	HRESULT DeleteEx(
		[in]  LPCWSTR wszName,
		[in]  long lFlags,
		[in]  VARIANT* pvFilter,
		[in]  VARIANT* pvInVals
		);

    HRESULT GetEx(
		[in]  LPCWSTR wszName,
		[in]  long lFlags,
		[in]  VARIANT* pvFilter,
		[in]  VARIANT* pvInVals,
		[out,OPTIONAL]  CIMTYPE* pCimType,
		[out,OPTIONAL]  long* plFlavor
		);
};

[object, restricted, uuid(6D54E7AD-7583-4d53-BC14-CE2678F73DB3), pointer_default(unique)]

interface IWbemServicesEx : IWbemServices
{
    // Opening namespaces, scopes, collections
    // =======================================

    HRESULT Open(
        [in]  const BSTR strScope,
        [in]  const BSTR strSelector,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemServicesEx** ppScope,
        [out, OPTIONAL] IWbemCallResultEx** ppResult
        );

    HRESULT OpenAsync(
        [in]  const BSTR strScope,
        [in]  const BSTR strSelector,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [in]  IWbemObjectSinkEx *pResponseHandler
        );

    // Association linking/unlinking
    // =============================

    HRESULT Add(
        [in]  const BSTR strObjectPath,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResultEx** ppCallResult
        );

    HRESULT AddAsync(
        [in]  const BSTR strObjectPath,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [in]  IWbemObjectSink* pResponseHandler
        );

    HRESULT Remove(
        [in]  const BSTR strObjectPath,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResultEx** ppCallResult
        );

    HRESULT RemoveAsync(
        [in]  const BSTR strObjectPath,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [in]  IWbemObjectSink* pResponseHandler
        );


    // Refresh, rename
    // ===============

    HRESULT RefreshObject(
        [in, out]   IWbemClassObject **pTarget,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResultEx** ppCallResult
        );

    HRESULT RefreshObjectAsync(
        [in, out]  IWbemClassObject **pTarget,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [in]  IWbemObjectSinkEx* pResponseHandler
        );

    HRESULT RenameObject(
        [in]  const BSTR strOldObjectPath,
        [in]  const BSTR strNewObjectPath,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResultEx** ppCallResult
        );

    HRESULT RenameObjectAsync(
        [in]  const BSTR strOldObjectPath,
        [in]  const BSTR strNewObjectPath,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [in]  IWbemObjectSink* pResponseHandler
        );

    HRESULT DeleteObject(
        [in] const BSTR strObjectPath,
        [in] long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResult** ppCallResult
        );

    HRESULT DeleteObjectAsync(
        [in] const BSTR strObjectPath,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );

    HRESULT PutObject(
        [in] IWbemClassObject* pObj,
        [in] long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResult** ppCallResult
        );

    HRESULT PutObjectAsync(
        [in] IWbemClassObject* pObj,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );
};

midl_pragma warning ( default : 2456 )

[object, restricted, local, uuid(B4AF2F3C-5FE3-405e-8A9F-D275E3079F6D), pointer_default(unique)]
interface IWbemInitComBinding : IUnknown
{
    HRESULT Initialize(
        [in]  ULONG ulFlags,
        [in]  IWbemServicesEx *pSvcEx,
        [in]  IWbemContext *pCtx,
        [in]  IWbemClassObject *pObject
        );
}

[object, restricted, local, uuid(974CAB5F-D7FD-4c52-958F-E3D94D6CB505), pointer_default(unique)]
interface IWbemComBinding : IUnknown
{
	// Returns all matching CLSIDs for requested IID as array of BSTRs
    HRESULT GetCLSIDArrayForIID(
        [in] IWbemServicesEx*pSvcEx,
        [in] IWbemClassObject* pObject,
        [in] REFIID riid,
        [in] long lFlags,
		[in] IWbemContext* pCtx,
        [out] SAFEARRAY(BSTR) *pArray
        );

	// Gets the requested object and creates the supplied CLSID, requesting
	// the specified interface, and returning that in pObj
    HRESULT BindComObject(
        [in] IWbemServicesEx *pSvcEx,
        [in] IWbemClassObject* pObject,
        [in] CLSID ClsId,
        [in] IWbemContext *pCtx,
        [in] long lFlags,
		[in] IUnknown *pUnkOuter,
		[in] DWORD dwClsCntxt,
        [in] REFIID riid,
        [out, iid_is(riid)] LPVOID *pInterface
        );

    // Provides DISPIDs for Names and the CLSID for the object that supports them
	// Returned as a SAFEARRAY of IUnknowns.
    HRESULT GetCLSIDArrayForNames(
        [in] IWbemServicesEx *pSvcEx,
        [in] IWbemClassObject* pObject,
        [in, size_is(cNames)] LPCWSTR * rgszNames,
        [in] UINT cNames,
        [in] LCID lcid,
		[in] IWbemContext* pCtx,
		[in] long lFlags,
        [out] SAFEARRAY(IUnknown*) *pArray
        );

};






//==============================================================================
//==============================================================================
//
//                      Event-provider specific interfaces.
//
//==============================================================================
//==============================================================================

[restricted, object, local, uuid(a658b5d6-021d-11d1-ad74-00c04fd8fdff)]
interface IWbemDecorator : IUnknown
{
    HRESULT DecorateObject([in] IWbemClassObject* pObject,
                            WBEM_CWSTR wszNamespace);
    HRESULT UndecorateObject([in] IWbemClassObject* pObject);
};

[restricted, object, local, uuid(a658b6d6-021d-11d1-ad74-00c04fd8fdff)]
interface IWbemLifeControl : IUnknown
{
    HRESULT AddRefCore();
    HRESULT ReleaseCore();
};

[restricted, object, uuid(a553f3f0-3805-11d0-b6b2-00aa003240c7)]
interface IWbemEventSubsystem_m4 : IUnknown
{
    HRESULT ProcessInternalEvent(
        [in] LONG lSendType,
        [in] LPCWSTR strReserved1,
        [in] LPCWSTR strReserved2,
        [in] LPCWSTR strGuidParam,
        [in] unsigned long dwReserved1,
        [in] unsigned long dwReserved2,
        [in] unsigned long dwNumObjects,
        [in, size_is(dwNumObjects)] _IWmiObject** apObjects,
        [in] IWbemContext* pContext
    );

    HRESULT VerifyInternalEvent(
        [in] LONG lSendType,
        [in] LPCWSTR strReserved1,
        [in] LPCWSTR strReserved2,
        [in] LPCWSTR strReserved3,
        [in] unsigned long dwReserved1,
        [in] unsigned long dwReserved2,
        [in] unsigned long dwNumObjects,
        [in, size_is(dwNumObjects)] _IWmiObject** apObjects,
        [in] IWbemContext* pContext
    );

    HRESULT RegisterNotificationSink(
        [in] LPCWSTR wszNamespace,
        [in] LPCWSTR wszQueryLanguage,
        [in] LPCWSTR wszQuery,
        [in] long lFlags,
        [in] IWbemContext* pContext,
        [in] IWbemObjectSink* pSink
        );

    HRESULT RemoveNotificationSink(
        [in] IWbemObjectSink* pSink);

    HRESULT GetNamespaceSink(
        [in] LPCWSTR wszNamespace,
        [out] IWbemObjectSink** ppNamespaceSink
        );

    HRESULT Initialize(
        [in] LPCWSTR wszServerName,
        [in] IWbemLocator* pAdminLocator,
        [in] IUnknown* pServices)
        ;

    HRESULT Shutdown();
    HRESULT LastCallForCore([in] LONG lSystemShutDown);
};


[object, restricted, uuid(6c19be32-7500-11d1-ad94-00c04fd8fdff)]
interface IWbemMetaData : IUnknown
{
    HRESULT GetClass(
        [in, string] LPCWSTR wszClassName,
        [in] IWbemContext* pContext,
        [out] IWbemClassObject** ppClass);
};

typedef DWORD WBEM_REMOTE_TARGET_ID_TYPE;

typedef struct tag_WBEM_REM_TARGETS
{
    long m_lNumTargets;
    [size_is(m_lNumTargets)] WBEM_REMOTE_TARGET_ID_TYPE* m_aTargets;
} WBEM_REM_TARGETS;

[object, restricted, uuid(755f9da6-7508-11d1-ad94-00c04fd8fdff)]
interface IWbemMultiTarget : IUnknown
{
    HRESULT DeliverEvent(
        [in] ULONG dwNumEvents,
        [in, size_is(dwNumEvents)] IWbemClassObject** aEvents,
        [in, size_is(dwNumEvents)] WBEM_REM_TARGETS* aTargets,
        [in] long lSDLength,
        [in, size_is(lSDLength)] BYTE* pSD);

    HRESULT DeliverStatus(
        [in] long lFlags,
        [in] HRESULT hresStatus,
        [in, string] LPCWSTR wszStatus,
        [in] IWbemClassObject* pErrorObj,
        [in] WBEM_REM_TARGETS* pTargets,
        [in] long lSDLength,
        [in, size_is(lSDLength)] BYTE* pSD);
};

[object, restricted, uuid(755f9da7-7508-11d1-ad94-00c04fd8fdff)]
interface IWbemEventProviderRequirements : IUnknown
{
    HRESULT DeliverProviderRequest(
        [in] long lFlags);
};

// Smart MultiTarget Interface for removal of redundant
// class data

[object, restricted, uuid(37196B38-CCCF-11d2-B35C-00105A1F8177)]
interface IWbemSmartMultiTarget : IUnknown
{
    HRESULT DeliverEvent(
        [in] ULONG dwNumEvents,
        [in] ULONG dwBuffSize,
		[in, size_is(dwBuffSize)] byte* pBuffer,
        [in, size_is(dwNumEvents)] WBEM_REM_TARGETS* pTargets,
        [in] long lSDLength,
        [in, size_is(lSDLength)] BYTE* pSD);

};

//
//	IWbemFetchSmartMultiTarget
//
//	This Interface is used to return a smart multi-target.  It assists
//	us when we need to get an enumerator but want to do so without
//	causing AddRef problem with the Proxy Manager.
//

[restricted, object, uuid(37196B39-CCCF-11d2-B35C-00105A1F8177)]
interface IWbemFetchSmartMultiTarget : IUnknown
{
	HRESULT GetSmartMultiTarget(
	[out] IWbemSmartMultiTarget** ppSmartMultiTarget
	);
};


/* NO LONGER SUPPORTED AS OF M3

typedef enum tag_WBEM_FILTER_TARGET_TYPE
{
    WBEM_FILTER_TARGET_TYPE_NONE,
    WBEM_FILTER_TARGET_TYPE_INTERNAL,
    WBEM_FILTER_TARGET_TYPE_MARSHALLED,
    WBEM_FILTER_TARGET_TYPE_LOADABLE,
} WBEM_FILTER_TARGET_TYPE;

typedef struct tag_WBEM_FILTER_TARGET_LOAD_INFO
{
    CLSID m_clsidConsumerProvider;
    IWbemClassObject* m_pLogicalConsumer;
    IWbemUnboundObjectSink* m_pCached;
} WBEM_FILTER_TARGET_LOAD_INFO;

typedef struct tag_WBEM_FILTER_TARGET_MARSHALLED_INFO
{
    IWbemUnboundObjectSink* m_pSink;
    IWbemClassObject* m_pLogicalConsumer;
} WBEM_FILTER_TARGET_MARSHALLED_INFO;


typedef [switch_type(long)] union tag_WBEM_FILTER_TARGET_DATA
{
    [case(WBEM_FILTER_TARGET_TYPE_INTERNAL)]
        WBEM_REMOTE_TARGET_ID_TYPE m_ID;

    [case(WBEM_FILTER_TARGET_TYPE_MARSHALLED)]
        WBEM_FILTER_TARGET_MARSHALLED_INFO m_MarshInfo;

    [case(WBEM_FILTER_TARGET_TYPE_LOADABLE)]
        WBEM_FILTER_TARGET_LOAD_INFO m_LoadInfo;

    [default]
        ;
} WBEM_FILTER_TARGET_DATA;

typedef struct tag_WBEM_FILTER_TARGET
{
    long m_lType;
    [switch_is(m_lType)] WBEM_FILTER_TARGET_DATA m_Data;
    boolean m_bSynch;
} WBEM_FILTER_TARGET;

typedef struct tag_WBEM_FILTER_TARGETS
{
    long m_lNumTargets;
    [size_is(m_lNumTargets)] WBEM_FILTER_TARGET* m_aTargets;
} WBEM_FILTER_TARGETS;
*/

[object, restricted, uuid(60e512d4-c47b-11d2-b338-00105a1f4aaf)]
interface IWbemFilterProxy : IUnknown
{
    HRESULT Initialize(
        [in] IWbemMetaData* pMetaData,
        [in] IWbemMultiTarget* pMultiTarget);

    HRESULT Lock();

    HRESULT Unlock();

    HRESULT AddFilter(
        [in] IWbemContext* pContext,
        [in, string] LPCWSTR wszQuery,
        [in] WBEM_REMOTE_TARGET_ID_TYPE Id);

    HRESULT RemoveFilter(
        [in] IWbemContext* pContext,
        [in] WBEM_REMOTE_TARGET_ID_TYPE Id);

    HRESULT RemoveAllFilters(
        [in] IWbemContext* pContext);

    HRESULT AddDefinitionQuery(
        [in] IWbemContext* pContext,
        [in] LPCWSTR wszQuery);

    HRESULT RemoveAllDefinitionQueries(
        [in] IWbemContext* pContext);

    //
    // Only allow utilization of the guarantee if the proxy's definition
    // matches the provider's definition.  In other words, only when
    // the provider's registration has been successfully processed, 
    // and the proxies are set up to reflect it, should utilization of 
    // the guarantee be allowed.  The reason for this is that an incomplete
    // source definition can cause bad things to happen when events are 
    // evaluated using a filter that was optimized for that definition.
    // 
    HRESULT AllowUtilizeGuarantee();

    HRESULT Disconnect();
};

interface IWbemFilterStub;

[object, local, uuid(dddaa3dc-2907-41ad-9e74-a91b5af092d4)]
interface IWbemLocalFilterProxy : IWbemFilterProxy
{
    HRESULT SetStub(
        [in] IWbemFilterStub* pStub);
    HRESULT LocalAddFilter(
        [in] IWbemContext* pContext,
        [in, string] LPCWSTR wszQuery,
        [in] void* pParsedQuery,
        [in] WBEM_REMOTE_TARGET_ID_TYPE Id);
    HRESULT GetMainSink(
        [out] IWbemEventSink** ppSink);
};

[object, restricted, uuid(6c19be34-7500-11d1-ad94-00c04fd8fdff)]
interface IWbemFilterStub : IUnknown
{
    HRESULT RegisterProxy(
        [in] IWbemFilterProxy* pProxy);

    HRESULT UnregisterProxy(
        [in] IWbemFilterProxy* pProxy);
};





typedef GUID REQUESTID;

[restricted, object, uuid(a57be31e-efe3-11d0-ad71-00c04fd8fdff)]
interface IWbemCausalityAccess : IUnknown
{
    HRESULT GetRequestId([out] REQUESTID* pId);
    HRESULT IsChildOf([in] REQUESTID Id);
    HRESULT CreateChild([out] IWbemCausalityAccess** ppChild);
    HRESULT GetParentId([out] REQUESTID* pId);
    HRESULT GetHistoryInfo([out] long* plNumParents, [out] long* plNumSiblings);
    HRESULT MakeSpecial();
    HRESULT IsSpecial();
};

//==============================================================================
//==============================================================================
//
//                      Hi-perf specific interfaces.
//
//==============================================================================
//==============================================================================

interface _IWbemRefresherMgr;

// Client and server side version
typedef enum _WBEM_REFR_VERSION_NUMBER
{
    WBEM_REFRESHER_VERSION  = 2
} WBEM_REFR_VERSION_NUMBER;

typedef enum _WBEM_INSTANCE_BLOB_TYPE
{
    WBEM_BLOB_TYPE_DATA_TABLE_ONLY,
    WBEM_BLOB_TYPE_DATA_AND_HEAP,
    WBEM_BLOB_TYPE_ALL,
    WBEM_BLOB_TYPE_ERROR, // m_lBlobLength contains error code
	WBEM_BLOB_TYPE_ENUM
} WBEM_INSTANCE_BLOB_TYPE;

typedef struct _WBEM_REFRESHED_OBJECT
{
    long m_lRequestId;
    long m_lBlobType;
    long m_lBlobLength;
    [size_is(m_lBlobLength)] byte* m_pbBlob;
} WBEM_REFRESHED_OBJECT;

[restricted, uuid(F1E9C5B2-F59B-11d2-B362-00105A1F8177)]
interface IWbemRemoteRefresher : IUnknown
{
    HRESULT RemoteRefresh(
        [in] long lFlags,
        [out] long* plNumObjects,
        [out, size_is(,*plNumObjects)] WBEM_REFRESHED_OBJECT** paObjects);

    HRESULT StopRefreshing(
        [in] long lNumIds,
		[in,size_is(lNumIds)] long* aplIds,
        [in] long lFlags);

	HRESULT GetGuid(
		[in] long lFlags,
		[out] GUID*  pGuid );
};

typedef struct _WBEM_REFRESH_DIRECT_NAMES
{
    [string] WCHAR* m_wszNamespace;
    [string] WCHAR* m_wszProviderName;
} WBEM_REFRESH_DIRECT_NAMES;

typedef struct _WBEM_REFRESH_INFO_CLIENT_LOADABLE
{
    CLSID m_clsid;
    [string] WCHAR* m_wszNamespace;
    IWbemObjectAccess* m_pTemplate;
} WBEM_REFRESH_INFO_CLIENT_LOADABLE;

typedef struct _WBEM_REFRESH_INFO_REMOTE
{
    IWbemRemoteRefresher* m_pRefresher;
    IWbemObjectAccess* m_pTemplate;
	GUID				m_guid;
} WBEM_REFRESH_INFO_REMOTE;

typedef struct _WBEM_REFRESH_INFO_SHARED
{
    [string] WCHAR* m_wszSharedMemoryName;
    IWbemRefresher* m_pRefresher;
} WBEM_REFRESH_INFO_SHARED;

typedef struct _WBEM_REFRESH_INFO_CONTINUOUS
{
    [string] WCHAR* m_wszSharedMemoryName;
} WBEM_REFRESH_INFO_CONTINUOUS;

typedef struct _WBEM_REFRESH_INFO_DIRECT
{
    CLSID m_clsid;
    WBEM_REFRESH_DIRECT_NAMES* m_pDirectNames;
    IWbemObjectAccess* m_pTemplate;
    _IWbemRefresherMgr* m_pRefrMgr;
} WBEM_REFRESH_INFO_DIRECT;

typedef struct _WBEM_REFRESH_INFO_NON_HIPERF
{
    [string] WCHAR* m_wszNamespace;
    IWbemObjectAccess* m_pTemplate;
} WBEM_REFRESH_INFO_NON_HIPERF;

typedef enum _WBEM_REFRESH_TYPE
{
    WBEM_REFRESH_TYPE_INVALID,
    WBEM_REFRESH_TYPE_DIRECT,
    WBEM_REFRESH_TYPE_CLIENT_LOADABLE,
    WBEM_REFRESH_TYPE_REMOTE,
    WBEM_REFRESH_TYPE_SHARED,
    WBEM_REFRESH_TYPE_CONTINUOUS,
	WBEM_REFRESH_TYPE_NON_HIPERF
} WBEM_REFRESH_TYPE;

typedef enum _WBEM_RECONNECT_TYPE
{
    WBEM_RECONNECT_TYPE_OBJECT,
    WBEM_RECONNECT_TYPE_ENUM,
    WBEM_RECONNECT_TYPE_LAST,
} WBEM_RECONNECT_TYPE;

typedef [switch_type(long)] union _WBEM_REFRESH_INFO_UNION
{
    [case (WBEM_REFRESH_TYPE_CLIENT_LOADABLE)]
        WBEM_REFRESH_INFO_CLIENT_LOADABLE m_ClientLoadable;

    [case (WBEM_REFRESH_TYPE_REMOTE)]
        WBEM_REFRESH_INFO_REMOTE m_Remote;

    [case (WBEM_REFRESH_TYPE_SHARED)]
        WBEM_REFRESH_INFO_SHARED m_Shared;

    [case (WBEM_REFRESH_TYPE_CONTINUOUS)]
        WBEM_REFRESH_INFO_CONTINUOUS m_Continuous;

    [case (WBEM_REFRESH_TYPE_DIRECT)]
        WBEM_REFRESH_INFO_DIRECT m_Direct;

    [case (WBEM_REFRESH_TYPE_NON_HIPERF)]
        WBEM_REFRESH_INFO_NON_HIPERF m_NonHiPerf;

    [case (WBEM_REFRESH_TYPE_INVALID)]
        HRESULT m_hres;

} WBEM_REFRESH_INFO_UNION;

typedef struct _WBEM_REFRESH_INFO
{
    long m_lType;
    [switch_is(m_lType)] WBEM_REFRESH_INFO_UNION m_Info;
    long m_lCancelId;
} WBEM_REFRESH_INFO;

typedef struct _WBEM_REFRESHER_ID
{
    [string] LPSTR m_szMachineName;
    DWORD m_dwProcessId;
    GUID m_guidRefresherId;
} WBEM_REFRESHER_ID;

typedef struct _WBEM_RECONNECT_INFO
{
	long m_lType;
	[string] LPCWSTR m_pwcsPath;
} WBEM_RECONNECT_INFO;

typedef struct _WBEM_RECONNECT_RESULTS
{
	long	m_lId;
	HRESULT m_hr;
} WBEM_RECONNECT_RESULTS;

[restricted, uuid(2C9273E0-1DC3-11d3-B364-00105A1F8177)]
interface IWbemRefreshingServices : IUnknown
{
    HRESULT AddObjectToRefresher(
            [in] WBEM_REFRESHER_ID* pRefresherId,
            [in, string] LPCWSTR wszPath,
            [in] long lFlags,
            [in] IWbemContext* pContext,
			[in] DWORD dwClientRefrVersion,
            [out] WBEM_REFRESH_INFO* pInfo,
			[out] DWORD* pdwSvrRefrVersion);

    HRESULT AddObjectToRefresherByTemplate(
            [in] WBEM_REFRESHER_ID* pRefresherId,
            [in] IWbemClassObject* pTemplate,
            [in] long lFlags,
            [in] IWbemContext* pContext,
			[in] DWORD dwClientRefrVersion,
            [out] WBEM_REFRESH_INFO* pInfo,
			[out] DWORD* pdwSvrRefrVersion);

    HRESULT AddEnumToRefresher(
            [in] WBEM_REFRESHER_ID* pRefresherId,
            [in, string] LPCWSTR wszClass,
            [in] long lFlags,
            [in] IWbemContext* pContext,
			[in] DWORD dwClientRefrVersion,
            [out] WBEM_REFRESH_INFO* pInfo,
			[out] DWORD* pdwSvrRefrVersion);

    HRESULT RemoveObjectFromRefresher(
            [in] WBEM_REFRESHER_ID* pRefresherId,
            [in] long lId,
            [in] long lFlags,
			[in] DWORD dwClientRefrVersion,
			[out] DWORD* pdwSvrRefrVersion);

	HRESULT GetRemoteRefresher( [in] WBEM_REFRESHER_ID* pRefresherId,
			[in] long lFlags,
			[in] DWORD dwClientRefrVersion,
			[out] IWbemRemoteRefresher** ppRemRefresher,
			[out] GUID* pGuid,
			[out] DWORD* pdwSvrRefrVersion);

    HRESULT ReconnectRemoteRefresher(
            [in] WBEM_REFRESHER_ID* pRefresherId,
			[in] long lFlags,
			[in] long lNumObjects,
			[in] DWORD dwClientRefrVersion,
            [in, size_is(lNumObjects)] WBEM_RECONNECT_INFO* apReconnectInfo,
			[in, out, size_is(lNumObjects)] WBEM_RECONNECT_RESULTS* apReconnectResults ,
			[out] DWORD* pdwSvrRefrVersion);
};

[restricted, local, uuid(504e6fe4-dfcd-11d1-adb4-00c04fd8fdff)]
interface IWbemUnloadingControl : IUnknown
{
    HRESULT SetMustPreventUnloading([in] boolean bPrevent);
};

[restricted, local, uuid(61d629e4-e546-11d2-b33a-00105a1f4aaf)]
interface IWbemInternalServices : IUnknown
{
    HRESULT FindKeyRoot(
            [in, string] LPCWSTR wszClassName,
            [out] IWbemClassObject** ppKeyRootClass);

    HRESULT InternalGetClass(
            [in, string] LPCWSTR wszClassName,
            [out] IWbemClassObject** ppClass);

    HRESULT InternalGetInstance(
            [in, string] LPCWSTR wszPath,
            [out] IWbemClassObject** ppInstance);

    HRESULT InternalExecQuery(
            [in, string] LPCWSTR wszQueryLanguage,
            [in, string] LPCWSTR wszQuery,
            [in] long lFlags,
            [in] IWbemObjectSink* pSink);

    HRESULT InternalCreateInstanceEnum(
            [in, string] LPCWSTR wszClassName,
            [in] long lFlags,
            [in] IWbemObjectSink* pSink);
    HRESULT GetDbInstance(
            [in, string] LPCWSTR wszDbKey,
            [out] IWbemClassObject** ppInstance);
    HRESULT GetDbReferences(
            [in] IWbemClassObject* pEndpoint,
            [in] IWbemObjectSink* pSink);
    HRESULT InternalPutInstance(
            [in] IWbemClassObject* pInstance);

	HRESULT GetNormalizedPath(
			[in] BSTR pstrPath,
			[out] BSTR* pstrStandardPath);
};


//
//	IWbemWCOSmartEnum
//
//	This Interface is intended to provide alternate synchronous enumeration of
//	objects for IEnumWbemClassObject.  If this is called, it calls the normal
//	::Next function, then repackages the data into a BYTE array which must
//	be appropriateky unmarshaled on the receiving end.
//
//

[restricted, object, uuid(423EC01E-2E35-11d2-B604-00104B703EFD)]
interface IWbemWCOSmartEnum : IUnknown
{
	HRESULT Next(
	[in] REFGUID proxyGUID,
	[in] LONG lTimeout,
	[in] ULONG uCount,
	[out] ULONG* puReturned,
	[out] ULONG* pdwBuffSize,
	[out, size_is(,*pdwBuffSize)] byte** pBuffer
	);
};

//
//	IWbemFetchSmartEnum
//
//	This Interface is used to return a smart enumerator.  It assists
//	us when we need to get an enumerator but want to do so without
//	causing AddRef problem with the Proxy Manager.
//

[restricted, object, uuid(1C1C45EE-4395-11d2-B60B-00104B703EFD)]
interface IWbemFetchSmartEnum : IUnknown
{
	HRESULT GetSmartEnum(
	[out] IWbemWCOSmartEnum** ppSmartEnum
	);
};

//
//	IWbemLoginHelper
//
//	This Interface is used to verify if a connection is on the same
//  machine.
//

[restricted, object, uuid(541679AB-2E5F-11d3-B34E-00104BCC4B4A)]
interface IWbemLoginHelper : IUnknown
{
	HRESULT SetEvent([in] LPCSTR sEventToSet);
};

//
//	IWbemLoginClientID
//
//	This Interface is used to verify if a connection is on the same
//  machine.
//

[restricted, object, uuid(d4781cd6-e5d3-44df-ad94-930efe48a887)]
interface IWbemLoginClientID : IUnknown
{
	HRESULT SetClientInfo(
	    [in, unique, string] LPWSTR wszClientMachine,
		[in] LONG lClientProcId,
		[in] LONG lReserved );
};

//
//	ICreateSecondaryStub
//
//	This Interface by unsecapp and winmgmt
//

[restricted, object, uuid(6468FE15-412D-11d3-B350-00104BCC4B4A)]
interface IWbemCreateSecondaryStub : IUnknown
{
	HRESULT CreateSecondaryStub([out] IUnknown** ppSecondaryStub);
};

//
//	IWinmgmtMofCompiler
//
//	
//

[local, object, uuid(C10B4772-4DA0-11d2-A2F5-00C04F86FB7D)]
interface IWinmgmtMofCompiler : IUnknown
{
    HRESULT WinmgmtCompileFile(
	[in, string] LPWSTR FileName,
    [in, string] LPWSTR ServerAndNamespace,
    [in] LONG lOptionFlags,				// autocomp, check, etc
	[in] LONG lClassFlags,
	[in] LONG lInstanceFlags,
    [in] IWbemServices * pOverride,
    [in]  IWbemContext * pCtx,
  	[in, out] WBEM_COMPILE_STATUS_INFO * pInfo
        );
        // lFlags correspond to all the available command-line flags.

    HRESULT WinmgmtCompileBuffer(
      [in] long BuffSize,
      [in, size_is(BuffSize)]BYTE * pBuffer,
      [in] LONG lOptionFlags,				// autocomp, check, etc
      [in] LONG lClassFlags,
      [in] LONG lInstanceFlags,
      [in] IWbemServices * pOverride,
      [in]  IWbemContext * pCtx,
  	[in, out] WBEM_COMPILE_STATUS_INFO * pInfo
        );

        // lFlags correspond to all the available command-line flags.
};

// Are strings ASCII or UNICODE?
typedef enum tagWMI_STRING_FLAGS
{
    WMIOBJECT_STRING_FLAG_ASCII = 0,
    WMIOBJECT_STRING_FLAG_UNICODE = 0x1,
    WMIOBJECT_STRING_FLAG_MASK = 0x1,
} WMIOBJECT_STRING_FLAGS;

// Get Object Flags, LoPart of 64-bit value
typedef enum tagWMIOBJECT_GETOBJECT_LOFLAGS
{
	WMIOBJECT_GETOBJECT_LOFLAG_ASSOCIATION	=	0x1,
	WMIOBJECT_GETOBJECT_LOFLAG_DYNAMIC		=	0x2,
	WMIOBJECT_GETOBJECT_LOFLAG_SINGLETON	=	0x4,
	WMIOBJECT_GETOBJECT_LOFLAG_AMENDMENT	=	0x8,
	WMIOBJECT_GETOBJECT_LOFLAG_LOCALIZED	=	0x10,
	WMIOBJECT_GETOBJECT_LOFLAG_KEYED		=	0x20,
	WMIOBJECT_GETOBJECT_LOFLAG_ABSTRACT		=	0x40,
	WMIOBJECT_GETOBJECT_LOFLAG_HIPERF		=	0x80,
	WMIOBJECT_GETOBJECT_LOFLAG_AUTOCOOK		=	0x100,
	WMIOBJECT_GETOBJECT_LOFLAG_DECORATED	=	0x200,
	WMIOBJECT_GETOBJECT_LOFLAG_LIMITED		=	0x400,
	WMIOBJECT_GETOBJECT_LOFLAG_CLIENTONLY	=	0x800,
	WMIOBJECT_GETOBJECT_LOFLAG_TINY			=	0x1000,
	WMIOBJECT_GETOBJECT_LOFLAG_ALL			=	0xFFFFFFFF
} WMIOBJECT_GETOBJECT_LOFLAGS;

// Get Property Flags, LoPart of 64-bit value
typedef enum tagWMIOBJECT_GETPROPERTY_LOFLAGS
{
	WMIOBJECT_GETPROPERTY_LOFLAG_KEY		=	0x1,
	WMIOBJECT_GETPROPERTY_LOFLAG_INDEX		=	0x2,
	WMIOBJECT_GETPROPERTY_LOFLAG_DYNAMIC	=	0x4,
	WMIOBJECT_GETPROPERTY_LOFLAG_ALL		=	0xFFFFFFFF
} WMIOBJECT_GETPROPERTY_LOFLAGS;

// Set Object Flags, LoPart of 64-bit value
typedef enum tagWMIOBJECT_SETOBJECT_LOFLAGS
{
	WMIOBJECT_SETOBJECT_LOFLAG_LIMITED		=	0x1,
	WMIOBJECT_SETOBJECT_LOFLAG_CLIENTONLY	=	0x2,
	WMIOBJECT_SETOBJECT_LOFLAG_LOCALIZED	=	0x4,
	WMIOBJECT_SETOBJECT_LOFLAG_TINY			=	0x8,
	WMIOBJECT_SETOBJECT_LOFLAG_ALL			=	0xFFFFFFFF
} WMIOBJECT_SETOBJECT_LOFLAGS;


typedef enum tagWMIARRAY_FLAGS
{
	WMIARRAY_FLAG_ALLELEMENTS			=	0x1
} WMIARRAY_FLAGS;

typedef enum tagWMIOBJECT_MERGEAMENDED_FLAGS
{
	WMIOBJECT_MERGEAMENDED_FLAG_PARENTLOCALIZED		=	0x1
} WMIOBJECT_MERGEAMENDED_FLAGS;

typedef enum tagWMIOBJECT_FREEFORM_FLAGS
{
	WMIOBJECT_FREEFORM_FLAG_WRITE_TO_INSTANCE	=	0x1
} WMIOBJECT_FREEFORM_FLAGS;

typedef enum tagWBEM_OBJINTERNALPARTS_INFO
{
	WBEM_OBJ_DECORATION_PART		= 0x1,
    WBEM_OBJ_INSTANCE_PART			= 0x2,
    WBEM_OBJ_CLASS_PART				= 0x4,
    WBEM_OBJ_CLASS_PART_INTERNAL    = 0x8,
    WBEM_OBJ_CLASS_PART_SHARED		= 0x10
} WBEM_OBJINTERNALPARTS_INFO;

typedef enum tagWMIOBJECT_RECONCILE_FLAGS
{
	WMIOBJECT_RECONCILE_FLAG_TESTRECONCILE	=	0x1
} WMIOBJECT_RECONCILE_FLAGS;

typedef enum tagWMIOBJECT_MERGE_FLAGS
{
	WMIOBJECT_MERGE_FLAG_CLASS		=	0x0,
	WMIOBJECT_MERGE_FLAG_INSTANCE	=	0x1
} WMIOBJECT_MERGE_FLAGS;

typedef enum tagWMIOBJECT_ENCODING_FLAGS
{
	WMIOBJECT_FLAG_ENCODING_V1		=	0x1
} WMIOBJECT_ENCODING_FLAGS;

typedef enum tagWMIOBJECT_BEGINENUMEX_FLAGS
{
	WMIOBJECT_BEGINENUMEX_FLAG_GETEXTPROPS		=	0x1
} WMIOBJECT_BEGINENUMEX_FLAGS;

typedef enum tagWMIOBJECT_VALIDATEOBJECT_FLAGS
{
	WMIOBJECT_VALIDATEOBJECT_FLAG_FORCE		=	0x1
} WMIOBJECT_VALIDATEOBJECT_FLAGS;

//***************************************************************************
//
// _IWmiArray - Private Array Access interface -- DO NOT MODIFY THIS
// WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!

[restricted, object, local, uuid(D471B667-6CF7-4a55-9B29-4F1E9FC06C72)]
interface _IWmiArray : IUnknown
{
    HRESULT Initialize(
		[in]	long lFlags,
		[in]	CIMTYPE	cimtype,
		[in]	ULONG uNumElements
		);
	//	Initializes the array.  Number of initial elements as well
	//	as the type (determines the size of each element) and dimension
	//	currently only 1 is supported.

    HRESULT GetInfo(
		[in]	long		lFlags,
		[out]	CIMTYPE*	pcimtype,		// Optional
		[out]	ULONG*		puNumElements	// Optional
		);
	//	Initializes the array.  Number of initial elements as well
	//	as the type (determines the size of each element).

    HRESULT Empty(
		[in]	long lFlags
	);
	//	Clears the array as well as internal data.

	HRESULT GetAt(
		[in]	long	lFlags,
		[in]	ULONG	uStartIndex,		// Which Element
		[in]	ULONG	uNumElements,		// How many Elements
		[in]	ULONG	uBuffSize,			// Buffer Size in BYTES, not chars.
		[out]	ULONG*	puNumReturned,		// Number of elements returned.
		[out]	ULONG*	puBuffSizeUsed,		// Amount of buffer used
		[out]	LPVOID	pDest				// Data Buffer
		);
	// Returns the requested elements.  Buffer must be large enough to hold
	// the element.  Embedded objects returned as AddRef'd _IWmiObject pointers.
	// Strings are copied directly into the specified buffer and null-terminatead. UNICODE only.

	HRESULT SetAt(
		[in]	long	lFlags,
		[in]	ULONG	uStartIndex,		// Which Element
		[in]	ULONG	uNumElements,		// How many Elements
		[in]	ULONG	uBuffSize,			// Buffer Size in BYTES, not chars.
		[in]	LPVOID	pDest				// Data Buffer
		);
	// Sets the specified elements.  Buffer must supply data matching the CIMTYPE
	// of the Array.  Embedded objects set as _IWmiObject pointers.
	// Strings accessed as LPCWSTRs and the 2-byte null is copied.

    HRESULT Append(
		[in]	long	lFlags,
		[in]	ULONG	uNumElements,		// How many Elements
		[in]	ULONG	uBuffSize,			// Buffer Size
		[in]	LPVOID	pDest				// Data Buffer
        );
	// Appends the specified elements.  Buffer must supply data matching
	// the CIMTYPE of the Array.  Embedded objects set as _IWmiObject pointers.
	// Strings accessed as LPCWSTRs and the 2-byte null is copied.

    HRESULT RemoveAt(
		[in]	long	lFlags,
        [in]	ULONG	uStartIndex,		// Starting endex
		[in]	ULONG	uNumElements		// How many Elements
        );
	// Removes the specified elements from the array.  Subseqent elements are copied back
	// to the starting point
	
};

//***************************************************************************
//
//	_IWmiObjectAccessEx - internal interface exposing guts of our object BLOBs
//	Inherits from IWbemObjectAccess so regular functionality is available.
//  -- DO NOT MODIFY THIS WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!

[restricted, object, local, uuid(235FE06E-00E6-4990-A624-2D4DCD5EB63A)]
interface _IWmiObjectAccessEx : IWbemObjectAccess
{
    HRESULT GetPropertyHandleEx(
        [in]    LPCWSTR pszPropName,
		[in]	long lFlags,
        [out]	CIMTYPE* puCimType,        // optional
        [out]   long* plHandle
        );
	// Returns property handle for ALL types

    HRESULT SetPropByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[in]	ULONG uDataSize,
		[in]	LPVOID pvData
        );
    // Sets properties using a handle.  If pvData is NULL, it NULLs the property.
	// Can set an array to NULL.  To set actual data use the corresponding array
	// function

    HRESULT GetPropAddrByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[out]	ULONG*	puFlags,		// Datatype dependent flags
        [out]   LPVOID *pAddress
        );
    // Returns a pointer to a memory address containing the requested data
	// Caller should not write into the memory address.  The memory address is
	// not guaranteed to be valid if the object is modified.
	// For String properties, puFlags will contain info on the string
	// For object properties, LPVOID will get back an _IWmiObject pointer
	// that must be released by the caller.  Does not return arrays.
	// Supports __CLASS and __SUPERCLASS

    HRESULT GetArrayPropAddrByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[out]	ULONG* puNumElements,
        [out]   LPVOID* pAddress
        );
    // Returns a pointer directly to a memory address containing contiguous
	// elements.  Limited to non-string/obj types

    HRESULT GetArrayPropInfoByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[out]	BSTR* pstrName,
		[out]	CIMTYPE* pct,
		[out]	ULONG*	puNumElements	// How many elements are available
        );
    // Returns the number of elements available in an array property.

    HRESULT GetArrayPropElementByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[in]	ULONG uElement,
		[out]	ULONG*	puFlags,		// Datatype dependent flags
		[out]	ULONG*	puNumElements,	// How many elements are available
        [out]   LPVOID* pAddress
        );
    // Returns a pointer to a memory address containing the requested data
	// Caller should not write into the memory address.  The memory address is
	// not guaranteed to be valid if the object is modified.
	// For String properties, puFlags will contain info on the string
	// For object properties, LPVOID will get back an _IWmiObject pointer
	// that must be released by the caller.

    HRESULT SetArrayPropElementByHandle(
        [in]    long lHandle,		// Property Handle
		[in]	long lFlags,		// Must be 0L
		[in]	ULONG uElement,		// Which element to set
		[in]	ULONG uBuffSize,	// The actual buffer size in bytes (ignored for CIM_OBJECT)
        [in]	LPVOID pData		// The actual data buffer
        );
    // Sets the data at the specified array element.  BuffSize must be appropriate based on the
	// actual element being set.  Object properties require an _IWmiObject pointer.  Strings must
	// be WCHAR null-terminated

	HRESULT RemoveArrayPropElementByHandle(
        [in]    long lHandle,		// Property Handle
		[in]	long lFlags,		// Must be 0L
		[in]	ULONG uElement		// Which element to remove
		);
    // Removes the data at the specified array element.

    HRESULT GetArrayPropRangeByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[in]	ULONG uStartIndex,		// Range Start Index
		[in]	ULONG uNumElements,		// Number of elements to get
		[in]	ULONG uBuffSize,		// Size of the buffer in bytes
		[out]	ULONG* puNumReturned,	// Number of elements returned
		[out]	ULONG* puBuffUsed,		// How much buffer was used
		[in,out] LPVOID pData			// Storage to copy into
        );
    // Gets a range of elements from inside an array.  BuffSize must reflect uNumElements of the size of
	// element being set.  Strings must be linear WCHAR strings separated by NULLs.  Object properties
	// must consist of an array of _IWmiObject pointers.  The range MUST fit within the bounds
	// of the current array.  If lFlags is WMIARRAY_FLAG_ALLELEMENTS, we get all elements
	// from the starting index on

    HRESULT SetArrayPropRangeByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[in]	ULONG uStartIndex,		// Range Start Index
		[in]	ULONG uNumElements,		// Number of elements to set
		[in]	ULONG uBuffSize,		// Size of the buffer in bytes
		[in]	LPVOID pData			// Storage to copy from
        );
    // Sets a range of elements inside an array.  BuffSize must reflect uNumElements of the size of
	// element being set.  Strings must be linear WCHAR strings separated by NULLs.  Object properties
	// must consist of an array of _IWmiObject pointers.  The range MUST fit within the bounds
	// of the current array.  If lFlags is WMIARRAY_FLAG_ALLELEMENTS, and the start index is 0, the
	// array will be sized/resized/etc. as needed to fit the requested range

    HRESULT RemoveArrayPropRangeByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[in]	ULONG uStartIndex,		// Range Start Index
		[in]	ULONG uNumElements		// Number of elements to remove
        );
    // Removes a range of elements from an array.  The range MUST fit within the bounds
	// of the current array

    HRESULT AppendArrayPropRangeByHandle(
        [in]    long lHandle,
		[in]	long lFlags,
		[in]	ULONG uNumElements,		// Number of elements to append
		[in]	ULONG uBuffSize,		// Size of the buffer in bytes
		[in]	LPVOID pData			// Storage to copy from
        );
    // Appends elements to the end of an array.  BuffSize must reflect uNumElements of the size of
	// element being set.  Strings must be linear WCHAR strings separated by NULLs.  Object properties
	// must consist of an array of _IWmiObject pointers.

    HRESULT ReadProp(
        [in]  LPCWSTR pszPropName,
		[in]  long lFlags,
        [in]  ULONG uBufSize,
        [out] CIMTYPE *puCimType,			// optional
		[out] long *plFlavor,			// optional
		[out] BOOL *pfIsNull,
		[out] ULONG *puBuffSizeUsed,
        [in, out] LPVOID pUserBuf
        );
    // Assumes caller knows prop type; Supports all CIMTYPES
	// Strings are copied in-place WCHAR and null-terminated.
	// Objects come out as _IWmiObject pointers
	// Arrays come out as a pointer to _IWmiArray

    HRESULT WriteProp(
        [in] LPCWSTR pszPropName,
		[in] long lFlags,
        [in] ULONG uBufSize,			// Size of the buffer
		[in] ULONG uNumElements,		// Number of array elements
        [in] CIMTYPE uCimType,
        [in] LPVOID pUserBuf
        );
    // Assumes caller knows prop type; Supports all CIMTYPES.
	// Strings MUST be null-terminated wchar_t arrays.
	// Objects are passed in as _IWmiObject pointers
	// Using a NULL buffer will set the property to NULL
	// Array properties must conform to array guidelines.  Will
	// completely blow away an old array.

    HRESULT GetObjQual(
		[in] LPCWSTR pszQualName,
		[in] long lFlags,
        [in] ULONG uBufSize,
        [out] CIMTYPE *puCimType,			// optional
        [out] ULONG *puQualFlavor,		// optional
		[out] ULONG* puBuffSizeUsed,	// optional
        [out] LPVOID pDestBuf
        );
    // Limited to numeric, simple null terminated string types and simple arrays
	// Strings are copied in-place and null-terminated.
	// Arrays come out as a pointer to IWmiArray

    HRESULT SetObjQual(
		[in] LPCWSTR pszQualName,
		[in] long lFlags,
        [in] ULONG uBufSize,
		[in] ULONG uNumElements,
        [in] CIMTYPE uCimType,
        [in] ULONG uQualFlavor,
        [in] LPVOID pUserBuf
        );
    // Limited to numeric, simple null terminated string types and simple arrays
	// Strings MUST be WCHAR
	// Arrays are set using _IWmiArray interface from Get

    HRESULT GetPropQual(
        [in] LPCWSTR pszPropName,
		[in] LPCWSTR pszQualName,
		[in] long lFlags,
        [in] ULONG uBufSize,
        [out] CIMTYPE *puCimType,
        [out] ULONG *puQualFlavor,
		[out] ULONG* puBuffSizeUsed,	// optional
        [in, out] LPVOID pDestBuf
        );
    // Limited to numeric, simple null terminated string types and simple arrays
	// Strings MUST be WCHAR

    HRESULT SetPropQual(
        [in] LPCWSTR pszPropName,
		[in] LPCWSTR pszQualName,
		[in] long lFlags,
        [in] ULONG uBufSize,
		[in] ULONG uNumElements,
        [in] CIMTYPE uCimType,
        [in] ULONG uQualFlavor,
        [in] LPVOID pUserBuf
        );
    // Limited to numeric, simple null terminated string types and simple arrays
	// Strings MUST be WCHAR
	// Arrays are set using _IWmiArray interface from Get

    HRESULT GetMethodQual(
        [in] LPCWSTR pszMethodName,
		[in] LPCWSTR pszQualName,
		[in] long lFlags,
        [in] ULONG uBufSize,
        [out] CIMTYPE *puCimType,
        [out] ULONG *puQualFlavor,
		[out] ULONG* puBuffSizeUsed,	// optional
        [in, out] LPVOID pDestBuf
        );
    // Limited to numeric, simple null terminated string types and simple arrays
	// Strings MUST be WCHAR

    HRESULT SetMethodQual(
        [in] LPCWSTR pszMethodName,
		[in] LPCWSTR pszQualName,
		[in] long lFlags,
        [in] ULONG uBufSize,
		[in] ULONG uNumElements,
        [in] CIMTYPE uCimType,
        [in] ULONG uQualFlavor,
        [in] LPVOID pUserBuf
        );
    // Limited to numeric, simple null terminated string types and simple arrays
	// Strings MUST be WCHAR
	// Arrays are set using _IWmiArray interface from Get

};

//***************************************************************************
//
//	_IWmiObject - internal interface exposing guts of our object BLOBs
//	Inherits from _IWmiObjectAccessEx so regular functionality is available.
//  -- DO NOT MODIFY THIS WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!

[restricted, object, local, uuid(B308C72B-7FEA-4c98-A459-7F5FCC3ED39F)]
interface _IWmiObject : _IWmiObjectAccessEx
{
	HRESULT CloneEx(
		[in] long lFlags,
        [in] _IWmiObject* pDestObject
        );
    // Clones the current object into the supplied one.  Reuses memory as
	// needed

	HRESULT CopyInstanceData(
		[in] long lFlags,
        [in] _IWmiObject* pSourceInstance
        );
	// Copies instance data from source instance into current instance
	// Class Data must be exactly the same

    HRESULT QueryObjectFlags(
		[in] long lFlags,
	    [in] unsigned __int64 qObjectInfoMask,
	    [out] unsigned __int64 *pqObjectInfo
	    );
	// Returns flags indicating singleton, dynamic, association, etc.

    HRESULT SetObjectFlags(
		[in] long lFlags,
		[in] unsigned __int64 qObjectInfoOnFlags,
		[in] unsigned __int64 qObjectInfoOffFlags
		);
	// Sets flags, including internal ones normally inaccessible.

    HRESULT QueryPropertyFlags(
		[in]	long lFlags,
	    [in]	LPCWSTR	pszPropertyName,
	    [in]	unsigned __int64 qPropertyInfoMask,
	    [out]	unsigned __int64 *pqPropertyInfo
	    );
	// Returns flags indicating key, index, etc.

    HRESULT IsParentClass(
		[in]	long lFlags,
		[in]	_IWmiObject* pClass
		);
	// Checks if the current object is a child of the specified class (i.e. is Instance of,
	// or is Child of )

    HRESULT CompareDerivedMostClass(
		[in]	long lFlags,
		[in]	_IWmiObject* pClass
		);
	// Compares the derived most class information of two class objects.

    HRESULT MergeAmended(
		[in]	long lFlags,
		[in]	_IWmiObject* pAmendedClass
		);
	// Merges in amended qualifiers from the amended class object into the
	// current object.  If lFlags is WMIOBJECT_MERGEAMENDED_FLAG_PARENTLOCALIZED,
	// this means that the parent object was localized, but not the current,
	// so we need to prevent certain qualifiers from "moving over."

    HRESULT GetDerivation(
		[in]	long lFlags,
		[in]	ULONG uBufferSize,
		[out]	ULONG* puNumAntecedents,
		[out]	ULONG* puBuffSizeUsed,
		[out]	LPWSTR pwstrUserBuffer
		);
	// Retrieves the derivation of an object as an array of LPCWSTR's, each one
	// terminated by a NULL.  Leftmost class is at the top of the chain

	HRESULT _GetCoreInfo(
		[in] long lFlags,
		[out] void** pvData
	);
	// Returns core data.  See SANJES or RAYMCC before implementing or calling

	// Old IWbemObjectInternals methods
    HRESULT QueryPartInfo(
	[out] DWORD *pdwResult
	);

    HRESULT SetObjectMemory(
	[in] LPVOID pMem,
	[in] DWORD dwMemSize
	);

    HRESULT GetObjectMemory(
	[out] LPVOID pDestination,
	[in] DWORD dwDestBufSize,
	[out] DWORD *pdwUsed
	);

    HRESULT SetObjectParts(
	[in] LPVOID pMem,
	[in] DWORD dwDestBufSize,
	[in] DWORD dwParts
	);

    HRESULT GetObjectParts(
	[out] LPVOID pDestination,
	[in] DWORD dwDestBufSize,
	[in] DWORD dwParts,
	[out] DWORD *pdwUsed
	);

    HRESULT StripClassPart();

    HRESULT SetClassPart(
	[in] LPVOID pClassPart,
	[in] DWORD dwSize
	);

    HRESULT MergeClassPart(
	[in] IWbemClassObject *pClassPart
	);

    HRESULT IsObjectInstance();

	HRESULT SetDecoration(
	[in, string] LPCWSTR pwcsServer,
	[in, string] LPCWSTR pwcsNamespace
	);

	HRESULT RemoveDecoration();

	HRESULT CompareClassParts(
	[in] IWbemClassObject* pObj,
	[in] long lFlags
	);

	HRESULT ClearWriteOnlyProperties();

    HRESULT GetClassSubset(
        [in]  DWORD dwNumNames,
        [in]  LPCWSTR *pPropNames,
        [out] _IWmiObject **pNewClass
        );
	// Creates a limited representation class for projection queries

    HRESULT MakeSubsetInst(
        [in]  _IWmiObject *pInstance,
		[out] _IWmiObject** pNewInstance
        );
	// Creates a limited representation instance for projection queries
	// "this" _IWmiObject must be a limited class

	HRESULT Unmerge(
		[in]  long lFlags,
		[in]  ULONG uBuffSize,
		[out]  ULONG* puBuffSizeUsed,
		[in,out]  LPVOID pData
		);
	// Returns a BLOB of memory containing minimal data (local)

	HRESULT Merge(
		[in]  long lFlags,
		[in]  ULONG uBuffSize,
		[in]  LPVOID pbData,
		[out]  _IWmiObject** ppNewObj
		);
	// Merges a blob with the current object memory and creates a new object

	HRESULT ReconcileWith(
		[in]  long lFlags,
		[out]  _IWmiObject* pNewObj
		);
	// Reconciles an object with the current one.  If WMIOBJECT_RECONCILE_FLAG_TESTRECONCILE
	// is specified this will only perform a test

	HRESULT GetKeyOrigin(
		[in]  long lFlags,
		[in]  DWORD dwNumChars,
		[out]  DWORD* pdwNumUsed,
		[out]  LPWSTR pwzClassName );
	// Returns the name of the class where the keys were defined

	HRESULT GetKeyString(
		[in]  long lFlags,
		[out]  BSTR* pwzKeyString );
	// Returns the key of the instance

	HRESULT GetNormalizedPath(
		[in] long lFlags,
		BSTR* pstrStandardPath
		);
	// Returns a normalized path from the object

	HRESULT Upgrade(
			[in] _IWmiObject* pNewParentClass,
			[in] long lFlags,
			[out] _IWmiObject** ppNewChild
			);
	// Upgrades class and instance objects

	HRESULT Update(
			[in] _IWmiObject* pOldChildClass,
			[in] long lFlags,
			[out] _IWmiObject** ppNewChildClass
			);
	// Updates derived class object using the safe/force mode logic

	HRESULT BeginEnumerationEx(
			[in] long lFlags,
			[in] long lExtFlags
			);
	// Allows special filtering when enumerating properties outside the
	// bounds of those allowed via BeginEnumeration().

	HRESULT CIMTYPEToVARTYPE(
			[in] CIMTYPE ct,
			[out] VARTYPE* pvt
			);
	// Returns a VARTYPE from a CIMTYPE

	HRESULT SpawnKeyedInstance(
			[in] long lFlags,
			[in] LPCWSTR pwszPath,
			[out] _IWmiObject** ppInst
			);

	HRESULT ValidateObject(
			[in] long lFlags
			);
	// Validates an object blob

	HRESULT GetParentClassFromBlob(
			[in]  long lFlags,
			[in]  ULONG uBuffSize,
			[in]  LPVOID pbData,
			[out]  BSTR* pbstrParentClass
			);
	// Returns the parent class name from a BLOB
};			

//
//	_IWmiFreeFormObject - internal interface allowing for creation of "on the fly"
//	objects which declare classness or instanceness as specified by the caller.
//	Inherits from _IWmiObject so regular and extended functionality is available.
//  -- DO NOT MODIFY THIS WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!

[restricted, object, local, uuid(28E1AE0A-20EA-406c-BDB6-011B76E0DDE9)]
interface _IWmiFreeFormObject : IUnknown
{
    HRESULT SetPropertyOrigin(
		[in]	long lFlags,
        [in]    LPCWSTR pszPropName,
		[in]	LPCWSTR pszClassName
		);
	// Specifies a property origin (in case we have properties originating in classes
	// which we know nothing about).

    HRESULT SetMethodOrigin(
		[in]	long lFlags,
        [in]    LPCWSTR pszMethodName,
		[in]	LPCWSTR pszClassName
		);
	// Specifies a method origin (in case we have methods originating in classes
	// which we know nothing about).

    HRESULT SetDerivation(
		[in]	long lFlags,
		[in]	ULONG uNumClasses,
        [in]    LPCWSTR pwszInheritanceChain
		);
	// Specifies the inheritance chain - Only valid while object is a class and class name has
	// NOT been set.  This will cause a derived class to be generated.  All properties and
	// classes must have been set prior to setting the actual class name.  The class in the
	// last position will be set as the current class name, and the remainder will be set as the
	// actual chain and then a derived class will be spawned.

    HRESULT SetClassName(
		[in]	long lFlags,
        [in]    LPCWSTR pszClassName
		);
	// Specifies the class name - Only valid while object is a class and no pevious name has
	// been set.

    HRESULT MakeInstance(
		[in]	long lFlags
		);
	// Converts the current object into an instance.  If it is already an instance, this will
	// fail.  Writes properties assigned to instance during AddProperty operations

    HRESULT AddProperty(
        [in] LPCWSTR pszPropName,
		[in] long lFlags,
        [in] ULONG uBufSize,			// Size of the buffer
		[in] ULONG uNumElements,		// Number of array elements
        [in] CIMTYPE uCimType,
        [in] LPVOID pUserBuf
        );
    // Assumes caller knows prop type; Supports all CIMTYPES.
	// Strings MUST be null-terminated wchar_t arrays.
	// Objects are passed in as _IWmiObject pointers
	// Using a NULL buffer will set the property to NULL
	// Array properties must conform to array guidelines.
	// Only works when the object is not an instance.
	// If WMIOBJECT_FREEFORM_FLAG_WRITE_TO_INSTANCE is set
	// then property will only be added and the value will
	// be assigned when MakeInstance() is called

    HRESULT Reset(
		[in] long lFlags
        );
	// Resets the object to a clean state

};

//
//	_IWmiObjectFactory - internal object factory, allowing for creation of
//	specific types of WMI objects.
//  -- DO NOT MODIFY THIS WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!

[restricted, object, local, uuid(855A71D0-E5CD-46de-9707-17F2BD1ED694)]
interface _IWmiObjectFactory : IUnknown
{
    HRESULT Create(
        [in]    IUnknown*	pUnkOuter,
		[in]	ULONG		ulFlags,
		[in]	REFCLSID	rclsid,
		[in]	REFIID		riid,
		[out,iid_is(riid)]	LPVOID*	ppObj
		);
};

// UMI Object wrapper flags
typedef enum tagUMIOBJECT_WRAPPER_FLAGS
{
	UMIOBJECT_WRAPPER_FLAG_SECURITY		=	0x10,
	UMIOBJECT_WRAPPER_FLAG_CONTAINER	=	0x20
} UMIOBJECT_WRAPPER_FLAGS;

//
//	_IWbemUMIObjectWrapper - Wrapper Interface to hide IUMIObject interface
//	implementations behind IWbemClassObject
//  -- DO NOT MODIFY THIS WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!

// UMI definitions declared as IUnknowns due to UMI.IDL problems with importing.
[restricted, object, local, uuid(91DF7ACE-7A22-4cd7-99C6-23B713CDF47C)]
interface _IWbemUMIObjectWrapper : IUnknown
{
    HRESULT SetObject(
        [in]	long lFlags,
		[in]	IUnknown* pUnk
		);
	// Sets the underlying UMI Object interface pointer

	// Connects the wrapper to
    HRESULT ConnectToProvider(
        [in] LPCWSTR pwszUser,
		[in] LPCWSTR pwszPassword,
		[in] IUnknown* pPath,		// IUmiUrl
		[in] REFCLSID rclsid,
		[in] IWbemContext* pCtx
		);
	// Sets the underlying UMI Object interface pointer
};

typedef enum tagUMISVCEX_WRAPPER_FLAGS
{
	UMISVCEX_WRAPPER_FLAG_SETDIRECT	=	0x10
} UMISVCEX_WRAPPER_FLAGS;

// UMI definitions declared as IUnknowns due to UMI.IDL problems with importing.
[restricted, object, local, uuid(D83B6FC3-8489-478f-BC4A-AD0C9E375ED6)]
interface _IUmiSvcExWrapper : IUnknown
{
    HRESULT ConnectToProvider(
        [in] LPCWSTR pwszUser,
		[in] LPCWSTR pwszPassword,
		[in] IUnknown* pPath,	// IUmiUrl
		[in] REFCLSID rclsid,
		[in] IWbemContext* pCtx,
		[out] IUnknown** pUnk	// IUmiContainer
		);
	// Connects to the actual provider and returns a proper
	// IUmiContainer

    HRESULT SetContainer(
		[in] long lFlags,
		[in] IUnknown* pContainer	// IUmiContainer
		);
	// Hands the connection to the wrapper
};

[restricted, object, local, uuid(F8604208-0F90-4d33-B9D4-E00540DBE018)]
interface _IUmiDsWrapper : IUnknown
{
	// Returns he real container pointer
    HRESULT GetRealContainer(
		[out] IUnknown** pUnk	// IUmiContainer
		);
};

//
//	_IWbemUMIContextWrapper - Wrapper Interface to pull UMI related
//	properties from an IWbemContext and apply them to appropriate
//	interfaces.
//  -- DO NOT MODIFY THIS WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!

[restricted, object, local, uuid(90F22E4D-3266-4eac-A1B1-837AF5FEDEDD)]
interface _IWbemUMIContextWrapper : IUnknown
{
    HRESULT SetConnectionProps(
        [in]	long lFlags,
		[in]	IWbemContext* pContext,
		[in,out]	IUnknown* pUnk
		);
	// Sets the specified System Properties on a connection object

    HRESULT SetQueryProps(
        [in]	long lFlags,
		[in]	IWbemContext* pContext,
		[in,out]	IUnknown* pUnk
		);
	// Sets the specified System Properties on a UMI Query object

    HRESULT SetPropertyListProps(
        [in]	long lFlags,
		[in]	LPCWSTR pwszName,
		[in]	IWbemContext* pContext,
		[in,out]	IUnknown* pUnk
		);
	// Sets the specified System Properties on a UMI Query object, filtering on the
	// specified name.

};

//
//	_IWmiErrorObject - Wrapper Interface for creating generic WMI
//	error objects.  Creates an __ExtendedStatus object, with values
//	we can set.
//  -- DO NOT MODIFY THIS WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!
[restricted, object, local, uuid(2EAA0B00-3E3C-4472-8273-67B150267ABB)]
interface _IWmiErrorObject : IUnknown
{
    HRESULT SetErrorInfo(
        [in]	GUID*	pGuidSource,
		[in]	DWORD	dwHelpContext,
		[in]	LPCWSTR	pwszHelpFile,
		[in]	LPCWSTR	pwszSource,
		[in]	LPCWSTR pwszDescription,
		[in]	LPCWSTR	pwszOperation,
		[in]	LPCWSTR	pwszParameterInfo,
		[in]	LPCWSTR	pwszProviderName,
		[in]	DWORD	dwStatusCode
		);
};

//
//	_IUmiErrorObject - Wrapper Interface for creating generic UMI based
//	error objects.  Creates an __ExtendedStatus object, with values
//	we can set.
//  -- DO NOT MODIFY THIS WITHOUT CHECKING WITH SANJES AND/OR RAYMCC!
[restricted, object, local, uuid(7B1A99AC-E164-4d25-8DC0-CC4CA89F1BA1)]
interface _IUmiErrorObject : IUnknown
{
    HRESULT SetExtendedStatus(
        [in]	GUID*		pGuidSource,
		[in]	IUnknown*	pUnk,
		[in]	LPCWSTR		pwszDescription,
		[in]	LPCWSTR		pwszOperation,
		[in]	LPCWSTR		pwszParameterInfo,
		[in]	LPCWSTR		pwszProviderName
		);
};

//***************************************************************************
//
//

interface _IWmiCoreServices;
interface _IWmiProvSS;
interface _IWmiESS;
interface _IWmiFinalizer;

typedef enum
{
        WMIESS_INIT_REPOSITORY_RECOVERED = 1

}   WMIESS_FLAGS;

[object, local, uuid(c0e3eeb3-b2ce-4a6a-9284-f38475cee099)]

interface _IWmiESS : IUnknown
{
    HRESULT Initialize(
        [in] long lFlags,
        [in] IWbemContext *pCtx,
        [in] _IWmiCoreServices *pSvc
        );

    HRESULT ExecNotificationQuery(
        [in] LPCWSTR pszNamespace,
        [in] LPCWSTR pszQueryText,
        [in] long lFlags,
        [in] IWbemContext* pContext,
        [in] IWbemObjectSink* pSink
        );

    HRESULT CancelAsyncCall(
        [in] IWbemObjectSink* pSink
        );

    HRESULT QueryObjectSink(
        [in] LPCWSTR pszNamespace,
        [out] IWbemObjectSink** ppNamespaceSink
        );
};

// UMI Object wrapper flags
typedef enum _IWMIPROVSSSINK_FLAGS
{
	_IWMIPROVSSSINK_FLAGS_LOAD		= 0x1 ,
	_IWMIPROVSSSINK_FLAGS_UNLOAD	= 0x2 ,
	_IWMIPROVSSSINK_FLAGS_RELOAD	= 0x3

} _IWMIPROVSSSINK_FLAGS;

[object, uuid(2a504ca2-ca90-4731-87bc-6e99ca2019af) ]
interface _IWmiProvSSSink : IUnknown
{
    HRESULT Synchronize (
	
		long lFlags,
        IWbemContext* pContext, 
        LPCWSTR wszNamespace, 
        LPCWSTR wszProvider
	);
};

[object, uuid(e8107bdf-baaf-4c7c-bb5f-9d732e8d8f07)]

interface _IWmiProvSS: IUnknown
{
    HRESULT Initialize(

        [in] long lFlags,
        [in] IWbemContext *pCtx,
        [in] _IWmiCoreServices *pSvc
	);

    HRESULT Create( 

        [in] IWbemServices *pCore,            // Namespace ptr
        [in] long lFlags,
		[in] IWbemContext *pContext,
		[in,string] LPCWSTR pNamespacePath,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface
   	);

    HRESULT RegisterNotificationSink( 

        [in] long lFlags,
		[in] IWbemContext *pContext,
		[in] _IWmiProvSSSink* pSink
	);

    HRESULT UnRegisterNotificationSink( 

        [in] long lFlags,
		[in] IWbemContext *pContext,
		[in] _IWmiProvSSSink* pSink
	);

	HRESULT CreateRefresherManager(

        [in] IWbemServices *pCore,            // Namespace ptr
        [in] long lFlags,
		[in] IWbemContext *pContext,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface
   	);
};


//***************************************************************************

[object, local, restricted, uuid(6d8d984b-9965-4023-921a-610b348ee54e)]
interface _IWmiUserHandle : _IWmiCoreHandle
{
};


[object, local, restricted, uuid(52631080-ab99-46f4-b3c4-da127b94bed5)]

interface _IWmiConnectionHandle : _IWmiCoreHandle
{
};



//***************************************************************************

[object, local, uuid(dc9a2bf5-c244-4a01-9206-f28cd51a3c3d)]

interface _IWmiThreadSecHandle : _IWmiCoreHandle
{

	HRESULT GetTokenOrigin ( [out] WMI_THREAD_SECURITY_ORIGIN *a_Origin ) ;

/*
 * Analyzes the stored security token, tells caller what
 * impersonation level would occur
 */

    HRESULT GetImpersonation ( [out] DWORD *a_Level ) ;

/*
 * Analyzes the stored security token, tells caller what
 * impersonation level would occur
 */

    HRESULT GetAuthentication ( [out] DWORD *a_Level ) ;

/*
 * Domain\user of the thread.security handle
 */

    HRESULT GetUser ( [in,out] ULONG *a_Size , [in,out] LPWSTR a_Buffer ) ;

/*
 *	Sid of the thread.security handle
 */

    HRESULT GetUserSid ( [in,out] ULONG *a_Size , [in,out] PSID a_Sid ) ;

/*
 * This is actually a PLUID, but LUID isn't defined in std idls yet
 */

    HRESULT GetAuthenticationLuid ( [out] LPVOID a_Luid ) ;

/*
 * Returns the 'real' thread token
 * Caller must call CloseHandle ().
 * return WBEM_E_NO_TOKEN if no token
 */

    HRESULT GetToken ( [out] HANDLE *a_ThreadToken ) ;
} ;

//***************************************************************************

[object, local, uuid(b19f2ce0-5df4-40e5-8b1d-dc5f3cf39d65)]
interface _IWmiCallSec : IUnknown
{

/*
 * Analyzes the calling thread, tells caller the
 * current impersonation level
 */

    HRESULT GetImpersonation ( [out] DWORD *a_Level ) ;

/*
 * Domain\user of the calling thread
 */

    HRESULT GetUser ( [in,out] ULONG *a_Size , [in,out] LPWSTR a_Buffer ) ;

/*
 *	Sid of the calling thread.
 */

    HRESULT GetUserSid ( [in,out] ULONG *a_Size , [in,out] PSID a_Sid ) ;

/*
 * This is actually a PLUID, but LUID isn't defined in std idls yet
 */

	HRESULT GetAuthenticationLuid ( [out] LPVOID a_Luid ) ;

/*
 *	Get or manufacture an internal thread security token
 */

	HRESULT GetThreadSecurity ( [in] WMI_THREAD_SECURITY_ORIGIN a_Origin , [out] _IWmiThreadSecHandle **a_ThreadSecurity ) ;

/*
 *	Set the current internal thread security.token
 */

	HRESULT SetThreadSecurity ( [in] _IWmiThreadSecHandle *a_ThreadSecurity ) ;

} ;

//***************************************************************************

[object,uuid(07435309-D440-41B7-83F3-EB82DB6C622F)]
interface _IWmiProviderHost : IUnknown
{
	HRESULT GetObject (

		[in] REFCLSID rclsid ,
		[in] long lFlags,
		[in] IWbemContext *pContext,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface
	) ;

	HRESULT GetProcessIdentifier ( [out] DWORD *a_ProcessIdentifier ) ;

} ;

//***************************************************************************

[object,uuid(21CD80A2-B305-4f37-9D4C-4534A8D9B568)]
interface _IWmiProviderFactory : IUnknown
{
    HRESULT GetHostedProvider (
        [in] long lFlags,
		[in] IWbemContext *pContext ,
		[in,unique] GUID *a_TransactionIdentifier,
		[in,string,unique] LPCWSTR pszUser,
        [in,string,unique] LPCWSTR pszLocale,
        [in,string,unique] LPCWSTR pPath,
        [in,string] LPCWSTR pName,
		[in] ULONG uHost,
        [in,string,unique] LPCWSTR pHostingGroup,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface
	    );

    HRESULT GetClassProvider (
        [in] long lFlags,
		[in] IWbemContext *pContext ,
		[in,string,unique] LPCWSTR pszUser,
        [in,string,unique] LPCWSTR pszLocale,
        [in,string] LPCWSTR pPath,
        [in] IWbemClassObject *pSuperclass,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface
	    );

    HRESULT GetProvider (

		[in] WmiInternalContext a_InternalContext ,
        [in] long lFlags,
		[in] IWbemContext *pContext ,
		[in,unique] GUID *a_TransactionIdentifier,
		[in,string,unique] LPCWSTR pszUser,
        [in,string,unique] LPCWSTR pszLocale,
        [in,string,unique] LPCWSTR pPath,
        [in,string] LPCWSTR pName,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface
	    );

	HRESULT GetDynamicPropertyResolver (
		[in] long lFlags,
		[in] IWbemContext *pContext,
		[in,string,unique] LPCWSTR pszUser,
        [in,string,unique] LPCWSTR pszLocale,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface
    	);

    HRESULT GetDecoupledProvider (
        [in] long lFlags,
		[in] IWbemContext *pContext ,
		[in,string,unique] LPCWSTR pszUser,
        [in,string,unique] LPCWSTR pszLocale,
        [in,string] LPCWSTR pPath,
        [in,string] LPCWSTR pName,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface
    );
};

[object, uuid(BAC6B661-167E-4957-AD77-286AB256585E)]
interface _IWmiDynamicPropertyResolver : IUnknown
{
    HRESULT Read(
		[in] IWbemContext *a_Context,
		[in] IWbemClassObject *a_Class,
		[in,out] IWbemClassObject **a_Instance
	    );

     HRESULT Write(
		[in] IWbemContext *a_Context,
        [in] IWbemClassObject *a_Class,
        [in] IWbemClassObject *a_Instance
    	);
} ;

[object,uuid(5fba5051-3124-4112-b723-46bfbaf1d622)]
interface _IWmiProviderInitialize : IUnknown
{
	HRESULT Initialize (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,unique] GUID *a_TransactionIdentifier,
		[in,string,unique] LPCWSTR a_User,
        [in,string,unique] LPCWSTR a_Locale,
		[in,string] LPCWSTR a_Namespace ,
		[in] IWbemServices *a_Repository ,
		[in,unique] IWbemServices *a_Service ,
		[in] IWbemProviderInitSink *a_InitializeSink
	) ;

	HRESULT WaitProvider (
	
		[in] IWbemContext *a_Context , 
		[in] ULONG a_Timeout
	) ;

	HRESULT GetInitializeResult () ;

	HRESULT IsPerUserInitialization ( [out] BOOL *a_Value ) ;

	HRESULT IsPerLocaleInitialization ( [out] BOOL *a_Value ) ;

	HRESULT GetHosting ( [out] ULONG *a_Value ) ;

	HRESULT GetHostingGroup ( [out,string] BSTR *a_Value ) ;

	HRESULT IsInternal ( [out] BOOL *a_Value ) ;
} ;

[object,uuid(b1b55910-8ba0-47a5-a16e-2b733b1d987c)]
interface _IWmiProviderStack : IUnknown
{
	HRESULT DownLevel (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in] REFIID riid,
		[out, iid_is(riid)] void **pInterface

	) ;
} ;

[object,uuid(06413D98-405C-4a5a-8D6F-19B8B7C6ACF7)]
interface _IWmiProviderFactoryInitialize : IUnknown
{
	HRESULT Initialize (

		[in,unique] _IWmiProvSS *a_SubSystem ,
		[in,unique] _IWmiProviderFactory *a_OuterFactory ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Namespace ,
		[in] IWbemServices *a_Repository ,
		[in,unique] IWbemServices *a_Service
	) ;
} ;

[object,uuid(fec1b0ac-5808-4033-a915-c0185934581e)]
interface _IWmiProviderSite : IUnknown
{
	HRESULT GetSite ( [out] DWORD *a_ProcessIdentifier ) ;

	HRESULT SetContainer ( [in,unique] IUnknown *a_Container ) ;
} ;

[object,uuid(eb658b8a-7a64-4ddc-9b8d-a92610db0206)]
interface _IWmiProviderQuota : IUnknown
{
	HRESULT Violation (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in] IWbemClassObject *a_Object	
	) ;
} ;

[object,uuid(48ff3109-a366-4b56-b340-01fae758ba64)]
interface _IWmiProviderAbnormalShutdown : IUnknown
{
	HRESULT AbnormalShutdown () ;
} ;

[object,uuid(f0e4edde-475a-498a-93d7-d4347f68a8f3)]
interface _IWmiProviderCache : IUnknown
{
	HRESULT Expel (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context
	) ;

	HRESULT ForceReload () ;
} ;

typedef enum
{
	WBEM_PROVIDER_CONFIGURATION_CLASS_ID_INSTANCE_PROVIDER_REGISTRATION = 0

} WBEM_PROVIDER_CONFIGURATION_CLASS_ID ;

typedef enum
{
	WBEM_PROVIDER_CONFIGURATION_PROPERTY_ID_EXTENDEDQUERY_SUPPORT = 0

} WBEM_PROVIDER_CONFIGURATION_PROPERTY_ID ;


[object,uuid(6b3fc272-bf37-4968-933a-6df9222a2607)]
interface _IWmiProviderConfiguration : IUnknown
{
	HRESULT Get (

		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Class ,
		[in,string] LPCWSTR a_Path ,
		[in] IWbemObjectSink *a_Sink
	) ;

	HRESULT Enumerate (

		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Class ,
		[in] IWbemObjectSink *a_Sink
	) ;

	HRESULT Set (

		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Provider ,
		[in,string] LPCWSTR a_Class ,
		[in,string] LPCWSTR a_Path ,
		[in] IWbemClassObject *a_OldObject ,
		[in] IWbemClassObject *a_NewObject
	) ;

	HRESULT Deleted (

		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Provider ,
		[in,string] LPCWSTR a_Class ,
		[in,string] LPCWSTR a_Path ,
		[in] IWbemClassObject *a_Object
	) ;

	HRESULT Shutdown (

		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Provider ,
		[in] ULONG a_MilliSeconds
	) ;

	HRESULT Call (

		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Class ,
		[in,string] LPCWSTR a_Path ,		
		[in,string] LPCWSTR a_Method,
		[in] IWbemClassObject *a_InParams,
		[in] IWbemObjectSink *a_Sink
	) ;

	HRESULT Query (

		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in] WBEM_PROVIDER_CONFIGURATION_CLASS_ID a_ClassIdentifier ,
		[in] WBEM_PROVIDER_CONFIGURATION_PROPERTY_ID a_PropertyIdentifer ,
		[in,out] VARIANT *a_Value
	) ;
} ;

[object,uuid(484e3ece-1f81-4591-b9d4-943ba13b609d)]
interface _IWmiProviderLoad : IUnknown
{
	HRESULT Unload (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context
	) ;

	HRESULT Load (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context
	) ;
}

[object,uuid(41aa40e6-2fba-4e80-ade9-34306567206d)]
interface _IWmiProviderSubsystemRegistrar : IUnknown
{
	HRESULT Register (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,unique] LPCWSTR a_User ,
		[in,unique] LPCWSTR a_Locale ,
		[in] LPCWSTR a_Scope ,
		[in] LPCWSTR a_Registration ,
		[in] DWORD a_ProcessIdentifier ,
		[in] IUnknown *a_Unknown ,
		[in] GUID a_Identity
	) ;

	HRESULT UnRegister (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,unique] LPCWSTR a_User ,
		[in,unique] LPCWSTR a_Locale ,
		[in] LPCWSTR a_Scope ,
		[in] LPCWSTR a_Registration ,
		[in] GUID a_Identity
	) ;	
} ;

//***************************************************************************
// This is obtained by a QI from IWbemContext

typedef enum
{
	WMI_CTX_ID_ORIGIN      = 1,
	WMI_CTX_CLIENT_TYPE    = 2,

}   WMI_CTX_ID_TYPE;

typedef enum
{
    // FOR WMI_CTX_ID_ORIGIN

    WMI_CTX_INF_ORIGINAL  = 1,
    WMI_CTX_INF_DEPENDENT = 2,
    WMI_CTX_INF_TASK_ID   = 3,

    // FOR WMI_CTX_ID_CLIENT_TYPE

    WMI_CTX_INF_CORE = 1,
    WMI_CTX_INF_INPROC_PROVIDER = 2,
    WMI_CTX_INF_REMOTE_PROVIDER = 3,
    WMI_CTX_INF_CLIENT = 4,
    WMI_CTX_INF_ESS = 5,
    WMI_CTX_INF_PROVSS = 6

}   WMI_CTX_INFO;

[object, uuid(1999cb72-c88d-40a3-a5aa-35eaed377e61)]

interface _IWmiContext : IUnknown
{
    HRESULT Set(
        [in] ULONG uID,
        [in] ULONG uValue
        );

    HRESULT Get(
        [in] ULONG uID,
        [out] ULONG *puValue
        );
};



//***************************************************************************


typedef enum
{
	WMI_HOOK_FLAG_ORIGINAL_OBJECT = 1,
    WMI_HOOK_FLAG_NEW_OBJECT = 2,

    WMI_CORE_FLAG_INSTANCE_HOOK     = 0x1,
    WMI_CORE_FLAG_CLASS_HOOK        = 0x2

}   WMI_HOOK_FLAG_TYPE;

// Hook status enum values
// Moved here from wbemcli.idl (RAID 278480).
typedef [v1_enum] enum tag_WBEMHOOKSTATUS 
{
	WBEM_S_NO_POSTHOOK              = 0x40011,
	WBEM_S_POSTHOOK_WITH_BOTH       = 0x40012,
	WBEM_S_POSTHOOK_WITH_NEW        = 0x40013,
	WBEM_S_POSTHOOK_WITH_STATUS     = 0x40014,
	WBEM_S_POSTHOOK_WITH_OLD        = 0x40015,
	WBEM_S_REDO_PREHOOK_WITH_ORIGINAL_OBJECT = 0x40016

}	WBEM_HOOK_STATUS;

[object, local, uuid(76cc24d6-e776-42bc-9a09-025920f4f486)]

interface _IWmiCoreWriteHook : IUnknown
{
    HRESULT PrePut(
        [in] long lFlags,               // WBEM_FLAG_INST_PUT, WBEM_FLAG_CLASS_PUT
        [in] long lUserFlags,           // Copy of flags in user API
        [in] IWbemContext *pCtx,        // Copy of context object, may be NULL
        [in] IWbemPath *pPath,          // Optional
        [in] LPCWSTR pszNamespace,      // Always present
        [in] LPCWSTR pszClass,          // Always present
        [in] _IWmiObject *pCopy         // Always present
        );
        // Return WBEM_E_VETO_PUT
        //        WBEM_S_POSTHOOK_WITH_STATUS
        //        WBEM_S_POSTHOOK_WITH_NEW
        //        WBEM_S_POSTHOOK_WITH_BOTH
        //        WBEM_S_NO_POSTHOOK

    HRESULT PostPut(
        [in]  long lFlags,              // WBEM_FLAG_INST_PUT, WBEM_FLAG_CLASS_PUT
        [in]  HRESULT hRes,             // Result of put
        [in]  IWbemContext *pCtx,       // Copy of context object, may be NULL
        [in] IWbemPath *pPath,          // Optional
        [in] LPCWSTR pszNamespace,      // Always present
        [in] LPCWSTR pszClass,          // Always present
        [in] _IWmiObject *pNew,         // New copy (based on return code of PrePut)
        [in] _IWmiObject *pOld          // Old (based on return code of PrePut)
        );
        // Must return WBEM_S_NO_ERROR

    HRESULT PreDelete(
        [in] long lFlags,
        [in] long lUserFlags,
        [in] IWbemContext *pCtx,
        [in] IWbemPath *pPath,           // Required
        [in] LPCWSTR pszNamespace,       // Required
        [in] LPCWSTR pszClass            // Required
        );
        // Return WBEM_E_VETO_DELETE
        //        WBEM_S_POSTHOOK_WITH_STATUS
        //        WBEM_S_POSTHOOK_WITH_OLD
        //        WBEM_S_NO_POSTHOOK

    HRESULT PostDelete(
        [in] long lFlags,              // WBEM_FLAG_CLASS_DELETE, WBEM_FLAG_INST_DELETE
        [in] HRESULT hRes,             // Result of put
        [in] IWbemContext *pCtx,
        [in] IWbemPath *pPath,           // Required
        [in] LPCWSTR pszNamespace,       // Required
        [in] LPCWSTR pszClass,           // Required
        [in] _IWmiObject *pOld           // Based on return of PreDelete
        );
        // Must return WBEM_S_NO_ERROR
};


//***************************************************************************
//

[object, local, uuid(69a4735b-6328-436b-8d7f-0a641559c585)]

interface _IWmiQuery : IWbemQuery
{
    HRESULT Dump([in] LPSTR pszFile);
};


//***************************************************************************
//
//





[restricted, object, local,uuid(43F684C8-3A13-4fab-89D8-D47C60F83715)]
interface _IWmiArbitratee : IUnknown
{
	HRESULT SetOperationResult(
		[in] ULONG uFlags,
		[in] HRESULT hRes
		);

	HRESULT SetTaskHandle(
		[in] _IWmiCoreHandle *phTask
		);

	HRESULT DumpDebugInfo(
		[in] ULONG uFlags,
		[in] const BSTR strFile
		);
};


//***************************************************************************
//
//

[restricted, object, local,uuid(41074D24-7C24-4c4b-B8E8-94DA3466FCCD)]
interface _IWmiArbitratedQuery : IUnknown
{
	HRESULT IsMerger( void );
};


typedef enum tag_WMIARB_FLAG_TYPE
{
    WMIARB_REQUEST_NULL         = 0x0,
    WMIARB_REQUEST_CONTINUATION = 0x1,
    WMIARB_REQUEST_APPROVAL     = 0x2,
	WMIARB_CALL_CANCELLED_CLIENT = 0x4,
	WMIARB_CALL_CANCELLED_THROTTLING	= 0x8

}   WMIARB_FLAG_TYPE;




[restricted, object, local,uuid(f99a3ec1-8329-4d03-ab7a-797410bcc98e)]

interface _IWmiArbitrator : IUnknown
{
    HRESULT RegisterTask(
        [in] _IWmiCoreHandle *phTask
        );

    HRESULT UnregisterTask(
        [in] _IWmiCoreHandle *phTask
        );

    HRESULT RegisterUser(
        [in] _IWmiCoreHandle *phUser
        );

    HRESULT UnregisterUser(
        [in] _IWmiCoreHandle *phUser
        );

    HRESULT CheckTask(
        [in] ULONG uFlags,
        [in] _IWmiCoreHandle *phTask
        );

    HRESULT TaskStateChange(
        [in] ULONG uNewState,               // Duplicate of the state in the task handle itself
        [in] _IWmiCoreHandle *phTask
        );

    HRESULT CancelTasksBySink(
        [in] ULONG uFlags,
        [in] REFIID riid,
        [in, iid_is(riid)] LPVOID pSink        // IWbemObjectSink or IWbemObjectSinkEx
        );

    HRESULT CheckThread(
        [in] ULONG uFlags
        );

    HRESULT CheckUser(
        [in] ULONG uFlags,
        [in] _IWmiUserHandle *phUser
        );

    HRESULT CancelTask(
        [in] ULONG uFlags,
        [in] _IWmiCoreHandle *phTtask
        );

    HRESULT RegisterThreadForTask(
        [in] _IWmiCoreHandle *phTask
        );

    HRESULT UnregisterThreadForTask(
        [in] _IWmiCoreHandle *phTask
        );

    HRESULT Maintenance();

    HRESULT RegisterFinalizer(
        [in] ULONG uFlags,
        [in] _IWmiCoreHandle *phTask,
        [in] _IWmiFinalizer *pFinal
        );


    HRESULT RegisterNamespace(
        [in] _IWmiCoreHandle *phNamespace
        );

    HRESULT UnregisterNamespace(
        [in] _IWmiCoreHandle *phNamespace
        );

    HRESULT ReportMemoryUsage(
        [in] ULONG uFlags,
		[in] LONG  lDelta,
        [in] _IWmiCoreHandle *phTask
        );

	HRESULT Throttle(
		[in] ULONG uFlags,
		[in] _IWmiCoreHandle *phTask
		);

	HRESULT RegisterArbitratee(
		[in] ULONG uFlags,
		[in] _IWmiCoreHandle *phTask,
		[in] _IWmiArbitratee *pArbitratee
		);
	
	HRESULT UnRegisterArbitratee(
		[in] ULONG uFlags,
		[in] _IWmiCoreHandle *phTask,
		[in] _IWmiArbitratee *pArbitratee
		);


//    HRESULT Shutdown();
};







//Valid values for the _IWmiFinalizer::Configure uConfigID parameter
typedef enum
{
	WMI_FNLZR_FLAG_FAST_TRACK = 0,
	WMI_FNLZR_FLAG_DECOUPLED = 1,
    WMI_FNLZR_FLAG_CANCEL = 2
} WMI_FNLZR_CFG_TYPE;

//Values used in the _IWmiFinalizer::SetResultObject uFlags parameter

typedef enum
{
	WMI_FNLZR_UNARY_OBJECT = 0,
	WMI_FNLZR_RESULT_SET_OBJECT = 1,
	WMI_FNLZR_STATUS_OBJECT = 2,
	WMI_FNLZE_SET_OBJECT = 3		//Internal to the finalizer. Takes an IWbemObjectSinkEx::Set parameters

} WMI_FNLZE_RESULT_TYPE;

typedef enum
{
    WMI_FNLZR_STATE_NO_INPUT = 0,          // No Indicate() or SetStatus() calls so far
    WMI_FNLZR_STATE_ACTIVE   = 1,          // At least one Indicate() so far
    WMI_FNLZR_STATE_CORE_COMPLETE = 2,     // SetStatus was received, but not finished delivering to client
    WMI_FNLZR_STATE_CLIENT_COMPLETE = 3,   // Final SetStatus delivered to client
    WMI_FNLZR_STATE_CLIENT_DEAD = 4,       // Client not responding, considered dead
    WMI_FNLZR_STATE_PREMATURE_RELEASE = 5, // Internal Release() with no SetStatus()
    WMI_FNLZR_STATE_CANCELED = 6           // Explicitly canceled
}   WMI_FNLZR_INTERNAL_STATE;




[restricted, object, local,uuid(fe4e94e6-7f40-4447-8240-f154412d9cd6)]
interface _IWmiFinalizer : IUnknown
{
    // Also, implements IWbemShutdown

    HRESULT Configure(
        [in] ULONG uFlags,
        [in] ULONG uValue
        );
        // At construct-time
        // Allows decoupled & fast-track configuration with no thread switches

    HRESULT SetTaskHandle(
        [in] _IWmiCoreHandle *phTask
        );
        // Task handle has user-specific stuff.  Finalizer just
        // passes this through to _IWmiArbitrator::CheckTask

    HRESULT SetDestinationSink(
        [in] ULONG uFlags,
        [in] REFIID riid,
        [in, iid_is(riid)] LPVOID pSink
        );
        // Supports one of  IID_IWbemObjectSink or IID_IWbemObjectSinkEx

    HRESULT SetSelfDestructCallback(
        [in] ULONG uFlags,
        [in] IWbemObjectSinkEx *pSink
        );
        // The callback called during final Release(); Set() is called with the task handle, followed by SetStatus()
        //

    HRESULT GetStatus(
        [out] ULONG* pFlags
        );

    HRESULT NewInboundSink(
        [in]  ULONG uFlags,
        [out] IWbemObjectSinkEx **pSink
        );

    HRESULT Merge(
        [in] ULONG uFlags,
        [in] REFIID riid,
        [in] LPVOID pObj
        );
        // Allows merging another Finalizer, _IWmiCache, etc.
        // For sorting, we will create a sorted _IWmiCache and merge it in later when
        // the sort is completed.

    // For setting, getting objects

    HRESULT SetResultObject(
        [in] ULONG uFlags,
        [in] REFIID riid,
        [in] LPVOID pObj
        );

    HRESULT GetResultObject(
        [in] ULONG uFlags,
        [in] REFIID riid,
        [out, iid_is(riid)] LPVOID *pObj
        );
        // Support _IWmiObject, IWbemClassObject, etc.
        // IEnumWbemClassObject
        // _IWmiCache

    // For status-only operations

    HRESULT SetOperationResult(
        [in] ULONG uFlags,
        [in] HRESULT hRes
        );

    HRESULT GetOperationResult(
        [in] ULONG uFlags,
		[in] ULONG uTimeout,
        [out] HRESULT *phRes
        );

	HRESULT CancelTask (
        [in] ULONG uFlags
        );
};


//***************************************************************************
//
//

typedef enum
{
	WMICACHE_CFG_MAX_DISKSPACE  = 1,
	WMICACHE_CFG_MAX_MEMORY     = 2,
  	WMICACHE_CFG_MAX_AGESECONDS = 3,
}   WMICACHE_CFG_TYPE;


[restricted, object, local, uuid(a784eb18-cf32-49c7-893a-d9889d234cdb)]
interface _IWmiCache : IUnknown
{
    HRESULT SetConfigValue(
        [in] ULONG uID,
        [in] ULONG uValue
        );

    HRESULT GetConfigValue(
        [in] ULONG uID,
        [in] ULONG *puValue
        );

    HRESULT Empty(
        [in] ULONG uFlags,
        [in] LPCWSTR pszClass
        );

    HRESULT AddObject(
        [in] ULONG uFlags,
        [in] _IWmiObject *pObj
        );
        // Also subsumes replace functionality
        //
        // __PATH Property is used as a real key

    HRESULT DeleteByPath(
        [in] ULONG uFlags,
        [in] LPCWSTR pszPath
        );

    HRESULT DeleteByPointer(
        [in] ULONG uFlags,
        [in] _IWmiObject *pTarget
        );

    /////////////////

    HRESULT GetByPath(
        [in] ULONG uFlags,
        [in] LPCWSTR pszFullPath,
        [out] _IWmiObject **pObj
        );

    HRESULT BeginEnum(
        [in] ULONG uFlags,
        [in] LPCWSTR pszFilter
        );
        // Filters: uFlags==0==all, uFlags==WMICACHE_CLASS_SHALLOW, WMICACHE_CLASS_DEEP

    HRESULT Next(
        [in] ULONG uBufSize,
        [out, size_is(uBufSize), length_is(*puReturned)] _IWmiObject **pObjects,
        [out] ULONG *puReturned
        );
};


//***************************************************************************
//
//

typedef enum
{
    WMICORE_FLAG_REPOSITORY         = 0x1,
    WMICORE_FLAG_SECURITY           = 0x2,
    WMICORE_FLAG_CLASS_PROVIDERS    = 0x4,
    WMICORE_FLAG_INST_PROVIDERS     = 0x8,
    WMICORE_FLAG_PROP_PROVIDERS     = 0x10,
    WMICORE_FLAG_ESS_DELIVERY       = 0x20,
    WMICORE_FLAG_FULL_SERVICES      = 0xFE,     // DONT INCLUDE WMICORE_FLAG_REPOSITORY since
                                                // that seriously limits the usefullness.

    WMICORE_CLIENT_TYPE_SYSTEM      = 0x1000,
    WMICORE_CLIENT_TYPE_PROVSS      = 0x2000,
    WMICORE_CLIENT_TYPE_ESS         = 0x4000,
    WMICORE_CLIENT_TYPE_USER        = 0x8000,
    WMICORE_CLIENT_TYPE_PROVIDER    = 0x10000,
    WMICORE_CLIENT_TYPE_ALT_TRANSPORT = 0x100000,    // used for authenticated login.

    WMICORE_CLIENT_ORIGIN_INPROC    = 0x20000,
    WMICORE_CLIENT_ORIGIN_LOCAL     = 0x40000,
    WMICORE_CLIENT_ORIGIN_REMOTE    = 0x80000,

    WMICORE_FLAG_SETUP_MODE         = 0x80000000,

}   WMICORE_FLAG_TYPE;



[restricted, object, local, uuid(5fc92893-a9be-475f-bf9e-cf50eea1c958)]

interface _IWmiCoreServices : IUnknown
{
    HRESULT GetObjFactory(
        [in]  long lFlags,
        [out] _IWmiObjectFactory **pFact
        );

    HRESULT GetServices(
        [in,string] LPCWSTR pszNamespace,
        [in,string,unique] LPCWSTR pszUser,
        [in,string,unique] LPCWSTR pszLocale,
        [in] long lFlags,
        [in]  REFIID riid,
        [out, iid_is(riid)] void **pServices
        );
        // lFlags == WMI_CORE_FLAG_REPOSITORY
        // lFlags == WMI_CORE_FLAG_ADMIN_ONLY
        // lFlags == WMI_CORE_FLAG_INST_PROVIDERS
        // lFlags == WMI_CORE_FLAG_CLASS_PROVIDERS
        // lFlags == WMI_CORE_FLAG_PROP_PROVIDERS
        // lFlags == WMI_CORE_FLAG_ALL_PROVIDERS

    HRESULT GetRepositoryDriver(
        [in]  long lFlags,
        [in]  REFIID riid,
        [out, iid_is(riid)] void **pDriver
        );

    HRESULT GetCallSec(
        [in] long lFlags,
        [out] _IWmiCallSec **pCallSec
        );

    HRESULT GetProviderSubsystem(
        [in] long lFlags,
        [out] _IWmiProvSS **pProvSS
        );

    HRESULT StopEventDelivery();
    HRESULT StartEventDelivery();

    HRESULT DeliverIntrinsicEvent(
        [in] LPCWSTR pszNamespace,              // Normalized to \\.\ns1\n2... etc.
        [in] ULONG uType,                       // WBEM_EVENTTYPE_ const
        [in] IWbemContext *pCtx,                // If available
        [in] LPCWSTR pszParam,                  // Required: Class name, or new namespace name (isolated name, not path)
        [in] LPCWSTR pszTransGuid,              // GUID in string form transaction, NULL if not in a transaction
        [in] ULONG uObjectCount,
        [in] _IWmiObject **ppObjList            // Target Object [in modification events [0]=new object, [1]=old object
        );

    HRESULT DeliverExtrinsicEvent(
        [in] LPCWSTR pszNamespace,
        [in] ULONG uFlags,
        [in] IWbemContext *pCtx,
        [in] _IWmiObject *pEvt
        );

    HRESULT IncrementCounter(
	    [in] ULONG uID,
	    [in] ULONG uParam
	    );

    HRESULT DecrementCounter(
	    [in] ULONG uID,
	    [in] ULONG uParam
	    );

    HRESULT SetCounter(
	    [in] ULONG uID,
	    [in] ULONG uParam
	    );

    HRESULT GetSelfInstInstances(
	    [in] LPCWSTR pszClass,
	    [in] IWbemObjectSink *pSink
	    );

    HRESULT GetSystemObjects(
	    [in]  ULONG lFlags,		// see tag_WBEM_GET_SYSTEM_OBJECTS_FLAG for values
	    [out] ULONG * puArraySize,
	    [out] _IWmiObject **pObjects		// Avoid an enumerator; just return an array
	    );

    HRESULT GetSystemClass(
       [in] LPCWSTR pszClassName,
       [out] _IWmiObject **pClassDef
       );

    HRESULT GetConfigObject(
	    ULONG uID,			// Integer-based path;
	    [out] _IWmiObject **pCfgObject
	    );

    HRESULT RegisterWriteHook(
        [in] ULONG uFlags,                  // WMI_CORE_FLAG_INSTANCE_HOOK | WMI_CORE_FLAG_CLASS_HOOK
        [in] _IWmiCoreWriteHook *pHook
        );

    HRESULT UnregisterWriteHook(
        [in] _IWmiCoreWriteHook *pHook
        );

    HRESULT CreateCache(
        [in] ULONG uFlags,
        [out] _IWmiCache **pCache
        );

    HRESULT CreateFinalizer(
        [in] ULONG uFlags,
        [out] _IWmiFinalizer **pFinalizer
        );

    HRESULT CreatePathParser(
        [in] ULONG uFlags,
        [out] IWbemPath **pParser
        );

    HRESULT CreateQueryParser(
        [in] ULONG uFlags,
        [out] _IWmiQuery **pQuery
        );

    HRESULT GetDecorator(
        [in] ULONG uFlags,
        [out] IWbemDecorator **pDec
        );

    HRESULT GetServices2(
        [in]  LPCWSTR pszPath,
        [in]  LPCWSTR pszUser,
        [in]  IWbemContext *pCtx,
        [in]  ULONG uClientFlags,           // Copy of client's flags
        [in]  DWORD dwSecFlags,
        [in]  DWORD dwPermissions,
        [in]  ULONG uInternalFlags,         // One or more WMICORE_CLIENT_TYPE flags
        [in]  LPCWSTR pszClientMachine,
        [in]  DWORD dwClientProcessID,
        [in]  REFIID riid,
        [out, iid_is(riid)] void **pServices
        );

    HRESULT GetConnector(
        [in]  ULONG uFlags,               // see WBEM_CONNECTION_TYPE
        [out] IWbemConnection **pConnect
        );

    HRESULT NewPerTaskHook(
        [out] _IWmiCoreWriteHook **pHook
        );

    HRESULT GetArbitrator(
        [out] _IWmiArbitrator **pArb
        );

    HRESULT InitRefresherMgr(
        [in] long lFlags
        );

};

//***************************************************************************

[restricted, object, local, uuid(7698dab9-9327-4fce-8b0d-3a276cf2d6e3)]
interface _IWmiDecorator : IUnknown
{
    HRESULT DecorateObject(
        [in] LPCWSTR pszServer,         // can be NULL
        [in] LPCWSTR pszScopePrefix,
        [in] LONG lFlags,               // Use local machine name, use dot, etc.
        [in] _IWmiObject *pObj
        );
        // Unresolved:  How do we decorate scoped objects?

    HRESULT UndecorateObject(
        [in] _IWmiObject *pObj
        );
};



//***************************************************************************


[object, local, restricted, uuid(6603d042-e217-45d7-b706-b07ec7c06490)]
interface IWbemToken : IUnknown
{
    HRESULT AccessCheck(
                [in] DWORD dwDesiredAccess,
                [in] const byte* pSD,
                [out] DWORD* pdwGrantedAccess);
};

[object, local, restricted, uuid(b1eb126b-4a5e-4848-9e6a-5a513dc7f57a)]
interface IWbemTokenCache : IUnknown
{
    HRESULT GetToken(
                [in] const byte* pSid,
                [out] IWbemToken** ppToken);
    HRESULT Shutdown();
};

//***************************************************************************

[object, local, restricted, uuid(ac062f20-9935-4aae-98eb-0532fb17147a)]

interface _IWmiCoreHandle : IUnknown
{
    HRESULT GetHandleType([out] ULONG *puType);
};

//***************************************************************************


//***************************************************************************

[restricted, object, uuid(B60EF4F1-A411-462b-B51E-477CBDBB90B4)]
interface _IWbemRefresherMgr : IUnknown
{
	HRESULT AddObjectToRefresher(
		[in] IWbemServices* pNamespace,
		[in] LPCWSTR pwszServerName,
		[in] LPCWSTR pwszNamespace,
		[in] IWbemClassObject* pClassObject,
		[in] WBEM_REFRESHER_ID* pDestRefresherId,
        [in] IWbemClassObject* pInstTemplate,
		[in] long lFlags,
		[in] IWbemContext* pContext,
		[in] IUnknown* pLockMgr,
        [out] WBEM_REFRESH_INFO* pInfo
		);

	HRESULT AddEnumToRefresher(
		[in] IWbemServices* pNamespace,
		[in] LPCWSTR pwszServerName,
		[in] LPCWSTR pwszNamespace,
		[in] IWbemClassObject* pClassObject,
		[in] WBEM_REFRESHER_ID* pDestRefresherId,
        [in] IWbemClassObject* pInstTemplate,
		[in] LPCWSTR wszClass,
		[in] long lFlags,
		[in] IWbemContext* pContext,
		[in] IUnknown* pLockMgr,
        [out] WBEM_REFRESH_INFO* pInfo
		);

	HRESULT GetRemoteRefresher(
		[in] WBEM_REFRESHER_ID* pRefresherId,
		[in] long lFlags,
		[in] BOOL fAddRefresher,
		[out] IWbemRemoteRefresher** ppRemRefresher,
		[in] IUnknown* pLockMgr,
		[out] GUID* pGuid
		);

	HRESULT Startup(
		[in] long lFlags,
	    [in] IWbemContext *pCtx,
		[in] _IWmiProvSS *pProvSS
		);

	HRESULT LoadProvider(
		[in] IWbemServices* pNamespace,
		[in, string] LPCWSTR pwszProviderName,
		[in, string] LPCWSTR pwszNamespace,
		[in] IWbemContext * pContext,
		[out] IWbemHiPerfProvider** ppProv,
		[out] _IWmiProviderStack** ppProvStack );
};

[restricted, object, uuid(6963B029-B969-40aa-9180-2B2F84075973)]
interface _IWbemFetchRefresherMgr : IUnknown
{
	HRESULT Get( [out] _IWbemRefresherMgr** ppMgr );
	HRESULT Init(
		[in] _IWmiProvSS* pProvSS,
		[in] IWbemServices* pSvc );
	HRESULT Uninit();
};

//***************************************************************************

//***************************************************************************

[restricted, object, uuid(25411283-46FC-4326-8DF2-FF5D34B2DFEF)]
interface _IWbemConfigureRefreshingSvcs : IUnknown
{
    HRESULT SetServiceData(
		[in] BSTR pwszMachineName,
		[in] BSTR pwszNamespace
		);
};

[restricted, local, object, uuid(368732C2-80D8-403e-854B-1B2BAFB9842C)]
interface _IWbemEnumMarshaling : IUnknown
{
    HRESULT GetMarshalPacket(
		[in] REFGUID proxyGUID,
		[in] ULONG uCount,
        [in, size_is(uCount), length_is(uCount)]
            IWbemClassObject** apObjects,
		[out] ULONG* pdwBuffSize,
		[out, size_is(,*pdwBuffSize)] byte** pBuffer
		);
};

//***************************************************************************

//***************************************************************************

[object, uuid(6919dd07-1637-4611-a8a7-c16fac5b2d53)]
interface Internal_IWbemProviderInit : IUnknown
{
    HRESULT Internal_Initialize (

		[in] WmiInternalContext a_InternalContext ,
        [in, unique, string] LPWSTR wszUser,
        [in] LONG lFlags,
        [in, string] LPWSTR wszNamespace,
        [in, unique, string] LPWSTR wszLocale,
        [in] IWbemServices* pNamespace,
        [in] IWbemContext* pCtx,
        [in] IWbemProviderInitSink* pInitSink    
		) ;
};

[restricted, object, uuid(2b322b6e-a9df-44e3-97bf-259e3583fda4)]
interface Internal_IWbemProviderIdentity : IUnknown
{
    HRESULT Internal_SetRegistrationObject(

		[in] WmiInternalContext a_InternalContext ,
		[in] long lFlags,
        [in] IWbemClassObject* pProvReg);
};

[object, uuid(f50a28cf-5c9c-4f7e-9d80-e25e16e18c59)]
interface Internal_IWbemServices : IUnknown
{
    // Context.
    // ========
    HRESULT Internal_OpenNamespace (

		[in] WmiInternalContext a_InternalContext ,
        [in]  const BSTR strNamespace,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemServices** ppWorkingNamespace,
        [out, OPTIONAL] IWbemCallResult** ppResult
        );

    HRESULT Internal_CancelAsyncCall(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemObjectSink* pSink
        );

    HRESULT Internal_QueryObjectSink(

		[in] WmiInternalContext a_InternalContext ,
        [in] long lFlags,
        [out] IWbemObjectSink** ppResponseHandler
        );

    // Classes and instances.
    // ======================

    HRESULT Internal_GetObject(

		[in] WmiInternalContext a_InternalContext ,
        [in]  const BSTR strObjectPath,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemClassObject** ppObject,
        [out, OPTIONAL] IWbemCallResult** ppCallResult
        );

    HRESULT Internal_GetObjectAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in]  const BSTR strObjectPath,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [in]  IWbemObjectSink* pResponseHandler
        );

    // Class manipulation.
    // ===================

    HRESULT Internal_PutClass(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemClassObject* pObject,
        [in] long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResult** ppCallResult
        );

    HRESULT Internal_PutClassAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemClassObject* pObject,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );

    HRESULT Internal_DeleteClass(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strClass,
        [in] long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResult** ppCallResult
        );

    HRESULT Internal_DeleteClassAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strClass,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );

    HRESULT Internal_CreateClassEnum(

		[in] WmiInternalContext a_InternalContext ,
        [in]  const BSTR strSuperclass,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out] IEnumWbemClassObject** ppEnum
        );

    HRESULT Internal_CreateClassEnumAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in]  const BSTR strSuperclass,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [in]  IWbemObjectSink* pResponseHandler
        );

    // Instances.
    // ==========

    HRESULT Internal_PutInstance(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemClassObject* pInst,
        [in] long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResult** ppCallResult
        );

    HRESULT Internal_PutInstanceAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemClassObject* pInst,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );

    HRESULT Internal_DeleteInstance(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strObjectPath,
        [in] long lFlags,
        [in]  IWbemContext* pCtx,
        [out, OPTIONAL] IWbemCallResult** ppCallResult
        );

    HRESULT Internal_DeleteInstanceAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strObjectPath,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );

    HRESULT Internal_CreateInstanceEnum(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strFilter,          // allow more things than a class name
        [in] long lFlags,
        [in]  IWbemContext* pCtx,
        [out] IEnumWbemClassObject** ppEnum
        );

    HRESULT Internal_CreateInstanceEnumAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strFilter,          // allow more things than a class name
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );

    // Queries.
    // ========

    HRESULT Internal_ExecQuery(

		[in] WmiInternalContext a_InternalContext ,
        [in]  const BSTR strQueryLanguage,
        [in]  const BSTR strQuery,
        [in]  long lFlags,
        [in]  IWbemContext* pCtx,
        [out] IEnumWbemClassObject** ppEnum
        );

    HRESULT Internal_ExecQueryAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strQueryLanguage,
        [in] const BSTR strQuery,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );


    HRESULT Internal_ExecNotificationQuery(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strQueryLanguage,
        [in] const BSTR strQuery,
        [in] long lFlags,
        [in]  IWbemContext* pCtx,
        [out] IEnumWbemClassObject** ppEnum
        );

    HRESULT Internal_ExecNotificationQueryAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strQueryLanguage,
        [in] const BSTR strQuery,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemObjectSink* pResponseHandler
        );

    // Methods
    // =======

    HRESULT Internal_ExecMethod(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strObjectPath,
        [in] const BSTR strMethodName,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemClassObject* pInParams,
        [out, OPTIONAL] IWbemClassObject** ppOutParams,
        [out, OPTIONAL] IWbemCallResult** ppCallResult
        );

    HRESULT Internal_ExecMethodAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in] const BSTR strObjectPath,
        [in] const BSTR strMethodName,
        [in] long lFlags,
        [in] IWbemContext* pCtx,
        [in] IWbemClassObject* pInParams,
        [in] IWbemObjectSink* pResponseHandler
        );
};


//***************************************************************************

//***************************************************************************

[object,uuid(2db9fa90-9973-46cf-b310-9865b644699d)]
interface Internal_IWbemObjectSink : IUnknown
{
    HRESULT Internal_Indicate(

		[in] WmiInternalContext a_InternalContext ,
        [in] long lObjectCount,
        [in, size_is(lObjectCount)]
            IWbemClassObject** apObjArray
        );


    HRESULT Internal_SetStatus(

		[in] WmiInternalContext a_InternalContext ,
        [in] long lFlags,
        [in] HRESULT hResult,
        [in] BSTR strParam,
        [in] IWbemClassObject* pObjParam
        );

};

//***************************************************************************

//***************************************************************************

[object,uuid(ac9ea02a-2c8a-4acd-b562-d7e8ebee8e8e)]
interface Internal_IEnumWbemClassObject : IUnknown
{
    HRESULT Internal_Reset(
	
		[in] WmiInternalContext a_InternalContext
	);

    HRESULT Internal_Next(

		[in] WmiInternalContext a_InternalContext ,
        [in]  long lTimeout,
        [in]  ULONG uCount,
        [out, size_is(uCount), length_is(*puReturned)]
            IWbemClassObject** apObjects,
        [out] ULONG* puReturned
        );

    HRESULT Internal_NextAsync(

		[in] WmiInternalContext a_InternalContext ,
        [in]  ULONG uCount,
        [in]  IWbemObjectSink* pSink
        );

    HRESULT Internal_Clone(

		[in] WmiInternalContext a_InternalContext ,
        [out] IEnumWbemClassObject** ppEnum
        );

    HRESULT Internal_Skip(

		[in] WmiInternalContext a_InternalContext ,
        [in]  long lTimeout,
        [in] ULONG nCount
        );
};

//***************************************************************************

//***************************************************************************

[object,uuid(e1cbff9f-4db9-4264-80d1-13ec5d091fd0)]
interface Internal_IWbemCallResult : IUnknown
{
    HRESULT Internal_GetResultObject(

		[in] WmiInternalContext a_InternalContext ,
        [in]  long lTimeout,
        [out] IWbemClassObject** ppResultObject
        );

    HRESULT Internal_GetResultString(

		[in] WmiInternalContext a_InternalContext ,
        [in]  long lTimeout,
        [out] BSTR* pstrResultString
        );

    HRESULT Internal_GetResultServices(

		[in] WmiInternalContext a_InternalContext ,
        [in]  long lTimeout,
        [out] IWbemServices** ppServices
        );

    HRESULT Internal_GetCallStatus(

		[in] WmiInternalContext a_InternalContext ,
        [in]  long lTimeout,
        [out] long* plStatus
        );
};

//***************************************************************************

//***************************************************************************

[object,uuid(11caa957-4e80-474e-a819-7fd72148ada9)]
interface Internal_IWbemPropertyProvider : IUnknown
{
    HRESULT Internal_GetProperty(

		[in] WmiInternalContext a_InternalContext ,
        [in] long lFlags,
        [in] const BSTR strLocale,
        [in] const BSTR strClassMapping,
        [in] const BSTR strInstMapping,
        [in] const BSTR strPropMapping,
        [out] VARIANT* pvValue
        );
        
    HRESULT Internal_PutProperty(

		[in] WmiInternalContext a_InternalContext ,
        [in] long lFlags,
        [in] const BSTR strLocale,
        [in] const BSTR strClassMapping,
        [in] const BSTR strInstMapping,
        [in] const BSTR strPropMapping,
        [in] const VARIANT* pvValue
        );        
};

//***************************************************************************

//***************************************************************************

[object,uuid(fd450835-cf1b-4c87-9fd2-5e0d42fde081)]
interface Internal_IWbemEventProvider : IUnknown
{
    HRESULT Internal_ProvideEvents(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemObjectSink* pSink,
        [in] long lFlags
        );
};

//***************************************************************************

//***************************************************************************

[object,uuid(df2373f5-efb2-475c-ad58-3102d61967d4)]
interface Internal_IWbemEventProviderSecurity : IUnknown
{
    HRESULT Internal_AccessCheck(

		[in] WmiInternalContext a_InternalContext ,
        [in] WBEM_CWSTR wszQueryLanguage,
        [in] WBEM_CWSTR wszQuery,
        [in] long lSidLength,
        [in, size_is(lSidLength), unique] const BYTE* pSid
		);
};

//***************************************************************************

//***************************************************************************

[object,uuid(854d745c-6742-42c0-8bb9-01ec466b6e87)]
interface Internal_IWbemEventConsumerProvider : IUnknown
{
     HRESULT Internal_FindConsumer(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemClassObject* pLogicalConsumer,
        [out] IWbemUnboundObjectSink** ppConsumer
		);
};

//***************************************************************************

//***************************************************************************

[object,uuid(88f3781c-6902-4647-9a6b-a74f450af861)]
interface Internal_IWbemEventConsumerProviderEx : Internal_IWbemEventConsumerProvider
{
    HRESULT Internal_ValidateSubscription(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemClassObject* pLogicalConsumer
		);
};

//***************************************************************************

//***************************************************************************

[object,uuid(8a0dc377-a9d3-41cb-bd69-ae1fdaf2dc68)]
interface Internal_IWbemEventProviderQuerySink : IUnknown
{
    HRESULT Internal_NewQuery(

		[in] WmiInternalContext a_InternalContext ,
		[in] unsigned long dwId,
		[in] WBEM_WSTR wszQueryLanguage,
		[in] WBEM_WSTR wszQuery
		);

    HRESULT Internal_CancelQuery(

		[in] WmiInternalContext a_InternalContext ,
		[in] unsigned long dwId
		);
};

//***************************************************************************

//***************************************************************************

[object,uuid(a210bfe9-c9f7-4919-b114-0d98b3d5341e)]
interface Internal_IWbemUnboundObjectSink : IUnknown
{
    HRESULT Internal_IndicateToConsumer(

		[in] WmiInternalContext a_InternalContext ,
        [in] IWbemClassObject* pLogicalConsumer,
        [in] long lNumObjects,
        [in, size_is(lNumObjects)] IWbemClassObject** apObjects
		);
};

//***************************************************************************

//***************************************************************************

[object,uuid(0fc8c622-1728-4149-a57f-ad19d0970710)]
interface Internal_IWmiProviderConfiguration : IUnknown
{
	HRESULT Internal_Get (

		[in] WmiInternalContext a_InternalContext ,
		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Class ,
		[in,string] LPCWSTR a_Path ,
		[in] IWbemObjectSink *a_Sink
	) ;

	HRESULT Internal_Enumerate (

		[in] WmiInternalContext a_InternalContext ,
		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Class ,
		[in] IWbemObjectSink *a_Sink
	) ;

	HRESULT Internal_Set (

		[in] WmiInternalContext a_InternalContext ,
		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Provider ,
		[in,string] LPCWSTR a_Class ,
		[in,string] LPCWSTR a_Path ,
		[in] IWbemClassObject *a_OldObject ,
		[in] IWbemClassObject *a_NewObject
	) ;

	HRESULT Internal_Deleted (

		[in] WmiInternalContext a_InternalContext ,
		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Provider ,
		[in,string] LPCWSTR a_Class ,
		[in,string] LPCWSTR a_Path ,
		[in] IWbemClassObject *a_Object
	) ;

	HRESULT Internal_Shutdown (

		[in] WmiInternalContext a_InternalContext ,
		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Provider ,
		[in] ULONG a_MilliSeconds
	) ;

	HRESULT Internal_Call (

		[in] WmiInternalContext a_InternalContext ,
		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in,string] LPCWSTR a_Class ,
		[in,string] LPCWSTR a_Path ,		
		[in,string] LPCWSTR a_Method,
		[in] IWbemClassObject *a_InParams,
		[in] IWbemObjectSink *a_Sink
	) ;

	HRESULT Internal_Query (

		[in] WmiInternalContext a_InternalContext ,
		[in,unique] IWbemServices *a_Service ,
		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in] WBEM_PROVIDER_CONFIGURATION_CLASS_ID a_ClassIdentifier ,
		[in] WBEM_PROVIDER_CONFIGURATION_PROPERTY_ID a_PropertyIdentifer ,
		[in,out] VARIANT *a_Value
	) ;
} ;

//***************************************************************************

//***************************************************************************

[object,uuid(E7174AED-B55B-42f9-B322-D79F49921012)]
interface _IWmiProviderAssociatorsHelper : IUnknown
{
	HRESULT GetReferencesClasses (

		[in] long a_Flags ,
		[in] IWbemContext *a_Context ,
		[in] IWbemObjectSink *a_Sink
	) ;
} ;


//***************************************************************************

//***************************************************************************


[uuid(027947f3-d731-11ce-a357-000000000001)]
library WbemInternal_v1
{
    importlib("stdole32.tlb");

    typedef enum tag_WBEM_MISC_FLAG_TYPE
    {
		WBEM_FLAG_VALIDATE_CLASS_EXISTENCE = 0x200000,
        WBEM_FLAG_KEEP_SHAPE = 0x100000,
        WBEM_FLAG_NO_CLASS_PROVIDERS = 0x8000,
        WBEM_FLAG_NO_EVENTS = 0x4000,
        WBEM_FLAG_IGNORE_IDS = 0x2000,
		WBEM_FLAG_IS_INOUT = 0x1000,
    } WBEM_MISC_FLAG_TYPE;

    typedef enum tag_WBEM_CLASSPART_FLAG_TYPE
    {
        WBEM_FLAG_CLASSPART_NOT_LOCALIZED = 0x00,
		WBEM_FLAG_CLASSPART_LOCALIZED = 0x01,
		WBEM_FLAG_CLASSPART_LOCALIZATION_MASK = 0x01,

    } WBEM_CLASSPART_FLAG_TYPE;

    typedef enum tag_WBEM_INSTANCEPART_FLAG_TYPE
    {
        WBEM_FLAG_INSTANCEPART_NOT_LOCALIZED = 0x00,
		WBEM_FLAG_INSTANCEPART_LOCALIZED = 0x01,
		WBEM_FLAG_INSTANCEPART_LOCALIZATION_MASK = 0x01,

    } WBEM_INSTANCEPART_FLAG_TYPE;

    typedef enum tag_WBEM_CMPCLSPART_FLAG_TYPE
    {
        WBEM_FLAG_COMPARE_FULL = 0x00,
		WBEM_FLAG_COMPARE_BINARY = 0x01,
		WBEM_FLAG_COMPARE_LOCALIZED = 0x02
    } WBEM_CMPCLSPART_FLAG_TYPE;

    interface IWbemPropertySource;
    interface IWbemRawObjectSink;
    interface IWbemDecorator;
    interface IWbemEventSubsystem_m4;
    interface IWbemCausalityAccess;
    interface IWbemRefreshingServices;
    interface IWbemRemoteRefresher;
    interface IWbemMetaData;
    interface IWbemFilterStub;
    interface IWbemFilterProxy;
    interface IWbemLocalFilterProxy;
    interface IWbemLifeControl;
	interface IWbemCreateSecondaryStub;

    /////////////////////////////////////////////////////////
    //
    // Marshaling proxy for WbemClassObjec
    //

    [restricted, uuid(4590f812-1d3a-11d0-891f-00aa004b2e24)]
    coclass WbemClassObjectProxy
    {
        interface IWbemClassObject;
        interface IMarshal;
    };

    [restricted, uuid(4E6AC63C-BF69-495d-9000-E45A4E517B0C)]
    coclass UmiObjectWrapperProxy
    {
        interface IWbemClassObject;
        interface IMarshal;
    };

    [restricted, uuid(5d08b586-343a-11d0-ad46-00c04fd8fdff)]
    coclass WbemEventSubsystem
    {
        interface IWbemEventSubsystem_m4;
    };

    [restricted, uuid(08a59b5d-dd50-11d0-ad6b-00c04fd8fdff)]
    coclass HmmpEventConsumerProvider
    {
        interface IWbemUnboundObjectSink;
    };

    [restricted, uuid(6c19be35-7500-11d1-ad94-00c04fd8fdff)]
    coclass WbemFilterProxy
    {
        interface IWbemFilterProxy;
        interface IWbemObjectSink;
    };

    [restricted, uuid(4fa18276-912a-11d1-ad9b-00c04fd8fdff)]
    coclass InProcWbemLevel1Login
    {
        interface IWbemLevel1Login;
    };

    [restricted, uuid(3252F829-8694-46a8-B4CF-83F6A0FFEFA9)]
    coclass _WmiFreeFormObject
    {
        interface _IWmiFreeFormObject;
    };

    [restricted, uuid(78103FB7-AED7-4066-8BCD-30BB27B02331)]
    coclass _WmiObjectFactory
    {
        interface _IWmiObjectFactory;
    };

    [restricted, uuid(390150A7-AB20-45ff-A2E0-6B985554CAA8)]
    coclass _WbemUMIContextWrapper
    {
        interface _IWbemUMIContextWrapper;
    };

    [restricted, uuid(E2569DC9-38FA-4749-BEE5-A263E403359F)]
    coclass _WmiErrorObject
    {
        interface _IWmiErrorObject;
    };

    [restricted, uuid(F7D04323-5378-40c1-B588-C84F91E2B82C)]
    coclass _UmiErrorObject
    {
        interface _IUmiErrorObject;
    };


    [uuid(C10B4771-4DA0-11d2-A2F5-00C04F86FB7D)]
    coclass WinmgmtMofCompiler
    {
        interface IWinmgmtMofCompiler;
    };

    [uuid(dc923725-0fdd-45e1-ae74-ea09182e739b)]
    coclass WbemTokenCache
    {
        interface IWbemTokenCache;
    };

    [uuid(f3130cdb-aa52-4c3a-ab32-85ffc23af9c1)]
    coclass WmiESS
    {
        interface _IWmiESS;
        interface IWbemShutdown;
    };

    [uuid(4de225bf-cf59-4cfc-85f7-68b90f185355)]
    coclass WmiProvSS
    {
        interface _IWmiProvSS;
        interface IWbemShutdown;
    };

	[uuid(73E709EA-5D93-4B2E-BBB0-99B7938DA9E4)]
	coclass WmiProviderHost
	{
		interface _IWmiProviderHost ;
        interface IWbemShutdown;
	};

	[uuid(F5A55D36-8750-432C-AB52-AD49A016EABC)]
	coclass WmiProviderBindingFactory
	{
		interface _IWmiProviderFactory ;
		interface _IWmiProviderFactoryInitialize ;
        	interface IWbemShutdown;
	};

	[uuid(8BEBCE8B-1AF0-4323-8B4D-36994567CAE1)]
	coclass WmiProviderInProcFactory
	{
		interface _IWmiProviderFactory ;
		interface _IWmiProviderFactoryInitialize ;
		interface IWbemShutdown;
	};

	[uuid(688A906C-0B60-449C-AE2C-40B02AD53E41)]
	coclass WmiProviderHostedInProcFactory
	{
		interface _IWmiProviderFactory ;
		interface _IWmiProviderFactoryInitialize ;
		interface IWbemShutdown;
	};

	[uuid(1860e246-e924-4f73-b2c5-93e0577e3aa1)]
	coclass IWmiCoreServices
	{
	    interface _IWmiCoreServices;
    };

	[uuid(0859CCC9-209D-4110-9613-DAB6EAF9093F)]
	coclass _WmiWbemClass
	{
	    interface _IWMIObject;
	};

	[uuid(DD51FE78-43E1-405a-A44E-6C226391CF0D)]
	coclass _WmiWbemInstance
	{
	    interface _IWMIObject;
	};


    [uuid(da1fc6d2-40e4-4e2f-bb42-e70d28c891b3)]
	coclass _WmiQuery
	{
	    interface _IWmiQuery;
	};

	[uuid(C601737E-9213-489f-ADC8-922A894A4A65)]
	coclass _WbemUMIObjectWrapper
	{
	    interface _IWbemUMIObjectWrapper;
	};

	[uuid(695B5458-D6E9-4a6a-881F-B68F953397D8)]
	coclass _WbemEmptyClassObject
	{
	    interface _IWmiObject;
	};

	[uuid(1108be51-f58a-4cda-bb99-7a0227d11d5e)]
	coclass _IWbemCallSec
	{
	    interface _IWmiCallSec;
	};

	[uuid(CD1ABFC8-6C5E-4a8d-B90B-2A3B153B886D)]
	coclass _WbemConfigureRefreshingSvcs
	{
	    interface _IWbemConfigureRefreshingSvcs;
	};

	[uuid(DCF33DF4-B510-439f-832A-16B6B514F2A7)]
	coclass _WbemRefresherMgr
	{
	    interface _IWbemRefresherMgr;
		interface IWbemShutdown;
	};

	[uuid(288d70f7-11c8-42d5-a612-8e46a7e922d8)]
	coclass _WbemHostedRefresherMgr
	{
	    interface _IWbemRefresherMgr;
		interface IWbemShutdown;
	};

	[uuid(ED51D12E-511F-4999-8DCD-C2BAC91BE86E)]
	coclass _WbemComBinding
	{
	    interface IWbemComBinding;
	};

	[uuid(D5D3ACEA-EEC7-4efd-A06D-FF54B4271655)]
	coclass _UmiComBinding
	{
	    interface IWbemComBinding;
	};

	[uuid(FD2057FA-99FE-4f10-8908-9AA2AAB32A6E)]
	coclass _DSSvcExWrap
	{
	    interface IWbemServicesEx;
		interface _IUmiSvcExWrapper;
	};

	[uuid(CC9072AB-C000-49d8-A5AA-00266C8DBB9B)]
	coclass _WbemEnumMarshaling
	{
	    interface _IWbemEnumMarshaling;
	};

	[uuid(5839FCA9-774D-42a1-ACDA-D6A79037F57F)]
	coclass _WbemFetchRefresherMgr
	{
	    interface _IWbemFetchRefresherMgr;
	};

    [uuid(4c6055d8-84b9-4111-a7d3-6623894eedb3)]
    coclass WbemConnection
    {
        interface IWbemConnection;
    };

	// This is the actual core implementation of the admin login

    [uuid(1f0bc6ad-46d4-488b-be1f-047fc7505e60)]
    coclass ActualWbemAdministrativeLocator
    {
        interface IWbemLocator;
    };

	// this assumes that the transport has verified that
	// the user has access.  Unlike the Administrative locator,
	// it increases the count of external connections

    [uuid(6543d242-a80b-44a3-b828-95c1ec452423)]
    coclass ActualWbemAuthenticatedLocator
    {
        interface IWbemLocator;
    };

	// this is used by providers who dont know if a user
	// has access or not.

    [uuid(ed999ff5-223a-4052-8ece-0b10c8dbaa39)]
    coclass ActualWbemUnauthenticatedLocator
    {
        interface IWbemLocator;
    };

};

//***************************************************************************
// Following interface allows for management of refreshable objects and enums
// that can be cooked.

[restricted,local,object,uuid(13ED7E55-8D63-41b0-9086-D0C5C17364C8)]
interface IWMIRefreshableCooker : IUnknown
{
	// Adds a new instance to the refreshable cooker.  The Refreshable Instance
	// will be updated on calls to recalc.
	HRESULT AddInstance(
			[in] IWbemServices* pService,						// The object's namespace
			[in] IWbemContext * pContext,                       // The context passed from client
			[in] IWbemObjectAccess* pCookingClass,				// Cooking class
			[in] IWbemObjectAccess* pCookingInstance,			// An instance of the cooking class
			[out] IWbemObjectAccess** ppRefreshableInstance,	// A clone of the instance used for refreshing
			[out] long* plId									// The id of the refreshable cooking instance
		);

	// Adds a new enumeration to the refreshable cooker.  The Refreshable Enumerator
	// will be updated on calls to recalc.
	HRESULT AddEnum(
			[in] IWbemServices* pService,						// The object's namespace
			[in] IWbemContext * pContext,                       // The context passed from client
			[in,string] LPCWSTR szCookingClass,					// The cooking class' name
			[in] IWbemHiPerfEnum* pRefreshableEnum,				// The enumerator passed in from WMI
			[out] long* plId									// THe id of the refreshable cooking enumerator
		);

	// Removes the instance or enumerator specified by ulId from the
	// Refreshable Cooker.
	HRESULT Remove(
			[in] long lId
		);

	// Refreshes all instances and enumerators in the refreshable cooker	
	HRESULT Refresh();

};


//***************************************************************************
// Following interface allows for refreshable objects of the same class to be
// cooked as a group.

[restricted,local,object,uuid(A239BDF1-0AB1-45a0-8764-159115689589)]
interface IWMISimpleObjectCooker : IUnknown
{
	// Sets the class used by the cooker in order to fill out
	// instances when cooking.  Once the class is set, it cannot
	// be reset
	HRESULT SetClass(
			[in] WCHAR* wszCookingClassName,
			[in] IWbemObjectAccess* pCookingClass,
			[in] IWbemObjectAccess* pRawClass
		);

	// Retrieves a new cooked instance and an id which can be used
	// to identify it.  The instance will not be updated unless
	// a sample instance is bound to it via BeginCooking()
	HRESULT SetCookedInstance(
			[in] IWbemObjectAccess* pCookedInstance,
			[out] long* plId
		);

	// Provides an initial sample for cooking the instance specified
	// by ulId.  Once the initial sample is set, it can be
	// cleared by calling BeginCooking again with another
	// instance
	HRESULT BeginCooking(
			[in] long lId,
			[in] IWbemObjectAccess* pSampleInstance,
			[in] unsigned long dwRefresherId
		);

	// Tells the cooker to stop cooking the instance specified
	// by ulId.  Cooking can be restarted by calling BeginCooking
	// again.
	HRESULT StopCooking(
			[in] long lId
		);

	// Recalcs all instances using the appropriate cooking instances.
	HRESULT Recalc([in] unsigned long dwRefresherId);

	// Removes an instance from the object cooker
	HRESULT Remove(
			[in] long lId
		);

	// Clears all instances from the cooker.
	HRESULT Reset( void );

};

//***************************************************************************
// Following interface allows for simple cooking of properties whose formulas
// can be defined using 1 or 2 value samples.

[restricted,local,object,uuid(510ADF6E-D481-4a64-B74A-CC712E11AA34)]
interface IWMISimpleCooker : IUnknown
{
	// Simple method for cooking a two value, one base counter
	HRESULT CookRawValues( 	
		[in]	DWORD	dwCookingType,
		[in]	DWORD	dwNumSamples,
		[in, size_is(dwNumSamples)]	__int64*	anTimeStamp,
		[in, size_is(dwNumSamples)]	__int64*	anRawValue,
		[in, size_is(dwNumSamples)]	__int64*	anBase,
		[in]	__int64		nTimeFrequency,
		[in]       long     Scale,
		[out]	__int64*	pnResult
		);

};

cpp_quote("#define IWbemBinder IWbemConnection")
cpp_quote("#define IID_IWbemBinder IID_IWbemConnection")
cpp_quote("#define CLSID_WbemBinder CLSID_WbemConnection")

/*
//***************************************************************************
// This interface is a placeholder.  We need to decide if the
// methods below are really appropriate for what we are planning
// to do.

[restricted,local,object,uuid(B1ADC67F-09E6-4adc-A45E-05BA3007CE30)]
interface IWMIComplexCooker : public IUnknown
{

	// Sets a formula in the cooker.  If the formula is known, a known
	// id is returned.  If not, then the formula is parsed and a new
	// id generated
	HRESULT SetFormula( 	
			[in] LPCWSTR pwszCookingType,
			[out] DWORD* pdwId
			);

	// General method for cooking a complex value - assumes that the formula follows
	// timestamp, time frequency, raw value and base value conventions
	HRESULT CookRawValues( 	
			[in] DWORD dwId,
			[in] ULONG nNumTimeStamps,
			[in,size_is(nNumTimeStamps)] unsigned __int64*	pnTimestamps,
			[in] unsigned __int64	nTimeFrequency,
			[in,size_is(nNumTimeFrequency)] unsigned __int64*	pnTimeFrequency,
			[in] ULONG nNumRawValues,
			[in,size_is(nNumRawValues)] unsigned __int64*	pnRawValues,
			[in] ULONG nBaseValues,
			[in,size_is(nBaseValues)] unsigned __int64*	pnBaseValues,
			[out] unsigned __int64  pnResult
			);

	// General method for cooking a free form value by using an array of
	// supplied values.  The cooker uses the values from the array, in order,
	// and applies them  to the formula.
	HRESULT CookGeneralRawValues( 	
			[in] DWORD dwId,
			[in] ULONG nNumValues,
			[in,size_is(nNumTimeStamps)] unsigned __int64*	pnRawValues
			[out] unsigned __int64  pnResult
			);
			
};

// Use arrays of these structures to describe each sample
typedef struct _WMI_COOKING_SAMPLE
{
	ULONG	ulIndex;	// Index in class array
	ULONG	ulCount;	// Num Instances in array
	[size_is(ulCount)] IWbemObjectAccess** apInstances;
} WMI_COOKING_SAMPLE;

// This interface is a placeholder.  We need to decide if the
// methods below are really appropriate for what we are planning
// to do.
[restricted,local,object,uuid(979FF10D-D616-4448-BF08-3A79E01506B0)]
interface IWMIComplexObjectCooker : public IUnknown
{
	// Sets the class used by the cooker in order to fill out
	// instances when cooking.

	HRESULT SetClass(
			[in] IWbemObjectAccess* pCookingClass,
		);

	// Sets the initial instances.  From this point forwards, additional
	// instances are supplied at Recalc time.
	HRESULT SetFirstSample(
			[in] ULONG ulCount,
			[in,size_is(ulCount)] WMI_COOKING_SAMPLE* apSampleData
		);

	// Clears the cooking data and all samples - Initial sample is now required
	HRESULT Reset( void );

	// Recalcs the specified instance using the supplied raw data.  If this
	// is an initial sample, this sets the sample but doesn't atually recalc
	// anything.  Fills out any properties that require cooking.  Any others
	// must be filled out by the user themselves.  This assumes a single instance
	// is used for cooking.
	HRESULT Recalc(
			[in,out] IWbemObjectAccess* pInstance,
			[in] ULONG ulCount,
			[in,size_is(ulCount)] WMI_COOKING_SAMPLE* apSampleData
		);

};

*/

