windows-nt/Source/XPSP1/NT/net/snmp/subagent/snmpevnt/evntwin/trapreg.h
2020-09-26 16:20:57 +08:00

406 lines
11 KiB
C++

#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