[uuid(226c9290-dd96-11d3-a120-00105a1f515a)]

library WbemUtilities_v1
{
    importlib("stdole32.tlb");

    typedef [v1_enum] enum tag_WBEM_PATH_STATUS_FLAG
    {
          WBEMPATH_INFO_ANON_LOCAL_MACHINE    = 0x1,   //  <path has \\. as server name>
          WBEMPATH_INFO_HAS_MACHINE_NAME      = 0x2,   //  <not a dot>
          WBEMPATH_INFO_IS_CLASS_REF          = 0x4,   //  <a path to a classs, not a path to an instance>
          WBEMPATH_INFO_IS_INST_REF           = 0x8,   //  <a path to an instance>
          WBEMPATH_INFO_HAS_SUBSCOPES         = 0x10,  //  <true if a subscope is present>
          WBEMPATH_INFO_IS_COMPOUND           = 0x20,  //  <true if compound key is used>
          WBEMPATH_INFO_HAS_V2_REF_PATHS      = 0x40,  //  <true if V2-style ref paths are used>
          WBEMPATH_INFO_HAS_IMPLIED_KEY       = 0x80,  //  <true if keynames are missing somewhere>
          WBEMPATH_INFO_CONTAINS_SINGLETON    = 0x100, //  <true if one or more singletons>
          WBEMPATH_INFO_V1_COMPLIANT          = 0x200, //  <true if path is WBEM-V1-compliant>
          WBEMPATH_INFO_V2_COMPLIANT          = 0x400, //  <true if path is WBEM-V2-compliant>
          WBEMPATH_INFO_CIM_COMPLIANT         = 0x800, //  <true if path is CIM-compliant>
          WBEMPATH_INFO_IS_SINGLETON          = 0x1000, // <a path to a singleton>
          WBEMPATH_INFO_IS_PARENT             = 0x2000, // <path is just "..">
          WBEMPATH_INFO_SERVER_NAMESPACE_ONLY = 0x4000, // <path is just "..">
          WBEMPATH_INFO_NATIVE_PATH           = 0X8000,
          WBEMPATH_INFO_WMI_PATH              = 0X10000,
		  WBEMPATH_INFO_PATH_HAD_SERVER		  = 0X20000,  // server name is present and was not set by default
    } tag_WBEM_PATH_STATUS_FLAG;


    typedef [v1_enum] enum tag_WBEM_PATH_CREATE_FLAG
    {
          WBEMPATH_CREATE_ACCEPT_RELATIVE     = 0x1,
          WBEMPATH_CREATE_ACCEPT_ABSOLUTE     = 0x2,
          WBEMPATH_CREATE_ACCEPT_ALL          = 0x4,
          WBEMPATH_TREAT_SINGLE_IDENT_AS_NS   = 0x8,
    } tag_WBEM_PATH_CREATE_FLAG;

	// A flag of 0 will get the namespace and relative part

    typedef [v1_enum] enum tag_WBEM_GET_TEXT_FLAGS
    {
          WBEMPATH_COMPRESSED     = 0x1,				// Obsolete, dont use
          WBEMPATH_GET_RELATIVE_ONLY = 0X2,				// gets relative path
          WBEMPATH_GET_SERVER_TOO = 0X4,				// gets everything
          WBEMPATH_GET_SERVER_AND_NAMESPACE_ONLY = 0X8, // gets server and namespace
          WBEMPATH_GET_NAMESPACE_ONLY = 0X10,			// gets just namespace
          WBEMPATH_GET_ORIGINAL = 0X20,					// returns whatever was passed in
    } tag_WBEM_GET_TEXT_FLAGS;

    typedef [v1_enum] enum tag_WBEM_GET_KEY_FLAGS
    {
          WBEMPATH_TEXT     = 0x1,
          WBEMPATH_QUOTEDTEXT = 0X2
    } tag_WBEM_GET_KEY_FLAGS;

    //*******************************************************************
    // NOT CoCreatable; get this from IWbemPath

    [local, object, uuid(9AE62877-7544-4bb0-AA26-A13824659ED6)]

    interface IWbemPathKeyList : IUnknown
    {
        HRESULT GetCount(
            [out] ULONG * puKeyCount
            );

        HRESULT SetKey(
            [in, string] LPCWSTR wszName,
            [in] ULONG uFlags,                  // Add flag for SINGLETON
            [in] ULONG uCimType,                // Implies the size
            [in] LPVOID pKeyVal
            );

        HRESULT SetKey2(
            [in, string] LPCWSTR wszName,
            [in] ULONG uFlags,                  // Add flag for SINGLETON
            [in] ULONG uCimType,
            [in] VARIANT * pKeyVal
            );

        HRESULT GetKey(
            [in] ULONG uKeyIx,
            [in] ULONG uFlags,                         // Add flag for SINGLETON
            [in,out] ULONG * puNameBufSize,            // In bytes; must be large enough for UNICODE null
            [in,out] LPWSTR pszKeyName,                // May be NULL for implicit keys
            [in,out] ULONG * puKeyValBufSize,          // In Bytes, includes double NULL
            [in,out] LPVOID pKeyVal,                   // Key Val
            [out] ULONG *puApparentCimType             // One of CIM_SINT32, CIM_SINT64, CIM_STRING, etc.
            );

        HRESULT GetKey2(
            [in] ULONG uKeyIx,
            [in] ULONG uFlags,                         // Add flag for SINGLETON
            [in,out] ULONG * puNameBufSize,            // In bytes; must be large enough for UNICODE null
            [in,out] LPWSTR pszKeyName,                // May be NULL for implicit keys
            [in,out] VARIANT * pKeyValue,              // In Bytes, includes double NULL
            [out] ULONG *puApparentCimType             // One of CIM_SINT32, CIM_SINT64, CIM_STRING, etc.
            );

   	    HRESULT RemoveKey(
            [in, string] LPCWSTR wszName,
            [in] ULONG uFlags
            );

   	    HRESULT RemoveAllKeys(
            [in] ULONG uFlags
            );

        HRESULT MakeSingleton([in] boolean bSet);

        // WBEMPATH_INFO_IS_COMPOUND             <true if compound key is used
        // WBEMPATH_INFO_HAS_V2_REF_PATHS        <true if V2-style ref paths are used
        // WBEMPATH_INFO_HAS_IMPLIED_KEY         <true if keynames are missing somewhere
        // WBEMPATH_INFO_CONTAINS_SINGLETON      <true if one or more singletons

        HRESULT GetInfo(
            [in] ULONG uRequestedInfo,
            [out] ULONGLONG *puResponse
            );

        HRESULT GetText(
            [in] long lFlags,       // tag_WBEM_GET_KEY_FLAGS
            [in,out] ULONG * puBuffLength,
            [in, out, string] LPWSTR pszText
            );

    };

    //*******************************************************************
    // CoCreatable

    [local, object, uuid(3BC15AF2-736C-477e-9E51-238AF8667DCC)]

    interface IWbemPath : IUnknown
    {
        HRESULT SetText(
            [in] ULONG uMode,       // see tag_WBEM_PATH_CREATE_FLAG
            [in] LPCWSTR pszPath
            );

        HRESULT GetText(
            [in] long lFlags,       // see tag_WBEM_GET_TEXT_FLAGS
            [in,out] ULONG * puBuffLength,
            [in, out, string] LPWSTR pszText
            );

	    // Path tests
        // ==========


        HRESULT GetInfo(
            [in] ULONG uRequestedInfo,      // zero for now
            [out] ULONGLONG *puResponse     // see tag_WBEM_PATH_STATUS_FLAG
            );

    	// Server access
        // =============

    	HRESULT SetServer(
            [in, string] LPCWSTR Name
            );

        HRESULT GetServer(
            [in,out] ULONG * puNameBufLength,
            [in, out, string] LPWSTR pName
            );

    	// Namespace access.  Example, root\default, root is 0, 1 is def
        // =============================================================

        HRESULT GetNamespaceCount(
            [out] ULONG* puCount
            );

    	HRESULT SetNamespaceAt(
            [in] ULONG uIndex,
 			[in, string] LPCWSTR pszName
            );

    	HRESULT GetNamespaceAt(
            [in] ULONG uIndex,
            [in,out] ULONG * puNameBufLength,
            [in, out, string] LPWSTR pName
            );

        HRESULT RemoveNamespaceAt(
            [in] ULONG uIndex
            );

        HRESULT RemoveAllNamespaces(
            );

        //
        // Scope manipulators.  The leftmost scope is 0
        // ============================================

        HRESULT GetScopeCount(
            [out] ULONG *puCount
            );

        HRESULT SetScope(
            [in] ULONG uIndex,
            [in] LPWSTR pszClass
            );

        HRESULT SetScopeFromText(
            [in] ULONG uIndex,
            [in] LPWSTR pszText
            );

        HRESULT GetScope(
            [in] ULONG uIndex,
            [in,out] ULONG * puClassNameBufSize,
            [in,out] LPWSTR pszClass,
            [out] IWbemPathKeyList **pKeyList
            );

        HRESULT GetScopeAsText(
            [in] ULONG uIndex,
            [in,out] ULONG * puTextBufSize,
            [in,out] LPWSTR pszText
            );

        HRESULT RemoveScope(
            [in] ULONG uIndex
            );

        HRESULT RemoveAllScopes(
            );

        // General class and key access routines
        // =====================================

        HRESULT SetClassName(
            [in, string] LPCWSTR Name
            );

        HRESULT GetClassName(
            [in,out] ULONG * puBuffLength,
            [in, out, string] LPWSTR pszName
            );

	    HRESULT GetKeyList(
            [out] IWbemPathKeyList ** pOut
            );

	    HRESULT CreateClassPart(
            [in] long lFlags,
            [in, string] LPCWSTR Name
            );

	    HRESULT DeleteClassPart(
            [in] long lFlags
            );

	    BOOL IsRelative(
			[in, string] LPWSTR wszMachine,
			[in, string] LPWSTR wszNamespace
			);

	    BOOL IsRelativeOrChild(
			[in, string] LPWSTR wszMachine,
			[in, string] LPWSTR wszNamespace,
			[in] long lFlags
			);
		
		BOOL IsLocal(
			[in, string] LPCWSTR wszMachine
			);

		BOOL IsSameClassName(
			[in, string] LPCWSTR wszClass
			);


    };

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

    [restricted, uuid(cf4cc405-e2c5-4ddd-b3ce-5e7582d8c9fa)]
    coclass WbemDefPath
    {
        interface IWbemPath;
    };

    interface IWbemQuery;


    [uuid(EAC8A024-21E2-4523-AD73-A71A0AA2F56A)]
    coclass WbemQuery
    {
        interface IWbemQuery;
    };
};


