#ifndef _trapreg_h #define _trapreg_h #include "regkey.h" #include "utils.h" #define MAX_TRAP_SIZE 4096 #define THRESHOLD_COUNT 500 #define THRESHOLD_TIME 300 // Values for the SNMP_EVENTS\Parameters\Threshold flag #define THROTTLE_RESET 0 #define THROTTLE_TRIPPED 1 // Values for the SNMP_EVENTS\Parameters\ThresholdEnabled flag #define THROTTLE_DISABLED 0 #define THROTTLE_ENABLED 1 //*************************************************************************** // REGISTRY KEYS // // The following strings are registry keys. They should not be internationalized, // so they are not in the string table. // //**************************************************************************** #define SZ_REGKEY_MICROSOFT _T("SOFTWARE\\Microsoft") #define SZ_REGKEY_SOURCE_EVENTLOG _T("SYSTEM\\CurrentControlSet\\Services\\EventLog") #define SZ_REGKEY_SNMP_EVENTS _T("SOFTWARE\\Microsoft\\SNMP_EVENTS") // These are subkeys under \SOFTWARE\Microsoft\SNMP_EVENTS #define SZ_REGKEY_EVENTLOG _T("EventLog") #define SZ_REGKEY_SOURCES _T("EventLog\\Sources") #define SZ_REGKEY_CURRENTLY_OPEN _T("CurrentlyOpen") #define SZ_REGKEY_SOURCE_ENTERPRISE_OID _T("EnterpriseOID") #define SZ_REGKEY_SOURCE_APPEND _T("Append") #define SZ_REGKEY_PARAMETERS _T("EventLog\\Parameters") #define SZ_REGKEY_PARAMS _T("Parameters") #define SZ_REGKEY_PARAMS_BASE_ENTERPRISE_OID _T("BaseEnterpriseOID") #define SZ_REGKEY_PARAMS_TRIMFLAG _T("TrimFlag") #define SZ_REGKEY_PARAMS_MAXTRAP_SIZE _T("MaxTrapSize") #define SZ_REGKEY_PARAMS_TRIM_MESSAGE _T("TrimMessage") #define SZ_REGKEY_PARAMS_THRESHOLD _T("Threshold") #define SZ_REGKEY_PARAMS_THRESHOLDENABLED _T("ThresholdEnabled") #define SZ_REGKEY_PARAMS_THRESHOLDCOUNT _T("ThresholdCount") #define SZ_REGKEY_PARAMS_THRESHOLDTIME _T("ThresholdTime") #define SZ_REGKEY_EVENT_COUNT _T("Count") #define SZ_REGKEY_EVENT_TIME _T("Time") #define SZ_REGKEY_EVENT_FULLID _T("FullID") #define SZ_REGKEY_SOURCE_EVENT_MESSAGE_FILE _T("EventMessageFile") #define SZ_NAME_REGVAL_TRANSLATOR_ENABLED _T("TranslatorEnabled") #define SZ_NAME_REGVAL_REVISIONCOUNT _T("RevisionCount") #define SZ_NAME_REGVAL_CONFIGTYPE _T("ConfigurationType") #define SZ_REGVAL_YES "YES" #define SZ_REGVAL_NO "NO" //********************************************************************** // The number of load steps that are performed in CTrapDlg::OnInitDialog // This is the number of steps that will be reserved in the progress // indicator for OnInitDialog //********************************************************************* #define LOAD_STEPS_IN_TRAPDLG 5 // 11 setup steps plus 10 steps for the four known event logs #define LOAD_SETUP_STEP_COUNT 11 #define LOAD_LOG_ARRAY_STEP_COUNT 40 #define LOAD_STEP_COUNT (LOAD_SETUP_STEP_COUNT + LOAD_LOG_ARRAY_STEP_COUNT + LOAD_STEPS_IN_TRAPDLG) class CDlgSaveProgress; class CRegistryKey; class CXEventSource; class CBaseArray : public CObArray { public: CBaseArray() {} ~CBaseArray() {} void DeleteAll(); }; class CXEventSource; class CXEventLog; //The registry is made up of logs, that contain sources, that contain events class CXMessage : public CObject { public: CXMessage(CXEventSource* pEventSource); CXEventSource* m_pEventSource; DWORD m_dwId; CString m_sText; CXMessage& operator=(CXMessage& message); DWORD GetShortId() {return LOWORD(m_dwId); } void GetShortId(CString& sText); void GetSeverity(CString& sSeverity); void IsTrapping(CString& sIsTrapping); void SetAndCleanText(PMESSAGE_RESOURCE_ENTRY pEntry); }; class CXMessageArray : private CBaseArray { public: CXMessageArray(); ~CXMessageArray() {} void Initialize(CXEventSource* pEventSource) {m_pEventSource = pEventSource; } CXMessage* GetAt(int nIndex) {return (CXMessage*) CBaseArray::GetAt(nIndex); } CXMessage* operator[](int nIndex) {return (CXMessage*) CBaseArray::GetAt(nIndex); } void Add(CXMessage* pMessage) { CBaseArray::Add(pMessage); } void RemoveAll() {CBaseArray::RemoveAll(); } void DeleteAll() {CBaseArray::DeleteAll(); } LONG GetSize() {return (LONG)CBaseArray::GetSize(); } SCODE LoadMessages(); CXMessage* FindMessage(DWORD dwId); CXEventSource* m_pEventSource; private: BOOL m_bDidLoadMessages; SCODE GetNextPath(CString& sPathlist, CString& sPath); }; class CXEvent : public CObject { public: CXEvent(CXEventSource* pEventSource); CXEvent(CXMessage* pMessage); ~CXEvent(); CXEventSource* m_pEventSource; DWORD m_dwCount; DWORD m_dwTimeInterval; CXMessage m_message; SCODE Deserialize(CRegistryKey& regkeyParent, CString& sName); SCODE Serialize(CRegistryKey& regkeyParent); void GetName(CString& sText) {DecString(sText, m_message.m_dwId); } void GetCount(CString& sText); void GetTimeInterval(CString& sText); }; class CXEventArray : public CBaseArray { public: ~CXEventArray() {} CXEvent* GetAt(int nIndex) {return (CXEvent*) CBaseArray::GetAt(nIndex); } CXEvent* operator[](int nIndex) {return (CXEvent*) CBaseArray::GetAt(nIndex); } // void Add(CXEvent* pEvent) { CBaseArray::Add(pEvent); } void Add(CXEvent* pEvent); void RemoveAll() {CBaseArray::RemoveAll(); } void DeleteAll() {CBaseArray::DeleteAll(); } LONG GetSize() {return (LONG)CBaseArray::GetSize(); } SCODE Deserialize(CXEventSource* pEventSource); SCODE Serialize(CRegistryKey& regkeyParent); CXEvent* FindEvent(DWORD dwId); SCODE RemoveEvent(CXEvent* pEvent); }; class CXEventSource : public CObject { public: CXEventSource(CXEventLog* pEventLog, CString& sName); ~CXEventSource(); // Public data members CXEventLog* m_pEventLog; CString m_sName; CXEventArray m_aEvents; CXMessageArray m_aMessages; CString m_sLibPath; CXMessage* FindMessage(DWORD dwId) {return m_aMessages.FindMessage(dwId); } CXEvent* FindEvent(DWORD dwId) {return m_aEvents.FindEvent(dwId); } CXEventSource* FindEventSource(CString& sEventSource); SCODE Deserialize(CRegistryKey& regkeyParent); SCODE Serialize(CRegistryKey& regkeyParent); void GetEnterpriseOID(CString& sEnterpriseOID, BOOL bGetFullID=FALSE); SCODE LoadMessages() {return m_aMessages.LoadMessages(); } private: SCODE GetLibPath(CRegistryKey& regkey); }; // CObArray is declared a private base type to ensure strong typing. class CXEventSourceArray : private CBaseArray { public: // Base array functionality public member functions. ~CXEventSourceArray() {DeleteAll(); } CXEventSource* GetAt(int nIndex) {return (CXEventSource*) CBaseArray::GetAt(nIndex); } CXEventSource* operator[](int nIndex) {return (CXEventSource*) CBaseArray::GetAt(nIndex); } void Add(CXEventSource* pEventSource) { CBaseArray::Add(pEventSource); } void RemoveAll() {CBaseArray::RemoveAll(); } void DeleteAll() {CBaseArray::DeleteAll(); } LONG GetSize() {return (LONG)CBaseArray::GetSize(); } // Public members specific to CXEventSourceArray CXEventSource* FindEventSource(CString& sSource); LONG FindEvent(CString& sLog, CString& sSource, DWORD dwEventId); SCODE Deserialize(CXEventLog* pEventLog); SCODE Serialize(CRegistryKey& regkey); }; class CXEventLog : public CObject { public: CXEventLog(CString& sName) {m_sName = sName;} CXEventSourceArray m_aEventSources; CString m_sName; SCODE Deserialize(); SCODE Serialize(CRegistryKey& regkey); CXEventSource* FindEventSource(CString& sEventSource); }; inline CXEventSource* CXEventLog::FindEventSource(CString& sEventSource) { return m_aEventSources.FindEventSource(sEventSource); } class CXEventLogArray : private CBaseArray { public: // Base array functionality public member functions. CXEventLogArray() {} ~CXEventLogArray() {DeleteAll(); } CXEventLog* GetAt(int nIndex) {return (CXEventLog*) CBaseArray::GetAt(nIndex); } CXEventLog* operator[](int nIndex) {return (CXEventLog*) CBaseArray::GetAt(nIndex); } void Add(CXEventLog* pEventLog) { CBaseArray::Add(pEventLog); } void RemoveAll() {CBaseArray::RemoveAll(); } void DeleteAll() {CBaseArray::DeleteAll(); } LONG GetSize() {return (LONG)CBaseArray::GetSize(); } SCODE Deserialize(); SCODE Serialize(); CXEventSource* FindEventSource(CString& sLog, CString& sEventSource); }; class CTraps { public: CXEventLogArray m_aEventLogs; SCODE Serialize(); SCODE Deserialize(); }; class CTrapParams { public: CTrapParams(); SCODE Serialize(); SCODE Deserialize(); SCODE ResetExtensionAgent(); BOOL ThrottleIsTripped(); CString m_sBaseEnterpriseOID; CString m_sSupportedView; CString m_sTracefileName; DWORD m_dwTraceLevel; // Data members for the "limit" section of the settings dialog struct { BOOL m_bTrimFlag; // Limit trap length BOOL m_bTrimMessages; // Trim messages first DWORD m_dwMaxTrapSize; // Trap length (bytes) }m_trapsize; // Data members for the "throttle" section of the settings dialog struct { long m_nTraps; long m_nSeconds; BOOL m_bIsEnabled; }m_throttle; }; class CTrapReg { public: CTrapReg(); ~CTrapReg(); SCODE Connect(LPCTSTR pszComputerName, BOOL bIsReconnecting = FALSE); SCODE Serialize(); SCODE Deserialize(); SCODE LockRegistry(); void UnlockRegistry(); SCODE SetConfigType(DWORD dwConfigType); DWORD GetConfigType() {return m_dwConfigType; } void SetApplyButton(CButton *pbtnApply) { m_pbtnApply = pbtnApply; } void SetDirty(BOOL bDirty); inline BOOL SourceHasTraps(CString& sSource); // Public data members. CRegistryKey m_regkeySource; // SYSTEM\CurrentControlSet\Services\EventLogs CRegistryKey m_regkeySnmp; // SOFTWARE\Microsoft\SNMP_EVENTS CRegistryKey m_regkeyEventLog; CXEventLogArray m_aEventLogs; CTrapParams m_params; CDlgSaveProgress* m_pdlgSaveProgress; CDlgSaveProgress* m_pdlgLoadProgress; LONG m_nLoadStepsPerSource; LONG m_nLoadStepsPerLog; LONG m_nLoadSteps; BOOL m_bShowConfigTypeBox; BOOL m_bRegIsReadOnly; BOOL m_bIsDirty; BOOL m_bSomeMessageWasNotFound; CString m_sComputerName; CButton *m_pbtnApply; private: LONG GetSaveProgressStepCount(); SCODE BuildSourceHasTrapsMap(); BOOL m_bNeedToCloseKeys; CMapStringToPtr m_mapSourceHasTraps; BOOL m_bDidLockRegistry; DWORD m_dwConfigType; }; extern CTrapReg g_trapreg; enum { CONFIG_TYPE_DEFAULT = 0, CONFIG_TYPE_CUSTOM, CONFIG_TYPE_DEFAULT_PENDING }; // Error failure values. enum { E_REGKEY_NOT_FOUND = -1000, E_REG_CANT_CONNECT, E_REGKEY_NOT_INSTALLED, E_REGKEY_CANT_OPEN, E_REGKEY_NO_CREATE, E_REG_NOT_INSTALLED, E_REGKEY_LOST_CONNECTION, E_ACCESS_DENIED, E_MESSAGE_NOT_FOUND }; // Success status codes enum { S_NO_EVENTS = 1000, S_NO_SOURCES, S_SAVE_CANCELED, S_LOAD_CANCELED }; //******************************************************************* // CTrapReg::SourceHasTraps // // Check to see if traps have been configured for the specified event // source. // // Parameters: // CString& sEventSource // The name of the event source. // // Returns: // TRUE if the event source has traps, FALSE otherwise. // //******************************************************************** inline BOOL CTrapReg::SourceHasTraps(CString& sEventSource) { LPVOID pVoid; CString tmp(sEventSource); tmp.MakeUpper(); return m_mapSourceHasTraps.Lookup(tmp, pVoid); } #endif //_trapreg_h