📄 trapreg.cpp
字号:
//
// Load all the information pertaining to the event sources associated with
// the given event log. This information is loaded from the registry.
//
// Parameters:
// CXEventLog* pEventLog
// Pointer to the event log. The sources associated with this
// event log are loaded into this object.
//
// Returns:
// SCODE
// S_OK or S_NO_SOURCES if successful. E_FAIL if there was
// a failure of any kind.
//*************************************************************************
SCODE CXEventSourceArray::Deserialize(CXEventLog* pEventLog)
{
// Get the registry entry for this log. This registry key will be
// used to enumerate the event sources for this log.
CRegistryKey regkey;
if (!g_reg.m_regkeySource.GetSubKey(pEventLog->m_sName, regkey)) {
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerLog)) {
return S_LOAD_CANCELED;
}
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
else {
return E_FAIL;
}
}
SCODE sc = S_OK;
// Enumerate the event sources for this log.
CStringArray* pasSources = regkey.EnumSubKeys();
if (pasSources == NULL) {
regkey.Close();
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerLog)) {
return S_LOAD_CANCELED;
}
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
else {
return E_FAIL;
}
}
// Iterate though all the event sources and add them as a sub-item
// under the log.
LONG nEventSources = (LONG)pasSources->GetSize();
LONG nScaledStepSize = 0;
g_reg.m_nLoadStepsPerSource = 0;
if (nEventSources > 0) {
nScaledStepSize = (g_reg.m_nLoadStepsPerLog * 1000) / nEventSources;
g_reg.m_nLoadStepsPerSource = g_reg.m_nLoadStepsPerLog / nEventSources;
}
LONG nLoadSteps = 0;
LONG nProgress = 0;
// Set the load progress step count. Since we don't know how many events are saved
// for each event source, we will assume some small number for LOAD_STEPS_FOR_SOURCE
// and divide the actual number of steps up as evenly as possible once we know the actual
// event count.
for (LONG iEventSource=0; iEventSource< nEventSources; ++iEventSource)
{
nProgress += nScaledStepSize;
g_reg.m_nLoadStepsPerSource = nProgress / 1000;
if (g_reg.m_nLoadStepsPerSource > 0) {
nProgress -= g_reg.m_nLoadStepsPerSource * 1000;
nLoadSteps += g_reg.m_nLoadStepsPerSource;
}
CString sEventSource = pasSources->GetAt(iEventSource);
CXEventSource* pEventSource = new CXEventSource(pEventLog, sEventSource);
sc = pEventSource->Deserialize(regkey);
if ((sc==S_LOAD_CANCELED) || FAILED(sc)) {
delete pEventSource;
break;
}
else if (sc == S_NO_EVENTS) {
// If there are no events, then this is not a valid event source.
delete pEventSource;
sc = S_OK;
}
else {
Add(pEventSource);
}
}
delete pasSources;
if (SUCCEEDED(sc)) {
// We only close the registry key if we succeeded to avoid hanging if we loose
// a remote connection.
regkey.Close();
if (GetSize() == 0) {
sc = S_NO_SOURCES;
}
}
if (nLoadSteps < g_reg.m_nLoadStepsPerLog) {
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerLog - nLoadSteps)) {
return S_LOAD_CANCELED;
}
g_reg.m_nLoadSteps += g_reg.m_nLoadStepsPerLog - nLoadSteps;
}
return sc;
}
//************************************************************************
// CXEventSourceArray::Serialize
//
// Write the current configuration for this event source array to the registry.
//
// Parameters:
// CRegistryKey& regkey
// This registry key points to SOFTWARE\Microsoft\SNMP_EVENTS\EventLog\Sources
//
// Returns:
// SCODE
// S_OK or S_SAVE_CANCELED if successful. E_FAIL for an error condition.
// a failure of any kind.
//
//************************************************************************
SCODE CXEventSourceArray::Serialize(CRegistryKey& regkey)
{
// Write the subkeys under SNMP_EVENTS\EventLog
SCODE sc = S_OK;
LONG nEventSources = GetSize();
for (LONG iEventSource = 0; iEventSource < nEventSources; ++iEventSource) {
SCODE scTemp = GetAt(iEventSource)->Serialize(regkey);
if (g_bLostConnection) {
sc = E_REGKEY_LOST_CONNECTION;
break;
}
if (FAILED(scTemp)) {
sc = E_FAIL;
break;
}
if (scTemp == S_SAVE_CANCELED) {
sc = S_SAVE_CANCELED;
break;
}
}
return sc;
}
//************************************************************************
// CXEventSourceArray::FindEventSource
//
// Given an event source name, find the specified event source in this
// event source array.
//
// Parameters:
// CString& sEventSource
// The name of the event source to search for.
//
// Returns:
// CXEventSource*
// Pointer to the event source if it is found, otherwise NULL.
//
//***********************************************************************
CXEventSource* CXEventSourceArray::FindEventSource(CString& sEventSource)
{
LONG nSources = GetSize();
for (LONG iSource = 0; iSource < nSources; ++iSource) {
CXEventSource* pEventSource = GetAt(iSource);
if (pEventSource->m_sName.CompareNoCase(sEventSource)==0) {
return pEventSource;
}
}
return NULL;
}
///////////////////////////////////////////////////////////////////
// Class: CXEventSource
//
// This class implements an an event source object. An event source
// corresponds to an application that can generate events. The
// event sources are enumerated from the registry in
// "SYSTEM\CurrentControlSet\Services\EventLogs" under each particular
// eventlog found there.
//
// An event source has an array of messages and an array of events
// associated with it.
//
// The message array comes from the message .DLL file(s) pointed to by
// the "EventMessageFile" value attached to the source's key in the registry.
// The message array is read-only in the sense that it is loaded from the
// registry and never written back to it.
//
// The event array comes from SNMP_EVENTS\EventLog\<source-subkey>. These
// events are loaded when the configuration program starts up and written
// back out when the user clicks "OK". Note that the events stored in the
// registry contain the event ID, but not the message text. The message text
// for an event is found by searching the message array in the CXEventSource
// object for the event's ID.
//
//////////////////////////////////////////////////////////////////
//*************************************************************************
// CXEventSource::CXEventSource
//
// Construct the CXEventSource object.
//
// Parameters:
// CXEventLog* pEventLog
// Pointer to the event log that contains this event source.
//
// CString& sName
// The name of this event source.
//
// Returns:
// Nothing.
//
//*************************************************************************
CXEventSource::CXEventSource(CXEventLog* pEventLog, CString& sName)
{
m_pEventLog = pEventLog;
m_sName = sName;
m_aMessages.Initialize(this);
}
//************************************************************************
// CXEventSource::~CXEventSource
//
// Destroy thus event source object.
//
// Parameters:
// None.
//
// Returns:
// Nothing.
//
//************************************************************************
CXEventSource::~CXEventSource()
{
// We must explicitly delete the contents of the event array and message
// array. Note that this is different behavior from the CXEventLogArray
// and CXEventSourceArray. This is because it was useful to create
// message and event arrays as temporary containers for a set of pointers.
// Thus, there were situations where you did not want to delete the
// objects contained in these arrays when the arrays were destroyed.
m_aEvents.DeleteAll();
m_aMessages.DeleteAll();
}
//**********************************************************************
// CXEventSource::Deserialize
//
// Load this event source from the registry given the registry key
// for the event log that contains this source.
//
// Parameters:
// CRegistryKey& regkeyLog
// An open registry key for the event log containing this
// event source. This key points to somewhere in
// SYSTEM\CurrentControlSet\Services\EventLog
//
// Returns:
// SCODE
// S_OK = the source has events and no errors were encountered.
// S_NO_EVENTS = the source has no events and no errors were encountered.
// E_FAIL = an condition was encountered.
//
//***********************************************************************
SCODE CXEventSource::Deserialize(CRegistryKey& regkeyLog)
{
CRegistryKey regkeySource;
if (!regkeyLog.GetSubKey(m_sName, regkeySource)) {
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerSource)) {
return S_LOAD_CANCELED;
}
g_reg.m_nLoadSteps += g_reg.m_nLoadStepsPerSource;
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
else {
return E_FAIL;
}
}
SCODE sc = E_FAIL;
if (SUCCEEDED(GetLibPath(regkeySource))) {
sc = m_aEvents.Deserialize(this);
}
else {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
if (g_reg.m_pdlgLoadProgress->StepProgress(g_reg.m_nLoadStepsPerSource)) {
return S_LOAD_CANCELED;
}
g_reg.m_nLoadSteps += g_reg.m_nLoadStepsPerSource;
sc = S_NO_EVENTS;
}
regkeySource.Close();
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
// Delay deserializing the messages for this source until they are
// needed.
return sc;
}
#if 0
//*************************************************************************
// CXEventSource::GetLibPath
//
// Get the path the the EventMessageFile for this event source.
//
// Parameters:
// CRegistryKey& regkeySource
// An open registry key corresponding to this source in
// SYSTEM\CurrentControlSet\Services\EventLog\<event log>
//
// Returns:
// SCODE
// S_OK if successful, otherwise E_FAIL.
//
//*************************************************************************
SCODE CXEventSource::GetLibPath(CRegistryKey& regkeySource)
{
CRegistryValue regval;
if (!regkeySource.GetValue(SZ_REGKEY_SOURCE_EVENT_MESSAGE_FILE, regval))
return E_FAIL;
TCHAR szLibPath[MAX_STRING];
if (ExpandEnvironmentStrings((LPCTSTR)regval.m_pData, szLibPath, sizeof(szLibPath)) == 0)
return E_FAIL;
m_sLibPath = szLibPath;
return S_OK;
}
#else
//*************************************************************************
// CXEventSource::GetLibPath
//
// Get the path the the EventMessageFile for this event source.
//
// Parameters:
// CRegistryKey& regkeySource
// An open registry key corresponding to this source in
// SYSTEM\CurrentControlSet\Services\EventLog\<event log>
//
// Returns:
// SCODE
// S_OK if successful, otherwise E_FAIL.
//
//*************************************************************************
SCODE CXEventSource::GetLibPath(CRegistryKey& regkeySource)
{
static CEnvCache cache;
CRegistryValue regval;
if (!regkeySource.GetValue(SZ_REGKEY_SOURCE_EVENT_MESSAGE_FILE, regval))
return E_FAIL;
SCODE sc = S_OK;
if (g_reg.m_sComputerName.IsEmpty()) {
// Editing the local computer computer's registry, so the local environment
// variables are in effect.
TCHAR szLibPath[MAX_STRING];
if (ExpandEnvironmentStrings((LPCTSTR)regval.m_pData, szLibPath, sizeof(szLibPath))) {
m_sLibPath = szLibPath;
}
else {
sc = E_FAIL;
}
}
else {
// Editing a remote computer's registry, so the remote environment strings are in
// effect. Also, file paths must be mapped to the UNC path for the machine. For
// example, C:Foo will be mapped to \\Machine\C$\Foo
m_sLibPath = regval.m_pData;
sc = RemoteExpandEnvStrings(g_reg.m_sComputerName, cache, m_sLibPath);
if (SUCCEEDED(sc)) {
sc = MapPathToUNC(g_reg.m_sComputerName, m_sLibPath);
}
}
return S_OK;
}
#endif
//************************************************************************
// CXEventSource::Serialize
//
// Write the configuration information for this event source to the registry.
//
// Parameters:
// CRegistryKey& regkeyParent
// An open registry key pointing to SNMP_EVENTS\EventLog\Sources
//
// Returns:
// SCODE
// S_OK if successful.
// S_SAVE_CANCELED if no errors, but the user canceled the save.
//
//************************************************************************
SCODE CXEventSource::Serialize(CRegistryKey& regkeyParent)
{
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -