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.
2413 lines
56 KiB
2413 lines
56 KiB
/*++
|
|
|
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
XXXX
|
|
|
|
Abstract:
|
|
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include <wbemint.h>
|
|
#include <wmiutils.h>
|
|
#include <strsafe.h>
|
|
#include "Globals.h"
|
|
#include "ProvRegDeCoupled.h"
|
|
#include "CGlobals.h"
|
|
#include "provcache.h"
|
|
#include "aggregator.h"
|
|
#include "ProvWsvS.h"
|
|
#include "ProvWsv.h"
|
|
#include "ProvInSk.h"
|
|
#include "ProvobSk.h"
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
DCProxyAggr :: DCProxyAggr ( ) :
|
|
m_ReferenceCount ( 0 ) ,
|
|
m_UnRegistered( -1 ),
|
|
m_Allocator ( *DecoupledProviderSubSystem_Globals :: s_Allocator ),
|
|
CWbemGlobal_IWmiObjectSinkController ( *DecoupledProviderSubSystem_Globals :: s_Allocator ),
|
|
m_Sink(NULL),
|
|
initialized_(false),
|
|
m_Controller(0),
|
|
m_CriticalSection(NOTHROW_LOCK)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
DCProxyAggr :: ~DCProxyAggr ()
|
|
{
|
|
#ifdef _DBG
|
|
if (m_UnRegistered != -1) DebugBreak();
|
|
#endif
|
|
|
|
CWbemGlobal_IWmiObjectSinkController :: UnInitialize () ;
|
|
|
|
if ( m_Controller )
|
|
{
|
|
CWbemGlobal_IWbemSyncProvider_Container *t_Container = NULL ;
|
|
m_Controller->GetContainer ( t_Container ) ;
|
|
|
|
m_Controller->Lock () ;
|
|
|
|
CWbemGlobal_IWbemSyncProvider_Container_Iterator t_Iterator = t_Container->Begin () ;
|
|
while ( ! t_Iterator.Null () )
|
|
{
|
|
SyncProviderContainerElement *t_Element = t_Iterator.GetElement () ;
|
|
|
|
t_Container->Delete ( t_Element->GetKey () ) ;
|
|
|
|
m_Controller->UnLock () ;
|
|
|
|
t_Element->Release () ;
|
|
|
|
m_Controller->Lock () ;
|
|
|
|
t_Iterator = t_Container->Begin () ;
|
|
}
|
|
|
|
m_Controller->UnLock () ;
|
|
|
|
m_Controller->UnInitialize () ;
|
|
|
|
m_Controller->Release () ;
|
|
|
|
}
|
|
}
|
|
|
|
void DCProxyAggr::activate()
|
|
{
|
|
LONG registerCount = InterlockedIncrement(&m_UnRegistered);
|
|
if (registerCount == 0) // is the first aggregator
|
|
{
|
|
const DC_DBkey key( m_User, m_Locale, m_Namespace, m_ProviderName);
|
|
DC_registrar::instance()->RegisterAggregator(key, auto_ref<DCProxyAggr>(this));
|
|
}
|
|
};
|
|
|
|
void DCProxyAggr::deActivate()
|
|
{
|
|
LONG registerCount = InterlockedDecrement(&m_UnRegistered);
|
|
if ( registerCount < 0 ) DC_registrar::instance()->UnRegisterAggregator (auto_ref<DCProxyAggr>(this));
|
|
};
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
STDMETHODIMP_(ULONG) DCProxyAggr :: AddRef ( void )
|
|
{
|
|
return InterlockedIncrement(&m_ReferenceCount) ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
STDMETHODIMP_(ULONG) DCProxyAggr :: Release ( void )
|
|
{
|
|
LONG t_Reference = InterlockedDecrement(&m_ReferenceCount);
|
|
|
|
if ( 0 == t_Reference )
|
|
{
|
|
delete this ;
|
|
return 0 ;
|
|
}
|
|
else
|
|
{
|
|
return t_Reference ;
|
|
}
|
|
}
|
|
|
|
// IWbemServices
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class TInterface, const IID *TInterface_Id>
|
|
HRESULT GetProviders (
|
|
|
|
IWbemContext *a_Context ,
|
|
CWbemGlobal_IWbemSyncProviderController *a_Controller ,
|
|
TInterface **&a_Elements ,
|
|
ULONG &a_ElementCount ,
|
|
ULONG &a_ContainerCount
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
CWbemGlobal_IWbemSyncProvider_Container *t_Container = NULL ;
|
|
WmiStatusCode t_StatusCode = a_Controller->GetContainer ( t_Container ) ;
|
|
|
|
a_Controller->Lock () ;
|
|
|
|
a_ContainerCount = t_Container->Size () ;
|
|
|
|
a_Elements = new TInterface * [ t_Container->Size () ] ;
|
|
if ( a_Elements )
|
|
{
|
|
CWbemGlobal_IWbemSyncProvider_Container_Iterator t_Iterator = t_Container->Begin () ;
|
|
|
|
a_ElementCount = 0 ;
|
|
|
|
while ( ! t_Iterator.Null () )
|
|
{
|
|
SyncProviderContainerElement *t_Element = t_Iterator.GetElement () ;
|
|
|
|
a_Elements [ a_ElementCount ] = NULL ;
|
|
|
|
_IWmiProviderInitialize *t_Initializer = NULL ;
|
|
|
|
t_Result = t_Element->QueryInterface (
|
|
|
|
IID__IWmiProviderInitialize ,
|
|
( void ** ) & t_Initializer
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_Initializer->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
HRESULT t_Result = t_Element->QueryInterface ( *TInterface_Id , ( void ** ) & a_Elements [ a_ElementCount ] ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_ElementCount ++ ;
|
|
}
|
|
}
|
|
|
|
t_Initializer->Release () ;
|
|
}
|
|
|
|
t_Iterator.Increment () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
a_Controller->UnLock () ;
|
|
|
|
return t_Result ;
|
|
}
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class TInterface >
|
|
HRESULT GetProviders (
|
|
|
|
CWbemGlobal_IWbemSyncProviderController *a_Controller ,
|
|
TInterface **&a_Elements ,
|
|
ULONG &a_ElementCount
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
CWbemGlobal_IWbemSyncProvider_Container *t_Container = NULL ;
|
|
WmiStatusCode t_StatusCode = a_Controller->GetContainer ( t_Container ) ;
|
|
|
|
a_Controller->Lock () ;
|
|
|
|
a_Elements = new TInterface * [ t_Container->Size () ] ;
|
|
if ( a_Elements )
|
|
{
|
|
CWbemGlobal_IWbemSyncProvider_Container_Iterator t_Iterator = t_Container->Begin () ;
|
|
|
|
a_ElementCount = 0 ;
|
|
|
|
while ( ! t_Iterator.Null () )
|
|
{
|
|
SyncProviderContainerElement *t_Element = t_Iterator.GetElement () ;
|
|
|
|
a_Elements [ a_ElementCount ] = NULL ;
|
|
|
|
HRESULT t_TempResult = t_Element->QueryInterface ( __uuidof(TInterface) , ( void ** ) & a_Elements [ a_ElementCount ] ) ;
|
|
if ( SUCCEEDED ( t_TempResult ) )
|
|
{
|
|
a_ElementCount ++ ;
|
|
}
|
|
|
|
t_Iterator.Increment () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
a_Controller->UnLock () ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class TInterface>
|
|
HRESULT ClearProviders (
|
|
|
|
TInterface **a_Elements ,
|
|
ULONG a_ElementCount
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
for ( ULONG t_Index = 0 ; t_Index < a_ElementCount ; t_Index ++ )
|
|
{
|
|
a_Elements [ t_Index ]->Release () ;
|
|
}
|
|
|
|
delete [] a_Elements ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
|
|
HRESULT DCProxyAggr :: Initialize (
|
|
|
|
LPWSTR a_User,
|
|
LONG a_Flags,
|
|
LPWSTR a_Namespace,
|
|
LPWSTR a_Locale,
|
|
LPWSTR a_ProviderName,
|
|
IWbemServices *a_CoreService, // For anybody
|
|
IWbemContext *a_Context,
|
|
IWbemProviderInitSink *a_Sink // For init signals
|
|
)
|
|
{
|
|
if ( initialized() )
|
|
return a_Sink->SetStatus ( WBEM_S_NO_ERROR , 0 ) ;
|
|
|
|
|
|
if( !a_Sink)
|
|
return WBEM_E_INVALID_PARAMETER;
|
|
|
|
if(!a_CoreService )
|
|
return a_Sink->SetStatus ( WBEM_E_INVALID_PARAMETER , 0 ) ;
|
|
|
|
m_context = a_Context;
|
|
|
|
if (m_context == 0) // Create a default context or the test provider will fail !
|
|
m_context.CreateInstance(CLSID_WbemContext);
|
|
if (m_context == 0)
|
|
return a_Sink->SetStatus ( WBEM_E_OUT_OF_MEMORY , 0 ) ;
|
|
|
|
m_CoreService = a_CoreService;
|
|
m_Flags = a_Flags;
|
|
|
|
|
|
|
|
try{
|
|
m_User = a_User;
|
|
m_Locale = a_Locale;
|
|
m_Namespace = a_Namespace;
|
|
m_ProviderName = a_ProviderName;
|
|
}
|
|
catch( _com_error& err){
|
|
return a_Sink->SetStatus ( WBEM_E_OUT_OF_MEMORY , 0 ) ;
|
|
|
|
}
|
|
|
|
HRESULT t_Result = S_OK ;
|
|
WmiStatusCode t_StatusCode = CWbemGlobal_IWmiObjectSinkController :: Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
|
|
t_Result = m_NamespacePath.CreateInstance(CLSID_WbemDefPath, NULL, CLSCTX_INPROC_SERVER);
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = m_NamespacePath->SetText ( WBEMPATH_TREAT_SINGLE_IDENT_AS_NS | WBEMPATH_CREATE_ACCEPT_ALL , a_Namespace ) ;
|
|
}
|
|
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
m_Controller = new CWbemGlobal_IWbemSyncProviderController ( m_Allocator ) ;
|
|
if ( m_Controller )
|
|
{
|
|
m_Controller->AddRef () ;
|
|
|
|
t_StatusCode = m_Controller->Initialize () ;
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
LoadAll();
|
|
|
|
a_Sink->SetStatus ( t_Result , 0 ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr :: CreateSyncProvider (
|
|
|
|
IUnknown *a_ServerSideProvider ,
|
|
IWbemServices *a_Stub ,
|
|
wchar_t *a_NamespacePath ,
|
|
LONG a_Flags ,
|
|
IWbemContext *a_Context ,
|
|
LPCWSTR a_User ,
|
|
LPCWSTR a_Locale ,
|
|
LPCWSTR a_Scope ,
|
|
CServerObject_ProviderRegistrationV1 &a_Registration ,
|
|
GUID a_Identity ,
|
|
CInterceptor_IWbemDecoupledProvider *&a_Interceptor
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
CInterceptor_IWbemDecoupledProvider *t_Interceptor = new CInterceptor_IWbemDecoupledProvider (
|
|
|
|
m_Allocator ,
|
|
a_ServerSideProvider ,
|
|
a_Stub ,
|
|
m_Controller ,
|
|
a_Context ,
|
|
a_Registration ,
|
|
a_Identity
|
|
) ;
|
|
|
|
if ( t_Interceptor )
|
|
{
|
|
/*
|
|
* One for the cache
|
|
*/
|
|
t_Interceptor->AddRef () ;
|
|
|
|
_IWmiProviderInitialize *t_InterceptorInit = NULL ;
|
|
|
|
t_Result = t_Interceptor->QueryInterface ( IID__IWmiProviderInitialize , ( void ** ) & t_InterceptorInit ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
CServerObject_ProviderInitSink *t_ProviderInitSink = new CServerObject_ProviderInitSink ;
|
|
if ( t_ProviderInitSink )
|
|
{
|
|
t_ProviderInitSink->AddRef () ;
|
|
|
|
t_Result = t_ProviderInitSink->SinkInitialize () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
CInterceptor_IWbemProviderInitSink *t_Sink = new CInterceptor_IWbemProviderInitSink ( t_ProviderInitSink ) ;
|
|
if ( t_Sink )
|
|
{
|
|
t_Sink->AddRef () ;
|
|
|
|
t_Result = t_InterceptorInit->Initialize (
|
|
|
|
0 ,
|
|
a_Context ,
|
|
NULL ,
|
|
a_Registration.GetComRegistration ().PerUserInitialization () ? ( BSTR ) a_User : NULL ,
|
|
a_Registration.GetComRegistration ().PerLocaleInitialization () ? ( BSTR ) a_Locale : NULL ,
|
|
a_NamespacePath ,
|
|
NULL ,
|
|
NULL ,
|
|
t_Sink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_ProviderInitSink->Wait () ;
|
|
t_Result = t_ProviderInitSink->GetResult () ;
|
|
}
|
|
|
|
t_Sink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
t_ProviderInitSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
t_InterceptorInit->Release () ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Interceptor->AddRef () ;
|
|
|
|
CWbemGlobal_IWbemSyncProvider_Container_Iterator t_Iterator ;
|
|
|
|
WmiStatusCode t_StatusCode = m_Controller->Insert (
|
|
|
|
*t_Interceptor ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
m_Controller->UnLock () ;
|
|
}
|
|
else
|
|
{
|
|
m_Controller->UnLock () ;
|
|
}
|
|
|
|
t_Interceptor->SetInitialized ( t_Result ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
a_Interceptor = t_Interceptor ;
|
|
}
|
|
else
|
|
{
|
|
t_Interceptor->Release () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_Controller->UnLock () ;
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT
|
|
DCProxyAggr :: Register ( DC_reg& reg, bool validate )
|
|
{
|
|
DC_DBkey key( m_User, m_Locale, m_Namespace, m_ProviderName);
|
|
|
|
if( !key.equal(reg) )
|
|
return S_OK;
|
|
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
// Check the client pointer
|
|
IUnknown * pUnk = reg.service();
|
|
if (pUnk == 0)
|
|
return WBEM_E_PROVIDER_FAILURE;
|
|
|
|
try
|
|
{
|
|
CServerObject_ProviderRegistrationV1 *t_Registration = new CServerObject_ProviderRegistrationV1 ;
|
|
|
|
if ( t_Registration )
|
|
{
|
|
t_Registration->AddRef () ;
|
|
|
|
t_Result = t_Registration->SetContext (
|
|
|
|
m_context ,
|
|
m_NamespacePath ,
|
|
m_CoreService
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_Registration->Load (
|
|
|
|
e_All ,
|
|
m_NamespacePath ,
|
|
reg.GetProvider()
|
|
) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if (validate)
|
|
{
|
|
t_Result = OS::CoImpersonateClient();
|
|
if (SUCCEEDED(t_Result))
|
|
{
|
|
t_Result = ProviderSubSystem_Common_Globals::ValidateClientSecurity (*t_Registration);
|
|
CoRevertToSelf();
|
|
}
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
m_Controller->Lock () ;
|
|
|
|
CWbemGlobal_IWbemSyncProvider_Container_Iterator t_Iterator ;
|
|
|
|
WmiStatusCode t_StatusCode = m_Controller->Find ( reg.identity() , t_Iterator ) ;
|
|
|
|
|
|
if ( t_StatusCode != e_StatusCode_Success )
|
|
{
|
|
CInterceptor_IWbemServices_Stub *t_Stub = new CInterceptor_IWbemServices_Stub ( m_Allocator , m_CoreService.GetInterfacePtr() ) ;
|
|
|
|
CInterceptor_IWbemDecoupledProvider * t_Provider = NULL;
|
|
if ( t_Stub )
|
|
{
|
|
t_Stub->AddRef () ;
|
|
|
|
|
|
CInterceptor_IWbemDecoupledProvider *t_Interceptor = NULL ;
|
|
|
|
|
|
t_Result = CreateSyncProvider (
|
|
|
|
pUnk ,
|
|
t_Stub ,
|
|
reg.GetScope() ,
|
|
0 ,
|
|
m_context ,
|
|
reg.GetUser() ,
|
|
reg.GetLocale() ,
|
|
NULL ,
|
|
*t_Registration ,
|
|
reg.identity(),
|
|
t_Interceptor
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IUnknown *t_Unknown = NULL ;
|
|
t_Result = t_Interceptor->QueryInterface ( IID_IUnknown , ( void ** ) & t_Unknown ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
|
|
t_Result = InitializeProvider (
|
|
|
|
t_Unknown ,
|
|
t_Stub ,
|
|
reg.GetScope() ,
|
|
m_Flags ,
|
|
m_context ,
|
|
reg.GetUser() ,
|
|
reg.GetLocale() ,
|
|
NULL ,
|
|
*t_Registration
|
|
) ;
|
|
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( m_Sink )
|
|
{
|
|
IWbemEventProvider *t_EvProvider = NULL ;
|
|
|
|
t_Result = t_Unknown->QueryInterface ( IID_IWbemEventProvider , ( void ** ) & t_EvProvider ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_EvProvider->ProvideEvents ( (IWbemObjectSink *)m_Sink , 0 ) ;
|
|
|
|
t_EvProvider->Release () ;
|
|
}
|
|
|
|
m_Sink->SetStatus (
|
|
|
|
WBEM_STATUS_REQUIREMENTS,
|
|
WBEM_REQUIREMENTS_RECHECK_SUBSCRIPTIONS,
|
|
NULL,
|
|
NULL
|
|
) ;
|
|
}
|
|
}
|
|
|
|
t_Unknown->Release () ;
|
|
}
|
|
|
|
t_Interceptor->Release () ;
|
|
}
|
|
|
|
t_Stub->Release () ;
|
|
}
|
|
else
|
|
{
|
|
m_Controller->UnLock () ;
|
|
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SyncProviderContainerElement *t_Element = t_Iterator.GetElement () ;
|
|
|
|
m_Controller->UnLock () ;
|
|
|
|
t_Element->Release () ;
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
t_Registration->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
t_Result = WBEM_E_PROVIDER_FAILURE ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT
|
|
DCProxyAggr :: UnRegister ( GUID a_Identity )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
try
|
|
{
|
|
CWbemGlobal_IWbemSyncProvider_Container_Iterator t_Iterator ;
|
|
|
|
IWbemShutdown *t_Shutdown = NULL ;
|
|
|
|
m_Controller->Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = m_Controller->Find ( a_Identity , t_Iterator ) ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
SyncProviderContainerElement *t_Element = t_Iterator.GetElement () ;
|
|
|
|
t_Result = t_Element->QueryInterface ( IID_IWbemShutdown , ( void ** ) & t_Shutdown ) ;
|
|
|
|
m_Controller->Delete ( a_Identity ) ;
|
|
|
|
m_Controller->UnLock () ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) && t_Shutdown )
|
|
{
|
|
t_Result = t_Shutdown->Shutdown (
|
|
|
|
0 ,
|
|
0 ,
|
|
NULL
|
|
) ;
|
|
|
|
t_Shutdown->Release () ;
|
|
}
|
|
|
|
/*
|
|
* One for the find.
|
|
*/
|
|
|
|
t_Element->Release () ;
|
|
|
|
/*
|
|
* Removed reference due the cache.
|
|
*/
|
|
|
|
t_Element->Release () ;
|
|
}
|
|
else
|
|
{
|
|
m_Controller->UnLock () ;
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
t_Result = WBEM_E_PROVIDER_FAILURE ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT
|
|
DCProxyAggr :: UnRegister ( const CInterceptor_IWbemDecoupledProvider& provider )
|
|
{
|
|
CInterceptor_IWbemDecoupledProvider& prov = const_cast<CInterceptor_IWbemDecoupledProvider&>(provider);
|
|
return UnRegister(prov.GetKey());
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT
|
|
DCProxyAggr :: InitializeProvider (
|
|
IUnknown *a_Unknown ,
|
|
IWbemServices *a_Stub ,
|
|
wchar_t *a_NamespacePath ,
|
|
LONG a_Flags ,
|
|
IWbemContext *a_Context ,
|
|
LPCWSTR a_User ,
|
|
LPCWSTR a_Locale ,
|
|
LPCWSTR a_Scope ,
|
|
CServerObject_ProviderRegistrationV1 &a_Registration
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
IWbemProviderInit *t_ProviderInit = NULL ;
|
|
t_Result = a_Unknown->QueryInterface ( IID_IWbemProviderInit , ( void ** ) & t_ProviderInit ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
CServerObject_ProviderInitSink *t_ProviderInitSink = new CServerObject_ProviderInitSink ;
|
|
|
|
if ( t_ProviderInitSink )
|
|
{
|
|
t_ProviderInitSink->AddRef () ;
|
|
|
|
t_Result = t_ProviderInitSink->SinkInitialize (a_Registration.GetComRegistration ().GetSecurityDescriptor ()) ;
|
|
|
|
CInterceptor_IWbemProviderInitSink *t_Sink = new CInterceptor_IWbemProviderInitSink ( t_ProviderInitSink ) ;
|
|
if ( t_Sink )
|
|
{
|
|
t_Sink->AddRef () ;
|
|
|
|
try
|
|
{
|
|
BOOL t_Impersonating = FALSE ;
|
|
IUnknown *t_OldContext = NULL ;
|
|
IServerSecurity *t_OldSecurity = NULL ;
|
|
|
|
t_Result = DecoupledProviderSubSystem_Globals :: BeginImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_ProviderInit->Initialize (
|
|
|
|
a_Registration.GetComRegistration ().PerUserInitialization () ? ( const BSTR ) a_User : NULL ,
|
|
0 ,
|
|
( const BSTR ) a_NamespacePath ,
|
|
a_Registration.GetComRegistration ().PerLocaleInitialization () ? ( const BSTR ) a_Locale : NULL ,
|
|
a_Stub ,
|
|
a_Context ,
|
|
t_Sink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_ProviderInitSink->Wait () ;
|
|
t_Result = t_ProviderInitSink->GetResult () ;
|
|
}
|
|
|
|
DecoupledProviderSubSystem_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ;
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
t_Result = WBEM_E_PROVIDER_FAILURE ;
|
|
}
|
|
|
|
t_Sink->Release();
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
t_ProviderInitSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
t_ProviderInit->Release () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
HRESULT DCProxyAggr :: GetObjectAsync (
|
|
|
|
const BSTR a_ObjectPath,
|
|
long a_Flags,
|
|
IWbemContext *a_Context,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
BOOL t_ObjectGot = FALSE ;
|
|
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
HRESULT t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
CInterceptor_IWbemWaitingObjectSink *t_GettingSink = new CInterceptor_IWbemWaitingObjectSink (
|
|
m_Allocator ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_GettingSink )
|
|
{
|
|
t_GettingSink->AddRef () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_GettingSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->GetObjectAsync (
|
|
|
|
a_ObjectPath ,
|
|
0 ,
|
|
a_Context,
|
|
t_GettingSink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_GettingSink->Wait ( INFINITE ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_GettingSink->GetResult () ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_ObjectGot = TRUE ;
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiQueue <IWbemClassObject *,8> &t_Queue = t_GettingSink->GetQueue () ;
|
|
|
|
IWbemClassObject *t_Object = NULL ;
|
|
while ( ( t_StatusCode = t_Queue.Top ( t_Object ) ) == e_StatusCode_Success )
|
|
{
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = a_Sink->Indicate ( 1 , & t_Object ) ;
|
|
}
|
|
|
|
t_Object->Release () ;
|
|
t_StatusCode = t_Queue.DeQueue () ;
|
|
}
|
|
|
|
t_GettingSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_ObjectGot == FALSE )
|
|
{
|
|
t_Result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
}
|
|
|
|
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr :: PutClassAsync (
|
|
|
|
IWbemClassObject *a_Object,
|
|
long a_Flags,
|
|
IWbemContext *a_Context,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
BOOL t_ClassPut = FALSE ;
|
|
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
HRESULT t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
CInterceptor_IWbemWaitingObjectSink *t_ClassPuttingSink = new CInterceptor_IWbemWaitingObjectSink (
|
|
|
|
m_Allocator ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_ClassPuttingSink )
|
|
{
|
|
t_ClassPuttingSink->AddRef () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_ClassPuttingSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->PutClassAsync (
|
|
|
|
a_Object ,
|
|
a_Flags & ~WBEM_FLAG_USE_AMENDED_QUALIFIERS ,
|
|
a_Context,
|
|
t_ClassPuttingSink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_ClassPuttingSink->Wait ( INFINITE ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( SUCCEEDED ( t_ClassPuttingSink->GetResult () ) )
|
|
{
|
|
t_ClassPut = TRUE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiQueue <IWbemClassObject *,8> &t_Queue = t_ClassPuttingSink->GetQueue () ;
|
|
|
|
IWbemClassObject *t_Object = NULL ;
|
|
while ( ( t_StatusCode = t_Queue.Top ( t_Object ) ) == e_StatusCode_Success )
|
|
{
|
|
t_Object->Release () ;
|
|
t_StatusCode = t_Queue.DeQueue () ;
|
|
}
|
|
|
|
t_ClassPuttingSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_ClassPut == FALSE )
|
|
{
|
|
t_Result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
}
|
|
|
|
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr :: DeleteClassAsync (
|
|
|
|
const BSTR a_Class,
|
|
long a_Flags,
|
|
IWbemContext *a_Context,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
BOOL t_ClassDeleted = FALSE ;
|
|
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
HRESULT t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
CInterceptor_IWbemWaitingObjectSink *t_ClassDeletingSink = new CInterceptor_IWbemWaitingObjectSink (
|
|
|
|
m_Allocator ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_ClassDeletingSink )
|
|
{
|
|
t_ClassDeletingSink->AddRef () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_ClassDeletingSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->DeleteClassAsync (
|
|
|
|
a_Class ,
|
|
a_Flags & ~WBEM_FLAG_USE_AMENDED_QUALIFIERS ,
|
|
a_Context,
|
|
t_ClassDeletingSink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_ClassDeletingSink->Wait ( INFINITE ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( SUCCEEDED ( t_ClassDeletingSink->GetResult () ) )
|
|
{
|
|
t_ClassDeleted = TRUE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiQueue <IWbemClassObject *,8> &t_Queue = t_ClassDeletingSink->GetQueue () ;
|
|
|
|
IWbemClassObject *t_Object = NULL ;
|
|
while ( ( t_StatusCode = t_Queue.Top ( t_Object ) ) == e_StatusCode_Success )
|
|
{
|
|
t_Object->Release () ;
|
|
t_StatusCode = t_Queue.DeQueue () ;
|
|
}
|
|
|
|
t_ClassDeletingSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_ClassDeleted == FALSE )
|
|
{
|
|
t_Result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
}
|
|
|
|
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
SCODE DCProxyAggr :: CreateClassEnumAsync (
|
|
|
|
const BSTR a_Superclass ,
|
|
long a_Flags,
|
|
IWbemContext *a_Context,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
CInterceptor_DecoupledIWbemCombiningObjectSink *t_CombiningSink = new CInterceptor_DecoupledIWbemCombiningObjectSink (
|
|
|
|
m_Allocator ,
|
|
a_Sink ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_CombiningSink )
|
|
{
|
|
t_CombiningSink->AddRef () ;
|
|
|
|
t_CombiningSink->Suspend () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_CombiningSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_ProviderFound = FALSE ;
|
|
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
CInterceptor_DecoupledIWbemObjectSink *t_Sink = new CInterceptor_DecoupledIWbemObjectSink (
|
|
|
|
t_CombiningSink ,
|
|
( IWbemObjectSink * ) t_CombiningSink ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) t_CombiningSink
|
|
) ;
|
|
|
|
if ( t_Sink )
|
|
{
|
|
t_Sink->AddRef () ;
|
|
|
|
t_Result = t_CombiningSink->EnQueue ( t_Sink ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->CreateClassEnumAsync (
|
|
|
|
a_Superclass ,
|
|
a_Flags,
|
|
a_Context,
|
|
t_Sink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
t_Sink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) && t_ElementsCount )
|
|
{
|
|
t_CombiningSink->Resume () ;
|
|
|
|
t_Result = t_CombiningSink->Wait ( INFINITE ) ;
|
|
}
|
|
else
|
|
{
|
|
a_Sink->SetStatus ( 0 , S_OK , NULL , NULL ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
t_CombiningSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr :: PutInstanceAsync (
|
|
|
|
IWbemClassObject *a_Instance,
|
|
long a_Flags ,
|
|
IWbemContext *a_Context ,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
|
|
BOOL t_InstancePut = FALSE ;
|
|
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
HRESULT t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
CInterceptor_IWbemWaitingObjectSink *t_InstancePuttingSink = new CInterceptor_IWbemWaitingObjectSink (
|
|
|
|
m_Allocator ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_InstancePuttingSink )
|
|
{
|
|
t_InstancePuttingSink->AddRef () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_InstancePuttingSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->PutInstanceAsync (
|
|
|
|
a_Instance ,
|
|
a_Flags & ~WBEM_FLAG_USE_AMENDED_QUALIFIERS ,
|
|
a_Context,
|
|
t_InstancePuttingSink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_InstancePuttingSink->Wait ( INFINITE ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( SUCCEEDED ( t_InstancePuttingSink->GetResult () ) )
|
|
{
|
|
t_InstancePut = TRUE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiQueue <IWbemClassObject *,8> &t_Queue = t_InstancePuttingSink->GetQueue () ;
|
|
|
|
IWbemClassObject *t_Object = NULL ;
|
|
while ( ( t_StatusCode = t_Queue.Top ( t_Object ) ) == e_StatusCode_Success )
|
|
{
|
|
t_Object->Release () ;
|
|
t_StatusCode = t_Queue.DeQueue () ;
|
|
}
|
|
|
|
t_InstancePuttingSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_InstancePut == FALSE )
|
|
{
|
|
t_Result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
}
|
|
|
|
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr :: DeleteInstanceAsync (
|
|
|
|
const BSTR a_ObjectPath,
|
|
long a_Flags,
|
|
IWbemContext *a_Context,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
BOOL t_InstanceDeleted = FALSE ;
|
|
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
HRESULT t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
CInterceptor_IWbemWaitingObjectSink *t_InstanceDeletingSink = new CInterceptor_IWbemWaitingObjectSink (
|
|
|
|
m_Allocator ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_InstanceDeletingSink )
|
|
{
|
|
t_InstanceDeletingSink->AddRef () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_InstanceDeletingSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->DeleteInstanceAsync (
|
|
|
|
a_ObjectPath ,
|
|
a_Flags & ~WBEM_FLAG_USE_AMENDED_QUALIFIERS ,
|
|
a_Context,
|
|
t_InstanceDeletingSink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_InstanceDeletingSink->Wait ( INFINITE ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( SUCCEEDED ( t_InstanceDeletingSink->GetResult () ) )
|
|
{
|
|
t_InstanceDeleted = TRUE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) )
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiQueue <IWbemClassObject *,8> &t_Queue = t_InstanceDeletingSink->GetQueue () ;
|
|
|
|
IWbemClassObject *t_Object = NULL ;
|
|
while ( ( t_StatusCode = t_Queue.Top ( t_Object ) ) == e_StatusCode_Success )
|
|
{
|
|
t_Object->Release () ;
|
|
t_StatusCode = t_Queue.DeQueue () ;
|
|
}
|
|
|
|
t_InstanceDeletingSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_InstanceDeleted == FALSE )
|
|
{
|
|
t_Result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
}
|
|
|
|
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr :: CreateInstanceEnumAsync (
|
|
|
|
const BSTR a_Class ,
|
|
long a_Flags ,
|
|
IWbemContext *a_Context ,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
CInterceptor_DecoupledIWbemCombiningObjectSink *t_CombiningSink = new CInterceptor_DecoupledIWbemCombiningObjectSink (
|
|
|
|
m_Allocator ,
|
|
a_Sink ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_CombiningSink )
|
|
{
|
|
t_CombiningSink->AddRef () ;
|
|
|
|
t_CombiningSink->Suspend () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_CombiningSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_ProviderFound = FALSE ;
|
|
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
CInterceptor_DecoupledIWbemObjectSink *t_Sink = new CInterceptor_DecoupledIWbemObjectSink (
|
|
|
|
t_CombiningSink ,
|
|
( IWbemObjectSink * ) t_CombiningSink ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) t_CombiningSink
|
|
) ;
|
|
|
|
|
|
if ( t_Sink )
|
|
{
|
|
t_Sink->AddRef () ;
|
|
|
|
t_Result = t_CombiningSink->EnQueue ( t_Sink ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->CreateInstanceEnumAsync (
|
|
|
|
a_Class,
|
|
a_Flags,
|
|
a_Context,
|
|
t_Sink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
t_Sink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) && t_ElementsCount )
|
|
{
|
|
t_CombiningSink->Resume () ;
|
|
|
|
t_Result = t_CombiningSink->Wait ( INFINITE ) ;
|
|
}
|
|
else
|
|
{
|
|
a_Sink->SetStatus ( 0 , S_OK , NULL , NULL ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
t_CombiningSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr :: ExecQueryAsync (
|
|
|
|
const BSTR a_QueryLanguage,
|
|
const BSTR a_Query,
|
|
long a_Flags,
|
|
IWbemContext *a_Context,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
CInterceptor_DecoupledIWbemCombiningObjectSink *t_CombiningSink = new CInterceptor_DecoupledIWbemCombiningObjectSink (
|
|
|
|
m_Allocator ,
|
|
a_Sink ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_CombiningSink )
|
|
{
|
|
t_CombiningSink->AddRef () ;
|
|
|
|
t_CombiningSink->Suspend () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_CombiningSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
BOOL t_ProviderFound = FALSE ;
|
|
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
CInterceptor_DecoupledIWbemObjectSink *t_Sink = new CInterceptor_DecoupledIWbemObjectSink (
|
|
|
|
t_CombiningSink ,
|
|
( IWbemObjectSink * ) t_CombiningSink ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) t_CombiningSink
|
|
) ;
|
|
|
|
if ( t_Sink )
|
|
{
|
|
t_Sink->AddRef () ;
|
|
|
|
t_Result = t_CombiningSink->EnQueue ( t_Sink ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->ExecQueryAsync (
|
|
|
|
a_QueryLanguage,
|
|
a_Query,
|
|
a_Flags,
|
|
a_Context,
|
|
t_Sink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
t_Sink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) && t_ElementsCount )
|
|
{
|
|
t_CombiningSink->Resume () ;
|
|
|
|
t_Result = t_CombiningSink->Wait ( INFINITE ) ;
|
|
}
|
|
else
|
|
{
|
|
a_Sink->SetStatus ( 0 , S_OK , NULL , NULL ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
t_CombiningSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr :: ExecMethodAsync (
|
|
|
|
const BSTR a_ObjectPath,
|
|
const BSTR a_MethodName,
|
|
long a_Flags,
|
|
IWbemContext *a_Context,
|
|
IWbemClassObject *a_InParams,
|
|
IWbemObjectSink *a_Sink
|
|
)
|
|
{
|
|
|
|
BOOL t_MethodCalled = FALSE ;
|
|
|
|
IWbemServices **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
HRESULT t_Result = GetProviders <IWbemServices> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) && !t_MethodCalled ; t_Index ++ )
|
|
{
|
|
CInterceptor_IWbemWaitingObjectSink *t_MethodSink = new CInterceptor_IWbemWaitingObjectSink (
|
|
|
|
m_Allocator ,
|
|
( CWbemGlobal_IWmiObjectSinkController * ) this
|
|
) ;
|
|
|
|
if ( t_MethodSink )
|
|
{
|
|
t_MethodSink->AddRef () ;
|
|
|
|
CWbemGlobal_IWmiObjectSinkController_Container_Iterator t_Iterator ;
|
|
|
|
Lock () ;
|
|
|
|
WmiStatusCode t_StatusCode = Insert (
|
|
|
|
*t_MethodSink ,
|
|
t_Iterator
|
|
) ;
|
|
|
|
UnLock () ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
IWbemServices *t_Provider = t_Elements [ t_Index ] ;
|
|
|
|
t_Result = t_Provider->ExecMethodAsync (
|
|
|
|
a_ObjectPath,
|
|
a_MethodName,
|
|
a_Flags & ~WBEM_FLAG_USE_AMENDED_QUALIFIERS ,
|
|
a_Context,
|
|
a_InParams,
|
|
t_MethodSink
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = t_MethodSink->Wait ( INFINITE ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( SUCCEEDED ( t_MethodSink->GetResult () ) )
|
|
{
|
|
t_MethodCalled = TRUE ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_Result == WBEM_E_NOT_FOUND || t_Result == WBEM_E_INVALID_CLASS )
|
|
{
|
|
t_Result = S_OK ;
|
|
}
|
|
else if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Provider);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
WmiQueue <IWbemClassObject *,8> &t_Queue = t_MethodSink->GetQueue () ;
|
|
|
|
IWbemClassObject *t_Object = NULL ;
|
|
while ( ( t_StatusCode = t_Queue.Top ( t_Object ) ) == e_StatusCode_Success )
|
|
{
|
|
if (SUCCEEDED(t_Result))
|
|
{
|
|
a_Sink->Indicate ( 1 , & t_Object ) ;
|
|
}
|
|
t_Object->Release () ;
|
|
t_StatusCode = t_Queue.DeQueue () ;
|
|
}
|
|
|
|
t_MethodSink->Release () ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemServices> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_MethodCalled == FALSE )
|
|
{
|
|
t_Result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
}
|
|
|
|
a_Sink->SetStatus ( 0 , t_Result , NULL , NULL ) ;
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr ::ProvideEvents (
|
|
|
|
IWbemObjectSink *a_Sink ,
|
|
long a_Flags
|
|
)
|
|
{
|
|
HRESULT t_Result = WBEM_E_NOT_AVAILABLE ;
|
|
|
|
|
|
m_Sink = a_Sink;
|
|
|
|
IWbemEventProvider **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
t_Result = GetProviders <IWbemEventProvider> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
t_Result = t_Elements [ t_Index ]->ProvideEvents (
|
|
|
|
a_Sink,
|
|
a_Flags
|
|
) ;
|
|
if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Elements [ t_Index ]);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemEventProvider> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
HRESULT DCProxyAggr ::AccessCheck (
|
|
|
|
WBEM_CWSTR a_QueryLanguage ,
|
|
WBEM_CWSTR a_Query ,
|
|
long a_SidLength ,
|
|
const BYTE *a_Sid
|
|
)
|
|
{
|
|
HRESULT t_AggregatedResult = S_OK ;
|
|
|
|
IWbemEventProviderSecurity **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
ULONG t_ContainerCount = 0 ;
|
|
|
|
HRESULT t_Result = GetProviders <IWbemEventProviderSecurity,&IID_IWbemEventProviderSecurity> ( NULL , m_Controller , t_Elements , t_ElementsCount , t_ContainerCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
t_Result = t_Elements [ t_Index ]->AccessCheck (
|
|
|
|
a_QueryLanguage,
|
|
a_Query ,
|
|
a_SidLength ,
|
|
a_Sid
|
|
) ;
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_Result != S_OK )
|
|
{
|
|
t_AggregatedResult = t_Result ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Elements [ t_Index ]);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemEventProviderSecurity> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
if ( t_ContainerCount )
|
|
{
|
|
if ( t_ElementsCount != t_ContainerCount )
|
|
{
|
|
t_AggregatedResult = WBEM_S_SUBJECT_TO_SDS ;
|
|
}
|
|
}
|
|
|
|
t_Result = t_AggregatedResult ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
HRESULT
|
|
DCProxyAggr::LoadAll ( void )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
try
|
|
{
|
|
CServerObject_DecoupledClientRegistration t_Elements ( m_Allocator ) ;
|
|
HRESULT t_TempResult = t_Elements.Load () ;
|
|
if ( SUCCEEDED ( t_TempResult ) )
|
|
{
|
|
WmiQueue < CServerObject_DecoupledClientRegistration_Element , 8 > &t_Queue = t_Elements.GetQueue () ;
|
|
|
|
CServerObject_DecoupledClientRegistration_Element t_Top ;
|
|
|
|
WmiStatusCode t_StatusCode ;
|
|
while ( ( t_StatusCode = t_Queue.Top ( t_Top ) ) == e_StatusCode_Success )
|
|
{
|
|
HRESULT t_TempResult = Register( DC_reg (t_Top ), false );
|
|
if (FAILED(t_TempResult) && t_TempResult == WBEM_E_PROVIDER_FAILURE)
|
|
t_Top.Delete(t_Top.GetClsid());
|
|
t_StatusCode = t_Queue.DeQueue () ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
t_Result = WBEM_E_PROVIDER_FAILURE ;
|
|
}
|
|
|
|
initialized_ = true;
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr ::NewQuery (
|
|
|
|
unsigned long a_Id ,
|
|
WBEM_WSTR a_QueryLanguage ,
|
|
WBEM_WSTR a_Query
|
|
)
|
|
{
|
|
HRESULT t_Result = WBEM_E_NOT_AVAILABLE ;
|
|
|
|
IWbemEventProviderQuerySink **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
t_Result = GetProviders <IWbemEventProviderQuerySink> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
t_Result = t_Elements [ t_Index ]->NewQuery (
|
|
|
|
a_Id,
|
|
a_QueryLanguage ,
|
|
a_Query
|
|
) ;
|
|
if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Elements [ t_Index ]);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemEventProviderQuerySink> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT DCProxyAggr ::CancelQuery (
|
|
|
|
unsigned long a_Id
|
|
)
|
|
{
|
|
HRESULT t_Result = WBEM_E_NOT_AVAILABLE ;
|
|
|
|
IWbemEventProviderQuerySink **t_Elements = NULL ;
|
|
ULONG t_ElementsCount = 0 ;
|
|
|
|
t_Result = GetProviders <IWbemEventProviderQuerySink> ( m_Controller , t_Elements , t_ElementsCount ) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
for ( ULONG t_Index = 0 ; ( t_Index < t_ElementsCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ )
|
|
{
|
|
t_Result = t_Elements [ t_Index ]->CancelQuery ( a_Id ) ;
|
|
|
|
if ( ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_SERVER_UNAVAILABLE ) || ( HRESULT_ERROR_FUNC(t_Result) == RPC_S_CALL_FAILED_DNE ) || (t_Result == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
const CInterceptor_IWbemDecoupledProvider* last_interceptor = static_cast<CInterceptor_IWbemDecoupledProvider*>(t_Elements [ t_Index ]);
|
|
UnRegister(*last_interceptor);
|
|
t_Result = S_OK ;
|
|
}
|
|
}
|
|
|
|
HRESULT t_TempResult = ClearProviders <IWbemEventProviderQuerySink> ( t_Elements , t_ElementsCount ) ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|