/*
 * Copyright 2013 Hans Leidekker for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "dispex.idl";

#ifndef __WIDL__
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

[
    uuid(565783c6-cb41-11d1-8b02-00600806d9b6),
    helpstring("Microsoft WMI Scripting V1.2 Library"),
    lcid(0x0000),
    version(1.2)
]
library WbemScripting
{

importlib("stdole2.tlb");

interface ISWbemEventSource;
interface ISWbemLocator;
interface ISWbemMethod;
interface ISWbemMethodSet;
interface ISWbemNamedValue;
interface ISWbemNamedValueSet;
interface ISWbemObject;
interface ISWbemObjectPath;
interface ISWbemObjectSet;
interface ISWbemPrivilege;
interface ISWbemPrivilegeSet;
interface ISWbemProperty;
interface ISWbemPropertySet;
interface ISWbemQualifier;
interface ISWbemQualifierSet;
interface ISWbemSecurity;
interface ISWbemServices;

[
    object,
    local,
    uuid(27d54d92-0ebe-11d2-8b22-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    nonextensible
]
interface ISWbemEventSource : IDispatch
{
    [ id(1) ]
    HRESULT NextEvent(
        [in] long iTimeoutMs,
        [out, retval] ISWbemObject **objWbemObject);

    [ id(2), propget ]
    HRESULT Security_(
        [out, retval] ISWbemSecurity **objWbemSecurity);
};

[
    object,
    local,
    uuid(76a6415b-cb41-11d1-8b02-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    pointer_default(unique)
]
interface ISWbemLocator : IDispatch
{
    [ id(1) ]
    HRESULT ConnectServer(
        [in] BSTR strServer,
        [in] BSTR strNamespace,
        [in] BSTR strUser,
        [in] BSTR strPassword,
        [in] BSTR strLocale,
        [in] BSTR strAuthority,
        [in] long iSecurityFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemServices **objWbemServices);

    [ id(2), propget ]
    HRESULT Security_(
        ISWbemSecurity **objWbemSecurity);
};

[
    object,
    local,
    uuid(422e8e90-d955-11d1-8b09-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    pointer_default(unique),
    nonextensible
]
interface ISWbemMethod : IDispatch
{
    [ id(1), propget ]
    HRESULT Name(
        [out, retval] BSTR *strName);

    [ id(2), propget ]
    HRESULT Origin(
        [out, retval] BSTR *strOrigin);

    [ id(3), propget ]
    HRESULT InParameters(
        [out, retval] ISWbemObject **objWbemInParameters);

    [ id(4), propget ]
    HRESULT OutParameters(
        [out, retval] ISWbemObject **objWbemOutParameters);

    [ id(5), propget ]
    HRESULT Qualifiers_(
        [out, retval] ISWbemQualifierSet **objWbemQualifierSet);
};

[
    object,
    local,
    uuid(c93ba292-d955-11d1-8b09-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    nonextensible
]
interface ISWbemMethodSet : IDispatch
{
    [ id(DISPID_NEWENUM), propget, restricted ]
    HRESULT _NewEnum(
        [out, retval] IUnknown **pUnk);

    [ id(DISPID_VALUE) ]
    HRESULT Item(
        [in] BSTR strName,
        [in] long iFlags,
        [out, retval] ISWbemMethod **objWbemMethod);

    [ id(1), propget ]
    HRESULT Count(
        [out, retval] long *iCount);
};

[
    object,
    local,
    uuid(76a64164-cb41-11d1-8b02-00600806d9b6),
    dual,
    hidden,
    oleautomation
]
interface ISWbemNamedValue : IDispatch
{
    [ id(DISPID_VALUE), propget ]
    HRESULT Value(
        [out, retval] VARIANT *varValue);

    [ id(DISPID_VALUE), propput ]
    HRESULT Value(
        [in] VARIANT *varValue);

    [ id(2), propget ]
    HRESULT Name(
        [out, retval] BSTR *strName);
};

[
    object,
    local,
    uuid(cf2376ea-ce8c-11d1-8b05-00600806d9b6),
    dual,
    hidden,
    oleautomation
]
interface ISWbemNamedValueSet : IDispatch
{
    [ id(DISPID_NEWENUM), propget, restricted ]
    HRESULT _NewEnum(
        [out, retval] IUnknown **pUnk);

    [ id(DISPID_VALUE) ]
    HRESULT Item(
        [in] BSTR strName,
        [in] long iFlags,
        [out, retval] ISWbemNamedValue **objWbemNamedValue);

    [ id(1), propget ]
    HRESULT Count(
        [out, retval] long *iCount);

    [ id(2) ]
    HRESULT Add(
        [in] BSTR strName,
        [in] VARIANT *varValue,
        [in] long iFlags,
        [out, retval] ISWbemNamedValue **objWbemNamedValue);

    [ id(3) ]
    HRESULT Remove(
        [in] BSTR strName,
        [in] long iFlags);

    [ id(4) ]
    HRESULT Clone(
        [out, retval] ISWbemNamedValueSet **objWbemNamedValueSet);

    [ id(5) ]
    HRESULT DeleteAll();
};

[
    object,
    local,
    uuid(76A6415A-CB41-11d1-8B02-00600806D9B6),
    dual,
    hidden,
    oleautomation
]
interface ISWbemObject : IDispatch
{
    [ id(1) ]
    HRESULT Put_(
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectPath **objWbemObjectPath);

    [ id(2) ]
    HRESULT PutAsync_(
        [in] IDispatch *objWbemSink,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id (3) ]
    HRESULT Delete_(
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet);

    [ id (4) ]
    HRESULT DeleteAsync_(
        [in] IDispatch *objWbemSink,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(5) ]
    HRESULT Instances_(
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(6) ]
    HRESULT InstancesAsync_(
        [in] IDispatch *objWbemSink,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(7) ]
    HRESULT Subclasses_(
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(8) ]
    HRESULT SubclassesAsync_(
        [in] IDispatch *objWbemSink,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(9) ]
    HRESULT Associators_(
        [in] BSTR strAssocClass,
        [in] BSTR strResultClass,
        [in] BSTR strResultRole,
        [in] BSTR strRole,
        [in] VARIANT_BOOL bClassesOnly,
        [in] VARIANT_BOOL bSchemaOnly,
        [in] BSTR strRequiredAssocQualifier,
        [in] BSTR strRequiredQualifier,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(10) ]
    HRESULT AssociatorsAsync_(
        [in] IDispatch *objWbemSink,
        [in] BSTR strAssocClass,
        [in] BSTR strResultClass,
        [in] BSTR strResultRole,
        [in] BSTR strRole,
        [in] VARIANT_BOOL bClassesOnly,
        [in] VARIANT_BOOL bSchemaOnly,
        [in] BSTR strRequiredAssocQualifier,
        [in] BSTR strRequiredQualifier,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(11) ]
    HRESULT References_(
        [in] BSTR strResultClass,
        [in] BSTR strRole,
        [in] VARIANT_BOOL bClassesOnly,
        [in] VARIANT_BOOL bSchemaOnly,
        [in] BSTR strRequiredQualifier,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(12) ]
    HRESULT ReferencesAsync_(
        [in] IDispatch *objWbemSink,
        [in] BSTR strResultClass,
        [in] BSTR strRole,
        [in] VARIANT_BOOL bClassesOnly,
        [in] VARIANT_BOOL bSchemaOnly,
        [in] BSTR strRequiredQualifier,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(13) ]
    HRESULT ExecMethod_(
        [in] BSTR strMethodName,
        [in] IDispatch *objWbemInParameters,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObject **objWbemOutParameters);

    [ id(14) ]
    HRESULT ExecMethodAsync_(
        [in] IDispatch *objWbemSink,
        [in] BSTR strMethodName,
        [in] IDispatch *objWbemInParameters,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(15) ]
    HRESULT Clone_(
        [out, retval] ISWbemObject **objWbemObject);

    [ id(16) ]
    HRESULT GetObjectText_(
        [in] long iFlags,
        [out, retval] BSTR *strObjectText);

    [ id(17) ]
    HRESULT SpawnDerivedClass_(
        [in] long iFlags,
        [out, retval] ISWbemObject **objWbemObject);

    [ id(18) ]
    HRESULT SpawnInstance_(
        [in] long iFlags,
        [out, retval] ISWbemObject **objWbemObject);

    [ id(19) ]
    HRESULT CompareTo_(
        [in] IDispatch *objWbemObject,
        [in] long iFlags,
        [out, retval] VARIANT_BOOL *bResult);

    [ id(20), propget ]
    HRESULT Qualifiers_(
        [out, retval] ISWbemQualifierSet **objWbemQualifierSet);

    [ id(21), propget ]
    HRESULT Properties_(
        [out, retval] ISWbemPropertySet **objWbemPropertySet);

    [ id(22), propget ]
    HRESULT Methods_(
        [out, retval] ISWbemMethodSet **objWbemMethodSet);

    [ id(23), propget ]
    HRESULT Derivation_(
        [out, retval] VARIANT *strClassNameArray);

    [ id(24), propget ]
    HRESULT Path_(
        [out, retval] ISWbemObjectPath **objWbemObjectPath);

    [ id(25), propget ]
    HRESULT Security_(
        [out, retval] ISWbemSecurity **objWbemSecurity);
};

[
    object,
    local,
    uuid(5791bc27-ce9c-11d1-97bf-0000f81e849c),
    dual,
    hidden,
    oleautomation,
    pointer_default(unique)
]
interface ISWbemObjectPath : IDispatch
{
    [ id(DISPID_VALUE), propget ]
    HRESULT Path(
        [out, retval] BSTR *strPath);

    [ id(DISPID_VALUE), propput ]
    HRESULT Path(
        [in] BSTR strPath);

    [ id(1), propget ]
    HRESULT RelPath(
        [out, retval] BSTR *strRelPath);

    [ id(1), propput ]
    HRESULT RelPath(
        [in] BSTR strRelPath);

    [ id(2), propget ]
    HRESULT Server(
        [out, retval] BSTR *strServer);

    [ id(2), propput ]
    HRESULT Server(
        [in] BSTR strServer);

    [ id(3), propget ]
    HRESULT Namespace(
        [out, retval] BSTR *strNamespace);

    [ id(3), propput ]
    HRESULT Namespace(
        [in] BSTR strNamespace);

    [ id(4), propget ]
    HRESULT ParentNamespace(
        [out, retval] BSTR *strParentNamespace);

    [ id(5), propget ]
    HRESULT DisplayName(
        [out, retval] BSTR *strDisplayName);

    [ id(5), propput ]
    HRESULT DisplayName(
        [in] BSTR strDisplayName);

    [ id(6), propget ]
    HRESULT Class(
        [out, retval] BSTR *strClass);

    [ id(6), propput ]
    HRESULT Class(
        [in] BSTR strClass);

    [ id(7), propget ]
    HRESULT IsClass(
        [out, retval] VARIANT_BOOL *bIsClass);

    [ id(8) ]
    HRESULT SetAsClass();

    [ id(9), propget ]
    HRESULT IsSingleton(
        [out, retval] VARIANT_BOOL *bIsSingleton);

    [ id(10) ]
    HRESULT SetAsSingleton();

    [ id(11), propget ]
    HRESULT Keys(
        [out, retval] ISWbemNamedValueSet **objWbemNamedValueSet);

    [ id(12), propget ]
    HRESULT Security_(
        [out, retval] ISWbemSecurity **objWbemSecurity);

    [ id(13), propget ]
    HRESULT Locale(
        [out, retval] BSTR *strLocale);

    [ id(13), propput ]
    HRESULT Locale(
        [in] BSTR strLocale);

    [ id(14), propget ]
    HRESULT Authority(
        [out, retval] BSTR *strAuthority);

    [ id(14), propput ]
    HRESULT Authority(
        [in] BSTR strAuthority);
};

[
    object,
    local,
    uuid(76a6415f-cb41-11d1-8b02-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    nonextensible
]
interface ISWbemObjectSet : IDispatch
{
    [ id(DISPID_NEWENUM), propget, restricted ]
    HRESULT _NewEnum(
        [out, retval] IUnknown **pUnk);

    [ id(DISPID_VALUE) ]
    HRESULT Item(
        [in] BSTR strObjectPath,
        [in] long iFlags,
        [out, retval] ISWbemObject **objWbemObject);

    [ id(1), propget ]
    HRESULT Count(
        [out, retval] long *iCount);

    [ id(4), propget ]
    HRESULT Security_(
        [out, retval] ISWbemSecurity **objWbemSecurity);

    [ id(5) ]
    HRESULT ItemIndex(
        [in] long lIndex,
        [out, retval] ISWbemObject **objWbemObject);
};

typedef
[
    v1_enum,
    uuid(176d2f70-5af3-11d2-8b4a-00600806d9b6)
]
enum WbemPrivilegeEnum
{
    wbemPrivilegeCreateToken          = 1,
    wbemPrivilegePrimaryToken         = 2,
    wbemPrivilegeLockMemory           = 3,
    wbemPrivilegeIncreaseQuota        = 4,
    wbemPrivilegeMachineAccount       = 5,
    wbemPrivilegeTcb                  = 6,
    wbemPrivilegeSecurity             = 7,
    wbemPrivilegeTakeOwnership        = 8,
    wbemPrivilegeLoadDriver           = 9,
    wbemPrivilegeSystemProfile        = 10,
    wbemPrivilegeSystemtime           = 11,
    wbemPrivilegeProfileSingleProcess = 12,
    wbemPrivilegeIncreaseBasePriority = 13,
    wbemPrivilegeCreatePagefile       = 14,
    wbemPrivilegeCreatePermanent      = 15,
    wbemPrivilegeBackup               = 16,
    wbemPrivilegeRestore              = 17,
    wbemPrivilegeShutdown             = 18,
    wbemPrivilegeDebug                = 19,
    wbemPrivilegeAudit                = 20,
    wbemPrivilegeSystemEnvironment    = 21,
    wbemPrivilegeChangeNotify         = 22,
    wbemPrivilegeRemoteShutdown       = 23,
    wbemPrivilegeUndock               = 24,
    wbemPrivilegeSyncAgent            = 25,
    wbemPrivilegeEnableDelegation     = 26,
    wbemPrivilegeManageVolume         = 27
} WbemPrivilegeEnum;

[
    object,
    local,
    uuid(26ee67bd-5804-11d2-8b4a-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    nonextensible
]
interface ISWbemPrivilege : IDispatch
{
    [ id(DISPID_VALUE), propget ]
    HRESULT IsEnabled(
        [out, retval] VARIANT_BOOL *bIsEnabled);

    [ id(DISPID_VALUE), propput ]
    HRESULT IsEnabled(
        [in] VARIANT_BOOL bIsEnabled);

    [ id(1), propget ]
    HRESULT Name(
        [out, retval] BSTR *strDisplayName);

    [ id(2), propget ]
    HRESULT DisplayName(
        [out, retval] BSTR *strDisplayName);

    [ id(3), propget ]
    HRESULT Identifier(
        [out, retval] WbemPrivilegeEnum *iPrivilege);
};

[
    object,
    local,
    uuid(26ee67bf-5804-11d2-8b4a-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    nonextensible
]
interface ISWbemPrivilegeSet : IDispatch
{
    [ id(DISPID_NEWENUM), propget, restricted ]
    HRESULT _NewEnum(
        [out, retval] IUnknown **pUnk);

    [ id(DISPID_VALUE) ]
    HRESULT Item(
        [in] WbemPrivilegeEnum iPrivilege,
        [out, retval] ISWbemPrivilege **objWbemPrivilege);

    [ id(1), propget ]
    HRESULT Count(
        [out, retval] long *iCount);

    [ id(2) ]
    HRESULT Add(
        [in] WbemPrivilegeEnum iPrivilege,
        [in] VARIANT_BOOL bIsEnabled,
        [out, retval] ISWbemPrivilege **objWbemPrivilege);

    [ id(3) ]
    HRESULT Remove(
        [in] WbemPrivilegeEnum iPrivilege);

    [ id(4) ]
    HRESULT DeleteAll();

    [ id(5) ]
    HRESULT AddAsString(
        [in] BSTR strPrivilege,
        [in] VARIANT_BOOL bIsEnabled,
        [out, retval] ISWbemPrivilege **objWbemPrivilege);
};

typedef
[
    v1_enum,
    uuid(4a249b7b-fc9a-11d1-8b1e-00600806d9b6),
]
enum WbemCimtypeEnum
{
    wbemCimtypeSint16    = 2,
    wbemCimtypeSint32    = 3,
    wbemCimtypeReal32    = 4,
    wbemCimtypeReal64    = 5,
    wbemCimtypeString    = 8,
    wbemCimtypeBoolean   = 11,
    wbemCimtypeObject    = 13,
    wbemCimtypeSint8     = 16,
    wbemCimtypeUint8     = 17,
    wbemCimtypeUint16    = 18,
    wbemCimtypeUint32    = 19,
    wbemCimtypeSint64    = 20,
    wbemCimtypeUint64    = 21,
    wbemCimtypeDatetime  = 101,
    wbemCimtypeReference = 102,
    wbemCimtypeChar16    = 103
} WbemCimtypeEnum;

[
    object,
    local,
    uuid(1a388f98-d4ba-11d1-8b09-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    pointer_default(unique)
]
interface ISWbemProperty : IDispatch
{
    [ id(DISPID_VALUE), propget ]
    HRESULT Value(
        [out, retval] VARIANT *varValue);

    [ id(DISPID_VALUE), propput ]
    HRESULT Value(
        [in] VARIANT *varValue);

    [ id(1), propget ]
    HRESULT Name(
        [out, retval] BSTR *strName);

    [ id(2), propget ]
    HRESULT IsLocal(
        [out, retval] VARIANT_BOOL *bIsLocal);

    [ id(3), propget ]
    HRESULT Origin(
        [out, retval] BSTR *strOrigin);

    [ id(4), propget ]
    HRESULT CIMType(
        [out, retval] WbemCimtypeEnum *iCimType);

    [ id(5), propget ]
    HRESULT Qualifiers_(
        [out, retval] ISWbemQualifierSet **objWbemQualifierSet);

    [ id(6), propget ]
    HRESULT IsArray(
        [out, retval] VARIANT_BOOL *bIsArray);
};

[
    object,
    local,
    uuid(dea0a7b2-d4ba-11d1-8b09-00600806d9b6),
    dual,
    hidden,
    oleautomation
]
interface ISWbemPropertySet : IDispatch
{
    [ id(DISPID_NEWENUM), propget, restricted ]
    HRESULT _NewEnum(
        [out, retval] IUnknown **pUnk);

    [ id(DISPID_VALUE) ]
    HRESULT Item(
        [in] BSTR strName,
        [in] long iFlags,
        [out, retval] ISWbemProperty **objWbemProperty);

    [ id(1), propget ]
    HRESULT Count(
        [out, retval] long *iCount);

    [ id(2) ]
    HRESULT Add(
        [in] BSTR strName,
        [in] WbemCimtypeEnum iCIMType,
        [in] VARIANT_BOOL bIsArray,
        [in] long iFlags,
        [out, retval] ISWbemProperty **objWbemProperty);

    [ id(3) ]
    HRESULT Remove(
        [in] BSTR strName,
        [in] long iFlags);
};

[
    object,
    local,
    uuid(79b05932-d3b7-11d1-8b06-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    nonextensible,
    pointer_default(unique)
]
interface ISWbemQualifier : IDispatch
{
    [ id(DISPID_VALUE), propget ]
    HRESULT Value(
        [out, retval] VARIANT *varValue);

    [ id(DISPID_VALUE), propput ]
    HRESULT Value(
        [in] VARIANT *varValue);

    [ id(1), propget ]
    HRESULT Name(
        [out, retval] BSTR *strName);

    [ id(2), propget ]
    HRESULT IsLocal(
        [out, retval] VARIANT_BOOL *bIsLocal);

    [ id(3), propget ]
    HRESULT PropagatesToSubclass(
        [out, retval] VARIANT_BOOL *bPropagatesToSubclass);

    [ id(3), propput ]
    HRESULT PropagatesToSubclass(
        [in] VARIANT_BOOL bPropagatesToSubclass);

    [ id(4), propget ]
    HRESULT PropagatesToInstance(
        [out, retval] VARIANT_BOOL *bPropagatesToInstance);

    [ id(4), propput ]
    HRESULT PropagatesToInstance(
        [in] VARIANT_BOOL bPropagatesToInstance);

    [ id(5), propget ]
    HRESULT IsOverridable(
        [out, retval] VARIANT_BOOL *bIsOverridable);

    [ id(5), propput ]
    HRESULT IsOverridable(
        [in] VARIANT_BOOL bIsOverridable);

    [ id(6), propget ]
    HRESULT IsAmended(
        [out, retval] VARIANT_BOOL *bIsAmended);
};

[
    object,
    local,
    uuid(9b16ed16-d3df-11d1-8b08-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    nonextensible
]
interface ISWbemQualifierSet : IDispatch
{
    [ id(DISPID_NEWENUM), propget, restricted ]
    HRESULT _NewEnum(
        [out, retval] IUnknown **pUnk);

    [ id(DISPID_VALUE) ]
    HRESULT Item(
        [in] BSTR name,
        [in] long iFlags,
        [out, retval] ISWbemQualifier **objWbemQualifier);

    [ id(1), propget ]
    HRESULT Count(
        [out, retval] long *iCount);

    [ id(2) ]
    HRESULT Add(
        [in] BSTR strName,
        [in] VARIANT *varVal,
        [in] VARIANT_BOOL bPropagatesToSubclass,
        [in] VARIANT_BOOL bPropagatesToInstance,
        [in] VARIANT_BOOL bIsOverridable,
        [in] long iFlags,
        [out, retval] ISWbemQualifier **objWbemQualifier);

    [ id(3) ]
    HRESULT Remove(
        [in] BSTR strName,
        [in] long iFlags);
};

typedef
[
    v1_enum,
    uuid(b54d66e8-2287-11d2-8b33-00600806d9b6)
]
enum WbemImpersonationLevelEnum
{
    wbemImpersonationLevelAnonymous   = 1,
    wbemImpersonationLevelIdentify    = 2,
    wbemImpersonationLevelImpersonate = 3,
    wbemImpersonationLevelDelegate    = 4
} WbemImpersonationLevelEnum;

typedef
[
    v1_enum,
    uuid(b54d66e7-2287-11d2-8b33-00600806d9b6)
]
enum WbemAuthenticationLevelEnum
{
    wbemAuthenticationLevelDefault      = 0,
    wbemAuthenticationLevelNone         = 1,
    wbemAuthenticationLevelConnect      = 2,
    wbemAuthenticationLevelCall         = 3,
    wbemAuthenticationLevelPkt          = 4,
    wbemAuthenticationLevelPktIntegrity = 5,
    wbemAuthenticationLevelPktPrivacy   = 6
} WbemAuthenticationLevelEnum;

[
    object,
    local,
    uuid(b54d66e6-2287-11d2-8b33-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    nonextensible
]
interface ISWbemSecurity : IDispatch
{
    [ id(1), propget ]
    HRESULT ImpersonationLevel(
        [out, retval] WbemImpersonationLevelEnum *iImpersonationLevel);

    [ id(1), propput ]
    HRESULT ImpersonationLevel(
        [in] WbemImpersonationLevelEnum iImpersonationLevel);

    [ id(2), propget ]
    HRESULT AuthenticationLevel(
        [out, retval] WbemAuthenticationLevelEnum *iAuthenticationLevel);

    [ id(2), propput ]
    HRESULT AuthenticationLevel(
        [in] WbemAuthenticationLevelEnum iAuthenticationLevel);

    [ id(3), propget ]
    HRESULT Privileges(
        [out, retval] ISWbemPrivilegeSet **objWbemPrivilegeSet);
};

[
    object,
    local,
    uuid(76a6415c-cb41-11d1-8b02-00600806d9b6),
    dual,
    hidden,
    oleautomation,
    pointer_default(unique)
]
interface ISWbemServices : IDispatch
{
    [ id(1) ]
    HRESULT Get(
        [in] BSTR strObjectPath,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObject **objWbemObject);

    [ id(2) ]
    HRESULT GetAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strObjectPath,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(3) ]
    HRESULT Delete(
        [in] BSTR strObjectPath,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet);

    [ id(4) ]
    HRESULT DeleteAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strObjectPath,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(5) ]
    HRESULT InstancesOf(
        [in] BSTR strClass,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(6) ]
    HRESULT InstancesOfAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strClass,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(7) ]
    HRESULT SubclassesOf(
        [in]  BSTR strSuperclass,
        [in]  long iFlags,
        [in]  IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(8) ]
    HRESULT SubclassesOfAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strSuperclass,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(9) ]
    HRESULT ExecQuery(
        [in] BSTR strQuery,
        [in] BSTR strQueryLanguage,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(10) ]
    HRESULT ExecQueryAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strQuery,
        [in] BSTR strQueryLanguage,
        [in] long lFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(11) ]
    HRESULT AssociatorsOf(
        [in] BSTR strObjectPath,
        [in] BSTR strAssocClass,
        [in] BSTR strResultClass,
        [in] BSTR strResultRole,
        [in] BSTR strRole,
        [in] VARIANT_BOOL bClassesOnly,
        [in] VARIANT_BOOL bSchemaOnly,
        [in] BSTR strRequiredAssocQualifier,
        [in] BSTR strRequiredQualifier,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(12) ]
    HRESULT AssociatorsOfAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strObjectPath,
        [in] BSTR strAssocClass,
        [in] BSTR strResultClass,
        [in] BSTR strResultRole,
        [in] BSTR strRole,
        [in] VARIANT_BOOL bClassesOnly,
        [in] VARIANT_BOOL bSchemaOnly,
        [in] BSTR strRequiredAssocQualifier,
        [in] BSTR strRequiredQualifier,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(13) ]
    HRESULT ReferencesTo(
        [in] BSTR strObjectPath,
        [in] BSTR strResultClass,
        [in] BSTR strRole,
        [in] VARIANT_BOOL bClassesOnly,
        [in] VARIANT_BOOL bSchemaOnly,
        [in] BSTR strRequiredQualifier,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObjectSet **objWbemObjectSet);

    [ id(14) ]
    HRESULT ReferencesToAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strObjectPath,
        [in] BSTR strResultClass,
        [in] BSTR strRole,
        [in] VARIANT_BOOL bClassesOnly,
        [in] VARIANT_BOOL bSchemaOnly,
        [in] BSTR strRequiredQualifier,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(15) ]
    HRESULT ExecNotificationQuery(
        [in] BSTR strQuery,
        [in] BSTR strQueryLanguage,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemEventSource **objWbemEventSource);

    [ id(16) ]
    HRESULT ExecNotificationQueryAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strQuery,
        [in] BSTR strQueryLanguage,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(17) ]
    HRESULT ExecMethod(
        [in] BSTR strObjectPath,
        [in] BSTR strMethodName,
        [in] IDispatch *objWbemInParameters,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [out, retval] ISWbemObject **objWbemOutParameters);

    [ id(18) ]
    HRESULT ExecMethodAsync(
        [in] IDispatch *objWbemSink,
        [in] BSTR strObjectPath,
        [in] BSTR strMethodName,
        [in] IDispatch *objWbemInParameters,
        [in] long iFlags,
        [in] IDispatch *objWbemNamedValueSet,
        [in] IDispatch *objWbemAsyncContext);

    [ id(19), propget ]
    HRESULT Security_(
        [out, retval] ISWbemSecurity **objWbemSecurity);
};

[
    threading(apartment),
    uuid(76a64158-cb41-11d1-8b02-00600806d9b6),
    progid("WbemScripting.SWbemLocator.1"),
    vi_progid("WbemScripting.SWbemLocator")
]
coclass SWbemLocator
{
    interface ISWbemLocator;
};

}; /* WbemScripting */
