// Copyright (c) 1996-1999 Microsoft Corporation //----------------------------------------------------------------------------- // // File: eventlog.cxx // // Contents: Utilities to report events. // // Histories: 08/06/97 created by weiruc // //----------------------------------------------------------------------------- #include #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(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(&sRawData), tszHr, TRKREPORT_LAST_PARAM ); return hr; }