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
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 );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|