279 lines
6.5 KiB
C++
279 lines
6.5 KiB
C++
|
/*++
|
||
|
|
||
|
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;
|
||
|
}
|