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.
228 lines
5.5 KiB
228 lines
5.5 KiB
//*************************************************************
|
|
//
|
|
// Copyright (c) Microsoft Corporation 1998
|
|
// All rights reserved
|
|
//
|
|
// events.cxx
|
|
//
|
|
//*************************************************************
|
|
|
|
#include "fdeploy.hxx"
|
|
|
|
CEvents * gpEvents = 0;
|
|
|
|
CEvents::CEvents()
|
|
{
|
|
_hEventLog = NULL;
|
|
_pUserSid = NULL;
|
|
_Refs = 0;
|
|
}
|
|
|
|
CEvents::~CEvents()
|
|
{
|
|
if ( _hEventLog )
|
|
CloseEventLog( _hEventLog );
|
|
|
|
if ( _pUserSid )
|
|
LocalFree( _pUserSid );
|
|
}
|
|
|
|
DWORD
|
|
CEvents::Init()
|
|
{
|
|
DWORD Size;
|
|
DWORD Type;
|
|
DWORD Status;
|
|
HKEY hKey;
|
|
|
|
Status = ERROR_SUCCESS;
|
|
|
|
if ( ! _hEventLog )
|
|
_hEventLog = OpenEventLog( NULL, FDEPLOY_EVENT_SOURCE );
|
|
|
|
if ( ! _hEventLog )
|
|
return GetLastError();
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
PSID
|
|
CEvents::UserSid()
|
|
{
|
|
GetUserSid();
|
|
|
|
// The caller does not own this sid and should not attempt to free it
|
|
return _pUserSid;
|
|
}
|
|
|
|
void
|
|
CEvents::GetUserSid()
|
|
{
|
|
DWORD Size;
|
|
DWORD Status;
|
|
HANDLE hToken;
|
|
PTOKEN_USER pTokenUserData;
|
|
BOOL bStatus;
|
|
|
|
if ( _pUserSid )
|
|
return;
|
|
|
|
bStatus = OpenThreadToken( GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken );
|
|
|
|
if ( ! bStatus )
|
|
return;
|
|
|
|
Size = sizeof(TOKEN_USER) + sizeof(SID) + ((SID_MAX_SUB_AUTHORITIES-1) * sizeof(ULONG));
|
|
__try
|
|
{
|
|
pTokenUserData = (PTOKEN_USER) alloca( Size );
|
|
}
|
|
__except(GetExceptionCode() == STATUS_STACK_OVERFLOW)
|
|
{
|
|
_resetstkoflw();
|
|
pTokenUserData = NULL;
|
|
CloseHandle( hToken );
|
|
return;
|
|
}
|
|
|
|
bStatus = GetTokenInformation(
|
|
hToken,
|
|
TokenUser,
|
|
pTokenUserData,
|
|
Size,
|
|
&Size );
|
|
|
|
CloseHandle( hToken );
|
|
|
|
if ( ! bStatus )
|
|
return;
|
|
|
|
Size = GetLengthSid( pTokenUserData->User.Sid );
|
|
|
|
_pUserSid = (PSID) LocalAlloc( 0, Size );
|
|
|
|
if ( _pUserSid )
|
|
{
|
|
bStatus = CopySid( Size, _pUserSid, pTokenUserData->User.Sid );
|
|
|
|
if ( ! bStatus )
|
|
{
|
|
LocalFree( _pUserSid );
|
|
_pUserSid = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
CEvents::Report(
|
|
DWORD EventID,
|
|
WORD Strings,
|
|
...
|
|
)
|
|
{
|
|
va_list VAList;
|
|
WCHAR ** ppwszStrings;
|
|
WORD Type;
|
|
DWORD DbgMsgLevel;
|
|
|
|
switch ( EventID >> 30 )
|
|
{
|
|
case 3:
|
|
Type = EVENTLOG_ERROR_TYPE;
|
|
DbgMsgLevel = DM_WARNING;
|
|
break;
|
|
case 2:
|
|
Type = EVENTLOG_WARNING_TYPE;
|
|
DbgMsgLevel = DM_VERBOSE;
|
|
break;
|
|
case 1:
|
|
case 0:
|
|
Type = EVENTLOG_INFORMATION_TYPE;
|
|
DbgMsgLevel = DM_VERBOSE;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
ppwszStrings = 0;
|
|
|
|
if ( Strings > 0 )
|
|
{
|
|
__try
|
|
{
|
|
ppwszStrings = (WCHAR **) alloca( Strings * sizeof(WCHAR *) );
|
|
}
|
|
__except(GetExceptionCode() == STATUS_STACK_OVERFLOW)
|
|
{
|
|
_resetstkoflw();
|
|
return;
|
|
}
|
|
|
|
va_start( VAList, Strings );
|
|
for ( DWORD n = 0; n < Strings; n++ )
|
|
ppwszStrings[n] = va_arg( VAList, WCHAR * );
|
|
va_end( VAList );
|
|
}
|
|
|
|
GetUserSid();
|
|
|
|
(void) ReportEvent(
|
|
_hEventLog,
|
|
Type,
|
|
0,
|
|
EventID,
|
|
_pUserSid,
|
|
Strings,
|
|
0,
|
|
(LPCWCH *) ppwszStrings,
|
|
NULL );
|
|
|
|
//
|
|
// 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_FDEPLOY_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;
|
|
case 6 :
|
|
_DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0],
|
|
ppwszStrings[1], ppwszStrings[2], ppwszStrings[3],
|
|
ppwszStrings[4], ppwszStrings[5]);
|
|
break;
|
|
case 7 :
|
|
_DebugMsg( DbgMsgLevel | DM_NO_EVENTLOG, EventID, ppwszStrings[0],
|
|
ppwszStrings[1], ppwszStrings[2], ppwszStrings[3],
|
|
ppwszStrings[4], ppwszStrings[5], ppwszStrings[6]);
|
|
break;
|
|
default :
|
|
VerboseDebugDump( L"CEvents::Report called with more params then expected\n" );
|
|
break;
|
|
}
|
|
}
|
|
|
|
|