📄 trapreg.cpp
字号:
else {
return E_FAIL;
}
}
//****************************************************************
// CTrapParams::Serialize
//
// Write SNMP_EVENTS\EventLog\Parameters information to the
// registry.
//
// Parameters:
// None.
//
// Returns:
// S_OK if everything went OK.
// E_REGKEY_NOT_FOUND if an expected registry key was missing.
//*****************************************************************
SCODE CTrapParams::Serialize()
{
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
// Open the Parameters key.
// Create simply opens the key if already present.
CRegistryKey regkey;
if (!g_reg.m_regkeySnmp.CreateSubKey(SZ_REGKEY_PARAMETERS, regkey)) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
else {
return E_REGKEY_NOT_FOUND;
}
}
CRegistryValue regval;
// Save the Message Length and the TrimMessage.
DWORD dwTrim;
if (m_trapsize.m_bTrimFlag)
dwTrim = 1;
else
dwTrim = 0;
regval.Set(SZ_REGKEY_PARAMS_TRIMFLAG, REG_DWORD, sizeof(DWORD), (LPBYTE)&dwTrim);
regkey.SetValue(regval);
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
if (m_trapsize.m_bTrimFlag)
{
// Save the maximum trap size
regval.Set(SZ_REGKEY_PARAMS_MAXTRAP_SIZE, REG_DWORD, sizeof(DWORD), (LPBYTE)&m_trapsize.m_dwMaxTrapSize);
regkey.SetValue(regval);
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
// Save the trim message length
DWORD dwTrimMessages = m_trapsize.m_bTrimMessages;
regval.Set(SZ_REGKEY_PARAMS_TRIM_MESSAGE, REG_DWORD, sizeof(DWORD), (LPBYTE)&dwTrimMessages);
regkey.SetValue(regval);
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
}
// Threshold enabled flag
DWORD dwValue = (m_throttle.m_bIsEnabled ? THROTTLE_ENABLED : THROTTLE_DISABLED);
regval.Set(SZ_REGKEY_PARAMS_THRESHOLDENABLED, REG_DWORD, sizeof(DWORD), (LPBYTE)&dwValue);
regkey.SetValue(regval);
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
// If throttle is not enabled, do not write the ThresholdCount and ThresholdTime parameters
if (m_throttle.m_bIsEnabled)
{
// Threshold trap count.
regval.Set(SZ_REGKEY_PARAMS_THRESHOLDCOUNT, REG_DWORD, sizeof(DWORD), (LPBYTE)&m_throttle.m_nTraps);
regkey.SetValue(regval);
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
// Threshold time in seconds
regval.Set(SZ_REGKEY_PARAMS_THRESHOLDTIME, REG_DWORD, sizeof(DWORD), (LPBYTE)&m_throttle.m_nSeconds);
regkey.SetValue(regval);
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
}
regkey.Close();
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
return S_OK;
}
//*******************************************************************
// CTrapParams::ResetExtensionAgent
//
// Reset the extension agent. This is done by setting the "Threshold"
// parameter to zero in the registry. The extension agent monitors this
// value and will reset itself when a zero is written there.
//
// The user may want to reset the extension agent if its throttle limit
// has been tripped.
//
// Parameters:
// None.
//
// Returns:
// SCODE
// S_OK if successful. E_FAIL if the extension agent could not
// be reset. If a failure occurs, the appropriate message box
// is displayed.
//
//*********************************************************************
SCODE CTrapParams::ResetExtensionAgent()
{
CRegistryKey regkey;
if (!g_reg.m_regkeySnmp.GetSubKey(SZ_REGKEY_PARAMETERS, regkey)) {
return E_REGKEY_NOT_FOUND;
}
CRegistryValue regval;
// Set the "Threshold" value under the Parameters key to zero to reset
// the extension agent.
DWORD dwValue = THROTTLE_RESET;
SCODE sc = S_OK;
regval.Set(SZ_REGKEY_PARAMS_THRESHOLD, REG_DWORD, sizeof(DWORD), (LPBYTE)&dwValue);
if (!regkey.SetValue(regval)) {
AfxMessageBox(IDS_WARNING_CANT_WRITE_CONFIG);
sc = E_FAIL;
}
regkey.Close();
return sc;
}
//***********************************************************************
// CTrapParams::ThrottleIsTripped
//
// Check the registry to determine whether or not the extension agent
// throttle was tripped.
//
// Parameters:
// None.
//
// Returns:
// TRUE if the extension agent's throttle was tripped, FALSE otherwise.
//
//************************************************************************
BOOL CTrapParams::ThrottleIsTripped()
{
CRegistryKey regkey;
if (!g_reg.m_regkeySnmp.GetSubKey(SZ_REGKEY_PARAMETERS, regkey)) {
return FALSE;
}
CRegistryValue regval;
// SNMP_EVENTS\Parameters\Threshold value
BOOL bThrottleIsTripped = FALSE;
if (regkey.GetValue(SZ_REGKEY_PARAMS_THRESHOLD, regval)) {
if (*(DWORD*)regval.m_pData == THROTTLE_TRIPPED) {
bThrottleIsTripped = TRUE;
}
}
regkey.Close();
return bThrottleIsTripped;
}
///////////////////////////////////////////////////////////////////
// Class: CXEventLogArray
//
// This class implements an array of CXEventLog objects.
//
//////////////////////////////////////////////////////////////////
//****************************************************************
// CXEventLogArray::Deserialize
//
// Examine the registry find all the event logs and load all the
// relevent information for all the event logs into this array.
//
// Parameters:
// None.
//
// Returns:
// S_OK if successful.
// E_FAIL if a failure was detected.
//
//****************************************************************
SCODE CXEventLogArray::Deserialize()
{
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
CStringArray* pasEventLogs = g_reg.m_regkeySource.EnumSubKeys();
SCODE sc = S_OK;
// Iterate through all the event log names and create each log.
LONG nEventLogs = (LONG)pasEventLogs->GetSize();
if (nEventLogs > 0) {
g_reg.m_nLoadStepsPerLog = LOAD_LOG_ARRAY_STEP_COUNT / nEventLogs;
}
LONG nUnusedSteps = LOAD_LOG_ARRAY_STEP_COUNT - (nEventLogs * g_reg.m_nLoadStepsPerLog);
for (LONG iEventLog=0; iEventLog < nEventLogs; ++iEventLog)
{
CString sEventLog = pasEventLogs->GetAt(iEventLog);
CXEventLog* pEventLog = new CXEventLog(sEventLog);
sc = pEventLog->Deserialize();
if ((sc==S_LOAD_CANCELED) || FAILED(sc)) {
delete pEventLog;
break;
}
else if (sc == S_NO_SOURCES) {
delete pEventLog;
sc = S_OK;
}
else {
Add(pEventLog);
}
}
delete pasEventLogs;
if (g_reg.m_pdlgLoadProgress->StepProgress(nUnusedSteps)) {
sc = S_LOAD_CANCELED;
}
return sc;
}
//****************************************************************
// CXEventLogArray::Serialize
//
// Write the current configuration of all the EventLogs out to the
// registry. Only those logs and sources that actually have events
// are written.
//
// Parameters:
// None.
//
// Returns:
// S_OK if successful.
// E_FAIL if a failure was detected.
//
//****************************************************************
SCODE CXEventLogArray::Serialize()
{
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
// This is where the eventlog stuff should be cleaned up.
CRegistryKey regkey;
if (!g_reg.m_regkeySnmp.CreateSubKey(SZ_REGKEY_EVENTLOG, regkey)) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
else {
return E_REGKEY_NOT_FOUND;
}
}
regkey.Close();
if (!g_reg.m_regkeySnmp.CreateSubKey(SZ_REGKEY_SOURCES, regkey)) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
else {
return E_REGKEY_NOT_FOUND;
}
}
// Delete the keys for the sources and events for which we no longer
// trap. I'm going to be lazy and just delete them all.
// !!!CR: It could potentially save a lot of time if this was made smarter
// !!!CR: so that it only replaced items that had been deleted.
LONG nEventSources, iEventSource;
CStringArray* pasEventSources = regkey.EnumSubKeys();
nEventSources = (LONG)pasEventSources->GetSize();
for (iEventSource=0; iEventSource<nEventSources; iEventSource++)
{
CString sSource;
sSource = pasEventSources->GetAt(iEventSource);
regkey.DeleteSubKey(sSource);
}
delete pasEventSources;
SCODE sc = S_OK;
LONG nEventLogs = GetSize();
for (LONG iEventLog = 0; iEventLog < nEventLogs; ++iEventLog) {
sc = GetAt(iEventLog)->Serialize(regkey);
if (sc == S_SAVE_CANCELED) {
break;
}
else if (g_bLostConnection) {
sc = E_REGKEY_LOST_CONNECTION;
break;
}
}
regkey.Close();
return sc;
}
//****************************************************************
// CXEventLogArray::FindEventSource
//
// Given the name of an event log and the name of the event source
// within the event log, return a pointer to the requested CXEventSource.
//
// Parameters:
// CString& sLog
// The name of the event log.
//
// CString& sEventSource
// The name of the event source.
//
// Returns:
// CXEventSource*
// A pointer to the requested event source if it was found. NULL
// if no such event source exists.
//
//****************************************************************
CXEventSource* CXEventLogArray::FindEventSource(CString& sLog, CString& sEventSource)
{
LONG nLogs = GetSize();
for (LONG iLog = 0; iLog < nLogs; ++iLog) {
CXEventLog* pEventLog = GetAt(iLog);
if (pEventLog->m_sName.CompareNoCase(sLog) == 0) {
return pEventLog->FindEventSource(sEventSource);
}
}
return NULL;
}
///////////////////////////////////////////////////////////////////
// Class: CXEventLog
//
// This class contains all the information for a particular event log.
//
//////////////////////////////////////////////////////////////////
//************************************************************************
// CXEventLog::Deserialize
//
// Load the contents of this EventLog object from the registry.
//
// Parameters:
// g_reg is a global parameter.
//
// Returns:
// SCODE
// S_OK or S_NO_SOURCES if successful. E_FAIL if there was
// a failure of any kind.
//
//************************************************************************
SCODE CXEventLog::Deserialize()
{
return m_aEventSources.Deserialize(this);
}
//************************************************************************
// CXEventLog::Serialize
//
// Write the current configuration for this log to the registry.
//
// Parameters:
// CRegistryKey& regkey
// This registry key points to SOFTWARE\Microsoft\SNMP_EVENTS\EventLog
//
// Returns:
// SCODE
// S_OK or S_SAVE_CANCELED if successful. E_FAIL for an error condition.
// a failure of any kind.
//
//************************************************************************
SCODE CXEventLog::Serialize(CRegistryKey& regkey)
{
return m_aEventSources.Serialize(regkey);
}
///////////////////////////////////////////////////////////////////
// Class: CXEventSourceArray
//
// This class implements an array of CXEventSource pointers and
// related methods.
//
//////////////////////////////////////////////////////////////////
//*************************************************************************
// CXEventSourceArray::Deserialize
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -