/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: XXXX Abstract: History: --*/ #include "PreComp.h" #include #include "Globals.h" #include "CGlobals.h" #include "ProvCache.h" #include "ProvObSk.h" #include "ProvInSk.h" #include "ProvWsvS.h" /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IWbemServices_Interceptor :: CInterceptor_IWbemServices_Interceptor ( WmiAllocator &a_Allocator , IWbemServices *a_Service ) : m_ReferenceCount ( 0 ) , m_Core_IWbemServices ( a_Service ) , m_Core_IWbemRefreshingServices ( NULL ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_Allocator ( a_Allocator ), m_CriticalSection (NOTHROW_LOCK) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Interceptor_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; HRESULT t_Result = m_Core_IWbemServices->QueryInterface ( IID_IWbemRefreshingServices , ( void ** ) & m_Core_IWbemRefreshingServices ) ; m_Core_IWbemServices->AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IWbemServices_Interceptor :: ~CInterceptor_IWbemServices_Interceptor () { if ( m_Core_IWbemServices ) { m_Core_IWbemServices->Release () ; } if ( m_Core_IWbemRefreshingServices ) { m_Core_IWbemRefreshingServices->Release () ; } InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Interceptor_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemServices_Interceptor :: AddRef ( void ) { return InterlockedIncrement ( & m_ReferenceCount ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemServices_Interceptor :: Release ( void ) { ULONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ; if ( t_ReferenceCount == 0 ) { delete this ; } return t_ReferenceCount; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CInterceptor_IWbemServices_Interceptor :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemServices ) { *iplpv = ( LPVOID ) ( IWbemServices * ) this ; } else if ( iid == IID_IWbemRefreshingServices ) { *iplpv = ( LPVOID ) ( IWbemRefreshingServices * ) 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_IWbemServices_Interceptor::OpenNamespace ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemServices **a_NamespaceService , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->OpenNamespace ( a_ObjectPath, a_Flags, a_Context , a_NamespaceService, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: CancelAsyncCall ( IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->CancelAsyncCall ( a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: QueryObjectSink ( long a_Flags , IWbemObjectSink **a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->QueryObjectSink ( a_Flags, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: GetObject ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemClassObject **a_Object , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->GetObject ( a_ObjectPath, a_Flags, a_Context , a_Object, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: GetObjectAsync ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->GetObjectAsync ( a_ObjectPath, a_Flags, a_Context , a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: PutClass ( IWbemClassObject *a_Object , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->PutClass ( a_Object, a_Flags, a_Context, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: PutClassAsync ( IWbemClassObject *a_Object , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->PutClassAsync ( a_Object, a_Flags, a_Context , a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: DeleteClass ( const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->DeleteClass ( a_Class, a_Flags, a_Context, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: DeleteClassAsync ( const BSTR a_Class , long a_Flags, IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->DeleteClassAsync ( a_Class , a_Flags , a_Context , a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: CreateClassEnum ( const BSTR a_Superclass , long a_Flags, IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->CreateClassEnum ( a_Superclass, a_Flags, a_Context, a_Enum ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ SCODE CInterceptor_IWbemServices_Interceptor :: CreateClassEnumAsync ( const BSTR a_Superclass , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->CreateClassEnumAsync ( a_Superclass, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: PutInstance ( IWbemClassObject *a_Instance, long a_Flags, IWbemContext *a_Context, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->PutInstance ( a_Instance, a_Flags, a_Context, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: PutInstanceAsync ( IWbemClassObject *a_Instance, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->PutInstanceAsync ( a_Instance, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: DeleteInstance ( const BSTR a_ObjectPath, long a_Flags, IWbemContext *a_Context, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->DeleteInstance ( a_ObjectPath, a_Flags, a_Context, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: DeleteInstanceAsync ( const BSTR a_ObjectPath, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->DeleteInstanceAsync ( a_ObjectPath, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: CreateInstanceEnum ( const BSTR a_Class, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->CreateInstanceEnum ( a_Class, a_Flags, a_Context, a_Enum ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: CreateInstanceEnumAsync ( const BSTR a_Class, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->CreateInstanceEnumAsync ( a_Class, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: ExecQuery ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecQuery ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Enum ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: ExecQueryAsync ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecQueryAsync ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: ExecNotificationQuery ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecNotificationQuery ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Enum ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: ExecNotificationQueryAsync ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecNotificationQueryAsync ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT STDMETHODCALLTYPE CInterceptor_IWbemServices_Interceptor :: ExecMethod ( const BSTR a_ObjectPath, const BSTR a_MethodName, long a_Flags, IWbemContext *a_Context, IWbemClassObject *a_InParams, IWbemClassObject **a_OutParams, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecMethod ( a_ObjectPath, a_MethodName, a_Flags, a_Context, a_InParams, a_OutParams, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT STDMETHODCALLTYPE CInterceptor_IWbemServices_Interceptor :: ExecMethodAsync ( const BSTR a_ObjectPath, const BSTR a_MethodName, long a_Flags, IWbemContext *a_Context, IWbemClassObject *a_InParams, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecMethodAsync ( a_ObjectPath, a_MethodName, a_Flags, a_Context, a_InParams, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: ServiceInitialize () { return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_GateClosed ) ; bool t_Acquired = false ; while ( ! t_Acquired ) { if ( m_InProgress == 0 ) { t_Acquired = true ; break ; } if ( SwitchToThread () == FALSE ) { } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: AddObjectToRefresher ( WBEM_REFRESHER_ID *a_RefresherId , LPCWSTR a_Path, long a_Flags , IWbemContext *a_Context, DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->AddObjectToRefresher ( a_RefresherId , a_Path, a_Flags , a_Context, a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: AddObjectToRefresherByTemplate ( WBEM_REFRESHER_ID *a_RefresherId , IWbemClassObject *a_Template , long a_Flags , IWbemContext *a_Context , DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->AddObjectToRefresherByTemplate ( a_RefresherId , a_Template , a_Flags , a_Context , a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: AddEnumToRefresher ( WBEM_REFRESHER_ID *a_RefresherId , LPCWSTR a_Class , long a_Flags , IWbemContext *a_Context, DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->AddEnumToRefresher ( a_RefresherId , a_Class , a_Flags , a_Context, a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: RemoveObjectFromRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Id , long a_Flags , DWORD a_ClientRefresherVersion , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->RemoveObjectFromRefresher ( a_RefresherId , a_Id , a_Flags , a_ClientRefresherVersion , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: GetRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Flags , DWORD a_ClientRefresherVersion , IWbemRemoteRefresher **a_RemoteRefresher , GUID *a_Guid , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->GetRemoteRefresher ( a_RefresherId , a_Flags , a_ClientRefresherVersion , a_RemoteRefresher , a_Guid , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Interceptor :: ReconnectRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId, long a_Flags, long a_NumberOfObjects, DWORD a_ClientRefresherVersion , WBEM_RECONNECT_INFO *a_ReconnectInformation , WBEM_RECONNECT_RESULTS *a_ReconnectResults , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->ReconnectRemoteRefresher ( a_RefresherId, a_Flags, a_NumberOfObjects, a_ClientRefresherVersion , a_ReconnectInformation , a_ReconnectResults , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IWbemServices_RestrictingInterceptor :: CInterceptor_IWbemServices_RestrictingInterceptor ( WmiAllocator &a_Allocator , IWbemServices *a_Service , CServerObject_ProviderRegistrationV1 &a_Registration ) : m_ReferenceCount ( 0 ) , m_Core_IWbemServices ( a_Service ) , m_Core_IWbemRefreshingServices ( NULL ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_Registration ( a_Registration ) , m_Allocator ( a_Allocator ) , m_ProxyContainer ( a_Allocator , 3 , MAX_PROXIES ), m_CriticalSection(NOTHROW_LOCK) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_RestrictingInterceptor_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; HRESULT t_Result = m_Core_IWbemServices->QueryInterface ( IID_IWbemRefreshingServices , ( void ** ) & m_Core_IWbemRefreshingServices ) ; m_Core_IWbemServices->AddRef () ; m_Registration.AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IWbemServices_RestrictingInterceptor :: ~CInterceptor_IWbemServices_RestrictingInterceptor () { WmiStatusCode t_StatusCode = m_ProxyContainer.UnInitialize () ; if ( m_Core_IWbemServices ) { m_Core_IWbemServices->Release () ; } if ( m_Core_IWbemRefreshingServices ) { m_Core_IWbemRefreshingServices->Release () ; } m_Registration.Release () ; InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_RestrictingInterceptor_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemServices_RestrictingInterceptor :: AddRef ( void ) { return InterlockedIncrement ( & m_ReferenceCount ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemServices_RestrictingInterceptor :: Release ( void ) { ULONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ; if ( t_ReferenceCount == 0 ) { delete this ; } return t_ReferenceCount; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CInterceptor_IWbemServices_RestrictingInterceptor :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemServices ) { *iplpv = ( LPVOID ) ( IWbemServices * ) this ; } else if ( iid == IID_IWbemRefreshingServices ) { *iplpv = ( LPVOID ) ( IWbemRefreshingServices * ) 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_IWbemServices_RestrictingInterceptor :: Begin_IWbemServices ( BOOL &a_Impersonating , IUnknown *&a_OldContext , IServerSecurity *&a_OldSecurity , BOOL &a_IsProxy , IWbemServices *&a_Interface , BOOL &a_Revert , IUnknown *&a_Proxy , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; a_Revert = FALSE ; a_Proxy = NULL ; a_Impersonating = FALSE ; a_OldContext = NULL ; a_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginCallbackImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemServices , IID_IWbemServices , m_Core_IWbemServices , a_Proxy , a_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { a_Interface = m_Core_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 ( FAILED ( t_Result ) ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemServices , a_Proxy , a_Revert ) ; } } } if ( FAILED ( t_Result ) ) { ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: 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_Proxy_IWbemServices , a_Proxy , a_Revert ) ; } ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: Begin_IWbemRefreshingServices ( BOOL &a_Impersonating , IUnknown *&a_OldContext , IServerSecurity *&a_OldSecurity , BOOL &a_IsProxy , IWbemRefreshingServices *&a_Interface , BOOL &a_Revert , IUnknown *&a_Proxy , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; a_Revert = FALSE ; a_Proxy = NULL ; a_Impersonating = FALSE ; a_OldContext = NULL ; a_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginCallbackImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemRefreshingServices , IID_IWbemRefreshingServices , m_Core_IWbemRefreshingServices , a_Proxy , a_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { a_Interface = m_Core_IWbemRefreshingServices ; a_IsProxy = FALSE ; t_Result = S_OK ; } else { if ( SUCCEEDED ( t_Result ) ) { a_IsProxy = TRUE ; a_Interface = ( IWbemRefreshingServices * ) 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 ( FAILED ( t_Result ) ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemRefreshingServices , a_Proxy , a_Revert ) ; } } } if ( FAILED ( t_Result ) ) { ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: End_IWbemRefreshingServices ( BOOL a_Impersonating , IUnknown *a_OldContext , IServerSecurity *a_OldSecurity , BOOL a_IsProxy , IWbemRefreshingServices *a_Interface , BOOL a_Revert , IUnknown *a_Proxy ) { CoRevertToSelf () ; if ( a_Proxy ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemRefreshingServices , a_Proxy , a_Revert ) ; } ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor::OpenNamespace ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemServices **a_NamespaceService , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->OpenNamespace ( a_ObjectPath, a_Flags, a_Context , a_NamespaceService, a_CallResult ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: CancelAsyncCall ( IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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 ( a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: QueryObjectSink ( long a_Flags , IWbemObjectSink **a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->QueryObjectSink ( a_Flags, a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: GetObject ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemClassObject **a_Object , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->GetObject ( a_ObjectPath, a_Flags, a_Context , a_Object, a_CallResult ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: GetObjectAsync ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->GetObjectAsync ( a_ObjectPath, a_Flags, a_Context , a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: PutClass ( IWbemClassObject *a_Object , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->PutClass ( a_Object, a_Flags, a_Context, a_CallResult ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: PutClassAsync ( IWbemClassObject *a_Object , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->PutClassAsync ( a_Object, a_Flags, a_Context , a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: DeleteClass ( const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->DeleteClass ( a_Class, a_Flags, a_Context, a_CallResult ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: DeleteClassAsync ( const BSTR a_Class , long a_Flags, IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->DeleteClassAsync ( a_Class , a_Flags , a_Context , a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: CreateClassEnum ( const BSTR a_Superclass , long a_Flags, IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->CreateClassEnum ( a_Superclass, a_Flags, a_Context, a_Enum ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ SCODE CInterceptor_IWbemServices_RestrictingInterceptor :: CreateClassEnumAsync ( const BSTR a_Superclass , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->CreateClassEnumAsync ( a_Superclass, a_Flags, a_Context, a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: PutInstance ( IWbemClassObject *a_Instance, long a_Flags, IWbemContext *a_Context, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->PutInstance ( a_Instance, a_Flags, a_Context, a_CallResult ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: PutInstanceAsync ( IWbemClassObject *a_Instance, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->PutInstanceAsync ( a_Instance, a_Flags, a_Context, a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: DeleteInstance ( const BSTR a_ObjectPath, long a_Flags, IWbemContext *a_Context, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->DeleteInstance ( a_ObjectPath, a_Flags, a_Context, a_CallResult ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: DeleteInstanceAsync ( const BSTR a_ObjectPath, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->DeleteInstanceAsync ( a_ObjectPath, a_Flags, a_Context, a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: CreateInstanceEnum ( const BSTR a_Class, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->CreateInstanceEnum ( a_Class, a_Flags, a_Context, a_Enum ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: CreateInstanceEnumAsync ( const BSTR a_Class, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->CreateInstanceEnumAsync ( a_Class, a_Flags, a_Context, a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: ExecQuery ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->ExecQuery ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Enum ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: ExecQueryAsync ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->ExecQueryAsync ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: ExecNotificationQuery ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->ExecNotificationQuery ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Enum ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: ExecNotificationQueryAsync ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->ExecNotificationQueryAsync ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT STDMETHODCALLTYPE CInterceptor_IWbemServices_RestrictingInterceptor :: ExecMethod ( const BSTR a_ObjectPath, const BSTR a_MethodName, long a_Flags, IWbemContext *a_Context, IWbemClassObject *a_InParams, IWbemClassObject **a_OutParams, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->ExecMethod ( a_ObjectPath, a_MethodName, a_Flags, a_Context, a_InParams, a_OutParams, a_CallResult ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT STDMETHODCALLTYPE CInterceptor_IWbemServices_RestrictingInterceptor :: ExecMethodAsync ( const BSTR a_ObjectPath, const BSTR a_MethodName, long a_Flags, IWbemContext *a_Context, IWbemClassObject *a_InParams, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { 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->ExecMethodAsync ( a_ObjectPath, a_MethodName, a_Flags, a_Context, a_InParams, a_Sink ) ; End_IWbemServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: ServiceInitialize () { WmiStatusCode t_StatusCode = m_ProxyContainer.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { return S_OK ; } else { return WBEM_E_OUT_OF_MEMORY ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_GateClosed ) ; bool t_Acquired = false ; while ( ! t_Acquired ) { if ( m_InProgress == 0 ) { t_Acquired = true ; break ; } if ( SwitchToThread () == FALSE ) { } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: AddObjectToRefresher ( WBEM_REFRESHER_ID *a_RefresherId , LPCWSTR a_Path, long a_Flags , IWbemContext *a_Context, DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->AddObjectToRefresher ( a_RefresherId , a_Path, a_Flags , a_Context, a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: AddObjectToRefresherByTemplate ( WBEM_REFRESHER_ID *a_RefresherId , IWbemClassObject *a_Template , long a_Flags , IWbemContext *a_Context , DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->AddObjectToRefresherByTemplate ( a_RefresherId , a_Template , a_Flags , a_Context , a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: AddEnumToRefresher ( WBEM_REFRESHER_ID *a_RefresherId , LPCWSTR a_Class , long a_Flags , IWbemContext *a_Context, DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->AddEnumToRefresher ( a_RefresherId , a_Class , a_Flags , a_Context, a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: RemoveObjectFromRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Id , long a_Flags , DWORD a_ClientRefresherVersion , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->RemoveObjectFromRefresher ( a_RefresherId , a_Id , a_Flags , a_ClientRefresherVersion , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: GetRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Flags , DWORD a_ClientRefresherVersion , IWbemRemoteRefresher **a_RemoteRefresher , GUID *a_Guid , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->GetRemoteRefresher ( a_RefresherId , a_Flags , a_ClientRefresherVersion , a_RemoteRefresher , a_Guid , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_RestrictingInterceptor :: ReconnectRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId, long a_Flags, long a_NumberOfObjects, DWORD a_ClientRefresherVersion , WBEM_RECONNECT_INFO *a_ReconnectInformation , WBEM_RECONNECT_RESULTS *a_ReconnectResults , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->ReconnectRemoteRefresher ( a_RefresherId, a_Flags, a_NumberOfObjects, a_ClientRefresherVersion , a_ReconnectInformation , a_ReconnectResults , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } #ifdef INTERNAL_IDENTIFY /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CInterceptor_IEnumWbemClassObject_Stub :: CInterceptor_IEnumWbemClassObject_Stub ( CWbemGlobal_VoidPointerController *a_Controller , WmiAllocator &a_Allocator , IEnumWbemClassObject *a_InterceptedEnum ) : CWbemGlobal_VoidPointerController ( a_Allocator ) , VoidPointerContainerElement ( a_Controller , this ) , m_Allocator ( a_Allocator ) , m_InterceptedEnum ( a_InterceptedEnum ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IEnumWbemClassObject_Stub_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; if ( m_InterceptedEnum ) { m_InterceptedEnum->AddRef () ; } } #pragma warning( default : 4355 ) /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IEnumWbemClassObject_Stub :: ~CInterceptor_IEnumWbemClassObject_Stub () { CWbemGlobal_VoidPointerController :: UnInitialize () ; InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IEnumWbemClassObject_Stub_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CInterceptor_IEnumWbemClassObject_Stub :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IEnumWbemClassObject ) { *iplpv = ( LPVOID ) ( IEnumWbemClassObject * ) this ; } else if ( iid == IID_Internal_IEnumWbemClassObject ) { *iplpv = ( LPVOID ) ( Internal_IEnumWbemClassObject * ) 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: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IEnumWbemClassObject_Stub :: AddRef ( void ) { return VoidPointerContainerElement :: AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IEnumWbemClassObject_Stub :: Release ( void ) { return VoidPointerContainerElement :: Release () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: EnumInitialize () { HRESULT t_Result = S_OK ; if ( SUCCEEDED ( t_Result ) ) { WmiStatusCode t_StatusCode = CWbemGlobal_VoidPointerController :: Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Enqueue_IEnumWbemClassObject ( IEnumWbemClassObject *a_Enum , IEnumWbemClassObject *&a_Stub ) { HRESULT t_Result = S_OK ; CInterceptor_IEnumWbemClassObject_Stub *t_Stub = new CInterceptor_IEnumWbemClassObject_Stub ( this , m_Allocator , a_Enum ) ; if ( t_Stub ) { t_Stub->AddRef () ; t_Result = t_Stub->EnumInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_VoidPointerController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Stub , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { a_Stub = t_Stub ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } UnLock () ; } else { t_Stub->Release () ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Reset () { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_InterceptedEnum->Reset () ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Next ( long a_Timeout , ULONG a_Count , IWbemClassObject **a_Objects , ULONG *a_Returned ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_InterceptedEnum->Next ( a_Timeout , a_Count , a_Objects , a_Returned ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: NextAsync ( ULONG a_Count, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_InterceptedEnum->NextAsync ( a_Count, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Clone ( IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; try { *a_Enum = NULL ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } if ( SUCCEEDED ( t_Result ) ) { InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { IEnumWbemClassObject *t_Enum = NULL ; t_Result = m_InterceptedEnum->Clone ( & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } } InterlockedDecrement ( & m_InProgress ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Skip ( long a_Timeout, ULONG a_Count ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { IEnumWbemClassObject *t_Enum = NULL ; t_Result = m_InterceptedEnum->Skip ( a_Timeout, a_Count ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Internal_Reset ( WmiInternalContext a_InternalContext ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Reset () ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Internal_Next ( WmiInternalContext a_InternalContext , long a_Timeout , ULONG a_Count , IWbemClassObject **a_Objects , ULONG *a_Returned ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Next ( a_Timeout , a_Count , a_Objects , a_Returned ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Internal_NextAsync ( WmiInternalContext a_InternalContext , ULONG a_Count, IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = NextAsync ( a_Count, a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Internal_Clone ( WmiInternalContext a_InternalContext , IEnumWbemClassObject **a_Enum ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Clone ( a_Enum ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Internal_Skip ( WmiInternalContext a_InternalContext , long a_Timeout, ULONG a_Count ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Skip ( a_Timeout, a_Count ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Stub :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_GateClosed ) ; bool t_Acquired = false ; while ( ! t_Acquired ) { if ( m_InProgress == 0 ) { t_Acquired = true ; } if ( SwitchToThread () == FALSE ) { } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CInterceptor_IEnumWbemClassObject_Proxy :: CInterceptor_IEnumWbemClassObject_Proxy ( CWbemGlobal_VoidPointerController *a_Controller , WmiAllocator &a_Allocator , IEnumWbemClassObject *a_InterceptedEnum ) : CWbemGlobal_VoidPointerController ( a_Allocator ) , VoidPointerContainerElement ( a_Controller , this ) , m_Allocator ( a_Allocator ) , m_ProxyContainer ( a_Allocator , ProxyIndex_EnumProxy_Size , MAX_PROXIES ) , m_InterceptedEnum ( a_InterceptedEnum ) , m_Internal_InterceptedEnum ( NULL ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IEnumWbemClassObject_Proxy_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; if ( m_InterceptedEnum ) { m_InterceptedEnum->AddRef () ; HRESULT t_Result = m_InterceptedEnum->QueryInterface ( IID_Internal_IEnumWbemClassObject , ( void ** ) & m_Internal_InterceptedEnum ) ; } } #pragma warning( default : 4355 ) /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IEnumWbemClassObject_Proxy :: ~CInterceptor_IEnumWbemClassObject_Proxy () { CWbemGlobal_VoidPointerController :: UnInitialize () ; WmiStatusCode t_StatusCode = m_ProxyContainer.UnInitialize () ; InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IEnumWbemClassObject_Proxy_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CInterceptor_IEnumWbemClassObject_Proxy :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IEnumWbemClassObject ) { *iplpv = ( LPVOID ) ( IEnumWbemClassObject * ) this ; } else if ( iid == IID_Internal_IEnumWbemClassObject ) { *iplpv = ( LPVOID ) ( Internal_IEnumWbemClassObject * ) 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: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IEnumWbemClassObject_Proxy :: AddRef ( void ) { return VoidPointerContainerElement :: AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IEnumWbemClassObject_Proxy :: Release ( void ) { return VoidPointerContainerElement :: Release () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: EnumInitialize () { HRESULT t_Result = S_OK ; WmiStatusCode t_StatusCode = m_ProxyContainer.Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( SUCCEEDED ( t_Result ) ) { WmiStatusCode t_StatusCode = CWbemGlobal_VoidPointerController :: Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: Begin_IEnumWbemClassObject ( DWORD a_ProcessIdentifier , HANDLE &a_IdentifyToken , BOOL &a_Impersonating , IUnknown *&a_OldContext , IServerSecurity *&a_OldSecurity , BOOL &a_IsProxy , IUnknown *&a_Interface , BOOL &a_Revert , IUnknown *&a_Proxy ) { HRESULT t_Result = S_OK ; a_IdentifyToken = NULL ; a_Revert = FALSE ; a_Proxy = NULL ; a_Impersonating = FALSE ; a_OldContext = NULL ; a_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginCallbackImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { if ( a_ProcessIdentifier ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; CoRevertToSelf () ; if ( t_ImpersonationLevel == RPC_C_IMP_LEVEL_IMPERSONATE || t_ImpersonationLevel == RPC_C_IMP_LEVEL_DELEGATE ) { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_EnumProxy_IEnumWbemClassObject , IID_IEnumWbemClassObject , m_InterceptedEnum , a_Proxy , a_Revert ) ; } else { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState_PrvHost ( m_ProxyContainer , ProxyIndex_EnumProxy_Internal_IEnumWbemClassObject , IID_Internal_IEnumWbemClassObject , m_Internal_InterceptedEnum , a_Proxy , a_Revert , a_ProcessIdentifier , a_IdentifyToken ) ; } } } else { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_EnumProxy_IEnumWbemClassObject , IID_IEnumWbemClassObject , m_InterceptedEnum , a_Proxy , a_Revert ) ; } if ( t_Result == WBEM_E_NOT_FOUND ) { a_Interface = m_InterceptedEnum ; a_IsProxy = FALSE ; t_Result = S_OK ; } else { if ( SUCCEEDED ( t_Result ) ) { a_IsProxy = TRUE ; a_Interface = ( IUnknown * ) 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 ( FAILED ( t_Result ) ) { if ( a_IdentifyToken ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState_PrvHost ( m_ProxyContainer , ProxyIndex_EnumProxy_Internal_IEnumWbemClassObject , a_Proxy , a_Revert , a_ProcessIdentifier , a_IdentifyToken ) ; } else { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_EnumProxy_IEnumWbemClassObject , a_Proxy , a_Revert ) ; } } } } if ( FAILED ( t_Result ) ) { ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: End_IEnumWbemClassObject ( DWORD a_ProcessIdentifier , HANDLE a_IdentifyToken , BOOL a_Impersonating , IUnknown *a_OldContext , IServerSecurity *a_OldSecurity , BOOL a_IsProxy , IUnknown *a_Interface , BOOL a_Revert , IUnknown *a_Proxy ) { CoRevertToSelf () ; if ( a_Proxy ) { if ( a_IdentifyToken ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState_PrvHost ( m_ProxyContainer , ProxyIndex_EnumProxy_Internal_IEnumWbemClassObject , a_Proxy , a_Revert , a_ProcessIdentifier , a_IdentifyToken ) ; } else { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_EnumProxy_IEnumWbemClassObject , a_Proxy , a_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: Enqueue_IEnumWbemClassObject ( IEnumWbemClassObject *a_Enum , IEnumWbemClassObject *&a_Proxy ) { HRESULT t_Result = S_OK ; CInterceptor_IEnumWbemClassObject_Proxy *t_Proxy = new CInterceptor_IEnumWbemClassObject_Proxy ( this , m_Allocator , a_Enum ) ; if ( t_Proxy ) { t_Proxy->AddRef () ; t_Result = t_Proxy->EnumInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_VoidPointerController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Proxy , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { a_Proxy = t_Proxy ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } UnLock () ; } else { t_Proxy->Release () ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: Reset () { try { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; HRESULT t_Result = Begin_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IEnumWbemClassObject * ) t_Interface )->Internal_Reset ( t_InternalContext ) ; } else { t_Result = ( ( IEnumWbemClassObject * ) t_Interface )->Reset () ; } End_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } return t_Result ; } catch ( ... ) { return WBEM_E_CRITICAL_ERROR ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: Next ( long a_Timeout , ULONG a_Count , IWbemClassObject **a_Objects , ULONG *a_Returned ) { try { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; HRESULT t_Result = Begin_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IEnumWbemClassObject * ) t_Interface )->Internal_Next ( t_InternalContext , a_Timeout , a_Count , a_Objects , a_Returned ) ; } else { t_Result = ( ( IEnumWbemClassObject * ) t_Interface )->Next ( a_Timeout , a_Count , a_Objects , a_Returned ) ; } End_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } return t_Result ; } catch ( ... ) { return WBEM_E_CRITICAL_ERROR ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: NextAsync ( ULONG a_Count, IWbemObjectSink *a_Sink ) { try { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; HRESULT t_Result = Begin_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IEnumWbemClassObject * ) t_Interface )->Internal_NextAsync ( t_InternalContext , a_Count, a_Sink ) ; } else { t_Result = ( ( IEnumWbemClassObject * ) t_Interface )->NextAsync ( a_Count, a_Sink ) ; } End_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } return t_Result ; } catch ( ... ) { return WBEM_E_CRITICAL_ERROR ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: Clone ( IEnumWbemClassObject **a_Enum ) { try { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; HRESULT t_Result = Begin_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IEnumWbemClassObject * ) t_Interface )->Internal_Clone ( t_InternalContext , a_Enum ) ; } else { t_Result = ( ( IEnumWbemClassObject * ) t_Interface )->Clone ( a_Enum ) ; } End_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } return t_Result ; } catch ( ... ) { return WBEM_E_CRITICAL_ERROR ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IEnumWbemClassObject_Proxy :: Skip ( long a_Timeout, ULONG a_Count ) { try { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; HRESULT t_Result = Begin_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IEnumWbemClassObject * ) t_Interface )->Internal_Skip ( t_InternalContext , a_Timeout, a_Count ) ; } else { t_Result = ( ( IEnumWbemClassObject * ) t_Interface )->Skip ( a_Timeout, a_Count ) ; } End_IEnumWbemClassObject ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } return t_Result ; } catch ( ... ) { return WBEM_E_CRITICAL_ERROR ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CInterceptor_IWbemServices_Stub :: CInterceptor_IWbemServices_Stub ( CWbemGlobal_VoidPointerController *a_Controller , WmiAllocator &a_Allocator , IWbemServices *a_Service ) : CWbemGlobal_IWmiObjectSinkController ( a_Allocator ) , VoidPointerContainerElement ( a_Controller , this ) , m_Core_IWbemServices ( a_Service ) , m_Core_IWbemRefreshingServices ( NULL ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_Allocator ( a_Allocator ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Stub_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; HRESULT t_Result = m_Core_IWbemServices->QueryInterface ( IID_IWbemRefreshingServices , ( void ** ) & m_Core_IWbemRefreshingServices ) ; m_Core_IWbemServices->AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IWbemServices_Stub :: ~CInterceptor_IWbemServices_Stub () { CWbemGlobal_VoidPointerController :: UnInitialize () ; if ( m_Core_IWbemServices ) { m_Core_IWbemServices->Release () ; } if ( m_Core_IWbemRefreshingServices ) { m_Core_IWbemRefreshingServices->Release () ; } InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Stub_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemServices_Stub :: AddRef ( void ) { return VoidPointerContainerElement :: AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemServices_Stub :: Release ( void ) { return VoidPointerContainerElement :: Release () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CInterceptor_IWbemServices_Stub :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemServices ) { *iplpv = ( LPVOID ) ( IWbemServices * ) this ; } else if ( iid == IID_IWbemRefreshingServices ) { *iplpv = ( LPVOID ) ( IWbemRefreshingServices * ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * ) this ; } else if ( iid == IID_Internal_IWbemServices ) { *iplpv = ( LPVOID ) ( Internal_IWbemServices * ) this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: Enqueue_IWbemServices ( IWbemServices *a_Service , IWbemServices *&a_Stub ) { HRESULT t_Result = S_OK ; CInterceptor_IWbemServices_Stub *t_Stub = new CInterceptor_IWbemServices_Stub ( this , m_Allocator , a_Service ) ; if ( t_Stub ) { t_Stub->AddRef () ; t_Result = t_Stub->ServiceInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_VoidPointerController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Stub , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { a_Stub = t_Stub ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } UnLock () ; } else { t_Stub->Release () ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: Enqueue_IEnumWbemClassObject ( IEnumWbemClassObject *a_Enum , IEnumWbemClassObject *&a_Stub ) { HRESULT t_Result = S_OK ; CInterceptor_IEnumWbemClassObject_Stub *t_Stub = new CInterceptor_IEnumWbemClassObject_Stub ( this , m_Allocator , a_Enum ) ; if ( t_Stub ) { t_Stub->AddRef () ; t_Result = t_Stub->EnumInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_VoidPointerController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Stub , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { a_Stub = t_Stub ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } UnLock () ; } else { t_Stub->Release () ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub::OpenNamespace ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemServices **a_NamespaceService , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->OpenNamespace ( a_ObjectPath, a_Flags, a_Context , a_NamespaceService, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: CancelAsyncCall ( IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->CancelAsyncCall ( a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: QueryObjectSink ( long a_Flags , IWbemObjectSink **a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->QueryObjectSink ( a_Flags, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: GetObject ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemClassObject **a_Object , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->GetObject ( a_ObjectPath, a_Flags, a_Context , a_Object, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: GetObjectAsync ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->GetObjectAsync ( a_ObjectPath, a_Flags, a_Context , a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: PutClass ( IWbemClassObject *a_Object , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->PutClass ( a_Object, a_Flags, a_Context, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: PutClassAsync ( IWbemClassObject *a_Object , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->PutClassAsync ( a_Object, a_Flags, a_Context , a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: DeleteClass ( const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->DeleteClass ( a_Class, a_Flags, a_Context, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: DeleteClassAsync ( const BSTR a_Class , long a_Flags, IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->DeleteClassAsync ( a_Class , a_Flags , a_Context , a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: CreateClassEnum ( const BSTR a_Superclass , long a_Flags, IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { IEnumWbemClassObject *t_Enum = NULL ; t_Result = m_Core_IWbemServices->CreateClassEnum ( a_Superclass, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: CreateClassEnumAsync ( const BSTR a_Superclass , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->CreateClassEnumAsync ( a_Superclass, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: PutInstance ( IWbemClassObject *a_Instance, long a_Flags, IWbemContext *a_Context, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->PutInstance ( a_Instance, a_Flags, a_Context, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: PutInstanceAsync ( IWbemClassObject *a_Instance, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->PutInstanceAsync ( a_Instance, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: DeleteInstance ( const BSTR a_ObjectPath, long a_Flags, IWbemContext *a_Context, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->DeleteInstance ( a_ObjectPath, a_Flags, a_Context, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: DeleteInstanceAsync ( const BSTR a_ObjectPath, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->DeleteInstanceAsync ( a_ObjectPath, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: CreateInstanceEnum ( const BSTR a_Class, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { IEnumWbemClassObject *t_Enum = NULL ; t_Result = m_Core_IWbemServices->CreateInstanceEnum ( a_Class, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: CreateInstanceEnumAsync ( const BSTR a_Class, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->CreateInstanceEnumAsync ( a_Class, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: ExecQuery ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { IEnumWbemClassObject *t_Enum = NULL ; t_Result = m_Core_IWbemServices->ExecQuery ( a_QueryLanguage, a_Query, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: ExecQueryAsync ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecQueryAsync ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: ExecNotificationQuery ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecNotificationQuery ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Enum ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: ExecNotificationQueryAsync ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecNotificationQueryAsync ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: ExecMethod ( const BSTR a_ObjectPath, const BSTR a_MethodName, long a_Flags, IWbemContext *a_Context, IWbemClassObject *a_InParams, IWbemClassObject **a_OutParams, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecMethod ( a_ObjectPath, a_MethodName, a_Flags, a_Context, a_InParams, a_OutParams, a_CallResult ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: ExecMethodAsync ( const BSTR a_ObjectPath, const BSTR a_MethodName, long a_Flags, IWbemContext *a_Context, IWbemClassObject *a_InParams, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_Core_IWbemServices->ExecMethodAsync ( a_ObjectPath, a_MethodName, a_Flags, a_Context, a_InParams, a_Sink ) ; } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: ServiceInitialize () { HRESULT t_Result = S_OK ; if ( SUCCEEDED ( t_Result ) ) { WmiStatusCode t_StatusCode = CWbemGlobal_VoidPointerController :: Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_GateClosed ) ; bool t_Acquired = false ; while ( ! t_Acquired ) { if ( m_InProgress == 0 ) { t_Acquired = true ; break ; } if ( SwitchToThread () == FALSE ) { } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: AddObjectToRefresher ( WBEM_REFRESHER_ID *a_RefresherId , LPCWSTR a_Path, long a_Flags , IWbemContext *a_Context, DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->AddObjectToRefresher ( a_RefresherId , a_Path, a_Flags , a_Context, a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: AddObjectToRefresherByTemplate ( WBEM_REFRESHER_ID *a_RefresherId , IWbemClassObject *a_Template , long a_Flags , IWbemContext *a_Context , DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->AddObjectToRefresherByTemplate ( a_RefresherId , a_Template , a_Flags , a_Context , a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: AddEnumToRefresher ( WBEM_REFRESHER_ID *a_RefresherId , LPCWSTR a_Class , long a_Flags , IWbemContext *a_Context, DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->AddEnumToRefresher ( a_RefresherId , a_Class , a_Flags , a_Context, a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: RemoveObjectFromRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Id , long a_Flags , DWORD a_ClientRefresherVersion , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->RemoveObjectFromRefresher ( a_RefresherId , a_Id , a_Flags , a_ClientRefresherVersion , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: GetRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Flags , DWORD a_ClientRefresherVersion , IWbemRemoteRefresher **a_RemoteRefresher , GUID *a_Guid , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->GetRemoteRefresher ( a_RefresherId , a_Flags , a_ClientRefresherVersion , a_RemoteRefresher , a_Guid , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: ReconnectRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId, long a_Flags, long a_NumberOfObjects, DWORD a_ClientRefresherVersion , WBEM_RECONNECT_INFO *a_ReconnectInformation , WBEM_RECONNECT_RESULTS *a_ReconnectResults , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { t_Result = m_Core_IWbemRefreshingServices->ReconnectRemoteRefresher ( a_RefresherId, a_Flags, a_NumberOfObjects, a_ClientRefresherVersion , a_ReconnectInformation , a_ReconnectResults , a_ServerRefresherVersion ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( 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 ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: Internal_CancelAsyncCall ( WmiInternalContext a_InternalContext , IWbemObjectSink *a_Sink ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ; HRESULT t_Result = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CancelAsyncCall ( a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = QueryObjectSink ( a_Flags , a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( 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 ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = GetObjectAsync ( a_ObjectPath , a_Flags , a_Context , a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutClass ( a_Object , a_Flags , a_Context , a_CallResult ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutClassAsync ( a_Object , a_Flags , a_Context , a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = DeleteClass ( a_Class , a_Flags , a_Context , a_CallResult ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = DeleteClassAsync ( a_Class , a_Flags , a_Context , a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CreateClassEnum ( a_SuperClass , a_Flags, a_Context , a_Enum ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CreateClassEnumAsync ( a_SuperClass , a_Flags, a_Context , a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutInstance ( a_Instance , a_Flags , a_Context , a_CallResult ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = PutInstanceAsync ( a_Instance , a_Flags , a_Context , a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = DeleteInstance ( a_ObjectPath , a_Flags , a_Context , a_CallResult ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = DeleteInstanceAsync ( a_ObjectPath , a_Flags , a_Context , a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CreateInstanceEnum ( a_Class , a_Flags , a_Context , a_Enum ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( a_InternalContext , t_Impersonating , t_OldContext , t_OldSecurity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CreateInstanceEnumAsync ( a_Class , a_Flags , a_Context , a_Sink ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( 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 ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( 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 ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( 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 ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( 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 ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( 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 ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Stub :: 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 = ProviderSubSystem_Globals :: Begin_IdentifyCall_SvcHost ( 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 ) ; ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ #pragma warning( disable : 4355 ) CInterceptor_IWbemServices_Proxy :: CInterceptor_IWbemServices_Proxy ( CWbemGlobal_VoidPointerController *a_Controller , WmiAllocator &a_Allocator , IWbemServices *a_Service , CServerObject_ProviderRegistrationV1 &a_Registration ) : CWbemGlobal_IWmiObjectSinkController ( a_Allocator ) , VoidPointerContainerElement ( a_Controller , this ) , m_Core_IWbemServices ( a_Service ) , m_Core_IWbemRefreshingServices ( NULL ) , m_Core_Internal_IWbemServices ( NULL ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_Allocator ( a_Allocator ) , m_Registration ( a_Registration ) , m_ProxyContainer ( a_Allocator , ProxyIndex_Proxy_Size , MAX_PROXIES ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Proxy_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; HRESULT t_Result = m_Core_IWbemServices->QueryInterface ( IID_IWbemRefreshingServices , ( void ** ) & m_Core_IWbemRefreshingServices ) ; t_Result = m_Core_IWbemServices->QueryInterface ( IID_Internal_IWbemServices , ( void ** ) & m_Core_Internal_IWbemServices ) ; m_Core_IWbemServices->AddRef () ; m_Registration.AddRef () ; } #pragma warning( default : 4355 ) /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CInterceptor_IWbemServices_Proxy :: ~CInterceptor_IWbemServices_Proxy () { CWbemGlobal_VoidPointerController :: UnInitialize () ; m_Registration.Release () ; WmiStatusCode t_StatusCode = m_ProxyContainer.UnInitialize () ; if ( m_Core_IWbemServices ) { m_Core_IWbemServices->Release () ; } if ( m_Core_Internal_IWbemServices ) { m_Core_Internal_IWbemServices->Release () ; } if ( m_Core_IWbemRefreshingServices ) { m_Core_IWbemRefreshingServices->Release () ; } InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemServices_Proxy_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemServices_Proxy :: AddRef ( void ) { return VoidPointerContainerElement :: AddRef () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CInterceptor_IWbemServices_Proxy :: Release ( void ) { return VoidPointerContainerElement :: Release () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CInterceptor_IWbemServices_Proxy :: QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemServices ) { *iplpv = ( LPVOID ) ( IWbemServices * ) this ; } else if ( iid == IID_IWbemRefreshingServices ) { *iplpv = ( LPVOID ) ( IWbemRefreshingServices * ) 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_IWbemServices_Proxy :: Begin_IWbemServices ( DWORD a_ProcessIdentifier , HANDLE &a_IdentifyToken , BOOL &a_Impersonating , IUnknown *&a_OldContext , IServerSecurity *&a_OldSecurity , BOOL &a_IsProxy , IUnknown *&a_Interface , BOOL &a_Revert , IUnknown *&a_Proxy ) { HRESULT t_Result = S_OK ; a_IdentifyToken = NULL ; a_Revert = FALSE ; a_Proxy = NULL ; a_Impersonating = FALSE ; a_OldContext = NULL ; a_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginCallbackImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { if ( a_ProcessIdentifier ) { t_Result = CoImpersonateClient () ; if ( SUCCEEDED ( t_Result ) ) { DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ; CoRevertToSelf () ; if ( t_ImpersonationLevel == RPC_C_IMP_LEVEL_IMPERSONATE || t_ImpersonationLevel == RPC_C_IMP_LEVEL_DELEGATE ) { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemServices , IID_IWbemServices , m_Core_IWbemServices , a_Proxy , a_Revert ) ; } else { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState_PrvHost ( m_ProxyContainer , ProxyIndex_Proxy_Internal_IWbemServices , IID_Internal_IWbemServices , m_Core_Internal_IWbemServices , a_Proxy , a_Revert , a_ProcessIdentifier , a_IdentifyToken ) ; } } } else { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemServices , IID_IWbemServices , m_Core_IWbemServices , a_Proxy , a_Revert ) ; } if ( t_Result == WBEM_E_NOT_FOUND ) { a_Interface = m_Core_IWbemServices ; a_IsProxy = FALSE ; t_Result = S_OK ; } else { if ( SUCCEEDED ( t_Result ) ) { a_IsProxy = TRUE ; a_Interface = ( IUnknown * ) 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 ( FAILED ( t_Result ) ) { if ( a_IdentifyToken ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState_PrvHost ( m_ProxyContainer , ProxyIndex_Proxy_Internal_IWbemServices , a_Proxy , a_Revert , a_ProcessIdentifier , a_IdentifyToken ) ; } else { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemServices , a_Proxy , a_Revert ) ; } } } } if ( FAILED ( t_Result ) ) { ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: End_IWbemServices ( DWORD a_ProcessIdentifier , HANDLE a_IdentifyToken , BOOL a_Impersonating , IUnknown *a_OldContext , IServerSecurity *a_OldSecurity , BOOL a_IsProxy , IUnknown *a_Interface , BOOL a_Revert , IUnknown *a_Proxy ) { CoRevertToSelf () ; if ( a_Proxy ) { if ( a_IdentifyToken ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState_PrvHost ( m_ProxyContainer , ProxyIndex_Proxy_Internal_IWbemServices , a_Proxy , a_Revert , a_ProcessIdentifier , a_IdentifyToken ) ; } else { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemServices , a_Proxy , a_Revert ) ; } } ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: Begin_IWbemRefreshingServices ( BOOL &a_Impersonating , IUnknown *&a_OldContext , IServerSecurity *&a_OldSecurity , BOOL &a_IsProxy , IWbemRefreshingServices *&a_Interface , BOOL &a_Revert , IUnknown *&a_Proxy , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; a_Revert = FALSE ; a_Proxy = NULL ; a_Impersonating = FALSE ; a_OldContext = NULL ; a_OldSecurity = NULL ; t_Result = ProviderSubSystem_Common_Globals :: BeginCallbackImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemRefreshingServices , IID_IWbemRefreshingServices , m_Core_IWbemRefreshingServices , a_Proxy , a_Revert ) ; if ( t_Result == WBEM_E_NOT_FOUND ) { a_Interface = m_Core_IWbemRefreshingServices ; a_IsProxy = FALSE ; t_Result = S_OK ; } else { if ( SUCCEEDED ( t_Result ) ) { a_IsProxy = TRUE ; a_Interface = ( IWbemRefreshingServices * ) 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 ( FAILED ( t_Result ) ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemRefreshingServices , a_Proxy , a_Revert ) ; } } } if ( FAILED ( t_Result ) ) { ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: End_IWbemRefreshingServices ( BOOL a_Impersonating , IUnknown *a_OldContext , IServerSecurity *a_OldSecurity , BOOL a_IsProxy , IWbemRefreshingServices *a_Interface , BOOL a_Revert , IUnknown *a_Proxy ) { CoRevertToSelf () ; if ( a_Proxy ) { HRESULT t_TempResult = ProviderSubSystem_Common_Globals :: RevertProxyState ( m_ProxyContainer , ProxyIndex_Proxy_IWbemRefreshingServices , a_Proxy , a_Revert ) ; } ProviderSubSystem_Common_Globals :: EndImpersonation ( a_OldContext , a_OldSecurity , a_Impersonating ) ; return S_OK ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: Enqueue_IWbemServices ( IWbemServices *a_Service , IWbemServices *&a_Proxy ) { HRESULT t_Result = S_OK ; CInterceptor_IWbemServices_Proxy *t_Proxy = new CInterceptor_IWbemServices_Proxy ( this , m_Allocator , a_Service , m_Registration ) ; if ( t_Proxy ) { t_Proxy->AddRef () ; t_Result = t_Proxy->ServiceInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_VoidPointerController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Proxy , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { a_Proxy = t_Proxy ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } UnLock () ; } else { t_Proxy->Release () ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: Enqueue_IEnumWbemClassObject ( IEnumWbemClassObject *a_Enum , IEnumWbemClassObject *&a_Proxy ) { HRESULT t_Result = S_OK ; CInterceptor_IEnumWbemClassObject_Proxy *t_Proxy = new CInterceptor_IEnumWbemClassObject_Proxy ( this , m_Allocator , a_Enum ) ; if ( t_Proxy ) { t_Proxy->AddRef () ; t_Result = t_Proxy->EnumInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_VoidPointerController_Container_Iterator t_Iterator ; Lock () ; WmiStatusCode t_StatusCode = Insert ( *t_Proxy , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { a_Proxy = t_Proxy ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } UnLock () ; } else { t_Proxy->Release () ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy::OpenNamespace ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemServices **a_NamespaceService , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; try { *a_NamespaceService = NULL ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } if ( SUCCEEDED ( t_Result ) ) { InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_ObjectPath = SysAllocString ( a_ObjectPath ) ; if ( t_ObjectPath ) { IWbemServices *t_Service = NULL ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_OpenNamespace ( t_InternalContext , t_ObjectPath, a_Flags, a_Context , & t_Service , a_CallResult ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Enqueue_IWbemServices ( t_Service , *a_NamespaceService ) ; } SysFreeString ( t_ObjectPath ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { IWbemServices *t_Service = NULL ; t_Result = ( ( IWbemServices * ) t_Interface )->OpenNamespace ( a_ObjectPath, a_Flags, a_Context , & t_Service , a_CallResult ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = Enqueue_IWbemServices ( t_Service , *a_NamespaceService ) ; } } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: CancelAsyncCall ( IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_CancelAsyncCall ( t_InternalContext , a_Sink ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->CancelAsyncCall ( a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: QueryObjectSink ( long a_Flags , IWbemObjectSink **a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_QueryObjectSink ( t_InternalContext , a_Flags , a_Sink ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->QueryObjectSink ( a_Flags , a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: GetObject ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemClassObject **a_Object , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_ObjectPath = SysAllocString ( a_ObjectPath ) ; if ( t_ObjectPath ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_GetObject ( t_InternalContext , t_ObjectPath, a_Flags, a_Context , a_Object, a_CallResult ) ; SysFreeString ( t_ObjectPath ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = ( ( IWbemServices * ) t_Interface )->GetObject ( a_ObjectPath, a_Flags, a_Context , a_Object, a_CallResult ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: GetObjectAsync ( const BSTR a_ObjectPath , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_ObjectPath = SysAllocString ( a_ObjectPath ) ; if ( t_ObjectPath ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_GetObjectAsync ( t_InternalContext , t_ObjectPath, a_Flags, a_Context , a_Sink ) ; SysFreeString ( t_ObjectPath ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = ( ( IWbemServices * ) t_Interface )->GetObjectAsync ( a_ObjectPath, a_Flags, a_Context , a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: PutClass ( IWbemClassObject *a_Object , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_PutClass ( t_InternalContext , a_Object, a_Flags, a_Context, a_CallResult ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->PutClass ( a_Object, a_Flags, a_Context, a_CallResult ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: PutClassAsync ( IWbemClassObject *a_Object , long a_Flags , IWbemContext FAR *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_PutClassAsync ( t_InternalContext , a_Object, a_Flags, a_Context , a_Sink ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->PutClassAsync ( a_Object, a_Flags, a_Context , a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: DeleteClass ( const BSTR a_Class , long a_Flags , IWbemContext *a_Context , IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_Class = SysAllocString ( a_Class ) ; if ( t_Class ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_DeleteClass ( t_InternalContext , t_Class, a_Flags, a_Context, a_CallResult ) ; SysFreeString ( t_Class ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = ( ( IWbemServices * ) t_Interface )->DeleteClass ( a_Class, a_Flags, a_Context, a_CallResult ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: DeleteClassAsync ( const BSTR a_Class , long a_Flags, IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_Class = SysAllocString ( a_Class ) ; if ( t_Class ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_DeleteClassAsync ( t_InternalContext , t_Class , a_Flags , a_Context , a_Sink ) ; SysFreeString ( t_Class ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = ( ( IWbemServices * ) t_Interface )->DeleteClassAsync ( a_Class , a_Flags , a_Context , a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: CreateClassEnum ( const BSTR a_SuperClass , long a_Flags, IWbemContext *a_Context , IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; try { *a_Enum = NULL ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } if ( SUCCEEDED ( t_Result ) ) { InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_SuperClass = SysAllocString ( a_SuperClass ) ; if ( t_SuperClass ) { IEnumWbemClassObject *t_Enum = NULL ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_CreateClassEnum ( t_InternalContext , t_SuperClass, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } SysFreeString ( t_SuperClass ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { IEnumWbemClassObject *t_Enum = NULL ; t_Result = ( ( IWbemServices * ) t_Interface )->CreateClassEnum ( a_SuperClass, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ SCODE CInterceptor_IWbemServices_Proxy :: CreateClassEnumAsync ( const BSTR a_SuperClass , long a_Flags , IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_SuperClass = SysAllocString ( a_SuperClass ) ; if ( t_SuperClass ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_CreateClassEnumAsync ( t_InternalContext , t_SuperClass, a_Flags, a_Context, a_Sink ) ; SysFreeString ( t_SuperClass ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = ( ( IWbemServices * ) t_Interface )->CreateClassEnumAsync ( a_SuperClass, a_Flags, a_Context, a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: PutInstance ( IWbemClassObject *a_Instance, long a_Flags, IWbemContext *a_Context, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_PutInstance ( t_InternalContext , a_Instance, a_Flags, a_Context, a_CallResult ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->PutInstance ( a_Instance, a_Flags, a_Context, a_CallResult ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: PutInstanceAsync ( IWbemClassObject *a_Instance, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_PutInstanceAsync ( t_InternalContext , a_Instance, a_Flags, a_Context, a_Sink ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->PutInstanceAsync ( a_Instance, a_Flags, a_Context, a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: DeleteInstance ( const BSTR a_ObjectPath, long a_Flags, IWbemContext *a_Context, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_ObjectPath = SysAllocString ( a_ObjectPath ) ; if ( t_ObjectPath ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_DeleteInstance ( t_InternalContext , t_ObjectPath, a_Flags, a_Context, a_CallResult ) ; SysFreeString ( t_ObjectPath ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = ( ( IWbemServices * ) t_Interface )->DeleteInstance ( a_ObjectPath, a_Flags, a_Context, a_CallResult ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: DeleteInstanceAsync ( const BSTR a_ObjectPath, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_ObjectPath = SysAllocString ( a_ObjectPath ) ; if ( t_ObjectPath ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_DeleteInstanceAsync ( t_InternalContext , t_ObjectPath, a_Flags, a_Context, a_Sink ) ; SysFreeString ( t_ObjectPath ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = ( ( IWbemServices * ) t_Interface )->DeleteInstanceAsync ( a_ObjectPath, a_Flags, a_Context, a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: CreateInstanceEnum ( const BSTR a_Class, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; try { *a_Enum = NULL ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } if ( SUCCEEDED ( t_Result ) ) { InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_Class = SysAllocString ( a_Class ) ; if ( t_Class ) { IEnumWbemClassObject *t_Enum = NULL ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_CreateInstanceEnum ( t_InternalContext , t_Class, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } SysFreeString ( t_Class ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { IEnumWbemClassObject *t_Enum = NULL ; t_Result = ( ( IWbemServices * ) t_Interface )->CreateInstanceEnum ( a_Class, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: CreateInstanceEnumAsync ( const BSTR a_Class, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_Class = SysAllocString ( a_Class ) ; if ( t_Class ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_CreateInstanceEnumAsync ( t_InternalContext , t_Class, a_Flags, a_Context, a_Sink ) ; SysFreeString ( t_Class ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = ( ( IWbemServices * ) t_Interface )->CreateInstanceEnumAsync ( a_Class, a_Flags, a_Context, a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: ExecQuery ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; try { *a_Enum = NULL ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } if ( SUCCEEDED ( t_Result ) ) { InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_QueryLanguage = SysAllocString ( a_QueryLanguage ) ; BSTR t_Query = SysAllocString ( a_Query ) ; if ( t_QueryLanguage && t_Query ) { IEnumWbemClassObject *t_Enum = NULL ; t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_ExecQuery ( t_InternalContext , t_QueryLanguage, t_Query, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } SysFreeString ( t_QueryLanguage ) ; SysFreeString ( t_Query ) ; } else { IEnumWbemClassObject *t_Enum = NULL ; t_Result = ( ( IWbemServices * ) t_Interface )->ExecQuery ( a_QueryLanguage, a_Query, a_Flags, a_Context, & t_Enum ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = Enqueue_IEnumWbemClassObject ( t_Enum , *a_Enum ) ; if ( FAILED ( t_TempResult ) ) { t_Result = t_TempResult ; } t_Enum->Release () ; } } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: ExecQueryAsync ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_QueryLanguage = SysAllocString ( a_QueryLanguage ) ; BSTR t_Query = SysAllocString ( a_Query ) ; if ( t_QueryLanguage && t_Query ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_ExecQueryAsync ( t_InternalContext , t_QueryLanguage, t_Query, a_Flags, a_Context, a_Sink ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } SysFreeString ( t_QueryLanguage ) ; SysFreeString ( t_Query ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->ExecQueryAsync ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: ExecNotificationQuery ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IEnumWbemClassObject **a_Enum ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_QueryLanguage = SysAllocString ( a_QueryLanguage ) ; BSTR t_Query = SysAllocString ( a_Query ) ; if ( t_QueryLanguage && t_Query ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_ExecNotificationQuery ( t_InternalContext , t_QueryLanguage, t_Query, a_Flags, a_Context, a_Enum ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } SysFreeString ( t_QueryLanguage ) ; SysFreeString ( t_Query ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->ExecNotificationQuery ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Enum ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: ExecNotificationQueryAsync ( const BSTR a_QueryLanguage, const BSTR a_Query, long a_Flags, IWbemContext *a_Context, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_QueryLanguage = SysAllocString ( a_QueryLanguage ) ; BSTR t_Query = SysAllocString ( a_Query ) ; if ( t_QueryLanguage && t_Query ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_ExecNotificationQueryAsync ( t_InternalContext , a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } SysFreeString ( t_QueryLanguage ) ; SysFreeString ( t_Query ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->ExecNotificationQueryAsync ( a_QueryLanguage, a_Query, a_Flags, a_Context, a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT STDMETHODCALLTYPE CInterceptor_IWbemServices_Proxy :: ExecMethod ( const BSTR a_ObjectPath, const BSTR a_MethodName, long a_Flags, IWbemContext *a_Context, IWbemClassObject *a_InParams, IWbemClassObject **a_OutParams, IWbemCallResult **a_CallResult ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_ObjectPath = SysAllocString ( a_ObjectPath ) ; BSTR t_MethodName = SysAllocString ( a_MethodName ) ; if ( t_ObjectPath && t_MethodName ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_ExecMethod ( t_InternalContext , t_ObjectPath, t_MethodName, a_Flags, a_Context, a_InParams, a_OutParams, a_CallResult ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } SysFreeString ( t_ObjectPath ) ; SysFreeString ( t_MethodName ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->ExecMethod ( a_ObjectPath, a_MethodName, a_Flags, a_Context, a_InParams, a_OutParams, a_CallResult ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT STDMETHODCALLTYPE CInterceptor_IWbemServices_Proxy :: ExecMethodAsync ( const BSTR a_ObjectPath, const BSTR a_MethodName, long a_Flags, IWbemContext *a_Context, IWbemClassObject *a_InParams, IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IUnknown *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; DWORD t_ProcessIdentifier = GetCurrentProcessId () ; HANDLE t_IdentifyToken = NULL ; t_Result = Begin_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_IdentifyToken ) { WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyToken ; t_InternalContext.m_ProcessIdentifier = t_ProcessIdentifier ; BSTR t_ObjectPath = SysAllocString ( a_ObjectPath ) ; BSTR t_MethodName = SysAllocString ( a_MethodName ) ; if ( t_ObjectPath && t_MethodName ) { t_Result = ( ( Internal_IWbemServices * ) t_Interface )->Internal_ExecMethodAsync ( t_InternalContext , t_ObjectPath, t_MethodName, a_Flags, a_Context, a_InParams, a_Sink ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } SysFreeString ( t_ObjectPath ) ; SysFreeString ( t_MethodName ) ; } else { t_Result = ( ( IWbemServices * ) t_Interface )->ExecMethodAsync ( a_ObjectPath, a_MethodName, a_Flags, a_Context, a_InParams, a_Sink ) ; } End_IWbemServices ( t_ProcessIdentifier , t_IdentifyToken , t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: ServiceInitialize () { HRESULT t_Result = S_OK ; WmiStatusCode t_StatusCode = m_ProxyContainer.Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { } if ( SUCCEEDED ( t_Result ) ) { t_StatusCode = CWbemGlobal_VoidPointerController :: Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_GateClosed ) ; bool t_Acquired = false ; while ( ! t_Acquired ) { if ( m_InProgress == 0 ) { t_Acquired = true ; break ; } if ( SwitchToThread () == FALSE ) { } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: AddObjectToRefresher ( WBEM_REFRESHER_ID *a_RefresherId , LPCWSTR a_Path, long a_Flags , IWbemContext *a_Context, DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->AddObjectToRefresher ( a_RefresherId , a_Path, a_Flags , a_Context, a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: AddObjectToRefresherByTemplate ( WBEM_REFRESHER_ID *a_RefresherId , IWbemClassObject *a_Template , long a_Flags , IWbemContext *a_Context , DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->AddObjectToRefresherByTemplate ( a_RefresherId , a_Template , a_Flags , a_Context , a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: AddEnumToRefresher ( WBEM_REFRESHER_ID *a_RefresherId , LPCWSTR a_Class , long a_Flags , IWbemContext *a_Context, DWORD a_ClientRefresherVersion , WBEM_REFRESH_INFO *a_Information , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->AddEnumToRefresher ( a_RefresherId , a_Class , a_Flags , a_Context, a_ClientRefresherVersion , a_Information , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: RemoveObjectFromRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Id , long a_Flags , DWORD a_ClientRefresherVersion , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->RemoveObjectFromRefresher ( a_RefresherId , a_Id , a_Flags , a_ClientRefresherVersion , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: GetRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId , long a_Flags , DWORD a_ClientRefresherVersion , IWbemRemoteRefresher **a_RemoteRefresher , GUID *a_Guid , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->GetRemoteRefresher ( a_RefresherId , a_Flags , a_ClientRefresherVersion , a_RemoteRefresher , a_Guid , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CInterceptor_IWbemServices_Proxy :: ReconnectRemoteRefresher ( WBEM_REFRESHER_ID *a_RefresherId, long a_Flags, long a_NumberOfObjects, DWORD a_ClientRefresherVersion , WBEM_RECONNECT_INFO *a_ReconnectInformation , WBEM_RECONNECT_RESULTS *a_ReconnectResults , DWORD *a_ServerRefresherVersion ) { HRESULT t_Result = S_OK ; InterlockedIncrement ( & m_InProgress ) ; if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( m_Core_IWbemRefreshingServices ) { BOOL t_Impersonating ; IUnknown *t_OldContext ; IServerSecurity *t_OldSecurity ; BOOL t_IsProxy ; IWbemRefreshingServices *t_Interface ; BOOL t_Revert ; IUnknown *t_Proxy ; t_Result = Begin_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interface->ReconnectRemoteRefresher ( a_RefresherId, a_Flags, a_NumberOfObjects, a_ClientRefresherVersion , a_ReconnectInformation , a_ReconnectResults , a_ServerRefresherVersion ) ; End_IWbemRefreshingServices ( t_Impersonating , t_OldContext , t_OldSecurity , t_IsProxy , t_Interface , t_Revert , t_Proxy ) ; } } else { t_Result = WBEM_E_NOT_AVAILABLE ; } } InterlockedDecrement ( & m_InProgress ) ; return t_Result ; } #endif