|
|
/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
ProvFact.cpp
Abstract:
History:
--*/
#include "PreComp.h"
#include <wbemint.h>
#include <stdio.h>
#define SECURITY_WIN32
#include <Security.h>
#include <lmcons.h>
#include <HelperFuncs.h>
#include <Logging.h>
#include "Globals.h"
#include "CGlobals.h"
#include "ProvSubS.h"
#include "ProvAggr.h"
#include "ProvFact.h"
#include "ProvLoad.h"
#include "ProvWsv.h"
#include "ProvWsvS.h"
#include "ProvResv.h"
#include "ProvInSk.h"
#include "ProvRegDeCoupled.h"
#include "ProvRegInfo.h"
#include "ProvCache.h"
#include "ProvHost.h"
#include "ProvObSk.h"
#include "Guids.h"
#include <scopecheck.h>
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
#pragma warning( disable : 4355 )
CServerObject_BindingFactory :: CServerObject_BindingFactory (
WmiAllocator &a_Allocator
) : CWbemGlobal_IWmiProviderController ( a_Allocator ) , m_Internal ( this ) , m_Allocator ( a_Allocator ) , m_Context ( NULL ) , m_Namespace ( NULL ) , m_NamespacePath ( NULL ) , m_Repository ( NULL ) , m_SubSystem ( NULL ) , m_SvcWrappersContainer( a_Allocator ) { CWbemGlobal_IWmiProviderController :: AddRef () ;
InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CServerObject_BindingFactory_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CServerObject_BindingFactory :: CServerObject_BindingFactory (
WmiAllocator &a_Allocator , CWbemGlobal_IWmiFactoryController *a_Controller , const BindingFactoryCacheKey &a_Key , const ULONG &a_Period
) : BindingFactoryCacheElement (
a_Controller , a_Key , a_Period ) , CWbemGlobal_IWmiProviderController ( a_Allocator ) , m_Internal ( this ) , m_Allocator ( a_Allocator ) , m_Context ( NULL ) , m_Namespace ( NULL ) , m_NamespacePath ( NULL ) , m_Repository ( NULL ) , m_SubSystem ( NULL ) , m_SvcWrappersContainer( a_Allocator ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CServerObject_BindingFactory_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; }
#pragma warning( default : 4355 )
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
CServerObject_BindingFactory::~CServerObject_BindingFactory () { if ( m_Context ) { m_Context->Release () ; }
if ( m_Namespace ) { delete [] m_Namespace ; }
if ( m_NamespacePath ) { m_NamespacePath->Release () ; }
if ( m_Repository ) { m_Repository->Release () ; }
if ( m_SubSystem ) { m_SubSystem->Release () ; }
CWbemGlobal_IWmiProviderController :: UnInitialize () ;
ULONG t_Count = m_SvcWrappersContainer.Size(); for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { IUnknown * t_SvcWrap ; WmiStatusCode t_StatusCode = m_SvcWrappersContainer.Top ( t_SvcWrap) ; if ( t_StatusCode == e_StatusCode_Success ) { t_SvcWrap->Release () ; t_StatusCode = m_SvcWrappersContainer.DeQueue () ; } }
m_SvcWrappersContainer.UnInitialize() ; InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CServerObject_BindingFactory_ObjectsInProgress ) ;
ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Initialize (
_IWmiProvSS *a_SubSys , _IWmiProviderFactory *a_Factory , LONG a_Flags , IWbemContext *a_Context , LPCWSTR a_Namespace , IWbemServices *a_Repository , IWbemServices *a_Service ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
try { if ( a_Namespace ) { m_Namespace = DupString(a_Namespace ); if ( m_Namespace == 0) { t_Result = WBEM_E_OUT_OF_MEMORY ; }
if ( SUCCEEDED ( t_Result ) ) { t_Result = CoCreateInstance (
CLSID_WbemDefPath , NULL , CLSCTX_INPROC_SERVER , IID_IWbemPath , ( void ** ) & m_NamespacePath ) ;
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_SubSystem = a_SubSys ; m_Flags = a_Flags ; m_Context = a_Context ; if ( m_Context ) { m_Context->AddRef () ; }
if ( m_SubSystem ) { m_SubSystem->AddRef () ; }
WmiStatusCode t_StatusCode = CWbemGlobal_IWmiProviderController :: Initialize () ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } }
if (e_StatusCode_Success != m_SvcWrappersContainer.Initialize() ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP CServerObject_BindingFactory::QueryInterface (
REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ;
if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID__IWmiProviderFactory ) { *iplpv = ( LPVOID ) ( _IWmiProviderFactory * ) this ; } else if ( iid == IID__IWmiProviderFactoryInitialize ) { *iplpv = ( LPVOID ) ( _IWmiProviderFactoryInitialize * ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * ) this ; } else if ( iid == IID__IWmiProviderConfiguration ) { *iplpv = ( LPVOID ) ( _IWmiProviderConfiguration * ) this ; } else if ( iid == IID_CWbemGlobal_IWmiProviderController ) { *iplpv = ( LPVOID ) & ( this->m_Internal ) ; }
if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ;
return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_( ULONG ) CServerObject_BindingFactory :: AddRef () { return BindingFactoryCacheElement :: AddRef () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
STDMETHODIMP_(ULONG) CServerObject_BindingFactory :: Release () { return BindingFactoryCacheElement :: Release () ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: CacheProvider (
_IWmiProviderSubsystemRegistrar *a_Registrar , IWbemContext *a_Context , CServerObject_DecoupledClientRegistration_Element &a_Element , IUnknown *a_Unknown ) { HRESULT t_Result = S_OK ;
GUID t_Identity ; t_Result = CLSIDFromString ( a_Element.GetClsid () , & t_Identity ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = a_Registrar->Register (
0 , a_Context , a_Element.GetUser () , a_Element.GetLocale () , a_Element.GetScope () , a_Element.GetProvider () , a_Element.GetProcessIdentifier () , a_Unknown , t_Identity ) ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Load (
_IWmiProviderSubsystemRegistrar *a_Registrar , IWbemContext *a_Context , CServerObject_DecoupledClientRegistration_Element &a_Element ) { HRESULT t_Result = S_OK ;
BYTE *t_MarshaledProxy = a_Element.GetMarshaledProxy () ; DWORD t_MarshaledProxyLength = a_Element.GetMarshaledProxyLength () ;
if ( t_MarshaledProxy ) { IUnknown *t_Unknown = NULL ; t_Result = ProviderSubSystem_Common_Globals :: UnMarshalRegistration ( & t_Unknown , t_MarshaledProxy , t_MarshaledProxyLength ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = CacheProvider (
a_Registrar , a_Context , a_Element , t_Unknown ) ;
t_Unknown->Release () ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Load (
CDecoupledAggregator_IWbemProvider *a_Aggregator , IWbemContext *a_Context , BSTR a_Provider , BSTR a_User , BSTR a_Locale , BSTR a_Scope ) { HRESULT t_Result = S_OK ;
try { _IWmiProviderSubsystemRegistrar *t_Registrar = NULL ; t_Result = a_Aggregator->QueryInterface ( IID__IWmiProviderSubsystemRegistrar , ( void ** ) & t_Registrar ) ; if ( SUCCEEDED ( t_Result ) ) { WmiStatusCode t_StatusCode = WmiHelper :: EnterCriticalSection ( ProviderSubSystem_Globals :: GetDecoupledRegistrySection () ) ;
CServerObject_DecoupledClientRegistration t_Elements ( m_Allocator ) ; HRESULT t_TempResult = t_Elements.Load (
a_Provider , a_User , a_Locale , a_Scope ) ; t_StatusCode = WmiHelper :: LeaveCriticalSection ( ProviderSubSystem_Globals :: GetDecoupledRegistrySection () ) ;
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 = Load (
t_Registrar , a_Context , t_Top ) ;
t_StatusCode = t_Queue.DeQueue () ; } } else { }
t_Registrar->Release () ; } } catch ( ... ) { t_Result = WBEM_E_PROVIDER_FAILURE ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: GetHosting (
CServerObject_ProviderRegistrationV1 &a_Registration , IWbemContext *a_Context , Enum_Hosting &a_Hosting , LPCWSTR &a_HostingGroup ) { HRESULT t_Result = S_OK ;
a_Hosting = e_Hosting_Undefined ; if ( a_Context ) { VARIANT t_Variant ; VariantInit ( & t_Variant ) ;
HRESULT t_TResult = a_Context->GetValue ( L"Hosting" , 0 , & t_Variant ) ; if ( SUCCEEDED ( t_TResult ) ) { if ( t_Variant.vt == VT_I4 ) { a_Hosting = ( Enum_Hosting ) t_Variant.lVal ; }
VariantClear ( & t_Variant ) ; } }
a_Hosting = ( a_Hosting == e_Hosting_Undefined ) ? a_Registration.GetHosting () : a_Hosting ; switch ( a_Hosting ) { case e_Hosting_SharedNetworkServiceHost: case e_Hosting_SharedLocalSystemHostOrSelfHost: case e_Hosting_SharedLocalSystemHost: case e_Hosting_SharedLocalServiceHost: { a_HostingGroup = a_Registration.GetHostingGroup () ; } break ;
default: { a_HostingGroup = NULL ; } break ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Create (
CServerObject_ProviderRegistrationV1 &a_Registration , Enum_Hosting a_Hosting , LPCWSTR a_HostingGroup , LPCWSTR a_User , _IWmiProviderHost **a_Host , _IWmiProviderFactory **a_Factory , IWbemContext *a_Context ) { HRESULT t_Result = S_OK ;
switch ( a_Hosting ) { case e_Hosting_WmiCore: case e_Hosting_WmiCoreOrSelfHost: case e_Hosting_SelfHost: case e_Hosting_NonCom: { t_Result = ProviderSubSystem_Common_Globals :: CreateInstance (
CLSID_WmiProviderInProcFactory , NULL , CLSCTX_INPROC_SERVER , IID__IWmiProviderFactory , ( void ** ) a_Factory ) ; } break ;
case e_Hosting_SharedLocalSystemHost: case e_Hosting_SharedLocalSystemHostOrSelfHost: { try { HostCacheKey t_Key (
HostCacheKey :: e_HostDesignation_Shared , a_HostingGroup , HostCacheKey :: e_IdentityDesignation_LocalSystem , NULL ) ;
t_Result = CServerObject_HostInterceptor :: CreateUsingToken (
t_Key , a_Host , a_Factory , a_Context ) ; } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } } break ;
case e_Hosting_Decoupled: { t_Result = WBEM_E_PROVIDER_NOT_FOUND ; } break ;
case e_Hosting_SharedLocalServiceHost: { try { HostCacheKey t_Key (
HostCacheKey :: e_HostDesignation_Shared , a_HostingGroup , HostCacheKey :: e_IdentityDesignation_LocalService , NULL ) ;
t_Result = CServerObject_HostInterceptor :: CreateUsingAccount (
t_Key , L"LocalService" , L"NT AUTHORITY" , a_Host , a_Factory , a_Context ) ; } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } } break ;
case e_Hosting_SharedNetworkServiceHost: { try { HostCacheKey t_Key (
HostCacheKey :: e_HostDesignation_Shared , a_HostingGroup , HostCacheKey :: e_IdentityDesignation_NetworkService , NULL ) ;
t_Result = CServerObject_HostInterceptor :: CreateUsingAccount (
t_Key , L"NetworkService" , L"NT AUTHORITY" , a_Host , a_Factory , a_Context ) ; } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } } break ;
default: { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } break ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: InitializeHostedService (
CInterceptor_IWbemProvider *a_Interceptor , IUnknown *a_Unknown ) { HRESULT t_Result = S_OK ;
IUnknown *t_InterceptorUnknown = NULL ; t_Result = a_Interceptor->QueryInterface ( IID_IUnknown , ( void ** ) & t_InterceptorUnknown ) ; if ( SUCCEEDED ( t_Result ) ) { _IWmiProviderSite *t_Site = NULL ; t_Result = a_Unknown->QueryInterface ( IID__IWmiProviderSite , ( void ** ) & t_Site ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Site->SetContainer ( a_Interceptor->GetQuota () ) ; if ( SUCCEEDED ( t_Result ) ) { DWORD t_ProcessIdentifier = 0 ; t_Result = t_Site->GetSite ( & t_ProcessIdentifier ) ; if ( SUCCEEDED ( t_Result ) ) { CWbemGlobal_HostedProviderController *t_HostedController = ProviderSubSystem_Globals :: GetHostedProviderController () ;
AutoLockGuard<CWbemGlobal_HostedProviderController> localLock(*t_HostedController);
CWbemGlobal_HostedProviderController_Container_Iterator t_Iterator ;
WmiStatusCode t_StatusCode = t_HostedController->Find ( t_ProcessIdentifier , t_Iterator ) ; switch ( t_StatusCode ) { case e_StatusCode_Success: { ProviderController *t_ProviderController = NULL ; t_Result = t_Iterator.GetElement ()->QueryInterface ( IID_ProviderController , ( void ** ) & t_ProviderController ) ; if ( SUCCEEDED ( t_Result ) ) { AutoLockGuard<ProviderController> providerLock(*t_ProviderController);
ProviderController :: Container_Iterator t_Iterator ; t_StatusCode = t_ProviderController->Insert ( a_Interceptor , t_Iterator ) ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_OUT_OF_MEMORY ; }
providerLock.UnLock () ;
t_ProviderController->Release () ; } } break ;
default: { ProviderController *t_ProviderController = new ProviderController (
m_Allocator , t_HostedController , t_ProcessIdentifier ) ;
if ( t_ProviderController ) { t_ProviderController->AddRef () ;
t_StatusCode = t_ProviderController->Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { t_StatusCode = t_HostedController->Insert ( *t_ProviderController , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { t_ProviderController->AddRef () ;
AutoLockGuard<ProviderController> providerLock(*t_ProviderController);
ProviderController :: Container_Iterator t_Iterator ; t_StatusCode = t_ProviderController->Insert ( a_Interceptor , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
if ( FAILED ( t_Result ) ) { t_StatusCode = t_HostedController->Delete ( t_ProcessIdentifier ) ; }
providerLock.UnLock () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
t_ProviderController->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } break ; } } }
t_Site->Release () ; }
t_InterceptorUnknown->Release () ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: InternalFindAggregatedDecoupledProvider (
IWbemServices *a_RepositoryService , IWbemServices *a_FullService , CServerObject_ProviderRegistrationV1 &a_Registration , ProviderCacheKey &a_Key , LONG a_Flags , IWbemContext *a_Context , LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope, LPCWSTR a_Name , REFIID a_RIID , void **a_Interface ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
try { AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator ;
WmiStatusCode t_StatusCode = Find ( a_Key , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
localLock.UnLock () ;
CDecoupledAggregator_IWbemProvider *t_Aggregator = NULL ;
t_Result = t_Element->QueryInterface (
IID_CDecoupledAggregator_IWbemProvider , ( void ** ) & t_Aggregator ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Aggregator->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Result == S_FALSE ) { t_Result = t_Element->QueryInterface (
a_RIID , a_Interface ) ;
t_Aggregator->Release () ; t_Element->Release () ; return t_Result ; }
if ( SUCCEEDED ( t_Result = t_Aggregator->GetInitializeResult () ) ) { t_Result = t_Element->QueryInterface (
a_RIID , a_Interface ) ;
if ( FAILED ( t_Result ) ) { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } }
t_Aggregator->Release () ; } else { t_Result = WBEM_E_UNEXPECTED ; }
t_Element->Release () ; } else { BOOL t_ReEntrancy = ( a_Registration.GetInitializationReentrancy () == e_InitializationReentrancy_Clsid ) ; t_ReEntrancy = t_ReEntrancy || ( a_Registration.GetInitializationReentrancy () == e_InitializationReentrancy_Namespace ) ;
CDecoupledAggregator_IWbemProvider *t_InitializingAggregator = NULL ;
BOOL t_IndependantCall = TRUE ;
if ( t_ReEntrancy ) { CWbemGlobal_IWmiProviderController_Cache *t_Cache = NULL ; GetCache ( t_Cache ) ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator = t_Cache->Begin ();
while ( ! t_Iterator.Null () ) { ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
BOOL t_Equivalent = ( a_Key.m_Provider ) && ( t_Iterator.GetKey ().m_Provider ) && ( wcscmp ( a_Key.m_Provider , t_Iterator.GetKey ().m_Provider ) == 0 ) ; if ( t_Equivalent ) { t_Result = t_Element->QueryInterface (
IID_CDecoupledAggregator_IWbemProvider , ( void ** ) & t_InitializingAggregator ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_InitializingAggregator->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Result == S_FALSE ) { t_IndependantCall = FALSE ; } }
break ; } }
t_Iterator.Increment () ; } }
if ( SUCCEEDED ( t_Result ) ) { wchar_t *t_NamespacePath = NULL ;
t_Result = ProviderSubSystem_Common_Globals :: GetNamespacePath (
Direct_GetNamespacePath () , t_NamespacePath ) ;
if ( SUCCEEDED ( t_Result ) ) { CInterceptor_IWbemServices_Interceptor *t_RepositoryStub = new CInterceptor_IWbemServices_Interceptor ( m_Allocator , a_RepositoryService ) ; if ( t_RepositoryStub ) { t_RepositoryStub->AddRef () ;
// Do not care about failure case
if (e_StatusCode_Success == m_SvcWrappersContainer.EnQueue((IWbemServices *)t_RepositoryStub)) t_RepositoryStub->AddRef();
CInterceptor_IWbemServices_Interceptor *t_FullStub = new CInterceptor_IWbemServices_Interceptor ( m_Allocator , a_FullService ) ; if ( t_FullStub ) { t_FullStub->AddRef () ;
// Do not care about failure case
if (e_StatusCode_Success == m_SvcWrappersContainer.EnQueue((IWbemServices *)t_FullStub)) t_FullStub->AddRef();
CDecoupledAggregator_IWbemProvider *t_Aggregator = NULL ;
try { t_Aggregator = new CDecoupledAggregator_IWbemProvider (
m_Allocator , this , this , t_RepositoryStub , t_FullStub , a_Key , ProviderSubSystem_Globals :: s_InternalCacheTimeout , a_Context , a_Registration ) ;
if ( t_Aggregator == NULL ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
if ( SUCCEEDED ( t_Result ) ) { t_Aggregator->AddRef () ;
_IWmiProviderInitialize *t_AggregatorInit = NULL ; t_Result = t_Aggregator->QueryInterface ( IID__IWmiProviderInitialize , ( void ** ) & t_AggregatorInit ) ; 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_AggregatorInit->Initialize (
0 , a_Context , NULL , ( const BSTR ) a_User , ( const BSTR ) a_Locale , ( const BSTR ) t_NamespacePath , t_RepositoryStub , t_FullStub , t_Sink ) ;
if ( SUCCEEDED ( t_Result ) ) { t_ProviderInitSink->Wait () ;
t_Result = t_ProviderInitSink->GetResult () ; if ( SUCCEEDED ( t_Result ) ) { } }
t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } }
t_ProviderInitSink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
t_AggregatorInit->Release () ; }
if ( SUCCEEDED ( t_Result ) ) { if ( t_IndependantCall ) { WmiStatusCode t_StatusCode = Insert (
*t_Aggregator , t_Iterator ) ;
if ( t_StatusCode == e_StatusCode_Success ) { localLock.UnLock () ;
if ( t_InitializingAggregator ) { t_Result = t_InitializingAggregator->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Result == S_FALSE ) { } else { if ( SUCCEEDED ( t_Result = t_InitializingAggregator->GetInitializeResult () ) ) { } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } } } }
if ( SUCCEEDED ( t_Result ) ) { t_Result = Load (
t_Aggregator , a_Context , ( BSTR ) a_Name , ( BSTR ) ( a_Registration.PerUserInitialization () ? a_User : NULL ) , ( BSTR ) ( a_Registration.PerLocaleInitialization () ? a_Locale : NULL ) , ( BSTR ) t_NamespacePath ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Aggregator->QueryInterface (
a_RIID , a_Interface ) ; }
if ( FAILED ( t_Result ) ) { WmiStatusCode t_StatusCode = CWbemGlobal_IWmiProviderController :: Shutdown ( a_Key ) ;
t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } }
t_Aggregator->SetInitialized ( t_Result ) ; } else { localLock.UnLock () ; } } else { localLock.UnLock () ;
t_Result = t_Aggregator->QueryInterface (
a_RIID , a_Interface ) ; } } else { localLock.UnLock () ; }
t_Aggregator->Release () ; } else { localLock.UnLock () ; }
t_FullStub->Release () ; } else { localLock.UnLock () ;
t_Result = WBEM_E_OUT_OF_MEMORY ; }
t_RepositoryStub->Release () ; } else { localLock.UnLock () ;
t_Result = WBEM_E_OUT_OF_MEMORY ; }
delete [] t_NamespacePath ; } else { localLock.UnLock () ;
t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { localLock.UnLock () ; }
if ( t_InitializingAggregator ) { t_InitializingAggregator->Release () ; } } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: GetDecoupledProvider (
LONG a_Flags , IWbemContext *a_Context , LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope, LPCWSTR a_Name , REFIID a_RIID , void **a_Interface ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK; try { IWbemPath *t_Scope = NULL ;
if ( a_Scope ) { t_Result = CoCreateInstance (
CLSID_WbemDefPath , NULL , CLSCTX_INPROC_SERVER , IID_IWbemPath , ( void ** ) & t_Scope ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Scope->SetText ( WBEMPATH_TREAT_SINGLE_IDENT_AS_NS | WBEMPATH_CREATE_ACCEPT_ALL , a_Scope ) ; } }
CServerObject_ProviderSubSystem *t_SubSystem = NULL ; IWbemServices *t_RepositoryService = NULL ; IWbemServices *t_FullService = NULL ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = Direct_GetSubSystem ()->QueryInterface ( IID_CWbemProviderSubSystem , ( void ** ) & t_SubSystem ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_SubSystem->GetWmiRepositoryService ( Direct_GetNamespacePath () , ( const BSTR ) a_User, ( const BSTR ) a_Locale , t_RepositoryService ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_SubSystem->GetWmiService ( Direct_GetNamespacePath () , ( const BSTR ) a_User , ( const BSTR ) a_Locale , t_FullService ) ; } } }
CServerObject_ProviderRegistrationV1 *t_Registration = new CServerObject_ProviderRegistrationV1 ; if ( t_Registration ) { t_Registration->AddRef () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Registration->SetContext (
a_Context , Direct_GetNamespacePath () , t_RepositoryService ) ; if ( SUCCEEDED ( t_Result ) ) { t_Registration->SetUnloadTimeoutMilliSeconds ( ProviderSubSystem_Globals :: s_InternalCacheTimeout ) ;
t_Result = t_Registration->Load (
e_All , t_Scope , a_Name ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( t_Registration->GetComRegistration ().Enabled () ) { if ( ProviderSubSystem_Globals :: CheckGuidTag ( t_Registration->GetClsid () ) ) { t_Result = WBEM_E_PROVIDER_DISABLED ; } } else { t_Result = WBEM_E_PROVIDER_DISABLED ; } } else { if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = WBEM_E_PROVIDER_NOT_FOUND ; } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } } } }
if ( SUCCEEDED ( t_Result ) ) { try { ProviderCacheKey t_Key (
a_Name , e_Hosting_Decoupled , NULL , true , NULL , a_User , a_Locale ) ;
t_Result = InternalFindAggregatedDecoupledProvider (
t_RepositoryService , t_FullService , *t_Registration , t_Key , a_Flags , a_Context , a_User , a_Locale , a_Scope, a_Name , a_RIID , a_Interface ) ; } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } }
if ( t_Scope ) { t_Scope->Release () ; }
if ( t_RepositoryService ) { t_RepositoryService->Release () ; }
if ( t_FullService ) { t_FullService->Release () ; }
if ( t_SubSystem ) { t_SubSystem->Release () ; }
if ( t_Registration ) { t_Registration->Release () ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: InternalGetProvider (
IWbemServices *a_RepositoryService , IWbemServices *a_FullService , _IWmiProviderHost *a_Host , _IWmiProviderFactory *a_Factory , CInterceptor_IWbemProvider *a_Interceptor , CServerObject_ProviderRegistrationV1 &a_Registration , ProviderCacheKey &a_Key , LONG a_Flags , IWbemContext *a_Context , GUID *a_TransactionIdentifier, LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope , LPCWSTR a_Name , void **a_Unknown , REFIID a_RIID , void **a_Interface ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
try { DWORD t_ProcessIdentifier = 0 ; if ( a_Host ) { t_Result = a_Host->GetProcessIdentifier ( & t_ProcessIdentifier ) ; }
if ( SUCCEEDED ( t_Result ) ) { BOOL t_Impersonating = FALSE ; IUnknown *t_OldContext = NULL ; IServerSecurity *t_OldSecurity = NULL ;
t_Result = ProviderSubSystem_Common_Globals :: BeginImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; if ( SUCCEEDED ( t_Result ) ) { BOOL t_Revert = FALSE ; IUnknown *t_Proxy = NULL ;
HANDLE t_IdentifyHandle = NULL ;
switch ( a_Registration.GetHosting () ) { case e_Hosting_SharedLocalSystemHost: case e_Hosting_SharedLocalSystemHostOrSelfHost: { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState_SvcHost ( IID__IWmiProviderFactory , a_Factory , t_Proxy , t_Revert , t_ProcessIdentifier , t_IdentifyHandle , ProviderSubSystem_Common_Globals :: s_Token_All_Access_System_ACE , ProviderSubSystem_Common_Globals :: s_System_ACESize ) ; } break ;
case e_Hosting_SharedLocalServiceHost: { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState_SvcHost ( IID__IWmiProviderFactory , a_Factory , t_Proxy , t_Revert , t_ProcessIdentifier , t_IdentifyHandle , ProviderSubSystem_Common_Globals :: s_Token_All_Access_LocalService_ACE , ProviderSubSystem_Common_Globals :: s_LocalService_ACESize ) ; } break ;
case e_Hosting_SharedNetworkServiceHost: { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState_SvcHost ( IID__IWmiProviderFactory , a_Factory , t_Proxy , t_Revert , t_ProcessIdentifier , t_IdentifyHandle , ProviderSubSystem_Common_Globals :: s_Token_All_Access_NetworkService_ACE , ProviderSubSystem_Common_Globals :: s_NetworkService_ACESize ) ; } break ;
default: { t_Result = ProviderSubSystem_Common_Globals :: SetProxyState ( IID__IWmiProviderFactory , a_Factory , t_Proxy , t_Revert ) ; } break ; }
if ( t_Result == WBEM_E_NOT_FOUND ) { WmiInternalContext t_InternalContext ; ZeroMemory ( & t_InternalContext , sizeof ( t_InternalContext ) ) ;
t_Result = a_Factory->GetProvider (
t_InternalContext , a_Flags , a_Context , a_TransactionIdentifier , a_User , a_Locale , a_Scope , a_Name , IID_IUnknown , a_Unknown ) ;
DEBUGTRACE((LOG_PROVSS," LOCAL GetProvider(%S) hr = %08x\n",a_Name,t_Result)); } else { if ( SUCCEEDED ( t_Result ) ) { _IWmiProviderFactory *t_FactoryProxy = ( _IWmiProviderFactory * ) t_Proxy ;
// Set cloaking on the proxy
// =========================
DWORD t_ImpersonationLevel = ProviderSubSystem_Common_Globals :: GetCurrentImpersonationLevel () ;
t_Result = ProviderSubSystem_Common_Globals :: SetCloaking (
t_FactoryProxy , RPC_C_AUTHN_LEVEL_DEFAULT , t_ImpersonationLevel ) ;
if ( SUCCEEDED ( t_Result ) ) { IUnknown *t_Unknown = NULL ;
WmiInternalContext t_InternalContext ; t_InternalContext.m_IdentifyHandle = ( unsigned __int64 ) t_IdentifyHandle ; t_InternalContext.m_ProcessIdentifier = GetCurrentProcessId () ;
t_Result = t_FactoryProxy->GetProvider (
t_InternalContext , a_Flags , a_Context , a_TransactionIdentifier , a_User , a_Locale , a_Scope , a_Name , IID_IUnknown , a_Unknown ) ;
DEBUGTRACE((LOG_PROVSS," PROXY GetProvider(%S) hr = %08x\n",a_Name,t_Result)); }
if ( t_IdentifyHandle ) { HRESULT t_Result = ProviderSubSystem_Common_Globals :: RevertProxyState_SvcHost ( t_Proxy , t_Revert , t_ProcessIdentifier , t_IdentifyHandle ) ; } else { HRESULT t_Result = ProviderSubSystem_Common_Globals :: RevertProxyState ( t_Proxy , t_Revert ) ; } } }
ProviderSubSystem_Common_Globals :: EndImpersonation ( t_OldContext , t_OldSecurity , t_Impersonating ) ; } } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: InternalGetProviderViaProxyRoute (
IWbemServices *a_RepositoryService , IWbemServices *a_FullService , CInterceptor_IWbemProvider *a_Interceptor , CServerObject_ProviderRegistrationV1 &a_Registration , Enum_Hosting a_Hosting , LPCWSTR a_HostingGroup , ProviderCacheKey &a_Key , LONG a_Flags , IWbemContext *a_Context , GUID *a_TransactionIdentifier, LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope , LPCWSTR a_Name , REFIID a_RIID , void **a_Interface ) { HRESULT t_Result = S_OK ;
DEBUGTRACE((LOG_PROVSS,"+ CServerObject_BindingFactory::InternalGetProviderViaProxyRoute\n"));
try { _IWmiProviderHost *t_Host = NULL ; _IWmiProviderFactory *t_Factory = NULL ;
t_Result = Create (
a_Registration , a_Hosting , a_HostingGroup , a_User , & t_Host , & t_Factory , a_Context ) ;
if ( SUCCEEDED ( t_Result ) ) { _IWmiProviderFactoryInitialize *t_Initializer = NULL ;
t_Result = t_Factory->QueryInterface ( IID__IWmiProviderFactoryInitialize , ( void ** ) & t_Initializer ) ; if ( SUCCEEDED ( t_Result ) ) { CInterceptor_IWbemServices_Interceptor *t_RepositoryStub = new CInterceptor_IWbemServices_Interceptor ( m_Allocator , a_RepositoryService ) ;
if ( t_RepositoryStub ) { t_RepositoryStub->AddRef () ;
t_Result = t_RepositoryStub->ServiceInitialize () ; if ( SUCCEEDED ( t_Result ) ) {
CInterceptor_IWbemServices_Interceptor *t_FullStub = new CInterceptor_IWbemServices_Interceptor ( m_Allocator , a_FullService ) ;
if ( t_FullStub ) { t_FullStub->AddRef () ;
t_Result = t_FullStub->ServiceInitialize () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Initializer->Initialize (
NULL , this , a_Flags , a_Context , Direct_GetNamespace () , t_RepositoryStub , t_FullStub ) ;
if ( SUCCEEDED ( t_Result ) ) { IUnknown *t_Unknown = NULL ;
t_Result = InternalGetProvider (
t_RepositoryStub , t_FullStub , t_Host , t_Factory , a_Interceptor , a_Registration , a_Key , a_Flags , a_Context , a_TransactionIdentifier , a_User , a_Locale , a_Scope , a_Name , ( void ** ) & t_Unknown , a_RIID , a_Interface ) ;
DEBUGTRACE((LOG_PROVSS," InternalGetProvider hr = %08x\n",t_Result ));
if ( SUCCEEDED ( t_Result ) ) { t_Result = a_Interceptor->SetProvider ( t_Host , t_Unknown ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = InitializeHostedService (
a_Interceptor , t_Unknown ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = a_Interceptor->QueryInterface (
a_RIID , a_Interface ) ;
if ( FAILED ( t_Result ) ) { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } } }
t_Unknown->Release () ; } } }
t_FullStub->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } }
t_RepositoryStub->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
t_Initializer->Release () ; }
t_Factory->Release () ;
if ( t_Host ) { t_Host->Release () ; } } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
DEBUGTRACE((LOG_PROVSS,"- CServerObject_BindingFactory::InternalGetProviderViaProxyRoute hr = %08x\n",t_Result));
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: InternalFindProvider (
IWbemServices *a_RepositoryService , IWbemServices *a_FullService , CServerObject_ProviderRegistrationV1 &a_Registration , Enum_Hosting a_Hosting , LPCWSTR a_HostingGroup , ProviderCacheKey &a_Key , LONG a_Flags , IWbemContext *a_Context , GUID *a_TransactionIdentifier, LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope , LPCWSTR a_Name , REFIID a_RIID , void **a_Interface ) { HRESULT t_Result = S_OK ;
try { CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator ;
AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ;
WmiStatusCode t_StatusCode = Find ( a_Key , t_Iterator ) ; DEBUGTRACE((LOG_PROVSS," Find() StatusCode %08x\n",t_StatusCode)); if ( t_StatusCode == e_StatusCode_Success ) { ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
localLock.UnLock () ;
CInterceptor_IWbemProvider *t_Interceptor = NULL ;
t_Result = t_Element->QueryInterface (
IID_CInterceptor_IWbemProvider , ( void ** ) & t_Interceptor ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Interceptor->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Result == S_FALSE ) { t_Result = t_Element->QueryInterface (
a_RIID , a_Interface ) ;
t_Interceptor->Release () ; t_Element->Release () ;
return t_Result ; }
if ( SUCCEEDED ( t_Result = t_Interceptor->GetInitializeResult () ) ) { t_Result = t_Element->QueryInterface (
a_RIID , a_Interface ) ;
if ( FAILED ( t_Result ) ) { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } }
t_Interceptor->Release () ; } else { t_Result = WBEM_E_UNEXPECTED ; }
t_Element->Release () ; } else { BOOL t_ReEntrancy = ( a_Registration.GetInitializationReentrancy () == e_InitializationReentrancy_Clsid ) ; t_ReEntrancy = t_ReEntrancy || ( a_Registration.GetInitializationReentrancy () == e_InitializationReentrancy_Namespace ) ;
CInterceptor_IWbemProvider *t_InitializingInterceptor = NULL ;
BOOL t_IndependantCall = TRUE ;
if ( t_ReEntrancy ) { CWbemGlobal_IWmiProviderController_Cache *t_Cache = NULL ; GetCache ( t_Cache ) ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator = t_Cache->Begin ();
while ( ! t_Iterator.Null () ) { ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
BOOL t_Equivalent = ( a_Key.m_Provider ) && ( t_Iterator.GetKey ().m_Provider ) && ( wcscmp ( a_Key.m_Provider , t_Iterator.GetKey ().m_Provider ) == 0 ) ; if ( t_Equivalent ) { t_Result = t_Element->QueryInterface (
IID_CInterceptor_IWbemProvider , ( void ** ) & t_InitializingInterceptor ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_InitializingInterceptor->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Result == S_FALSE ) { t_IndependantCall = FALSE ; } }
break ; } }
t_Iterator.Increment () ; } }
CInterceptor_IWbemProvider *t_Interceptor = NULL ;
try { t_Interceptor = new CInterceptor_IWbemProvider (
m_Allocator , this , a_Key , a_Registration.GetUnloadTimeoutMilliSeconds () , a_Context , a_Registration ) ;
if ( t_Interceptor ) { t_Interceptor->AddRef () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
if ( SUCCEEDED ( t_Result ) ) { IWbemProviderInit *t_InterceptorInit = NULL ;
t_Result = t_Interceptor->QueryInterface ( IID_IWbemProviderInit , ( 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 (
NULL , 0 , m_Namespace , NULL , NULL , NULL , t_Sink ) ;
if ( SUCCEEDED ( t_Result ) ) { t_ProviderInitSink->Wait () ;
t_Result = t_ProviderInitSink->GetResult () ; }
DEBUGTRACE((LOG_PROVSS," IWbemProviderInit::Initialize hr = %08x\n",t_Result));
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 ) ) { if ( t_IndependantCall ) { WmiStatusCode t_StatusCode = e_StatusCode_Success; if ( a_Registration.GetUnloadTimeoutMilliSeconds() != 0 ) { t_StatusCode = Insert (*t_Interceptor, t_Iterator); }
if ( t_StatusCode == e_StatusCode_Success ) { localLock.UnLock () ;
t_Result = InternalGetProviderViaProxyRoute (
a_RepositoryService , a_FullService , t_Interceptor , a_Registration , a_Hosting , a_HostingGroup , a_Key , a_Flags , a_Context , a_TransactionIdentifier , a_User , a_Locale , a_Scope , a_Name , a_RIID , a_Interface ) ;
if ( FAILED ( t_Result ) ) { WmiStatusCode t_StatusCode = CWbemGlobal_IWmiProviderController :: Shutdown ( a_Key ) ; }
t_Interceptor->SetInitialized ( t_Result ) ; } else { localLock.UnLock () ;
t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { localLock.UnLock () ;
t_Result = t_Interceptor->QueryInterface (
a_RIID , a_Interface ) ; } } else { localLock.UnLock () ; }
if ( t_Interceptor ) { t_Interceptor->Release () ; }
if ( t_InitializingInterceptor ) { t_InitializingInterceptor->Release () ; } } } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: GetProvider (
WmiInternalContext a_InternalContext , LONG a_Flags , IWbemContext *a_Context , GUID *a_TransactionIdentifier, LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope , LPCWSTR a_Name , REFIID a_RIID , void **a_Interface ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
#ifdef WMI_PRIVATE_DBG
#ifdef DBG
CTestNullTokenOnScope Test(__LINE__,__FILE__); #endif
#endif
DEBUGTRACE((LOG_PROVSS,"+ CServerObject_BindingFactory::GetProvider User %S Locale %S Scope %S Name %S\n",a_User,a_Locale,a_Scope,a_Name));
HRESULT t_Result = S_OK ;
try { ProviderCacheKey t_Key (
a_Name , e_Hosting_SharedNetworkServiceHost , CServerObject_ComProviderRegistrationV1 :: s_Strings_Wmi_DefaultSharedNetworkServiceHost , true , a_TransactionIdentifier , NULL , NULL ) ;
t_Result = FindProvider (
a_Context , t_Key , FALSE , a_RIID , a_Interface , a_User , a_Locale ) ;
DEBUGTRACE((LOG_PROVSS," FindProvider hr = %08x\n",t_Result));
if ( SUCCEEDED ( t_Result ) ) { } else { if ( t_Result == WBEM_E_NOT_FOUND ) { CServerObject_ProviderSubSystem *t_SubSystem = NULL ; IWbemServices *t_RepositoryService = NULL ; IWbemServices *t_FullService = NULL ;
t_Result = Direct_GetSubSystem ()->QueryInterface ( IID_CWbemProviderSubSystem , ( void ** ) & t_SubSystem ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_SubSystem->GetWmiRepositoryService ( Direct_GetNamespacePath () , ( const BSTR ) a_User , ( const BSTR ) a_Locale , t_RepositoryService ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_SubSystem->GetWmiService ( Direct_GetNamespacePath () , ( const BSTR ) a_User , ( const BSTR ) a_Locale , t_FullService ) ; } }
IWbemContext *t_Context = NULL ;
if ( SUCCEEDED ( t_Result ) ) { if ( a_Context == NULL ) { t_Result = CoCreateInstance (
CLSID_WbemContext , NULL , CLSCTX_INPROC_SERVER , IID_IWbemContext , ( void ** ) & t_Context ) ; } }
IWbemPath *t_Scope = NULL ;
if ( SUCCEEDED ( t_Result ) ) { if ( a_Scope ) { t_Result = CoCreateInstance (
CLSID_WbemDefPath , NULL , CLSCTX_INPROC_SERVER , IID_IWbemPath , ( void ** ) & t_Scope ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Scope->SetText ( WBEMPATH_TREAT_SINGLE_IDENT_AS_NS | WBEMPATH_CREATE_ACCEPT_ALL , a_Scope ) ; } } }
CServerObject_ProviderRegistrationV1 *t_Registration = new CServerObject_ProviderRegistrationV1 ; if ( t_Registration ) { t_Registration->AddRef () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Registration->SetContext (
a_Context ? a_Context : t_Context , Direct_GetNamespacePath () , t_RepositoryService ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Registration->Load (
e_All , t_Scope , a_Name ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( t_Registration->GetComRegistration ().Enabled () ) { if ( ProviderSubSystem_Globals :: CheckGuidTag ( t_Registration->GetClsid () ) ) { t_Result = WBEM_E_PROVIDER_DISABLED ; } } } else { if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = WBEM_E_PROVIDER_NOT_FOUND ; } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } }
if (t_Registration->GetUnloadTimeoutMilliSeconds()==DEFAULT_PROVIDER_TIMEOUT) if ( t_Registration->ObjectProvider () ) { if ( t_Registration->EventProvider () ) { t_Registration->SetUnloadTimeoutMilliSeconds ( ProviderSubSystem_Globals :: s_ObjectCacheTimeout < ProviderSubSystem_Globals :: s_EventCacheTimeout ? ProviderSubSystem_Globals :: s_EventCacheTimeout : ProviderSubSystem_Globals :: s_ObjectCacheTimeout ) ; } else { t_Registration->SetUnloadTimeoutMilliSeconds ( ProviderSubSystem_Globals :: s_ObjectCacheTimeout ) ; } } else { if ( t_Registration->EventProvider () ) { t_Registration->SetUnloadTimeoutMilliSeconds ( ProviderSubSystem_Globals :: s_EventCacheTimeout ) ; } } } }
if ( t_Scope ) { t_Scope->Release () ; }
if ( SUCCEEDED ( t_Result ) ) { LPCWSTR t_HostingGroup = NULL ; Enum_Hosting t_Hosting = e_Hosting_Undefined ; t_Result = GetHosting ( *t_Registration , a_Context ? a_Context : t_Context , t_Hosting , t_HostingGroup ) ; if ( SUCCEEDED ( t_Result ) ) { try { ProviderCacheKey t_Key (
a_Name , t_Hosting , t_HostingGroup , true , a_TransactionIdentifier , t_Registration->PerUserInitialization () ? a_User : NULL , t_Registration->PerLocaleInitialization () ? a_Locale : NULL ) ;
switch ( t_Hosting ) { case e_Hosting_Decoupled: { t_Result = InternalFindAggregatedDecoupledProvider (
t_RepositoryService , t_FullService , *t_Registration , t_Key , a_Flags , a_Context ? a_Context : t_Context , a_User , a_Locale , a_Scope, a_Name , a_RIID , a_Interface ) ; } break ;
default: { t_Result = InternalFindProvider (
t_RepositoryService , t_FullService , *t_Registration , t_Hosting , t_HostingGroup , t_Key , a_Flags , a_Context ? a_Context : t_Context , a_TransactionIdentifier , a_User , a_Locale , a_Scope , a_Name , a_RIID , a_Interface ) ; } break; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_FAILED ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } } }
if ( t_RepositoryService ) { t_RepositoryService->Release () ; }
if ( t_FullService ) { t_FullService->Release () ; }
if ( t_SubSystem ) { t_SubSystem->Release () ; }
if ( t_Registration ) { t_Registration->Release () ; }
if ( t_Context ) { t_Context->Release () ; } } } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_FAILED ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
DEBUGTRACE((LOG_PROVSS,"- CServerObject_BindingFactory::GetProvider hr = %08x\n",t_Result)); return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: GetHostedProvider (
LONG a_Flags , IWbemContext *a_Context , GUID *a_TransactionIdentifier, LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope , LPCWSTR a_Name , ULONG a_Host , LPCWSTR a_HostingGroup , REFIID a_RIID , void **a_Interface ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK;
try { ProviderCacheKey t_Key (
a_Name , a_Host , a_HostingGroup , true , a_TransactionIdentifier , NULL , NULL ) ;
t_Result = FindProvider (
a_Context , t_Key , TRUE , a_RIID , a_Interface , a_User , a_Locale ) ;
if ( SUCCEEDED ( t_Result ) ) { } else { if ( t_Result == WBEM_E_NOT_FOUND ) { CServerObject_ProviderSubSystem *t_SubSystem = NULL ; IWbemServices *t_RepositoryService = NULL ; IWbemServices *t_FullService = NULL ;
t_Result = Direct_GetSubSystem ()->QueryInterface ( IID_CWbemProviderSubSystem , ( void ** ) & t_SubSystem ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_SubSystem->GetWmiRepositoryService ( Direct_GetNamespacePath () , ( const BSTR ) a_User , ( const BSTR ) a_Locale , t_RepositoryService ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_SubSystem->GetWmiService ( Direct_GetNamespacePath () , ( const BSTR ) a_User , ( const BSTR ) a_Locale , t_FullService ) ; } }
IWbemPath *t_Scope = NULL ;
if ( SUCCEEDED ( t_Result ) ) { if ( a_Scope ) { t_Result = CoCreateInstance (
CLSID_WbemDefPath , NULL , CLSCTX_INPROC_SERVER , IID_IWbemPath , ( void ** ) & t_Scope ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Scope->SetText ( WBEMPATH_TREAT_SINGLE_IDENT_AS_NS | WBEMPATH_CREATE_ACCEPT_ALL , a_Scope ) ; } } }
CServerObject_ProviderRegistrationV1 *t_Registration = new CServerObject_ProviderRegistrationV1 ; if ( t_Registration ) { t_Registration->AddRef () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Registration->SetContext (
a_Context , Direct_GetNamespacePath () , t_RepositoryService ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Registration->Load (
e_All , t_Scope , a_Name ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( t_Registration->GetComRegistration ().Enabled () ) { if ( ProviderSubSystem_Globals :: CheckGuidTag ( t_Registration->GetClsid () ) ) { t_Result = WBEM_E_PROVIDER_DISABLED ; } }
if (t_Registration->GetUnloadTimeoutMilliSeconds()==DEFAULT_PROVIDER_TIMEOUT) { if ( t_Registration->ObjectProvider () ) { if ( t_Registration->EventProvider () ) { t_Registration->SetUnloadTimeoutMilliSeconds ( ProviderSubSystem_Globals :: s_ObjectCacheTimeout < ProviderSubSystem_Globals :: s_EventCacheTimeout ? ProviderSubSystem_Globals :: s_EventCacheTimeout : ProviderSubSystem_Globals :: s_ObjectCacheTimeout ) ; } else { t_Registration->SetUnloadTimeoutMilliSeconds ( ProviderSubSystem_Globals :: s_ObjectCacheTimeout ) ; } } else { if ( t_Registration->EventProvider () ) { t_Registration->SetUnloadTimeoutMilliSeconds ( ProviderSubSystem_Globals :: s_EventCacheTimeout ) ; } } } } else { if ( t_Result == WBEM_E_NOT_FOUND ) { t_Result = WBEM_E_PROVIDER_NOT_FOUND ; } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } } } }
if ( t_Scope ) { t_Scope->Release () ; }
if ( SUCCEEDED ( t_Result ) ) { try { ProviderCacheKey t_Key (
a_Name , a_Host , a_HostingGroup , true , a_TransactionIdentifier , t_Registration->PerUserInitialization () ? a_User : NULL , t_Registration->PerLocaleInitialization () ? a_Locale : NULL ) ;
switch ( a_Host ) { case e_Hosting_Decoupled: { t_Result = InternalFindAggregatedDecoupledProvider (
t_RepositoryService , t_FullService , *t_Registration , t_Key , a_Flags , a_Context , a_User , a_Locale , a_Scope, a_Name , a_RIID , a_Interface ) ; } break ;
default: { t_Result = InternalFindProvider (
t_RepositoryService , t_FullService , *t_Registration , ( Enum_Hosting ) a_Host , a_HostingGroup , t_Key , a_Flags , a_Context , a_TransactionIdentifier , a_User , a_Locale , a_Scope , a_Name , a_RIID , a_Interface ) ; } break; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_FAILED ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } }
if ( t_RepositoryService ) { t_RepositoryService->Release () ; }
if ( t_FullService ) { t_FullService->Release () ; }
if ( t_SubSystem ) { t_SubSystem->Release () ; }
if ( t_Registration ) { t_Registration->Release () ; } } } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_FAILED ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: GetAggregatedClassProvider (
IWbemServices *a_RepositoryService , IWbemServices *a_FullService , ProviderCacheKey &a_Key , LONG a_Flags , IWbemContext *a_Context , LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope , IWbemClassObject *a_Class , REFIID a_RIID , void **a_Interface ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
try { AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator ;
WmiStatusCode t_StatusCode = Find ( a_Key , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
localLock.UnLock () ;
CAggregator_IWbemProvider *t_Aggregator = NULL ;
t_Result = t_Element->QueryInterface (
IID_CAggregator_IWbemProvider , ( void ** ) & t_Aggregator ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Aggregator->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Result == S_FALSE ) { t_Result = t_Element->QueryInterface (
a_RIID , a_Interface ) ;
t_Aggregator->Release () ; t_Element->Release () ;
return t_Result ; }
if ( SUCCEEDED ( t_Result = t_Aggregator->GetInitializeResult () ) ) { t_Result = t_Element->QueryInterface (
a_RIID , a_Interface ) ;
if ( FAILED ( t_Result ) ) { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } } else { t_Result = WBEM_E_PROVIDER_LOAD_FAILURE ; } }
t_Aggregator->Release () ; } else { t_Result = WBEM_E_UNEXPECTED ; }
t_Element->Release () ; } else { CAggregator_IWbemProvider *t_Aggregator = NULL ;
CInterceptor_IWbemServices_Interceptor *t_RepositoryStub = new CInterceptor_IWbemServices_Interceptor ( m_Allocator , a_RepositoryService ) ; if ( t_RepositoryStub ) { t_RepositoryStub->AddRef () ;
CInterceptor_IWbemServices_Interceptor *t_FullStub = new CInterceptor_IWbemServices_Interceptor ( m_Allocator , a_FullService ) ; if ( t_FullStub ) { t_FullStub->AddRef () ;
t_Aggregator = new CAggregator_IWbemProvider (
m_Allocator , this , this , t_RepositoryStub , t_FullStub , a_Key , ProviderSubSystem_Globals :: s_InternalCacheTimeout , a_Context ) ;
if ( t_Aggregator ) { t_Aggregator->AddRef () ;
wchar_t *t_NamespacePath = NULL ;
t_Result = ProviderSubSystem_Common_Globals :: GetNamespacePath (
Direct_GetNamespacePath () , t_NamespacePath ) ;
if ( SUCCEEDED ( t_Result ) ) { _IWmiProviderInitialize *t_AggregatorInit = NULL ; t_Result = t_Aggregator->QueryInterface ( IID__IWmiProviderInitialize , ( void ** ) & t_AggregatorInit ) ; 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_AggregatorInit->Initialize (
0 , a_Context , NULL , ( const BSTR ) a_User , ( const BSTR ) a_Locale , ( const BSTR ) t_NamespacePath , t_RepositoryStub , t_FullStub , 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_AggregatorInit->Release () ; }
delete [] t_NamespacePath ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
t_FullStub->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
t_RepositoryStub->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
if ( SUCCEEDED ( t_Result ) ) { WmiStatusCode t_StatusCode = Insert (
*t_Aggregator , t_Iterator ) ;
if ( t_StatusCode == e_StatusCode_Success ) { localLock.UnLock () ;
t_Result = t_Aggregator->Enum_ClassProviders ( a_Context ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Aggregator->QueryInterface (
a_RIID , a_Interface ) ;
if ( FAILED ( t_Result ) ) { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } }
t_Aggregator->SetInitialized ( t_Result ) ; } else { localLock.UnLock () ;
t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { localLock.UnLock () ; }
if ( t_Aggregator ) { t_Aggregator->Release () ; } } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: WaitProvider (
IWbemContext *a_Context , REFIID a_RIID , void **a_Interface , ServiceCacheElement *a_Element , _IWmiProviderInitialize *a_Initializer ) { HRESULT t_Result = a_Initializer->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Result == S_FALSE ) { t_Result = a_Element->QueryInterface (
a_RIID , a_Interface ) ; } else { if ( SUCCEEDED ( t_Result = a_Initializer->GetInitializeResult () ) ) { t_Result = a_Element->QueryInterface (
a_RIID , a_Interface ) ;
if ( FAILED ( t_Result ) ) { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } } } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: SearchSpecificProvider (
IWbemContext *a_Context , ProviderCacheKey &a_Key , REFIID a_RIID , void **a_Interface , LPCWSTR a_User , LPCWSTR a_Locale ) {
AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ;
HRESULT t_Result = S_OK ;
CWbemGlobal_IWmiProviderController_Cache *t_Cache = NULL ; GetCache ( t_Cache ) ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator ;
try { ProviderCacheKey t_Key (
a_Key.m_Provider , e_Hosting_Undefined , NULL , false , NULL , NULL , NULL ) ;
WmiStatusCode t_StatusCode = t_Cache->FindNext ( t_Key , t_Iterator ) ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_NOT_FOUND ; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
if ( SUCCEEDED ( t_Result ) ) { BOOL t_Equal = FALSE ;
if ( t_Iterator.GetKey ().m_Provider ) { if ( a_Key.m_Provider ) { if ( wbem_wcsicmp ( t_Iterator.GetKey ().m_Provider , a_Key.m_Provider ) == 0 ) { t_Equal = TRUE ; } } }
if ( t_Equal ) { ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
_IWmiProviderInitialize *t_Initializer = NULL ;
t_Result = t_Element->QueryInterface (
IID__IWmiProviderInitialize , ( void ** ) & t_Initializer ) ;
if ( SUCCEEDED ( t_Result ) ) { BOOL t_PerUser ; t_Initializer->IsPerUserInitialization ( & t_PerUser ) ;
BOOL t_PerLocale ; t_Initializer->IsPerLocaleInitialization ( & t_PerLocale ) ;
DWORD t_Hosting ; t_Initializer->GetHosting ( & t_Hosting ) ;
BSTR t_HostingGroup ; t_Initializer->GetHostingGroup ( & t_HostingGroup ) ;
BOOL t_Internal ; t_Initializer->IsInternal ( & t_Internal ) ;
try { ProviderCacheKey t_SpecificKey (
a_Key.m_Provider , t_Hosting , t_HostingGroup , t_Internal ? false : true , NULL , t_PerUser ? a_User : NULL , t_PerLocale ? a_Locale : NULL ) ;
SysFreeString ( t_HostingGroup ) ;
WmiStatusCode t_StatusCode = Find ( t_SpecificKey , t_Iterator ) ; if ( t_StatusCode != e_StatusCode_Success ) { t_Result = WBEM_E_NOT_FOUND ; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
if ( SUCCEEDED ( t_Result ) ) { ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
localLock.UnLock () ;
_IWmiProviderInitialize *t_SpecificInitializer = NULL ;
t_Result = t_Element->QueryInterface (
IID__IWmiProviderInitialize , ( void ** ) & t_SpecificInitializer ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = WaitProvider (
a_Context , a_RIID , a_Interface , t_Element , t_SpecificInitializer ) ;
t_SpecificInitializer->Release () ; } else { t_Result = WBEM_E_UNEXPECTED ; }
t_Element->Release () ; } else { localLock.UnLock () ; }
t_Initializer->Release () ; } else { localLock.UnLock () ; } } else { localLock.UnLock () ;
t_Result = WBEM_E_NOT_FOUND ; } } else { localLock.UnLock () ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: FindProvider (
IWbemContext *a_Context , ProviderCacheKey &a_Key , BOOL a_SpecificProvider , REFIID a_RIID , void **a_Interface , LPCWSTR a_User , LPCWSTR a_Locale ) { HRESULT t_Result = S_OK;
AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator ;
WmiStatusCode t_StatusCode = Find ( a_Key , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
localLock.UnLock () ;
_IWmiProviderInitialize *t_Initializer = NULL ;
t_Result = t_Element->QueryInterface (
IID__IWmiProviderInitialize , ( void ** ) & t_Initializer ) ;
if ( SUCCEEDED ( t_Result ) ) { BOOL t_PerUser ; t_Initializer->IsPerUserInitialization ( & t_PerUser ) ; BOOL t_PerLocale ; t_Initializer->IsPerLocaleInitialization ( & t_PerLocale ) ;
if ( t_PerUser || t_PerLocale ) { t_Result = WBEM_E_NOT_FOUND ; } else { t_Result = WaitProvider (
a_Context , a_RIID , a_Interface , t_Element , t_Initializer ) ; }
t_Initializer->Release () ; } else { t_Result = WBEM_E_UNEXPECTED ; }
t_Element->Release () ; } else { t_Result = WBEM_E_NOT_FOUND ;
localLock.UnLock () ; }
if ( t_Result == WBEM_E_NOT_FOUND ) { if ( ! a_SpecificProvider ) { t_Result = SearchSpecificProvider (
a_Context , a_Key , a_RIID , a_Interface , a_User , a_Locale ) ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: GetClassProvider (
LONG a_Flags , IWbemContext *a_Context , LPCWSTR a_User , LPCWSTR a_Locale , LPCWSTR a_Scope , IWbemClassObject *a_Class , REFIID a_RIID , void **a_Interface ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK; try { ProviderCacheKey t_Key (
NULL , e_Hosting_WmiCore , NULL , false , NULL , a_User , a_Locale ) ;
t_Result = FindProvider (
a_Context , t_Key , TRUE , a_RIID , a_Interface , a_User , a_Locale ) ;
if ( SUCCEEDED ( t_Result ) ) { } else { if ( t_Result == WBEM_E_NOT_FOUND ) { CServerObject_ProviderSubSystem *t_SubSystem = NULL ; IWbemServices *t_RepositoryService = NULL ; IWbemServices *t_FullService = NULL ;
t_Result = Direct_GetSubSystem ()->QueryInterface ( IID_CWbemProviderSubSystem , ( void ** ) & t_SubSystem ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_SubSystem->GetWmiRepositoryService ( Direct_GetNamespacePath () , ( const BSTR ) a_User , ( const BSTR ) a_Locale , t_RepositoryService ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_SubSystem->GetWmiService ( Direct_GetNamespacePath () , ( const BSTR ) a_User , ( const BSTR ) a_Locale , t_FullService ) ; } }
if ( SUCCEEDED ( t_Result ) ) { t_Result = GetAggregatedClassProvider (
t_RepositoryService , t_FullService , t_Key , a_Flags , a_Context , a_User , a_Locale , a_Scope , a_Class , a_RIID , a_Interface ) ; }
if ( t_RepositoryService ) { t_RepositoryService->Release () ; }
if ( t_FullService ) { t_FullService->Release () ; }
if ( t_SubSystem ) { t_SubSystem->Release () ; } } } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; } catch ( Wmi_Heap_Exception t_HeapException ) { t_Result = WBEM_E_OUT_OF_MEMORY ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: GetDynamicPropertyResolver (
LONG a_Flags , IWbemContext *a_Context , LPCWSTR a_User , LPCWSTR a_Locale , REFIID a_RIID , void **a_Interface ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK; try { CServerObject_ProviderSubSystem *t_SubSystem = NULL ; t_Result = Direct_GetSubSystem ()->QueryInterface ( IID_CWbemProviderSubSystem , ( void ** ) & t_SubSystem ) ; if ( SUCCEEDED ( t_Result ) ) { IWbemServices *t_FullService = NULL ; t_Result = t_SubSystem->GetWmiService ( Direct_GetNamespacePath () , ( const BSTR ) a_User , ( const BSTR ) a_Locale , t_FullService ) ;
if ( SUCCEEDED ( t_Result ) ) { #ifdef INTERNAL_IDENTIFY
CInterceptor_IWbemServices_Stub *t_Stub = new CInterceptor_IWbemServices_Stub ( NULL , m_Allocator , t_FullService ) ; #else
CInterceptor_IWbemServices_Interceptor *t_Stub = new CInterceptor_IWbemServices_Interceptor ( m_Allocator , t_FullService ) ;
#endif
if ( t_Stub ) { t_Stub->AddRef () ;
t_Result = t_Stub->ServiceInitialize () ; if ( SUCCEEDED ( t_Result ) ) { CServerObject_DynamicPropertyProviderResolver *t_Resolver = new CServerObject_DynamicPropertyProviderResolver (
m_Allocator , this , t_Stub ) ;
if ( t_Resolver ) { t_Resolver->AddRef () ;
wchar_t *t_NamespacePath = NULL ;
t_Result = ProviderSubSystem_Common_Globals :: GetNamespacePath (
Direct_GetNamespacePath () , t_NamespacePath ) ;
if ( SUCCEEDED ( t_Result ) ) { IWbemProviderInit *t_ProviderInit = NULL ;
t_Result = t_Resolver->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 () ; if ( SUCCEEDED ( t_Result ) ) { CInterceptor_IWbemProviderInitSink *t_Sink = new CInterceptor_IWbemProviderInitSink ( t_ProviderInitSink ) ; if ( t_Sink ) { t_Sink->AddRef () ;
t_Result = t_ProviderInit->Initialize (
( const BSTR ) a_User , 0 , ( const BSTR ) t_NamespacePath , ( const BSTR ) a_Locale , t_Stub , a_Context , t_Sink ) ;
if ( SUCCEEDED ( t_Result ) ) { t_ProviderInitSink->Wait () ;
t_Result = t_ProviderInitSink->GetResult () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Resolver->QueryInterface ( a_RIID , a_Interface ) ; } }
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 () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
delete [] t_NamespacePath ; }
t_Resolver->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } }
t_Stub->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; }
t_FullService->Release () ;
}
t_SubSystem->Release () ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Get (
IWbemServices *a_Service , long a_Flags , IWbemContext *a_Context , LPCWSTR a_Class , LPCWSTR a_Path , IWbemObjectSink *a_Sink ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
wchar_t *t_Locale = NULL ; wchar_t *t_User = NULL ; wchar_t *t_Namespace = NULL ; GUID *t_TransactionIdentifier = NULL ; wchar_t *t_Provider = NULL ; wchar_t *t_HostingGroup = NULL ; DWORD t_HostingSpecification = 0 ;
try { if ( wbem_wcsicmp ( a_Class , L"Msft_Providers" ) == 0 ) { IWbemPath *t_PathObject = NULL ;
t_Result = CoCreateInstance (
CLSID_WbemDefPath , NULL , CLSCTX_INPROC_SERVER , IID_IWbemPath , ( void ** ) & t_PathObject ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_PathObject->SetText ( WBEMPATH_CREATE_ACCEPT_ALL , a_Path ) ; if ( SUCCEEDED ( t_Result ) ) { IWbemPathKeyList *t_Keys = NULL ;
t_Result = t_PathObject->GetKeyList (
& t_Keys ) ;
if ( SUCCEEDED ( t_Result ) ) { ULONG t_KeyCount = 0 ; t_Result = t_Keys->GetCount (
& t_KeyCount ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( t_KeyCount == 7 ) { for ( ULONG t_Index = 0 ; ( t_Index < t_KeyCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ ) { wchar_t t_Key [ 32 ] ; ULONG t_KeyLength = 32 ; ULONG t_KeyValueLength = 0 ; ULONG t_KeyType = 0 ;
t_Result = t_Keys->GetKey (
t_Index , 0 , & t_KeyLength , t_Key , & t_KeyValueLength , NULL , & t_KeyType ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( t_KeyType == CIM_STRING ) { wchar_t *t_KeyValue = new wchar_t [ t_KeyValueLength ] ; if ( t_KeyValue ) { t_Result = t_Keys->GetKey (
t_Index , 0 , & t_KeyLength , t_Key , & t_KeyValueLength , t_KeyValue , & t_KeyType ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( wbem_wcsicmp ( L"Namespace" , t_Key ) == 0 ) { t_Namespace = t_KeyValue ; } else if ( wbem_wcsicmp ( L"Provider" , t_Key ) == 0 ) { t_Provider = t_KeyValue ; } else if ( wbem_wcsicmp ( L"HostingGroup" , t_Key ) == 0 ) { if ( wbem_wcsicmp ( t_KeyValue , L"" ) != 0 ) { t_HostingGroup = t_KeyValue ; } else { delete [] t_KeyValue ; } } else if ( wbem_wcsicmp ( L"Locale" , t_Key ) == 0 ) { if ( wbem_wcsicmp ( t_KeyValue , L"" ) != 0 ) { t_Locale = t_KeyValue ; } else { delete [] t_KeyValue ; } } else if ( wbem_wcsicmp ( L"User" , t_Key ) == 0 ) { if ( wbem_wcsicmp ( t_KeyValue , L"" ) != 0 ) { t_User = t_KeyValue ; } else { delete [] t_KeyValue ; } } else if ( wbem_wcsicmp ( L"TransactionIdentifier" , t_Key ) == 0 ) { if ( wbem_wcsicmp ( t_KeyValue , L"" ) != 0 ) { t_TransactionIdentifier = new GUID ; if ( t_TransactionIdentifier ) { t_Result = CLSIDFromString (
t_KeyValue , t_TransactionIdentifier ) ;
if ( FAILED ( t_Result ) ) { t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } } else { delete [] t_KeyValue ; } } else { delete [] t_KeyValue ;
t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else if ( t_KeyType == CIM_SINT32 ) { DWORD t_KeyValue = 0 ; t_Result = t_Keys->GetKey (
t_Index , 0 , & t_KeyLength , t_Key , & t_KeyValueLength , & t_KeyValue , & t_KeyType ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( wbem_wcsicmp ( L"HostingSpecification" , t_Key ) == 0 ) { t_HostingSpecification = t_KeyValue ; } else { t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } else { t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } } else { t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } t_Keys->Release(); } } else { t_Result = WBEM_E_CRITICAL_ERROR ; }
t_PathObject->Release () ; } else { t_Result = WBEM_E_CRITICAL_ERROR ; } if ( SUCCEEDED ( t_Result ) ) { ProviderCacheKey t_Key (
t_Provider , t_HostingSpecification , t_HostingGroup , true , t_TransactionIdentifier , t_User , t_Locale ) ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator ;
AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ;
WmiStatusCode t_StatusCode = Find ( t_Key , t_Iterator ) ;
if ( t_StatusCode == e_StatusCode_Success ) { ServiceCacheElement *t_Service = t_Iterator.GetElement () ;
localLock.UnLock () ;
_IWmiProviderConfiguration *t_Configuration = NULL ; t_Result = t_Service->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_Configuration ) ; if ( SUCCEEDED ( t_Result ) ) { _IWmiProviderInitialize *t_Initialize = NULL ; t_Result = t_Service->QueryInterface ( IID__IWmiProviderInitialize , ( void ** ) & t_Initialize ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = t_Initialize->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ;
if ( ( t_TempResult == S_OK ) && ( SUCCEEDED ( t_Initialize->GetInitializeResult () ) ) ) { t_Result = t_Configuration->Get (
a_Service , a_Flags, a_Context, a_Class, a_Path, a_Sink ) ; } else { t_Result = WBEM_E_NOT_FOUND ; }
t_Initialize->Release () ; }
t_Configuration->Release () ; } else { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; }
t_Service->Release () ; } else { localLock.UnLock () ;
t_Result = WBEM_E_NOT_FOUND ; } } } else { t_Result = WBEM_E_INVALID_CLASS ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ } catch ( Wmi_Heap_Exception t_HeapException ) { t_Result = WBEM_E_OUT_OF_MEMORY ; }
if ( t_Locale ) { delete [] t_Locale ; }
if ( t_User ) { delete [] t_User ; }
if ( t_Namespace ) { delete [] t_Namespace ; }
if ( t_TransactionIdentifier ) { delete [] t_TransactionIdentifier ; }
if ( t_Provider ) { delete [] t_Provider ; }
if ( t_HostingGroup ) { delete [] t_HostingGroup ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Set (
IWbemServices *a_Service , long a_Flags , IWbemContext *a_Context , LPCWSTR a_Provider , LPCWSTR a_Class , LPCWSTR a_Path , IWbemClassObject *a_OldObject , IWbemClassObject *a_NewObject
) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
try { AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ; CWbemGlobal_IWmiProviderController_Cache *t_Cache = NULL ; GetCache ( t_Cache ) ;
if ( t_Cache->Size () ) { _IWmiProviderCache **t_Elements = new _IWmiProviderCache * [ t_Cache->Size () ] ; if ( t_Elements ) { for ( ULONG t_Index = 0 ; t_Index < t_Cache->Size () ; t_Index ++ ) { t_Elements [ t_Index ] = NULL ; }
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator = t_Cache->Begin ();
ULONG t_Count = 0 ; while ( SUCCEEDED ( t_Result ) && ( ! t_Iterator.Null () ) ) { try { ProviderCacheKey t_Key = t_Iterator.GetKey () ; ServiceCacheElement *t_Element = t_Iterator.GetElement () ;
t_Iterator.Increment () ;
if ( t_Key.m_Provider && ( wbem_wcsicmp ( a_Provider , t_Key.m_Provider ) == 0 ) ) { t_Result = t_Element->QueryInterface (
IID__IWmiProviderCache , ( void ** ) & t_Elements [ t_Count ] ) ;
WmiStatusCode t_StatusCode = CWbemGlobal_IWmiProviderController :: Shutdown ( t_Key ) ; }
t_Count ++ ; } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } }
localLock.UnLock () ;
for ( t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { if ( t_Elements [ t_Index ] ) { t_Result = t_Elements [ t_Index ]->ForceReload () ;
t_Elements [ t_Index ]->Release () ; } } delete [] t_Elements ; } else { localLock.UnLock () ;
t_Result = WBEM_E_OUT_OF_MEMORY ; }
localLock.Lock () ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator = t_Cache->Begin (); while ( SUCCEEDED ( t_Result ) && ( ! t_Iterator.Null () ) ) { try { ProviderCacheKey t_Key = t_Iterator.GetKey () ;
t_Iterator.Increment () ;
if ( t_Key.m_Provider == NULL ) { WmiStatusCode t_StatusCode = CWbemGlobal_IWmiProviderController :: Shutdown ( t_Key ) ; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } } }
localLock.UnLock () ;
if ( a_OldObject ) { GUID t_Clsid ;
VARIANT t_Variant ; VariantInit ( & t_Variant ) ;
LONG t_VarType = 0 ; LONG t_Flavour = 0 ;
t_Result = a_OldObject->Get ( L"Clsid" , 0 , & t_Variant , & t_VarType , & t_Flavour ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Result = CLSIDFromString ( t_Variant.bstrVal , & t_Clsid ) ; if ( SUCCEEDED ( t_Result ) ) { ProviderSubSystem_Globals :: DeleteGuidTag ( t_Clsid ) ; } }
VariantClear ( & t_Variant ) ; } } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Deleted (
IWbemServices *a_Service , long a_Flags , IWbemContext *a_Context , LPCWSTR a_Provider , LPCWSTR a_Class , LPCWSTR a_Path , IWbemClassObject *a_Object ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
try { AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ;
CWbemGlobal_IWmiProviderController_Cache *t_Cache = NULL ; GetCache ( t_Cache ) ;
if ( t_Cache->Size () ) { CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator = t_Cache->Begin ();
while ( SUCCEEDED ( t_Result ) && ( ! t_Iterator.Null () ) ) { try { ProviderCacheKey t_Key = t_Iterator.GetKey () ;
t_Iterator.Increment () ;
if ( t_Key.m_Provider && (wbem_wcsicmp ( a_Provider , t_Key.m_Provider ) == 0 ) ) { WmiStatusCode t_StatusCode = CWbemGlobal_IWmiProviderController :: Shutdown ( t_Key ) ; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } } }
localLock.UnLock () ;
GUID t_Clsid ;
VARIANT t_Variant ; VariantInit ( & t_Variant ) ;
LONG t_VarType = 0 ; LONG t_Flavour = 0 ;
t_Result = a_Object->Get ( L"Clsid" , 0 , & t_Variant , & t_VarType , & t_Flavour ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Variant.vt == VT_BSTR ) { t_Result = CLSIDFromString ( t_Variant.bstrVal , & t_Clsid ) ; if ( SUCCEEDED ( t_Result ) ) { ProviderSubSystem_Globals :: DeleteGuidTag ( t_Clsid ) ; } }
VariantClear ( & t_Variant ) ; } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Enumerate (
IWbemServices *a_Service , long a_Flags , IWbemContext *a_Context , LPCWSTR a_Class , IWbemObjectSink *a_Sink ) { HRESULT t_Result = S_OK ;
if ( wbem_wcsicmp ( a_Class , L"Msft_Providers" ) == 0 ) { AutoLockGuard<CServerObject_BindingFactory> localLock(*this);
CWbemGlobal_IWmiProviderController_Cache *t_Cache = NULL ; GetCache ( t_Cache ) ;
if ( t_Cache->Size () ) { CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator = t_Cache->Begin ();
_IWmiProviderConfiguration **t_ControllerElements = new _IWmiProviderConfiguration * [ t_Cache->Size () ] ; if ( t_ControllerElements ) { ULONG t_Count = 0 ; while ( ! t_Iterator.Null () ) { HRESULT t_Result = t_Iterator.GetElement ()->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_ControllerElements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ; }
localLock.UnLock () ;
try { BindingFactoryCacheKey t_Key = BindingFactoryCacheElement :: GetKey () ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ;
t_Variant.vt = VT_BSTR ; t_Variant.bstrVal = SysAllocString ( t_Key.m_Namespace ) ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { if ( t_ControllerElements [ t_Index ] ) { _IWmiProviderInitialize *t_Initialize = NULL ; t_Result = t_ControllerElements [ t_Index ]->QueryInterface ( IID__IWmiProviderInitialize , ( void ** ) & t_Initialize ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = t_Initialize->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ;
if ( ( t_TempResult == S_OK ) && ( SUCCEEDED ( t_Initialize->GetInitializeResult () ) ) ) { CWaitingObjectSink *t_Sink = new CWaitingObjectSink ( m_Allocator ) ; if ( t_Sink ) { t_Sink->AddRef () ;
t_Result = t_Sink->SinkInitialize () ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_ControllerElements [ t_Index ]->Enumerate (
a_Service , a_Flags, a_Context, a_Class, t_Sink ) ;
t_Result = t_Sink->Wait ( INFINITE ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Sink->GetResult () ; if ( FAILED ( t_Result ) ) { } }
WmiQueue <IWbemClassObject *,8> &t_Queue = t_Sink->GetQueue () ;
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
IWbemClassObject *t_Object = NULL ; while ( ( t_StatusCode = t_Queue.Top ( t_Object ) ) == e_StatusCode_Success ) { if ( SUCCEEDED ( t_Result ) ) { t_Object->Put ( L"Namespace" , 0 , & t_Variant , 0 ) ;
a_Sink->Indicate ( 1, & t_Object ) ; }
t_Object->Release () ; t_StatusCode = t_Queue.DeQueue () ; } }
t_Sink->Release () ; } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } }
t_Initialize->Release () ; }
t_ControllerElements [ t_Index ]->Release () ; } }
VariantClear ( & t_Variant ) ; } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
delete [] t_ControllerElements ; } else { localLock.UnLock () ; } } else { localLock.UnLock () ; } }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Shutdown (
IWbemServices *a_Service , long a_Flags , IWbemContext *a_Context , LPCWSTR a_Provider , ULONG a_MilliSeconds ) { return S_OK ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Call (
IWbemServices *a_Service , long a_Flags , IWbemContext *a_Context , LPCWSTR a_Class , LPCWSTR a_Path , LPCWSTR a_Method , IWbemClassObject *a_InParams , IWbemObjectSink *a_Sink ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
try { if ( wbem_wcsicmp ( a_Class , L"Msft_Providers" ) == 0 ) { wchar_t *t_Locale = NULL ; wchar_t *t_User = NULL ; wchar_t *t_Namespace = NULL ; GUID *t_TransactionIdentifier = NULL ; wchar_t *t_HostingGroup = NULL ; wchar_t *t_Provider = NULL ; DWORD t_HostingSpecification = 0 ;
IWbemPath *t_PathObject = NULL ;
t_Result = CoCreateInstance (
CLSID_WbemDefPath , NULL , CLSCTX_INPROC_SERVER , IID_IWbemPath , ( void ** ) & t_PathObject ) ;
if ( SUCCEEDED ( t_Result ) ) { t_Result = t_PathObject->SetText ( WBEMPATH_CREATE_ACCEPT_ALL , a_Path ) ; if ( SUCCEEDED ( t_Result ) ) { IWbemPathKeyList *t_Keys = NULL ;
t_Result = t_PathObject->GetKeyList (
& t_Keys ) ;
if ( SUCCEEDED ( t_Result ) ) { ULONG t_KeyCount = 0 ; t_Result = t_Keys->GetCount (
& t_KeyCount ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( t_KeyCount == 7 ) { for ( ULONG t_Index = 0 ; ( t_Index < t_KeyCount ) && SUCCEEDED ( t_Result ) ; t_Index ++ ) { wchar_t t_Key [ 32 ] ; ULONG t_KeyLength = 32 ; ULONG t_KeyValueLength = 0 ; ULONG t_KeyType = 0 ;
t_Result = t_Keys->GetKey (
t_Index , 0 , & t_KeyLength , t_Key , & t_KeyValueLength , NULL , & t_KeyType ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( t_KeyType == CIM_STRING ) { wchar_t *t_KeyValue = new wchar_t [ t_KeyValueLength ] ; if ( t_KeyValue ) { t_Result = t_Keys->GetKey (
t_Index , 0 , & t_KeyLength , t_Key , & t_KeyValueLength , t_KeyValue , & t_KeyType ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( wbem_wcsicmp ( L"Namespace" , t_Key ) == 0 ) { t_Namespace = t_KeyValue ; } else if ( wbem_wcsicmp ( L"Provider" , t_Key ) == 0 ) { t_Provider = t_KeyValue ; } else if ( wbem_wcsicmp ( L"HostingGroup" , t_Key ) == 0 ) { t_HostingGroup = t_KeyValue ; } else if ( wbem_wcsicmp ( L"Locale" , t_Key ) == 0 ) { if ( wbem_wcsicmp ( t_KeyValue , L"" ) != 0 ) { t_Locale = t_KeyValue ; } else { delete [] t_KeyValue ; } } else if ( wbem_wcsicmp ( L"User" , t_Key ) == 0 ) { if ( wbem_wcsicmp ( t_KeyValue , L"" ) != 0 ) { t_User = t_KeyValue ; } else { delete [] t_KeyValue ; } } else if ( wbem_wcsicmp ( L"TransactionIdentifier" , t_Key ) == 0 ) { if ( wbem_wcsicmp ( t_KeyValue , L"" ) != 0 ) { t_TransactionIdentifier = new GUID ; if ( t_TransactionIdentifier ) { t_Result = CLSIDFromString (
t_KeyValue , t_TransactionIdentifier ) ;
if ( FAILED ( t_Result ) ) { t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } } else { delete [] t_KeyValue ; } } else { delete [] t_KeyValue ;
t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } else { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else if ( t_KeyType == CIM_SINT32 ) { DWORD t_KeyValue = 0 ; t_Result = t_Keys->GetKey (
t_Index , 0 , & t_KeyLength , t_Key , & t_KeyValueLength , & t_KeyValue , & t_KeyType ) ;
if ( SUCCEEDED ( t_Result ) ) { if ( wbem_wcsicmp ( L"HostingSpecification" , t_Key ) == 0 ) { t_HostingSpecification = t_KeyValue ; } else { t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } else { t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } } else { t_Result = WBEM_E_INVALID_OBJECT_PATH ; } } t_Keys->Release(); } } else { t_Result = WBEM_E_CRITICAL_ERROR ; }
t_PathObject->Release () ; } else { t_Result = WBEM_E_CRITICAL_ERROR ; } if ( SUCCEEDED ( t_Result ) ) { try { ProviderCacheKey t_Key (
t_Provider , t_HostingSpecification , t_HostingGroup , true , t_TransactionIdentifier , t_User , t_Locale ) ;
CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator ;
AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ;
WmiStatusCode t_StatusCode = Find ( t_Key , t_Iterator ) ;
if ( t_StatusCode == e_StatusCode_Success ) { ServiceCacheElement *t_Service = t_Iterator.GetElement () ;
if ( wbem_wcsicmp ( a_Method , L"UnLoad" ) == 0 ) { localLock.UnLock () ;
_IWmiProviderLoad *t_Load = NULL ;
t_Result = t_Service->QueryInterface ( IID__IWmiProviderLoad , ( void ** ) & t_Load ) ; if ( SUCCEEDED ( t_Result ) ) { WmiStatusCode t_StatusCode = CWbemGlobal_IWmiProviderController :: Shutdown ( t_Key ) ;
t_Result = t_Load->Unload (
0 , a_Context ) ;
t_Load->Release () ; } else { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } } else if ( ( wbem_wcsicmp ( a_Method , L"Suspend" ) == 0 ) || ( wbem_wcsicmp ( a_Method , L"Resume" ) == 0 ) ) { localLock.UnLock () ;
_IWmiProviderConfiguration *t_Configuration = NULL ; t_Result = t_Service->QueryInterface ( IID__IWmiProviderConfiguration , ( void ** ) & t_Configuration ) ; if ( SUCCEEDED ( t_Result ) ) { _IWmiProviderInitialize *t_Initialize = NULL ; t_Result = t_Service->QueryInterface ( IID__IWmiProviderInitialize , ( void ** ) & t_Initialize ) ; if ( SUCCEEDED ( t_Result ) ) { HRESULT t_TempResult = t_Initialize->WaitProvider ( a_Context , DEFAULT_PROVIDER_LOAD_TIMEOUT ) ;
if ( ( t_TempResult == S_OK ) && ( SUCCEEDED ( t_Initialize->GetInitializeResult () ) ) ) { t_Result = t_Configuration->Call (
a_Service , a_Flags, a_Context, a_Class, a_Path, a_Method, a_InParams, a_Sink ) ; } else { t_Result = WBEM_E_NOT_FOUND ; }
t_Initialize->Release () ; }
t_Configuration->Release () ; } else { t_Result = WBEM_E_PROVIDER_NOT_CAPABLE ; } } else { localLock.UnLock () ; }
t_Service->Release () ; } else { localLock.UnLock () ;
t_Result = WBEM_E_NOT_FOUND ; } } catch ( Wmi_Heap_Exception &a_Exception ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } catch ( ... ) { t_Result = WBEM_E_CRITICAL_ERROR ; } }
if ( t_Locale ) { delete [] t_Locale ; }
if ( t_User ) { delete [] t_User ; }
if ( t_Namespace ) { delete [] t_Namespace ; }
if ( t_TransactionIdentifier ) { delete [] t_TransactionIdentifier ; }
if ( t_Provider ) { delete [] t_Provider ; }
if ( t_HostingGroup ) { delete [] t_HostingGroup ; } } else { } } catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; /* Need to make this WBEM_E_SUBSYSTEM_FAILURE */ }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Query (
IWbemServices *a_Service , long a_Flags , IWbemContext *a_Context , WBEM_PROVIDER_CONFIGURATION_CLASS_ID a_ClassIdentifier , WBEM_PROVIDER_CONFIGURATION_PROPERTY_ID a_PropertyIdentifier , VARIANT *a_Value ) { return WBEM_E_NOT_SUPPORTED ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
HRESULT CServerObject_BindingFactory :: Shutdown (
LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { #ifndef STRUCTURED_HANDLER_SET_BY_WMI
Wmi_SetStructuredExceptionHandler t_StructuredException ; #endif
HRESULT t_Result = S_OK ;
try { AutoLockGuard<CServerObject_BindingFactory> localLock(*this) ; CWbemGlobal_IWmiProviderController_Cache *t_Cache = NULL ; GetCache ( t_Cache ) ;
if ( t_Cache->Size () ) { IWbemShutdown **t_ShutdownElements = new IWbemShutdown * [ t_Cache->Size () ] ; if ( t_ShutdownElements ) { CWbemGlobal_IWmiProviderController_Cache_Iterator t_Iterator = t_Cache->Begin ();
ULONG t_Count = 0 ; while ( ! t_Iterator.Null () ) { t_Result = t_Iterator.GetElement ()->QueryInterface ( IID_IWbemShutdown , ( void ** ) & t_ShutdownElements [ t_Count ] ) ;
t_Iterator.Increment () ;
t_Count ++ ; }
localLock.UnLock () ;
for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { if ( t_ShutdownElements [ t_Index ] ) { t_Result = t_ShutdownElements [ t_Index ]->Shutdown (
a_Flags , a_MaxMilliSeconds , a_Context ) ;
t_ShutdownElements [ t_Index ]->Release () ; } }
delete [] t_ShutdownElements ; } else { localLock.UnLock () ;
t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { localLock.UnLock () ; }
CWbemGlobal_IWmiProviderController :: Shutdown () ;
localLock.Lock(); ULONG t_Count = m_SvcWrappersContainer.Size();
IUnknown ** t_ppUnks = 0; if (t_Count) t_ppUnks = new IUnknown *[t_Count]; if (t_ppUnks) { for ( ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++ ) { IUnknown * t_SvcWrap ; WmiStatusCode t_StatusCode = m_SvcWrappersContainer.Top ( t_SvcWrap ) ; if ( t_StatusCode == e_StatusCode_Success ) { t_ppUnks[t_Index] = t_SvcWrap; t_StatusCode = m_SvcWrappersContainer.DeQueue () ; } } } localLock.UnLock(); if (t_ppUnks) { for (ULONG t_Index = 0 ; t_Index < t_Count ; t_Index ++) { CoDisconnectObject(t_ppUnks[t_Index],0); t_ppUnks[t_Index]->Release () ; } delete[] t_ppUnks; }
} catch ( Wmi_Structured_Exception t_StructuredException ) { t_Result = WBEM_E_CRITICAL_ERROR ; }
return t_Result ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
WmiStatusCode CServerObject_BindingFactory :: Strobe ( ULONG &a_NextStrobeDelta ) { return CWbemGlobal_IWmiProviderController :: Strobe ( a_NextStrobeDelta ) ; }
/******************************************************************************
* * Name: * * * Description: * * *****************************************************************************/
WmiStatusCode CServerObject_BindingFactory :: StrobeBegin ( const ULONG &a_Period ) { ULONG t_Timeout = ProviderSubSystem_Globals :: GetStrobeThread ().GetTimeout () ; ProviderSubSystem_Globals :: GetStrobeThread ().SetTimeout ( t_Timeout < a_Period ? t_Timeout : a_Period ) ; return e_StatusCode_Success ; }
|