104 lines
3.1 KiB
C++
104 lines
3.1 KiB
C++
//
|
|
// MODULE: Event.cpp
|
|
//
|
|
// PURPOSE: Fully implements class CEvent: Event Logging
|
|
//
|
|
// PROJECT: Generic Troubleshooter DLL for Microsoft AnswerPoint
|
|
//
|
|
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
|
|
//
|
|
// AUTHOR: Roman Mach
|
|
//
|
|
// ORIGINAL DATE: 8-2-96
|
|
//
|
|
// NOTES:
|
|
//
|
|
// Version Date By Comments
|
|
//--------------------------------------------------------------------
|
|
// V3.0 9/18/98 JM Abstracted as a class. Previously, global.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "Event.h"
|
|
|
|
bool CEvent::s_bUseEventLog = false;// Online Troubleshooter, will promptly set this
|
|
// true in DLLMain. For Local Troubleshooter,
|
|
// we leave this false.
|
|
bool CEvent::s_bLogAll = true; // can be changed by RegistryMonitor
|
|
CAbstractCounter * const CEvent::s_pcountErrors = &(g_ApgtsCounters.m_LoggedErrors);
|
|
|
|
inline WORD evtype(DWORD e) {return (1 << (3 - ((e >> 30))));}
|
|
inline WORD evcode(DWORD e) {return (WORD)(e & 0xFFFF);}
|
|
|
|
|
|
/*static*/ void CEvent::SetUseEventLog(bool bUseEventLog)
|
|
{
|
|
s_bUseEventLog = bUseEventLog;
|
|
}
|
|
|
|
// ReportWFEvent (Based on Microsoft code)
|
|
//
|
|
// report an event to the NT event watcher
|
|
// pass 1, 2 or 3 strings
|
|
//
|
|
// no return value
|
|
// NOTE: inefficient: could RegisterEventSource in DLLMain code for DLL_PROCESS_ATTACH
|
|
// & unregister in DLL_PROCESS_DETACH. Then could use handle as a global.
|
|
/* static */ void CEvent::ReportWFEvent(
|
|
LPCTSTR string1, // if there is a throw, this is throw file & line
|
|
// otherwise, file and line where ReportWFEvent is called
|
|
LPCTSTR string2, // always file and line where ReportWFEvent is called
|
|
LPCTSTR string3, // use may differ for different log entries
|
|
LPCTSTR string4, // use may differ for different log entries
|
|
DWORD eventID)
|
|
{
|
|
if (!s_bUseEventLog)
|
|
return;
|
|
|
|
HANDLE hEvent;
|
|
LPCTSTR pszaStrings[4];
|
|
WORD cStrings;
|
|
|
|
WORD type = evtype(eventID);
|
|
WORD code = evcode(eventID);
|
|
|
|
if (s_bLogAll
|
|
|| type == EVENTLOG_ERROR_TYPE
|
|
|| type == EVENTLOG_WARNING_TYPE
|
|
|| code == EV_GTS_PROCESS_START
|
|
|| code == EV_GTS_PROCESS_STOP)
|
|
{
|
|
cStrings = 0;
|
|
if ((pszaStrings[0] = string1) && (string1[0]))
|
|
cStrings = 1;
|
|
if ((pszaStrings[1] = string2) && (string2[0]))
|
|
cStrings = 2;
|
|
if ((pszaStrings[2] = string3) && (string3[0]))
|
|
cStrings = 3;
|
|
if ((pszaStrings[3] = string4) && (string4[0]))
|
|
cStrings = 4;
|
|
if (cStrings == 0)
|
|
return;
|
|
|
|
hEvent = ::RegisterEventSource(
|
|
NULL, // server name for source (NULL means this computer)
|
|
REG_EVT_ITEM_STR); // source name for registered handle
|
|
if (hEvent)
|
|
{
|
|
::ReportEvent(hEvent, // handle returned by RegisterEventSource
|
|
type, // event type to log
|
|
0, // event category
|
|
eventID, // event identifier
|
|
0, // user security identifier (optional)
|
|
cStrings, // number of strings to merge with message
|
|
0, // size of binary data, in bytes
|
|
(LPCTSTR *)pszaStrings, // array of strings to merge with message
|
|
NULL); // address of binary data
|
|
::DeregisterEventSource(hEvent);
|
|
}
|
|
if (evtype(eventID) == EVENTLOG_ERROR_TYPE)
|
|
s_pcountErrors->Increment();
|
|
}
|
|
}
|