/*++ 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_ #include #include #include extern DWORD g_IdentifierLimit; extern DWORD g_QueryLimit; extern DWORD g_PathLimit; #define WBEM_FLAG_NO_STATIC 0x80000000 #define WBEM_FLAG_ONLY_STATIC 0x40000000 #ifdef DBG class OperationStat { enum { HistoryLength = 122 }; DWORD signature; DWORD historycData_[HistoryLength]; DWORD historyIndex_; DWORD opCount_; DWORD avgTime_; DWORD maxTime_; LONG zeroTime_; public: static CStaticCritSec lock_; OperationStat() : historyIndex_(0), opCount_(0), avgTime_(0), maxTime_(0),signature((DWORD)'nCpO') { memset(historycData_, 0, sizeof(historycData_)); // SEC:REVIEWED 2002-03-22 : OK, debug code only }; void addTime(DWORD duration) { if (duration==0) { InterlockedIncrement(&zeroTime_); return; } if (CStaticCritSec::anyFailure()) return ; lock_.Enter(); historycData_[historyIndex_++]=duration; historyIndex_%=HistoryLength; if (++opCount_ == 0) ++opCount_; double avg = (double)avgTime_ + ((double)duration-avgTime_)/opCount_; avgTime_ = (DWORD)avg; if (duration > maxTime_) { maxTime_ = duration; }; lock_.Leave(); }; }; class TimeTraces { public: typedef enum{ GetObject=0, GetObjectByPath, ExecQuery, ExecMethod, DeleteInstance, DeleteClass, CreateInstanceEnum, CreateClassEnum, PutClass, PutInstance, Invalid } tracedOp; TimeTraces() :zeroTime_(0) {}; void addTime(tracedOp operation, DWORD duration) { if (duration==0) InterlockedIncrement(&zeroTime_); _DBG_ASSERT(operation >= GetObject); _DBG_ASSERT(operation < Invalid); allCounters[operation].addTime(duration); } private: OperationStat allCounters[Invalid]; LONG zeroTime_; }; extern TimeTraces gTimeTraceHistory; class TimeTrace { TimeTraces::tracedOp operation_; DWORD start_; public: TimeTrace(TimeTraces::tracedOp operation ): operation_(operation), start_(GetTickCount()) { } ~TimeTrace() { gTimeTraceHistory.addTime(operation_, GetTickCount()-start_); } }; #define TIMETRACE(x) TimeTrace timeTrace(x); #else #define TIMETRACE(x) #endif class CFlexAceArray; class CBasicObjectSink; class CComplexProjectionSink; class CDynasty; class CAsyncReq; class CWmiMerger; 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. // //****************************************************************************** typedef void * IWbemServicesEx; typedef void * IWbemCallResultEx; class CWbemNamespace : public IWbemServices, public IWbemInternalServices { public: protected: friend class CQueryEngine; ULONG m_uSecondaryRefCount; BOOL m_bShutDown; // DWORD Status; IWmiDbSession *m_pSession; IWmiDbController *m_pDriver; IWmiDbHandle *m_pNsHandle; IWmiDbHandle *m_pScopeHandle; _IWmiArbitrator *m_pArb; BOOL m_bSubscope; LPWSTR m_pThisNamespaceFull; LPWSTR m_pThisNamespace; DWORD m_dwPermission; DWORD m_dwSecurityFlags; LPWSTR m_wszUserName; BOOL m_bProvider; BOOL m_bESS; BOOL m_bForClient; CCritSec m_cs; WString m_wsLocale; CNtSecurityDescriptor m_sd; CNtSecurityDescriptor m_sdCheckAdmin; BOOL m_bSecurityInitialized; _IWmiProviderFactory *m_pProvFact; _IWmiCoreServices *m_pCoreSvc; BOOL m_bRepositOnly; IUnknown *m_pRefreshingSvc; LPWSTR m_pszClientMachineName; DWORD m_dwClientProcessID; LIST_ENTRY m_Entry; // for the Global Counter public: LIST_ENTRY m_EntryArb; // for the arbitrator protected: // 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); 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); // 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); // 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 ); 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;} INTERNAL LPWSTR GetNameFull() {return m_pThisNamespaceFull;} DWORD& GetStatus() {return Status;} INTERNAL LPWSTR GetUserName() {return m_wszUserName;} // SEC:REVIEWED 2002-03-22 : OK //INTERNAL void SetUserName(LPWSTR wName); DWORD GetSecurityFlags() {return m_dwSecurityFlags;} bool Allowed(DWORD dwRequired); 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 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 SetErrorObj(IWbemClassObject* pErrorObj); HRESULT RecursivePutInstance(CWbemInstance* pInst, CWbemClass* pClassDef, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink, BOOL bLast); HRESULT DeleteSingleInstance( READONLY LPWSTR wszObjectPath, long lFlags, IWbemContext* pContext, CBasicObjectSink* pSink); HRESULT InternalPutStaticClass( IWbemClassObject* pClass ); HRESULT DeleteObject(const BSTR strObjectPath, long lFlags, IWbemContext *pCtx,IWbemCallResult **ppCallResult); // 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, wmilib::auto_buffer & pszClass1, wmilib::auto_buffer & pszProp1, wmilib::auto_buffer & pClass2, wmilib::auto_buffer & pszProp2); HRESULT MapAssocRefsToClasses( IN IWbemClassObject *pAssocClass, IN IWbemClassObject *pClsDef1, IN IWbemClassObject *pClsDef2, wmilib::auto_buffer & pszAssocRef1, wmilib::auto_buffer & 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 wmilib::auto_ptr & pDynasty, OUT IWbemClassObject** ppErrorObj); HRESULT DynAux_BuildChainUp(IN IWbemContext* pContext, OUT wmilib::auto_ptr & ppTop, OUT IWbemClassObject** ppErrorObj); HRESULT DecorateObject(IWbemClassObject* pObject); 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); HRESULT GetAceList(CFlexAceArray **); HRESULT PutAceList(CFlexAceArray *); HRESULT InitializeSD(IWmiDbSession *pSession); CNtSecurityDescriptor & GetSDRef(){return m_sd;}; DWORD GetUserAccess(); 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 RecursiveSDMerge(); BOOL IsNamespaceSDProtected(); HRESULT GetParentsInheritableAces(CNtSecurityDescriptor &sd); HRESULT SetSDMethod(IWbemClassObject* pInParams); HRESULT GetCallerAccessRightsMethod(IWbemClassObject* pOutParams); BOOL IsForClient(){return m_bForClient;}; 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 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 IWbemObjectSink **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 ); 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 ); }; #endif