/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: ProvResv.cpp Abstract: History: --*/ #include "PreComp.h" #include #include "Globals.h" #include "CGlobals.h" #include "ProvResv.h" #include "ProvFact.h" #include "ProvSubS.h" #include "guids.h" /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CServerObject_DynamicPropertyProviderResolver :: CServerObject_DynamicPropertyProviderResolver ( WmiAllocator &a_Allocator , _IWmiProviderFactory *a_Factory , IWbemServices *a_CoreStub ) : m_ReferenceCount ( 0 ) , m_Allocator ( a_Allocator ) , m_Factory ( a_Factory ) , m_CoreStub ( a_CoreStub ) , m_User ( NULL ) , m_Locale ( NULL ) { InterlockedIncrement ( & ProviderSubSystem_Globals :: s_CServerObject_DynamicPropertyProviderResolver_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Increment_Global_Object_Count () ; if ( m_Factory ) { m_Factory->AddRef () ; } if ( m_CoreStub ) { m_CoreStub->AddRef () ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ CServerObject_DynamicPropertyProviderResolver::~CServerObject_DynamicPropertyProviderResolver () { if ( m_User ) { SysFreeString ( m_User ) ; } if ( m_Locale ) { SysFreeString ( m_Locale ) ; } if ( m_Factory ) { m_Factory->Release () ; } if ( m_CoreStub ) { m_CoreStub->Release () ; } InterlockedDecrement ( & ProviderSubSystem_Globals :: s_CServerObject_DynamicPropertyProviderResolver_ObjectsInProgress ) ; ProviderSubSystem_Globals :: Decrement_Global_Object_Count () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP CServerObject_DynamicPropertyProviderResolver::QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID__IWmiDynamicPropertyResolver ) { *iplpv = ( LPVOID ) ( _IWmiDynamicPropertyResolver * ) this ; } else if ( iid == IID_IWbemProviderInit ) { *iplpv = ( LPVOID ) ( IWbemProviderInit * ) this ; } else if ( iid == IID_IWbemShutdown ) { *iplpv = ( LPVOID ) ( IWbemShutdown * )this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return ResultFromScode ( S_OK ) ; } else { return ResultFromScode ( E_NOINTERFACE ) ; } } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_( ULONG ) CServerObject_DynamicPropertyProviderResolver :: AddRef () { return InterlockedIncrement ( & m_ReferenceCount ) ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ STDMETHODIMP_(ULONG) CServerObject_DynamicPropertyProviderResolver :: Release () { ULONG t_ReferenceCount = InterlockedDecrement ( & m_ReferenceCount ) ; if ( t_ReferenceCount == 0 ) { delete this ; } return t_ReferenceCount ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_DynamicPropertyProviderResolver :: GetClassAndInstanceContext ( IWbemClassObject *a_Class , IWbemClassObject *a_Instance , BSTR &a_ClassContext , BSTR &a_InstanceContext , BOOL &a_Dynamic ) { HRESULT t_Result = S_OK ; a_Dynamic = FALSE ; a_ClassContext = NULL ; a_InstanceContext = NULL ; IWbemQualifierSet *t_InstanceQualifierObject = NULL ; t_Result = a_Instance->GetQualifierSet ( & t_InstanceQualifierObject ) ; if ( SUCCEEDED ( t_Result ) ) { VARIANT t_Variant ; VariantInit ( & t_Variant ) ; LONG t_Flavour = 0 ; t_Result = t_InstanceQualifierObject->Get ( ProviderSubSystem_Globals :: s_DynProps , 0 , & t_Variant , & t_Flavour ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Variant.vt == VT_BOOL ) { if ( t_Variant.boolVal == VARIANT_TRUE ) { a_Dynamic = TRUE ; VARIANT t_Variant ; VariantInit ( & t_Variant ) ; t_Flavour = 0 ; HRESULT t_TempResult = t_InstanceQualifierObject->Get ( ProviderSubSystem_Globals :: s_InstanceContext , 0 , & t_Variant , & t_Flavour ) ; if ( SUCCEEDED ( t_TempResult ) ) { if ( t_Variant.vt == VT_BSTR ) { a_InstanceContext = SysAllocString ( t_Variant.bstrVal ) ; if ( a_InstanceContext == NULL ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } VariantClear ( & t_Variant ) ; } else { if ( t_TempResult != WBEM_E_NOT_FOUND ) { t_Result = t_TempResult ; } } if ( SUCCEEDED ( t_Result ) ) { VARIANT t_ClassContextVariant ; VariantInit ( & t_ClassContextVariant ) ; t_TempResult = t_InstanceQualifierObject->Get ( ProviderSubSystem_Globals :: s_ClassContext , 0 , & t_ClassContextVariant , & t_Flavour ) ; if ( SUCCEEDED ( t_TempResult ) ) { if ( t_ClassContextVariant.vt == VT_BSTR ) { a_ClassContext = SysAllocString ( t_ClassContextVariant.bstrVal ) ; if ( a_ClassContext == NULL ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } else { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } VariantClear ( & t_ClassContextVariant ) ; } else { if ( t_TempResult != WBEM_E_NOT_FOUND ) { t_Result = t_TempResult ; } } if ( SUCCEEDED ( t_Result ) ) { if ( a_ClassContext == NULL ) { IWbemQualifierSet *t_ClassQualifierObject = NULL ; t_Result = a_Class->GetQualifierSet ( & t_ClassQualifierObject ) ; if ( SUCCEEDED ( t_Result ) ) { VARIANT t_Variant ; VariantInit ( & t_Variant ) ; LONG t_Flavour = 0 ; HRESULT t_TempResult = t_ClassQualifierObject->Get ( ProviderSubSystem_Globals :: s_ClassContext , 0 , & t_Variant , & t_Flavour ) ; if ( SUCCEEDED ( t_TempResult ) ) { if ( t_Variant.vt == VT_BSTR ) { a_ClassContext = SysAllocString ( t_Variant.bstrVal ) ; } else { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } VariantClear ( & t_Variant ) ; } else { if ( t_TempResult != WBEM_E_NOT_FOUND ) { t_Result = t_TempResult ; } } t_ClassQualifierObject->Release () ; } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } } } } } else { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } VariantClear ( & t_Variant ) ; } else { if ( t_Result != WBEM_E_NOT_FOUND ) { } else { t_Result = S_OK ; } } t_InstanceQualifierObject->Release () ; } else { t_Result = WBEM_E_CRITICAL_ERROR ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_DynamicPropertyProviderResolver :: ReadOrWrite ( IWbemContext *a_Context , IWbemClassObject *a_Instance , BSTR a_ClassContext , BSTR a_InstanceContext , BSTR a_PropertyContext , BSTR a_Provider , BSTR a_Property , BOOL a_Read ) { IWbemPropertyProvider *t_Provider = NULL ; WmiInternalContext t_InternalContext ; ZeroMemory ( & t_InternalContext , sizeof ( t_InternalContext ) ) ; HRESULT t_Result = m_Factory->GetProvider ( t_InternalContext , 0 , a_Context , NULL , m_User , m_Locale , NULL , a_Provider , IID_IWbemPropertyProvider , ( void ** ) & t_Provider ) ; if ( SUCCEEDED ( t_Result ) ) { VARIANT t_Variant ; VariantInit ( & t_Variant ) ; if ( a_Read ) { t_Result = t_Provider->GetProperty ( 0 , m_Locale , a_ClassContext , a_InstanceContext , a_PropertyContext , & t_Variant ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = a_Instance->Put ( a_Property , 0 , & t_Variant , 0 ) ; VariantClear ( & t_Variant ) ; } } else { LONG t_VarType = 0 ; LONG t_Flavour = 0 ; t_Result = a_Instance->Get ( a_Property , 0 , & t_Variant , & t_VarType , & t_Flavour ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Provider->PutProperty ( 0 , m_Locale , a_ClassContext , a_InstanceContext , a_PropertyContext , & t_Variant ) ; if ( SUCCEEDED ( t_Result ) ) { t_Result = a_Instance->Put ( a_Property , 0 , NULL , 0 ) ; } VariantClear ( & t_Variant ) ; } } t_Provider->Release () ; } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_DynamicPropertyProviderResolver :: ReadOrWrite ( IWbemContext *a_Context , IWbemClassObject *a_Class , IWbemClassObject *a_Instance , BOOL a_Read ) { HRESULT t_Result = S_OK ; BSTR t_ClassContext = NULL ; BSTR t_InstanceContext = NULL ; BOOL t_Dynamic = FALSE ; t_Result = GetClassAndInstanceContext ( a_Class , a_Instance , t_ClassContext , t_InstanceContext , t_Dynamic ) ; if ( SUCCEEDED ( t_Result ) ) { if ( t_Dynamic ) { IWbemQualifierSet *t_InstanceQualifierObject = NULL ; t_Result = a_Instance->GetQualifierSet ( & t_InstanceQualifierObject ) ; if ( SUCCEEDED ( t_Result ) ) { VARIANT t_Variant ; VariantInit ( & t_Variant ) ; BSTR t_Property = NULL ; CIMTYPE t_Type = CIM_EMPTY ; a_Instance->BeginEnumeration ( WBEM_FLAG_NONSYSTEM_ONLY ) ; while ( SUCCEEDED ( t_Result ) && ( a_Instance->Next ( 0 , & t_Property , &t_Variant , &t_Type , NULL ) == WBEM_NO_ERROR ) ) { BSTR t_PropertyContext = NULL ; BSTR t_Provider = NULL ; IWbemQualifierSet *t_PropertyQualifierSet = NULL ; if ( ( a_Instance->GetPropertyQualifierSet ( t_Property , &t_PropertyQualifierSet ) ) == WBEM_NO_ERROR ) { VARIANT t_DynamicVariant ; VariantInit ( & t_DynamicVariant ) ; LONG t_Flag = 0 ; if ( SUCCEEDED ( t_PropertyQualifierSet->Get ( ProviderSubSystem_Globals :: s_Dynamic , 0 , & t_DynamicVariant , &t_Flag ) ) ) { if ( t_DynamicVariant.vt == VT_BOOL ) { if ( t_DynamicVariant.boolVal == VARIANT_TRUE ) { VARIANT t_ProviderVariant ; VariantInit ( & t_ProviderVariant ) ; t_Flag = 0 ; if ( SUCCEEDED ( t_PropertyQualifierSet->Get ( ProviderSubSystem_Globals :: s_Provider , 0 , & t_ProviderVariant , &t_Flag ) ) ) { if ( t_ProviderVariant.vt == VT_BSTR ) { t_Provider = SysAllocString ( t_ProviderVariant.bstrVal ) ; } else { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } VariantClear ( & t_ProviderVariant ) ; } else { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } VARIANT t_PropertyContextVariant ; VariantInit ( & t_PropertyContextVariant ) ; t_Flag = 0 ; if ( SUCCEEDED ( t_PropertyQualifierSet->Get ( ProviderSubSystem_Globals :: s_PropertyContext , 0 , & t_PropertyContextVariant , &t_Flag ) ) ) { if ( t_PropertyContextVariant.vt == VT_BSTR ) { t_PropertyContext = SysAllocString ( t_PropertyContextVariant.bstrVal ) ; } else { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } VariantClear ( & t_PropertyContextVariant ) ; } } } else { t_Result = WBEM_E_INVALID_PROVIDER_REGISTRATION ; } VariantClear ( & t_DynamicVariant ) ; } t_PropertyQualifierSet->Release(); } if ( SUCCEEDED ( t_Result ) && t_Provider ) { // // discard the error here, as we did in W2K // HRESULT t_ResultInner = ReadOrWrite ( a_Context , a_Instance , t_ClassContext , t_InstanceContext , t_PropertyContext , t_Provider , t_Property , a_Read ) ; } if ( t_PropertyContext ) { SysFreeString ( t_PropertyContext ) ; } if ( t_Provider ) { SysFreeString ( t_Provider ) ; } VariantClear ( & t_Variant ) ; SysFreeString ( t_Property ) ; } t_InstanceQualifierObject->Release () ; } else { t_Result = WBEM_E_CRITICAL_ERROR ; } } if ( t_ClassContext ) { SysFreeString ( t_ClassContext ) ; } if ( t_InstanceContext ) { SysFreeString ( t_InstanceContext ) ; } } return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_DynamicPropertyProviderResolver :: Read ( IWbemContext *a_Context , IWbemClassObject *a_Class , IWbemClassObject **a_Instance ) { IWbemClassObject *t_Object = *a_Instance ; HRESULT t_Result = ReadOrWrite ( a_Context , a_Class , t_Object , TRUE ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_DynamicPropertyProviderResolver :: Write ( IWbemContext *a_Context , IWbemClassObject *a_Class , IWbemClassObject *a_Instance ) { HRESULT t_Result = ReadOrWrite ( a_Context , a_Class , a_Instance , FALSE ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_DynamicPropertyProviderResolver :: Initialize ( LPWSTR a_User, LONG a_Flags, LPWSTR a_Namespace, LPWSTR a_Locale, IWbemServices *a_Core , // For anybody IWbemContext *a_Context , IWbemProviderInitSink *a_Sink // For init signals ) { HRESULT t_Result = S_OK ; if ( a_User ) { m_User = SysAllocString ( a_User ) ; if ( ! m_User ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } if ( SUCCEEDED ( t_Result ) ) { if ( a_Locale ) { m_Locale = SysAllocString ( a_Locale ) ; if ( ! m_Locale ) { t_Result = WBEM_E_OUT_OF_MEMORY ; } } } a_Sink->SetStatus ( t_Result , 0 ) ; return t_Result ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ HRESULT CServerObject_DynamicPropertyProviderResolver :: Shutdown ( LONG a_Flags , ULONG a_MaxMilliSeconds , IWbemContext *a_Context ) { return S_OK ; }