//*******************************************************************
// Query parser & analysis interfaces

typedef enum
{
    WMIQ_ANALYSIS_RPN_SEQUENCE          = 0x1,
    WMIQ_ANALYSIS_ASSOC_QUERY           = 0x2,
    WMIQ_ANALYSIS_PROP_ANALYSIS_MATRIX  = 0x3,
    WMIQ_ANALYSIS_QUERY_TEXT            = 0x4,

    WMIQ_ANALYSIS_RESERVED     = 0x8000000

}   WMIQ_ANALYSIS_TYPE;

typedef enum
{
    // Group 1
    WMIQ_RPN_TOKEN_EXPRESSION   = 1,
    WMIQ_RPN_TOKEN_AND          = 2,
    WMIQ_RPN_TOKEN_OR           = 3,
    WMIQ_RPN_TOKEN_NOT          = 4,

    // Group 2
    WMIQ_RPN_OP_UNDEFINED       = 0,
    WMIQ_RPN_OP_EQ              = 1,
    WMIQ_RPN_OP_NE              = 2,
    WMIQ_RPN_OP_GE              = 3,
    WMIQ_RPN_OP_LE              = 4,
    WMIQ_RPN_OP_LT              = 5,
    WMIQ_RPN_OP_GT              = 6,
    WMIQ_RPN_OP_LIKE            = 7,
    WMIQ_RPN_OP_ISA             = 8,
    WMIQ_RPN_OP_ISNOTA          = 9,

    // Group 3
    WMIQ_RPN_LEFT_PROPERTY_NAME  = 0x1,
    WMIQ_RPN_RIGHT_PROPERTY_NAME = 0x2,
    WMIQ_RPN_CONST2              = 0x4,
    WMIQ_RPN_CONST               = 0x8,
    WMIQ_RPN_RELOP               = 0x10,
    WMIQ_RPN_LEFT_FUNCTION       = 0x20,
    WMIQ_RPN_RIGHT_FUNCTION      = 0x40,

    // Group 4
    WMIQ_RPN_GET_TOKEN_TYPE         = 1,    // Returns Group 1 ULONG value
    WMIQ_RPN_GET_EXPR_SHAPE         = 2,    // Returns Group 3 ULONG mask
    WMIQ_RPN_GET_LEFT_FUNCTION      = 3,    // Returns LPWSTR
    WMIQ_RPN_GET_RIGHT_FUNCTION     = 4,    // Returns LPWSTR
    WMIQ_RPN_GET_RELOP              = 5,    // Returns a Group 2 ULONG

    // Group 5
    WMIQ_RPN_NEXT_TOKEN             = 1,

    // Group 6 (FROM clause options)
    WMIQ_RPN_FROM_UNARY      = 0x1,
    WMIQ_RPN_FROM_PATH       = 0x2,
    WMIQ_RPN_FROM_CLASS_LIST = 0x4

}   WMIQ_RPN_TOKEN_FLAGS;


