Source code of Windows XP (NT5)
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.
|
|
//
// MODULE: Event.cpp
//
// PURPOSE: Fully implements class CEvent: Event Logging
//
// PROJECT: Generic Troubleshooter DLL for Microsoft AnswerPoint
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
//
// 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(); } }
|