/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: XXXX Abstract: History: --*/ #include "PreComp.h" #include #include #include "CGlobals.h" #include "Globals.h" #include "ProvInterceptor.h" /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CInterceptor_IWbemDecoupledUnboundObjectSink :: CInterceptor_IWbemDecoupledUnboundObjectSink ( WmiAllocator &a_Allocator , IUnknown *a_ServerSideProvider , CWbemGlobal_IWmiObjectSinkController *a_Controller , CServerObject_ProviderRegistrationV1 &a_Registration ) : VoidPointerContainerElement ( a_Controller , this ) , m_Allocator ( a_Allocator ) , m_Unknown ( NULL ) , m_Provider_IWbemUnboundObjectSink ( NULL ) , m_Registration ( & a_Registration ) , m_ProxyContainer ( a_Allocator , ProxyIndex_UnBoundSync_Size , MAX_PROXIES ) { InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_CInterceptor_IWbemDecoupledUnboundObjectSink_ObjectsInProgress ) ; InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ; if ( m_Registration ) { m_Registration->AddRef () ; } if ( a_ServerSideProvider ) { m_Unknown = a_ServerSideProvider ; m_Unknown->AddRef () ; HRESULT t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemUnboundObjectSink , ( void ** ) & m_Provider_IWbemUnboundObjectSink ) ; } } #pragma warning( default : 4355 ) /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IWbemDecoupledUnboundObjectSink :: ~CInterceptor_IWbemDecoupledUnboundObjectSink () { if ( m_Unknown ) { m_Unknown->Release () ; } if ( m_Provider_IWbemUnboundObjectSink ) { m_Provider_IWbemUnboundObjectSink->Release () ; } if ( m_Registration ) { m_Registration->Release () ; } WmiStatusCode t_StatusCode = m_ProxyContainer.UnInitialize () ; InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_CInterceptor_IWbemDecoupledUnboundObjectSink_ObjectsInProgress ) ; InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemDecoupledUnboundObjectSink :: 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_( ULONG ) CInterceptor_IWbemDecoupledUnboundObjectSink :: AddRef () { return VoidPointerContainerElement :: AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemDecoupledUnboundObjectSink :: Release () { return VoidPointerContainerElement :: Release () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CInterceptor_IWbemDecoupledUnboundObjectSink :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemUnboundObjectSink ) { if ( m_Provider_IWbemUnboundObjectSink ) { *iplpv = ( LPVOID ) ( IWbemUnboundObjectSink * ) this ; } } else if ( iid == IID_Internal_IWbemUnboundObjectSink ) { if ( m_Provider_IWbemUnboundObjectSink ) { *iplpv = ( LPVOID ) ( Internal_IWbemUnboundObjectSink * ) this ; } } else if ( iid == IID__IWmiProviderSite ) { *iplpv = ( LPVOID ) ( _IWmiProviderSite * ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * ) this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemDecoupledUnboundObjectSink :: Internal_IndicateToConsumer ( WmiInternalContext a_InternalContext , IWbemClassObject *a_LogicalConsumer , long a_ObjectCount , IWbemClassObject **a_Objects ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = IndicateToConsumer ( a_LogicalConsumer , a_ObjectCount , a_Objects ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemDecoupledUnboundObjectSink :: IndicateToConsumer ( IWbemClassObject *a_LogicalConsumer , long a_ObjectCount , IWbemClassObject **a_Objects ) { if ( m_Provider_IWbemUnboundObjectSink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_UnBoundSync_IWbemUnboundObjectSink , IID_IWbemUnboundObjectSink , m_Provider_IWbemUnboundObjectSink , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = m_Provider_IWbemUnboundObjectSink->IndicateToConsumer ( a_LogicalConsumer , a_ObjectCount , a_Objects ) ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemUnboundObjectSink *t_Provider = ( IWbemUnboundObjectSink * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Provider->IndicateToConsumer ( a_LogicalConsumer , a_ObjectCount , a_Objects ) ; } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_UnBoundSync_IWbemUnboundObjectSink , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemDecoupledUnboundObjectSink :: GetSite ( DWORD *a_ProcessIdentifier ) { HRESULT t_Result = S_OK ; if ( a_ProcessIdentifier ) { *a_ProcessIdentifier = GetCurrentProcessId () ; } else { t_Result = WBEM_E_INVALID_PARAMETER ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemDecoupledUnboundObjectSink :: SetContainer ( IUnknown *a_Container ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemDecoupledUnboundObjectSink :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CDecoupled_IWbemSyncObjectSink :: CDecoupled_IWbemSyncObjectSink ( WmiAllocator &a_Allocator , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant ) : CCommon_IWbemSyncObjectSink ( a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) { InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_CDecoupled_IWbemSyncObjectSink_ObjectsInProgress ) ; InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ; } #pragma warning( default : 4355 ) /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CDecoupled_IWbemSyncObjectSink :: ~CDecoupled_IWbemSyncObjectSink () { InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_CDecoupled_IWbemSyncObjectSink_ObjectsInProgress ) ; InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CDecoupled_Batching_IWbemSyncObjectSink :: CDecoupled_Batching_IWbemSyncObjectSink ( WmiAllocator &a_Allocator , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant ) : CCommon_Batching_IWbemSyncObjectSink ( a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) { InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_CDecoupled_Batching_IWbemSyncObjectSink_ObjectsInProgress ) ; InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ; } #pragma warning( default : 4355 ) /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CDecoupled_Batching_IWbemSyncObjectSink :: ~CDecoupled_Batching_IWbemSyncObjectSink () { InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_CDecoupled_Batching_IWbemSyncObjectSink_ObjectsInProgress ) ; InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CInterceptor_DecoupledClient :: CInterceptor_DecoupledClient ( WmiAllocator &a_Allocator , IUnknown *a_ServerSideProvider , IWbemServices *a_CoreStub , CServerObject_ProviderRegistrationV1 &a_Registration ) : m_ReferenceCount ( 0 ) , m_Allocator ( a_Allocator ) , CWbemGlobal_IWmiObjectSinkController ( a_Allocator ) , m_Unknown ( NULL ) , m_Provider_IWbemServices ( NULL ) , m_Provider_IWbemPropertyProvider ( NULL ) , m_Provider_IWbemEventProvider ( NULL ) , m_Provider_IWbemEventProviderQuerySink ( NULL ) , m_Provider_IWbemEventProviderSecurity ( NULL ) , m_Provider_IWbemEventConsumerProvider ( NULL ) , m_Provider_IWbemEventConsumerProviderEx ( NULL ) , m_Provider_IWbemUnboundObjectSink ( NULL ) , m_CoreStub ( a_CoreStub ) , m_Registration ( & a_Registration ) , m_Locale ( NULL ) , m_User ( NULL ) , m_Namespace ( NULL ) , m_ProxyContainer ( a_Allocator , ProxyIndex_Provider_Size , MAX_PROXIES ) { InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_CInterceptor_DecoupledClient_ObjectsInProgress ) ; InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ; if ( m_Registration ) { m_Registration->AddRef () ; } if ( a_ServerSideProvider ) { m_Unknown = a_ServerSideProvider ; m_Unknown->AddRef () ; HRESULT t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemServices , ( void ** ) & m_Provider_IWbemServices ) ; t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemPropertyProvider , ( void ** ) & m_Provider_IWbemPropertyProvider ) ; t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemEventProvider , ( void ** ) & m_Provider_IWbemEventProvider ) ; t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemEventProviderQuerySink , ( void ** ) & m_Provider_IWbemEventProviderQuerySink ) ; t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemEventProviderSecurity , ( void ** ) & m_Provider_IWbemEventProviderSecurity ) ; t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemEventConsumerProviderEx , ( void ** ) & m_Provider_IWbemEventConsumerProviderEx ) ; t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemEventConsumerProvider , ( void ** ) & m_Provider_IWbemEventConsumerProvider ) ; t_Result = a_ServerSideProvider->QueryInterface ( IID_IWbemUnboundObjectSink , ( void ** ) & m_Provider_IWbemUnboundObjectSink ) ; } if ( m_CoreStub ) { m_CoreStub->AddRef () ; } } #pragma warning( default : 4355 ) /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_DecoupledClient :: ~CInterceptor_DecoupledClient () { if ( m_Unknown ) { m_Unknown->Release () ; } if ( m_Provider_IWbemServices ) { m_Provider_IWbemServices->Release () ; } if ( m_Provider_IWbemPropertyProvider ) { m_Provider_IWbemPropertyProvider->Release () ; } if ( m_Provider_IWbemEventProvider ) { m_Provider_IWbemEventProvider->Release () ; } if ( m_Provider_IWbemEventProviderQuerySink ) { m_Provider_IWbemEventProviderQuerySink->Release () ; } if ( m_Provider_IWbemEventProviderSecurity ) { m_Provider_IWbemEventProviderSecurity->Release () ; } if ( m_Provider_IWbemEventConsumerProviderEx ) { m_Provider_IWbemEventConsumerProviderEx->Release () ; } if ( m_Provider_IWbemEventConsumerProvider ) { m_Provider_IWbemEventConsumerProvider->Release () ; } if ( m_Provider_IWbemUnboundObjectSink ) { m_Provider_IWbemUnboundObjectSink->Release () ; } if ( m_CoreStub ) { m_CoreStub->Release () ; } WmiStatusCode t_StatusCode = m_ProxyContainer.UnInitialize () ; t_StatusCode = CWbemGlobal_IWmiObjectSinkController :: UnInitialize () ; if ( m_Namespace ) { SysFreeString ( m_Namespace ) ; } if ( m_Locale ) { SysFreeString ( m_Locale ) ; } if ( m_User ) { SysFreeString ( m_User ) ; } if ( m_Registration ) { m_Registration->Release () ; } InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_CInterceptor_DecoupledClient_ObjectsInProgress ) ; InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_( ULONG ) CInterceptor_DecoupledClient :: AddRef () { return InterlockedIncrement ( & m_ReferenceCount ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_DecoupledClient :: Release () { ULONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ; if ( t_ReferenceCount == 0 ) { delete this ; } return t_ReferenceCount ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CInterceptor_DecoupledClient :: QueryInterface ( REFIID a_Riid , LPVOID FAR *a_Void ) { *a_Void = NULL ; if ( a_Riid == IID_IUnknown ) { *a_Void = ( LPVOID ) this ; } if ( a_Riid == IID_IWbemProviderInit ) { *a_Void = ( LPVOID ) ( IWbemProviderInit * ) this ; } if ( a_Riid == IID_Internal_IWbemProviderInit ) { *a_Void = ( LPVOID ) ( Internal_IWbemProviderInit * ) this ; } else if ( a_Riid == IID_IWbemServices ) { if ( m_Provider_IWbemServices ) { *a_Void = ( LPVOID ) ( IWbemServices * ) this ; } } else if ( a_Riid == IID_IWbemPropertyProvider ) { if ( m_Provider_IWbemPropertyProvider ) { *a_Void = ( LPVOID ) ( IWbemPropertyProvider * ) this ; } } else if ( a_Riid == IID_IWbemEventProvider ) { if ( m_Provider_IWbemEventProvider ) { *a_Void = ( LPVOID ) ( IWbemEventProvider * ) this ; } } else if ( a_Riid == IID_IWbemEventProviderQuerySink ) { if ( m_Provider_IWbemEventProviderQuerySink ) { *a_Void = ( LPVOID ) ( IWbemEventProviderQuerySink * ) this ; } } else if ( a_Riid == IID_IWbemEventProviderSecurity ) { if ( m_Provider_IWbemEventProviderSecurity ) { *a_Void = ( LPVOID ) ( IWbemEventProviderSecurity * ) this ; } } else if ( a_Riid == IID_IWbemEventConsumerProvider ) { if ( m_Provider_IWbemEventConsumerProvider ) { *a_Void = ( LPVOID ) ( IWbemEventConsumerProvider * ) this ; } } else if ( a_Riid == IID_IWbemEventConsumerProviderEx ) { if ( m_Provider_IWbemEventConsumerProviderEx ) { *a_Void = ( LPVOID ) ( IWbemEventConsumerProviderEx * ) this ; } } else if ( a_Riid == IID_IWbemUnboundObjectSink ) { if ( m_Provider_IWbemUnboundObjectSink ) { *a_Void = ( LPVOID ) ( IWbemUnboundObjectSink * ) this ; } } else if ( a_Riid == IID__IWmiProviderInitialize ) { *a_Void = ( LPVOID ) ( _IWmiProviderInitialize * ) this ; } else if ( a_Riid == IID__IWmiProviderSite ) { *a_Void = ( LPVOID ) ( _IWmiProviderSite * ) this ; } else if ( a_Riid == IID_IWbemShutdown ) { *a_Void = ( LPVOID ) ( IWbemShutdown * ) this ; } else if ( a_Riid == IID__IWmiProviderConfiguration ) { *a_Void = ( LPVOID ) ( _IWmiProviderConfiguration * ) this ; } else if ( a_Riid == IID_Internal_IWbemServices ) { if ( m_Provider_IWbemServices ) { *a_Void = ( LPVOID ) ( Internal_IWbemServices * ) this ; } } else if ( a_Riid == IID_Internal_IWbemPropertyProvider ) { if ( m_Provider_IWbemPropertyProvider ) { *a_Void = ( LPVOID ) ( Internal_IWbemPropertyProvider * ) this ; } } else if ( a_Riid == IID_Internal_IWbemEventProvider ) { if ( m_Provider_IWbemEventProvider ) { *a_Void = ( LPVOID ) ( Internal_IWbemEventProvider * ) this ; } } else if ( a_Riid == IID_Internal_IWbemEventProviderQuerySink ) { if ( m_Provider_IWbemEventProviderQuerySink ) { *a_Void = ( LPVOID ) ( Internal_IWbemEventProviderQuerySink * ) this ; } } else if ( a_Riid == IID_Internal_IWbemEventProviderSecurity ) { if ( m_Provider_IWbemEventProviderSecurity ) { *a_Void = ( LPVOID ) ( Internal_IWbemEventProviderSecurity * ) this ; } } else if ( a_Riid == IID_Internal_IWbemEventConsumerProvider ) { if ( m_Provider_IWbemEventConsumerProvider ) { *a_Void = ( LPVOID ) ( Internal_IWbemEventConsumerProvider * ) this ; } } else if ( a_Riid == IID_Internal_IWbemEventConsumerProviderEx ) { if ( m_Provider_IWbemEventConsumerProviderEx ) { *a_Void = ( LPVOID ) ( Internal_IWbemEventConsumerProviderEx * ) this ; } } else if ( a_Riid == IID_Internal_IWbemUnboundObjectSink ) { if ( m_Provider_IWbemUnboundObjectSink ) { *a_Void = ( LPVOID ) ( Internal_IWbemUnboundObjectSink * ) this ; } } if ( *a_Void ) { ( ( LPUNKNOWN ) *a_Void )->AddRef () ; return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_OpenNamespace ( WmiInternalContext a_InternalContext , const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemServices **a_NamespaceService , IWbemCallResult **a_CallResult ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = OpenNamespace ( a_ObjectPath , a_Flags , a_Context , a_NamespaceService , a_CallResult ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_CancelAsyncCall ( WmiInternalContext a_InternalContext , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CancelAsyncCall ( a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_QueryObjectSink ( WmiInternalContext a_InternalContext , long a_Flags , IWbemObjectSink **a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = QueryObjectSink ( a_Flags , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_GetObject ( WmiInternalContext a_InternalContext , const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemClassObject **a_Object , IWbemCallResult **a_CallResult ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = GetObject ( a_ObjectPath , a_Flags , a_Context , a_Object , a_CallResult ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_GetObjectAsync ( WmiInternalContext a_InternalContext , const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = GetObjectAsync ( a_ObjectPath , a_Flags , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_PutClass ( WmiInternalContext a_InternalContext , IWbemClassObject *a_Object , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutClass ( a_Object , a_Flags , a_Context , a_CallResult ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_PutClassAsync ( WmiInternalContext a_InternalContext , IWbemClassObject *a_Object , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutClassAsync ( a_Object , a_Flags , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_DeleteClass ( WmiInternalContext a_InternalContext , const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = DeleteClass ( a_Class , a_Flags , a_Context , a_CallResult ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_DeleteClassAsync ( WmiInternalContext a_InternalContext , const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = DeleteClassAsync ( a_Class , a_Flags , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_CreateClassEnum ( WmiInternalContext a_InternalContext , const BSTR a_SuperClass , long a_Flags, IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CreateClassEnum ( a_SuperClass , a_Flags, a_Context , a_Enum ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_CreateClassEnumAsync ( WmiInternalContext a_InternalContext , const BSTR a_SuperClass , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CreateClassEnumAsync ( a_SuperClass , a_Flags, a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_PutInstance ( WmiInternalContext a_InternalContext , IWbemClassObject *a_Instance , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutInstance ( a_Instance , a_Flags , a_Context , a_CallResult ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_PutInstanceAsync ( WmiInternalContext a_InternalContext , IWbemClassObject *a_Instance , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutInstanceAsync ( a_Instance , a_Flags , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_DeleteInstance ( WmiInternalContext a_InternalContext , const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = DeleteInstance ( a_ObjectPath , a_Flags , a_Context , a_CallResult ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_DeleteInstanceAsync ( WmiInternalContext a_InternalContext , const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = DeleteInstanceAsync ( a_ObjectPath , a_Flags , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_CreateInstanceEnum ( WmiInternalContext a_InternalContext , const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CreateInstanceEnum ( a_Class , a_Flags , a_Context , a_Enum ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_CreateInstanceEnumAsync ( WmiInternalContext a_InternalContext , const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CreateInstanceEnumAsync ( a_Class , a_Flags , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_ExecQuery ( WmiInternalContext a_InternalContext , const BSTR a_QueryLanguage , const BSTR a_Query , long a_Flags , IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ExecQuery ( a_QueryLanguage , a_Query , a_Flags , a_Context , a_Enum ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_ExecQueryAsync ( WmiInternalContext a_InternalContext , const BSTR a_QueryLanguage , const BSTR a_Query, long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ExecQueryAsync ( a_QueryLanguage , a_Query, a_Flags , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_ExecNotificationQuery ( WmiInternalContext a_InternalContext , const BSTR a_QueryLanguage , const BSTR a_Query , long a_Flags , IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ExecNotificationQuery ( a_QueryLanguage , a_Query , a_Flags , a_Context , a_Enum ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_ExecNotificationQueryAsync ( WmiInternalContext a_InternalContext , const BSTR a_QueryLanguage , const BSTR a_Query , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ExecNotificationQueryAsync ( a_QueryLanguage , a_Query , a_Flags , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_ExecMethod ( WmiInternalContext a_InternalContext , const BSTR a_ObjectPath , const BSTR a_MethodName , long a_Flags , IWbemContext *a_Context , IWbemClassObject *a_InParams , IWbemClassObject **a_OutParams , IWbemCallResult **a_CallResult ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ExecMethod ( a_ObjectPath , a_MethodName , a_Flags , a_Context , a_InParams , a_OutParams , a_CallResult ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_ExecMethodAsync ( WmiInternalContext a_InternalContext , const BSTR a_ObjectPath , const BSTR a_MethodName , long a_Flags , IWbemContext *a_Context , IWbemClassObject *a_InParams , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ExecMethodAsync ( a_ObjectPath , a_MethodName , a_Flags , a_Context , a_InParams , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_GetProperty ( WmiInternalContext a_InternalContext , long a_Flags , const BSTR a_Locale , const BSTR a_ClassMapping , const BSTR a_InstanceMapping , const BSTR a_PropertyMapping , VARIANT *a_Value ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = GetProperty ( a_Flags , a_Locale , a_ClassMapping , a_InstanceMapping , a_PropertyMapping , a_Value ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_PutProperty ( WmiInternalContext a_InternalContext , long a_Flags , const BSTR a_Locale , const BSTR a_ClassMapping , const BSTR a_InstanceMapping , const BSTR a_PropertyMapping , const VARIANT *a_Value ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutProperty ( a_Flags , a_Locale , a_ClassMapping , a_InstanceMapping , a_PropertyMapping , a_Value ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_ProvideEvents ( WmiInternalContext a_InternalContext , IWbemObjectSink *a_Sink , long a_Flags ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ProvideEvents ( a_Sink , a_Flags ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_NewQuery ( WmiInternalContext a_InternalContext , unsigned long a_Id , WBEM_WSTR a_QueryLanguage , WBEM_WSTR a_Query ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = NewQuery ( a_Id , a_QueryLanguage , a_Query ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_CancelQuery ( WmiInternalContext a_InternalContext , unsigned long a_Id ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CancelQuery ( a_Id ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_AccessCheck ( WmiInternalContext a_InternalContext , WBEM_CWSTR a_QueryLanguage , WBEM_CWSTR a_Query , long a_SidLength , const BYTE *a_Sid ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = AccessCheck ( a_QueryLanguage , a_Query , a_SidLength , a_Sid ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_FindConsumer ( WmiInternalContext a_InternalContext , IWbemClassObject *a_LogicalConsumer , IWbemUnboundObjectSink **a_Consumer ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = FindConsumer ( a_LogicalConsumer , a_Consumer ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_ValidateSubscription ( WmiInternalContext a_InternalContext , IWbemClassObject *a_LogicalConsumer ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ValidateSubscription ( a_LogicalConsumer ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_IndicateToConsumer ( WmiInternalContext a_InternalContext , IWbemClassObject *a_LogicalConsumer , long a_ObjectCount , IWbemClassObject **a_Objects ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = IndicateToConsumer ( a_LogicalConsumer , a_ObjectCount , a_Objects ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: AdjustGetContext ( IWbemContext *a_Context ) { // See if per-property get are being used. // ======================================== HRESULT t_Result = S_OK ; if ( a_Context ) { VARIANT t_Variant ; VariantInit ( & t_Variant ) ; t_Result = a_Context->GetValue ( L"__GET_EXTENSIONS" , 0, & t_Variant ) ; if ( SUCCEEDED ( t_Result ) ) { // If here, they are being used. Next we have to check and see // if the reentrancy flag is set or not. // ============================================================= VariantClear ( & t_Variant ) ; t_Result = a_Context->GetValue ( L"__GET_EXT_CLIENT_REQUEST" , 0 , & t_Variant ) ; if ( SUCCEEDED ( t_Result ) ) { VariantClear ( & t_Variant ) ; a_Context->DeleteValue ( L"__GET_EXT_CLIENT_REQUEST" , 0 ) ; } else { // If here, we have to clear out the get extensions. // ================================================= a_Context->DeleteValue ( L"__GET_EXTENSIONS" , 0 ) ; a_Context->DeleteValue ( L"__GET_EXT_CLIENT_REQUEST" , 0 ) ; a_Context->DeleteValue ( L"__GET_EXT_KEYS_ONLY" , 0 ) ; a_Context->DeleteValue ( L"__GET_EXT_PROPERTIES" , 0 ) ; } } } return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: SetStatus ( LPWSTR a_Operation , LPWSTR a_Parameters , LPWSTR a_Description , HRESULT a_Result , IWbemObjectSink *a_Sink ) { return a_Sink->SetStatus ( 0 , a_Result , NULL , NULL ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Begin_IWbemServices ( BOOL &a_Impersonating , IUnknown *&a_OldContext , IServerSecurity *&a_OldSecurity , BOOL &a_IsProxy , IWbemServices *&a_Interface , BOOL &a_Revert , IUnknown *&a_Proxy ) { HRESULT t_Result = S_OK ; a_Revert = FALSE ; a_Proxy = NULL ; a_Impersonating = FALSE ; a_OldContext = NULL ; a_OldSecurity = NULL ; switch ( m_Registration->GetHosting () ) { case e_Hosting_WmiCore: case e_Hosting_SharedLocalSystemHost: case e_Hosting_SharedLocalServiceHost: case e_Hosting_SharedNetworkServiceHost: { a_Interface = m_Provider_IWbemServices ; a_IsProxy = FALSE ; } break ; default: { t_Result = ProviderSubSystem_Common_Globals :: BeginImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_IWbemServices , IID_IWbemServices , m_Provider_IWbemServices , a_Proxy , a_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { a_Interface = m_Provider_IWbemServices ; a_IsProxy = FALSE ; t_Result = S_OK ; } else { if ( SUCCEEDED ( t_Result ) ) { a_IsProxy = TRUE ; a_Interface = ( IWbemServices * ) a_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( a_Interface , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { } else { t_Result = WBEM_E_ACCESS_DENIED ; } } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemServices , a_Proxy , a_Revert ) ; } } } if ( FAILED ( t_Result ) ) { ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; } } } break ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: End_IWbemServices ( BOOL a_Impersonating , IUnknown *a_OldContext , IServerSecurity *a_OldSecurity , BOOL a_IsProxy , IWbemServices *a_Interface , BOOL a_Revert , IUnknown *a_Proxy ) { CoRevertToSelf () ; if ( a_Proxy ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemServices , a_Proxy , a_Revert ) ; } switch ( m_Registration->GetHosting () ) { case e_Hosting_WmiCore: case e_Hosting_SharedLocalSystemHost: case e_Hosting_SharedLocalServiceHost: case e_Hosting_SharedNetworkServiceHost: { } break ; default: { ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; } break ; } return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient::OpenNamespace ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemServices **a_NamespaceService , IWbemCallResult **a_CallResult ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: CancelAsyncCall ( IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Find ( a_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { ObjectSinkContainerElement *t_Element = t_Iterator.GetElement () ; UnLock () ; IWbemObjectSink *t_ObjectSink = NULL ; t_Result = t_Element->QueryInterface ( IID_IWbemObjectSink , ( void ** ) & t_ObjectSink ) ; if ( SUCCEEDED ( t_Result ) ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->CancelAsyncCall ( t_ObjectSink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } t_ObjectSink->Release () ; } IWbemShutdown *t_Shutdown = NULL ; HRESULT t_TempResult = t_Element->QueryInterface ( IID_IWbemShutdown , ( void ** ) & t_Shutdown ) ; if ( SUCCEEDED ( t_TempResult ) ) { t_TempResult = t_Shutdown->Shutdown ( 0 , 0 , NULL ) ; t_Shutdown->Release () ; } t_Element->Release () ; } else { UnLock () ; t_Result = WBEM_E_NOT_FOUND ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: QueryObjectSink ( long a_Flags , IWbemObjectSink **a_Sink ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: GetObject ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemClassObject **a_Object , IWbemCallResult **a_CallResult ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_GetObjectAsync ( BOOL a_IsProxy , const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; AdjustGetContext ( t_ContextCopy ) ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; CDecoupled_IWbemSyncObjectSink *t_Sink = new CDecoupled_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_GetObjectAsync () ; try { t_Result = a_Service->GetObjectAsync ( a_ObjectPath , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; Increment_ProviderOperation_GetObjectAsync () ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { try { t_Result = a_Service->GetObjectAsync ( a_ObjectPath , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"GetObjectAsync" , NULL , NULL , t_Result , t_Sink ) ; } } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: GetObjectAsync ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( m_Registration->GetInstanceProviderRegistration ().SupportsGet () || m_Registration->GetClassProviderRegistration ().SupportsGet () ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_GetObjectAsync ( t_IsProxy , a_ObjectPath , a_Flags , a_Context , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: PutClass ( IWbemClassObject *a_Object , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_PutClassAsync ( BOOL a_IsProxy , IWbemClassObject *a_Object , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; CDecoupled_IWbemSyncObjectSink *t_Sink = new CDecoupled_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_PutClassAsync () ; try { t_Result = a_Service->PutClassAsync ( a_Object , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_PutClassAsync () ; try { t_Result = a_Service->PutClassAsync ( a_Object , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"PutClassAsync" , NULL , NULL , t_Result , t_Sink ) ; } } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: PutClassAsync ( IWbemClassObject *a_Object , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( m_Registration->GetClassProviderRegistration ().SupportsPut () ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_PutClassAsync ( t_IsProxy , a_Object , a_Flags , a_Context , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: DeleteClass ( const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_DeleteClassAsync ( BOOL a_IsProxy , const BSTR a_Class , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; CDecoupled_IWbemSyncObjectSink *t_Sink = new CDecoupled_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_DeleteClassAsync () ; try { t_Result = a_Service->DeleteClassAsync ( a_Class , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_DeleteClassAsync () ; try { t_Result = a_Service->DeleteClassAsync ( a_Class , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"DeleteClassAsync" , NULL , NULL , t_Result , t_Sink ) ; } } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: DeleteClassAsync ( const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( m_Registration->GetClassProviderRegistration ().SupportsDelete () ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_DeleteClassAsync ( t_IsProxy , a_Class , a_Flags , a_Context , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: CreateClassEnum ( const BSTR a_Superclass , long a_Flags, IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_CreateClassEnumAsync ( BOOL a_IsProxy , const BSTR a_SuperClass , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; CDecoupled_Batching_IWbemSyncObjectSink *t_Sink = new CDecoupled_Batching_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_CreateClassEnumAsync () ; try { t_Result = a_Service->CreateClassEnumAsync ( a_SuperClass , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_CreateClassEnumAsync () ; try { t_Result = a_Service->CreateClassEnumAsync ( a_SuperClass , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"CreateClassEnumAsync" , NULL , NULL , t_Result , t_Sink ) ; } } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: CreateClassEnumAsync ( const BSTR a_SuperClass , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( m_Registration->GetClassProviderRegistration ().SupportsEnumeration () ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_CreateClassEnumAsync ( t_IsProxy , a_SuperClass , a_Flags , a_Context , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: PutInstance ( IWbemClassObject *a_Instance , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_PutInstanceAsync ( BOOL a_IsProxy , IWbemClassObject *a_Instance , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; CDecoupled_IWbemSyncObjectSink *t_Sink = new CDecoupled_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_PutInstanceAsync () ; try { t_Result = a_Service->PutInstanceAsync ( a_Instance , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_PutInstanceAsync () ; try { t_Result = a_Service->PutInstanceAsync ( a_Instance , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"PutInstanceAsync" , NULL , NULL , t_Result , t_Sink ) ; } } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: PutInstanceAsync ( IWbemClassObject *a_Instance , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( m_Registration->GetInstanceProviderRegistration ().SupportsPut () ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_PutInstanceAsync ( t_IsProxy , a_Instance , a_Flags , a_Context , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: DeleteInstance ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_DeleteInstanceAsync ( BOOL a_IsProxy , const BSTR a_ObjectPath , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; CDecoupled_IWbemSyncObjectSink *t_Sink = new CDecoupled_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_DeleteInstanceAsync () ; try { t_Result = a_Service->DeleteInstanceAsync ( a_ObjectPath , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_DeleteInstanceAsync () ; try { t_Result = a_Service->DeleteInstanceAsync ( a_ObjectPath , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"DeleteInstanceAsync" , NULL , NULL , t_Result , t_Sink ) ; } } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: DeleteInstanceAsync ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( m_Registration->GetInstanceProviderRegistration ().SupportsDelete () ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_DeleteInstanceAsync ( t_IsProxy , a_ObjectPath , a_Flags , a_Context , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: CreateInstanceEnum ( const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_CreateInstanceEnumAsync ( BOOL a_IsProxy , const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; AdjustGetContext ( t_ContextCopy ) ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; CDecoupled_Batching_IWbemSyncObjectSink *t_Sink = new CDecoupled_Batching_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_CreateInstanceEnumAsync () ; try { t_Result = a_Service->CreateInstanceEnumAsync ( a_Class , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; Increment_ProviderOperation_CreateInstanceEnumAsync () ; try { t_Result = a_Service->CreateInstanceEnumAsync ( a_Class , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"CreateInstanceEnumAsync" , NULL , NULL , t_Result , t_Sink ) ; } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: CreateInstanceEnumAsync ( const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( m_Registration->GetInstanceProviderRegistration ().SupportsEnumeration () ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_CreateInstanceEnumAsync ( t_IsProxy , a_Class , a_Flags , a_Context , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: ExecQuery ( const BSTR a_QueryLanguage , const BSTR a_Query , long a_Flags , IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_ExecQueryAsync ( BOOL a_IsProxy , const BSTR a_QueryLanguage , const BSTR a_Query, long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( SUCCEEDED ( t_Result ) ) { if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; if ( SUCCEEDED ( t_Result ) ) { } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = S_OK ; } } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; if ( ( m_Registration->GetInstanceProviderRegistration ().QuerySupportLevels () & e_QuerySupportLevels_UnarySelect ) || ( m_Registration->GetInstanceProviderRegistration ().QuerySupportLevels () & e_QuerySupportLevels_V1ProviderDefined ) ) { CDecoupled_Batching_IWbemSyncObjectSink *t_Sink = new CDecoupled_Batching_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_ExecQueryAsync () ; try { t_Result = a_Service->ExecQueryAsync ( a_QueryLanguage , a_Query, a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_ExecQueryAsync () ; try { t_Result = a_Service->ExecQueryAsync ( a_QueryLanguage , a_Query, a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"ExecQueryAsync" , NULL , NULL , t_Result , t_Sink ) ; } } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else if ( m_Registration->GetInstanceProviderRegistration ().SupportsEnumeration () ) { IWbemQuery *t_QueryFilter = NULL ; t_Result = ProviderSubSystem_Common_Globals :: CreateInstance ( CLSID_WbemQuery , NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_IWbemQuery , ( void ** ) & t_QueryFilter ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_QueryFilter->Parse ( a_QueryLanguage , a_Query , 0 ) ; if ( SUCCEEDED ( t_Result ) ) { SWbemRpnEncodedQuery *t_Expression = NULL ; t_Result = t_QueryFilter->GetAnalysis ( WMIQ_ANALYSIS_RPN_SEQUENCE , 0 , ( void ** ) & t_Expression ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Expression->m_uFromTargetType == WMIQ_RPN_FROM_UNARY ) { BSTR t_Class = SysAllocString ( t_Expression->m_ppszFromList [ 0 ] ) ; if ( t_Class ) { CDecoupled_Batching_IWbemSyncObjectSink *t_Sink = new CDecoupled_Batching_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { a_Sink->SetStatus ( WBEM_STATUS_REQUIREMENTS , 0 , NULL , NULL ) ; CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { a_Sink->SetStatus ( WBEM_STATUS_REQUIREMENTS , 0 , NULL , NULL ) ; Increment_ProviderOperation_CreateInstanceEnumAsync () ; try { t_Result = a_Service->CreateInstanceEnumAsync ( t_Class , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_CreateInstanceEnumAsync () ; try { t_Result = a_Service->CreateInstanceEnumAsync ( t_Class , a_Flags , t_ContextCopy , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"CreateInstanceEnumAsync" , NULL , NULL , t_Result , t_Sink ) ; } t_Sink->Release () ; } else { SysFreeString ( t_Class ) ; t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_NOT_SUPPORTED ; } t_QueryFilter->FreeMemory ( t_Expression ) ; } else { t_Result = WBEM_E_UNEXPECTED ; } } else { t_Result = WBEM_E_NOT_SUPPORTED ; } t_QueryFilter->Release () ; } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } else { t_Result = WBEM_E_NOT_SUPPORTED ; } } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: ExecQueryAsync ( const BSTR a_QueryLanguage , const BSTR a_Query, long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( ( m_Registration->GetInstanceProviderRegistration ().QuerySupportLevels () & e_QuerySupportLevels_UnarySelect ) || ( m_Registration->GetInstanceProviderRegistration ().QuerySupportLevels () & e_QuerySupportLevels_V1ProviderDefined ) || ( m_Registration->GetInstanceProviderRegistration ().SupportsEnumeration () ) ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_ExecQueryAsync ( t_IsProxy , a_QueryLanguage , a_Query, a_Flags , a_Context , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: ExecNotificationQuery ( const BSTR a_QueryLanguage , const BSTR a_Query , long a_Flags , IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: ExecNotificationQueryAsync ( const BSTR a_QueryLanguage , const BSTR a_Query , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: ExecMethod ( const BSTR a_ObjectPath , const BSTR a_MethodName , long a_Flags , IWbemContext *a_Context , IWbemClassObject *a_InParams , IWbemClassObject **a_OutParams , IWbemCallResult **a_CallResult ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Helper_ExecMethodAsync ( BOOL a_IsProxy , const BSTR a_ObjectPath , const BSTR a_MethodName , long a_Flags , IWbemContext *a_Context , IWbemClassObject *a_InParams , IWbemObjectSink *a_Sink , IWbemServices *a_Service ) { HRESULT t_Result = S_OK ; a_Flags = ( a_Flags & ~WBEM_FLAG_DIRECT_READ ) ; IWbemContext *t_ContextCopy = NULL ; if ( a_Context ) { t_Result = a_Context->Clone ( & t_ContextCopy ) ; AdjustGetContext ( t_ContextCopy ) ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { ULONG t_Dependant = 1 ; CDecoupled_IWbemSyncObjectSink *t_Sink = new CDecoupled_IWbemSyncObjectSink ( m_Allocator , a_Sink , ( IWbemServices * ) this , ( CWbemGlobal_IWmiObjectSinkController * ) this , FALSE ) ; if ( t_Sink ) { t_Sink->AddRef () ; t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Sink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; if ( m_Registration->GetComRegistration ().GetSupportsSendStatus () == FALSE ) { a_Flags = ( a_Flags & ( ~WBEM_FLAG_SEND_STATUS ) ) ; } if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_ExecMethodAsync () ; try { t_Result = a_Service->ExecMethodAsync ( a_ObjectPath , a_MethodName , a_Flags , t_ContextCopy , a_InParams , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } if ( t_Result == WBEM_E_UNSUPPORTED_PARAMETER || t_Result == WBEM_E_INVALID_PARAMETER ) { a_Flags = ( a_Flags & ~WBEM_FLAG_SEND_STATUS ) ; if ( a_IsProxy ) { t_Result = CoImpersonateClient () ; } else { t_Result = S_OK ; } if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_ExecMethodAsync () ; try { t_Result = a_Service->ExecMethodAsync ( a_ObjectPath , a_MethodName , a_Flags , t_ContextCopy , a_InParams , t_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( FAILED ( t_Result ) ) { HRESULT t_TempResult = SetStatus ( L"ExecMethodAsync" , NULL , NULL , t_Result , t_Sink ) ; } } t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( t_ContextCopy ) { t_ContextCopy->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: ExecMethodAsync ( const BSTR a_ObjectPath , const BSTR a_MethodName , long a_Flags , IWbemContext *a_Context , IWbemClassObject *a_InParams , IWbemObjectSink *a_Sink ) { HRESULT t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; if ( m_Provider_IWbemServices ) { if ( m_Registration->GetMethodProviderRegistration ().SupportsMethods () ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Helper_ExecMethodAsync ( t_IsProxy , a_ObjectPath , a_MethodName , a_Flags , a_Context , a_InParams , a_Sink , t_Interface ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: GetProperty ( long a_Flags , const BSTR a_Locale , const BSTR a_ClassMapping , const BSTR a_InstanceMapping , const BSTR a_PropertyMapping , VARIANT *a_Value ) { if ( m_Provider_IWbemPropertyProvider ) { if ( m_Registration->GetPropertyProviderRegistration ().SupportsGet () ) { Increment_ProviderOperation_GetProperty () ; HRESULT t_Result = S_OK ; try { t_Result = m_Provider_IWbemPropertyProvider->GetProperty ( a_Flags , a_Locale , a_ClassMapping , a_InstanceMapping , a_PropertyMapping , a_Value ) ; CoRevertToSelf () ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; CoRevertToSelf () ; } return t_Result ; } } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: PutProperty ( long a_Flags , const BSTR a_Locale , const BSTR a_ClassMapping , const BSTR a_InstanceMapping , const BSTR a_PropertyMapping , const VARIANT *a_Value ) { if ( m_Provider_IWbemPropertyProvider ) { if ( m_Registration->GetPropertyProviderRegistration ().SupportsPut () ) { Increment_ProviderOperation_PutProperty () ; HRESULT t_Result = S_OK ; try { t_Result = m_Provider_IWbemPropertyProvider->PutProperty ( a_Flags , a_Locale , a_ClassMapping , a_InstanceMapping , a_PropertyMapping , a_Value ) ; CoRevertToSelf () ; return t_Result ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; CoRevertToSelf () ; } return t_Result ; } } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient ::ProvideEvents ( IWbemObjectSink *a_Sink , long a_Flags ) { if ( m_Provider_IWbemEventProvider ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_IWbemEventProvider , IID_IWbemEventProvider , m_Provider_IWbemEventProvider , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { Increment_ProviderOperation_ProvideEvents () ; try { t_Result = m_Provider_IWbemEventProvider->ProvideEvents ( a_Sink , a_Flags ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemEventProvider *t_Provider = ( IWbemEventProvider * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_ProvideEvents () ; try { t_Result = t_Provider->ProvideEvents ( a_Sink , a_Flags ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemEventProvider , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient ::NewQuery ( unsigned long a_Id , WBEM_WSTR a_QueryLanguage , WBEM_WSTR a_Query ) { if ( m_Provider_IWbemEventProviderQuerySink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_IWbemEventProviderQuerySink , IID_IWbemEventProviderQuerySink , m_Provider_IWbemEventProviderQuerySink , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { Increment_ProviderOperation_NewQuery () ; try { t_Result = m_Provider_IWbemEventProviderQuerySink->NewQuery ( a_Id , a_QueryLanguage , a_Query ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemEventProviderQuerySink *t_Provider = ( IWbemEventProviderQuerySink * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_NewQuery () ; try { t_Result = t_Provider->NewQuery ( a_Id , a_QueryLanguage , a_Query ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemEventProviderQuerySink , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient ::CancelQuery ( unsigned long a_Id ) { if ( m_Provider_IWbemEventProviderQuerySink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_IWbemEventProviderQuerySink , IID_IWbemEventProviderQuerySink , m_Provider_IWbemEventProviderQuerySink , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { Increment_ProviderOperation_CancelQuery () ; try { t_Result = m_Provider_IWbemEventProviderQuerySink->CancelQuery ( a_Id ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemEventProviderQuerySink *t_Provider = ( IWbemEventProviderQuerySink * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_CancelQuery () ; try { t_Result = t_Provider->CancelQuery ( a_Id ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemEventProviderQuerySink , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient ::AccessCheck ( WBEM_CWSTR a_QueryLanguage , WBEM_CWSTR a_Query , long a_SidLength , const BYTE *a_Sid ) { if ( m_Provider_IWbemEventProviderSecurity ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_IWbemEventProviderSecurity , IID_IWbemEventProviderSecurity , m_Provider_IWbemEventProviderSecurity , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { Increment_ProviderOperation_AccessCheck () ; try { t_Result = m_Provider_IWbemEventProviderSecurity->AccessCheck ( a_QueryLanguage , a_Query , a_SidLength , a_Sid ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemEventProviderSecurity *t_Provider = ( IWbemEventProviderSecurity * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_AccessCheck () ; try { t_Result = t_Provider->AccessCheck ( a_QueryLanguage , a_Query , a_SidLength , a_Sid ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemEventProviderSecurity , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient ::SetRegistrationObject ( long a_Flags , IWbemClassObject *a_ProviderRegistration ) { if ( m_Provider_IWbemProviderIdentity ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_IWbemProviderIdentity , IID_IWbemProviderIdentity , m_Provider_IWbemProviderIdentity , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { Increment_ProviderOperation_SetRegistrationObject () ; try { t_Result = m_Provider_IWbemProviderIdentity->SetRegistrationObject ( a_Flags , a_ProviderRegistration ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemProviderIdentity *t_Provider = ( IWbemProviderIdentity * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_SetRegistrationObject () ; try { t_Result = t_Provider->SetRegistrationObject ( a_Flags , a_ProviderRegistration ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemProviderIdentity , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient ::FindConsumer ( IWbemClassObject *a_LogicalConsumer , IWbemUnboundObjectSink **a_Consumer ) { if ( m_Provider_IWbemEventConsumerProvider ) { IWbemUnboundObjectSink *t_Consumer = NULL ; BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_IWbemEventConsumerProvider , IID_IWbemEventConsumerProvider , m_Provider_IWbemEventConsumerProvider , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { Increment_ProviderOperation_FindConsumer () ; try { t_Result = m_Provider_IWbemEventConsumerProvider->FindConsumer ( a_LogicalConsumer , & t_Consumer ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemEventConsumerProvider *t_Provider = ( IWbemEventConsumerProvider * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_FindConsumer () ; try { t_Result = t_Provider->FindConsumer ( a_LogicalConsumer , & t_Consumer ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemEventConsumerProvider , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } if ( SUCCEEDED ( t_Result ) ) { if ( a_Consumer ) { CInterceptor_IWbemDecoupledUnboundObjectSink *t_UnboundObjectSink = new CInterceptor_IWbemDecoupledUnboundObjectSink ( m_Allocator , t_Consumer , this , *m_Registration ) ; if ( t_UnboundObjectSink ) { t_UnboundObjectSink->AddRef () ; t_Result = t_UnboundObjectSink->Initialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_VoidPointerController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_UnboundObjectSink , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { UnLock () ; *a_Consumer = t_UnboundObjectSink ; t_UnboundObjectSink->AddRef () ; } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } } t_UnboundObjectSink->Release () ; } } } if ( t_Consumer ) { t_Consumer->Release () ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient ::ValidateSubscription ( IWbemClassObject *a_LogicalConsumer ) { if ( m_Provider_IWbemEventConsumerProviderEx ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_IWbemEventConsumerProviderEx , IID_IWbemEventConsumerProviderEx , m_Provider_IWbemEventConsumerProviderEx , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { Increment_ProviderOperation_ValidateSubscription () ; try { t_Result = m_Provider_IWbemEventConsumerProviderEx->ValidateSubscription ( a_LogicalConsumer ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemEventConsumerProviderEx *t_Provider = ( IWbemEventConsumerProviderEx * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { Increment_ProviderOperation_ValidateSubscription () ; try { t_Result = t_Provider->ValidateSubscription ( a_LogicalConsumer ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { t_Result = WBEM_E_ACCESS_DENIED ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemEventConsumerProviderEx , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: IndicateToConsumer ( IWbemClassObject *a_LogicalConsumer , long a_ObjectCount , IWbemClassObject **a_Objects ) { if ( m_Provider_IWbemUnboundObjectSink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT 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_IWbemUnboundObjectSink , IID_IWbemUnboundObjectSink , m_Provider_IWbemUnboundObjectSink , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = m_Provider_IWbemUnboundObjectSink->IndicateToConsumer ( a_LogicalConsumer , a_ObjectCount , a_Objects ) ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemUnboundObjectSink *t_Provider = ( IWbemUnboundObjectSink * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Provider->IndicateToConsumer ( a_LogicalConsumer , a_ObjectCount , a_Objects ) ; } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemUnboundObjectSink , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } return WBEM_E_PROVIDER_NOT_CAPABLE; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Initialize ( LPWSTR a_User , LONG a_Flags , LPWSTR a_Namespace , LPWSTR a_Locale , IWbemServices *a_CoreService , IWbemContext *a_Context , IWbemProviderInitSink *a_Sink ) { HRESULT t_Result = S_OK ; if ( m_Unknown ) { IWbemProviderInit *t_Provider = NULL ; t_Result = m_Unknown->QueryInterface ( IID_IWbemProviderInit , ( void ** ) & t_Provider ) ; if ( SUCCEEDED ( t_Result ) ) { try { t_Result = t_Provider->Initialize ( a_User, a_Flags, a_Namespace, a_Locale, a_CoreService, a_Context, a_Sink ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } t_Provider->Release () ; } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } a_Sink->SetStatus ( t_Result , 0 ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Internal_Initialize ( WmiInternalContext a_InternalContext , LPWSTR a_User , LONG a_Flags , LPWSTR a_Namespace , LPWSTR a_Locale , IWbemServices *a_CoreService , IWbemContext *a_Context , IWbemProviderInitSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = DecoupledProviderSubSystem_Globals :: Begin_IdentifyCall_PrvHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Initialize ( a_User , a_Flags , a_Namespace , a_Locale , a_CoreService , a_Context , a_Sink ) ; DecoupledProviderSubSystem_Globals :: End_IdentifyCall_PrvHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: ProviderInitialize () { HRESULT t_Result = S_OK ; WmiStatusCode t_StatusCode = CWbemGlobal_IWmiObjectSinkController :: Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( SUCCEEDED ( t_Result ) ) { t_StatusCode = m_ProxyContainer.Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: GetSite ( DWORD *a_ProcessIdentifier ) { HRESULT t_Result = S_OK ; if ( a_ProcessIdentifier ) { *a_ProcessIdentifier = GetCurrentProcessId () ; } else { t_Result = WBEM_E_INVALID_PARAMETER ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: SetContainer ( IUnknown *a_Container ) { return WBEM_E_NOT_AVAILABLE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_DecoupledClient :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; IWbemShutdown *t_Shutdown = NULL ; if ( m_Unknown ) { t_Result = m_Unknown->QueryInterface ( IID_IWbemShutdown , ( void ** ) & t_Shutdown ) ; if ( SUCCEEDED ( t_Result ) ) { 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_IWbemShutdown , IID_IWbemShutdown , t_Shutdown , t_Proxy , t_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { try { t_Result = t_Shutdown->Shutdown ( a_Flags , a_MaxMilliSeconds , a_Context ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } else { if ( SUCCEEDED ( t_Result ) ) { IWbemShutdown *t_Provider = ( IWbemShutdown * ) t_Proxy ; // Set cloaking on the proxy // ========================= DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; t_Result = ProviderSubSystem_Common_Globals :: SetCloaking ( t_Provider , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { try { t_Result = t_Provider->Shutdown ( a_Flags , a_MaxMilliSeconds , a_Context ) ; } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; } CoRevertToSelf () ; } } HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_IWbemShutdown , t_Proxy , t_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } t_Shutdown->Release () ; } } Lock () ; CWbemGlobal_IWmiObjectSinkController_Container *t_Container = NULL ; GetContainer ( t_Container ) ; IWbemShutdown **t_ShutdownElements = new IWbemShutdown * [ t_Container->Size () ] ; if ( t_ShutdownElements ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator = t_Container->Begin (); ULONG t_Count = 0 ; while ( ! t_Iterator.Null () ) { t_Result = t_Iterator.GetElement ()->QueryInterface ( IID_IWbemShutdown , ( void ** ) & t_ShutdownElements [ t_Count ] ) ; t_Iterator.Increment () ; t_Count ++ ; } UnLock () ; for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { if ( t_ShutdownElements [ t_Index ] ) { t_Result = t_ShutdownElements [ t_Index ]->Shutdown ( a_Flags , a_MaxMilliSeconds , a_Context ) ; t_ShutdownElements [ t_Index ]->Release () ; } } delete [] t_ShutdownElements ; } else { UnLock () ; t_Result = WBEM_E_OUT_OF_MEMORY ; } CWbemGlobal_IWmiObjectSinkController :: Shutdown () ; return t_Result ; }