typedef enum
{
    WMIQ_ASSOCQ_ASSOCIATORS             = 0x1,
    WMIQ_ASSOCQ_REFERENCES              = 0x2,

    WMIQ_ASSOCQ_RESULTCLASS             = 0x4,
    WMIQ_ASSOCQ_ASSOCCLASS              = 0x8,
    WMIQ_ASSOCQ_ROLE                    = 0x10,
    WMIQ_ASSOCQ_RESULTROLE              = 0x20,
    WMIQ_ASSOCQ_REQUIREDQUALIFIER       = 0x40,
    WMIQ_ASSOCQ_REQUIREDASSOCQUALIFIER  = 0x80,

    WMIQ_ASSOCQ_CLASSDEFSONLY           = 0x100,
	WMIQ_ASSOCQ_KEYSONLY                = 0x200,
    WMIQ_ASSOCQ_SCHEMAONLY              = 0x400,
    WMIQ_ASSOCQ_CLASSREFSONLY           = 0x800

}   WMIQ_ASSOCQ_FLAGS;


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

typedef struct tag_SWbemQueryQualifiedName
{
    ULONG    m_uVersion;
    ULONG    m_uTokenType;

    ULONG    m_uNameListSize;
    LPCWSTR *m_ppszNameList;

    BOOL     m_bArraysUsed;
    BOOL    *m_pbArrayElUsed;
    ULONG   *m_puArrayIndex;

}   SWbemQueryQualifiedName;

