[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 "..">
    } 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;

    typedef [v1_enum] enum tag_WBEM_GET_TEXT_FLAGS
    {
          WBEMPATH_COMPRESSED     = 0x1,
          WBEMPATH_GET_RELATIVE_ONLY = 0X2,
          WBEMPATH_GET_SERVER_TOO = 0X4,
          WBEMPATH_GET_SERVER_AND_NAMESPACE_ONLY = 0X8,
    } 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
            );

    };

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

    [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_TYPE;

typedef enum
{
    // Group 1
    // Returned by GetNodeType

    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_EQ              = 1,
    WMIQ_RPN_OP_NE              = 2,
    WMIQ_RPN_OP_EQGT            = 3,
    WMIQ_RPN_OP_EQLT            = 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_LEFT_CONST          = 0x4,
    WMIQ_RPN_RIGHT_CONST         = 0x8,
    WMIQ_RPN_RELOP               = 0x10,
    WMIQ_RPN_LEFT_FUNCTION       = 0x20,
    WMIQ_RPN_RIGHT_FUNCTION      = 0x30,

    // 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

}   WMIQ_RPN_TOKEN_FLAGS;


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

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

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

}   WMIQ_ASSOCQ_FLAGS;


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

typedef struct tag_SWmiQueryQualifiedName
{
    ULONG    m_uVersion;
    ULONG    m_uTokenType;

    ULONG    m_uNameCount;
    LPCWSTR *m_pszNameList;

    BOOL     m_bArraysUsed;
    BOOL    *m_bArrayUsed;
    ULONG   *m_uArrayIndex;

}   SWmiQueryQualifiedName;


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

typedef struct tag_SWbemRpnQueryToken
{
    ULONG   m_uVersion;
    ULONG   m_uTokenType;

    ULONG   m_uSubexpressionShape;
    ULONG   m_uOperator;

    SWmiQueryQualifiedName *m_pRightIdent;
    SWmiQueryQualifiedName *m_pLeftIdent;

    ULONG   m_uRightConstApparentType;  // CIM_ type
    LPVOID  m_pRightConst;

    LPVOID  m_pLeftConst;
    ULONG   m_uLeftConstApparentType;   // CIM_ type

    LPCWSTR pszLeftFunc;
    LPCWSTR pszRightFunc;

}   SWbemRpnQueryToken;


typedef struct tag_SWbemRpnTokenList
{
    ULONG m_uVersion;
    ULONG m_uTokenType;

    ULONG m_uNumTokens;
    SWbemRpnQueryToken *m_pTokens;

}   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_LF_LAST                            = 39
}   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_IN_SELECT     = 0x80,
    WMIQ_RPNF_QUALIFIED_NAMES_IN_WHERE      = 0x100,
    WMIQ_RPNF_PROP_TO_PROP_TESTS            = 0x200,
    WMIQ_RPNF_ORDER_BY                      = 0x400,
    WMIQ_RPNF_ISA_USED                      = 0x800,
    WMIQ_RPNF_ISNOTA_USED                   = 0x1000,
    WMIQ_RPNF_GROUP_BY_HAVING               = 0x2000,
    WMIQ_RPNF_WITHIN_INTERVAL               = 0x4000,
    WMIQ_RPNF_WITHIN_AGGREGATE              = 0x8000,
    WMIQ_RPNF_SYSPROP_CLASS                 = 0x10000,
    WMIQ_RPNF_REFERENCE_TESTS               = 0x20000,
    WMIQ_RPNF_DATETIME_TESTS                = 0x40000,
    WMIQ_RPNF_ARRAY_ACCESS                  = 0x80000,
    WMIQ_RPNF_QUALIFIER_FILTER              = 0x100000,

}   WMIQ_RPNF_FEATURE;


typedef struct tag_SWbemRpnEncodedQuery
{
    ULONG m_uVersion;
    ULONG m_uTokenType;

    // General query features

    ULONGLONG  m_uParsedFeatureMask;     // 64-bit WMIQ_RPNF_ mask

    // 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_uSelectListLength;
    SWmiQueryQualifiedName  **m_pSelectList;

    // Class being selected from

    ULONG   m_uSelectTargetType;
    LPCWSTR m_pszSelectTarget;

    // Where clause

    SWbemRpnTokenList       *m_pRpnWhereClause;

    // WITHIN value

    double  m_dblWithinValue;

    // ORDER BY

    ULONG    m_uOrderByListLength;
    LPCWSTR *m_pszOrderByList;


}   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] long lFlags,
        [in] ULONG uArraySize,
        [in] ULONG *puFeatures
        );

    HRESULT TestLanguageFeatures(
        [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
        );

    HRESULT AttachClassDef(
        [in] REFIID riid,
        [in, iid_is(riid)] LPVOID pClassDef
        );

    HRESULT TestObject(
        [in] ULONG uTestType,
        [in] ULONG uFlags,
        [in] REFIID riid,
        [in, iid_is(riid)] LPVOID pObj
        );

    HRESULT StringTest(
        [in] ULONG  uTestType,
        [in] LPCWSTR pszTestStr,
        [in] LPCWSTR pszExpr
        );
};