windows-nt/Source/XPSP1/NT/com/svcdlls/trksvcs/common/eventlog.cxx
2020-09-26 16:20:57 +08:00

176 lines
5.1 KiB
C++

// Copyright (c) 1996-1999 Microsoft Corporation
//-----------------------------------------------------------------------------
//
// File: eventlog.cxx
//
// Contents: Utilities to report events.
//
// Histories: 08/06/97 created by weiruc
//
//-----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "trklib.hxx"
#include "netevent.h"
#define MAX_STRINGS 100
const extern TCHAR* g_ptszEventSource;
//------------------------------------------------------------------------------
//
// Function: TrkReportRawEvent
//
// Synopsis: Report an event using the event logging service.
// It's "raw" because an lpRawData parameter may be passed.
//
// Input: [in] dwEventId
// Event id as defined in eventmsg.h.
// [in] wType
// Type of event. Choices are:
// EVENTLOG_ERROR_TYPE Error event
// EVENTLOG_WARNING_TYPE Warning event
// EVENTLOG_INFORMATION_TYPE Information event
// EVENTLOG_AUDIT_SUCCESS Success Audit event
// EVENTLOG_AUDIT_FAILURE Failure Audit event
// [in] ...
// Any string the caller wants to log.
//
// Requirement: Because this function does not copy the string parameters
// into internal buffers. So the input strings can not be
// modified when the function is being called.
// The last string parameter passed in MUST be NULL to
// mark the end of the argument list. Any arguments passed
// in after a NULL argument are going to be ignored.
//
//------------------------------------------------------------------------------
HRESULT TrkReportRawEvent(DWORD dwEventId,
WORD wType,
DWORD cbRawData,
const void *pvRawData,
va_list pargs )
{
HANDLE hEventLog = INVALID_HANDLE_VALUE;
HRESULT hr = S_OK;
const TCHAR* rgtszStrings[MAX_STRINGS];
WORD wCounter = 0;
// initialize the insertion string array
memset(rgtszStrings, 0, sizeof(rgtszStrings));
// build the insertion string array
wCounter = 0;
while(TRUE)
{
if(wCounter >= MAX_STRINGS)
{
break;
}
rgtszStrings[wCounter] = va_arg(pargs, const TCHAR*);
if(NULL == rgtszStrings[wCounter])
{
break;
}
else
{
wCounter++;
}
}
va_end(pargs);
// open registry
hEventLog = RegisterEventSource(NULL, g_ptszEventSource);
if(NULL == hEventLog)
{
hr = HRESULT_FROM_WIN32(GetLastError());
TrkLog((TRKDBG_ERROR, TEXT("Can't open registry (%s), hr = %08x"),
g_ptszEventSource, hr));
goto Exit;
}
// write event log
if(!ReportEvent(hEventLog,
wType,
0,
dwEventId,
NULL,
wCounter,
cbRawData,
rgtszStrings,
const_cast<void*>(pvRawData) ))
{
hr = HRESULT_FROM_WIN32(GetLastError());
TrkLog((TRKDBG_ERROR, TEXT("ReportEvent failed. hr = %08x"), hr));
}
// close registry
if(!DeregisterEventSource(hEventLog) && S_OK == hr)
{
hr = HRESULT_FROM_WIN32(GetLastError());
TrkLog((TRKDBG_ERROR, TEXT("Can't close registry (%s), hr = %08x"),
g_ptszEventSource, hr));
}
Exit:
return hr;
}
//+----------------------------------------------------------------------------
//
// TrkReportInternalError
//
// Report an event that should never happen. The file number and line
// number are put into the hidden data blob.
//
//+----------------------------------------------------------------------------
HRESULT TrkReportInternalError(DWORD dwFileNo,
DWORD dwLineNo,
HRESULT hrErrorNo,
const TCHAR* ptszData)
{
HRESULT hr = S_OK;
TCHAR tszHr[9];
struct
{
DWORD dwFileNo;
DWORD dwLineNo;
TCHAR tszData[ MAX_PATH + 1 ];
} sRawData;
DWORD cbRawData = 0;
sRawData.dwFileNo = dwFileNo;
sRawData.dwLineNo = dwLineNo;
cbRawData = sizeof(sRawData.dwFileNo) + sizeof(sRawData.dwLineNo);
if( NULL != ptszData )
{
_tcsncpy( sRawData.tszData, ptszData, MAX_PATH );
cbRawData += 2 * _tcslen( ptszData );
}
// build the insertion strings
_stprintf(tszHr, TEXT("%08x"), hrErrorNo);
// This is just a special case of TrkReportEvent.
hr = TrkReportRawEventWrapper( EVENT_TRK_INTERNAL_ERROR,
EVENTLOG_ERROR_TYPE,
cbRawData,
reinterpret_cast<void*>(&sRawData),
tszHr, TRKREPORT_LAST_PARAM );
return hr;
}