// **********************************************************************
//
typedef union tag_SWbemRpnConst
{
    LPCWSTR m_pszStrVal;        // VT_LPWSTR
    BOOL    m_bBoolVal;         // VT_BOOL
    LONG    m_lLongVal;         // VT_I4
    ULONG   m_uLongVal;         // VT_UI4
    double  m_dblVal;           // VT_R8
    __int64 m_lVal64;           // VT_I8
    __int64 m_uVal64;           // VT_UI8

}   SWbemRpnConst;

// **********************************************************************
// RPN token for normal queries

typedef struct tag_SWbemRpnQueryToken
{
    ULONG   m_uVersion;
    ULONG   m_uTokenType;

    ULONG   m_uSubexpressionShape;
    ULONG   m_uOperator;

    SWbemQueryQualifiedName *m_pRightIdent;
    SWbemQueryQualifiedName *m_pLeftIdent;

    ULONG   m_uConstApparentType;  // VT_
    SWbemRpnConst m_Const;

    // Const2 used only for BETWEEN
    ULONG   m_uConst2ApparentType;   // VT_
    SWbemRpnConst m_Const2;

    LPCWSTR m_pszRightFunc;
    LPCWSTR m_pszLeftFunc;

}   SWbemRpnQueryToken;


typedef struct tag_SWbemRpnTokenList
{
    ULONG m_uVersion;
    ULONG m_uTokenType;

    ULONG m_uNumTokens;

}   SWbemRpnTokenList;


