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.
 
 
 
 
 
 

419 lines
10 KiB

//***************************************************************************
//
// NTEVTQUERY.CPP
//
// Module: WBEM NT EVENT PROVIDER
//
// Purpose: Contains the taskobject implementation
//
// Copyright (c) 1996-2001 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
#include "precomp.h"
WbemTaskObject :: WbemTaskObject (
CImpNTEvtProv *a_Provider ,
IWbemObjectSink *a_NotificationHandler ,
ULONG a_OperationFlag ,
IWbemContext *a_Ctx
) : m_State ( WBEM_TASKSTATE_START ) ,
m_OperationFlag ( a_OperationFlag ) ,
m_Provider ( a_Provider ) ,
m_NotificationHandler ( a_NotificationHandler ) ,
m_Ctx ( a_Ctx ) ,
m_RequestHandle ( 0 ) ,
m_ClassObject ( NULL ) ,
m_AClassObject ( NULL )
{
//No need to AddRef these 'cos our lifetime is less than the the function creating us!!
// m_Provider->AddRef () ;
// m_NotificationHandler->AddRef () ;
// m_Ctx->AddRef () ;
HRESULT hr = CImpNTEvtProv::GetImpersonation();
if (FAILED(hr))
{
//either FAILED or ACCESS_DENIED
if (hr == WBEM_E_FAILED)
{
m_ErrorObject.SetStatus (WBEM_PROV_E_FAILED);
m_ErrorObject.SetWbemStatus (WBEM_E_FAILED);
m_ErrorObject.SetMessage (L"Failed to impersonate client");
}
else
{
m_ErrorObject.SetStatus (WBEM_PROV_E_ACCESS_DENIED);
m_ErrorObject.SetWbemStatus (WBEM_E_ACCESS_DENIED);
m_ErrorObject.SetMessage (L"Access denied, impersonation level too low");
}
}
}
WbemTaskObject :: ~WbemTaskObject ()
{
//Didn't AddRef so don't Release
// m_Provider->Release () ;
// m_NotificationHandler->Release () ;
// m_Ctx->Release () ;
if ( m_ClassObject )
m_ClassObject->Release () ;
if ( m_AClassObject )
m_AClassObject->Release () ;
WbemCoRevertToSelf();
}
WbemProvErrorObject &WbemTaskObject :: GetErrorObject ()
{
return m_ErrorObject ;
}
BOOL WbemTaskObject :: GetClassObject ( BSTR a_Class )
{
BOOL retVal = FALSE;
IWbemServices *t_Server = m_Provider->GetServer() ;
if (t_Server)
{
retVal = GetClassObject(a_Class, FALSE, t_Server, m_Ctx, &m_ClassObject);
if (retVal)
{
GetClassObject(a_Class, TRUE, t_Server, m_Ctx, &m_AClassObject);
}
t_Server->Release () ;
}
return retVal;
}
BOOL WbemTaskObject :: GetClassObject ( BSTR a_Class, BOOL a_bAmended, IWbemServices *a_Server, IWbemContext *a_Ctx, IWbemClassObject **a_ppClass )
{
DWORD dwIndex = NT_EVTLOG_MAX_CLASSES;
BOOL retVal = FALSE;
if (a_Class && a_ppClass)
{
if (_wcsicmp(a_Class, NTEVT_CLASS) == 0)
{
dwIndex = a_bAmended ? 0 : 1;
}
else if (_wcsicmp(a_Class, NTEVTLOG_CLASS) == 0)
{
dwIndex = a_bAmended ? 2 : 3;
}
else if (_wcsicmp(a_Class, ASSOC_LOGRECORD) == 0)
{
dwIndex = 4;
}
else if (_wcsicmp(a_Class, ASSOC_USERRECORD) == 0)
{
dwIndex = 5;
}
else if (_wcsicmp(a_Class, ASSOC_COMPRECORD) == 0)
{
dwIndex = 6;
}
if (dwIndex < NT_EVTLOG_MAX_CLASSES)
{
if (g_ClassArray[dwIndex] == NULL)
{
if (SUCCEEDED(a_Server->GetObject (
a_Class ,
a_bAmended ? WBEM_FLAG_USE_AMENDED_QUALIFIERS : 0 ,
a_Ctx,
a_ppClass,
NULL
) ))
{
g_ClassArray[dwIndex] = *a_ppClass ;
g_ClassArray[dwIndex]->AddRef() ;
retVal = TRUE;
}
}
else
{
*a_ppClass = g_ClassArray[dwIndex];
(*a_ppClass)->AddRef();
retVal = TRUE;
}
}
}
return retVal;
}
BOOL WbemTaskObject :: GetExtendedNotifyStatusObject ( IWbemClassObject **a_NotifyObject )
{
IWbemClassObject *t_NotificationClassObject = NULL ;
IWbemClassObject *t_ErrorObject = NULL ;
BOOL t_Status = TRUE ;
WbemProvErrorObject t_ErrorStatusObject ;
if ( t_NotificationClassObject = m_Provider->GetExtendedNotificationObject ( t_ErrorStatusObject, m_Ctx ) )
{
HRESULT t_Result = t_NotificationClassObject->SpawnInstance ( 0 , a_NotifyObject ) ;
if ( SUCCEEDED ( t_Result ) )
{
VARIANT t_Variant ;
VariantInit ( &t_Variant ) ;
t_Variant.vt = VT_I4 ;
t_Variant.lVal = m_ErrorObject.GetWbemStatus () ;
t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_STATUSCODE , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
#if 0
if ( SUCCEEDED ( t_Result ) )
{
t_Variant.vt = VT_I4 ;
t_Variant.lVal = m_ErrorObject.GetStatus () ;
t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_PROVSTATUSCODE , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
#endif
if ( SUCCEEDED ( t_Result ) )
{
if ( m_ErrorObject.GetMessage () )
{
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( m_ErrorObject.GetMessage () ) ;
if ( NULL != t_Variant.bstrVal )
{
t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_PROVSTATUSMESSAGE , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( m_ErrorObject.GetPrivilegeFailed() )
{
if (m_ErrorObject.SetPrivRequiredVariant(t_Variant))
{
t_Result = (*a_NotifyObject)->Put(WBEM_PROPERTY_PRIVREQUIRED, 0, &t_Variant, 0);
VariantClear ( &t_Variant ) ;
if (SUCCEEDED(t_Result))
{
if (m_ErrorObject.SetPrivFailedVariant(t_Variant))
{
t_Result = (*a_NotifyObject)->Put(WBEM_PROPERTY_PRIVNOTHELD, 0, &t_Variant, 0);
VariantClear ( &t_Variant ) ;
}
else
{
t_Result = WBEM_E_FAILED;
}
}
}
else
{
t_Result = WBEM_E_FAILED;
}
}
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
if ( ! SUCCEEDED ( t_Result ) )
{
(*a_NotifyObject)->Release () ;
*a_NotifyObject = NULL;
t_Status = GetNotifyStatusObject ( a_NotifyObject ) ;
}
}
}
else
{
(*a_NotifyObject)->Release () ;
t_Status = GetNotifyStatusObject ( a_NotifyObject ) ;
}
#if 0
}
else
{
(*a_NotifyObject)->Release () ;
t_Status = GetNotifyStatusObject ( a_NotifyObject ) ;
}
#endif
t_NotificationClassObject->Release () ;
}
else
{
t_Status = GetNotifyStatusObject ( a_NotifyObject ) ;
}
}
else
{
t_Status = GetNotifyStatusObject ( a_NotifyObject ) ;
}
return t_Status ;
}
BOOL WbemTaskObject :: GetNotifyStatusObject ( IWbemClassObject **a_NotifyObject )
{
IWbemClassObject *t_NotificationClassObject = NULL ;
BOOL t_Status = TRUE ;
WbemProvErrorObject t_ErrorStatusObject ;
if ( t_NotificationClassObject = m_Provider->GetNotificationObject ( t_ErrorStatusObject, m_Ctx ) )
{
HRESULT t_Result = t_NotificationClassObject->SpawnInstance ( 0 , a_NotifyObject ) ;
if ( SUCCEEDED ( t_Result ) )
{
VARIANT t_Variant ;
VariantInit ( &t_Variant ) ;
t_Variant.vt = VT_I4 ;
t_Variant.lVal = m_ErrorObject.GetWbemStatus () ;
t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_STATUSCODE , 0 , & t_Variant , 0 ) ;
if ( SUCCEEDED ( t_Result ) )
{
if ( m_ErrorObject.GetMessage () )
{
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( m_ErrorObject.GetMessage () ) ;
if ( NULL != t_Variant.bstrVal )
{
t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_PROVSTATUSMESSAGE , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
}
else
{
t_Result = WBEM_E_OUT_OF_MEMORY ;
}
if ( ! SUCCEEDED ( t_Result ) )
{
t_Status = FALSE ;
(*a_NotifyObject)->Release () ;
(*a_NotifyObject)=NULL ;
}
}
}
else
{
(*a_NotifyObject)->Release () ;
(*a_NotifyObject)=NULL ;
t_Status = FALSE ;
}
VariantClear ( &t_Variant ) ;
t_NotificationClassObject->Release () ;
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
return t_Status ;
}
BOOL WbemProvErrorObject::SetPrivVariant ( VARIANT &a_V, DWORD dwVal )
{
BOOL retVal = FALSE;
SAFEARRAYBOUND rgsabound[1];
SAFEARRAY* psa = NULL;
rgsabound[0].lLbound = 0;
VariantInit(&a_V);
rgsabound[0].cElements = 0;
if (dwVal & PROV_PRIV_BACKUP)
{
rgsabound[0].cElements++;
}
if (dwVal & PROV_PRIV_SECURITY)
{
rgsabound[0].cElements++;
}
if (rgsabound[0].cElements != 0)
{
psa = SafeArrayCreate(VT_BSTR, 1, rgsabound);
BSTR* pBstr = NULL;
if (NULL != psa)
{
if (SUCCEEDED(SafeArrayAccessData(psa, (void **)&pBstr)))
{
DWORD indx = 0;
retVal = TRUE ;
if (dwVal & PROV_PRIV_SECURITY)
{
BSTR t_Str = SysAllocString(SE_SECURITY_NAME);
pBstr[indx++] = t_Str ;
if ( NULL == t_Str )
{
retVal = FALSE ;
}
}
if ( retVal )
{
if (dwVal & PROV_PRIV_BACKUP)
{
BSTR t_Str = SysAllocString(SE_BACKUP_NAME);
pBstr[indx] = t_Str ;
if ( NULL == t_Str )
{
retVal = FALSE ;
}
}
}
SafeArrayUnaccessData(psa);
if ( retVal )
{
a_V.vt = VT_ARRAY|VT_BSTR;
a_V.parray = psa;
}
else
{
SafeArrayDestroy ( psa ) ;
}
}
}
}
if (!retVal)
{
VariantClear(&a_V);
}
return retVal;
}