📄 trapreg.cpp
字号:
//***********************************************************************
// trapreg.cpp
//
// This file contains the implementation of the classes for the objects
// that are read from the registry, manipulated and written back to the
// registry.
//
// Author: Larry A. French
//
// History:
// 20-Febuary-1996 Larry A. French
// Totally rewrote it to fix the spagetti code and huge
// methods. The original author seemed to have little or
// no ability to form meaningful abstractions.
//
//
// Copyright (C) 1995, 1996 Microsoft Corporation. All rights reserved.
//
//************************************************************************
//
// Some of the interesting class implementations contained here are:
//
// CTrapReg
// This is the container class for the registry information. It is
// composed of the configuration "parameters" and an EventLog array.
//
// CXEventLogArray
// This class implements an array of CXEventLog objects, where the
// event logs are "application", "security", "system" and so on.
//
// CXEventLog
// This class implements a single event log. All information
// relevent to an event log can be accesssed through this class.
//
// CXEventSourceArray
// Each event log contains an event source array. The event source
// represents an application that can generate an Event.
//
// CXEventSource
// An eventsource represents an application that can generate some
// number of event-log events. The event source contains a CXEventArray
// and CXMessageArray. The CXEventArray contains all the events
// that will be converted to traps. The CXMessageArray contains all the
// possible messages that a particular event source can generate.
//
// CXMessageArray
// This class implements an array of CXMessage objects.
//
// CXMessage
// This class contains all the information relevent to a message
// that a message source can generate.
//
//
// CXEventArray
// This class implements an array of CXEvent objects.
//
// CXEvent
// This class represents an event that the user has selected to be
// converted to a trap. The event contains a message plus some
// additional information.
//
//**************************************************************************
// The Registry:
//
// These classes are loaded from the registry and written back to the
// registry when the user clicks OK. To understand the format of the
// registry, use the registry editor while looking though the "Serialize"
// and "Deserialize" member function for each of these classes.
//**************************************************************************
#include "stdafx.h"
#include "trapreg.h"
#include "regkey.h"
#include "busy.h"
#include "utils.h"
#include "globals.h"
#include "utils.h"
#include "dlgsavep.h"
#include "remote.h"
///////////////////////////////////////////////////////////////////
// Class: CBaseArray
//
// This class extends the CObArray class by adding the DeleteAll
// method.
//
//////////////////////////////////////////////////////////////////
//****************************************************************
// CBaseArray::DeleteAll
//
// Delete all the objects contained in this array.
//
// Parameters:
// None.
//
// Returns:
// Nothing.
//
//****************************************************************
void CBaseArray::DeleteAll()
{
LONG nObjects = (LONG)GetSize();
for (LONG iObject = nObjects-1; iObject >= 0; --iObject) {
CObject* pObject = GetAt(iObject);
delete pObject;
}
RemoveAll();
}
/////////////////////////////////////////////////////////////////////////////////////
// Class: CTrapReg
//
// This is the container class for all the registry information for eventrap.exe.
//
////////////////////////////////////////////////////////////////////////////////////
CTrapReg::CTrapReg() : m_pdlgLoadProgress(FALSE), m_pbtnApply(FALSE)
{
m_bNeedToCloseKeys = FALSE;
m_pdlgSaveProgress = NULL;
m_pdlgLoadProgress = NULL;
m_bDidLockRegistry = FALSE;
m_bRegIsReadOnly = FALSE;
SetDirty(FALSE);
m_nLoadSteps = LOAD_STEPS_IN_TRAPDLG;
m_bShowConfigTypeBox = TRUE;
m_dwConfigType = CONFIG_TYPE_CUSTOM;
}
CTrapReg::~CTrapReg()
{
delete m_pdlgSaveProgress;
delete m_pdlgLoadProgress;
if (!g_bLostConnection) {
if (m_bDidLockRegistry) {
UnlockRegistry();
}
if (m_bNeedToCloseKeys) {
m_regkeySource.Close();
m_regkeySnmp.Close();
m_regkeyEventLog.Close();
}
}
}
//*********************************************************************************
// CTrapReg::SetConfigType
//
// Set the configuration type to CONFIG_TYPE_CUSTOM or CONFIG_TYPE_DEFAULT
// When the configuration type is changed, the change is reflected in the
// registry immediately so that the config tool can know whether or not it
// should update the event to trap configuration.
//
// Parameters:
// DWORD dwConfigType
// This parameter must be CONFIG_TYPE_CUSTOM or CONFIG_TYPE_DEFAULT.
//
// Returns:
// SCODE
// S_OK if the configuration type was set, otherwise E_FAIL.
//
//*********************************************************************************
SCODE CTrapReg::SetConfigType(DWORD dwConfigType)
{
ASSERT(dwConfigType==CONFIG_TYPE_CUSTOM || dwConfigType==CONFIG_TYPE_DEFAULT_PENDING);
if (dwConfigType != m_dwConfigType) {
SetDirty(TRUE);
}
m_dwConfigType = dwConfigType;
return S_OK;
}
//*********************************************************************************
// CTrapReg::LockRegistry
//
// Lock the registry to prevent two concurrent edits of the event-to-trap configuration
// information.
//
// Parameters:
// None.
//
// Returns:
// SCODE
// S_OK if successful.
// E_FAIL if the configuration information was already locked.
// E_REGKEY_NO_CREATE if the "CurrentlyOpen" registry key can't
// be created.
//
//**********************************************************************************
SCODE CTrapReg::LockRegistry()
{
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
CRegistryKey regkey;
if (m_regkeyEventLog.GetSubKey(SZ_REGKEY_CURRENTLY_OPEN, regkey)) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
if (AfxMessageBox(IDS_ERR_REGISTRY_BUSY, MB_YESNO | MB_ICONSTOP | MB_DEFBUTTON2) == IDNO)
{
regkey.Close();
return E_FAIL;
}
}
// Create the "CurrentlyOpen" key as a volatile key so that it will disappear the next
// time the machine is restarted in the event that the application that locked the
// event-to-trap configuration crashed before it could clear this lock.
if (!m_regkeyEventLog.CreateSubKey(SZ_REGKEY_CURRENTLY_OPEN, regkey, NULL, NULL, TRUE)) {
if (g_bLostConnection) {
return E_REGKEY_LOST_CONNECTION;
}
AfxMessageBox(IDS_WARNING_CANT_WRITE_CONFIG, MB_OK | MB_ICONSTOP);
return E_REGKEY_NO_CREATE;
}
regkey.Close();
m_bDidLockRegistry = TRUE;
return S_OK;
}
//***********************************************************************
// CTrapReg::UnlockRegistry
//
// Unlock the event-to-trap configuration so that others can edit it.
//
// Parameters:
// None.
//
// Returns:
// Nothing.
//
//***********************************************************************
void CTrapReg::UnlockRegistry()
{
m_regkeyEventLog.DeleteSubKey(SZ_REGKEY_CURRENTLY_OPEN);
}
//***********************************************************************
// CTrapReg::Connect
//
// Connect to a registry. The registry may exist on a remote computer.
//
// Parameters:
// LPCTSTR pszComputerName
// The computer who's registry you want to edit. An empty string
// specifies a request to connect to the local machine.
//
// Returns:
// SCODE
// S_OK if the connection was made.
// E_FAIL if an error occurred. In this event, the appropriate
// error message boxes will have already been displayed.
//
//***********************************************************************
SCODE CTrapReg::Connect(LPCTSTR pszComputerName, BOOL bIsReconnecting)
{
SCODE sc;
g_bLostConnection = FALSE;
if (pszComputerName) {
m_sComputerName = pszComputerName;
}
// There are eight steps here, plus there are three initial steps in
// CTrapReg::Deserialize. After that the step count will be reset
// and then stepped again for each log where each log will have
// ten sub-steps.
if (!bIsReconnecting) {
m_pdlgLoadProgress->SetStepCount(LOAD_STEP_COUNT);
}
CRegistryValue regval;
CRegistryKey regkeyEventLog;
if (m_regkeySource.Connect(pszComputerName) != ERROR_SUCCESS) {
if (m_regkeySource.m_lResult == ERROR_ACCESS_DENIED) {
AfxMessageBox(IDS_ERR_REG_NO_ACCESS, MB_OK | MB_ICONSTOP);
return E_ACCESS_DENIED;
}
goto CONNECT_FAILURE;
}
if (!bIsReconnecting) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
}
if (m_regkeySnmp.Connect(pszComputerName) != ERROR_SUCCESS) {
if (m_regkeySnmp.m_lResult == ERROR_ACCESS_DENIED) {
AfxMessageBox(IDS_ERR_REG_NO_ACCESS, MB_OK | MB_ICONSTOP);
return E_ACCESS_DENIED;
}
goto CONNECT_FAILURE;
}
if (!bIsReconnecting) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
}
// SOFTWARE\\Microsoft\\SNMP_EVENTS
if (m_regkeySnmp.Open(SZ_REGKEY_SNMP_EVENTS, KEY_READ | KEY_WRITE | KEY_CREATE_SUB_KEY) != ERROR_SUCCESS) {
if (m_regkeySnmp.Open(SZ_REGKEY_SNMP_EVENTS, KEY_READ) == ERROR_SUCCESS) {
m_bRegIsReadOnly = TRUE;
}
else {
// At this point we know the SNMP_EVENTS key could not be opened. This
// could either be because we don't have access to the registry or we
// weren't installed yet. We now check to see if we can access the
// registry at all.
CRegistryKey regkeyMicrosoft;
if (regkeyMicrosoft.Open(SZ_REGKEY_MICROSOFT, KEY_READ) == ERROR_SUCCESS) {
regkeyMicrosoft.Close();
AfxMessageBox(IDS_ERR_NOT_INSTALLED, MB_OK | MB_ICONSTOP);
}
else {
// We couldn't even access SOFTWARE\Microsoft, so we know that
// we don't have access to the registry.
AfxMessageBox(IDS_ERR_REG_NO_ACCESS, MB_OK | MB_ICONSTOP);
return E_ACCESS_DENIED;
}
}
return E_FAIL;
}
if (!bIsReconnecting) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
}
// SYSTEM\\CurrentControlSet\\Services\\EventLog
if (m_regkeySource.Open(SZ_REGKEY_SOURCE_EVENTLOG, KEY_ENUMERATE_SUB_KEYS | KEY_READ | KEY_QUERY_VALUE ) != ERROR_SUCCESS) {
m_regkeySnmp.Close();
AfxMessageBox(IDS_ERR_REG_NO_ACCESS, MB_OK | MB_ICONSTOP);
return E_ACCESS_DENIED;
}
if (!bIsReconnecting) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
}
if (!m_regkeySnmp.GetSubKey(SZ_REGKEY_EVENTLOG, m_regkeyEventLog)) {
if (m_regkeySnmp.m_lResult == ERROR_ACCESS_DENIED) {
AfxMessageBox(IDS_ERR_REG_NO_ACCESS, MB_OK | MB_ICONSTOP);
sc = E_ACCESS_DENIED;
}
else {
AfxMessageBox(IDS_WARNING_CANT_READ_CONFIG, MB_OK | MB_ICONSTOP);
sc = E_REGKEY_NOT_FOUND;
}
m_regkeySnmp.Close();
m_regkeySource.Close();
return sc;
}
if (!bIsReconnecting) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
}
m_bNeedToCloseKeys = TRUE;
sc = LockRegistry();
if (FAILED(sc)) {
if (sc == E_REGKEY_LOST_CONNECTION) {
return sc;
}
else {
return E_REGKEY_NO_CREATE;
}
}
if (!bIsReconnecting) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
}
if (!bIsReconnecting) {
if (m_pdlgLoadProgress->StepProgress()) {
return S_LOAD_CANCELED;
}
++m_nLoadSteps;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -