//************************************************************* // // Events.cpp - Routines to handle the event log // // Microsoft Confidential // Copyright (c) Microsoft Corporation 1995 // All rights reserved // //************************************************************* #include "stdafx.h" #include "rsopdbg.h" #include "events.h" HANDLE hEventLog = NULL; TCHAR EventSourceName[] = TEXT("GPDAS"); TCHAR MessageResourceFile[] = TEXT("%systemroot%\\system32\\rsopprov.exe"); //************************************************************* // // InitializeEvents() // // Purpose: Opens the event log // // Parameters: void // // Return: TRUE if successful // FALSE if an error occurs // // Comments: // // History: Date Author Comment // 7/17/95 ericflo Created // //************************************************************* BOOL InitializeEvents (void) { // // Open the event source // hEventLog = RegisterEventSource(NULL, EventSourceName); if (hEventLog) { return TRUE; } dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("InitializeEvents: Could not open event log. Error = %d"), GetLastError()); return FALSE; } //************************************************************* // // Implementation of CEvents // //************************************************************* //************************************************************* // CEvents::CEvents // Purpose: Constructor // // Parameters: // bError - Error or informational // dwId - Id of the eventlog msg // // // allocates a default sized array for the messages //************************************************************* #define DEF_ARG_SIZE 10 CEvents::CEvents(BOOL bError, DWORD dwId ) : m_cStrings(0), m_cAllocated(0), m_bInitialised(FALSE), m_bError(bError), m_dwId(dwId), m_bFailed(TRUE) { // // Allocate a default size for the message // m_xlpStrings = (LPTSTR *)LocalAlloc(LPTR, sizeof(LPTSTR)*DEF_ARG_SIZE); m_cAllocated = DEF_ARG_SIZE; if (!m_xlpStrings) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::CEvent Cannot log event, failed to allocate memory, error %d"), GetLastError()); return; } // // Initialise eventlog if it is not already initialised // if (!hEventLog) { if (!InitializeEvents()) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::CEvent Cannot log event, no handle")); return; } } m_bInitialised = TRUE; m_bFailed = FALSE; } //************************************************************* // CEvents::~CEvents() // // Purpose: Destructor // // Parameters: void // // frees the memory //************************************************************* CEvents::~CEvents() { for (int i = 0; i < m_cStrings; i++) if (m_xlpStrings[i]) LocalFree(m_xlpStrings[i]); } //************************************************************* // // CEvents::ReallocArgStrings // // Purpose: Reallocates the buffer for storing arguments in case // the buffer runs out // // Parameters: void // // reallocates //************************************************************* BOOL CEvents::ReallocArgStrings() { XPtrLF aStringsNew; // // first allocate a larger buffer // aStringsNew = (LPTSTR *)LocalAlloc(LPTR, sizeof(LPTSTR)*(m_cAllocated+DEF_ARG_SIZE)); if (!aStringsNew) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::CEvent Couldn't allocate memory")); m_bFailed = TRUE; return FALSE; } // // copy the arguments // for (int i = 0; i < (m_cAllocated); i++) { aStringsNew[i] = m_xlpStrings[i]; } m_xlpStrings = aStringsNew.Acquire(); m_cAllocated+= DEF_ARG_SIZE; return TRUE; } //************************************************************* // // CEvents::AddArg // // Purpose: Add arguments appropriately formatted // // Parameters: // //************************************************************* BOOL CEvents::AddArg(LPTSTR szArg) { if ((!m_bInitialised) || (m_bFailed)) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::AddArg: Cannot log event, not initialised or failed before")); return FALSE; } if (m_cStrings == m_cAllocated) { if (!ReallocArgStrings()) return FALSE; } DWORD dwLength = lstrlen(szArg) + 1; m_xlpStrings[m_cStrings] = (LPTSTR)LocalAlloc(LPTR, sizeof(TCHAR) * (dwLength)); if (!m_xlpStrings[m_cStrings]) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::AddArg Cannot allocate memory, error = %d"), GetLastError()); m_bFailed = TRUE; return FALSE; } HRESULT hr = StringCchCopy(m_xlpStrings[m_cStrings], dwLength, szArg); if(FAILED(hr)){ dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::StringCchCopy failed with error = %d"), hr); m_bFailed = TRUE; return FALSE; } m_cStrings++; return TRUE; } //************************************************************* // // CEvents::AddArg // // Purpose: Add arguments appropriately formatted // // Parameters: // //************************************************************* BOOL CEvents::AddArg(DWORD dwArg) { if ((!m_bInitialised) || (m_bFailed)) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::AddArg(dw): Cannot log event, not initialised or failed before")); return FALSE; } if (m_cStrings == m_cAllocated) { if (!ReallocArgStrings()) return FALSE; } // 2^32 < 10^10 DWORD dwLength = 20; m_xlpStrings[m_cStrings] = (LPTSTR)LocalAlloc(LPTR, sizeof(TCHAR) * dwLength); if (!m_xlpStrings[m_cStrings]) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::AddArg(dw) Cannot allocate memory, error = %d"), GetLastError()); m_bFailed = TRUE; return FALSE; } HRESULT hr = StringCchPrintf(m_xlpStrings[m_cStrings], dwLength, TEXT("%d"), dwArg); if(FAILED(hr)){ dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::StringCchPrintf failed with error = %d"), hr); m_bFailed = TRUE; return FALSE; } m_cStrings++; return TRUE; } //************************************************************* // // CEvents::AddArg // // Purpose: Add arguments appropriately formatted // // Parameters: // //************************************************************* BOOL CEvents::AddArgHex(DWORD dwArg) { if ((!m_bInitialised) || (m_bFailed)) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::AddArgHex: Cannot log event, not initialised or failed before")); return FALSE; } if (m_cStrings == m_cAllocated) { if (!ReallocArgStrings()) return FALSE; } DWORD dwLength = 20; m_xlpStrings[m_cStrings] = (LPTSTR)LocalAlloc(LPTR, sizeof(TCHAR) * dwLength); if (!m_xlpStrings[m_cStrings]) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::AddArgHex Cannot allocate memory, error = %d"), GetLastError()); m_bFailed = TRUE; return FALSE; } HRESULT hr = StringCchPrintf(m_xlpStrings[m_cStrings], dwLength, TEXT("%#x"), dwArg); if(FAILED(hr)){ dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvent::StringCchPrintf failed with error = %d"), hr); m_bFailed = TRUE; return FALSE; } m_cStrings++; return TRUE; } //************************************************************* // // CEvents::Report // // Purpose: Actually collectes all the arguments and reports it to // the eventlog // // Parameters: void // //************************************************************* BOOL CEvents::Report() { PSID pSid = NULL; // no sid being reportewd currently WORD wType=0; BOOL bResult = TRUE; if ((!m_bInitialised) || (m_bFailed)) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvents::Report: Cannot log event, not initialised or failed before")); return FALSE; } if ( m_bError ) { wType = EVENTLOG_ERROR_TYPE; } else { wType = EVENTLOG_INFORMATION_TYPE; } if (!ReportEvent(hEventLog, wType, 0, m_dwId, pSid, m_cStrings, 0, (LPCTSTR *)((LPTSTR *)m_xlpStrings), NULL)) { dbg.Msg( DEBUG_MESSAGE_WARNING, TEXT("CEvents::Report: ReportEvent failed. Error = %d"), GetLastError()); bResult = FALSE; } return bResult; } //************************************************************* // // ShutdownEvents() // // Purpose: Stops the event log // // Parameters: void // // Return: TRUE if successful // FALSE if an error occurs // // Comments: // // History: Date Author Comment // 7/17/95 ericflo Created // //************************************************************* BOOL ShutdownEvents (void) { BOOL bRetVal = TRUE; if (hEventLog) { bRetVal = DeregisterEventSource(hEventLog); hEventLog = NULL; } return bRetVal; }