|
|
/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
ProvResv.cpp
Abstract:
History:
--*/
#include "PreComp.h"
#include <wbemint.h>
#include <stdio.h>
#include <NCObjApi.h>
#include "Globals.h"
#include "CGlobals.h"
#include "ProvWsv.h"
#include "ProvObSk.h"
#include "Guids.h"
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemObjectSink :: CInterceptor_IWbemObjectSink (
IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller
) : ObjectSinkContainerElement (
a_Controller , a_InterceptedSink ) , m_InterceptedSink ( a_InterceptedSink ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_Unknown ( a_Unknown ) , m_StatusCalled ( FALSE ) , m_SecurityDescriptor ( NULL ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ;
if ( m_Unknown ) { m_Unknown->AddRef () ; }
if ( m_InterceptedSink ) { m_InterceptedSink->AddRef () ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemObjectSink :: ~CInterceptor_IWbemObjectSink () { InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
void CInterceptor_IWbemObjectSink :: CallBackInternalRelease () { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 0 , 0 ) ) { m_InterceptedSink->SetStatus (
0 , WBEM_E_UNEXPECTED , NULL , NULL ) ; }
if ( m_InterceptedSink ) { m_InterceptedSink->Release () ; }
if ( m_Unknown ) { m_Unknown->Release () ; }
if ( m_SecurityDescriptor ) { delete [] m_SecurityDescriptor ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP CInterceptor_IWbemObjectSink :: QueryInterface (
REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ;
if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemObjectSink ) { *iplpv = ( LPVOID ) ( IWbemObjectSink * ) this ; } #ifdef INTERNAL_IDENTIFY
else if ( iid == IID_Internal_IWbemObjectSink ) { *iplpv = ( LPVOID ) ( Internal_IWbemObjectSink * ) this ; } #endif
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_IWbemObjectSink :: AddRef ( void ) { // printf ( "\nCInterceptor_IWbemObjectSink :: AddRef ()" ) ;
return ObjectSinkContainerElement :: AddRef () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_(ULONG) CInterceptor_IWbemObjectSink :: Release ( void ) { return ObjectSinkContainerElement :: Release () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemObjectSink :: Initialize ( SECURITY_DESCRIPTOR *a_SecurityDescriptor ) { return ProviderSubSystem_Common_Globals :: SinkAccessInitialize ( a_SecurityDescriptor , m_SecurityDescriptor ) ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemObjectSink :: Indicate (
long a_ObjectCount , IWbemClassObject **a_ObjectArray ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( SUCCEEDED ( t_Result = ProviderSubSystem_Common_Globals :: CheckAccess ( m_SecurityDescriptor , MASK_PROVIDER_BINDING_BIND , & g_ProviderBindingMapping ) ) ) { t_Result = m_InterceptedSink->Indicate (
a_ObjectCount , a_ObjectArray ) ; } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemObjectSink :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( SUCCEEDED ( t_Result = ProviderSubSystem_Common_Globals :: CheckAccess ( m_SecurityDescriptor , MASK_PROVIDER_BINDING_BIND , & g_ProviderBindingMapping ) ) ) { switch ( a_Flags ) { case WBEM_STATUS_PROGRESS: { t_Result = m_InterceptedSink->SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } break ;
case WBEM_STATUS_COMPLETE: { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } } break ;
default: { t_Result = WBEM_E_INVALID_PARAMETER ; } break ; } } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
#ifdef INTERNAL_IDENTIFY
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemObjectSink :: Internal_Indicate (
WmiInternalContext a_InternalContext , long a_ObjectCount , IWbemClassObject **a_ObjectArray ) { 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 = Indicate (
a_ObjectCount , a_ObjectArray ) ;
ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemObjectSink :: Internal_SetStatus (
WmiInternalContext a_InternalContext , long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { 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 = SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
ProviderSubSystem_Globals :: End_IdentifyCall_SvcHost ( a_InternalContext , t_OldContext , t_OldSecurity , t_Impersonating ) ; }
return t_Result ; }
#endif
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemObjectSink :: Shutdown (
LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_GateClosed ) ;
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
0 , WBEM_E_SHUTTING_DOWN , NULL , NULL ) ; }
bool t_Acquired = false ; while ( ! t_Acquired ) { if ( m_InProgress == 0 ) { t_Acquired = true ;
break ; }
if ( SwitchToThread () == FALSE ) { } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_DecoupledIWbemObjectSink :: CInterceptor_DecoupledIWbemObjectSink (
IWbemServices *a_Provider , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller
) : ObjectSinkContainerElement (
a_Controller , a_InterceptedSink ) , m_InterceptedSink ( a_InterceptedSink ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_Unknown ( a_Unknown ) , m_StatusCalled ( FALSE ) , m_SecurityDescriptor ( NULL ) , m_Provider ( a_Provider ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ;
if ( a_Provider ) { m_Provider->AddRef () ; }
if ( m_Unknown ) { m_Unknown->AddRef () ; }
if ( m_InterceptedSink ) { m_InterceptedSink->AddRef () ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_DecoupledIWbemObjectSink :: ~CInterceptor_DecoupledIWbemObjectSink () { InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemObjectSink :: Initialize ( SECURITY_DESCRIPTOR *a_SecurityDescriptor ) { return ProviderSubSystem_Common_Globals :: SinkAccessInitialize ( a_SecurityDescriptor , m_SecurityDescriptor ) ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
void CInterceptor_DecoupledIWbemObjectSink :: CallBackInternalRelease () { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 0 , 0 ) ) { m_InterceptedSink->SetStatus (
0 , WBEM_E_UNEXPECTED , NULL , NULL ) ; }
if ( m_InterceptedSink ) { m_InterceptedSink->Release () ; }
if ( m_Unknown ) { m_Unknown->Release () ; }
if ( m_Provider ) { m_Provider->Release () ; }
if ( m_SecurityDescriptor ) { delete [] m_SecurityDescriptor ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP CInterceptor_DecoupledIWbemObjectSink :: QueryInterface (
REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ;
if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemObjectSink ) { *iplpv = ( LPVOID ) ( IWbemObjectSink * ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * ) this ; } else if ( iid == IID_IObjectSink_CancelOperation ) { *iplpv = ( LPVOID ) ( IObjectSink_CancelOperation * ) this ; }
if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ;
return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_(ULONG) CInterceptor_DecoupledIWbemObjectSink :: AddRef ( void ) { return ObjectSinkContainerElement :: AddRef () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_(ULONG) CInterceptor_DecoupledIWbemObjectSink :: Release ( void ) { return ObjectSinkContainerElement :: Release () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemObjectSink :: Indicate (
long a_ObjectCount , IWbemClassObject **a_ObjectArray ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( SUCCEEDED ( t_Result = ProviderSubSystem_Common_Globals :: CheckAccess ( m_SecurityDescriptor , MASK_PROVIDER_BINDING_BIND , & g_ProviderBindingMapping ) ) ) { t_Result = m_InterceptedSink->Indicate (
a_ObjectCount , a_ObjectArray ) ; } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemObjectSink :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { switch ( a_Flags ) { if ( SUCCEEDED ( t_Result = ProviderSubSystem_Common_Globals :: CheckAccess ( m_SecurityDescriptor , MASK_PROVIDER_BINDING_BIND , & g_ProviderBindingMapping ) ) ) { case WBEM_STATUS_PROGRESS: { t_Result = m_InterceptedSink->SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } break ;
case WBEM_STATUS_COMPLETE: { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } } break ;
default: { t_Result = WBEM_E_INVALID_PARAMETER ; } break ; } } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemObjectSink :: Shutdown (
LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_GateClosed ) ;
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
0 , WBEM_E_SHUTTING_DOWN , NULL , NULL ) ; }
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_DecoupledIWbemObjectSink :: Cancel (
LONG a_Flags ) { HRESULT t_Result = S_OK ;
if ( m_Provider ) { t_Result = m_Provider->CancelAsyncCall (
this ) ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink :: CInterceptor_IWbemSyncObjectSink (
WmiAllocator &a_Allocator , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink :: ~CInterceptor_IWbemSyncObjectSink () { InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_GetObjectAsync :: CInterceptor_IWbemSyncObjectSink_GetObjectAsync (
WmiAllocator &a_Allocator , long a_Flags , BSTR a_ObjectPath , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_ObjectPath ( a_ObjectPath ) , m_Interceptor ( a_Interceptor ) {
if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_GetObjectAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_ObjectPath ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_GetObjectAsync :: ~CInterceptor_IWbemSyncObjectSink_GetObjectAsync () { if ( m_ObjectPath ) { SysFreeString ( m_ObjectPath ) ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_GetObjectAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_GetObjectAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_ObjectPath , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_DeleteInstanceAsync :: CInterceptor_IWbemSyncObjectSink_DeleteInstanceAsync (
WmiAllocator &a_Allocator , long a_Flags , BSTR a_ObjectPath , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_ObjectPath ( a_ObjectPath ) , m_Interceptor ( a_Interceptor ) {
if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_DeleteInstanceAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_ObjectPath ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_DeleteInstanceAsync :: ~CInterceptor_IWbemSyncObjectSink_DeleteInstanceAsync () { if ( m_ObjectPath ) { SysFreeString ( m_ObjectPath ) ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_DeleteInstanceAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_DeleteInstanceAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_ObjectPath , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_DeleteClassAsync :: CInterceptor_IWbemSyncObjectSink_DeleteClassAsync (
WmiAllocator &a_Allocator , long a_Flags , BSTR a_Class , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_Class ( a_Class ) , m_Interceptor ( a_Interceptor ) {
if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_DeleteClassAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_Class ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_DeleteClassAsync :: ~CInterceptor_IWbemSyncObjectSink_DeleteClassAsync () { if ( m_Class ) { SysFreeString ( m_Class ) ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_DeleteClassAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_DeleteClassAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_Class , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_PutClassAsync :: CInterceptor_IWbemSyncObjectSink_PutClassAsync (
WmiAllocator &a_Allocator , long a_Flags , IWbemClassObject *a_Class , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_Class ( a_Class ) , m_Interceptor ( a_Interceptor ) { if ( m_Class ) { m_Class->AddRef () ; }
if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_PutClassAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_Class ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_PutClassAsync :: ~CInterceptor_IWbemSyncObjectSink_PutClassAsync () { if ( m_Class ) { m_Class->Release () ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_PutClassAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_PutClassAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_Class , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_PutInstanceAsync :: CInterceptor_IWbemSyncObjectSink_PutInstanceAsync (
WmiAllocator &a_Allocator , long a_Flags , IWbemClassObject *a_Instance , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_Instance ( a_Instance ) , m_Interceptor ( a_Interceptor ) { if ( m_Instance ) { m_Instance->AddRef () ; }
if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_PutInstanceAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_Instance ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_PutInstanceAsync :: ~CInterceptor_IWbemSyncObjectSink_PutInstanceAsync () { if ( m_Instance ) { m_Instance->Release () ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_PutInstanceAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_PutInstanceAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_Instance , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_CreateInstanceEnumAsync :: CInterceptor_IWbemSyncObjectSink_CreateInstanceEnumAsync (
WmiAllocator &a_Allocator , long a_Flags , BSTR a_Class , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_Batching_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_Class ( a_Class ) , m_Interceptor ( a_Interceptor ) { if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_CreateInstanceEnumAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_Class ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_CreateInstanceEnumAsync :: ~CInterceptor_IWbemSyncObjectSink_CreateInstanceEnumAsync () { if ( m_Class ) { SysFreeString ( m_Class ) ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_CreateInstanceEnumAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_Batching_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_CreateInstanceEnumAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_Class , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_CreateClassEnumAsync :: CInterceptor_IWbemSyncObjectSink_CreateClassEnumAsync (
WmiAllocator &a_Allocator , long a_Flags , BSTR a_SuperClass , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_Batching_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_SuperClass ( a_SuperClass ) , m_Interceptor ( a_Interceptor ) { if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_CreateClassEnumAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_SuperClass ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_CreateClassEnumAsync :: ~CInterceptor_IWbemSyncObjectSink_CreateClassEnumAsync () { if ( m_SuperClass ) { SysFreeString ( m_SuperClass ) ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_CreateClassEnumAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_Batching_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_CreateClassEnumAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_SuperClass , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_ExecQueryAsync :: CInterceptor_IWbemSyncObjectSink_ExecQueryAsync (
WmiAllocator &a_Allocator , long a_Flags , BSTR a_QueryLanguage , BSTR a_Query , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_Batching_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_Query ( a_Query ) , m_QueryLanguage ( a_QueryLanguage ) , m_Interceptor ( a_Interceptor ) { if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_ExecQueryAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_QueryLanguage , m_Query ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_ExecQueryAsync :: ~CInterceptor_IWbemSyncObjectSink_ExecQueryAsync () { if ( m_Query ) { SysFreeString ( m_Query ) ; }
if ( m_QueryLanguage ) { SysFreeString ( m_QueryLanguage ) ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_ExecQueryAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_Batching_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_ExecQueryAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_QueryLanguage , m_Query , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncObjectSink_ExecMethodAsync :: CInterceptor_IWbemSyncObjectSink_ExecMethodAsync (
WmiAllocator &a_Allocator , long a_Flags , BSTR a_ObjectPath , BSTR a_MethodName , IWbemClassObject *a_InParameters , CInterceptor_IWbemSyncProvider *a_Interceptor , IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , ULONG a_Dependant
) : CCommon_IWbemSyncObjectSink (
a_Allocator , a_InterceptedSink , a_Unknown , a_Controller , a_Dependant ) , m_Flags ( a_Flags ) , m_ObjectPath ( a_ObjectPath ) , m_MethodName ( a_MethodName ) , m_InParameters ( a_InParameters ) , m_Interceptor ( a_Interceptor ) { if ( m_InParameters ) { m_InParameters->AddRef () ; }
if ( m_Interceptor ) { m_Interceptor->AddRef () ;
WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_ExecMethodAsyncEvent_Pre ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_ObjectPath , m_MethodName , m_InParameters ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncObjectSink_ExecMethodAsync :: ~CInterceptor_IWbemSyncObjectSink_ExecMethodAsync () { if ( m_MethodName ) { SysFreeString ( m_MethodName ) ; }
if ( m_ObjectPath ) { SysFreeString ( m_ObjectPath ) ; }
if ( m_InParameters ) { m_InParameters->Release () ; }
if ( m_Interceptor ) { m_Interceptor->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncObjectSink_ExecMethodAsync :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = CCommon_IWbemSyncObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ;
if ( m_Interceptor ) { if ( a_Flags == WBEM_STATUS_COMPLETE ) { WmiSetAndCommitObject (
ProviderSubSystem_Globals :: s_EventClassHandles [ Msft_WmiProvider_ExecMethodAsyncEvent_Post ] , WMI_SENDCOMMIT_SET_NOT_REQUIRED, m_Interceptor->m_Namespace , m_Interceptor->m_Registration->GetComRegistration ().GetClsidServer ().GetProviderName () , m_Interceptor->m_User , m_Interceptor->m_Locale , m_Interceptor->m_TransactionIdentifier , m_Flags , m_ObjectPath , m_MethodName , m_InParameters , a_Result , a_StringParam , a_ObjectParam ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemFilteringObjectSink :: CInterceptor_IWbemFilteringObjectSink (
IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , const BSTR a_QueryLanguage , const BSTR a_Query
) : CInterceptor_IWbemObjectSink (
a_InterceptedSink , a_Unknown , a_Controller ) , m_Filtering ( FALSE ) , m_QueryFilter ( NULL ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemFilteringObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ;
if ( a_Query ) { m_Query = SysAllocString ( a_Query ) ; }
if ( a_QueryLanguage ) { m_QueryLanguage = SysAllocString ( a_QueryLanguage ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemFilteringObjectSink :: ~CInterceptor_IWbemFilteringObjectSink () { if ( m_QueryFilter ) { m_QueryFilter->Release () ; }
if ( m_Query ) { SysFreeString ( m_Query ) ; }
if ( m_QueryLanguage ) { SysFreeString ( m_QueryLanguage ) ; }
InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemFilteringObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemFilteringObjectSink :: Indicate (
long a_ObjectCount , IWbemClassObject **a_ObjectArray ) { HRESULT t_Result = CInterceptor_IWbemObjectSink :: Indicate (
a_ObjectCount , a_ObjectArray ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemFilteringObjectSink :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = S_OK ;
switch ( a_Flags ) { case WBEM_STATUS_PROGRESS: { t_Result = CInterceptor_IWbemObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } break ;
case WBEM_STATUS_COMPLETE: { t_Result = CInterceptor_IWbemObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } break ;
case WBEM_STATUS_REQUIREMENTS: { t_Result = CInterceptor_IWbemObjectSink :: SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } break;
default: { t_Result = WBEM_E_INVALID_PARAMETER ; } break ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemSyncFilteringObjectSink :: CInterceptor_IWbemSyncFilteringObjectSink (
IWbemObjectSink *a_InterceptedSink , IUnknown *a_Unknown , CWbemGlobal_IWmiObjectSinkController *a_Controller , const BSTR a_QueryLanguage , const BSTR a_Query , ULONG a_Dependant
) : ObjectSinkContainerElement (
a_Controller , a_InterceptedSink ) , m_InterceptedSink ( a_InterceptedSink ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_Unknown ( a_Unknown ) , m_StatusCalled ( FALSE ) , m_Filtering ( FALSE ) , m_QueryFilter ( NULL ) , m_Dependant ( a_Dependant ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncFilteringObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ;
if ( m_Unknown ) { m_Unknown->AddRef () ; }
if ( m_InterceptedSink ) { m_InterceptedSink->AddRef () ; }
if ( a_Query ) { m_Query = SysAllocString ( a_Query ) ; }
if ( a_QueryLanguage ) { m_QueryLanguage = SysAllocString ( a_QueryLanguage ) ; } }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemSyncFilteringObjectSink :: ~CInterceptor_IWbemSyncFilteringObjectSink () { if ( m_QueryFilter ) { m_QueryFilter->Release () ; }
if ( m_Query ) { SysFreeString ( m_Query ) ; }
if ( m_QueryLanguage ) { SysFreeString ( m_QueryLanguage ) ; }
InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemSyncFilteringObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
void CInterceptor_IWbemSyncFilteringObjectSink :: CallBackInternalRelease () { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 0 , 0 ) ) { m_InterceptedSink->SetStatus (
0 , WBEM_E_UNEXPECTED , NULL , NULL ) ; }
if ( m_InterceptedSink ) { m_InterceptedSink->Release () ; }
if ( m_Unknown ) { m_Unknown->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP CInterceptor_IWbemSyncFilteringObjectSink :: QueryInterface (
REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ;
if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemObjectSink ) { *iplpv = ( LPVOID ) ( IWbemObjectSink * ) 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_IWbemSyncFilteringObjectSink :: AddRef ( void ) { // printf ( "\nCInterceptor_IWbemSyncFilteringObjectSink :: AddRef ()" ) ;
return ObjectSinkContainerElement :: AddRef () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_(ULONG) CInterceptor_IWbemSyncFilteringObjectSink :: Release ( void ) { return ObjectSinkContainerElement :: Release () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncFilteringObjectSink :: Indicate (
long a_ObjectCount , IWbemClassObject **a_ObjectArray ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_InterceptedSink->Indicate (
a_ObjectCount , a_ObjectArray ) ; }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncFilteringObjectSink :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { switch ( a_Flags ) { case WBEM_STATUS_PROGRESS: { t_Result = m_InterceptedSink->SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } break ;
case WBEM_STATUS_COMPLETE: { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } } break ;
case WBEM_STATUS_REQUIREMENTS: { t_Result = m_InterceptedSink->SetStatus (
a_Flags , a_Result , a_StringParam , a_ObjectParam ) ; } break;
default: { t_Result = WBEM_E_INVALID_PARAMETER ; } break ; } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemSyncFilteringObjectSink :: Shutdown (
LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_GateClosed ) ;
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
0 , WBEM_E_SHUTTING_DOWN , NULL , NULL ) ; }
bool t_Acquired = false ; while ( ! t_Acquired ) { if ( m_InProgress == 0 ) { t_Acquired = true ;
break ; }
if ( SwitchToThread () == FALSE ) { } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_DecoupledIWbemCombiningObjectSink :: CInterceptor_DecoupledIWbemCombiningObjectSink (
WmiAllocator &a_Allocator , IWbemObjectSink *a_InterceptedSink , CWbemGlobal_IWmiObjectSinkController *a_Controller
) : CWbemGlobal_IWmiObjectSinkController ( a_Allocator ) , ObjectSinkContainerElement (
a_Controller , a_InterceptedSink ) , m_InterceptedSink ( a_InterceptedSink ) , m_Event ( NULL ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_StatusCalled ( FALSE ) , m_SinkCount ( 0 ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemCombiningObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ;
CWbemGlobal_IWmiObjectSinkController :: Initialize () ;
if ( m_InterceptedSink ) { m_InterceptedSink->AddRef () ; }
m_Event = CreateEvent ( NULL , FALSE , FALSE , NULL ) ; }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_DecoupledIWbemCombiningObjectSink :: ~CInterceptor_DecoupledIWbemCombiningObjectSink () { InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemCombiningObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
void CInterceptor_DecoupledIWbemCombiningObjectSink :: CallBackInternalRelease () { if ( m_InterceptedSink ) { m_InterceptedSink->Release () ; }
if ( m_Event ) { CloseHandle ( m_Event ) ; }
CWbemGlobal_IWmiObjectSinkController :: UnInitialize () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP CInterceptor_DecoupledIWbemCombiningObjectSink :: QueryInterface (
REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ;
if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemObjectSink ) { *iplpv = ( LPVOID ) ( IWbemObjectSink * ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * ) this ; } else if ( iid == IID_IObjectSink_CancelOperation ) { *iplpv = ( LPVOID ) ( IObjectSink_CancelOperation * ) this ; }
if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ;
return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_( ULONG ) CInterceptor_DecoupledIWbemCombiningObjectSink :: AddRef () { return ObjectSinkContainerElement :: AddRef () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_(ULONG) CInterceptor_DecoupledIWbemCombiningObjectSink :: Release () { return ObjectSinkContainerElement :: Release () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemCombiningObjectSink :: Indicate (
long a_ObjectCount , IWbemClassObject **a_ObjectArray ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { t_Result = m_InterceptedSink->Indicate (
a_ObjectCount , a_ObjectArray ) ; }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemCombiningObjectSink :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( FAILED ( a_Result ) ) { ULONG t_SinkCount = InterlockedDecrement ( & m_SinkCount ) ;
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
0 , a_Result , NULL , NULL ) ;
SetEvent ( m_Event ) ; } } else { ULONG t_SinkCount = InterlockedDecrement ( & m_SinkCount ) ; if ( t_SinkCount == 0 ) { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
0 , S_OK , NULL , NULL ) ;
SetEvent ( m_Event ) ; } } } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemCombiningObjectSink :: Shutdown (
LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_GateClosed ) ;
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { t_Result = m_InterceptedSink->SetStatus (
0 , WBEM_E_SHUTTING_DOWN , NULL , NULL ) ; }
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_DecoupledIWbemCombiningObjectSink :: Wait ( ULONG a_Timeout ) { HRESULT t_Result = S_OK ;
ULONG t_Status = WaitForSingleObject ( m_Event , a_Timeout ) ; switch ( t_Status ) { case WAIT_TIMEOUT: { t_Result = WBEM_E_TIMED_OUT ; } break ;
case WAIT_OBJECT_0: { } break ;
default: { t_Result = WBEM_E_FAILED ; } break ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemCombiningObjectSink :: Cancel (
LONG a_Flags ) { HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiObjectSinkController_Container *t_Container = NULL ; GetContainer ( t_Container ) ;
Lock () ;
if ( t_Container->Size () ) { IObjectSink_CancelOperation **t_Elements = new IObjectSink_CancelOperation * [ t_Container->Size () ] ; if ( t_Elements ) { CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator = t_Container->Begin ();
ULONG t_Count = 0 ; while ( ! t_Iterator.Null () ) { t_Result = t_Iterator.GetElement ()->QueryInterface ( IID_IObjectSink_CancelOperation , ( void ** ) & t_Elements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ; }
UnLock () ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { if ( t_Elements [ t_Index ] ) { t_Result = t_Elements [ t_Index ]->Cancel (
a_Flags ) ;
IWbemShutdown *t_Shutdown = NULL ; HRESULT t_TempResult = t_Elements [ t_Index ]->QueryInterface ( IID_IWbemShutdown , ( void ** ) & t_Shutdown ) ; if ( SUCCEEDED ( t_TempResult ) ) { t_TempResult = t_Shutdown->Shutdown (
0 , 0 , NULL ) ;
t_Shutdown->Release () ; }
t_Elements [ t_Index ]->Release () ; } }
delete [] t_Elements ; } else { UnLock () ;
t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { UnLock () ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_DecoupledIWbemCombiningObjectSink :: EnQueue ( CInterceptor_DecoupledIWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
WmiStatusCode t_StatusCode = Lock () ; if ( t_StatusCode == e_StatusCode_Success ) { t_StatusCode = Insert (
*a_Sink , t_Iterator ) ;
UnLock () ; }
if ( t_StatusCode == e_StatusCode_Success ) { InterlockedIncrement ( & m_SinkCount ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
void CInterceptor_DecoupledIWbemCombiningObjectSink :: Suspend () { InterlockedIncrement ( & m_SinkCount ) ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
void CInterceptor_DecoupledIWbemCombiningObjectSink :: Resume () { ULONG t_ReferenceCount = InterlockedDecrement ( & m_SinkCount ) ; if ( t_ReferenceCount == 0 ) { InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { } else { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { HRESULT t_Result = m_InterceptedSink->SetStatus (
0 , S_OK , NULL , NULL ) ;
SetEvent ( m_Event ) ; } }
InterlockedDecrement ( & m_InProgress ) ;
} }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CInterceptor_IWbemWaitingObjectSink :: CInterceptor_IWbemWaitingObjectSink (
WmiAllocator &a_Allocator , IWbemServices *a_Provider , IWbemObjectSink *a_InterceptedSink , CWbemGlobal_IWmiObjectSinkController *a_Controller , CServerObject_ProviderRegistrationV1 &a_Registration
) : CWbemGlobal_IWmiObjectSinkController ( a_Allocator ) , ObjectSinkContainerElement (
a_Controller , a_InterceptedSink ) , m_Queue ( a_Allocator ) , m_Event ( NULL ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_StatusCalled ( FALSE ) , m_Result ( S_OK ) , m_SecurityDescriptor ( NULL ) , m_ReferenceCount ( 0 ) , m_Registration ( a_Registration ) , m_Provider ( a_Provider ) , m_CriticalSection (NOTHROW_LOCK) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemWaitingObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ;
m_Registration.AddRef () ;
if ( m_Provider ) { m_Provider->AddRef () ; }
WmiStatusCode t_StatusCode = m_Queue.Initialize () ;
CWbemGlobal_IWmiObjectSinkController :: Initialize () ;
m_Event = CreateEvent ( NULL , FALSE , FALSE , NULL ) ;
}
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink :: ~CInterceptor_IWbemWaitingObjectSink () { if ( m_Event ) { CloseHandle ( m_Event ) ; }
ULONG t_Count = m_Queue.Size(); for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { IWbemClassObject *t_ClassObject ; WmiStatusCode t_StatusCode = m_Queue.Top ( t_ClassObject ) ; if ( t_StatusCode == e_StatusCode_Success ) { t_ClassObject->Release () ; t_StatusCode = m_Queue.DeQueue () ; } } m_Queue.UnInitialize () ;
CWbemGlobal_IWmiObjectSinkController :: UnInitialize () ;
if ( m_SecurityDescriptor ) { delete [] m_SecurityDescriptor ; }
m_Registration.Release () ;
InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CInterceptor_IWbemWaitingObjectSink_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink :: Initialize ( SECURITY_DESCRIPTOR *a_SecurityDescriptor ) { return m_CriticalSection.valid() ? ProviderSubSystem_Common_Globals :: SinkAccessInitialize ( a_SecurityDescriptor , m_SecurityDescriptor ) : WBEM_E_OUT_OF_MEMORY; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP CInterceptor_IWbemWaitingObjectSink :: QueryInterface (
REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ;
if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemObjectSink ) { *iplpv = ( LPVOID ) ( IWbemObjectSink * ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * ) this ; } else if ( iid == IID_IObjectSink_CancelOperation ) { *iplpv = ( LPVOID ) ( IObjectSink_CancelOperation * ) this ; }
if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ;
return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_( ULONG ) CInterceptor_IWbemWaitingObjectSink :: AddRef () { LONG t_ReferenceCount = InterlockedIncrement ( & m_ReferenceCount ) ;
return ObjectSinkContainerElement :: AddRef () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_(ULONG) CInterceptor_IWbemWaitingObjectSink :: Release () { LONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ; if ( t_ReferenceCount == 1 ) { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { if ( SUCCEEDED ( m_Result ) ) { m_Result = WBEM_E_UNEXPECTED ; }
SetEvent ( m_Event ) ; } }
return ObjectSinkContainerElement :: Release () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
void CInterceptor_IWbemWaitingObjectSink :: CallBackInternalRelease () { if ( m_Provider ) { m_Provider->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink :: Cancel (
LONG a_Flags ) { HRESULT t_Result = S_OK ;
if ( m_Provider ) { t_Result = m_Provider->CancelAsyncCall (
this ) ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink :: Indicate (
long a_ObjectCount , IWbemClassObject **a_ObjectArray ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( SUCCEEDED ( t_Result = ProviderSubSystem_Common_Globals :: CheckAccess ( m_SecurityDescriptor , MASK_PROVIDER_BINDING_BIND , & g_ProviderBindingMapping ) ) ) { WmiStatusCode t_StatusCode = WmiHelper :: EnterCriticalSection ( & m_CriticalSection , FALSE ) ; if ( t_StatusCode == e_StatusCode_Success ) { for ( LONG t_Index = 0 ; SUCCEEDED ( t_Result ) && ( t_Index < a_ObjectCount ) ; t_Index ++ ) { if ( a_ObjectArray [ t_Index ] ) { WmiStatusCode t_StatusCode = m_Queue.EnQueue ( a_ObjectArray [ t_Index ] ) ; if ( t_StatusCode == e_StatusCode_Success ) { a_ObjectArray [ t_Index ]->AddRef () ; } else { if ( SUCCEEDED ( t_Result ) ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } } else { t_Result = WBEM_E_INVALID_OBJECT ; } } WmiHelper :: LeaveCriticalSection ( & m_CriticalSection ) ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( SUCCEEDED ( t_Result = ProviderSubSystem_Common_Globals :: CheckAccess ( m_SecurityDescriptor , MASK_PROVIDER_BINDING_BIND , & g_ProviderBindingMapping ) ) ) { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { if ( SUCCEEDED ( m_Result ) ) { m_Result = a_Result ; }
SetEvent ( m_Event ) ; } } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink :: Shutdown (
LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_GateClosed ) ;
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { m_Result = WBEM_E_SHUTTING_DOWN ;
SetEvent ( m_Event ) ; }
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_IWbemWaitingObjectSink :: Wait ( ULONG a_Timeout ) { HRESULT t_Result = S_OK ;
ULONG t_Status = WaitForSingleObject ( m_Event , a_Timeout ) ; switch ( t_Status ) { case WAIT_TIMEOUT: { t_Result = WBEM_E_TIMED_OUT ; } break ;
case WAIT_OBJECT_0: { } break ;
default: { t_Result = WBEM_E_FAILED ; } break ; }
ObjectSinkContainerElement :: GetController ()->Lock () ;
CWbemGlobal_IWmiObjectSinkController_Container *t_Container = NULL ; ObjectSinkContainerElement :: GetController ()->GetContainer ( t_Container ) ; t_Container->Delete ( VoidPointerContainerElement :: GetKey () ) ;
ObjectSinkContainerElement :: GetController ()->UnLock () ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink_GetObjectAsync :: CInterceptor_IWbemWaitingObjectSink_GetObjectAsync (
WmiAllocator &m_Allocator , IWbemServices *a_Provider , IWbemObjectSink *a_InterceptedSink , CWbemGlobal_IWmiObjectSinkController *a_Controller , CServerObject_ProviderRegistrationV1 &a_Registration
) : CInterceptor_IWbemWaitingObjectSink (
m_Allocator , a_Provider , a_InterceptedSink , a_Controller , a_Registration ) , m_ObjectPath ( NULL ) , m_Flags ( 0 ) , m_Context ( NULL ) { }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink_GetObjectAsync :: ~CInterceptor_IWbemWaitingObjectSink_GetObjectAsync () { if ( m_ObjectPath ) { SysFreeString ( m_ObjectPath ) ; }
if ( m_Context ) { m_Context->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink_GetObjectAsync :: Initialize (
SECURITY_DESCRIPTOR *a_SecurityDescriptor , BSTR a_ObjectPath , LONG a_Flags , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
m_Flags = a_Flags ;
m_Context = a_Context ; if ( m_Context ) { m_Context->AddRef () ; }
m_ObjectPath = SysAllocString ( a_ObjectPath ) ; if ( m_ObjectPath == NULL ) { t_Result = WBEM_E_OUT_OF_MEMORY ; }
if ( SUCCEEDED ( t_Result ) ) { t_Result = CInterceptor_IWbemWaitingObjectSink :: Initialize ( a_SecurityDescriptor ) ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink_DeleteClassAsync :: CInterceptor_IWbemWaitingObjectSink_DeleteClassAsync (
WmiAllocator &m_Allocator , IWbemServices *a_Provider , IWbemObjectSink *a_InterceptedSink , CWbemGlobal_IWmiObjectSinkController *a_Controller , CServerObject_ProviderRegistrationV1 &a_Registration
) : CInterceptor_IWbemWaitingObjectSink (
m_Allocator , a_Provider , a_InterceptedSink , a_Controller , a_Registration ) , m_Class ( NULL ) , m_Flags ( 0 ) , m_Context ( NULL ) { }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink_DeleteClassAsync :: ~CInterceptor_IWbemWaitingObjectSink_DeleteClassAsync () { if ( m_Class ) { SysFreeString ( m_Class ) ; }
if ( m_Context ) { m_Context->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink_DeleteClassAsync :: Initialize (
SECURITY_DESCRIPTOR *a_SecurityDescriptor , BSTR a_Class , LONG a_Flags , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
m_Flags = a_Flags ;
m_Context = a_Context ; if ( m_Context ) { m_Context->AddRef () ; }
m_Class = SysAllocString ( a_Class ) ; if ( m_Class == NULL ) { t_Result = WBEM_E_OUT_OF_MEMORY ; }
if ( SUCCEEDED ( t_Result ) ) { t_Result = CInterceptor_IWbemWaitingObjectSink :: Initialize ( a_SecurityDescriptor ) ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink_CreateClassEnumAsync :: CInterceptor_IWbemWaitingObjectSink_CreateClassEnumAsync (
WmiAllocator &m_Allocator , IWbemServices *a_Provider , IWbemObjectSink *a_InterceptedSink , CWbemGlobal_IWmiObjectSinkController *a_Controller , CServerObject_ProviderRegistrationV1 &a_Registration
) : CInterceptor_IWbemWaitingObjectSink (
m_Allocator , a_Provider , a_InterceptedSink , a_Controller , a_Registration ) , m_SuperClass ( NULL ) , m_Flags ( 0 ) , m_Context ( NULL ) { }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink_CreateClassEnumAsync :: ~CInterceptor_IWbemWaitingObjectSink_CreateClassEnumAsync () { if ( m_SuperClass ) { SysFreeString ( m_SuperClass ) ; }
if ( m_Context ) { m_Context->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink_CreateClassEnumAsync :: Initialize (
SECURITY_DESCRIPTOR *a_SecurityDescriptor , BSTR a_SuperClass , LONG a_Flags , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
m_Flags = a_Flags ;
m_Context = a_Context ; if ( m_Context ) { m_Context->AddRef () ; }
m_SuperClass = SysAllocString ( a_SuperClass ) ; if ( m_SuperClass == NULL ) { t_Result = WBEM_E_OUT_OF_MEMORY ; }
if ( SUCCEEDED ( t_Result ) ) { t_Result = CInterceptor_IWbemWaitingObjectSink :: Initialize ( a_SecurityDescriptor ) ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink_PutClassAsync :: CInterceptor_IWbemWaitingObjectSink_PutClassAsync (
WmiAllocator &m_Allocator , IWbemServices *a_Provider , IWbemObjectSink *a_InterceptedSink , CWbemGlobal_IWmiObjectSinkController *a_Controller , CServerObject_ProviderRegistrationV1 &a_Registration
) : CInterceptor_IWbemWaitingObjectSink (
m_Allocator , a_Provider , a_InterceptedSink , a_Controller , a_Registration ) , m_ClassObject ( NULL ) , m_Flags ( 0 ) , m_Context ( NULL ) { }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CInterceptor_IWbemWaitingObjectSink_PutClassAsync :: ~CInterceptor_IWbemWaitingObjectSink_PutClassAsync () { if ( m_ClassObject ) { m_ClassObject->Release () ; }
if ( m_Context ) { m_Context->Release () ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CInterceptor_IWbemWaitingObjectSink_PutClassAsync :: Initialize (
SECURITY_DESCRIPTOR *a_SecurityDescriptor , IWbemClassObject *a_ClassObject , LONG a_Flags , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
m_Flags = a_Flags ;
m_Context = a_Context ; if ( m_Context ) { m_Context->AddRef () ; }
m_ClassObject = a_ClassObject ; if ( m_ClassObject ) { m_ClassObject->AddRef () ; }
if ( SUCCEEDED ( t_Result ) ) { t_Result = CInterceptor_IWbemWaitingObjectSink :: Initialize ( a_SecurityDescriptor ) ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CWaitingObjectSink :: CWaitingObjectSink (
WmiAllocator &a_Allocator
) : m_Queue ( a_Allocator ) , m_Event ( NULL ) , m_GateClosed ( FALSE ) , m_InProgress ( 0 ) , m_StatusCalled ( FALSE ) , m_Result ( S_OK ) , m_CriticalSection(NOTHROW_LOCK) { }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CWaitingObjectSink :: ~CWaitingObjectSink () { if ( m_Event ) { CloseHandle ( m_Event ) ; } ULONG t_Count = m_Queue.Size(); for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { IWbemClassObject *t_ClassObject ; WmiStatusCode t_StatusCode = m_Queue.Top ( t_ClassObject ) ; if ( t_StatusCode == e_StatusCode_Success ) { t_ClassObject->Release () ; t_StatusCode = m_Queue.DeQueue () ; } } m_Queue.UnInitialize () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CWaitingObjectSink :: SinkInitialize () { HRESULT t_Result = S_OK ;
WmiStatusCode t_StatusCode = m_Queue.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { if ( m_CriticalSection.valid() ) { m_Event = CreateEvent ( NULL , FALSE , FALSE , NULL ) ; if ( m_Event == NULL ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP CWaitingObjectSink :: QueryInterface (
REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ;
if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemObjectSink ) { *iplpv = ( LPVOID ) ( IWbemObjectSink * ) 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 ) CWaitingObjectSink :: AddRef () { return InterlockedIncrement ( & m_ReferenceCount ) ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_(ULONG) CWaitingObjectSink :: Release () { LONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ; if ( t_ReferenceCount == 0 ) { delete this ; }
return t_ReferenceCount ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CWaitingObjectSink :: Indicate (
long a_ObjectCount , IWbemClassObject **a_ObjectArray ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { WmiStatusCode t_StatusCode = WmiHelper :: EnterCriticalSection ( & m_CriticalSection , FALSE ) ; if ( t_StatusCode == e_StatusCode_Success ) { for ( LONG t_Index = 0 ; SUCCEEDED ( t_Result ) && ( t_Index < a_ObjectCount ) ; t_Index ++ ) { if ( a_ObjectArray [ t_Index ] ) { WmiStatusCode t_StatusCode = m_Queue.EnQueue ( a_ObjectArray [ t_Index ] ) ; if ( t_StatusCode == e_StatusCode_Success ) { a_ObjectArray [ t_Index ]->AddRef () ; } else { if ( SUCCEEDED ( t_Result ) ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } } else { t_Result = WBEM_E_INVALID_OBJECT ; } } WmiHelper :: LeaveCriticalSection ( & m_CriticalSection ) ;
} else { t_Result = WBEM_E_OUT_OF_MEMORY ; } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CWaitingObjectSink :: SetStatus (
long a_Flags , HRESULT a_Result , BSTR a_StringParam , IWbemClassObject *a_ObjectParam ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_InProgress ) ;
if ( m_GateClosed == 1 ) { t_Result = WBEM_E_SHUTTING_DOWN ; } else { if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { if ( SUCCEEDED ( m_Result ) ) { m_Result = a_Result ; }
SetEvent ( m_Event ) ; } }
InterlockedDecrement ( & m_InProgress ) ;
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CWaitingObjectSink :: Shutdown (
LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
InterlockedIncrement ( & m_GateClosed ) ;
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) ) { m_Result = WBEM_E_SHUTTING_DOWN ;
SetEvent ( m_Event ) ; }
bool t_Acquired = false ; while ( ! t_Acquired ) { if ( m_InProgress == 0 ) { t_Acquired = true ;
break ; }
if ( SwitchToThread () == FALSE ) { } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CWaitingObjectSink :: Wait ( ULONG a_Timeout ) { HRESULT t_Result = S_OK ;
ULONG t_Status = WaitForSingleObject ( m_Event , a_Timeout ) ; switch ( t_Status ) { case WAIT_TIMEOUT: { t_Result = WBEM_E_TIMED_OUT ; } break ;
case WAIT_OBJECT_0: { } break ;
default: { t_Result = WBEM_E_FAILED ; } break ; }
return t_Result ; }
|