Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

275 lines
7.6 KiB

///////////////////////////////////////////////////////////////////////////////
//
// File Name
// EventLogger.CPP
//
// Description
//
// Revision: 2.01
//
// Copyright (c) 1996-1999 Acotec, Inc.
// All rights reserved.
//
//
// Portions Copyright (c) 1999 Microsoft Corporation. All rights reserved.
//
#include "EventLogger.h"
///////////////////////////////////////////////////////////////////////////////
// CEventLogger::CEventLogger()
//
// Parameters
//
// Purpose
//
// Return Value
//
CEventLogger::CEventLogger()
{
InitializeCriticalSection (&m_csObj);
m_hEventLog = NULL;
m_wServiceCategory = 0;
m_LoggingLevel = LOGGING_LEVEL_1;
m_hLogMutex = NULL;
m_fLogEvent = TRUE;
m_hMsgSource = NULL;
ZeroMemory (m_szCat, sizeof(m_szCat));
}
///////////////////////////////////////////////////////////////////////////////
// CEventLogger::CEventLogger()
//
// Parameters
//
// Purpose
//
// Return Value
//
CEventLogger::CEventLogger(LPTSTR szEventSource, WORD wEventsCategory)
{
CEventLogger();
InitEventLog (szEventSource, wEventsCategory);
}
///////////////////////////////////////////////////////////////////////////////
// CEventLogger::~CEventLogger()
//
// Parameters
//
// Purpose
//
// Return Value
//
CEventLogger::~CEventLogger()
{
if (m_hLogMutex)
{
CloseHandle (m_hLogMutex);
}
if (m_hEventLog)
{
DeregisterEventSource (m_hEventLog);
}
DeleteCriticalSection (&m_csObj);
}
///////////////////////////////////////////////////////////////////////////////
// CEventLogger::InitEventLog()
//
// Parameters
//
// Purpose
//
// Return Value
//
DWORD WINAPI CEventLogger::InitEventLog (LPTSTR szEventSource,
WORD wEventsCategory,
LPTSTR szRegKey)
{
EnterCriticalSection (&m_csObj);
if (m_hEventLog)
{
DeregisterEventSource (m_hEventLog);
m_hEventLog = NULL;
}
m_wServiceCategory = wEventsCategory;
m_LoggingLevel = LOGGING_LEVEL_1;
HKEY hKey;
DWORD dwValue=LOGGING_LEVEL_1, dwError = 0, dwSize = sizeof(DWORD);
m_hEventLog = RegisterEventSource (NULL, szEventSource);
if (!m_hEventLog)
{
dwError = GetLastError();
m_LoggingLevel = LOGGING_LEVEL_0;
}
else
if (szRegKey &&
ERROR_SUCCESS == (dwError=RegOpenKeyEx (HKEY_LOCAL_MACHINE,
szRegKey,
0,
KEY_READ,
&hKey)))
{
dwError=RegQueryValueEx (hKey,
REGVAL_LOGGING_LEVEL,
NULL,
NULL,
(LPBYTE)&dwValue,
&dwSize);
if(ERROR_SUCCESS == dwError )
{
if (dwValue > (DWORD)LOGGING_LEVEL_3)
{
dwValue = (DWORD)LOGGING_LEVEL_3;
}
m_LoggingLevel = (LOGLEVEL)dwValue;
}
RegCloseKey (hKey);
}
LeaveCriticalSection (&m_csObj);
return dwError;
}
///////////////////////////////////////////////////////////////////////////////
// CEventLogger::SetLoggingLevel()
//
// Parameters
//
// Purpose
//
// Return Value
//
void WINAPI CEventLogger::SetLoggingLevel (LOGLEVEL NewLoggingLevel)
{
EnterCriticalSection (&m_csObj);
m_LoggingLevel = NewLoggingLevel;
LeaveCriticalSection (&m_csObj);
}
///////////////////////////////////////////////////////////////////////////////
// CEventLogger::LogEvent()
//
// Parameters
//
// Purpose
//
// Return Value
//
void WINAPI CEventLogger::LogEvent (LOGTYPE Type,
DWORD dwEventID,
DWORD dwData,
LPCTSTR rgszMsgs[],
WORD wCount,
DWORD cbData,
LPVOID pvData)
{
if (LOGGING_LEVEL_0 == m_LoggingLevel &&
LOGTYPE_FORCE_ERROR != Type &&
LOGTYPE_FORCE_WARNING != Type &&
LOGTYPE_FORCE_INFORMATION != Type)
{
return;
}
if (!m_fLogEvent)
return;
TCHAR szBuffer[64];
LPCTSTR rgszError[] =
{
szBuffer
};
LPTSTR pszType;
WORD wEventType;
switch (Type)
{
case LOGTYPE_ERR_CRITICAL :
case LOGTYPE_FORCE_ERROR :
pszType = _T("ERROR");
wEventType = EVENTLOG_ERROR_TYPE;
if (NULL == rgszMsgs)
{
_stprintf (szBuffer, _T("%d"), dwData);
rgszMsgs = rgszError;
wCount = 1;
}
break;
case LOGTYPE_ERR_WARNING :
if (m_LoggingLevel < LOGGING_LEVEL_2) { return; }
case LOGTYPE_FORCE_WARNING :
pszType = _T("WARNING");
wEventType = EVENTLOG_WARNING_TYPE;
if (dwData && NULL == rgszMsgs)
{
_stprintf (szBuffer, _T("%d"), dwData);
rgszMsgs = rgszError;
wCount = 1;
}
break;
case LOGTYPE_AUDIT_SECURITY_ACCESS :
case LOGTYPE_AUDIT_SECURITY_DENIED :
pszType = _T("SECURITY");
case LOGTYPE_INFORMATION :
if (m_LoggingLevel < LOGGING_LEVEL_3) { return; }
case LOGTYPE_FORCE_INFORMATION :
switch (Type)
{
case LOGTYPE_AUDIT_SECURITY_ACCESS : wEventType = EVENTLOG_AUDIT_SUCCESS; break;
case LOGTYPE_AUDIT_SECURITY_DENIED : wEventType = EVENTLOG_AUDIT_FAILURE; break;
case LOGTYPE_FORCE_INFORMATION :
case LOGTYPE_INFORMATION :
wEventType = EVENTLOG_INFORMATION_TYPE;
pszType = _T("INFORMATION");
break;
}
break;
case LOGTYPE_VERBOSE :
case LOGTYPE_VERBOSE_ERROR :
case LOGTYPE_VERBOSE_WARNING :
if (m_LoggingLevel < LOGGING_LEVEL_3) { return; }
if ((LOGTYPE_VERBOSE_ERROR == Type || LOGTYPE_VERBOSE_WARNING == Type) &&
dwData && NULL == rgszMsgs)
{
_stprintf (szBuffer, _T("%d"), dwData);
rgszMsgs = rgszError;
wCount = 1;
}
switch (Type)
{
case LOGTYPE_VERBOSE :
wEventType = EVENTLOG_INFORMATION_TYPE;
pszType = _T("V_INFORMATION");
break;
case LOGTYPE_VERBOSE_ERROR :
wEventType = EVENTLOG_ERROR_TYPE;
pszType = _T("V_ERROR");
break;
case LOGTYPE_VERBOSE_WARNING :
wEventType = EVENTLOG_WARNING_TYPE;
pszType = _T("V_WARNING");
break;
}
break;
default :
return;
}
if (m_hEventLog)
{
ReportEvent (m_hEventLog,
wEventType,
m_wServiceCategory,
dwEventID,
NULL,
wCount,
cbData,
rgszMsgs,
pvData);
}
}