|
|
//***************************************************************************
//
// SYSTEM.CPP
//
// Module: HEALTHMON SERVER AGENT
//
// Purpose: This HMMACHINE class only has one instance. Its main member
// function is called each time the polling interval goes off. It then goes
// through all of the CDataGroups, CDataCollectors, and CThresholds.
//
// Copyright (c)1999 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
#include <process.h>
#include <tchar.h>
//#include <objbase.h>
#include "global.h"
#include "system.h"
extern HANDLE g_hConfigLock; extern CSystem* g_pSystem; extern CSystem* g_pStartupSystem; extern LPTSTR conditionLocStr[]; extern LPTSTR stateLocStr[]; extern HMODULE g_hModule; extern HRESULT SetLocStrings(void); extern void ClearLocStrings(void);
static BYTE LocalSystemSID[] = {1,1,0,0,0,0,0,5,18,0,0,0}; //////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSystem::CSystem() { MY_OUTPUT(L"ENTER ***** CSystem::CSystem...", 4);
g_pIWbemServices = NULL; g_pIWbemServicesCIMV2 = NULL; m_lAgentInterval = 0; m_lStartupDelayTime = 0; m_lFiveMinTimerTime = 0; m_lNumInstancesAccepted = 20; m_lNumberChanges = 0; m_bEnabled = FALSE; m_lCurrState = HM_GOOD; m_lPrevState = HM_GOOD; m_startTick = GetTickCount(); m_szGUID = NULL; m_hmStatusType = HMSTATUS_SYSTEM; m_lNumberNormals = 0; m_lNumberWarnings = 0; m_lNumberCriticals = 0; m_lNumberChanges = 0; m_lPrevChildCount = 0; m_szMessage = NULL; m_szResetMessage = NULL; CThreshold::GetLocal(); m_pTempSink = NULL; m_pEFTempSink = NULL; m_pECTempSink = NULL; m_pFTCBTempSink = NULL; m_pEFModTempSink = NULL; m_pECModTempSink = NULL; m_pFTCBModTempSink = NULL; m_processInfo.hProcess = NULL; m_bValidLoad = FALSE; m_numActionChanges = 0;
MY_OUTPUT(L"EXIT ***** CSystem::CSystem...", 4); }
CSystem::~CSystem() { int i, iSize; CDataGroup* pDataGroup; CAction* pAction;
MY_OUTPUT(L"ENTER ***** ~CSystem::~CSystem...", 4);
// g_pStartupSystem->RemovePointerFromMasterList(this);
if (m_pTempSink) { g_pIWbemServices->CancelAsyncCall((IWbemObjectSink*)m_pTempSink); m_pTempSink->Release(); m_pTempSink = NULL; } if (m_pEFTempSink) { g_pIWbemServices->CancelAsyncCall((IWbemObjectSink*)m_pEFTempSink); m_pEFTempSink->Release(); m_pEFTempSink = NULL; } if (m_pECTempSink) { g_pIWbemServices->CancelAsyncCall((IWbemObjectSink*)m_pECTempSink); m_pECTempSink->Release(); m_pECTempSink = NULL; } if (m_pFTCBTempSink) { g_pIWbemServices->CancelAsyncCall((IWbemObjectSink*)m_pFTCBTempSink); m_pFTCBTempSink->Release(); m_pFTCBTempSink = NULL; } if (m_pEFModTempSink) { g_pIWbemServices->CancelAsyncCall((IWbemObjectSink*)m_pEFTempSink); m_pEFTempSink->Release(); m_pEFTempSink = NULL; } if (m_pECModTempSink) { g_pIWbemServices->CancelAsyncCall((IWbemObjectSink*)m_pECTempSink); m_pECTempSink->Release(); m_pECTempSink = NULL; } if (m_pFTCBModTempSink) { g_pIWbemServices->CancelAsyncCall((IWbemObjectSink*)m_pFTCBTempSink); m_pFTCBTempSink->Release(); m_pFTCBTempSink = NULL; }
if (m_szGUID) { delete [] m_szGUID; m_szGUID = NULL; }
if (m_szMessage) { delete [] m_szMessage; m_szMessage = NULL; } if (m_szResetMessage) { delete [] m_szResetMessage; m_szResetMessage = NULL; }
if (g_pSystemEventSink != NULL) { g_pSystemEventSink->Release(); g_pSystemEventSink = NULL; }
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; delete pDataGroup; }
iSize = m_actionList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; delete pAction; }
CDataGroup::DGTerminationCleanup(); CDataCollector::DETerminationCleanup(); CThreshold::ThresholdTerminationCleanup(); CBase::CleanupHRLList(); CBase::CleanupEventLists(); ClearLocStrings(); m_bValidLoad = FALSE;
MY_OUTPUT(L"EXIT ***** ~CSystem::~CSystem...", 4); }
BOOL CSystem::InitWbemPointer(void) { HRESULT hRetRes = S_OK; BSTR bsNamespace = NULL; IWbemLocator *pLocator = NULL;
MY_OUTPUT(L"ENTER ***** CSystem::InitWbemPointers...", 4); hRetRes = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*) &pLocator); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
bsNamespace = SysAllocString(L"\\\\.\\root\\cimv2\\MicrosoftHealthMonitor"); MY_ASSERT(bsNamespace); if (!bsNamespace) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = pLocator->ConnectServer(bsNamespace, NULL, NULL, NULL, 0L, NULL, NULL, &g_pIWbemServices); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; SysFreeString(bsNamespace); bsNamespace = NULL; MY_OUTPUT(L"CSystem::InitWbemPointer()-Connected to namespace", 4);
bsNamespace = SysAllocString(L"\\\\.\\root\\cimv2"); MY_ASSERT(bsNamespace); if (!bsNamespace) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = pLocator->ConnectServer( bsNamespace, NULL, NULL, NULL, 0L, NULL, NULL, &g_pIWbemServicesCIMV2); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; SysFreeString(bsNamespace); bsNamespace = NULL;
pLocator->Release(); pLocator = NULL;
MY_OUTPUT(L"EXIT ***** CSystem::InitWbemPointers...", 4); return TRUE;
error: MY_ASSERT(FALSE); if (pLocator) pLocator->Release(); if (bsNamespace) SysFreeString(bsNamespace); return FALSE; }
HRESULT CSystem::InternalizeHMNamespace(void) { HRESULT hRes; HRESULT hRetRes; IWbemClassObject* pObj = NULL; IWbemClassObject* pNewObj = NULL; IWbemCallResult *pResult = 0; int i, iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::InternalizeHMNamespace...", 4);
hRetRes = SetLocStrings(); if (hRetRes != S_OK) return hRetRes;
g_pStartupSystem = this; hRetRes = InternalizeSystem(); if (hRetRes==S_OK) { //
// This reads in all the components heirarchy from the HealthMon namespace.
// Each component reads in what is under it. DataPoints get read in, and they
// in turn read in their thresholds.
//
hRetRes = InternalizeDataGroups(); if (hRetRes==S_OK) { //
// Set our state to enabled, or disabled and transfer to the child thresholds
//
iSize = m_dataGroupList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SetParentEnabledFlag(m_bEnabled); } } else { g_pStartupSystem = NULL; return hRetRes; } } else { g_pStartupSystem = NULL; return hRetRes; }
// Implements the dormancy feature. If the agent has never been active
// before, we will be the first time, because a console connected to the box.
// Create this instance, that will keep us loaded from now on, even if
// WMI stops and starts.
// create an instance of TimerEvent Filter.
// instance of __EventFilter
// {
// Name = "MicrosoftHM_Filter";
// Query = "select * from __TimerEvent where TimerId=\"MicrosoftHM_Timer\"";
// QueryLanguage = "WQL";
// };
hRetRes = GetWbemObjectInst(&g_pIWbemServices, L"__EventFilter.Name=\"MicrosoftHM_Filter\"", NULL, &pObj); MY_HRESASSERT(hRetRes); if (!pObj) { hRetRes = GetWbemObjectInst(&g_pIWbemServices, L"__EventFilter", NULL, &pObj); MY_HRESASSERT(hRetRes); if (pObj) { pObj->SpawnInstance(0, &pNewObj); pObj->Release(); // Don't need the class any more
PutStrProperty(pNewObj, L"Name", L"MicrosoftHM_Filter"); PutStrProperty(pNewObj, L"Query", L"select * from __TimerEvent where TimerId=\"MicrosoftHM_Timer\""); PutStrProperty(pNewObj, L"QueryLanguage", L"WQL");
hRes = g_pIWbemServices->PutInstance(pNewObj, 0, NULL, &pResult); MY_HRESASSERT(hRes); pNewObj->Release(); pNewObj = NULL; } } else { pObj->Release(); pObj = NULL; }
g_pStartupSystem = NULL; MY_OUTPUT(L"EXIT ***** CSystem::InternalizeHMNamespace...", 4); return S_OK; }
//
// Get all the properties from the MicrosoftHM_SystemConfiguration instance
//
HRESULT CSystem::InternalizeSystem(void) { BSTR szString = NULL; IWbemClassObject* pInst = NULL; IWbemClassObject *pClassObject = NULL; BOOL fRes = TRUE; HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** CSystem::InternalizeSystem...", 4);
CalcCurrTime(); wcscpy(m_szDTTime, m_szDTCurrTime); wcscpy(m_szTime, m_szCurrTime);
//
// Get the properties from the SystemConfiguration instance
//
hRetRes = GetWbemObjectInst(&g_pIWbemServices, L"MicrosoftHM_SystemConfiguration.GUID=\"{@}\"", NULL, &pInst); if (!pInst) { MY_HRESASSERT(hRetRes); MY_OUTPUT(L"ERROR: Couldn't find MicrosoftHM_SYstemCOnfiguration", 4); return hRetRes; }
hRetRes = LoadInstanceFromMOF(pInst); pInst->Release(); pInst = NULL;
MY_OUTPUT(L"EXIT ***** CSystem::InternalizeSystem...", 4); return hRetRes; }
HRESULT CSystem::LoadInstanceFromMOF(IWbemClassObject* pInst) { int i, iSize; CDataGroup *pDataGroup;
HRESULT hRetRes = S_OK; BOOL bRetValue = TRUE;
MY_OUTPUT(L"ENTER ***** CSystem::LoadInstanceFromMOF...", 4);
m_bValidLoad = TRUE; if (m_szGUID == NULL) { // Get the GUID property
hRetRes = GetStrProperty(pInst, L"GUID", &m_szGUID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) return hRetRes; }
// if (bModifyPass == FALSE)
// {
// g_pStartupSystem->AddPointerToMasterList(this);
// }
m_lAgentInterval = HM_POLLING_INTERVAL;
hRetRes = GetUint32Property(pInst, L"StartupDelayTime", &m_lStartupDelayTime); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
hRetRes = GetUint32Property(pInst, L"MaxInstancesPerDataCollector", &m_lNumInstancesAccepted); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
hRetRes = GetStrProperty(pInst, L"Message", &m_szMessage); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
hRetRes = GetStrProperty(pInst, L"ResetMessage", &m_szResetMessage); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
hRetRes = GetBoolProperty(pInst, L"Enabled", &m_bEnabled); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
//
// Set our state to enabled, or disabled and transfer to the child thresholds
//
if (m_bEnabled==FALSE) { iSize = m_dataGroupList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SetParentEnabledFlag(FALSE); } } else { iSize = m_dataGroupList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SetParentEnabledFlag(TRUE); } }
m_bValidLoad = TRUE; MY_OUTPUT(L"EXIT ***** CSystem::LoadInstanceFromMOF...", 4); return S_OK;
error: MY_ASSERT(FALSE); if (m_szMessage) { delete [] m_szMessage; m_szMessage = NULL; } if (m_szResetMessage) { delete [] m_szResetMessage; m_szResetMessage = NULL; } m_bValidLoad = FALSE; return FALSE; }
HRESULT CSystem::InternalizeDataGroups(void) { HRESULT hRetRes = S_OK; BSTR Language = NULL; BSTR Query = NULL; ULONG uReturned; IWbemClassObject *pObj = NULL; IEnumWbemClassObject *pEnum = NULL; LPTSTR pszTempGUID = NULL;
MY_OUTPUT(L"ENTER ***** CSystem::InternalizeDataGroups...", 4);
// Just loop through all top level DataGroups associated with the System.
// Call a method of each, and have the datagroup load itself.
// Dril down and then have each DataCollector load itself.
Language = SysAllocString(L"WQL"); MY_ASSERT(Language); if (!Language) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} Query = SysAllocString(L"ASSOCIATORS OF {MicrosoftHM_SystemConfiguration.GUID=\"{@}\"} WHERE ResultClass=MicrosoftHM_DataGroupConfiguration"); MY_ASSERT(Query); if (!Query) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;}
// Issue query
hRetRes = g_pIWbemServices->ExecQuery(Language, Query, WBEM_FLAG_FORWARD_ONLY, 0, &pEnum); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) return hRetRes; SysFreeString(Query); Query = NULL; SysFreeString(Language); Language = NULL;
// Retrieve objects in result set
while (TRUE) { pObj = NULL; uReturned = 0;
hRetRes = pEnum->Next(0, 1, &pObj, &uReturned); MY_ASSERT(hRetRes==S_OK || hRetRes==WBEM_S_FALSE); if (hRetRes!=S_OK && hRetRes!=WBEM_S_FALSE) { MY_HRESASSERT(hRetRes); pEnum->Release(); pEnum = NULL; return hRetRes; }
if (uReturned == 0) { break; }
// See if this is already read in. Need to prevent endless loop, circular references.
hRetRes = GetStrProperty(pObj, L"GUID", &pszTempGUID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) return hRetRes; if (!g_pStartupSystem->FindPointerFromGUIDInMasterList(pszTempGUID)) { // Create the internal class to represent the DataGroup
CDataGroup* pDG = new CDataGroup; MY_ASSERT(pDG); if (!pDG) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = pDG->LoadInstanceFromMOF(pObj, NULL, m_szGUID); if (hRetRes==S_OK) { m_dataGroupList.push_back(pDG); } else { MY_ASSERT(FALSE); pDG->DeleteDGInternal(); delete pDG; } } delete [] pszTempGUID; pszTempGUID = NULL;
// Release it.
pObj->Release(); pObj = NULL; }
// All done
pEnum->Release(); pEnum = NULL;
MY_OUTPUT(L"EXIT ***** CSystem::InternalizeDataGroups...", 4); return S_OK;
error: MY_ASSERT(FALSE); if (Query) SysFreeString(Query); if (Language) SysFreeString(Language); if (pObj) pObj->Release(); if (pEnum) pEnum->Release(); if (pszTempGUID) delete [] pszTempGUID; m_bValidLoad = FALSE; return hRetRes; }
//
// Called every second. We loop through all the DataGroups.
// We call the member function of the DataGroup that will then loop through
// all of its DataGroups and DataCollectors.
//
BOOL CSystem::OnAgentInterval(void) { BOOL bRetValue = TRUE; long state; int i; int iSize; CDataGroup *pDataGroup; CAction* pAction; DWORD currTick; DWORD dwReturnCode = 0L; long lCurrChildCount = 0; static int startup_init = 0;
if (m_bValidLoad == FALSE) { currTick = GetTickCount(); if ((150*1000) < (currTick-m_lFiveMinTimerTime)) { m_lFiveMinTimerTime = currTick; CheckAllForBadLoad(); } return FALSE; }
if (startup_init == 0) { startup_init = 1; InternalizeActions(); BOOL bSuccess = ImpersonateSelf(SecurityImpersonation); RemapActions(); RevertToSelf(); InitActionErrorListener(); InitActionSIDListener(m_pEFTempSink, L"select * from __InstanceCreationEvent where TargetInstance isa \"__EventFilter\""); InitActionSIDListener(m_pECTempSink, L"select * from __InstanceCreationEvent where TargetInstance isa \"__EventConsumer\""); InitActionSIDListener(m_pFTCBTempSink, L"select * from __InstanceCreationEvent where TargetInstance isa \"__FilterToConsumerBinding\""); InitActionSIDListener(m_pEFModTempSink, L"select * from __InstanceModificationEvent where TargetInstance isa \"__EventFilter\""); InitActionSIDListener(m_pECModTempSink, L"select * from __InstanceModificationEvent where TargetInstance isa \"__EventConsumer\""); InitActionSIDListener(m_pFTCBModTempSink, L"select * from __InstanceModificationEvent where TargetInstance isa \"__FilterToConsumerBinding\""); DredgePerfmon(); m_lFiveMinTimerTime = GetTickCount(); } else { if (m_processInfo.hProcess) { GetExitCodeProcess(m_processInfo.hProcess, &dwReturnCode); if (dwReturnCode != STILL_ACTIVE) { CloseHandle(m_processInfo.hProcess); m_processInfo.hProcess = NULL; } } }
currTick = GetTickCount(); if ((150*1000) < (currTick-m_lFiveMinTimerTime)) { m_lFiveMinTimerTime = currTick; CheckAllForBadLoad(); // Safety net to catch just in case
if (m_numActionChanges) { Sleep(5); m_numActionChanges = 0; BOOL bSuccess = ImpersonateSelf(SecurityImpersonation); RemapActions(); RevertToSelf(); } }
if (m_numActionChanges>2) { Sleep(5); m_numActionChanges = 1; BOOL bSuccess = ImpersonateSelf(SecurityImpersonation); RemapActions(); RevertToSelf(); }
MY_OUTPUT(L"ENTER ***** CSystem::OnAgentInterval...", 1);
//
// Wait for the delay time to be up before we do anything
//
if (m_lStartupDelayTime != -1) { currTick = GetTickCount(); if ((m_lStartupDelayTime*1000) < (currTick-m_startTick)) { m_lStartupDelayTime = -1; } else { return bRetValue; } }
m_lNumberChanges = 0;
//
// Don't do anything if we are disabled.
//
if (m_bEnabled==FALSE && m_lCurrState==HM_DISABLED) { return bRetValue; }
// Call to set the current time, for anyone to use that needs it.
CalcCurrTime();
//
// Do Action scheduling and throttling
//
iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; pAction->OnAgentInterval(); }
m_lPrevState = m_lCurrState;
iSize = m_dataGroupList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->OnAgentInterval(); }
if (m_bEnabled==FALSE) { m_lCurrState = HM_DISABLED; if (m_lNumberChanges == 0) m_lNumberChanges = 1; } else { //
// Set State of the system to the worst of everything under it
//
m_lNumberNormals = 0; m_lNumberWarnings = 0; m_lNumberCriticals = 0; m_lNumberChanges = 0; m_lCurrState = -1; iSize = m_dataGroupList.size(); lCurrChildCount = iSize; for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; state = pDataGroup->GetCurrState(); if (state==HM_SCHEDULEDOUT || state==HM_DISABLED) { state = HM_GOOD; } if (state > m_lCurrState) { m_lCurrState = state; } if (state == HM_GOOD) { m_lNumberNormals++; } if (state == HM_WARNING) { m_lNumberWarnings++; } if (state == HM_CRITICAL) { m_lNumberCriticals++; } if (pDataGroup->GetChange()) { m_lNumberChanges++; } }
// Maybe we don't have any Groups underneith
// Or the disabled state of things below us did not roll up
if (m_lCurrState == -1) { if (m_bEnabled==FALSE) { m_lCurrState = HM_DISABLED; } else { m_lCurrState = HM_GOOD; }
if (m_lPrevState != m_lCurrState) { m_lNumberChanges++; } } else if (m_lPrevState==HM_DISABLED && m_lPrevState != m_lCurrState) { m_lNumberChanges++; } }
if (m_lPrevChildCount!=lCurrChildCount) { if (m_lNumberChanges==0 && m_lPrevState!=m_lCurrState) { m_lNumberChanges++; } } m_lPrevChildCount = lCurrChildCount;
FireEvents();
MY_OUTPUT(L"EXIT ***** CSystem::OnAgentInterval...", 1); return bRetValue; }
HRESULT CSystem::DredgePerfmon(void) { wchar_t szModule[_MAX_PATH]; wchar_t szPath[_MAX_PATH]; wchar_t szDir[_MAX_PATH]; STARTUPINFO StartupInfo; DWORD dwReturnCode = 0L; BOOL bRetCode;
MY_OUTPUT(L"ENTER ***** CSystem::DredgePerfmon...", 4);
// Set the startup structure
//==========================
memset(&StartupInfo, '\0', sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo) ; StartupInfo.lpReserved = NULL ; StartupInfo.lpDesktop = NULL ; StartupInfo.lpTitle = NULL ; StartupInfo.dwFlags = 0; //STARTF_USESHOWWINDOW;//0;
StartupInfo.wShowWindow = SW_HIDE; StartupInfo.cbReserved2 = 0 ; StartupInfo.lpReserved2 = NULL ;
// Get the path to the dredger executable
GetModuleFileNameW(g_hModule, szModule, _MAX_PATH); _tsplitpath(szModule, szPath, szDir, NULL, NULL); lstrcat(szPath, szDir); lstrcat(szPath, L"\\dredger.exe");
bRetCode = CreateProcess(NULL, // App name
szPath, // Full command line
NULL, // Process security attributes
NULL, // Thread security attributes
FALSE, // Process inherits handles
CREATE_NO_WINDOW, // Creation flags
NULL, // Environment
NULL, // Current directory
&StartupInfo, // STARTUP_INFO
&m_processInfo); // PROCESS_INFORMATION
MY_ASSERT(bRetCode);
MY_OUTPUT(L"EXIT ***** CSystem::DredgePerfmon...", 4); return S_OK; }
// get polling interval in milliseconds.
long CSystem::GetAgentInterval(void) { return (m_lAgentInterval*1000); }
// get polling interval in milliseconds.
long CSystem::GetStartupDelayTime(void) { return (m_lStartupDelayTime*1000); }
// Pass on info to the DataCollector that has the GUID
BOOL CSystem::HandleTempActionEvent(LPTSTR szGUID, IWbemClassObject* pObj) { BOOL bFound = FALSE; int i, iSize; CAction* pAction; DWORD dwErr = 0;
if (m_bValidLoad == FALSE) return FALSE;
MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent BLOCK - g_hConfigLock BLOCK WAIT", 4); dwErr = WaitForSingleObject(g_hConfigLock, 120000); if(dwErr != WAIT_OBJECT_0) { if(dwErr = WAIT_TIMEOUT) { TRACE_MUTEX(L"TIMEOUT MUTEX"); return FALSE; // return WBEM_S_TIMEDOUT;
} else { MY_OUTPUT(L"WaitForSingleObject on Mutex failed",4); return FALSE; // return WBEM_E_FAILED;
} } MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent BLOCK - g_hConfigLock BLOCK GOT IT", 4);
if (!g_pSystem) { ReleaseMutex(g_hConfigLock); return FALSE; }
try { iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; if (pAction->HandleTempEvent(szGUID, pObj)) { bFound = TRUE; break; } }
if (bFound == FALSE) { MY_OUTPUT2(L"NOTFOUND: No body to handle event for GUID=%s", szGUID, 4); } } catch (...) { MY_ASSERT(FALSE); }
MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent g_hConfigLock BLOCK - RELEASE IT", 4); ReleaseMutex(g_hConfigLock); MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent g_hConfigLock BLOCK - RELEASED", 4); return TRUE; }
BOOL CSystem::HandleTempEvent(CEventQueryDataCollector *pEQDC, IWbemClassObject* pObj) { BOOL bFound = FALSE; int i, iSize; CBase* pBase; DWORD dwErr = 0;
if (m_bValidLoad == FALSE) return FALSE;
MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent BLOCK - g_hConfigLock BLOCK WAIT", 4); dwErr = WaitForSingleObject(g_hConfigLock, 120000); if(dwErr != WAIT_OBJECT_0) { if(dwErr = WAIT_TIMEOUT) { TRACE_MUTEX(L"TIMEOUT MUTEX"); return FALSE; // return WBEM_S_TIMEDOUT;
} else { MY_OUTPUT(L"WaitForSingleObject on Mutex failed",4); return FALSE; // return WBEM_E_FAILED;
} } MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent BLOCK - g_hConfigLock BLOCK GOT IT", 4);
if (!g_pSystem) { ReleaseMutex(g_hConfigLock); return FALSE; }
try { iSize = m_masterList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_masterList.size()); pBase = m_masterList[i]; if (pBase->m_hmStatusType == HMSTATUS_DATACOLLECTOR) { if (((CDataCollector *)pBase)->m_deType == HM_EQDE) { if (((CEventQueryDataCollector *)pBase) == pEQDC) { ((CEventQueryDataCollector *)pBase)->HandleTempEvent(pObj); bFound = TRUE; break; } } } }
if (bFound == FALSE) { MY_OUTPUT2(L"NOTFOUND: No body to handle event for GUID=%s", pBase->m_szGUID, 4); } } catch (...) { MY_ASSERT(FALSE); }
MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent g_hConfigLock BLOCK - RELEASE IT", 4); ReleaseMutex(g_hConfigLock); MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent g_hConfigLock BLOCK - RELEASED", 4); return TRUE; }
HRESULT CSystem::SendHMSystemStatusInstance(IWbemObjectSink* pSink, LPTSTR pszGUID) { MY_OUTPUT2(L"System send for GUID=%s", pszGUID, 4); MY_ASSERT(pSink!=NULL); if (!wcscmp(L"{@}", pszGUID)) { return SendHMSystemStatusInstances(pSink); } else { return WBEM_S_DIFFERENT; } }
HRESULT CSystem::SendHMSystemStatusInstances(IWbemObjectSink* pSink) { HRESULT hRes = S_OK; IWbemClassObject* pInstance = NULL;
MY_OUTPUT(L"ENTER ***** SendHMSystemStatusInstances...", 4);
if (pSink == NULL) { MY_OUTPUT(L"CDP::SendInitialHMMachStatInstances-Invalid Sink", 1); return WBEM_E_FAILED; }
hRes = GetHMSystemStatusInstance(&pInstance, FALSE); if (SUCCEEDED(hRes)) { hRes = pSink->Indicate(1, &pInstance);
if (FAILED(hRes) && hRes != WBEM_E_SERVER_TOO_BUSY) { MY_HRESASSERT(hRes); MY_OUTPUT(L"SendHMSystemStatusInstances-failed to send status!", 4); } else { MY_OUTPUT(L"SendHMSystemStatusInstances-success!", 4); }
pInstance->Release(); pInstance = NULL; } else { MY_HRESASSERT(hRes); MY_OUTPUT(L":SendHMSystemStatusInstances-failed to get instance!", 1); }
MY_OUTPUT(L"EXIT ***** SendHMSystemStatusInstances...", 4); return hRes; }
HRESULT CSystem::SendHMDataGroupStatusInstances(IWbemObjectSink* pSink) { BOOL bRetValue = TRUE; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendDataGroupStatusInstances...", 4);
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SendHMDataGroupStatusInstances(pSink); }
MY_OUTPUT(L"EXIT ***** CSystem::SendDataGroupStatusInstances...", 4); return bRetValue; }
HRESULT CSystem::SendHMDataGroupStatusInstance(IWbemObjectSink* pSink, LPTSTR pszGUID) { HRESULT hRetRes = S_OK; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendDataGroupStatusInstance...", 4); MY_OUTPUT2(L"DG send for GUID=%s", pszGUID, 4);
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->SendHMDataGroupStatusInstance(pSink, pszGUID); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } }
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); }
MY_OUTPUT(L"EXIT ***** CSystem::SendDataGroupStatusInstance...", 4); return hRetRes; }
HRESULT CSystem::SendHMDataCollectorStatusInstances(IWbemObjectSink* pSink) { BOOL bRetValue = TRUE; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendDataCollectorStatusInstances...", 4);
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SendHMDataCollectorStatusInstances(pSink); }
MY_OUTPUT(L"EXIT ***** CSystem::SendDataCollectorStatusInstances...", 4); return bRetValue; }
HRESULT CSystem::SendHMDataCollectorStatusInstance(IWbemObjectSink* pSink, LPTSTR pszGUID) { HRESULT hRetRes = S_OK; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendDataCollectorStatusInstance...", 4); MY_OUTPUT2(L"DC send for GUID=%s", pszGUID, 4);
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->SendHMDataCollectorStatusInstance(pSink, pszGUID); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } }
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); }
MY_OUTPUT(L"EXIT ***** CSystem::SendDataCollectorStatusInstance...", 4); return hRetRes; }
HRESULT CSystem::SendHMDataCollectorPerInstanceStatusInstances(IWbemObjectSink* pSink) { BOOL bRetValue = TRUE; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendDataCollectorPerInstanceStatusInstances...", 4);
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SendHMDataCollectorPerInstanceStatusInstances(pSink); }
MY_OUTPUT(L"EXIT ***** CSystem::SendDataCollectorPerInstanceStatusInstances...", 4); return bRetValue; }
HRESULT CSystem::SendHMDataCollectorPerInstanceStatusInstance(IWbemObjectSink* pSink, LPTSTR pszGUID) { HRESULT hRetRes = S_OK; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendDataCollectorPerInstanceStatusInstance...", 4); MY_OUTPUT2(L"DC send for GUID=%s", pszGUID, 4);
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->SendHMDataCollectorPerInstanceStatusInstance(pSink, pszGUID); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } }
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); }
MY_OUTPUT(L"EXIT ***** CSystem::SendDataCollectorPerInstanceStatusInstance...", 4); return hRetRes; }
HRESULT CSystem::SendHMDataCollectorStatisticsInstances(IWbemObjectSink* pSink) { BOOL bRetValue = TRUE; int i, iSize; CDataGroup *pDataGroup; IWbemClassObject** aObjects; IWbemClassObject* pInstance = NULL;
MY_OUTPUT(L"ENTER ***** CSystem::SendDataCollectorStatisticsInstances...", 4);
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SendHMDataCollectorStatisticsInstances(pSink); }
//
// Loop through the DataCollectorStatistics Events and send them as one indicate
//
iSize = mg_DCStatsInstList.size(); aObjects = new IWbemClassObject*[iSize]; if (aObjects) { for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DCStatsInstList.size()); pInstance = mg_DCStatsInstList[i]; aObjects[i] = pInstance; } SendEvents(pSink, aObjects, iSize); } for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DCStatsInstList.size()); pInstance = mg_DCStatsInstList[i]; pInstance->Release(); } mg_DCStatsInstList.clear(); if (aObjects) delete [] aObjects;
MY_OUTPUT(L"EXIT ***** CSystem::SendDataCollectorStatisticsInstances...", 4); return bRetValue; }
HRESULT CSystem::SendHMDataCollectorStatisticsInstance(IWbemObjectSink* pSink, LPTSTR pszGUID) { HRESULT hRetRes = S_OK; int i; int iSize; CDataGroup *pDataGroup; IWbemClassObject* pInstance = NULL; IWbemClassObject** aObjects;
MY_OUTPUT(L"ENTER ***** CSystem::SendDataCollectorStatisticsInstance...", 4); MY_OUTPUT2(L"DCStatistics send for GUID=%s", pszGUID, 4);
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->SendHMDataCollectorStatisticsInstance(pSink, pszGUID); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } }
//
// Loop through the DataCollectorStatistics Events and send them as one indicate
//
iSize = mg_DCStatsInstList.size(); aObjects = new IWbemClassObject*[iSize]; if (aObjects) { for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DCStatsInstList.size()); pInstance = mg_DCStatsInstList[i]; aObjects[i] = pInstance; } SendEvents(pSink, aObjects, iSize); } for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DCStatsInstList.size()); pInstance = mg_DCStatsInstList[i]; pInstance->Release(); } mg_DCStatsInstList.clear(); if (aObjects) delete [] aObjects;
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); return WBEM_E_NOT_FOUND; }
MY_OUTPUT(L"EXIT ***** CSystem::SendDataCollectorStatisticsInstance...", 4); return hRetRes; }
HRESULT CSystem::SendHMThresholdStatusInstances(IWbemObjectSink* pSink) { HRESULT hRetRes = S_OK; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendThresholdStatusInstances...", 4);
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SendHMThresholdStatusInstances(pSink); }
MY_OUTPUT(L"EXIT ***** CSystem::SendThresholdStatusInstances...", 4); return hRetRes; }
HRESULT CSystem::SendHMThresholdStatusInstance(IWbemObjectSink* pSink, LPTSTR pszGUID) { HRESULT hRetRes = S_OK; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendHMThresholdStatusInstance...", 4); MY_OUTPUT2(L"Threshold send for GUID=%s", pszGUID, 4);
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->SendHMThresholdStatusInstance(pSink, pszGUID); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } }
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); }
MY_OUTPUT(L"EXIT ***** CSystem::SendHMThresholdStatusInstance...", 4); return hRetRes; }
#ifdef SAVE
NOT USED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NOT USED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NOT USED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HRESULT CSystem::SendHMThresholdStatusInstanceInstances(IWbemObjectSink* pSink) { BOOL bRetValue = TRUE; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendThresholdStatusInstanceInstances...", 4);
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->SendHMThresholdStatusInstanceInstances(pSink); }
MY_OUTPUT(L"EXIT ***** CSystem::SendThresholdStatusInstanceInstances...", 4); return bRetValue; }
NOT USED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NOT USED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NOT USED!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HRESULT CSystem::SendHMThresholdStatusInstanceInstance(IWbemObjectSink* pSink, LPTSTR pszGUID) { BOOL bRetValue = TRUE; int i; int iSize; CDataGroup *pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::SendHMThresholdStatusInstanceInstance...", 4); MY_OUTPUT2(L"ThresholdStatusInstances send for GUID=%s", pszGUID, 4);
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (pDataGroup->SendHMThresholdStatusInstanceInstance(pSink, pszGUID)) { MY_OUTPUT(L"Found", 4); break; } }
MY_OUTPUT(L"EXIT ***** CSystem::SendHMThresholdStatusInstanceInstance...", 4); return bRetValue; } #endif
HRESULT CSystem::SendHMActionStatusInstances(IWbemObjectSink* pSink) { HRESULT hRetRes = S_OK; int i; int iSize; CAction *pAction;
MY_OUTPUT(L"ENTER ***** CSystem::SendActionStatusInstances...", 4);
iSize = m_actionList.size(); for (i = 0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; pAction->SendHMActionStatusInstances(pSink); }
MY_OUTPUT(L"EXIT ***** CSystem::SendActionStatusInstances...", 4); return hRetRes; }
HRESULT CSystem::SendHMActionStatusInstance(IWbemObjectSink* pSink, LPTSTR pszGUID) { HRESULT hRetRes = S_OK; int i; int iSize; CAction *pAction;
MY_OUTPUT(L"ENTER ***** CSystem::SendHMActionStatusInstance...", 4); MY_OUTPUT2(L"ActionStatus send for GUID=%s", pszGUID, 4);
iSize = m_actionList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; hRetRes = pAction->SendHMActionStatusInstance(pSink, pszGUID); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } }
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); }
MY_OUTPUT(L"EXIT ***** CSystem::SendHMActionStatusInstance...", 4); return hRetRes; }
BOOL CSystem::FireEvents(void) { IWbemClassObject* pInstance = NULL; int i, iSize;
// Send the System event
FireEvent();
//
// Loop through the DataGroup Events and send them as one indicate
//
iSize = mg_DGEventList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DGEventList.size()); pInstance = mg_DGEventList[i]; SendEvents(g_pDataGroupEventSink, &pInstance, 1); pInstance->Release(); } mg_DGEventList.clear();
//
// Loop through the DataCollector Events and send them as one indicate
//
iSize = mg_DCEventList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DCEventList.size()); pInstance = mg_DCEventList[i]; SendEvents(g_pDataCollectorEventSink, &pInstance, 1); pInstance->Release(); } mg_DCEventList.clear();
//
// Loop through the DataCollector PerInstance Events and send them as one indicate
//
iSize = mg_DCPerInstanceEventList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DCPerInstanceEventList.size()); pInstance = mg_DCPerInstanceEventList[i]; SendEvents(g_pDataCollectorPerInstanceEventSink, &pInstance, 1); pInstance->Release(); } mg_DCPerInstanceEventList.clear();
//
// Loop through the Threshold Events and send them as one indicate
//
iSize = mg_TEventList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_TEventList.size()); pInstance = mg_TEventList[i]; SendEvents(g_pThresholdEventSink, &pInstance, 1); pInstance->Release(); } mg_TEventList.clear();
//
// Loop through the ThresholdInstance Events and send them as one indicate
//
// iSize = mg_TIEventList.size();
// for (i=0; i < iSize; i++)
// {
// MY_ASSERT(i<mg_TIEventList.size());
// pInstance = mg_TIEventList[i];
// SendEvents(g_pThresholdInstanceEventSink, &pInstance, 1);
// pInstance->Release();
// }
// mg_TIEventList.clear();
//
// Loop through the DataCollectorStatistics Events and send them as one indicate
//
iSize = mg_DCStatsEventList.size(); MY_ASSERT(iSize==0); #ifdef SAVE
for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DCStatsEventList.size()); pInstance = mg_DCStatsEventList[i]; SendEvents(g_pDataCollectorStatisticsEventSink, &pInstance, 1); pInstance->Release(); } mg_DCStatsEventList.clear(); #endif
#ifdef SAVE
XXX // IWbemClassObject** aObjects;
Need to wait for the Whistler fix for sending multiple objects with one Indicate //
// Loop through the DataGroup Events and send them as one indicate
//
iSize = mg_DGEventList.size(); aObjects = new IWbemClassObject*[iSize]; for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DGEventList.size()); pInstance = mg_DGEventList[i]; aObjects[i] = pInstance; } SendEvents(g_pDataGroupEventSink, aObjects, iSize); for (i=0; i < iSize; i++) { MY_ASSERT(i<mg_DGEventList.size()); pInstance = mg_DGEventList[i]; pInstance->Release(); } mg_DGEventList.clear(); delete [] aObjects; . . .
#endif
return TRUE; }
//
// If there has been a change in the state then send an event
//
BOOL CSystem::FireEvent(void) { HRESULT hRes; BOOL bRetValue = TRUE; IWbemClassObject* pInstance = NULL;
MY_OUTPUT(L"ENTER ***** CSystem::FireEvent...", 2);
// Don't send if no-one is listening!
if (g_pSystemEventSink == NULL) { return bRetValue; }
// A quick test to see if anything has really changed!
// Proceed if there have been changes
if (m_lNumberChanges!=0 && m_lPrevState!=m_lCurrState) { } else { return FALSE; }
// Update time if there has been a change
wcscpy(m_szDTTime, m_szDTCurrTime); wcscpy(m_szTime, m_szCurrTime);
hRes = GetHMSystemStatusInstance(&pInstance, TRUE); if (SUCCEEDED(hRes) && g_pSystemEventSink) { MY_OUTPUT2(L"EVENT: System State Change=%d", m_lCurrState, 4); hRes = g_pSystemEventSink->Indicate(1, &pInstance); // WBEM_E_SERVER_TOO_BUSY is Ok. Wbem will deliver.
if (FAILED(hRes) && hRes != WBEM_E_SERVER_TOO_BUSY) { MY_HRESASSERT(hRes); bRetValue = FALSE; MY_OUTPUT(L"Failed on Indicate!", 4); }
pInstance->Release(); pInstance = NULL; } else { MY_HRESASSERT(hRes); MY_OUTPUT(L"failed to get instance!", 4); }
MY_OUTPUT(L"EXIT ***** CSystem::FireEvent...", 2); return bRetValue; }
HRESULT CSystem::GetHMSystemStatusInstance(IWbemClassObject** ppInstance, BOOL bEventBased) { TCHAR szTemp[1024]; IWbemClassObject* pClass = NULL; BSTR bsString = NULL; HRESULT hRetRes;
MY_OUTPUT(L"ENTER ***** GetHMSystemStatusInstance...", 1);
if (bEventBased) bsString = SysAllocString(L"MicrosoftHM_SystemStatusEvent"); else bsString = SysAllocString(L"MicrosoftHM_SystemStatus"); MY_ASSERT(bsString); if (!bsString) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = g_pIWbemServices->GetObject(bsString, 0L, NULL, &pClass, NULL); SysFreeString(bsString); bsString = NULL;
if (FAILED(hRetRes)) { MY_HRESASSERT(hRetRes); MY_OUTPUT2(L"CSystem::GetHMSystemStatusInstance()-Couldn't get HMSystemStatusInstance Error: 0x%08x",hRetRes,4); return hRetRes; }
hRetRes = pClass->SpawnInstance(0, ppInstance); pClass->Release(); pClass = NULL;
if (FAILED(hRetRes)) { MY_HRESASSERT(hRetRes); MY_OUTPUT2(L"CSystem::GetHMSystemStatusInstance()-Couldn't get HMSystemStatusInstance Error: 0x%08x",hRetRes,4); return hRetRes; }
if (m_bValidLoad == FALSE) { hRetRes = PutStrProperty(*ppInstance, L"GUID", L"{@}"); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = PutUint32Property(*ppInstance, L"State", HM_CRITICAL); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; if (g_hResLib == NULL || !LoadString(g_hResLib, HMRES_SYSTEM_LOADFAIL, szTemp, 1024)) { wcscpy(szTemp, L"System failed to load."); } hRetRes = PutStrProperty(*ppInstance, L"Message", szTemp); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = PutStrProperty(*ppInstance, L"Name", L"..."); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; } else { hRetRes = PutStrProperty(*ppInstance, L"GUID", L"{@}"); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
// Get the computer name of the machine
DWORD dwNameLen = MAX_COMPUTERNAME_LENGTH + 1; TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
if (GetComputerName(szComputerName, &dwNameLen)) { hRetRes = PutStrProperty(*ppInstance, L"Name", szComputerName); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = PutStrProperty(*ppInstance, L"SystemName", szComputerName); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; } else { hRetRes = PutStrProperty(*ppInstance, L"Name", L"LocalMachine"); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = PutStrProperty(*ppInstance, L"SystemName", L"LocalMachine"); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; } hRetRes = PutStrProperty(*ppInstance, L"TimeGeneratedGMT", m_szDTTime); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = PutStrProperty(*ppInstance, L"LocalTimeFormatted", m_szTime); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = PutUint32Property(*ppInstance, L"State", m_lCurrState); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
if (m_lCurrState != HM_GOOD) { hRetRes = PutStrProperty(*ppInstance, L"Message", m_szMessage); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; } else { hRetRes = PutStrProperty(*ppInstance, L"Message", m_szResetMessage); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; } FormatMessage(*ppInstance); }
MY_OUTPUT(L"EXIT ***** GetHMSystemStatusInstance...", 1); return hRetRes;
error: MY_ASSERT(FALSE); if (bsString) SysFreeString(bsString); if (pClass) pClass->Release(); return hRetRes; }
HRESULT CSystem::ModSystem(IWbemClassObject* pObj) { HRESULT hRetRes = S_OK;
MY_OUTPUT(L"ENTER ***** CSystem::ModSystem...", 4);
// Re-load
hRetRes = LoadInstanceFromMOF(pObj);
MY_OUTPUT(L"EXIT ***** CSystem::ModSystem...", 4); return hRetRes; }
HRESULT CSystem::ModDataGroup(IWbemClassObject* pObj) { HRESULT hRes; HRESULT hRetRes = WBEM_E_NOT_FOUND; int i, iSize; VARIANT v; CDataGroup* pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::ModDataGroup...", 4);
VariantInit(&v); hRes = pObj->Get(L"GUID", 0L, &v, 0L, 0L); if (FAILED(hRes)) { MY_HRESASSERT(hRes); MY_OUTPUT(L"ENTER ***** CSystem::ModDataGroup-Unexpected Error!...", 4); VariantClear(&v); return hRes; } MY_OUTPUT2(L"DG mod for GUID=%s", V_BSTR(&v), 4);
//
// Search right under the System to find the DataGroup.
// If don't find, drill down until we do.
//
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->FindAndModDataGroup(V_BSTR(&v), pObj); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } } VariantClear(&v);
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); } else { MY_OUTPUT(L"Found", 4); } MY_OUTPUT(L"EXIT ***** CSystem::ModDataGroup...", 4); return hRetRes; }
HRESULT CSystem::ModDataCollector(IWbemClassObject* pObj) { HRESULT hRes; HRESULT hRetRes = WBEM_E_NOT_FOUND; int i, iSize; VARIANT v; CDataGroup* pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::ModDataCollector...", 4);
VariantInit(&v); hRes = pObj->Get(L"GUID", 0L, &v, 0L, 0L); if (FAILED(hRes)) { MY_HRESASSERT(hRes); MY_OUTPUT(L"ENTER ***** CSystem::ModDataCollector-Unexpected Error!...", 4); VariantClear(&v); return hRes; }
MY_OUTPUT2(L"DC mod for GUID=%s", V_BSTR(&v), 4); //
// Search right under the System to find the DataGroup.
// If don't find, drill down until we do.
//
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->FindAndModDataCollector(V_BSTR(&v), pObj); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } } VariantClear(&v);
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); } else { MY_OUTPUT(L"Found", 4); } MY_OUTPUT(L"EXIT ***** CSystem::ModDataCollector...", 4); return hRetRes; }
HRESULT CSystem::ModThreshold(IWbemClassObject* pObj) { HRESULT hRes; HRESULT hRetRes = WBEM_E_NOT_FOUND; int i, iSize; VARIANT v; CDataGroup* pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::ModThreshold...", 4);
VariantInit(&v); hRes = pObj->Get(L"GUID", 0L, &v, 0L, 0L); if (FAILED(hRes)) { MY_HRESASSERT(hRes); MY_OUTPUT(L"ENTER ***** CSystem::ModThreshold-Unexpected Error!...", 4); VariantClear(&v); return hRes; }
MY_OUTPUT2(L"Threshold mod for GUID=%s", V_BSTR(&v), 4); //
// Search right under the System to find the DataGroup.
// If don't find, drill down until we do.
//
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->FindAndModThreshold(V_BSTR(&v), pObj); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } } VariantClear(&v);
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); } else { MY_OUTPUT(L"Found", 4); } MY_OUTPUT(L"EXIT ***** CSystem::ModThreshold...", 4); return hRetRes; }
HRESULT CSystem::ModAction(IWbemClassObject* pObj) { HRESULT hRes; HRESULT hRetRes = WBEM_E_NOT_FOUND; int i, iSize; VARIANT v; CAction* pAction;
MY_OUTPUT(L"ENTER ***** CSystem::ModAction...", 4);
VariantInit(&v); hRes = pObj->Get(L"GUID", 0L, &v, 0L, 0L); if (FAILED(hRes)) { MY_HRESASSERT(hRes); MY_OUTPUT(L"ENTER ***** CSystem::ModAction-Unexpected Error!...", 4); VariantClear(&v); return hRes; }
MY_OUTPUT2(L"Action mod for GUID=%s", V_BSTR(&v), 4); //
// Search right under the System to find the Action.
// If don't find, drill down until we do.
//
iSize = m_actionList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; hRetRes = pAction->FindAndModAction(V_BSTR(&v), pObj); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } } VariantClear(&v);
if (hRetRes==WBEM_S_DIFFERENT) { hRetRes = WBEM_E_NOT_FOUND; MY_OUTPUT(L"GUID not found", 4); } else { MY_OUTPUT(L"Found", 4); } MY_OUTPUT(L"EXIT ***** CSystem::ModAction...", 4); return hRetRes; }
BOOL CSystem::CreateActionAssociation(IWbemClassObject* pObj) { TCHAR szGUID[1024]; LPTSTR pStr; LPTSTR pStr2; HRESULT hRes; BOOL bRetValue = TRUE; int i, iSize; VARIANT v; CAction* pAction;
MY_OUTPUT(L"ENTER ***** CSystem::CreateActionAssociation...", 4);
VariantInit(&v); hRes = pObj->Get(L"ChildPath", 0L, &v, 0L, 0L); if (FAILED(hRes)) { MY_HRESASSERT(hRes); MY_OUTPUT(L"ENTER ***** CSystem::CreateActionAssociation-Unexpected Error!...", 4); VariantClear(&v); return FALSE; }
// Get the Action GUID from the path
wcscpy(szGUID, V_BSTR(&v)); pStr = wcschr(szGUID, '\"'); if (pStr) { pStr++; pStr2 = wcschr(pStr, '\"'); if (pStr2) { *pStr2 = '\0'; //
// Find the Action and add the new association
//
iSize = m_actionList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; bRetValue = pAction->FindAndCreateActionAssociation(pStr, pObj); if (bRetValue) { break; } } } } VariantClear(&v);
MY_OUTPUT(L"EXIT ***** CSystem::CreateActionAssociation...", 4); return bRetValue; }
BOOL CSystem::ModActionAssociation(IWbemClassObject* pObj) { TCHAR szGUID[1024]; LPTSTR pStr; LPTSTR pStr2; HRESULT hRes; BOOL bRetValue = TRUE; int i, iSize; VARIANT v; CAction* pAction;
MY_OUTPUT(L"ENTER ***** CSystem::ModActionAssociation...", 4);
VariantInit(&v); hRes = pObj->Get(L"ChildPath", 0L, &v, 0L, 0L); if (FAILED(hRes)) { MY_HRESASSERT(hRes); MY_OUTPUT(L"ENTER ***** CSystem::ModActionAssociation-Unexpected Error!...", 4); VariantClear(&v); return FALSE; }
// Get the Action GUID from the path
wcscpy(szGUID, V_BSTR(&v)); pStr = wcschr(szGUID, '\"'); if (pStr) { pStr++; pStr2 = wcschr(pStr, '\"'); if (pStr2) { *pStr2 = '\0'; //
// Find the Action and modify the association
//
iSize = m_actionList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; bRetValue = pAction->FindAndModActionAssociation(pStr, pObj); if (bRetValue) { break; } } } } VariantClear(&v);
MY_OUTPUT(L"EXIT ***** CSystem::ModActionAssociation...", 4); return bRetValue; }
HRESULT CSystem::CreateSystemDataGroupAssociation(IWbemClassObject* pObj) { int i, iSize; TCHAR szTemp[1024]; VARIANT v; BOOL bFound; HRESULT hRetRes = S_OK; CDataGroup* pDG = NULL; CDataGroup* pDataGroup = NULL; BOOL bRetValue = TRUE; TCHAR szGUID[1024]; LPTSTR pStr = NULL; LPTSTR pStr2 = NULL; BSTR Path = NULL; IWbemClassObject* pObj2 = NULL; LPTSTR pszTempGUID = NULL;
MY_OUTPUT(L"ENTER ***** CSystem::CreateSystemDataGroupAssociation...", 4);
//
// Get the name of the child DataGroup
//
VariantInit(&v); hRetRes = pObj->Get(L"ChildPath", 0L, &v, 0L, 0L); MY_HRESASSERT(hRetRes); if (hRetRes != S_OK) goto error;
wcscpy(szGUID, V_BSTR(&v)); pStr = wcschr(szGUID, '\"'); if (pStr) { pStr++; pStr2 = wcschr(pStr, '\"'); if (pStr2) { *pStr2 = '\0';
//
// First make sure it is not in there already!
//
bFound = FALSE; iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pStr, pDataGroup->GetGUID())) { bFound = TRUE; break; } }
MY_OUTPUT2(L"Association DG to System DGGUID=%s", pStr, 4); if (bFound == FALSE) { MY_OUTPUT(L"OK: Not found yet", 4); //
// Add in the DataGroup. Everything below will follow.
//
wcscpy(szTemp, L"MicrosoftHM_DataGroupConfiguration.GUID=\""); lstrcat(szTemp, pStr); lstrcat(szTemp, L"\""); Path = SysAllocString(szTemp); MY_ASSERT(Path); if (!Path) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;}
hRetRes = GetWbemObjectInst(&g_pIWbemServices, Path, NULL, &pObj2); //XXXGet back an HRESULT and then return that
MY_ASSERT(pObj2); if (!pObj2) {hRetRes = S_FALSE; goto error;}
// See if this is already read in. Need to prevent endless loop, circular references.
hRetRes = GetStrProperty(pObj2, L"GUID", &pszTempGUID); MY_ASSERT(hRetRes==S_OK); if (hRetRes!= S_OK) goto error; if (!g_pStartupSystem->FindPointerFromGUIDInMasterList(pszTempGUID)) { //
// Create the internal class to represent the DataGroup
//
pDG = new CDataGroup; MY_ASSERT(pDG); if (!pDG) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = pDG->LoadInstanceFromMOF(pObj2, NULL, m_szGUID); if (hRetRes==S_OK) { m_dataGroupList.push_back(pDG); pDG->SetParentEnabledFlag(m_bEnabled); } else { MY_HRESASSERT(hRetRes); pDG->DeleteDGInternal(); delete pDG; pDG = NULL; } } delete [] pszTempGUID; pszTempGUID = NULL; pObj2->Release(); pObj2 = NULL; SysFreeString(Path); Path = NULL; } else { MY_OUTPUT(L"WHY?: Already there!", 4); } } }
VariantClear(&v);
MY_OUTPUT(L"EXIT ***** CSystem::CreateSystemDataGroupAssociation...", 4); return hRetRes;
error: MY_HRESASSERT(hRetRes); VariantClear(&v); if (Path) SysFreeString(Path); if (pObj2) pObj2->Release(); if (pDG) delete pDG; if (pszTempGUID) delete [] pszTempGUID;
return hRetRes; }
HRESULT CSystem::CreateDataGroupDataGroupAssociation(IWbemClassObject* pObj) { VARIANT vParent; VARIANT vChild; TCHAR szChildGUID[1024]; DGLIST::iterator iaDG; int i, iSize; HRESULT hRetRes = S_OK; CDataGroup* pDataGroup = NULL; TCHAR szParentGUID[1024]; LPTSTR pParentStr = NULL; LPTSTR pParentStr2 = NULL; LPTSTR pChildStr = NULL; LPTSTR pChildStr2 = NULL; VariantInit(&vParent); VariantInit(&vChild);
MY_OUTPUT(L"ENTER ***** CSystem::CreateDataGroupDataGroupAssociation...", 4);
//
// Get the name of the parent DataGroup
//
hRetRes = pObj->Get(L"ParentPath", 0L, &vParent, 0L, 0L); MY_HRESASSERT(hRetRes); if (hRetRes != S_OK) goto error;
//
// Get the name of the child DataGroup
//
hRetRes = pObj->Get(L"ChildPath", 0L, &vChild, 0L, 0L); MY_HRESASSERT(hRetRes); if (hRetRes != S_OK) goto error;
wcscpy(szChildGUID, V_BSTR(&vChild)); pChildStr = wcschr(szChildGUID, '\"'); if (pChildStr) { pChildStr++; pChildStr2 = wcschr(pChildStr, '\"'); if (pChildStr2) { *pChildStr2 = '\0'; wcscpy(szParentGUID, V_BSTR(&vParent)); pParentStr = wcschr(szParentGUID, '\"'); if (pParentStr) { pParentStr++; pParentStr2 = wcschr(pParentStr, '\"'); if (pParentStr2) { *pParentStr2 = '\0'; //
// Add the DataGroup, it will add everything under itself
//
MY_OUTPUT2(L"Association DG to DG ParentGUID=%s", pParentStr, 4); MY_OUTPUT2(L"ChildGUID=%s", pChildStr, 4); iSize = m_dataGroupList.size(); iaDG=m_dataGroupList.begin(); for (i = 0; i < iSize ; i++, iaDG++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->AddDataGroup(pParentStr, pChildStr); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { // MY_HRESASSERT(hRetRes);
break; } } } } } }
VariantClear(&vParent); VariantClear(&vChild);
MY_OUTPUT(L"EXIT ***** CSystem::CreateDataGroupDataGroupAssociation...", 4); return hRetRes;
error: MY_HRESASSERT(hRetRes); VariantClear(&vParent); VariantClear(&vChild); return hRetRes; }
HRESULT CSystem::CreateDataGroupDataCollectorAssociation(IWbemClassObject* pObj) { VARIANT vParent; VARIANT vChild; int i, iSize; TCHAR szParentGUID[1024]; DGLIST::iterator iaDG; HRESULT hRetRes = S_OK; CDataGroup* pDataGroup = NULL; LPTSTR pParentStr = NULL; LPTSTR pParentStr2 = NULL; TCHAR szChildGUID[1024]; LPTSTR pChildStr = NULL; LPTSTR pChildStr2 = NULL; VariantInit(&vParent); VariantInit(&vChild);
MY_OUTPUT(L"ENTER ***** CSystem::CreateDataGroupDataCollectorAssociation...", 4);
//
// Get the name of the parent DataGroup
//
hRetRes = pObj->Get(L"ParentPath", 0L, &vParent, 0L, 0L); MY_HRESASSERT(hRetRes); if (hRetRes != S_OK) goto error;
//
// Get the name of the child DataGroup
//
hRetRes = pObj->Get(L"ChildPath", 0L, &vChild, 0L, 0L); MY_HRESASSERT(hRetRes); if (hRetRes != S_OK) goto error;
wcscpy(szChildGUID, V_BSTR(&vChild)); pChildStr = wcschr(szChildGUID, '\"'); if (pChildStr) { pChildStr++; pChildStr2 = wcschr(pChildStr, '\"'); if (pChildStr2) { *pChildStr2 = '\0'; wcscpy(szParentGUID, V_BSTR(&vParent)); pParentStr = wcschr(szParentGUID, '\"'); if (pParentStr) { pParentStr++; pParentStr2 = wcschr(pParentStr, '\"'); if (pParentStr2) { *pParentStr2 = '\0'; //
// Add the DataGroup, it will add everything under itself
//
MY_OUTPUT2(L"Association DC to DG ParentDGGUID=%s", pParentStr, 4); MY_OUTPUT2(L"ChildDCGUID=%s", pChildStr, 4); iSize = m_dataGroupList.size(); iaDG=m_dataGroupList.begin(); for (i = 0; i < iSize ; i++, iaDG++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->AddDataCollector(pParentStr, pChildStr); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { // MY_HRESASSERT(hRetRes);
break; } } } } } }
VariantClear(&vParent); VariantClear(&vChild);
MY_OUTPUT(L"EXIT ***** CSystem::CreateDataGroupDataCollectorAssociation...", 4); return hRetRes;
error: MY_HRESASSERT(hRetRes); VariantClear(&vParent); VariantClear(&vChild); return hRetRes; }
HRESULT CSystem::CreateDataCollectorThresholdAssociation(IWbemClassObject* pObj) { VARIANT vParent; VARIANT vChild; int i, iSize; TCHAR szChildGUID[1024]; DGLIST::iterator iaDG; HRESULT hRetRes = S_OK; CDataGroup* pDataGroup = NULL; TCHAR szParentGUID[1024]; LPTSTR pParentStr = NULL; LPTSTR pParentStr2 = NULL; LPTSTR pChildStr = NULL; LPTSTR pChildStr2 = NULL; VariantInit(&vParent); VariantInit(&vChild);
MY_OUTPUT(L"ENTER ***** CSystem::CreateDataCollectorThresholdAssociation...", 4);
//
// Get the name of the parent DataGroup
//
hRetRes = pObj->Get(L"ParentPath", 0L, &vParent, 0L, 0L); MY_HRESASSERT(hRetRes); if (hRetRes != S_OK) goto error;
//
// Get the name of the child DataGroup
//
hRetRes = pObj->Get(L"ChildPath", 0L, &vChild, 0L, 0L); MY_HRESASSERT(hRetRes); if (hRetRes != S_OK) goto error;
wcscpy(szChildGUID, V_BSTR(&vChild)); pChildStr = wcschr(szChildGUID, '\"'); if (pChildStr) { pChildStr++; pChildStr2 = wcschr(pChildStr, '\"'); if (pChildStr2) { *pChildStr2 = '\0'; wcscpy(szParentGUID, V_BSTR(&vParent)); pParentStr = wcschr(szParentGUID, '\"'); if (pParentStr) { pParentStr++; pParentStr2 = wcschr(pParentStr, '\"'); if (pParentStr2) { *pParentStr2 = '\0'; //
// Add the DataGroup, it will add everything under itself
//
MY_OUTPUT2(L"Association Threshold to DC ParentDCGUID=%s", pParentStr, 4); MY_OUTPUT2(L"ChildThreshGUID=%s", pChildStr, 4); iSize = m_dataGroupList.size(); iaDG=m_dataGroupList.begin(); for (i = 0; i < iSize ; i++, iaDG++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; hRetRes = pDataGroup->AddThreshold(pParentStr, pChildStr); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { // MY_HRESASSERT(hRetRes);
break; } } } } } }
VariantClear(&vParent); VariantClear(&vChild);
MY_OUTPUT(L"EXIT ***** CSystem::CreateDataCollectorThresholdAssociation...", 4); return hRetRes;
error: MY_HRESASSERT(hRetRes); VariantClear(&vParent); VariantClear(&vChild); return hRetRes; }
BOOL CSystem::ResetResetThresholdStates(void) { BOOL bRetValue = TRUE; int i; int iSize; CDataGroup *pDataGroup;
iSize = m_dataGroupList.size(); for (i = 0; i < iSize ; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->ResetResetThresholdStates(); }
return bRetValue; }
BOOL CSystem::GetChange(void) { if (m_lNumberChanges!=0 && m_lPrevState!=m_lCurrState) { return TRUE; } else { return FALSE; } }
//
// Called By the Delete method that the HMSystemConfiguration class exposes.
// Code ends up in the methprov.pp file, then gets passed here.
// We could have done method providers on the instance basis, and then we would have
// delete called for a specifric instance, but instead we chose to have a global
// static class wide function, that appies to all objects in our hierarchy,
// so you must pass in the GUID of what you want deleted, and then we search for it.
//
//
//XXXOptomize this and other similar code by creating an access array that contains
// OR hash table that contains all the GUIDs and pointers to the classes, so can go directly
// to the object and delete it. Actually probably need to go to its parent to delete it,
// as it needs to get it out of its list.
HRESULT CSystem::FindAndDeleteByGUID(LPTSTR pszGUID) { BOOL bDeleted = FALSE; int i, iSize; CDataGroup* pDataGroup; DGLIST::iterator iaDG; CAction* pAction; ALIST::iterator iaA;
MY_OUTPUT(L"ENTER ***** CSystem::FindAndDeleteByGUID...", 4); MY_OUTPUT2(L"FIND DELETION: GUID=%s", pszGUID, 4);
//
// Traverse the complete hierarchy to find the object to delete.
//
iSize = m_dataGroupList.size(); iaDG=m_dataGroupList.begin(); for (i=0; i<iSize; i++, iaDG++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszGUID, pDataGroup->GetGUID())) { pDataGroup->DeleteDGConfig(); delete pDataGroup; m_dataGroupList.erase(iaDG); bDeleted = TRUE; MY_OUTPUT2(L"DELETION: DGGUID=%s", pszGUID, 4); break; } // Look at branch below to see if can find it
if (pDataGroup->FindAndDeleteByGUID(pszGUID)==S_OK) { bDeleted = TRUE; break; } }
//
// Traverse through the actions also to see if that is what we were suppose to delete.
//
if (bDeleted == FALSE) { iSize = m_actionList.size(); iaA=m_actionList.begin(); for (i=0; i<iSize; i++, iaA++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; if (!_wcsicmp(pszGUID, pAction->GetGUID())) { pAction->DeleteAConfig(); delete pAction; m_actionList.erase(iaA); bDeleted = TRUE; MY_OUTPUT2(L"DELETION: AGUID=%s", pszGUID, 4); break; } } }
if (bDeleted == FALSE) { MY_OUTPUT(L"GUID not found", 4); MY_OUTPUT(L"EXIT ***** CSystem::FindAndDeleteByGUID...", 4); return WBEM_E_NOT_FOUND; } else { MY_OUTPUT(L"EXIT ***** CSystem::FindAndDeleteByGUID...", 4); return S_OK; } }
//
// HMSystemConfiguration class exposes this method.
// Code ends up in the methprov.pp file, then gets passed here.
//
HRESULT CSystem::FindAndResetDEStateByGUID(LPTSTR pszGUID) { BOOL bFound = FALSE; int i, iSize; CDataGroup* pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::FindAndResetDEStateByGUID...", 4); MY_OUTPUT2(L"FIND RESET: GUID=%s", pszGUID, 4);
if (!wcscmp(L"{@}", pszGUID)) { bFound = TRUE; //
// Do reset of EVERYTHING
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->ResetState(); } } else { //
// Traverse the complete hierarchy to find the object to reset state.
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszGUID, pDataGroup->GetGUID())) { pDataGroup->ResetState(); bFound = TRUE; MY_OUTPUT(L"DG Found and reset", 4); break; } // Look at branch below to see if can find it
if (pDataGroup->FindAndResetDEStateByGUID(pszGUID)==S_OK) { bFound = TRUE; break; } } }
if (bFound == FALSE) { MY_OUTPUT(L"GUID not found", 4); MY_OUTPUT(L"EXIT ***** CSystem::FindAndResetDEStateByGUID...", 4); return WBEM_E_NOT_FOUND; } else { MY_OUTPUT(L"EXIT ***** CSystem::FindAndResetDEStateByGUID...", 4); return S_OK; } }
//
// HMSystemConfiguration class exposes this method.
// Code ends up in the methprov.pp file, then gets passed here.
//
HRESULT CSystem::FindAndResetDEStatisticsByGUID(LPTSTR pszGUID) { BOOL bFound = FALSE; int i, iSize; CDataGroup* pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::FindAndResetDEStatisticsByGUID...", 4); MY_OUTPUT2(L"FIND RESET STATISTICS: GUID=%s", pszGUID, 4);
if (!wcscmp(L"{@}", pszGUID)) { bFound = TRUE; //
// Do reset of EVERYTHING
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->ResetStatistics(); } } else { //
// Traverse the complete hierarchy to find the object to reset statistics.
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszGUID, pDataGroup->GetGUID())) { pDataGroup->ResetStatistics(); bFound = TRUE; MY_OUTPUT(L"DG found and reset statistics", 4); break; } // Look at branch below to see if can find it
if (pDataGroup->FindAndResetDEStatisticsByGUID(pszGUID)==S_OK) { bFound = TRUE; break; } } }
if (bFound == FALSE) { MY_OUTPUT(L"GUID not found", 4); MY_OUTPUT(L"EXIT ***** CSystem::FindAndResetDEStatisticsByGUID...", 4); return WBEM_E_NOT_FOUND; } else { MY_OUTPUT(L"EXIT ***** CSystem::FindAndResetDEStatisticsByGUID...", 4); return S_OK; } }
//
// HMSystemConfiguration class exposes this method.
// Code ends up in the methprov.pp file, then gets passed here.
//
HRESULT CSystem::FindAndEvaluateNowDEByGUID(LPTSTR pszGUID) { BOOL bFound = FALSE; int i, iSize; CDataGroup* pDataGroup;
MY_OUTPUT(L"ENTER ***** CSystem::FindAndEvaluateNowByGUID...", 4); MY_OUTPUT2(L"FIND RESET STATISTICS: GUID=%s", pszGUID, 4);
if (!wcscmp(L"{@}", pszGUID)) { bFound = TRUE; //
// Do reset of EVERYTHING
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; pDataGroup->EvaluateNow(); } } else { //
// Traverse the complete hierarchy to find the object to evaluate now.
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszGUID, pDataGroup->GetGUID())) { pDataGroup->EvaluateNow(); bFound = TRUE; MY_OUTPUT(L"DG found and Evaluate Now", 4); break; } // Look at branch below to see if can find it
if (pDataGroup->FindAndEvaluateNowDEByGUID(pszGUID)==S_OK) { bFound = TRUE; break; } } }
if (bFound == FALSE) { MY_OUTPUT(L"GUID not found", 4); MY_OUTPUT(L"EXIT ***** CSystem::FindAndEvaluateNowByGUID...", 4); return S_FALSE; } else { MY_OUTPUT(L"EXIT ***** CSystem::FindAndEvaluateNowByGUID...", 4); return S_OK; } }
//
// HMSystemConfiguration class exposes this method.
// Code ends up in the methprov.pp file, then gets passed here.
//
BOOL CSystem::Enable(BOOL bEnable) { HRESULT hRes; // BSTR PathToClass;
int i, iSize; CDataGroup* pDataGroup; IWbemClassObject* pInst = NULL; IWbemCallResult *pResult = 0;
MY_OUTPUT(L"ENTER ***** CSystem::Enable...", 4);
if (m_bEnabled == bEnable) return TRUE;
//
// Set the variable, and do the same for all children.
//
m_bEnabled = bEnable;
//
// Traverse the complete hierarchy to find the object to enable/disable.
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; //XXX pDataGroup->SetParentEnabledFlag(bEnable);
}
//
// Set the property on this Configuration instance.
//
hRes = GetWbemObjectInst(&g_pIWbemServices, L"MicrosoftHM_SystemConfiguration.GUID=\"{@}\"", NULL, &pInst); if (!pInst) { MY_HRESASSERT(hRes); return FALSE; }
hRes = PutBoolProperty(pInst, L"Enabled", m_bEnabled); hRes = g_pIWbemServices->PutInstance(pInst, 0, NULL, &pResult); pInst->Release(); pInst = NULL;
MY_OUTPUT(L"EXIT ***** CSystem::Enable...", 4); return TRUE; }
//
// At startup, internalize all instances of Actions
//
HRESULT CSystem::InternalizeActions(void) { ULONG uReturned; BOOL bFound = FALSE; int i, iSize; CAction* pAction; HRESULT hRetRes = S_OK; BSTR Language = NULL; BSTR Query = NULL; IWbemClassObject *pObj = NULL; LPTSTR pszTempGUID = NULL; IEnumWbemClassObject *pEnum = 0;
MY_OUTPUT(L"ENTER ***** CSystem::InternalizeActions...", 4);
Language = SysAllocString(L"WQL"); MY_ASSERT(Language); if (!Language) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} Query = SysAllocString(L"select * from MicrosoftHM_ActionConfiguration"); MY_ASSERT(Query); if (!Query) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;}
// Issue query
hRetRes = g_pIWbemServices->ExecQuery(Language, Query, WBEM_FLAG_FORWARD_ONLY, 0, &pEnum); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; SysFreeString(Query); Query = NULL; SysFreeString(Language); Language = NULL;
// Retrieve objects in result set
while (TRUE) { pObj = NULL; uReturned = 0;
hRetRes = pEnum->Next(0, 1, &pObj, &uReturned); MY_ASSERT(hRetRes==S_OK || hRetRes==WBEM_S_FALSE); if (hRetRes!=S_OK && hRetRes!=WBEM_S_FALSE) { MY_HRESASSERT(hRetRes); pEnum->Release(); pEnum = NULL; return hRetRes; }
if (uReturned == 0) { break; }
// See if this is already read in. Need to prevent duplicates.
hRetRes = GetStrProperty(pObj, L"GUID", &pszTempGUID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; bFound = FALSE; iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; if (!_wcsicmp(pszTempGUID, pAction->m_szGUID)) { bFound = TRUE; break; } }
if (bFound == FALSE) { // Create the internal class to represent the Action
CAction* pA = new CAction; MY_ASSERT(pA); if (!pA) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = pA->LoadInstanceFromMOF(pObj); if (hRetRes==S_OK) { m_actionList.push_back(pA); } else { MY_HRESASSERT(hRetRes); delete pA; } } delete [] pszTempGUID; pszTempGUID = NULL;
// Release it.
pObj->Release(); pObj = NULL; }
// All done
pEnum->Release(); pEnum = NULL;
MY_OUTPUT(L"EXIT ***** CSystem::InternalizeActions...", 4); return S_OK;
error: MY_ASSERT(FALSE); if (Query) SysFreeString(Query); if (Language) SysFreeString(Language); if (pszTempGUID) delete [] pszTempGUID; if (pObj) pObj->Release(); if (pEnum) pEnum->Release(); m_bValidLoad = FALSE; return hRetRes; }
HRESULT CSystem::InitActionErrorListener(void) { BSTR Language = NULL; BSTR Query = NULL; HRESULT hRetRes;
Language = SysAllocString(L"WQL"); MY_ASSERT(Language); if (!Language) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} Query = SysAllocString(L"select * from __ConsumerFailureEvent where Event isa \"MicrosoftHM_ActionTriggerEvent\""); MY_ASSERT(Query); if (!Query) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = S_FALSE; if (g_pIWbemServices != NULL) { m_pTempSink = new CTempConsumer(HMTEMPEVENT_ACTIONERROR); MY_ASSERT(m_pTempSink); if (!m_pTempSink) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = g_pIWbemServices->ExecNotificationQueryAsync( Language, Query, 0, NULL, m_pTempSink); } SysFreeString(Language); Language = NULL; SysFreeString(Query); Query = NULL;
MY_HRESASSERT(hRetRes); if (hRetRes != WBEM_S_NO_ERROR) { if (m_pTempSink) { m_pTempSink->Release(); m_pTempSink = NULL; } }
return S_OK;
error: MY_ASSERT(FALSE); if (Query) SysFreeString(Query); if (Language) SysFreeString(Language); m_bValidLoad = FALSE; return hRetRes; }
HRESULT CSystem::InitActionSIDListener(CTempConsumer* pTempSink, LPTSTR pszQuery) { BSTR Language = NULL; BSTR Query = NULL; HRESULT hRetRes;
Language = SysAllocString(L"WQL"); MY_ASSERT(Language); if (!Language) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} Query = SysAllocString(pszQuery); MY_ASSERT(Query); if (!Query) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = S_FALSE; if (g_pIWbemServices != NULL) { pTempSink = new CTempConsumer(HMTEMPEVENT_ACTIONSID); MY_ASSERT(pTempSink); if (!pTempSink) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = g_pIWbemServices->ExecNotificationQueryAsync( Language, Query, 0, NULL, pTempSink); } SysFreeString(Language); Language = NULL; SysFreeString(Query); Query = NULL;
MY_HRESASSERT(hRetRes); if (hRetRes != WBEM_S_NO_ERROR) { if (pTempSink) { pTempSink->Release(); pTempSink = NULL; } }
return S_OK;
error: MY_ASSERT(FALSE); if (Query) SysFreeString(Query); if (Language) SysFreeString(Language); m_bValidLoad = FALSE; return hRetRes; }
HRESULT CSystem::HandleTempActionSIDEvent(IWbemClassObject* pObj) { VARIANT vDispatch; VARIANT var; HRESULT hRetRes = S_OK; IWbemClassObject* pTargetInstance = NULL; VariantInit(&vDispatch); VariantInit(&var); IWbemClassObject* pInst = NULL; SAFEARRAY* psa = NULL; CIMTYPE vtType; long lBound, uBound; BOOL bObjIsLocalSystem; DWORD dwErr = 0; VariantInit(&vDispatch); VariantInit(&var); TCHAR szName[200]; DWORD dwSize = 0; DWORD dwResult = 0; TCHAR szDomain[200]; SID_NAME_USE SidType; LPVOID lpCreatorSID = NULL;
MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempActionSIDEvent BLOCK - g_hConfigLock BLOCK WAIT", 4); dwErr = WaitForSingleObject(g_hConfigLock, 120000); if(dwErr != WAIT_OBJECT_0) { if(dwErr = WAIT_TIMEOUT) { TRACE_MUTEX(L"TIMEOUT MUTEX"); return WBEM_S_TIMEDOUT; } else { MY_OUTPUT(L"WaitForSingleObject on Mutex failed",4); return WBEM_E_FAILED; } } MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempActionSIDEvent BLOCK - g_hConfigLock BLOCK GOT IT", 4);
if (!g_pSystem) { ReleaseMutex(g_hConfigLock); return S_FALSE; }
hRetRes = pObj->Get(L"TargetInstance", 0L, &vDispatch, 0, 0); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = GetWbemClassObject(&pTargetInstance, &vDispatch); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
// get the CreatorSID of this instance
hRetRes = pTargetInstance->Get(L"CreatorSID", 0, &var, &vtType, NULL); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; if (vtType != (CIM_UINT8 | CIM_FLAG_ARRAY)) { hRetRes = WBEM_E_FAILED; goto error; }
// make sure it's the right size
psa = var.parray; if (::SafeArrayGetElemsize(psa) != 1) { hRetRes = WBEM_E_FAILED; goto error; }
hRetRes = ::SafeArrayGetLBound(psa, 1, &lBound); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = ::SafeArrayGetUBound(psa, 1, &uBound); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; if (lBound !=0) { hRetRes = WBEM_E_FAILED; goto error; }
// now see if this is LocalSystem by comparing to
// the hardcoded LocalSystem SID
bObjIsLocalSystem = false; if (uBound == (sizeof LocalSystemSID)-1 ) { lpCreatorSID = NULL; hRetRes = ::SafeArrayAccessData(psa, &lpCreatorSID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; if (memcmp (lpCreatorSID, LocalSystemSID, sizeof LocalSystemSID) == 0) bObjIsLocalSystem = true; hRetRes = ::SafeArrayUnaccessData(psa); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; }
if (bObjIsLocalSystem == FALSE) { // Also, skip it if it is a LocalAccount! (non-domain)
lpCreatorSID = NULL; hRetRes = ::SafeArrayAccessData(psa, &lpCreatorSID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; dwSize = 200; if( !LookupAccountSid(NULL, lpCreatorSID, szName, &dwSize, szDomain, &dwSize, &SidType)) { // Didn't work for some reason, so assume we need to check.
m_numActionChanges++; } else { DWORD dwNameLen = MAX_COMPUTERNAME_LENGTH + 1; TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; if (GetComputerName(szComputerName, &dwNameLen)) { // If machine name matches, then it is a local account, so skip!!!
if (_wcsicmp(szComputerName, szDomain)) { m_numActionChanges++; } } else { // Didn't work for some reason, so assume we need to check.
m_numActionChanges++; } } hRetRes = ::SafeArrayUnaccessData(psa); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; }
pTargetInstance->Release(); pTargetInstance = NULL; VariantClear(&vDispatch); VariantClear(&var); ReleaseMutex(g_hConfigLock); return S_OK;
error: MY_ASSERT(FALSE); if (pTargetInstance) pTargetInstance->Release(); if (pInst) pInst->Release(); VariantClear(&vDispatch); VariantClear(&var); ReleaseMutex(g_hConfigLock); return hRetRes; }
// Pass on info to the DataCollector that has the GUID
HRESULT CSystem::HandleTempActionErrorEvent(IWbemClassObject* pObj) { HRESULT hRetRes = S_OK; BOOL bFound = FALSE; VARIANT vDispatch; int i, iSize; CAction* pAction; IWbemClassObject* pTargetInstance = NULL; LPTSTR pszGUID = NULL; LPTSTR pszErrorDescription = NULL; long lNum; DWORD dwErr = 0; VariantInit(&vDispatch);
MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempActionErrorEvent BLOCK - g_hConfigLock BLOCK WAIT", 4); dwErr = WaitForSingleObject(g_hConfigLock, 120000); if(dwErr != WAIT_OBJECT_0) { if(dwErr = WAIT_TIMEOUT) { TRACE_MUTEX(L"TIMEOUT MUTEX"); return WBEM_S_TIMEDOUT; } else { MY_OUTPUT(L"WaitForSingleObject on Mutex failed",4); return WBEM_E_FAILED; } } MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempActionErrorEvent BLOCK - g_hConfigLock BLOCK GOT IT", 4);
if (!g_pSystem) { ReleaseMutex(g_hConfigLock); return S_FALSE; }
try { // Get the GUID from the Event property, which will be an ActionStatusEvent class, then
// from that GUID property.
VariantInit(&vDispatch); hRetRes = pObj->Get(L"Event", 0L, &vDispatch, 0, 0); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = GetWbemClassObject(&pTargetInstance, &vDispatch); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
hRetRes = GetStrProperty(pTargetInstance, L"GUID", &pszGUID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
hRetRes = GetUint32Property(pObj, L"ErrorCode", &lNum); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
hRetRes = GetStrProperty(pObj, L"ErrorDescription", &pszErrorDescription); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
pTargetInstance->Release(); VariantClear(&vDispatch);
iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; if (pAction->HandleTempErrorEvent(pszGUID, lNum, pszErrorDescription)) { bFound = TRUE; break; } }
if (bFound == FALSE) { MY_OUTPUT2(L"NOTFOUND: No body to handle Action Error event for GUID=%s", pszGUID, 4); } delete [] pszGUID; pszGUID = NULL; delete [] pszErrorDescription; pszErrorDescription = NULL; } catch (...) { MY_ASSERT(FALSE); }
MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent g_hConfigLock BLOCK - RELEASE IT", 4); ReleaseMutex(g_hConfigLock); MY_OUTPUT(L"BLOCK - BLOCK CSystem::HandleTempEvent g_hConfigLock BLOCK - RELEASED", 4); return S_OK;
error: MY_ASSERT(FALSE); if (pszGUID) delete [] pszGUID; if (pszErrorDescription) delete [] pszErrorDescription; ReleaseMutex(g_hConfigLock); return hRetRes; }
//
// For ones that are created on the fly, after we are running.
//
HRESULT CSystem::CreateAction(IWbemClassObject* pObj) { HRESULT hRetRes = S_OK; BOOL bFound = FALSE; int i, iSize; CAction* pAction; LPTSTR pszTempGUID = NULL;
MY_OUTPUT(L"ENTER ***** CSystem::CreateAction...", 4);
// See if this is already read in. Need to prevent duplicates.
hRetRes = GetStrProperty(pObj, L"GUID", &pszTempGUID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; bFound = FALSE; iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; if (!_wcsicmp(pszTempGUID, pAction->m_szGUID)) { bFound = TRUE; break; } }
if (bFound == FALSE) { // Create the internal class to represent the Action
CAction* pA = new CAction; MY_ASSERT(pA); if (!pA) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = pA->LoadInstanceFromMOF(pObj); if (hRetRes==S_OK) { m_actionList.push_back(pA); } else { MY_HRESASSERT(hRetRes); delete pA; } } delete [] pszTempGUID; pszTempGUID= NULL;
MY_OUTPUT(L"EXIT ***** CSystem::CreateAction...", 4); return hRetRes;
error: MY_ASSERT(FALSE); if (pszTempGUID) delete [] pszTempGUID; return hRetRes; }
// Traverse the Configuration class hierarchy, like do from InternalizeDataGroups(),
// and create one single safearray to pass back.
// Contains the object that matches the GUID, and everything under it,
// including associations.
HRESULT CSystem::FindAndCopyByGUID(LPTSTR pszGUID, SAFEARRAY** ppsa, LPTSTR *pszOriginalParentGUID) { int j; HRESULT hRetRes = S_OK; int i, iSize; CDataGroup* pDataGroup; SAFEARRAYBOUND bound[1]; IWbemClassObject* pInstance = NULL; long ix[1]; IUnknown* pIUnknown = NULL; ILIST configList; HRESULT hRes; static LPTSTR systemGUID = L"{@}";
MY_OUTPUT(L"ENTER ***** CSystem::FindAndCopyByGUID...", 4); MY_OUTPUT2(L"COPY GUID=%s", pszGUID, 4);
//
// Traverse the complete hierarchy to find the object to delete.
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszGUID, pDataGroup->GetGUID())) { hRetRes = pDataGroup->Copy(&configList, NULL, NULL); *pszOriginalParentGUID = systemGUID; break; } // Look at branch below to see if can find it
hRetRes = pDataGroup->FindAndCopyByGUID(pszGUID, &configList, pszOriginalParentGUID); if (hRetRes==S_OK) { break; } else if (hRetRes!=WBEM_S_DIFFERENT) { break; } }
if (hRetRes == WBEM_S_DIFFERENT) { MY_OUTPUT(L"TargetGuid to copy not found!", 4); return WBEM_E_NOT_FOUND; } else if (hRetRes != S_OK) { MY_OUTPUT(L"Copy error not found!", 4); return hRetRes; }
//
// Now, here at the end, place in the safe array!
//
iSize = configList.size(); bound[0].lLbound = 0; bound[0].cElements = iSize; *ppsa = SafeArrayCreate(VT_UNKNOWN, 1, bound); if (*ppsa == NULL) { MY_OUTPUT(L"SafeArray creation failure!", 4); MY_ASSERT(FALSE); return WBEM_E_OUT_OF_MEMORY; }
j = 0; for (i=0; i<iSize; i++) { MY_ASSERT(i<configList.size()); pInstance = configList[i]; // Add the DG instance to the safe array
hRes = pInstance->QueryInterface(IID_IUnknown, (void**) &pIUnknown);
if (hRes != NOERROR) { MY_HRESASSERT(hRes); MY_OUTPUT(L"Copy failure!", 4); SafeArrayDestroy(*ppsa); return hRes; } ix[0] = j; j++; hRes = SafeArrayPutElement(*ppsa, ix, pIUnknown); if (hRes != S_OK) { MY_HRESASSERT(hRes); MY_OUTPUT(L"Copy failure!", 4); MY_ASSERT(FALSE); } // SafeArrayPutElement adds a reference to the contents of the
// variant, so we must free the variable we have.
//
pIUnknown->Release(); pInstance->Release(); pIUnknown = NULL; pInstance = NULL; }
MY_OUTPUT(L"EXIT ***** CSystem::FindAndCopyByGUID...", 4); return S_OK; }
//
// What we need to do here is basically just do a PutInstance for everything
// in the array, and add the one association from my identified parent, to
// The first HMConfiguration object that was in the array.
// There are the thresholds to follow to make sure that we do not end up with two objects named
// the same at the same level. We follow the example of NTExplorer for this.
// Return 0 if success, 1 if error, and 2 if naming conflict when bForceReplace is set to FALSE.
//
HRESULT CSystem::FindAndPasteByGUID(LPTSTR pszTargetGUID, SAFEARRAY* psa, LPTSTR pszOriginalSystem, LPTSTR pszOriginalParentGUID, BOOL bForceReplace) { BSTR Path = NULL; BSTR PathToClass = NULL; TCHAR szTemp[1024]; LPTSTR pStr; HRESULT hRes; HRESULT hRetRes = S_OK; IUnknown* vUnknown; IWbemClassObject* pCO = NULL; long iLBound, iUBound; IWbemClassObject* pTargetObj = NULL; LPTSTR pszChildGUID = NULL; LPTSTR pszChildName = NULL; LPTSTR pszParentClass = NULL; LPTSTR pszChildClass = NULL; IWbemCallResult *pResult = 0; CBase *pParent = NULL; CBase *pChild = NULL; IWbemClassObject *pNewInstance = NULL; IWbemClassObject *pExampleClass = NULL; IWbemContext *pCtx = NULL;
MY_OUTPUT(L"EXIT ***** CSystem::FindAndPasteByGUID...", 4); MY_OUTPUT2(L"PASTE Target GUID=%s", pszTargetGUID, 4); MY_OUTPUT2(L"OrigionalSystem=%s", pszOriginalSystem, 4); MY_OUTPUT2(L"OrigionalParent GUID=%s", pszOriginalParentGUID, 4); MY_OUTPUT2(L"ForceReplace=%d", (int)bForceReplace, 4);
//
// Make sure that the object exists that we are to copy ourselves under!
//
wcscpy(szTemp, L"MicrosoftHM_Configuration.GUID=\""); lstrcat(szTemp, pszTargetGUID); lstrcat(szTemp, L"\""); Path = SysAllocString(szTemp); MY_ASSERT(Path); if (!Path) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRetRes = GetWbemObjectInst(&g_pIWbemServices, Path, NULL, &pTargetObj); if (!pTargetObj) { MY_OUTPUT(L"Target Not found to paste under", 4); SysFreeString(Path); return 1; } SysFreeString(Path); Path = NULL;
hRetRes = GetStrProperty(pTargetObj, L"__CLASS", &pszParentClass); MY_HRESASSERT(hRetRes); //XXXMake sure to prevent a paste under a Threshold
//Strcmp Parent class with MicrosoftHM_ThresholdConfiguration
//
// Do a PutInstance for everything in the array.
//
SafeArrayGetLBound(psa, 1, &iLBound); SafeArrayGetUBound(psa, 1, &iUBound); if ((iUBound - iLBound + 1) == 0) { MY_ASSERT(FALSE); } else { for (long i = iLBound; i <= iUBound; i++) { vUnknown = NULL; hRetRes = SafeArrayGetElement(psa, &i, &vUnknown); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; pCO = (IWbemClassObject *)vUnknown;
//
// We have here the child to get pasted under the target.
// First off we need to decide if we can paste it, and if we need
// to do a replace of an existing configuration instance.
// We also need to save info that is to be used later to create an association.
//
if (pszChildGUID == NULL) { hRetRes = GetStrProperty(pCO, L"GUID", &pszChildGUID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = GetStrProperty(pCO, L"Name", &pszChildName); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = GetStrProperty(pCO, L"__CLASS", &pszChildClass); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
//
// Search for the parent, and then look to see if there is a
// child with the same name.
//
pParent = GetParentPointerFromPath(szTemp); MY_ASSERT(pParent); if (!pParent) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} pChild = pParent->FindImediateChildByName(pszChildName); if (pChild) { //
// We found a child with the same name already!
//
DWORD dwNameLen = MAX_COMPUTERNAME_LENGTH + 1; TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; if (GetComputerName(szComputerName, &dwNameLen)) { } else { wcscpy(szComputerName, L"LocalMachine"); }
//
// Do what Explorer does, and act different if the original parent
// is the same as the target parent.
//
if (!_wcsicmp(pszOriginalSystem, szComputerName) && !_wcsicmp(pszOriginalParentGUID, pszTargetGUID)) { //
// This is where we are copying from and to the same parent.
// So don't ask, just rename to next increment.
//
pStr = szTemp; pParent->GetNextChildName(pszChildName, pStr); PutStrProperty(pCO, L"Name", szTemp); } else { // Different parent, so ask if want to replace!
if (bForceReplace) { // Delete the old one first!
FindAndDeleteByGUID(pChild->m_szGUID); delete [] pszChildName; pszChildName = NULL; } else { delete [] pszParentClass; pszParentClass = NULL; delete [] pszChildClass; pszChildClass = NULL; delete [] pszChildGUID; pszChildGUID = NULL; delete [] pszChildName; pszChildName = NULL; vUnknown->Release(); pTargetObj->Release(); MY_OUTPUT(L"Paste conflict", 4); return 2; } } } else { // Not found, so we are OK to proceed
} }
hRes = g_pIWbemServices->PutInstance(pCO, 0, NULL, &pResult); if (hRes != S_OK) { MY_HRESASSERT(hRes); MY_OUTPUT2(L"Put failure Unexpected Error: 0x%08x",hRes,4); }
vUnknown->Release(); } }
MY_ASSERT(pszChildGUID); //
// Add the one association from my identified parent, to the first
// HMConfiguration object that was in the array.
//
pResult = 0;
// Get the association class definition.
PathToClass = SysAllocString(L"MicrosoftHM_ConfigurationAssociation"); MY_ASSERT(PathToClass); if (!PathToClass) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} hRes = g_pIWbemServices->GetObject(PathToClass, 0, pCtx, &pExampleClass, &pResult); SysFreeString(PathToClass); PathToClass = NULL;
if (hRes != 0) { MY_HRESASSERT(hRes); MY_OUTPUT2(L"GetObject failure Unexpected Error: 0x%08x",hRes,4); return hRes; }
// Create a new association instance.
hRetRes = pExampleClass->SpawnInstance(0, &pNewInstance); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; pExampleClass->Release(); pExampleClass = NULL;
// If it is the System, then looks like ->"MicrosoftHM_SystemConfiguration.GUID=\"{@}\""
// Child looks like ->"\\.\root\cimv2\MicrosoftHealthMonitor:
// MicrosoftHM_DataGroupConfiguration.GUID="{269EA389-07CA-11d3-8FEB-006097919914}""
// MicrosoftHM_Configuration.GUID="{269EA389-07CA-11d3-8FEB-006097919914}""
if (!wcscmp(pszTargetGUID, L"{@}")) { wcscpy(szTemp, L"MicrosoftHM_SystemConfiguration.GUID=\"{@}\""); } else { wcscpy(szTemp, L"\\\\.\\root\\cimv2\\MicrosoftHealthMonitor:"); lstrcat(szTemp, pszParentClass); lstrcat(szTemp, L".GUID=\""); lstrcat(szTemp, pszTargetGUID); lstrcat(szTemp, L"\""); } PutStrProperty(pNewInstance, L"ParentPath", szTemp); wcscpy(szTemp, L"\\\\.\\root\\cimv2\\MicrosoftHealthMonitor:"); lstrcat(szTemp, pszChildClass); lstrcat(szTemp, L".GUID=\""); lstrcat(szTemp, pszChildGUID); lstrcat(szTemp, L"\""); PutStrProperty(pNewInstance, L"ChildPath", szTemp);
// Write the association instance
hRetRes = g_pIWbemServices->PutInstance(pNewInstance, 0, pCtx, &pResult); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; pNewInstance->Release(); pNewInstance = NULL;
//
// Cleanup
//
if (pszChildGUID != NULL) { delete [] pszChildGUID; pszChildGUID = NULL; } pTargetObj->Release(); pTargetObj = NULL; delete [] pszParentClass; pszParentClass = NULL; delete [] pszChildClass; pszChildClass = NULL;
MY_OUTPUT(L"EXIT ***** CSystem::FindAndPasteByGUID...", 4); return 0;
error: MY_ASSERT(FALSE); if (pszParentClass) delete [] pszParentClass; if (pszChildClass) delete [] pszChildClass; if (pszChildGUID) delete [] pszChildGUID; if (pszChildName) delete [] pszChildName; if (pTargetObj) pTargetObj->Release(); if (Path) SysFreeString(Path); if (PathToClass) SysFreeString(PathToClass); if (pNewInstance) pNewInstance->Release(); if (pExampleClass) pExampleClass->Release(); return hRetRes; }
HRESULT CSystem::FindAndCopyWithActionsByGUID(LPTSTR pszGUID, SAFEARRAY** ppsa, LPTSTR *pszOriginalParentGUID) { return AgentCopy (pszGUID, ppsa, pszOriginalParentGUID); }
HRESULT CSystem::FindAndPasteWithActionsByGUID(LPTSTR pszTargetGUID, SAFEARRAY* psa, LPTSTR pszOriginalSystem, LPTSTR pszOriginalParentGUID, BOOL bForceReplace) { return AgentPaste (pszTargetGUID, psa, pszOriginalSystem, pszOriginalParentGUID, bForceReplace); }
//
// Delete the single use of an Action
//
#ifdef SAVE
HRESULT CSystem::Move(LPTSTR pszTargetGUID, LPTSTR pszNewParentGUID) { int i, iSize; CDataGroup* pDataGroup; BOOL bFound = FALSE; CBase *pTargetBase = NULL; CBase *pNewParentBase = NULL;
MY_OUTPUT(L"ENTER ***** CSystem::Move...", 4); MY_OUTPUT2(L"TargetGUID=%s", pszTargetGUID, 4); MY_OUTPUT2(L"NewParentGUID=%s", pszNewParentGUID, 4);
//
// First locate the thing to move
//
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszTargetGUID, pDataGroup->GetGUID())) { pTargetBase = pDataGroup; break; } // Look at branch below to see if can find it
pTargetBase = pDataGroup->GetParentPointerFromGUID(pszTargetGUID); if (pTargetBase) { break; } }
if (pTargetBase) { bFound = FALSE; //
// Next locate the place to move under
//
if (!wcscmp(pszNewParentGUID, L"{@}")) { pNewParentBase = this; bFound = TRUE; } else { iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszNewParentGUID, pDataGroup->GetGUID())) { pNewParentBase = pDataGroup; bFound = TRUE; break; } // Look at branch below to see if can find it
pNewParentBase = pDataGroup->GetParentPointerFromGUID(pszNewParentGUID); if (pNewParentBase) { bFound = TRUE; break; } } }
if (pNewParentBase) { //
// Make sure that it is a legal move.
// Can't do things like move a Threshold under a System, or DataGroup.
//
if (pNewParentBase->m_hmStatusType == HMSTATUS_SYSTEM) { if (pTargetBase->m_hmStatusType != HMSTATUS_DATAGROUP) { bFound = FALSE; } } else if (pNewParentBase->m_hmStatusType == HMSTATUS_DATAGROUP) { if (pTargetBase->m_hmStatusType != HMSTATUS_DATAGROUP && pTargetBase->m_hmStatusType != HMSTATUS_DATACOLLECTOR) { bFound = FALSE; } } else if (pNewParentBase->m_hmStatusType == HMSTATUS_DATACOLLECTOR) { if (pTargetBase->m_hmStatusType != HMSTATUS_THRESHOLD) { bFound = FALSE; } } else if (pNewParentBase->m_hmStatusType == HMSTATUS_THRESHOLD) { bFound = FALSE; } else { MY_ASSERT(FALSE); }
if (bFound) { //
// Delete the object out of the list of the old parent.
//
if (pTargetBase->m_hmStatusType == HMSTATUS_DATAGROUP) { if (((CDataGroup *)pTargetBase)->m_pParentDG == NULL) { g_pSystem->DeleteChildFromList(pszTargetGUID); } else { ((CDataGroup *)pTargetBase)->m_pParentDG->DeleteChildFromList(pszTargetGUID); } } else if (pTargetBase->m_hmStatusType == HMSTATUS_DATACOLLECTOR) { ((CDataCollector *)pTargetBase)->m_pParentDG->DeleteChildFromList(pszTargetGUID); } else if (pTargetBase->m_hmStatusType == HMSTATUS_THRESHOLD) { ((CThreshold *)pTargetBase)->m_pParentDC->DeleteChildFromList(pszTargetGUID); } else { MY_ASSERT(FALSE); }
//
// Modify the association in the repository.
//
pTargetBase->ModifyAssocForMove(pNewParentBase); //
// Move the object under its new parent
//
pNewParentBase->ReceiveNewChildForMove(pTargetBase); } } }
if (bFound == FALSE) { MY_OUTPUT(L"GUID not found", 4); MY_OUTPUT(L"EXIT ***** CSystem::Move...", 4); return WBEM_E_NOT_FOUND; } else { MY_OUTPUT(L"EXIT ***** CSystem::Move...", 4); return S_OK; } } #endif
#ifdef SAVE
BOOL CSystem::ModifyAssocForMove(CBase *pNewParentBase) { MY_ASSERT(FALSE);
return TRUE; } #endif
BOOL CSystem::ReceiveNewChildForMove(CBase *pBase) { m_dataGroupList.push_back((CDataGroup *)pBase); // (CDataGroup *)pBase->SetParentEnabledFlag(m_bEnabled);
return TRUE; }
BOOL CSystem::DeleteChildFromList(LPTSTR pszGUID) { int i, iSize; CDataGroup* pDataGroup; DGLIST::iterator iaDG;
iSize = m_dataGroupList.size(); iaDG=m_dataGroupList.begin(); for (i=0; i<iSize; i++, iaDG++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszGUID, pDataGroup->GetGUID())) { m_dataGroupList.erase(iaDG); break; } }
return TRUE; }
//
// Delete the single use of an Action
//
HRESULT CSystem::DeleteConfigActionAssoc(LPTSTR pszConfigGUID, LPTSTR pszActionGUID) { BOOL bFound = FALSE; int i, iSize; CAction* pAction;
MY_OUTPUT(L"ENTER ***** CSystem::DeleteConfigActionAssociation...", 4); MY_OUTPUT2(L"ConfigGUID=%s", pszConfigGUID, 4); MY_OUTPUT2(L"ActionGUID=%s", pszActionGUID, 4);
iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; if (pAction->DeleteConfigActionAssoc(pszConfigGUID, pszActionGUID)) { bFound = TRUE; break; } }
if (bFound == FALSE) { MY_OUTPUT(L"GUID not found", 4); MY_OUTPUT(L"EXIT ***** CSystem::DeleteConfigActionAssociation...", 4); return WBEM_E_NOT_FOUND; } else { MY_OUTPUT(L"EXIT ***** CSystem::DeleteConfigActionAssociation...", 4); return S_OK; } }
//
// Delete the all associated actions to a given configuration GUID
//
HRESULT CSystem::DeleteAllConfigActionAssoc(LPTSTR pszConfigGUID) { BOOL bFound = FALSE; int i, iSize; CAction* pAction;
MY_OUTPUT(L"ENTER ***** CSystem::DeleteAllConfigActionAssociation...", 4); MY_OUTPUT2(L"ConfigGUID=%s", pszConfigGUID, 4);
iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; if (pAction->DeleteConfigActionAssoc(pszConfigGUID, pAction->m_szGUID)) { bFound = TRUE; } }
if (bFound == FALSE) { MY_OUTPUT(L"No associations found. OK?", 4); MY_OUTPUT(L"EXIT ***** CSystem::DeleteAllConfigActionAssociation...", 4); return S_FALSE; } else { MY_OUTPUT(L"EXIT ***** CSystem::DeleteAllConfigActionAssociation...", 4); return S_OK; } }
CBase *CSystem::GetParentPointerFromPath(LPTSTR pszParentPath) { TCHAR szGUID[1024]; int i, iSize; CDataGroup* pDataGroup; LPTSTR pStr; LPTSTR pStr2; BOOL bFound = FALSE; CBase *pBase;
wcscpy(szGUID, pszParentPath); pStr = wcschr(szGUID, '\"'); if (pStr) { pStr++; pStr2 = wcschr(pStr, '\"'); if (pStr2) { *pStr2 = '\0'; if (!wcscmp(pStr, L"{@}")) { pBase = this; bFound = TRUE; } else { iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pStr, pDataGroup->GetGUID())) { pBase = pDataGroup; bFound = TRUE; break; } // Look at branch below to see if can find it
pBase = pDataGroup->GetParentPointerFromGUID(pStr); if (pBase) { bFound = TRUE; break; } } } } } else { pStr = wcschr(szGUID, '='); if (pStr) { pStr++; pStr++; pStr++; if (*pStr == '@') { pBase = this; bFound = TRUE; } } }
if (bFound == TRUE) { return pBase; } else { return NULL; } }
CBase *CSystem::FindImediateChildByName(LPTSTR pszName) { int i, iSize; CDataGroup* pDataGroup; BOOL bFound = FALSE; CBase *pBase;
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszName, pDataGroup->m_szName)) { pBase = pDataGroup; bFound = TRUE; break; } }
if (bFound == TRUE) { return pBase; } else { return NULL; } }
BOOL CSystem::GetNextChildName(LPTSTR pszChildName, LPTSTR pszOutName) { TCHAR szTemp[1024]; TCHAR szIndex[1024]; int i, iSize; BOOL bFound; CDataGroup* pDataGroup; int index;
// We are here because we know that one exists already with the same name.
// So, lets start off trying to guess what the next name should be and get one.
index = 0; bFound = TRUE; while (bFound == TRUE) { wcscpy(szTemp, pszChildName); _itot(index, szIndex, 10); lstrcat(szTemp, L" "); lstrcat(szTemp, szIndex);
bFound = FALSE; iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(szTemp, pDataGroup->m_szName)) { bFound = TRUE; break; } } index++; } wcscpy(pszOutName, szTemp);
return TRUE; }
CBase *CSystem::FindPointerFromName(LPTSTR pszName) { int i, iSize; CDataGroup* pDataGroup; BOOL bFound = FALSE; CBase *pBase;
iSize = m_dataGroupList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_dataGroupList.size()); pDataGroup = m_dataGroupList[i]; if (!_wcsicmp(pszName, pDataGroup->m_szName)) { pBase = pDataGroup; bFound = TRUE; break; } // Look at branch below to see if can find it
pBase = pDataGroup->FindPointerFromName(pszName); if (pBase) { bFound = TRUE; break; } }
if (bFound == TRUE) { return pBase; } else { return NULL; } }
//
// Do string replacement for the Message property
//
BOOL CSystem::FormatMessage(IWbemClassObject* pInstance) { BSTR PropName = NULL; LPTSTR pszMsg = NULL; SAFEARRAY *psaNames = NULL; long lNum; HRESULT hRetRes = S_OK; LPTSTR pszDest = NULL; LPTSTR pszUpperMsg = NULL; LPTSTR pszNewMsg = NULL; LPTSTR pStr = NULL; LPTSTR pStr2 = NULL; LPTSTR pStrStart = NULL; TOKENSTRUCT tokenElmnt; TOKENSTRUCT *pTokenElmnt; REPSTRUCT repElmnt; REPSTRUCT *pRepElmnt; REPSTRUCT *pRepElmnt2; REPLIST replacementList; int i, iSize, iSizeNeeded, j; long lLower, lUpper; static TOKENLIST tokenList;
//
// We only need to build the set of tokens one time, then from then on
// we just need to fill in the values for what the replacement strings are.
//
if (tokenList.size() == 0) { //
// First we build the set of tokens that we are looking for. Each property that
// is in the ThresholdStatusInstance. We build that set of strings,
// and the values to replace with.
//
//
// Now go through ThresholdInstance, which is where the Message String
// actually lives. Get that set of properties for the Instances.
//
psaNames = NULL; hRetRes = pInstance->GetNames(NULL, WBEM_FLAG_NONSYSTEM_ONLY, NULL, &psaNames); if (SUCCEEDED(hRetRes)) { // Get the number of properties.
SafeArrayGetLBound(psaNames, 1, &lLower); SafeArrayGetUBound(psaNames, 1, &lUpper);
// For each property...
for (long l=lLower; l<=lUpper; l++) { // Get this property.
hRetRes = SafeArrayGetElement(psaNames, &l, &PropName); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; // Will want to skip some that don't make sense.
if (!wcscmp(PropName, L"Message")) { SysFreeString(PropName); PropName = NULL; continue; } else if (!wcscmp(PropName, L"ResetMessage")) { SysFreeString(PropName); PropName = NULL; continue; } else if (!wcscmp(PropName, L"EmbeddedCollectedInstance")) { SysFreeString(PropName); PropName = NULL; continue; } tokenElmnt.szOrigToken = new TCHAR[wcslen(PropName)+1]; MY_ASSERT(tokenElmnt.szOrigToken); if (!tokenElmnt.szOrigToken) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} wcscpy(tokenElmnt.szOrigToken, PropName); tokenElmnt.szToken = new TCHAR[wcslen(PropName)+3]; MY_ASSERT(tokenElmnt.szToken); if (!tokenElmnt.szToken) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} wcscpy(tokenElmnt.szToken, L"%"); wcscat(tokenElmnt.szToken, PropName); wcscat(tokenElmnt.szToken, L"%"); _wcsupr(tokenElmnt.szToken); tokenElmnt.szReplacementText = NULL; tokenList.push_back(tokenElmnt); SysFreeString(PropName); PropName = NULL; } SafeArrayDestroy(psaNames); psaNames = NULL; } }
//
// Now we can fill in the values to use for the replacement strings.
//
//
// Now go through each ThresholdInstance, which is where the Message String
// actually lives. Get that set of properties of the Instance,
// And do the message formatting while there.
//
//
// Get the replacement strings for this instance
//
iSize = tokenList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<tokenList.size()); pTokenElmnt = &tokenList[i]; if (pTokenElmnt->szReplacementText != NULL) { delete [] pTokenElmnt->szReplacementText; } if (!wcscmp(pTokenElmnt->szToken, L"%TESTCONDITION%")) { hRetRes = GetUint32Property(pInstance, pTokenElmnt->szOrigToken, &lNum); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; MY_ASSERT(lNum<9); pStr = new TCHAR[wcslen(conditionLocStr[lNum])+1]; MY_ASSERT(pStr); if (!pStr) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} wcscpy(pStr, conditionLocStr[lNum]); } else if (!wcscmp(pTokenElmnt->szToken, L"%STATE%")) { hRetRes = GetUint32Property(pInstance, pTokenElmnt->szOrigToken, &lNum); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; MY_ASSERT(lNum<10); pStr = new TCHAR[wcslen(stateLocStr[lNum])+1]; MY_ASSERT(pStr); if (!pStr) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} wcscpy(pStr, stateLocStr[lNum]); } else { hRetRes = GetAsStrProperty(pInstance, pTokenElmnt->szOrigToken, &pStr); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; } pTokenElmnt->szReplacementText = pStr; }
//
// Now we have both lists of tokens that have replacement
// strings that go with them and the replacement strings
// that go with them
//
//
// Do formatting of Message. We replace all Variable Tags.
// Sample string -
// "Drive %InstanceName% is full. Currently at %CurrentValue%%."
//
//
// Get the origional un-formatted message first.
// To make case in-sensitive, do a _strdup and then a _wcsupr on the string
// to scan run the code on it, and then free the duplicated string.
//
// If it uses resource IDs, then get that string first, then format that!!!
hRetRes = GetStrProperty(pInstance, L"Message", &pszMsg); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
pszUpperMsg = _wcsdup(pszMsg); MY_ASSERT(pszUpperMsg); if (!pszUpperMsg) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} _wcsupr(pszUpperMsg);
//
// First loop through and find every token that needs replacing.
// Put that info into the replacement list.
//
// We will do strstr() for each special token until there are no more to find
// for each. At each find we will store the offset into the string of what
// we found. Then we sort by what came first.
//
// Quick test to see if it is worth searching
if (wcschr(pszUpperMsg, '%')) { iSize = tokenList.size(); pStrStart = pszUpperMsg; for (i=0; i<iSize; i++) { MY_ASSERT(i<tokenList.size()); pTokenElmnt = &tokenList[i]; pStr = wcsstr(pStrStart, pTokenElmnt->szToken); if (pStr != NULL) { repElmnt.pStartStr = pszMsg+(pStr-pszUpperMsg); repElmnt.len = wcslen(pTokenElmnt->szToken); repElmnt.pszReplacementText = pTokenElmnt->szReplacementText; replacementList.push_back(repElmnt); i--; pStrStart = pStr+1; } else { pStrStart = pszUpperMsg; } }
//
// Need to look for replacement strings that have not been replaced.
// Simply search for %EmbeddedCollectedInstance. and find the end % for each
// Replace them with <null>
//
pStrStart = pszUpperMsg; while (TRUE) { pStr = wcsstr(pStrStart, L"%EMBEDDEDCOLLECTEDINSTANCE."); if (pStr != NULL) { repElmnt.pStartStr = pszMsg+(pStr-pszUpperMsg); pStr2 = pStr; while (pStr2++) { if (*pStr2=='%' || iswspace(*pStr2)) break; } if (*pStr2=='%') { repElmnt.len = (pStr2-pStr)+1; repElmnt.pszReplacementText = L"<null>"; replacementList.push_back(repElmnt); } pStrStart = pStr+1; } else { break; } } }
iSize = replacementList.size(); if (iSize != 0) { //
// Next, sort the replacement list from the first string to
// be replaced, to the last. Shell sort, Knuth, Vol13, pg. 84.
//
for (int gap=iSize/2; 0<gap; gap/=2) { for (i=gap; i<iSize; i++) { for (j=i-gap; 0<=j; j-=gap) { MY_ASSERT(j+gap<replacementList.size()); pRepElmnt = &replacementList[j+gap]; MY_ASSERT(j<replacementList.size()); pRepElmnt2 = &replacementList[j]; if (pRepElmnt->pStartStr < pRepElmnt2->pStartStr) { MY_ASSERT(j<replacementList.size()); repElmnt = replacementList[j]; MY_ASSERT(j+gap<replacementList.size()); replacementList[j] = replacementList[j+gap]; MY_ASSERT(j+gap<replacementList.size()); replacementList[j+gap] = repElmnt; } } } }
//
// Next, figure out the size needed for the Message with
// everything replaced.
//
iSizeNeeded = wcslen(pszMsg)+1; iSize = replacementList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<replacementList.size()); pRepElmnt = &replacementList[i]; iSizeNeeded -= pRepElmnt->len; iSizeNeeded += wcslen(pRepElmnt->pszReplacementText); } pszNewMsg = new TCHAR[iSizeNeeded]; MY_ASSERT(pszNewMsg); if (!pszNewMsg) {hRetRes = WBEM_E_OUT_OF_MEMORY; goto error;} *pszNewMsg = '\0';
//
// Next, we loop through and do the actual replacements.
// "Drive %InstanceName% is full. Currently at %CurrentValue%%."
//
pszDest = pszMsg; iSize = replacementList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<replacementList.size()); pRepElmnt = &replacementList[i]; *(pRepElmnt->pStartStr) = '\0'; wcscat(pszNewMsg, pszDest); wcscat(pszNewMsg, pRepElmnt->pszReplacementText); //XXXWould memcpy be faster??? memcpy(pszDest, source, charCnt*sizeof(TCHAR));
pszDest = pRepElmnt->pStartStr+pRepElmnt->len; } wcscat(pszNewMsg, pszDest); PutStrProperty(pInstance, L"Message", pszNewMsg); delete [] pszNewMsg; pszNewMsg = NULL; replacementList.clear(); } else { PutStrProperty(pInstance, L"Message", pszMsg); }
delete [] pszMsg; pszMsg = NULL; free(pszUpperMsg); pszUpperMsg = NULL;
return TRUE;
error: MY_ASSERT(FALSE); if (PropName) SysFreeString(PropName); if (psaNames) SafeArrayDestroy(psaNames); if (pszNewMsg) delete [] pszNewMsg; if (pszMsg) delete [] pszMsg; if (pszUpperMsg) free(pszUpperMsg); m_bValidLoad = FALSE; return hRetRes; }
BOOL CSystem::SendReminderActionIfStateIsSame(IWbemObjectSink* pActionEventSink, IWbemObjectSink* pActionTriggerEventSink, IWbemClassObject* pActionInstance, IWbemClassObject* pActionTriggerInstance, unsigned long ulTriggerStates) { HRESULT hRetRes = S_OK; IWbemClassObject* pInstance = NULL; VARIANT v; GUID guid; TCHAR szStatusGUID[100]; VariantInit(&v);
if (m_bValidLoad == FALSE) return FALSE; //
// Check to see if still in the desired state
//
if (!(ulTriggerStates&(1<<m_lCurrState))) { return TRUE; }
hRetRes = GetHMSystemStatusInstance(&pInstance, TRUE); if (SUCCEEDED(hRetRes)) { hRetRes = PutUint32Property(pActionTriggerInstance, L"State", m_lCurrState); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error;
VariantInit(&v); V_VT(&v) = VT_UNKNOWN; V_UNKNOWN(&v) = (IUnknown*)pInstance; (V_UNKNOWN(&v))->AddRef(); hRetRes = (pActionTriggerInstance)->Put(L"EmbeddedStatusEvent", 0L, &v, 0L); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; VariantClear(&v);
if (pActionEventSink) { hRetRes = CoCreateGuid(&guid); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; StringFromGUID2(guid, szStatusGUID, 100); hRetRes = PutStrProperty(pActionInstance, L"StatusGUID", szStatusGUID); MY_HRESASSERT(hRetRes); if (hRetRes!=S_OK) goto error; hRetRes = pActionEventSink->Indicate(1, &pActionInstance); //WBEM_E_SERVER_TOO_BUSY is Ok. Wbem will deliver.
if (FAILED(hRetRes) && hRetRes != WBEM_E_SERVER_TOO_BUSY) { MY_HRESASSERT(hRetRes); MY_OUTPUT(L"Failed on Indicate!", 4); } } if (pActionTriggerEventSink) { hRetRes = pActionEventSink->Indicate(1, &pActionTriggerInstance); //WBEM_E_SERVER_TOO_BUSY is Ok. Wbem will deliver.
if (FAILED(hRetRes) && hRetRes != WBEM_E_SERVER_TOO_BUSY) { MY_HRESASSERT(hRetRes); MY_OUTPUT(L"Failed on Indicate!", 4); } }
pInstance->Release(); pInstance = NULL; } else { MY_HRESASSERT(hRetRes); MY_OUTPUT(L"failed to get instance!", 4); }
return TRUE;
error: MY_ASSERT(FALSE); if (pInstance) pInstance->Release(); return FALSE; }
HRESULT CSystem::AddPointerToMasterList(CBase *pBaseIn) { int i, iSize; CBase* pBase;
MY_ASSERT(pBaseIn->m_szGUID); if (pBaseIn->m_szGUID == NULL) return S_FALSE;
iSize = m_masterList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_masterList.size()); pBase = m_masterList[i]; if (pBaseIn->m_szGUID == pBase->m_szGUID) { MY_ASSERT(FALSE); return S_FALSE; } }
m_masterList.push_back(pBaseIn);
return S_OK; }
BOOL CSystem::RemovePointerFromMasterList(CBase *pBaseIn) { int i, iSize; CBase* pBase; BLIST::iterator iaB;
MY_ASSERT(pBaseIn->m_szGUID); if (pBaseIn->m_szGUID == NULL) return FALSE;
iaB=m_masterList.begin(); iSize = m_masterList.size(); for (i=0; i<iSize; i++, iaB++) { MY_ASSERT(i<m_masterList.size()); pBase = m_masterList[i]; if (pBaseIn->m_szGUID == pBase->m_szGUID) { m_masterList.erase(iaB); return TRUE; } }
MY_ASSERT(FALSE); return FALSE; }
CBase *CSystem::FindPointerFromGUIDInMasterList(LPTSTR pszGUID) { int i, iSize; CBase* pBase;
MY_ASSERT(pszGUID); if (pszGUID == NULL) return NULL;
iSize = m_masterList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_masterList.size()); pBase = m_masterList[i]; if (!_wcsicmp(pszGUID, pBase->m_szGUID)) { return pBase; } }
return NULL; }
HRESULT CSystem::RemapActions(void) { int i, iSize; CAction* pAction;
iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; pAction->RemapAction(); }
return S_OK; }
HRESULT CSystem::CheckAllForBadLoad(void) { int i, iSize; CBase* pBase; CAction* pAction;
//Verify the System???
CheckForBadLoad();
iSize = m_masterList.size(); for (i=0; i<iSize; i++) { MY_ASSERT(i<m_masterList.size()); pBase = m_masterList[i]; pBase->CheckForBadLoad(); }
iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(i<m_actionList.size()); pAction = m_actionList[i]; pAction->CheckForBadLoad(); }
return S_OK; }
HRESULT CSystem::CheckForBadLoad(void) { HRESULT hRetRes = S_OK; IWbemClassObject* pObj = NULL; TCHAR szTemp[1024]; IWbemClassObject* pInstance = NULL; HRESULT hRes;
if (m_bValidLoad == FALSE) { wcscpy(szTemp, L"MicrosoftHM_SystemConfiguration.GUID=\""); lstrcat(szTemp, m_szGUID); lstrcat(szTemp, L"\""); hRetRes = GetWbemObjectInst(&g_pIWbemServices, szTemp, NULL, &pObj); if (!pObj) { MY_HRESASSERT(hRetRes); return S_FALSE; } hRetRes = LoadInstanceFromMOF(pObj); // Here is where we can try and send out a generic SOS if the load failed each time!!!
if (hRetRes != S_OK) { hRes = GetHMSystemStatusInstance(&pInstance, TRUE); } else { hRes = GetHMSystemStatusInstance(&pInstance, TRUE); } if (SUCCEEDED(hRes) && g_pSystemEventSink) { MY_OUTPUT2(L"EVENT: System State Change=%d", m_lCurrState, 4); hRes = g_pSystemEventSink->Indicate(1, &pInstance); // WBEM_E_SERVER_TOO_BUSY is Ok. Wbem will deliver.
if (FAILED(hRes) && hRes != WBEM_E_SERVER_TOO_BUSY) { MY_HRESASSERT(hRes); MY_OUTPUT(L"Failed on Indicate!", 4); } pInstance->Release(); pInstance = NULL; } else { MY_HRESASSERT(hRes); MY_OUTPUT(L"failed to get instance!", 4); } MY_HRESASSERT(hRetRes); pObj->Release(); pObj = NULL; return hRetRes; }
return S_OK; }
|