Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

203 lines
4.8 KiB

//*************************************************************
//
// Copyright (c) Microsoft Corporation 1998
// All rights reserved
//
// events.cxx
//
//*************************************************************
#include "common.hxx"
CEvents * gpEvents = 0;
CEventsBase::CEventsBase()
{
_hUserToken = 0;
}
void
CEventsBase::Report(
DWORD EventID,
BOOL bDowngradeErrors,
WORD Strings,
...
)
{
va_list VAList;
WCHAR * ppwszStrings[10];
WORD Type;
DWORD DbgMsgLevel;
if ( Strings > 10 )
return;
switch ( EventID / 100 )
{
case 1:
Type = EVENTLOG_ERROR_TYPE;
DbgMsgLevel = DM_WARNING;
break;
case 2:
Type = EVENTLOG_WARNING_TYPE;
DbgMsgLevel = DM_WARNING;
break;
case 3:
Type = EVENTLOG_INFORMATION_TYPE;
DbgMsgLevel = DM_VERBOSE;
break;
case 4:
Type = EVENTLOG_INFORMATION_TYPE;
DbgMsgLevel = DM_VERBOSE;
break;
default:
return;
}
if ( bDowngradeErrors && ( EVENTLOG_ERROR_TYPE == Type ) )
{
Type = EVENTLOG_WARNING_TYPE;
DbgMsgLevel = DM_WARNING;
}
if ( Strings > 0 )
{
va_start( VAList, Strings );
for ( DWORD n = 0; n < Strings; n++ )
ppwszStrings[n] = va_arg( VAList, WCHAR * );
va_end( VAList );
}
if ( (EventID < 400) ||
(gDebugLevel & (DL_VERBOSE | DL_EVENTLOG)) )
{
HANDLE hEventLog;
PSID pSid;
hEventLog = OpenEventLog( NULL, APPMGMT_EVENT_SOURCE );
if ( ! hEventLog )
return;
pSid = AppmgmtGetUserSid( _hUserToken );
(void) ReportEvent(
hEventLog,
Type,
0,
EventID,
pSid,
Strings,
0,
(LPCWCH *) ppwszStrings,
NULL );
LocalFree( pSid );
CloseEventLog( hEventLog );
}
//
// Also make sure the event messages get sent to the debugger and log file.
// Kind of hacky method, but makes it so every caller to ::Report doesn't
// have to call _DebugMsg as well.
// However, don't do this for the verbose messages otherwise it will be
// dumped to the debugger twice.
//
if ( EVENT_APPMGMT_VERBOSE == EventID )
return;
switch ( Strings )
{
case 0 :
_DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID );
break;
case 1 :
_DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0] );
break;
case 2 :
_DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0], ppwszStrings[1] );
break;
case 3 :
_DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0], ppwszStrings[1], ppwszStrings[2] );
break;
case 4 :
_DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0], ppwszStrings[1], ppwszStrings[2], ppwszStrings[3] );
break;
case 5 :
_DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0], ppwszStrings[1], ppwszStrings[2], ppwszStrings[3], ppwszStrings[4] );
break;
default :
VerboseDebugDump( L"CEvents::Report called with more params then expected!\n" );
break;
}
}
void
CEventsBase::Install(
DWORD ErrorStatus,
WCHAR * pwszDeploymentName,
WCHAR * pwszGPOName
)
{
WCHAR wszStatus[12];
if ( ErrorStatus != ERROR_SUCCESS )
{
DwordToString( ErrorStatus, wszStatus );
Report(
EVENT_APPMGMT_INSTALL_FAILED,
ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED == ErrorStatus,
3,
pwszDeploymentName,
pwszGPOName,
wszStatus );
}
else
{
Report(
EVENT_APPMGMT_INSTALL,
FALSE,
2,
pwszDeploymentName,
pwszGPOName );
}
}
void
CEventsBase::Uninstall(
DWORD ErrorStatus,
WCHAR * pwszDeploymentName,
WCHAR * pwszGPOName
)
{
WCHAR wszStatus[12];
if ( ErrorStatus != ERROR_SUCCESS )
{
DwordToString( ErrorStatus, wszStatus );
Report(
EVENT_APPMGMT_UNINSTALL_FAILED,
ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED == ErrorStatus,
3,
pwszDeploymentName,
pwszGPOName,
wszStatus );
}
else
{
Report(
EVENT_APPMGMT_UNINSTALL,
FALSE,
2,
pwszDeploymentName,
pwszGPOName );
}
}