typedef enum tag_WMIQ_LANGUAGE_FEATURES
{
    // The LF1 corresponds to the integer value. Do not alter!

    WMIQ_LF1_BASIC_SELECT                   = 1,                // *
    WMIQ_LF2_CLASS_NAME_IN_QUERY            = 2,                // *
    WMIQ_LF3_STRING_CASE_FUNCTIONS          = 3,                // *
    WMIQ_LF4_PROP_TO_PROP_TESTS             = 4,                // *
    WMIQ_LF5_COUNT_STAR                     = 5,
    WMIQ_LF6_ORDER_BY                       = 6,                // *
    WMIQ_LF7_DISTINCT			            = 7,
    WMIQ_LF8_ISA 			                = 8,                // *
    WMIQ_LF9_THIS			                = 9,                // *
    WMIQ_LF10_COMPEX_SUBEXPRESSIONS         = 10,
    WMIQ_LF11_ALIASING                      = 11,
    WMIQ_LF12_GROUP_BY_HAVING               = 12,               // *
    WMIQ_LF13_WMI_WITHIN                    = 13,               // *
    WMIQ_LF14_SQL_WRITE_OPERATIONS          = 14,
    WMIQ_LF15_GO                            = 15,
    WMIQ_LF16_SINGLE_LEVEL_TRANSACTIONS     = 16,
    WMIQ_LF17_QUALIFIED_NAMES               = 17,               // *
    WMIQ_LF18_ASSOCIATONS                   = 18,               // *
    WMIQ_LF19_SYSTEM_PROPERTIES             = 19,
    WMIQ_LF20_EXTENDED_SYSTEM_PROPERTIES    = 20,
    WMIQ_LF21_SQL89_JOINS                   = 21,
    WMIQ_LF22_SQL92_JOINS                   = 22,
    WMIQ_LF23_SUBSELECTS                    = 23,
    WMIQ_LF24_UMI_EXTENSIONS                = 24,
    WMIQ_LF25_DATEPART                      = 25,               // *
    WMIQ_LF26_LIKE                          = 26,               // *
    WMIQ_LF27_CIM_TEMPORAL_CONSTRUCTS       = 27,               // *
    WMIQ_LF28_STANDARD_AGGREGATES           = 28,
    WMIQ_LF29_MULTI_LEVEL_ORDER_BY          = 29,
    WMIQ_LF30_WMI_PRAGMAS                   = 30,
    WMIQ_LF31_QUALIFIER_TESTS               = 31,
    WMIQ_LF32_SP_EXECUTE                    = 32,
    WMIQ_LF33_ARRAY_ACCESS                  = 33,               // *
    WMIQ_LF34_UNION	                        = 34,
    WMIQ_LF35_COMPLEX_SELECT_TARGET         = 35,
    WMIQ_LF36_REFERENCE_TESTS               = 36,
    WMIQ_LF37_SELECT_INTO                   = 37,
    WMIQ_LF38_BASIC_DATETIME_TESTS          = 38,
    WMIQ_LF39_COUNT_COLUMN                  = 39,
    WMIQ_LF40_BETWEEN                       = 40,

    WMIQ_LF_LAST                            = 40
}   WMIQ_LANGUAGE_FEATURES;

typedef enum tag_WMIQ_RPNQ_FEATURE
{
    WMIQ_RPNF_WHERE_CLAUSE_PRESENT          = 0x1,      // *
    WMIQ_RPNF_QUERY_IS_CONJUNCTIVE          = 0x2,      // *
    WMIQ_RPNF_QUERY_IS_DISJUNCTIVE          = 0x4,      // *
    WMIQ_RPNF_PROJECTION                    = 0x8,      // *
    WMIQ_RPNF_FEATURE_SELECT_STAR           = 0x10,     // *
    WMIQ_RPNF_EQUALITY_TESTS_ONLY           = 0x20,     // *
    WMIQ_RPNF_COUNT_STAR                    = 0x40,     // *
    WMIQ_RPNF_QUALIFIED_NAMES_USED          = 0x80,     // *
    WMIQ_RPNF_SYSPROP_CLASS_USED            = 0x100,    // *
    WMIQ_RPNF_PROP_TO_PROP_TESTS            = 0x200,    // *
    WMIQ_RPNF_ORDER_BY                      = 0x400,    // *
    WMIQ_RPNF_ISA_USED                      = 0x800,    // *
    WMIQ_RPNF_GROUP_BY_HAVING               = 0x1000,   // *
    WMIQ_RPNF_ARRAY_ACCESS_USED             = 0x2000,   // *

}   WMIQ_RPNF_FEATURE;


