/*++ Copyright (C) 1998-1999 Microsoft Corporation Module Name: smrootnd.cpp Abstract: This object is used to represent the Performance Logs and Alerts root node --*/ #include "Stdafx.h" #include "smrootnd.h" USE_HANDLE_MACROS("SMLOGCFG(smrootnd.cpp)"); // // Constructor CSmRootNode::CSmRootNode() : m_bIsExpanded ( FALSE ), m_hRootNode ( NULL ), m_hParentNode ( NULL ), m_bIsExtension ( FALSE ) { CString strTemp; ResourceStateManager rsm; // String allocation errors are thrown, to be // captured by rootnode alloc exception handler strTemp.LoadString ( IDS_MMC_DEFAULT_NAME ); SetDisplayName ( strTemp ); strTemp.LoadString ( IDS_ROOT_NODE_DESCRIPTION ); SetDescription ( strTemp ); strTemp.LoadString ( IDS_EXTENSION_COL_TYPE ); SetType ( strTemp ); return; } // // Destructor CSmRootNode::~CSmRootNode() { ASSERT (m_CounterLogService.m_QueryList.GetHeadPosition() == NULL); ASSERT (m_TraceLogService.m_QueryList.GetHeadPosition() == NULL); ASSERT (m_AlertService.m_QueryList.GetHeadPosition() == NULL); return; } void CSmRootNode::Destroy() { m_CounterLogService.Close(); m_TraceLogService.Close(); m_AlertService.Close(); return; } BOOL CSmRootNode::IsLogService ( MMC_COOKIE mmcCookie ) { BOOL bReturn = FALSE; if (mmcCookie == (MMC_COOKIE)&m_CounterLogService) { bReturn = TRUE; } else if (mmcCookie == (MMC_COOKIE)&m_TraceLogService) { bReturn = TRUE; } else if (mmcCookie == (MMC_COOKIE)&m_AlertService) { bReturn = TRUE; } return bReturn; } BOOL CSmRootNode::IsAlertService ( MMC_COOKIE mmcCookie ) { BOOL bReturn = FALSE; if (mmcCookie == (MMC_COOKIE)&m_AlertService) { bReturn = TRUE; } return bReturn; } BOOL CSmRootNode::IsLogQuery ( MMC_COOKIE mmcCookie ) { PSLQUERY pPlQuery = NULL; POSITION Pos; // Handle multiple query types Pos = m_CounterLogService.m_QueryList.GetHeadPosition(); while ( Pos != NULL) { pPlQuery = m_CounterLogService.m_QueryList.GetNext( Pos ); if ((MMC_COOKIE)pPlQuery == mmcCookie) return TRUE; } Pos = m_TraceLogService.m_QueryList.GetHeadPosition(); while ( Pos != NULL) { pPlQuery = m_TraceLogService.m_QueryList.GetNext( Pos ); if ((MMC_COOKIE)pPlQuery == mmcCookie) return TRUE; } Pos = m_AlertService.m_QueryList.GetHeadPosition(); while ( Pos != NULL) { pPlQuery = m_AlertService.m_QueryList.GetNext( Pos ); if ((MMC_COOKIE)pPlQuery == mmcCookie) return TRUE; } return FALSE; } DWORD CSmRootNode::UpdateServiceConfig() { // If any queries are (newly) set to auto start, then set the // service to auto start. Otherwise, set to manual start. // When setting to auto start, also set failure mode to restart DWORD dwStatus = ERROR_SUCCESS; BOOL bStatus = 0; SC_HANDLE hSC = NULL; SC_HANDLE hService = NULL; BOOL bAutoStart = FALSE; DWORD pqsConfigBuff[128]; QUERY_SERVICE_CONFIG* pqsConfig; SC_ACTION* parrSingleFailAction = NULL; SERVICE_FAILURE_ACTIONS structFailActions; DWORD dwMoreBytes = 0; BOOL bUpdate = FALSE; bAutoStart = ( m_CounterLogService.IsAutoStart() || m_TraceLogService.IsAutoStart() || m_AlertService.IsAutoStart() ); // open SC database hSC = OpenSCManager ( GetMachineName(), NULL, GENERIC_READ ); if (hSC != NULL) { // open service hService = OpenService ( hSC, L"SysmonLog", SERVICE_CHANGE_CONFIG | SERVICE_QUERY_CONFIG | SERVICE_START ); if (hService != NULL) { // get current config memset (pqsConfigBuff, 0, sizeof(pqsConfigBuff)); pqsConfig = (QUERY_SERVICE_CONFIG*)pqsConfigBuff; if ( QueryServiceConfig ( hService, pqsConfig, sizeof(pqsConfigBuff), &dwMoreBytes)) { // See if the current status is different // from the selection. If it is, then change // the current mode. if ( bAutoStart ) { if ( SERVICE_DEMAND_START == pqsConfig->dwStartType ) { bUpdate = TRUE; } } else { // Manual start selected if ( SERVICE_AUTO_START == pqsConfig->dwStartType ) { bUpdate = TRUE; } } } else { // else unable to read the current status so update anyway bUpdate = TRUE; } if ( bUpdate ) { MFC_TRY parrSingleFailAction = new SC_ACTION[3]; MFC_CATCH_DWSTATUS; if ( NULL != parrSingleFailAction ) { parrSingleFailAction[0].Delay = eRestartDelayMilliseconds; parrSingleFailAction[1].Delay = eRestartDelayMilliseconds; parrSingleFailAction[2].Delay = eRestartDelayMilliseconds; if ( bAutoStart ) { parrSingleFailAction[0].Type = SC_ACTION_RESTART; parrSingleFailAction[1].Type = SC_ACTION_RESTART; parrSingleFailAction[2].Type = SC_ACTION_RESTART; } else { parrSingleFailAction[0].Type = SC_ACTION_NONE; parrSingleFailAction[1].Type = SC_ACTION_NONE; parrSingleFailAction[2].Type = SC_ACTION_NONE; } structFailActions.dwResetPeriod = eResetDelaySeconds; structFailActions.lpRebootMsg = NULL; structFailActions.lpCommand = NULL; structFailActions.cActions = 3; structFailActions.lpsaActions = parrSingleFailAction; bStatus = ChangeServiceConfig ( hService, SERVICE_NO_CHANGE, (bAutoStart ? SERVICE_AUTO_START : SERVICE_DEMAND_START), SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); if ( 0 == bStatus ) { dwStatus = GetLastError(); } else { bStatus = ChangeServiceConfig2 ( hService, SERVICE_CONFIG_FAILURE_ACTIONS, &structFailActions ); if ( 0 == bStatus ) { dwStatus = GetLastError(); } } delete [] parrSingleFailAction; } else { dwStatus = ERROR_OUTOFMEMORY; } } CloseServiceHandle (hService); } else { dwStatus = GetLastError(); ASSERT (dwStatus != 0); } CloseServiceHandle (hSC); } else { dwStatus = GetLastError(); } // OpenSCManager return dwStatus; }