//*************************************************************************** // // NTEVTMTHD.CPP // // Module: WBEM NT EVENT PROVIDER // // Purpose: Contains the ExecMethod implementation // // Copyright (c) 1996-2001 Microsoft Corporation, All Rights Reserved // //*************************************************************************** #include "precomp.h" BOOL ExecMethodAsyncEventObject :: ExecMethod ( WbemProvErrorObject &a_ErrorObject ) { DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod\r\n" ) ; ) if (FAILED(m_ErrorObject.GetWbemStatus())) { return FALSE; } BOOL t_Status = ! m_ObjectPathParser.Parse ( m_ObjectPath , &m_ParsedObjectPath ) ; if ( t_Status ) { if ( _wcsicmp ( m_ParsedObjectPath->m_pClass , NTEVTLOG_CLASS ) == 0 ) { t_Status = GetClassObject ( m_ParsedObjectPath->m_pClass ) ; if ( t_Status ) { IWbemClassObject * tmp = NULL; IWbemClassObject * outclass = NULL; t_Status = SUCCEEDED(m_ClassObject->GetMethod(m_Method, 0, &tmp, &outclass)); if (tmp != NULL) { tmp->Release(); } if ((t_Status) && (outclass != NULL)) { t_Status = SUCCEEDED(outclass->SpawnInstance(0, &m_pOutClass)); if (!t_Status) { a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Unable to spawn result object" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod:Unable to spawn result object\r\n" ) ; ) } else { t_Status = Dispatch_EventLog ( a_ErrorObject ) ; if ( t_Status ) { m_State = WBEM_TASKSTATE_ASYNCHRONOUSCOMPLETE ; } } outclass->Release(); } else { t_Status = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Unable to get result class object" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod:Unable to get result class object\r\n" ) ; ) } } else { t_Status = FALSE ; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Class definition not found" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod:Class definition not found\r\n" ) ; ) } } else { t_Status = FALSE ; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_CLASS ) ; a_ErrorObject.SetMessage ( L"Dynamic NT Eventlog Provider does not methods support on this class" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod:Dynamic NT Eventlog Provider does not methods support on this class\r\n" ) ; ) } } else { t_Status = FALSE ; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_CLASS ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"Unable to parse object path" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod:Unable to parse object path %s\r\n", m_ObjectPath ) ; ) } DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod:returning with %lx\r\n", t_Status ) ; ) return t_Status ; } BOOL ExecMethodAsyncEventObject :: Dispatch_EventLog ( WbemProvErrorObject &a_ErrorObject ) { DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: Dispatch_EventLog\r\n" ) ; ) if (m_ParsedObjectPath->m_dwNumKeys != 1) { a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"Object path has incorrect number of keys." ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"GetObjectAsyncEventObject :: Dispatch_EventLog: Wrong number of key values\r\n" ) ; ) return FALSE; } BOOL t_Status ; KeyRef *t_Key1 = m_ParsedObjectPath->m_paKeys [ 0 ] ; if ( t_Key1 ) { if ((t_Key1->m_pName == NULL) || _wcsicmp ( t_Key1->m_pName , PROP_NAME ) == 0 ) { if ( t_Key1->m_vValue.vt == VT_BSTR ) { t_Status = ExecMethod_EventLog ( a_ErrorObject , t_Key1 ) ; } else { t_Status = FALSE ; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"Key value have incorrect type" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: Dispatch_EventLog: Key value has incorrect type\r\n" ) ; ) } } else { t_Status = FALSE ; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"Key value has incorrect name" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: Dispatch_EventLog: Key value has incorrect name\r\n" ) ; ) } } else { t_Status = FALSE ; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"Failed to get key value" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: Dispatch_EventLog:Failed to get key value\r\n" ) ; ) } DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: Dispatch_EventLog:returning with %lx\r\n", t_Status ) ; ) return t_Status ; } BOOL ExecMethodAsyncEventObject :: ExecMethod_EventLog ( WbemProvErrorObject &a_ErrorObject , KeyRef *a_FileKey) { DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog\r\n" ) ; ) BOOL retVal = TRUE; VARIANT v; VariantInit(&v); CIMTYPE cT = VT_NULL; if (m_InParamObject != NULL) { HRESULT hr = m_InParamObject->Get(METHOD_PARAM, 0, &v, &cT, NULL); if (SUCCEEDED(hr)) { if (cT != CIM_STRING) { retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"ArchiveFileName parameter should be a string" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:ArchiveFileName parameter should be a string\r\n" ) ; ) } } else { retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"ArchiveFileName parameter not found in supplied InParam object" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:ArchiveFileName parameter not found in supplied InParam object\r\n" ) ; ) } } DWORD x = ERROR_SUCCESS; if (retVal) { if (_wcsicmp(m_Method, L"ClearEventlog") == 0) { wchar_t* param = NULL; if ((v.vt != VT_BSTR) && (v.vt != VT_NULL)) { retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"ArchiveFileName parameter not found in supplied InParam object" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:ArchiveFileName parameter not found in supplied InParam object\r\n" ) ; ) } else if (v.vt == VT_BSTR) { param = v.bstrVal; } if (retVal) { CStringW log = CEventLogFile::GetLogName((const wchar_t*)a_FileKey->m_vValue.bstrVal); if (log.IsEmpty()) { retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Could not find specified Eventlog" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:Could not find specified Eventlog\r\n" ) ; ) } else { CEventlogFileAttributes evtLog(log); x = evtLog.EventLogOperation(param, TRUE, a_ErrorObject, retVal); } } } else if (_wcsicmp(m_Method, L"BackupEventlog") == 0) { if (v.vt != VT_BSTR) { retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"ArchiveFileName parameter not found in supplied InParam object" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:ArchiveFileName parameter not found in supplied InParam object\r\n" ) ; ) } else { CStringW log = CEventLogFile::GetLogName((const wchar_t*)a_FileKey->m_vValue.bstrVal); if (log.IsEmpty()) { retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Could not find specified Eventlog" ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:Could not find specified Eventlog\r\n" ) ; ) } else { CEventlogFileAttributes evtLog(log); x = evtLog.EventLogOperation(v.bstrVal, FALSE, a_ErrorObject, retVal); } } } else { retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_INVALID_PARAMETER ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_INVALID_PARAMETER ) ; a_ErrorObject.SetMessage ( L"Unknown method name supplied." ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:Unknown method name supplied.\r\n" ) ; ) } } if (x != ERROR_SUCCESS) { wchar_t* buff = NULL; if (0 == FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, x, 0, (LPWSTR) &buff, 80, NULL)) { DWORD dwErr = GetLastError(); DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:Calling underlying Eventlog API failed.\r\n" ) ; ) } else { DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:%s\r\n", buff ) ; ) LocalFree(buff); } } VariantClear(&v); if (retVal) { // set out-param VariantInit(&v); v.vt = VT_I4; v.lVal = x; HRESULT hr = m_pOutClass->Put(METHOD_RESULT_PARAM, 0, &v, 0); if (FAILED(hr)) { retVal = FALSE; a_ErrorObject.SetStatus ( WBEM_PROV_E_UNEXPECTED ) ; a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_ErrorObject.SetMessage ( L"Unable to put OutParam value." ) ; DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:Unable to put OutParam value.\r\n" ) ; ) m_pOutClass->Release(); m_pOutClass = NULL; } else { m_bIndicateOutParam = TRUE; } VariantClear(&v); } DebugOut( CNTEventProvider::g_NTEvtDebugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, L"ExecMethodAsyncEventObject :: ExecMethod_EventLog:returning with %lx\r\n", retVal ) ; ) return retVal; } ExecMethodAsyncEventObject :: ExecMethodAsyncEventObject ( CImpNTEvtProv *a_Provider , wchar_t *a_ObjectPath , wchar_t *a_MethodName, ULONG a_Flag , IWbemClassObject *a_InParams , IWbemObjectSink *a_NotificationHandler , IWbemContext *pCtx ) : WbemTaskObject ( a_Provider , a_NotificationHandler , a_Flag , pCtx ) , m_Class ( NULL ), m_InParamObject( NULL ), m_bIndicateOutParam ( FALSE ), m_pOutClass ( NULL ), m_ParsedObjectPath ( NULL ) { m_InParamObject = a_InParams ; if (m_InParamObject != NULL) { m_InParamObject->AddRef(); } m_ObjectPath = UnicodeStringDuplicate ( a_ObjectPath ) ; m_Method = UnicodeStringDuplicate ( a_MethodName ) ; } ExecMethodAsyncEventObject :: ~ExecMethodAsyncEventObject () { if (m_pOutClass != NULL) { if ( m_bIndicateOutParam && (SUCCEEDED(m_ErrorObject.GetWbemStatus ())) ) { HRESULT t_Result = m_NotificationHandler->Indicate(1, &m_pOutClass); } m_pOutClass->Release(); } if (m_InParamObject != NULL) { m_InParamObject->Release(); } delete [] m_ObjectPath ; delete [] m_Method ; delete m_ParsedObjectPath; // 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 ) ; } } void ExecMethodAsyncEventObject :: Process () { ExecMethod ( m_ErrorObject ) ; }