typedef struct tag_SWbemRpnEncodedQuery
{
    ULONG m_uVersion;
    ULONG m_uTokenType;

    // General query features
    // ======================
    unsigned __int64 m_uParsedFeatureMask;

    // Overall language features encountered
    // ======================================

    ULONG      m_uDetectedArraySize;
    ULONG     *m_puDetectedFeatures;    // Array of LFn_ constants

    // Values being selected if WMIQ_RPNF_PROJECTION is set
    // =====================================================

    ULONG  m_uSelectListSize;
    SWbemQueryQualifiedName  **m_ppSelectList;

    // FROM clause
    // ===========

    ULONG   m_uFromTargetType;          // WMIQ_RPN_FROM_ constants
    LPCWSTR m_pszOptionalFromPath;      // NULL if not used
    ULONG   m_uFromListSize;
    LPCWSTR *m_ppszFromList;

    // Where clause
    // ============

    ULONG                    m_uWhereClauseSize;
    SWbemRpnQueryToken      **m_ppRpnWhereClause;

    // WITHIN value
    // ============

    double  m_dblWithinPolling;
    double  m_dblWithinWindow;

    // ORDER BY
    // ========

    ULONG    m_uOrderByListSize;
    LPCWSTR *m_ppszOrderByList;
    ULONG   *m_uOrderDirectionEl;

}   SWbemRpnEncodedQuery;


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

typedef struct tag_SWbemAnalysisMatrix
{
    ULONG   m_uVersion;
    ULONG   m_uMatrixType;

    LPCWSTR  m_pszProperty;
    ULONG    m_uPropertyType;
    ULONG    m_uEntries;
    LPVOID  *m_pValues;
    BOOL    *m_pbTruthTable;

}   SWbemAnalysisMatrix;

typedef struct tag_SWbemAnalysisMatrixList
{
    ULONG m_uVersion;
    ULONG m_uMatrixType;

    ULONG m_uNumMatrices;
    SWbemAnalysisMatrix *m_pMatrices;

}   SWbemAnalysisMatrixList;


// **********************************************************************
// Associators/ References queries

typedef struct tag_SWbemAssocQueryInf
{
    ULONG       m_uVersion;
    ULONG       m_uAnalysisType;

    ULONG       m_uFeatureMask;
    IWbemPath  *m_pPath;
    LPWSTR      m_pszPath;
    LPWSTR      m_pszQueryText;

    LPWSTR      m_pszResultClass;
    LPWSTR      m_pszAssocClass;
    LPWSTR      m_pszRole;
    LPWSTR      m_pszResultRole;
    LPWSTR      m_pszRequiredQualifier;
    LPWSTR      m_pszRequiredAssocQualifier;

}   SWbemAssocQueryInf;




[local, object, uuid(81166f58-dd98-11d3-a120-00105a1f515a)]
interface IWbemQuery : IUnknown
{
    HRESULT Empty();

    HRESULT SetLanguageFeatures(
        [in] ULONG uFlags,
        [in] ULONG uArraySize,
        [in] ULONG *puFeatures
        );
        // If not called, all features are supported

    HRESULT TestLanguageFeatures(
        [in] ULONG uFlags,
        [in,out] ULONG *uArraySize,
        [out] ULONG *puFeatures
        );

    HRESULT Parse(
        [in] LPCWSTR pszLang,
        [in] LPCWSTR pszQuery,
        [in] ULONG uFlags
        );

    HRESULT GetAnalysis(
        [in]  ULONG uAnalysisType,
        [in]  ULONG uFlags,
        [out] LPVOID *pAnalysis
        );

    HRESULT FreeMemory(
        [in] LPVOID pMem
        );

    HRESULT GetQueryInfo(
        [in]  ULONG  uAnalysisType,
        [in]  ULONG  uInfoId,
        [in]  ULONG  uBufSize,
        [out] LPVOID pDestBuf
        );
};