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
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 ) ;
|
|
}
|