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

789 lines
16 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
ProvResv.cpp
Abstract:
History:
--*/
#include "PreComp.h"
#include <wbemint.h>
#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 ;
}