Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1795 lines
35 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
ProvFact.cpp
Abstract:
History:
--*/
/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
ProvFact.cpp
Abstract:
History:
--*/
#include <PreComp.h>
#include <wbemint.h>
#include "Globals.h"
#include "Guids.h"
#include "ProvRegistrar.h"
#include "ProvEvents.h"
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
CDecoupled_IWbemObjectSink :: CDecoupled_IWbemObjectSink ()
: m_InterceptedSink ( NULL ) ,
m_EventSink ( NULL ) ,
m_GateClosed ( FALSE ) ,
m_InProgress ( 0 ) ,
m_StatusCalled ( FALSE ) ,
m_SecurityDescriptorLength ( 0 ) ,
m_SecurityDescriptor ( NULL ),
m_CriticalSection(NOTHROW_LOCK)
{
InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
CDecoupled_IWbemObjectSink::~CDecoupled_IWbemObjectSink ()
{
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 0 , 0 ) )
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemObjectSink *t_ObjectSink = m_InterceptedSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_ObjectSink->SetStatus (
0 ,
WBEM_E_UNEXPECTED ,
NULL ,
NULL
) ;
t_ObjectSink->Release () ;
}
}
if ( m_InterceptedSink )
{
m_InterceptedSink->Release () ;
}
if ( m_EventSink )
{
m_EventSink->Release () ;
}
if ( m_SecurityDescriptor )
{
delete [] m_SecurityDescriptor ;
}
InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP CDecoupled_IWbemObjectSink::QueryInterface (
REFIID a_Riid ,
LPVOID FAR *a_Void
)
{
*a_Void = NULL ;
if ( a_Riid == IID_IUnknown )
{
*a_Void = ( LPVOID ) this ;
}
else if ( a_Riid == IID_IWbemObjectSink )
{
*a_Void = ( LPVOID ) ( IWbemObjectSink * ) this ;
}
else if ( a_Riid == IID_IWbemEventSink )
{
*a_Void = ( LPVOID ) ( IWbemEventSink * ) this ;
}
else if ( a_Riid == IID_IWbemShutdown )
{
*a_Void = ( LPVOID ) ( IWbemShutdown * ) this ;
}
if ( *a_Void )
{
( ( LPUNKNOWN ) *a_Void )->AddRef () ;
return ResultFromScode ( S_OK ) ;
}
else
{
return ResultFromScode ( E_NOINTERFACE ) ;
}
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupled_IWbemObjectSink :: Indicate (
long a_ObjectCount ,
IWbemClassObject **a_ObjectArray
)
{
HRESULT t_Result = S_OK ;
try
{
InterlockedIncrement ( & m_InProgress ) ;
try
{
if ( m_GateClosed == 1 )
{
t_Result = WBEM_E_SHUTTING_DOWN ;
}
else
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemObjectSink *t_ObjectSink = m_InterceptedSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_Result = t_ObjectSink->Indicate (
a_ObjectCount ,
a_ObjectArray
) ;
t_ObjectSink->Release () ;
}
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
InterlockedDecrement ( & m_InProgress ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupled_IWbemObjectSink :: SetStatus (
long a_Flags ,
HRESULT a_Result ,
BSTR a_StringParam ,
IWbemClassObject *a_ObjectParam
)
{
HRESULT t_Result = S_OK ;
try
{
InterlockedIncrement ( & m_InProgress ) ;
try
{
if ( m_GateClosed == 1 )
{
t_Result = WBEM_E_SHUTTING_DOWN ;
}
else
{
switch ( a_Flags )
{
case WBEM_STATUS_PROGRESS:
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemObjectSink *t_ObjectSink = m_InterceptedSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_Result = t_ObjectSink->SetStatus (
a_Flags ,
a_Result ,
a_StringParam ,
a_ObjectParam
) ;
t_ObjectSink->Release () ;
}
}
break ;
case WBEM_STATUS_COMPLETE:
{
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) )
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemObjectSink *t_ObjectSink = m_InterceptedSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_Result = t_ObjectSink->SetStatus (
a_Flags ,
a_Result ,
a_StringParam ,
a_ObjectParam
) ;
t_ObjectSink->Release () ;
}
}
}
break ;
default:
{
t_Result = WBEM_E_INVALID_PARAMETER ;
}
break ;
}
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
InterlockedDecrement ( & m_InProgress ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupled_IWbemObjectSink :: SetSinkSecurity (
long a_SecurityDescriptorLength ,
BYTE *a_SecurityDescriptor
)
{
HRESULT t_Result = S_OK ;
try
{
InterlockedIncrement ( & m_InProgress ) ;
try
{
if ( m_GateClosed == 1 )
{
t_Result = WBEM_E_SHUTTING_DOWN ;
}
else
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemEventSink *t_ObjectSink = m_EventSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_Result = t_ObjectSink->SetSinkSecurity (
a_SecurityDescriptorLength ,
a_SecurityDescriptor
) ;
t_ObjectSink->Release () ;
}
else
{
if ( a_SecurityDescriptor )
{
if ( a_SecurityDescriptorLength )
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
m_SecurityDescriptorLength = a_SecurityDescriptorLength;
m_SecurityDescriptor = new BYTE [ a_SecurityDescriptorLength ] ;
if ( m_SecurityDescriptor )
{
try
{
CopyMemory ( m_SecurityDescriptor , a_SecurityDescriptor , a_SecurityDescriptorLength ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
}
else
{
t_Result = WBEM_E_INVALID_PARAMETER ;
}
}
else
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( m_SecurityDescriptor )
{
delete m_SecurityDescriptor ;
m_SecurityDescriptor = NULL ;
}
m_SecurityDescriptorLength = 0 ;
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
}
}
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
InterlockedDecrement ( & m_InProgress ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupled_IWbemObjectSink :: IsActive ()
{
HRESULT t_Result = S_OK ;
try
{
InterlockedIncrement ( & m_InProgress ) ;
try
{
if ( m_GateClosed == 1 )
{
t_Result = WBEM_E_SHUTTING_DOWN ;
}
else
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemEventSink *t_ObjectSink = m_EventSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_Result = t_ObjectSink->IsActive () ;
t_ObjectSink->Release () ;
}
else
{
t_Result = WBEM_S_FALSE ;
}
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
InterlockedDecrement ( & m_InProgress ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupled_IWbemObjectSink :: SetBatchingParameters (
LONG a_Flags,
DWORD a_MaxBufferSize,
DWORD a_MaxSendLatency
)
{
HRESULT t_Result = S_OK ;
try
{
InterlockedIncrement ( & m_InProgress ) ;
try
{
if ( m_GateClosed == 1 )
{
t_Result = WBEM_E_SHUTTING_DOWN ;
}
else
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemEventSink *t_ObjectSink = m_EventSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_Result = t_ObjectSink->SetBatchingParameters (
a_Flags ,
a_MaxBufferSize ,
a_MaxSendLatency
) ;
t_ObjectSink->Release () ;
}
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
InterlockedDecrement ( & m_InProgress ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupled_IWbemObjectSink :: Shutdown (
LONG a_Flags ,
ULONG a_MaxMilliSeconds ,
IWbemContext *a_Context
)
{
HRESULT t_Result = S_OK ;
try
{
if ( ! InterlockedCompareExchange ( & m_StatusCalled , 1 , 0 ) )
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemObjectSink *t_ObjectSink = m_InterceptedSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_Result = t_ObjectSink->SetStatus (
0 ,
WBEM_E_SHUTTING_DOWN ,
NULL ,
NULL
) ;
t_ObjectSink->Release () ;
}
}
m_GateClosed ++ ;
try
{
bool t_Acquired = false ;
while ( ! t_Acquired )
{
if ( m_InProgress == 0 )
{
t_Acquired = true ;
break ;
}
if ( SwitchToThread () == FALSE )
{
}
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupledRoot_IWbemObjectSink :: SinkInitialize ()
{
HRESULT t_Result = S_OK ;
WmiStatusCode t_StatusCode = CWbemGlobal_DecoupledIWmiObjectSinkController :: Initialize () ;
if ( t_StatusCode != e_StatusCode_Success )
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupledRoot_IWbemObjectSink :: SetSink ( IWbemObjectSink *a_Sink )
{
Lock () ;
CWbemGlobal_DecoupledIWmiObjectSinkController_Container *t_Container = NULL ;
GetContainer ( t_Container ) ;
CWbemGlobal_DecoupledIWmiObjectSinkController_Container_Iterator t_Iterator = t_Container->Begin ();
while ( ! t_Iterator.Null () )
{
HRESULT t_Result = t_Iterator.GetKey ()->SetSink ( a_Sink ) ;
t_Iterator.Increment () ;
}
UnLock () ;
HRESULT t_Result = S_OK ;
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( m_InterceptedSink )
{
m_InterceptedSink->Release () ;
}
m_InterceptedSink = a_Sink ;
m_InterceptedSink->AddRef () ;
t_Result = a_Sink->QueryInterface ( IID_IWbemEventSink , ( void ** ) & m_EventSink ) ;
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupledChild_IWbemObjectSink :: SetSink ( IWbemObjectSink *a_Sink )
{
HRESULT t_Result = S_OK ;
IWbemObjectSink *t_InterceptedObjectSink = NULL ;
IWbemEventSink *t_RestrictedEventSinkObjectSink = NULL ;
if ( SUCCEEDED ( t_Result ) )
{
IWbemEventSink *t_EventSink = NULL ;
t_Result = a_Sink->QueryInterface ( IID_IWbemEventSink , ( void ** ) & t_EventSink ) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = t_EventSink->GetRestrictedSink (
m_QueryCount ,
m_Queries ,
m_Callback ,
& t_RestrictedEventSinkObjectSink
) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = t_RestrictedEventSinkObjectSink->QueryInterface ( IID_IWbemObjectSink , ( void ** ) & t_InterceptedObjectSink ) ;
if ( SUCCEEDED ( t_Result ) )
{
if ( m_SecurityDescriptor )
{
t_Result = t_RestrictedEventSinkObjectSink->SetSinkSecurity (
m_SecurityDescriptorLength ,
m_SecurityDescriptor
) ;
}
}
}
t_EventSink->Release () ;
}
}
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemObjectSink *t_TempInterceptedObjectSink = m_InterceptedSink ;
IWbemEventSink *t_TempRestrictedEventSinkObjectSink = m_EventSink ;
m_InterceptedSink = t_InterceptedObjectSink ;
m_EventSink = t_RestrictedEventSinkObjectSink ;
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_TempInterceptedObjectSink )
{
t_TempInterceptedObjectSink->Release () ;
}
if ( t_TempRestrictedEventSinkObjectSink )
{
t_TempRestrictedEventSinkObjectSink->Release () ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
#pragma warning( disable : 4355 )
CDecoupledChild_IWbemObjectSink :: CDecoupledChild_IWbemObjectSink (
CDecoupledRoot_IWbemObjectSink *a_RootSink
) : DecoupledObjectSinkContainerElement (
a_RootSink ,
this
) ,
m_RootSink ( a_RootSink )
{
m_RootSink->AddRef () ;
}
#pragma warning( default : 4355 )
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
CDecoupledChild_IWbemObjectSink :: ~CDecoupledChild_IWbemObjectSink ()
{
m_RootSink->Release () ;
if ( m_Queries )
{
for ( long t_Index = 0 ; t_Index < m_QueryCount ; t_Index ++ )
{
SysFreeString ( m_Queries [ t_Index ] ) ;
}
delete [] m_Queries ;
m_Queries = NULL ;
}
if ( m_Callback )
{
m_Callback->Release () ;
}
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_( ULONG ) CDecoupledChild_IWbemObjectSink :: AddRef ()
{
return DecoupledObjectSinkContainerElement :: AddRef () ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_( ULONG ) CDecoupledChild_IWbemObjectSink :: Release ()
{
return DecoupledObjectSinkContainerElement :: Release () ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupledChild_IWbemObjectSink :: SinkInitialize (
long a_QueryCount ,
const LPCWSTR *a_Queries ,
IUnknown *a_Callback
)
{
HRESULT t_Result = S_OK ;
if ( m_Callback )
{
m_Callback->Release () ;
}
m_Callback = a_Callback ;
if ( m_Callback )
{
m_Callback->AddRef () ;
}
if ( m_Queries )
{
for ( long t_Index = 0 ; t_Index < m_QueryCount ; t_Index ++ )
{
SysFreeString ( m_Queries [ t_Index ] ) ;
}
delete [] m_Queries ;
m_Queries = NULL ;
}
m_QueryCount = a_QueryCount ;
if ( a_Queries )
{
m_Queries = new wchar_t * [ m_QueryCount ] ;
if ( m_Queries )
{
for ( long t_Index = 0 ; t_Index < m_QueryCount ; t_Index ++ )
{
m_Queries [ t_Index ] = NULL ;
}
for ( t_Index = 0 ; t_Index < m_QueryCount ; t_Index ++ )
{
try
{
m_Queries [ t_Index ] = SysAllocString ( a_Queries [ t_Index ] ) ;
if ( m_Queries [ t_Index ] )
{
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
break ;
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
break ;
}
}
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT STDMETHODCALLTYPE CDecoupledChild_IWbemObjectSink :: GetRestrictedSink (
long a_QueryCount ,
const LPCWSTR *a_Queries ,
IUnknown *a_Callback ,
IWbemEventSink **a_Sink
)
{
return m_RootSink->GetRestrictedSink (
a_QueryCount ,
a_Queries ,
a_Callback ,
a_Sink
) ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_( ULONG ) CDecoupledRoot_IWbemObjectSink :: AddRef ()
{
ULONG t_ReferenceCount = InterlockedIncrement ( & m_ReferenceCount ) ;
return t_ReferenceCount ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_(ULONG) CDecoupledRoot_IWbemObjectSink :: Release ()
{
ULONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ;
if ( t_ReferenceCount == 0 )
{
delete this ;
return 0 ;
}
else
{
return t_ReferenceCount ;
}
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CDecoupledRoot_IWbemObjectSink :: GetRestrictedSink (
long a_QueryCount ,
const LPCWSTR *a_Queries ,
IUnknown *a_Callback ,
IWbemEventSink **a_Sink
)
{
HRESULT t_Result = S_OK ;
try
{
if ( a_Sink )
{
*a_Sink = NULL ;
}
else
{
t_Result = WBEM_E_INVALID_PARAMETER ;
}
if ( SUCCEEDED ( t_Result ) )
{
InterlockedIncrement ( & m_InProgress ) ;
try
{
if ( m_GateClosed == 1 )
{
t_Result = WBEM_E_SHUTTING_DOWN ;
}
else
{
WmiHelper :: EnterCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
IWbemEventSink *t_ObjectSink = m_EventSink ;
if ( t_ObjectSink )
{
t_ObjectSink->AddRef () ;
}
WmiHelper :: LeaveCriticalSection ( & ( CDecoupled_IWbemObjectSink :: m_CriticalSection ) ) ;
if ( t_ObjectSink )
{
t_Result = t_ObjectSink->GetRestrictedSink (
a_QueryCount ,
a_Queries ,
a_Callback ,
a_Sink
) ;
t_ObjectSink->Release () ;
}
else
{
CDecoupledChild_IWbemObjectSink *t_RestrictedSink = new CDecoupledChild_IWbemObjectSink ( this ) ;
if ( t_RestrictedSink )
{
t_RestrictedSink->AddRef () ;
t_Result = t_RestrictedSink->SinkInitialize (
a_QueryCount ,
a_Queries ,
a_Callback
) ;
if ( SUCCEEDED ( t_Result ) )
{
Lock () ;
CWbemGlobal_DecoupledIWmiObjectSinkController_Container_Iterator t_Iterator ;
WmiStatusCode t_StatusCode = Insert (
*t_RestrictedSink ,
t_Iterator
) ;
if ( t_StatusCode == e_StatusCode_Success )
{
*a_Sink = t_RestrictedSink ;
}
else
{
t_RestrictedSink->Release () ;
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
UnLock () ;
}
else
{
t_RestrictedSink->Release () ;
}
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
}
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
InterlockedDecrement ( & m_InProgress ) ;
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
CServerObject_ProviderEvents :: CServerObject_ProviderEvents (
WmiAllocator &a_Allocator
) : CServerObject_ProviderRegistrar_Base ( a_Allocator ) ,
m_Allocator ( a_Allocator ) ,
m_ReferenceCount ( 0 ) ,
m_InternalReferenceCount ( 0 ) ,
m_ObjectSink ( NULL ) ,
m_Service ( NULL ) ,
m_Provider ( NULL ),
m_SinkCriticalSection(NOTHROW_LOCK)
{
InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_CServerObject_ProviderEvents_ObjectsInProgress ) ;
InterlockedIncrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ;
WmiStatusCode t_StatusCode = WmiHelper :: InitializeCriticalSection ( & m_SinkCriticalSection ) ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
CServerObject_ProviderEvents::~CServerObject_ProviderEvents ()
{
WmiHelper :: DeleteCriticalSection ( & m_SinkCriticalSection ) ;
if ( m_Provider )
{
m_Provider->Release () ;
}
if ( m_Service )
{
m_Service->Release () ;
}
if ( m_ObjectSink )
{
m_ObjectSink->Release () ;
}
InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_CServerObject_ProviderEvents_ObjectsInProgress ) ;
InterlockedDecrement ( & DecoupledProviderSubSystem_Globals :: s_ObjectsInProgress ) ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP CServerObject_ProviderEvents::QueryInterface (
REFIID a_Riid ,
LPVOID FAR *a_Void
)
{
*a_Void = NULL ;
if ( a_Riid == IID_IUnknown )
{
*a_Void = ( LPVOID ) this ;
}
else if ( a_Riid == IID_IWbemDecoupledRegistrar )
{
*a_Void = ( LPVOID ) ( IWbemDecoupledRegistrar * ) ( CServerObject_ProviderRegistrar_Base * ) this ;
}
else if ( a_Riid == IID_IWbemDecoupledBasicEventProvider )
{
*a_Void = ( LPVOID ) ( IWbemDecoupledBasicEventProvider * ) this ;
}
if ( *a_Void )
{
( ( LPUNKNOWN ) *a_Void )->AddRef () ;
return ResultFromScode ( S_OK ) ;
}
else
{
return ResultFromScode ( E_NOINTERFACE ) ;
}
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_( ULONG ) CServerObject_ProviderEvents :: AddRef ()
{
ULONG t_ReferenceCount = InterlockedIncrement ( & m_ReferenceCount ) ;
if ( t_ReferenceCount == 1 )
{
InternalAddRef () ;
}
return t_ReferenceCount ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_(ULONG) CServerObject_ProviderEvents :: Release ()
{
ULONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ;
if ( t_ReferenceCount == 0 )
{
if ( m_Provider )
{
m_Provider->Release () ;
m_Provider = NULL ;
}
InternalRelease () ;
}
return t_ReferenceCount ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_( ULONG ) CServerObject_ProviderEvents :: InternalAddRef ()
{
return InterlockedIncrement ( & m_InternalReferenceCount ) ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
STDMETHODIMP_(ULONG) CServerObject_ProviderEvents :: InternalRelease ()
{
ULONG t_ReferenceCount = InterlockedDecrement ( & m_InternalReferenceCount ) ;
if ( t_ReferenceCount == 0 )
{
delete this ;
}
return t_ReferenceCount ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_ProviderEvents :: Register (
long a_Flags ,
IWbemContext *a_Context ,
LPCWSTR a_User ,
LPCWSTR a_Locale ,
LPCWSTR a_Scope ,
LPCWSTR a_Registration ,
IUnknown *a_Unknown
)
{
HRESULT t_Result = S_OK ;
if ( a_Scope == NULL || a_Registration == NULL )
{
return WBEM_E_INVALID_PARAMETER ;
}
try
{
WmiHelper :: EnterCriticalSection ( & m_CriticalSection ) ;
try
{
if ( m_Registered == FALSE )
{
IWbemLocator *t_Locator = NULL ;
t_Result = CoCreateInstance (
CLSID_WbemLocator ,
NULL ,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
IID_IUnknown ,
( void ** ) & t_Locator
);
if ( SUCCEEDED ( t_Result ) )
{
IWbemServices *t_Service = NULL ;
BSTR t_Namespace = SysAllocString ( a_Scope ) ;
if ( t_Namespace )
{
t_Result = t_Locator->ConnectServer (
t_Namespace ,
NULL ,
NULL,
NULL ,
0 ,
NULL,
NULL,
&t_Service
) ;
if ( SUCCEEDED ( t_Result ) )
{
m_Service = t_Service ;
}
SysFreeString ( t_Namespace ) ;
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
t_Locator->Release () ;
}
if (FAILED(t_Result) && GetModuleHandleA("wbemcore.dll"))
{
t_Result = CoCreateInstance (
CLSID_WbemAdministrativeLocator ,
NULL ,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
IID_IUnknown ,
( void ** ) & t_Locator);
if ( SUCCEEDED ( t_Result ) )
{
IWbemServices *t_Service = NULL ;
BSTR t_Namespace = SysAllocString ( a_Scope ) ;
if ( t_Namespace )
{
t_Result = t_Locator->ConnectServer (
t_Namespace ,
NULL ,
NULL,
NULL ,
0 ,
NULL,
NULL,
&t_Service
) ;
if ( SUCCEEDED ( t_Result ) )
{
m_Service = t_Service ;
}
SysFreeString ( t_Namespace ) ;
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
t_Locator->Release () ;
}
}
if ( SUCCEEDED ( t_Result ) )
{
WmiHelper :: EnterCriticalSection ( & m_SinkCriticalSection ) ;
m_ObjectSink = new CDecoupledRoot_IWbemObjectSink ( m_Allocator ) ;
if ( m_ObjectSink )
{
m_ObjectSink->AddRef () ;
t_Result = m_ObjectSink->SinkInitialize () ;
if ( SUCCEEDED ( t_Result ) )
{
}
else
{
m_ObjectSink->Release ();
m_ObjectSink = NULL ;
}
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
WmiHelper :: LeaveCriticalSection ( & m_SinkCriticalSection ) ;
}
if ( SUCCEEDED ( t_Result ) )
{
m_Provider = new CEventProvider (
m_Allocator ,
this ,
a_Unknown
) ;
if ( m_Provider )
{
m_Provider->AddRef () ;
t_Result = m_Provider->Initialize () ;
if ( SUCCEEDED ( t_Result ) )
{
IUnknown *t_Unknown = NULL ;
t_Result = m_Provider->QueryInterface ( IID_IUnknown , ( void ** ) & t_Unknown ) ;
if ( SUCCEEDED ( t_Result ) )
{
t_Result = CServerObject_ProviderRegistrar_Base :: Register (
a_Flags ,
a_Context ,
a_User ,
a_Locale ,
a_Scope ,
a_Registration ,
t_Unknown
) ;
t_Unknown->Release () ;
}
}
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
}
if ( FAILED ( t_Result ) )
{
WmiHelper :: EnterCriticalSection ( & m_SinkCriticalSection ) ;
if ( m_ObjectSink )
{
m_ObjectSink->Release () ;
m_ObjectSink = NULL ;
}
WmiHelper :: LeaveCriticalSection ( & m_SinkCriticalSection ) ;
if ( m_Provider )
{
m_Provider->Release () ;
m_Provider = NULL ;
}
if ( m_Service )
{
m_Service->Release () ;
m_Service = NULL ;
}
}
}
else
{
t_Result = WBEM_E_FAILED ;
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
WmiHelper :: LeaveCriticalSection ( & m_CriticalSection ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_ProviderEvents :: UnRegister ()
{
HRESULT t_Result = S_OK ;
try
{
WmiHelper :: EnterCriticalSection ( & m_CriticalSection ) ;
try
{
if ( m_Registered )
{
t_Result = CServerObject_ProviderRegistrar_Base :: UnRegister () ;
if ( m_Provider )
{
m_Provider->UnRegister () ;
m_Provider->Release () ;
m_Provider = NULL ;
}
if ( m_Service )
{
m_Service->Release () ;
m_Service = NULL ;
}
if ( m_ObjectSink )
{
m_ObjectSink->Release () ;
m_ObjectSink = NULL ;
}
}
else
{
t_Result = WBEM_E_PROVIDER_NOT_REGISTERED ;
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
WmiHelper :: LeaveCriticalSection ( & m_CriticalSection ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_ProviderEvents :: GetSink (
long a_Flags ,
IWbemContext *a_Context ,
IWbemObjectSink **a_Sink
)
{
HRESULT t_Result = S_OK ;
try
{
WmiHelper :: EnterCriticalSection ( & m_CriticalSection ) ;
try
{
if ( m_Registered )
{
if ( a_Sink )
{
*a_Sink = m_ObjectSink ;
m_ObjectSink->AddRef () ;
}
else
{
t_Result = WBEM_E_INVALID_PARAMETER ;
}
}
else
{
t_Result = WBEM_E_PROVIDER_NOT_REGISTERED ;
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
WmiHelper :: LeaveCriticalSection ( & m_CriticalSection ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}
/******************************************************************************
*
* Name:
*
*
* Description:
*
*
*****************************************************************************/
HRESULT CServerObject_ProviderEvents :: GetService (
long a_Flags ,
IWbemContext *a_Context ,
IWbemServices **a_Service
)
{
HRESULT t_Result = S_OK ;
try
{
WmiHelper :: EnterCriticalSection ( & m_CriticalSection ) ;
try
{
if ( m_Registered )
{
if ( a_Service )
{
*a_Service = m_Service ;
m_Service->AddRef () ;
}
else
{
t_Result = WBEM_E_INVALID_PARAMETER ;
}
}
else
{
t_Result = WBEM_E_PROVIDER_NOT_REGISTERED ;
}
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
WmiHelper :: LeaveCriticalSection ( & m_CriticalSection ) ;
}
catch ( ... )
{
t_Result = WBEM_E_CRITICAL_ERROR ;
}
return t_Result ;
}