WindowsXP-SP1/enduser/troubleshoot/tshoot/event.cpp

104 lines
3.2 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();
}
}