//*************************************************************************** // // 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 #include //#include #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(iConnectServer(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(iSetParentEnabledFlag(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(iSetParentEnabledFlag(FALSE); } } else { iSize = m_dataGroupList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(iSetParentEnabledFlag(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(iOnAgentInterval(); } m_lPrevState = m_lCurrState; iSize = m_dataGroupList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(iOnAgentInterval(); } 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(iGetCurrState(); 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(iHandleTempEvent(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; im_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(iSendHMDataGroupStatusInstances(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; iSendHMDataGroupStatusInstance(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(iSendHMDataCollectorStatusInstances(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; iSendHMDataCollectorStatusInstance(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(iSendHMDataCollectorPerInstanceStatusInstances(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; iSendHMDataCollectorPerInstanceStatusInstance(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(iSendHMDataCollectorStatisticsInstances(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(iRelease(); } 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; iSendHMDataCollectorStatisticsInstance(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(iRelease(); } 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(iSendHMThresholdStatusInstances(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; iSendHMThresholdStatusInstance(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(iSendHMThresholdStatusInstanceInstances(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; iSendHMThresholdStatusInstanceInstance(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(iSendHMActionStatusInstances(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; iSendHMActionStatusInstance(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(iRelease(); } 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(iRelease(); } 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(iRelease(); } 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(iRelease(); } 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(iRelease(); // } // 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(iRelease(); } 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(iRelease(); } 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(iFindAndModDataGroup(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(iFindAndModDataCollector(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(iFindAndModThreshold(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(iFindAndModAction(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(iFindAndCreateActionAssociation(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(iFindAndModActionAssociation(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(iGetGUID())) { 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(iAddDataGroup(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(iAddDataCollector(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(iAddThreshold(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(iResetResetThresholdStates(); } 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; iGetGUID())) { 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; iGetGUID())) { 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; iResetState(); } } else { // // Traverse the complete hierarchy to find the object to reset state. // iSize = m_dataGroupList.size(); for (i=0; iGetGUID())) { 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; iResetStatistics(); } } else { // // Traverse the complete hierarchy to find the object to reset statistics. // iSize = m_dataGroupList.size(); for (i=0; iGetGUID())) { 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; iEvaluateNow(); } } else { // // Traverse the complete hierarchy to find the object to evaluate now. // iSize = m_dataGroupList.size(); for (i=0; iGetGUID())) { 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; iSetParentEnabledFlag(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(im_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(iHandleTempErrorEvent(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(im_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; iGetGUID())) { 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; iQueryInterface(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; iGetGUID())) { 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; iGetGUID())) { 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; iGetGUID())) { 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(iDeleteConfigActionAssoc(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(iDeleteConfigActionAssoc(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; iGetGUID())) { 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; im_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; im_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; im_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; iszReplacementText != 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; iszToken); 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 // 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""; 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; 0pStartStr < pRepElmnt2->pStartStr) { MY_ASSERT(jlen; 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; ipStartStr) = '\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<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; im_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; im_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; im_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(iRemapAction(); } 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; iCheckForBadLoad(); } iSize = m_actionList.size(); for (i=0; i < iSize; i++) { MY_ASSERT(iCheckForBadLoad(); } 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; }