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.
 
 
 
 
 
 

313 lines
8.8 KiB

//***************************************************************************
//
// NTEVTPUT.CPP
//
// Module: WBEM NT EVENT PROVIDER
//
// Purpose: Contains the PutObject implementation
//
// Copyright (c) 1996-2001 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
#include "precomp.h"
BOOL PutInstanceAsyncEventObject :: PutInstance ( WbemProvErrorObject &a_ErrorObject )
{
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance\r\n"
) ;
)
if (FAILED(m_ErrorObject.GetWbemStatus()))
{
return FALSE;
}
VARIANT v;
VariantInit (&v);
BOOL t_Status = SUCCEEDED(m_InstObject->Get(CLASS_PROP, 0, &v, NULL, NULL));
if (( t_Status ) && (VT_BSTR == v.vt))
{
if ( _wcsicmp ( v.bstrVal , NTEVTLOG_CLASS) == 0 )
{
if ( t_Status )
{
t_Status = Dispatch_EventLog ( a_ErrorObject ) ;
if ( t_Status )
{
m_State = WBEM_TASKSTATE_ASYNCHRONOUSCOMPLETE ;
}
}
else
{
}
}
/*
else if ( _wcsicmp ( v.bstrVal , some_other_class) == 0 )
{
if ( t_Status )
{
t_Status = Dispatch_some_other_class ( a_ErrorObject ) ;
if ( t_Status )
{
m_State = WBEM_TASKSTATE_ASYNCHRONOUSCOMPLETE ;
}
}
else
{
}
}
*/
else
{
t_Status = FALSE ;
a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ;
a_ErrorObject.SetWbemStatus ( WBEM_E_PROVIDER_NOT_CAPABLE ) ;
a_ErrorObject.SetMessage ( L"Dynamic NT Eventlog Provider does not support WRITE for this class" ) ;
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:Dynamic NT Eventlog Provider does not support WRITE for this class\r\n"
) ;
)
}
}
else
{
t_Status = FALSE ;
a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ;
a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_OBJECT ) ;
a_ErrorObject.SetMessage ( L"Unable to obtain class name from object." ) ;
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:Unable to obtain class name from object.\r\n"
) ;
)
}
VariantClear(&v);
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:returning %lx\r\n",
t_Status
) ;
)
return t_Status ;
}
BOOL PutInstanceAsyncEventObject :: Dispatch_EventLog ( WbemProvErrorObject &a_ErrorObject )
{
if (WBEM_FLAG_CREATE_ONLY == (m_OperationFlag & WBEM_FLAG_CREATE_ONLY))
{
a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_OPERATION ) ;
a_ErrorObject.SetWbemStatus ( WBEM_E_PROVIDER_NOT_CAPABLE ) ;
a_ErrorObject.SetMessage ( L"WBEM_FLAG_CREATE_ONLY is unsupported, modify only!" ) ;
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:WBEM_FLAG_CREATE_ONLY is unsupported, modify only!\r\n"
) ;
)
return FALSE ;
}
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance\r\n"
) ;
)
VARIANT v;
VariantInit(&v);
BOOL t_Status = SUCCEEDED(m_InstObject->Get(PROP_NAME, 0, &v, NULL, NULL));
if (( t_Status ) && (VT_BSTR == v.vt))
{
CStringW log = CEventLogFile::GetLogName(v.bstrVal);
if (log.IsEmpty())
{
t_Status = FALSE ;
a_ErrorObject.SetStatus (WBEM_PROV_E_INVALID_CLASS ) ;
a_ErrorObject.SetWbemStatus (WBEM_E_INVALID_OBJECT ) ;
a_ErrorObject.SetMessage (L"Unable to find log file specified.");
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:Unable to find log file specified.\r\n"
) ;
)
}
else
{
VariantClear(&v);
VariantInit(&v);
t_Status = SUCCEEDED(m_InstObject->Get(PROP_LOGNAME, 0, &v, NULL, NULL));
if (( t_Status ) && (VT_BSTR == v.vt) && (0 == _wcsicmp(log, v.bstrVal)))
{
CEventlogFileAttributes evtLog(log);
DWORD dwR = evtLog.UpdateRegistry(m_InstObject);
if (ERROR_SUCCESS != dwR)
{
t_Status = FALSE;
a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ;
a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ;
wchar_t* buff = NULL;
if (0 == FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dwR, 0, (LPWSTR) &buff, 80, NULL))
{
DWORD x = GetLastError();
a_ErrorObject.SetMessage (L"Failed to write some (maybe all) data.");
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:Failed to write some (maybe all) data.\r\n"
) ;
)
}
else
{
a_ErrorObject.SetMessage (buff) ;
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:%s.\r\n",
buff
) ;
)
LocalFree(buff);
}
}
}
else
{
t_Status = FALSE;
a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ;
a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ;
a_ErrorObject.SetMessage (L"Logfilename doesn't match name property (key)") ;
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:Logfilename doesn't match name property (key)\r\n"
) ;
)
}
}
}
else
{
t_Status = FALSE ;
a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ;
a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_OBJECT ) ;
a_ErrorObject.SetMessage ( L"Unable to obtain key property from object." ) ;
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:Unable to obtain key property from object.\r\n"
) ;
)
}
VariantClear(&v);
DebugOut(
CNTEventProvider::g_NTEvtDebugLog->Write (
_T(__FILE__),__LINE__,
L"PutInstanceAsyncEventObject :: PutInstance:returning %lx\r\n",
t_Status
) ;
)
return t_Status ;
}
PutInstanceAsyncEventObject :: PutInstanceAsyncEventObject (
CImpNTEvtProv *a_Provider ,
IWbemClassObject* a_Inst ,
ULONG a_OperationFlag ,
IWbemObjectSink *a_NotificationHandler ,
IWbemContext *a_Ctx
) : WbemTaskObject ( a_Provider , a_NotificationHandler , a_OperationFlag , a_Ctx ) ,
m_InstObject ( NULL )
{
m_InstObject = a_Inst ;
if (m_InstObject != NULL)
{
m_InstObject->AddRef();
}
}
PutInstanceAsyncEventObject :: ~PutInstanceAsyncEventObject ()
{
// Get Status object
IWbemClassObject *t_NotifyStatus = NULL ;
BOOL t_Status = TRUE;
if (WBEM_NO_ERROR != m_ErrorObject.GetWbemStatus ())
{
t_Status = GetExtendedNotifyStatusObject ( &t_NotifyStatus ) ;
}
if ( t_Status )
{
HRESULT t_Result = m_NotificationHandler->SetStatus ( 0 , m_ErrorObject.GetWbemStatus () , 0 , t_NotifyStatus ) ;
if (t_NotifyStatus)
{
t_NotifyStatus->Release () ;
}
}
else
{
HRESULT t_Result = m_NotificationHandler->SetStatus ( 0 , m_ErrorObject.GetWbemStatus () , 0 , NULL ) ;
}
if (m_InstObject != NULL)
{
m_InstObject->Release();
}
}
void PutInstanceAsyncEventObject :: Process ()
{
PutInstance ( m_ErrorObject ) ;
}