176 lines
5.1 KiB
C++
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;
|
||
|
}
|