/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: ProvSubS.cpp Abstract: History: --*/ #include #include #include #include #include "Globals.h" #include "CGlobals.h" #include "ClassFac.h" #include "ProvRMgr.h" #include "Guids.h" /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CServerProvRefreshManagerClassFactory :: CServerProvRefreshManagerClassFactory () : m_ReferenceCount ( 0 ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CServerProvRefreshManagerClassFactory_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CServerProvRefreshManagerClassFactory :: ~CServerProvRefreshManagerClassFactory () { InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CServerProvRefreshManagerClassFactory_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CServerProvRefreshManagerClassFactory :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IClassFactory ) { *iplpv = ( LPVOID ) ( IClassFactory * ) this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_( ULONG ) CServerProvRefreshManagerClassFactory :: AddRef () { return InterlockedIncrement ( & m_ReferenceCount ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CServerProvRefreshManagerClassFactory :: Release () { LONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ; if ( t_ReferenceCount == 0 ) { delete this ; return 0 ; } else { return t_ReferenceCount ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CServerProvRefreshManagerClassFactory :: CreateInstance ( LPUNKNOWN pUnkOuter , REFIID riid , LPVOID FAR *ppvObject ) { HRESULT t_Result = S_OK ; if ( pUnkOuter ) { t_Result = CLASS_E_NOAGGREGATION ; } else { CServerObject_ProviderRefresherManager *t_Manager = new CServerObject_ProviderRefresherManager ( *ProviderSubSystem_Globals :: s_Allocator ) ; if ( t_Manager == NULL ) { t_Result = E_OUTOFMEMORY ; } else { t_Result = t_Manager->QueryInterface ( riid , ppvObject ) ; if ( FAILED ( t_Result ) ) { delete t_Manager ; } else { } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CServerProvRefreshManagerClassFactory :: LockServer ( BOOL fLock ) { /* * Place code in critical section */ if ( fLock ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_LocksInProgress ) ; } else { InterlockedDecrement ( & ProviderSubSystem_Globals :: s_LocksInProgress ) ; } return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CServerObject_InterceptorProviderRefresherManager :: CServerObject_InterceptorProviderRefresherManager ( CWbemGlobal_IWbemRefresherMgrController *a_Controller , const ULONG &a_Period , WmiAllocator &a_Allocator , IWbemContext *a_InitializationContext ) : RefresherManagerCacheElement ( a_Controller , this , a_Period ) , m_Allocator ( a_Allocator ) , m_Manager ( NULL ) , m_ProxyContainer ( m_Allocator , 2 , MAX_PROXIES ) , m_Shutdown ( NULL ) , m_Host ( NULL ) , m_ReferenceCount ( 0 ) , m_UnInitialized ( 0 ) , m_Initialized ( 0 ) , m_InitializeResult ( S_OK ) , m_InitializedEvent ( NULL ) , m_InitializationContext ( a_InitializationContext ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CServerObject_InterceptorProviderRefresherManager_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; if ( m_InitializationContext ) { m_InitializationContext->AddRef () ; } } #pragma warning( default : 4355 ) /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CServerObject_InterceptorProviderRefresherManager :: ~CServerObject_InterceptorProviderRefresherManager () { if ( m_Manager ) { m_Manager->Release () ; } if ( m_Host ) { m_Host->Release () ; } if ( m_Shutdown ) { m_Shutdown->Release () ; } InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CServerObject_InterceptorProviderRefresherManager_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: AbnormalShutdown () { WmiStatusCode t_StatusCode = ProviderSubSystem_Globals :: GetRefresherManagerController ()->Shutdown ( this ) ; if ( t_StatusCode == e_StatusCode_Success ) { } return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: SetManager ( _IWmiProviderHost *a_Host , _IWbemRefresherMgr *a_Manager ) { if ( a_Manager ) { m_Manager = a_Manager ; m_Manager->AddRef () ; } if ( a_Host ) { m_Host = a_Host ; m_Host->AddRef () ; } return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: SetInitialized ( HRESULT a_InitializeResult ) { m_InitializeResult = a_InitializeResult ; InterlockedExchange ( & m_Initialized , 1 ) ; if ( m_InitializedEvent ) { SetEvent ( m_InitializedEvent ) ; } return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: IsIndependant ( IWbemContext *a_Context ) { BOOL t_DependantCall = FALSE ; HRESULT t_Result = ProviderSubSystem_Common_Globals :: IsDependantCall ( m_InitializationContext , a_Context , t_DependantCall ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_DependantCall == FALSE ) { } else { return S_FALSE ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: WaitProvider ( IWbemContext *a_Context , ULONG a_Timeout ) { HRESULT t_Result = WBEM_E_UNEXPECTED ; if ( m_Initialized == 0 ) { BOOL t_DependantCall = FALSE ; t_Result = ProviderSubSystem_Common_Globals :: IsDependantCall ( m_InitializationContext , a_Context , t_DependantCall ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_DependantCall == FALSE ) { if ( WaitForSingleObject ( m_InitializedEvent , a_Timeout ) == WAIT_TIMEOUT ) { return WBEM_E_PROVIDER_LOAD_FAILURE ; } } else { if ( WaitForSingleObject ( m_InitializedEvent , 0 ) == WAIT_TIMEOUT ) { return S_FALSE ; } } } } else { t_Result = S_OK ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: Initialize () { HRESULT t_Result = S_OK ; WmiStatusCode t_StatusCode = m_ProxyContainer.Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CServerObject_InterceptorProviderRefresherManager :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * )this ; } else if ( iid == IID__IWbemRefresherMgr ) { *iplpv = ( LPVOID ) ( _IWbemRefresherMgr * ) this ; } else if ( iid == IID_CServerObject_InterceptorProviderRefresherManager ) { *iplpv = ( LPVOID ) this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_( ULONG ) CServerObject_InterceptorProviderRefresherManager :: AddRef () { return RefresherManagerCacheElement :: AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CServerObject_InterceptorProviderRefresherManager :: Release () { return RefresherManagerCacheElement :: Release () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: Startup ( LONG a_Flags , IWbemContext *a_Context , _IWmiProvSS *a_ProvSS ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif HRESULT t_Result = S_OK ; try { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { BOOL t_Revert = FALSE ; IUnknown *t_Proxy = NULL ; t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , IID__IWbemRefresherMgr , m_Manager , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = m_Manager->Startup ( a_Flags , a_Context , a_ProvSS ) ; } else { if ( SUCCEEDED ( t_Result ) ) { _IWbemRefresherMgr *t_Manager = ( _IWbemRefresherMgr * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Manager , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Manager->Startup ( a_Flags , a_Context , a_ProvSS ) ; if ( FAILED ( t_Result ) ) { if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) ) { AbnormalShutdown () ; } } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } if ( SUCCEEDED ( t_Result ) ) { t_Result = m_Manager->QueryInterface ( IID_IWbemShutdown , ( void ** ) & m_Shutdown ) ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif HRESULT t_Result = S_OK ; try { if ( m_Shutdown ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { BOOL t_Revert = FALSE ; IUnknown *t_Proxy = NULL ; t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemShutdown , IID_IWbemShutdown , m_Shutdown , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = m_Shutdown->Shutdown ( a_Flags , a_MaxMilliSeconds , a_Context ) ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemShutdown *t_Shutdown = ( IWbemShutdown * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Shutdown , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Shutdown->Shutdown ( a_Flags , a_MaxMilliSeconds , a_Context ) ; if ( FAILED ( t_Result ) ) { if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) ) { AbnormalShutdown () ; } } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemShutdown , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: AddObjectToRefresher ( IWbemServices *a_Service, LPCWSTR a_ServerName, LPCWSTR a_Namespace, IWbemClassObject* pClassObject, WBEM_REFRESHER_ID *a_DestinationRefresherId, IWbemClassObject *a_InstanceTemplate, long a_Flags, IWbemContext *a_Context, IUnknown* a_pLockMgr, WBEM_REFRESH_INFO *a_Information ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif if ( m_Initialized == 0 ) { return WBEM_E_NOT_FOUND ; } HRESULT t_Result = S_OK ; try { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { BOOL t_Revert = FALSE ; IUnknown *t_Proxy = NULL ; t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , IID__IWbemRefresherMgr , m_Manager , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = m_Manager->AddObjectToRefresher ( a_Service, a_ServerName, a_Namespace, pClassObject, a_DestinationRefresherId, a_InstanceTemplate, a_Flags, a_Context, a_pLockMgr, a_Information ) ; } else { if ( SUCCEEDED ( t_Result ) ) { _IWbemRefresherMgr *t_Manager = ( _IWbemRefresherMgr * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Manager , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Manager->AddObjectToRefresher ( a_Service, a_ServerName, a_Namespace, pClassObject, a_DestinationRefresherId, a_InstanceTemplate, a_Flags, a_Context, a_pLockMgr, a_Information ) ; if ( FAILED ( t_Result ) ) { if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) ) { AbnormalShutdown () ; } } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: AddEnumToRefresher ( IWbemServices *a_Service, LPCWSTR a_ServerName, LPCWSTR a_Namespace, IWbemClassObject* pClassObject, WBEM_REFRESHER_ID *a_DestinationRefresherId, IWbemClassObject *a_InstanceTemplate, LPCWSTR a_Class, long a_Flags, IWbemContext *a_Context, IUnknown* a_pLockMgr, WBEM_REFRESH_INFO *a_Information ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif if ( m_Initialized == 0 ) { return WBEM_E_NOT_FOUND ; } HRESULT t_Result = S_OK ; try { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { BOOL t_Revert = FALSE ; IUnknown *t_Proxy = NULL ; t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , IID__IWbemRefresherMgr , m_Manager , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = m_Manager->AddEnumToRefresher ( a_Service, a_ServerName, a_Namespace, pClassObject, a_DestinationRefresherId, a_InstanceTemplate, a_Class, a_Flags, a_Context, a_pLockMgr, a_Information ) ; } else { if ( SUCCEEDED ( t_Result ) ) { _IWbemRefresherMgr *t_Manager = ( _IWbemRefresherMgr * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Manager , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Manager->AddEnumToRefresher ( a_Service, a_ServerName, a_Namespace, pClassObject, a_DestinationRefresherId, a_InstanceTemplate, a_Class, a_Flags, a_Context, a_pLockMgr, a_Information ) ; if ( FAILED ( t_Result ) ) { if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) ) { AbnormalShutdown () ; } } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: GetRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Flags, BOOL a_AddRefresher, IWbemRemoteRefresher **a_RemoteRefresher , IUnknown* a_pLockMgr, GUID *a_Guid ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif if ( m_Initialized == 0 ) { return WBEM_E_NOT_FOUND ; } HRESULT t_Result = S_OK ; try { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { BOOL t_Revert = FALSE ; IUnknown *t_Proxy = NULL ; t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , IID__IWbemRefresherMgr , m_Manager , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = m_Manager->GetRemoteRefresher ( a_RefresherId , a_Flags, a_AddRefresher, a_RemoteRefresher , a_pLockMgr, a_Guid ) ; } else { if ( SUCCEEDED ( t_Result ) ) { _IWbemRefresherMgr *t_Manager = ( _IWbemRefresherMgr * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Manager , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Manager->GetRemoteRefresher ( a_RefresherId , a_Flags, a_AddRefresher, a_RemoteRefresher , a_pLockMgr, a_Guid ) ; if ( FAILED ( t_Result ) ) { if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) ) { AbnormalShutdown () ; } } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_InterceptorProviderRefresherManager :: LoadProvider ( IWbemServices *a_Service , LPCWSTR a_ProviderName , LPCWSTR a_Namespace, IWbemContext * a_Context, IWbemHiPerfProvider **a_Provider, _IWmiProviderStack** a_ProvStack ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif if ( m_Initialized == 0 ) { return WBEM_E_NOT_FOUND ; } HRESULT t_Result = S_OK ; try { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { BOOL t_Revert = FALSE ; IUnknown *t_Proxy = NULL ; t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , IID__IWbemRefresherMgr , m_Manager , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = m_Manager->LoadProvider ( a_Service , a_ProviderName , a_Namespace , a_Context , a_Provider, a_ProvStack ) ; } else { if ( SUCCEEDED ( t_Result ) ) { _IWbemRefresherMgr *t_Manager = ( _IWbemRefresherMgr * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Manager , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Manager->LoadProvider ( a_Service , a_ProviderName , a_Namespace , a_Context , a_Provider , a_ProvStack ) ; if ( FAILED ( t_Result ) ) { if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) ) { AbnormalShutdown () ; } } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_RefresherManager_IWbemRefresherMgr , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CServerObject_ProviderRefresherManager :: CServerObject_ProviderRefresherManager ( WmiAllocator &a_Allocator ) : m_Allocator ( a_Allocator ) , m_Manager ( NULL ) , m_Shutdown ( NULL ) , m_ReferenceCount ( 0 ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CServerObject_ProviderRefresherManager_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CServerObject_ProviderRefresherManager :: ~CServerObject_ProviderRefresherManager () { if ( m_Manager ) { m_Manager->Release () ; } if ( m_Shutdown ) { m_Shutdown->Release () ; } InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CServerObject_ProviderRefresherManager_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CServerObject_ProviderRefresherManager :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * )this ; } else if ( iid == IID__IWbemRefresherMgr ) { *iplpv = ( LPVOID ) ( _IWbemRefresherMgr * ) this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_( ULONG ) CServerObject_ProviderRefresherManager :: AddRef () { return InterlockedIncrement ( & m_ReferenceCount ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CServerObject_ProviderRefresherManager :: Release () { LONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ; if ( t_ReferenceCount == 0 ) { delete this ; return 0 ; } else { return t_ReferenceCount ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_ProviderRefresherManager :: Startup ( LONG a_Flags , IWbemContext *a_Context , _IWmiProvSS *a_ProvSS ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif HRESULT t_Result = S_OK ; try { t_Result = ProviderSubSystem_Common_Globals :: CreateInstance ( CLSID__WbemRefresherMgr , NULL , CLSCTX_INPROC_SERVER , IID__IWbemRefresherMgr , ( void ** ) & m_Manager ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = m_Manager->Startup ( a_Flags , a_Context , a_ProvSS ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = m_Manager->QueryInterface ( IID_IWbemShutdown , ( void ** ) & m_Shutdown ) ; } } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_ProviderRefresherManager :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif HRESULT t_Result = S_OK ; try { t_Result = m_Shutdown->Shutdown ( a_Flags , a_MaxMilliSeconds , a_Context ) ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_ProviderRefresherManager :: AddObjectToRefresher ( IWbemServices *a_Service, LPCWSTR a_ServerName, LPCWSTR a_Namespace, IWbemClassObject* pClassObject, WBEM_REFRESHER_ID *a_DestinationRefresherId, IWbemClassObject *a_InstanceTemplate, long a_Flags, IWbemContext *a_Context, IUnknown* a_pLockMgr, WBEM_REFRESH_INFO *a_Information ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif HRESULT t_Result = S_OK ; try { t_Result = m_Manager->AddObjectToRefresher ( a_Service, a_ServerName, a_Namespace, pClassObject, a_DestinationRefresherId, a_InstanceTemplate, a_Flags, a_Context, a_pLockMgr, a_Information ) ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_ProviderRefresherManager :: AddEnumToRefresher ( IWbemServices *a_Service, LPCWSTR a_ServerName, LPCWSTR a_Namespace, IWbemClassObject* pClassObject, WBEM_REFRESHER_ID *a_DestinationRefresherId, IWbemClassObject *a_InstanceTemplate, LPCWSTR a_Class, long a_Flags, IWbemContext *a_Context, IUnknown* a_pLockMgr, WBEM_REFRESH_INFO *a_Information ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif HRESULT t_Result = S_OK ; try { t_Result = m_Manager->AddEnumToRefresher ( a_Service, a_ServerName, a_Namespace, pClassObject, a_DestinationRefresherId, a_InstanceTemplate, a_Class, a_Flags, a_Context, a_pLockMgr, a_Information ) ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_ProviderRefresherManager :: GetRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Flags, BOOL fAddRefresher, IWbemRemoteRefresher **a_RemoteRefresher , IUnknown* a_pLockMgr, GUID *a_Guid ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif HRESULT t_Result = S_OK ; try { t_Result = m_Manager->GetRemoteRefresher ( a_RefresherId , a_Flags, fAddRefresher, a_RemoteRefresher , a_pLockMgr, a_Guid ) ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_ProviderRefresherManager :: LoadProvider ( IWbemServices *a_Service , LPCWSTR a_ProviderName , LPCWSTR a_Namespace, IWbemContext * a_Context, IWbemHiPerfProvider **a_Provider, _IWmiProviderStack** a_ProvStack ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif HRESULT t_Result = S_OK ; try { t_Result = m_Manager->LoadProvider ( a_Service , a_ProviderName , a_Namespace , a_Context , a_Provider , a_ProvStack ) ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } return t_Result ; }