/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: WBEMNAME.H Abstract: Implements the COM layer of WINMGMT --- the class representing a namespace. It is defined in wbemname.h History: 23-Jul-96 raymcc Created. 3/10/97 levn Fully documented (ha ha) 22-Feb-00 raymcc Whistler revisions/extensions --*/ #ifndef _WBEM_NAME_H_ #define _WBEM_NAME_H_ #define WBEM_FLAG_NO_STATIC 0x80000000 #define WBEM_FLAG_ONLY_STATIC 0x40000000 class CFlexAceArray; struct SAssocTriad { IWbemClassObject *m_pEp1; IWbemClassObject *m_pEp2; IWbemClassObject *m_pAssoc; SAssocTriad() { m_pEp1 = 0; m_pEp2 = 0; m_pAssoc = 0; } ~SAssocTriad() { ReleaseIfNotNULL(m_pEp1); ReleaseIfNotNULL(m_pEp2); ReleaseIfNotNULL(m_pAssoc); } static void ArrayCleanup(CFlexArray &Array) { for (int i = 0; i < Array.Size(); i++) delete (SAssocTriad *) Array[i]; Array.Empty(); } }; //****************************************************************************** //****************************************************************************** // // class CWbemNamespace // // This class represents the COM layer of WINMGMT --- what the client sees. An // instance of this class is created whenever a namespace is opened by a client // (at the moment, we don't cache namespace pointers, so if a client opens the // same namespace twice, we will create to of these). // //****************************************************************************** // // Constructor // // Enumerates all the class providers in this namespace (instances of // __Win32Provider with the method mask indicating a class provider), loads // them all and initializes them by calling ConnectServer. // //****************************************************************************** //*************************** interface IWbemServices ************************** // // See help for documentation of the IWbemServices interface. // //****************************************************************************** //************************** helper functions ********************************** // // Are documented in the wbemname.cpp file. // //****************************************************************************** class CWbemNamespace : public IWbemServicesEx, public IWbemInternalServices, public IWbemShutdown, public IWbemUnloadingControl { public: enum ERestriction { e_NoRestriction = 0, e_RestrictionDisabled, e_RestrictionNoClassProv, e_RestrictionStaticOnly }; enum EIFaceType { eNull = 0, eNamespace = 1, eScope = 2, eCollection = 3 }; protected: friend class CQueryEngine; DWORD m_dwIfaceType; BOOL m_bShutDown; // Collection-related IWbemClassObject *m_pCollectionClass; IWbemClassObject *m_pCollectionEp; LPWSTR m_pszCollectionEpPath; long m_lEpRefPropHandle; long m_lTargetRefPropHandle; // DWORD Status; ULONG m_uSecondaryRefCount; ULONG m_uPrimaryRefCount; // owned by the arbitrator LONG m_lConfigFlags; IWmiDbSession *m_pSession; IWmiDbController *m_pDriver; IWmiDbHandle *m_pNsHandle; IWmiDbHandle *m_pScopeHandle; _IWmiArbitrator *m_pArb; BOOL m_bSubscope; LPWSTR m_pThisNamespace; DWORD m_dwPermission; DWORD m_dwSecurityFlags; LPWSTR m_wszUserName; ERestriction m_eRestriction; BOOL m_bProvider; BOOL m_bESS; BOOL m_bForClient; ULONG m_uClientMask; CRITICAL_SECTION m_cs; WString m_wsLocale; CNtSecurityDescriptor m_sd; CNtSecurityDescriptor m_sdCheckAdmin; BOOL m_bSecurityInitialized; BOOL m_bNT; DWORD m_dwTransactionState; GUID *m_pTransGuid; _IWmiProviderFactory *m_pProvFact; _IWmiCoreServices *m_pCoreSvc; BOOL m_bRepositOnly; IUnknown *m_pRefreshingSvc; IUnknown *m_pWbemComBinding; LPWSTR m_pszClientMachineName; DWORD m_dwClientProcessID; // No access CWbemNamespace(); ~CWbemNamespace(); // Async impl entry points virtual HRESULT STDMETHODCALLTYPE _GetObjectAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler ); virtual HRESULT STDMETHODCALLTYPE _PutClassAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN IWbemClassObject __RPC_FAR *pObject, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _DeleteClassAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strClass, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _CreateClassEnumAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strSuperclass, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _PutInstanceAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN IWbemClassObject __RPC_FAR *pInst, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _DeleteInstanceAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _CreateInstanceEnumAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strFilter, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _ExecQueryAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strQueryLanguage, IN const BSTR strQuery, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _ExecNotificationQueryAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strQueryLanguage, IN const BSTR strQuery, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _ExecMethodAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strObjectPath, IN const BSTR strMethodName, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemClassObject __RPC_FAR *pInParams, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _OpenAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strScope, IN const BSTR strParam, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSinkEx __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _AddAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _RemoveAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _RefreshObjectAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN OUT IWbemClassObject __RPC_FAR *__RPC_FAR *pTarget, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSinkEx __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE _RenameObjectAsync( IN ULONG uInternalFlags, IN _IWmiFinalizer *p, IN _IWmiCoreHandle *phTask, IN const BSTR strOldObjectPath, IN const BSTR strNewObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); HRESULT CreateNamespace(CWbemInstance *pNewInst); public: /* IUnknown methods */ STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj); STDMETHOD_(ULONG, AddRef)(THIS); STDMETHOD_(ULONG, Release)(THIS); // Real entry points // IWbemServices virtual HRESULT STDMETHODCALLTYPE OpenNamespace( IN const BSTR strNamespace, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemServices __RPC_FAR *__RPC_FAR *ppWorkingNamespace, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppResult); virtual HRESULT STDMETHODCALLTYPE CancelAsyncCall( IN IWbemObjectSink __RPC_FAR *pSink); virtual HRESULT STDMETHODCALLTYPE QueryObjectSink( IN long lFlags, /* [out] */ IWbemObjectSink __RPC_FAR *__RPC_FAR *ppResponseHandler); virtual HRESULT STDMETHODCALLTYPE GetObject( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemClassObject __RPC_FAR *__RPC_FAR *ppObject, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE GetObjectAsync( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE PutClass( IN IWbemClassObject __RPC_FAR *pObject, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE PutClassAsync( IN IWbemClassObject __RPC_FAR *pObject, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE DeleteClass( IN const BSTR strClass, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE DeleteClassAsync( IN const BSTR strClass, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE CreateClassEnum( IN const BSTR strSuperclass, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum); virtual HRESULT STDMETHODCALLTYPE CreateClassEnumAsync( IN const BSTR strSuperclass, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE PutInstance( IN IWbemClassObject __RPC_FAR *pInst, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE PutInstanceAsync( IN IWbemClassObject __RPC_FAR *pInst, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE DeleteInstance( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE DeleteInstanceAsync( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE CreateInstanceEnum( IN const BSTR strFilter, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum); virtual HRESULT STDMETHODCALLTYPE CreateInstanceEnumAsync( IN const BSTR strFilter, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE ExecQuery( IN const BSTR strQueryLanguage, IN const BSTR strQuery, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum); virtual HRESULT STDMETHODCALLTYPE ExecQueryAsync( IN const BSTR strQueryLanguage, IN const BSTR strQuery, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE ExecNotificationQuery( IN const BSTR strQueryLanguage, IN const BSTR strQuery, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum); virtual HRESULT STDMETHODCALLTYPE ExecNotificationQueryAsync( IN const BSTR strQueryLanguage, IN const BSTR strQuery, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE ExecMethod( IN const BSTR strObjectPath, IN const BSTR strMethodName, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemClassObject __RPC_FAR *pInParams, /* [unique][in][out] */ IWbemClassObject __RPC_FAR *__RPC_FAR *ppOutParams, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE ExecMethodAsync( IN const BSTR strObjectPath, IN const BSTR strMethodName, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemClassObject __RPC_FAR *pInParams, IN IWbemObjectSink __RPC_FAR *pResponseHandler); // IWbemServicesEx virtual HRESULT STDMETHODCALLTYPE Open( IN const BSTR strScope, IN const BSTR strParam, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemServicesEx __RPC_FAR *__RPC_FAR *ppScope, /* [unique][in][out] */ IWbemCallResultEx __RPC_FAR *__RPC_FAR *ppResult); virtual HRESULT STDMETHODCALLTYPE OpenAsync( IN const BSTR strScope, IN const BSTR strParam, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSinkEx __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE Add( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResultEx __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE AddAsync( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE Remove( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResultEx __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE RemoveAsync( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE RefreshObject( /* [out][in] */ IWbemClassObject __RPC_FAR *__RPC_FAR *pTarget, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResultEx __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE RefreshObjectAsync( /* [out][in] */ IWbemClassObject __RPC_FAR *__RPC_FAR *pTarget, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSinkEx __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE RenameObject( IN const BSTR strOldObjectPath, IN const BSTR strNewObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResultEx __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE RenameObjectAsync( IN const BSTR strOldObjectPath, IN const BSTR strNewObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE DeleteObject( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE DeleteObjectAsync( IN const BSTR strObjectPath, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE PutObject( IN IWbemClassObject __RPC_FAR *pObj, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE PutObjectAsync( IN IWbemClassObject __RPC_FAR *pObj, IN long lFlags, IN IWbemContext __RPC_FAR *pCtx, IN IWbemObjectSink __RPC_FAR *pResponseHandler); // IWbemInternalServices STDMETHOD(FindKeyRoot)(LPCWSTR wszClassName, IWbemClassObject** ppKeyRootClass); STDMETHOD(InternalGetClass)( LPCWSTR wszClassName, IWbemClassObject** ppClass); STDMETHOD(InternalGetInstance)( LPCWSTR wszPath, IWbemClassObject** ppInstance); STDMETHOD(InternalExecQuery)( LPCWSTR wszQueryLanguage, LPCWSTR wszQuery, long lFlags, IWbemObjectSink* pSink); STDMETHOD(InternalCreateInstanceEnum)( LPCWSTR wszClassName, long lFlags, IWbemObjectSink* pSink); STDMETHOD(GetDbInstance)( LPCWSTR wszDbKey, IWbemClassObject** ppInstance); STDMETHOD(GetDbReferences)( IWbemClassObject* pEndpoint, IWbemObjectSink* pSink); STDMETHOD(InternalPutInstance)( IWbemClassObject* pInst); // IWbemShutdown virtual HRESULT STDMETHODCALLTYPE Shutdown( IN LONG uReason, IN ULONG uMaxMilliseconds, IN IWbemContext __RPC_FAR *pCtx); /* IWbemUnloadingControl methods */ STDMETHOD(SetMustPreventUnloading)(boolean bPrevent); // Other STDMETHOD(GetNormalizedPath)( BSTR pstrPath, BSTR* pstrStandardPath ); static CWbemNamespace* CreateInstance(); HRESULT Initialize( LPWSTR pName, LPWSTR wszUserName, DWORD dwSecFlags, DWORD dwPermission, BOOL bForClient, BOOL bRepositOnly, LPCWSTR pszClientMachineName, DWORD dwClientProcessID, BOOL bSkipSDInitialize, IWmiDbSession *pParentSession ); int __cdecl taskprintf(const char *fmt, ...); public: IWmiDbHandle *GetNsHandle() { return m_pNsHandle; } IWmiDbSession *GetNsSession() { return m_pSession; } IWmiDbHandle *GetScope() { return m_pScopeHandle; } BOOL IsSubscope() { return m_bSubscope; } INTERNAL LPWSTR GetName() {return m_pThisNamespace;} DWORD& GetStatus() {return Status;} LONG GetConfigurationFlags(); INTERNAL LPWSTR GetUserName() {return m_wszUserName;} INTERNAL void SetUserName(LPWSTR wName); DWORD GetSecurityFlags() {return m_dwSecurityFlags;} bool Allowed(DWORD dwRequired); void SetRestriction(ERestriction eRestriction) {m_eRestriction = eRestriction;} void SetIsProvider(BOOL bProvider) {m_bProvider = bProvider;} void SetIsESS ( BOOL bESS ) { m_bESS = bESS; } BOOL GetIsESS ( ) { return m_bESS; } BOOL GetIsProvider ( ) { return m_bProvider ; } // void MapSink(IWbemObjectSink* pSink, CWrapperSink* pWrapper); // void UnmapSink(IWbemObjectSink* pSink, CWrapperSink* pWrapper); // CWrapperSink* FindWrapper(IWbemObjectSink* pSink); void SetLocale(LPCWSTR wszLocale) {m_wsLocale = wszLocale;} LPCWSTR GetLocale() {return m_wsLocale;} LPWSTR GetClientMachine(){return m_pszClientMachineName;}; DWORD GetClientProcID(){return m_dwClientProcessID;}; HRESULT AdjustPutContext(IWbemContext *pCtx); HRESULT MergeGetKeysCtx(IN IWbemContext *pCtx); HRESULT SplitLocalized (CWbemObject *pOriginal, CWbemObject *pStoredObj = NULL); HRESULT FixAmendedQualifiers(IWbemQualifierSet *pOriginal, IWbemQualifierSet *pNew); // Worker functions for sync/async // =============================== HRESULT Exec_DeleteClass(LPWSTR wszClass, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT Exec_GetObjectByPath(READONLY LPWSTR wszObjectPath, long lFlags, IWbemContext* pContext, IWbemClassObject** ppObj, IWbemClassObject** ppErrorObj); HRESULT Exec_GetObject(READONLY LPWSTR wszObjectPath, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT Exec_DeleteInstance(LPWSTR wszObjectPath, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT Exec_PutClass(IWbemClassObject* pClass, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink, BOOL fIsInternal = FALSE); HRESULT Exec_PutInstance(IWbemClassObject* pInstance, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT Exec_CreateClassEnum(LPWSTR wszParent, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT Exec_CreateInstanceEnum(LPWSTR wszClass, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT Exec_ExecMethod(LPWSTR wszObjectPath, LPWSTR wszMethodName, long lFlags, IWbemClassObject *pInParams, IWbemContext *pCtx, CBasicObjectSink* pSink); static HRESULT Exec_CancelAsyncCall(IWbemObjectSink* pSink); static HRESULT Exec_CancelProvAsyncCall( IWbemServices* pProv, IWbemObjectSink* pSink ); HRESULT GetImplementationClass(IWbemClassObject *pTestObj, LPWSTR wszMethodName, IWbemContext* pCtx, IWbemClassObject **pClassObj); HRESULT Exec_GetInstance(LPCWSTR wszObjectPath, IWbemPath* pParsedPath, long lFlags, IWbemContext* Context, CBasicObjectSink* pSink); HRESULT Exec_GetClass(LPCWSTR wszClassName, long lFlags, IWbemContext* Context, CBasicObjectSink* pSink); HRESULT Exec_Open(LPWSTR pszScope, LPWSTR pszParam, LONG lUserFlags, IWbemContext *pCtx, IWbemObjectSinkEx *pSink ); HRESULT Exec_Rename(LPWSTR pszOld, LPWSTR pszNew, LONG lUserFlags, IWbemContext *pCtx, IWbemObjectSink *pSink); HRESULT Exec_Add(LPWSTR pszPath, LONG lUserFlags, IWbemContext *pCtx, IWbemObjectSink *pSink); HRESULT Exec_Remove(LPWSTR pszPath, LONG lUserFlags, IWbemContext *pCtx, IWbemObjectSink *pSink); HRESULT Exec_Refresh(IWbemClassObject *pObj, LONG lUserFlags, IWbemContext *pCtx, IWbemObjectSink *pSink); HRESULT SetErrorObj(IWbemClassObject* pErrorObj); HRESULT RecursivePutInstance(CWbemInstance* pInst, CWbemClass* pClassDef, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink, BOOL bLast); HRESULT RecursiveDeleteInstance(LPCWSTR wszObjectPath, CDynasty* pDynasty, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT DeleteSingleInstance( READONLY LPWSTR wszObjectPath, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT InternalPutStaticClass( IWbemClassObject* pClass ); // Assoc-by-rule helpers // ===================== HRESULT ManufactureAssocs( IN IWbemClassObject *pAssocClass, IN IWbemClassObject *pEp, // Optional IN IWbemContext *pCtx, IN LPWSTR pszJoinQuery, OUT CFlexArray &aTriads ); HRESULT BuildAssocTriads( IN IWbemClassObject *pAssocClass, IN IWbemClassObject *pClsDef1, IN IWbemClassObject *pClsDef2, IN LPWSTR pszJoinProp1, IN LPWSTR pszJoinProp2, IN LPWSTR pszAssocRef1, // Prop which points to EP1 IN LPWSTR pszAssocRef2, // Prop which points to EP2 IN CFlexArray &aEp1, IN CFlexArray &aEp2, IN OUT CFlexArray &aTriads ); HRESULT BuildRuleBasedPathToInst( IN IWbemClassObject *pEp, IN LPWSTR pszJoinProp1, IN IWbemClassObject *pEp2, IN LPWSTR pszJoinProp2, OUT WString &wsNewPath ); HRESULT ExtractEpInfoFromQuery( IWbemQuery *pQuery, LPWSTR *pszClass1, LPWSTR *pszProp1, LPWSTR *pClass2, LPWSTR *pszProp2 ); HRESULT MapAssocRefsToClasses( IN IWbemClassObject *pAssocClass, IN IWbemClassObject *pClsDef1, IN IWbemClassObject *pClsDef2, IN LPWSTR *pszAssocRef1, OUT LPWSTR *pszAssocRef2 ); // Property provider access. // ========================= typedef enum {GET, PUT} Operation; HRESULT GetOrPutDynProps ( IWbemClassObject *pObj, Operation op, BOOL bIsDynamic = false ); HRESULT Exec_DynAux_GetInstances ( READONLY CWbemObject *pClassDef, long lFlags, IWbemContext* pCtx, CBasicObjectSink* pSink ) ; HRESULT DynAux_GetInstances ( CWbemObject *pClassDef, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink, BOOL bComplexQuery ) ; HRESULT DynAux_GetInstance ( LPWSTR pObjPath, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink ); HRESULT DynAux_AskRecursively ( CDynasty* pDynasty, long lFlags, LPWSTR wszObjectPath, IWbemContext* pContext, CBasicObjectSink* pSink ); HRESULT DynAux_GetSingleInstance ( CWbemClass* pClassDef, long lFlags, LPWSTR wszObjectPath, IWbemContext* pContext, CBasicObjectSink* pSink ); HRESULT Exec_DynAux_ExecQueryAsync ( CWbemObject* pClassDef, LPWSTR Query, LPWSTR QueryFormat, long lFlags, IWbemContext* pCtx, CBasicObjectSink* pSink ) ; HRESULT DynAux_ExecQueryAsync ( CWbemObject* pClassDef, LPWSTR Query, LPWSTR QueryFormat, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink, BOOL bComplexQuery ); HRESULT DynAux_ExecQueryExtendedAsync( LPWSTR wsProvider, LPWSTR Query, LPWSTR QueryFormat, long lFlags, IWbemContext* pCtx, CComplexProjectionSink* pSink ) ; HRESULT GetObjectByFullPath( READONLY LPWSTR wszObjectPath, IWbemPath * pOutput, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink ); HRESULT DynAux_BuildClassHierarchy(IN LPWSTR wszClassName, IN LONG lFlags, IN IWbemContext* pContext, OUT CDynasty** ppDynasty, OUT IWbemClassObject** ppErrorObj); HRESULT DynAux_BuildChainUp(IN CDynasty* pOriginal, IN IWbemContext* pContext, OUT CDynasty** ppTop, OUT IWbemClassObject** ppErrorObj); HRESULT DecorateObject(IWbemClassObject* pObject); BOOL IsDerivableClass(LPCWSTR wszClassName, CWbemClass* pClass); static HRESULT IsPutRequiredForClass(CWbemClass* pClass, CWbemInstance* pInst, IWbemContext* pContext, BOOL bParentTakenCareOf); static HRESULT DoesNeedToBePut(LPCWSTR wszName, CWbemInstance* pInst, BOOL bRestrictedPut, BOOL bStrictNulls, BOOL bPropertyList, CWStringArray& awsProperties); static HRESULT GetContextPutExtensions(IWbemContext* pContext, BOOL& bRestrictedPut, BOOL& bStrictNulls, BOOL& bPropertyList, CWStringArray& awsProperties); static HRESULT GetContextBoolean(IWbemContext* pContext, LPCWSTR wszName, BOOL* pbValue); void Enter() {EnterCriticalSection(&m_cs);} void Leave() {LeaveCriticalSection(&m_cs);} HRESULT GetAceList(CFlexAceArray **); HRESULT PutAceList(CFlexAceArray *); HRESULT InitializeSD(IWmiDbSession *pSession); CNtSecurityDescriptor & GetSDRef(){return m_sd;}; DWORD GetUserAccess(); DWORD GetWin9XUserAccess(); DWORD GetNTUserAccess(); HRESULT EnsureSecurity(); void SetPermissions(DWORD dwPerm){m_dwPermission = dwPerm;}; HRESULT InitializeUserLists(CFlexAceArray & AllowList,CFlexAceArray & DenyList); HRESULT SecurityMethod(LPWSTR wszMethodName, long lFlags, IWbemClassObject *pInParams, IWbemContext *pCtx, IWbemObjectSink* pSink); HRESULT GetSDMethod(IWbemClassObject* pOutParams); HRESULT Get9XUserListMethod(IWbemClassObject* pOutParams); HRESULT RecursiveSDMerge(); BOOL IsNamespaceSDProtected(); HRESULT GetParentsInheritableAces(CNtSecurityDescriptor &sd); HRESULT SetSDMethod(IWbemClassObject* pInParams); HRESULT Set9XUserListMethod(IWbemClassObject* pInParams); HRESULT GetCallerAccessRightsMethod(IWbemClassObject* pOutParams); static void EmptyObjectList(CFlexArray &); // Helper function for refresher operations HRESULT CreateRefreshableObjectTemplate( LPCWSTR wszObjectPath, long lFlags, IWbemClassObject** ppInst ); BOOL IsForClient(){return m_bForClient;}; HRESULT PossibleDbUpgrade(CFlexAceArray * pNew); HRESULT EnumerateSecurityClassInstances(LPWSTR wszClassName, IWbemObjectSink* pOwnSink, IWbemContext* pContext, long lFlags); HRESULT PutSecurityClassInstances(LPWSTR wszClassName, IWbemClassObject * pClass, IWbemObjectSink* pSink, IWbemContext* pContext, long lFlags); HRESULT DeleteSecurityClassInstances(ParsedObjectPath* pParsedPath, IWbemObjectSink* pSink, IWbemContext* pContext, long lFlags); HRESULT GetSecurityClassInstances(ParsedObjectPath* pParsedPath, CBasicObjectSink* pSink, IWbemContext* pContext,long lFlags); HRESULT CheckNs(); HRESULT TestForVector( IN IWbemClassObject *pVector, OUT BSTR* strVectorPath ); HRESULT InitNewTask( IN CAsyncReq *pReq, IN _IWmiFinalizer *pFnz, IN ULONG uTaskType, IN IWbemContext *pCtx, IN IWbemObjectSink *pAsyncClientSink ); HRESULT CreateAsyncFinalizer( IN IWbemContext *pContext, IN IWbemObjectSink *pStartingSink, IN _IWmiFinalizer **pFnz, OUT IWbemObjectSinkEx **pResultSinkEx ); HRESULT CreateSyncFinalizer( IN IWbemContext *pContext, IN _IWmiFinalizer **pFnz ); HRESULT ExecSyncQuery( IN LPWSTR pszQuery, IN IWbemContext *pCtx, IN LONG lFlags, OUT CFlexArray &aDest ); // Helper function to shell db queries out to different threads as appropriate HRESULT Static_QueryRepository( READONLY CWbemObject *pClassDef, long lFlags, IWbemContext* pCtx, CBasicObjectSink* pSink , QL_LEVEL_1_RPN_EXPRESSION* pParsedQuery, LPCWSTR pwszClassName, CWmiMerger* pWmiMerger ); // Two primary connect functions. // ============================== static HRESULT UniversalConnect( IN CWbemNamespace *pParent, IN IWbemContext *pCtx, IN LPCWSTR pszNewScope, IN LPCWSTR pszAssocSelector, IN LPCWSTR pszUserName, IN _IWmiCallSec *pCallSec, IN _IWmiUserHandle *pUser, IN DWORD dwUserFlags, IN DWORD dwInternalFlags, IN DWORD dwSecFlags, IN DWORD dwPermission, IN BOOL bForClient, IN BOOL bRepositOnly, IN LPCWSTR pszClientMachineName, IN DWORD dwClientProcessID, IN REFIID riid, OUT LPVOID *pConnection ); static HRESULT PathBasedConnect( IN LPCWSTR pszPath, IN LPCWSTR pszUser, IN IWbemContext __RPC_FAR *pCtx, IN ULONG uClientFlags, IN DWORD dwSecFlags, IN DWORD dwPermissions, IN ULONG uInternalFlags, IN LPCWSTR pszClientMachineName, IN DWORD dwClientProcessID, IN REFIID riid, /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *pServices ); ULONG AddRefPrimary(); ULONG ReleasePrimary(); void StopClientCalls(){m_bShutDown = TRUE;}; HRESULT Dump(FILE *f); // Debug only _IWmiCoreServices* GetCoreServices( void ) { return m_pCoreSvc; } HRESULT GetDynamicReferenceClasses( long lFlags, IWbemContext* pCtx, IWbemObjectSink* pSink ); }; class COperationError { bool m_fOk; COperationErrorSink* m_pSink; public: COperationError(CBasicObjectSink* pDest, LPCWSTR wszOperation, LPCWSTR wszParam, BOOL bFinal = TRUE); ~COperationError(); HRESULT ErrorOccurred(HRESULT hres, IWbemClassObject* pErrorObj = NULL); HRESULT ProviderReturned(LPCWSTR wszProviderName, HRESULT hres, IWbemClassObject* pErrorObj = NULL); void SetParameterInfo(LPCWSTR wszParam); void SetProviderName(LPCWSTR wszName); INTERNAL CBasicObjectSink* GetSink() {return m_pSink;} bool IsOk( void ) { return m_fOk; } }; class CFinalizingSink : public CForwardingSink { protected: CWbemNamespace* m_pNamespace; public: CFinalizingSink(CWbemNamespace* pNamespace, CBasicObjectSink* pDest); virtual ~CFinalizingSink(); STDMETHOD(Indicate)(long, IWbemClassObject**); virtual IWbemObjectSink* GetIndicateSink() {return this;} }; #endif