/*++ Copyright (c) 2001 Microsoft Corporation Module Name: Dulog.cpp Abstract: Implements the event logging functions. Note that the C++ class provides the functionality for event logging. Notes: Unicode only. History: 03/02/2001 rparsons Created --*/ #include "precomp.h" extern SETUP_INFO g_si; /*++ Routine Description: Logs an event to the event log and optionally displays the message. Note that we use this function when writing to the event log for non-error related stuff Arguments: wType - The type of message we're logging dwEventID - An event ID for our message fDisplayErr - A flag to indicate if we should display an error fCritical - Indicates if we should display a message from the string table Return Value: TRUE on success, FALSE otherwise --*/ BOOL LogEventDisplayError( IN WORD wType, IN DWORD dwEventID, IN BOOL fDisplayErr, IN BOOL fCritical ) { WORD wNumStrings = 0; LPWSTR lpwMessageArray[2]; LPWSTR lpwSourceFile = NULL; int nLen = 0; CEventLog cel; // // If the Critical flag is set, an error occured while // trying to get strings from somewhere. Report the event // without registering a source // if (fCritical) { WCHAR wszMessageBoxTitle[MAX_PATH] = L""; WCHAR wszPrettyAppName[MAX_PATH] = L""; WCHAR wszEventLogSourceName[MAX_PATH] = L""; WCHAR wszTemp[MAX_PATH] = L""; WCHAR wszCriticalError[MAX_PATH] = L""; HANDLE hEventLog; const WCHAR *pwMessage[1]; LoadString(g_si.hInstance, IDS_MB_TITLE, wszMessageBoxTitle, MAX_PATH); LoadString(g_si.hInstance, g_si.fOnWin2K ? IDS_APP_NAME_WIN2K : IDS_APP_NAME_XP, wszPrettyAppName, MAX_PATH); LoadString(g_si.hInstance, IDS_EL_SOURCE_NAME, wszEventLogSourceName, MAX_PATH); LoadString(g_si.hInstance, IDS_CRITICAL_ERROR, wszTemp, MAX_PATH); wsprintf(wszCriticalError, wszTemp, wszPrettyAppName); pwMessage[0] = wszCriticalError; hEventLog = RegisterEventSource(NULL, wszEventLogSourceName); if (hEventLog) { ReportEvent(hEventLog, EVENTLOG_ERROR_TYPE, 0, 1001, NULL, 1, 0, pwMessage, NULL); } if (!g_si.fQuiet) { MessageBox(GetDesktopWindow(), wszCriticalError, wszMessageBoxTitle, MB_ICONERROR | MB_OK); } DeregisterEventSource(hEventLog); return TRUE; } // // Determine if we've already created our event source // if (!g_si.fEventSourceCreated) { // // Build a path to our source file and register // the event source // nLen += wcslen(g_si.lpwEventLogSourceName); nLen += wcslen(g_si.lpwInstallDirectory); lpwSourceFile = (LPWSTR) MALLOC((nLen*sizeof(WCHAR))*2); if (NULL == lpwSourceFile) { return FALSE; } wcscpy(lpwSourceFile, g_si.lpwInstallDirectory); wcscat(lpwSourceFile, L"\\"); wcscat(lpwSourceFile, g_si.lpwEventLogSourceName); wcscat(lpwSourceFile, L".exe"); cel.CreateEventSource(lpwSourceFile, g_si.lpwEventLogSourceName, dwApplication); g_si.fEventSourceCreated = TRUE; FREE(lpwSourceFile); } lpwMessageArray[wNumStrings++] = (LPWSTR) g_si.lpwPrettyAppName; // // Place the event in the event log // cel.LogEvent(g_si.lpwEventLogSourceName, NULL, wType, dwEventID, 1, (LPCWSTR*) lpwMessageArray); if (fDisplayErr) { if (!g_si.fQuiet) { DisplayErrMsg(NULL, dwEventID, (LPWSTR) lpwMessageArray); } } return TRUE; } /*++ Routine Description: Logs an event to the event log Arguments: wType - Type of message dwEventID - Event ID wNumStrings - Number of insertion strings lpwStrings - Array of strings Return Value: None --*/ void LogWUEvent( IN WORD wType, IN DWORD dwEventID, IN WORD wNumStrings, IN LPCWSTR *lpwStrings ) { HANDLE hES = NULL; LPVOID lpMsgBuf = NULL; LPWSTR lpwSourceFile = NULL; int nLen = 0; CEventLog cel; // // Determine if we've already created our event source // in the registry // if (!g_si.fEventSourceCreated) { // // Build a path to our source file and register // the event source // nLen += wcslen(g_si.lpwEventLogSourceName); nLen += wcslen(g_si.lpwInstallDirectory); lpwSourceFile = (LPWSTR) MALLOC((nLen*sizeof(WCHAR))*2); if (NULL == lpwSourceFile) { return; } wcscpy(lpwSourceFile, g_si.lpwInstallDirectory); wcscat(lpwSourceFile, L"\\"); wcscat(lpwSourceFile, g_si.lpwEventLogSourceName); wcscat(lpwSourceFile, L".exe"); cel.CreateEventSource(lpwSourceFile, g_si.lpwEventLogSourceName, dwApplication); g_si.fEventSourceCreated = TRUE; FREE(lpwSourceFile); } if (wNumStrings) { // // Report the event with insertion strings // cel.LogEvent(g_si.lpwEventLogSourceName, NULL, wType, dwEventID, 0, NULL); } else { // // Report the event with no strings // cel.LogEvent(g_si.lpwEventLogSourceName, NULL, wType, dwEventID, wNumStrings, (LPCWSTR*) lpwStrings); } return; }