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.
242 lines
6.0 KiB
242 lines
6.0 KiB
//--------------------------------------------------------------------
|
|
// Copyright (C) Microsoft Corporation, 1999 - 2002, All Rights Reserved
|
|
//
|
|
// eventlog.cpp
|
|
//
|
|
// Implementation of a simple event logging class.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#if !defined(BITS_V12_ON_NT4)
|
|
#include "eventlog.tmh"
|
|
#endif
|
|
|
|
//--------------------------------------------------------------------
|
|
// EVENT_LOG::EVENT_LOG()
|
|
//
|
|
//--------------------------------------------------------------------
|
|
EVENT_LOG::EVENT_LOG()
|
|
: m_OwnerString( new WCHAR[USER_NAME_LENGTH] ),
|
|
m_UserString( new WCHAR[USER_NAME_LENGTH] )
|
|
{
|
|
m_hEventLog = RegisterEventSourceW( NULL, WS_EVENT_SOURCE );
|
|
if (!m_hEventLog)
|
|
{
|
|
ThrowLastError();
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
// EVENT_LOG:;~EVENT_LOG()
|
|
//
|
|
//--------------------------------------------------------------------
|
|
EVENT_LOG::~EVENT_LOG()
|
|
{
|
|
if (m_hEventLog)
|
|
{
|
|
DeregisterEventSource(m_hEventLog);
|
|
}
|
|
|
|
delete m_OwnerString;
|
|
delete m_UserString;
|
|
}
|
|
|
|
HRESULT EVENT_LOG::ReportGenericJobChange(
|
|
GUID & Id,
|
|
LPCWSTR Title,
|
|
SidHandle Owner,
|
|
SidHandle User,
|
|
DWORD EventType
|
|
)
|
|
/*
|
|
This is a helper routine for a couple of different events that use the same insertion strings.
|
|
Currently there are two, for job cancellation and for take-ownership.
|
|
<EventType> should be the event ID from the .MC file. This fn doesn't verify that
|
|
the event in question expects these insertion strings.
|
|
|
|
*/
|
|
{
|
|
GUIDSTR GuidString;
|
|
|
|
StringFromGUID2( Id, GuidString, RTL_NUMBER_OF( GuidString ));
|
|
|
|
SidToUser( Owner.get(), m_OwnerString, USER_NAME_LENGTH );
|
|
SidToUser( User.get(), m_UserString, USER_NAME_LENGTH );
|
|
|
|
//
|
|
LPCWSTR Strings[4];
|
|
|
|
Strings[0] = GuidString;
|
|
Strings[1] = Title;
|
|
Strings[2] = m_OwnerString;
|
|
Strings[3] = m_UserString;
|
|
|
|
BOOL b;
|
|
b = ReportEvent(
|
|
m_hEventLog,
|
|
EVENTLOG_INFORMATION_TYPE,
|
|
0, // no category
|
|
EventType,
|
|
NULL, // no user
|
|
RTL_NUMBER_OF(Strings),
|
|
0, // no additional data
|
|
Strings,
|
|
NULL // no additional data
|
|
);
|
|
|
|
if (!b)
|
|
{
|
|
DWORD s = GetLastError();
|
|
LogError("unable to log job-change event (%x) %!winerr!", EventType, s);
|
|
return HRESULT_FROM_WIN32( s );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT EVENT_LOG::ReportFileDeletionFailure(
|
|
GUID & Id,
|
|
LPCWSTR Title,
|
|
LPCWSTR FileList,
|
|
bool fMoreFiles
|
|
)
|
|
{
|
|
GUIDSTR GuidString;
|
|
|
|
StringFromGUID2( Id, GuidString, RTL_NUMBER_OF( GuidString ));
|
|
|
|
LPCWSTR Strings[3];
|
|
|
|
Strings[0] = GuidString;
|
|
Strings[1] = Title;
|
|
Strings[2] = FileList;
|
|
|
|
BOOL b;
|
|
b = ReportEvent(
|
|
m_hEventLog,
|
|
EVENTLOG_WARNING_TYPE,
|
|
0, // no category
|
|
fMoreFiles ? MC_FILE_DELETION_FAILED_MORE : MC_FILE_DELETION_FAILED,
|
|
NULL, // no user
|
|
RTL_NUMBER_OF(Strings),
|
|
0, // no additional data
|
|
Strings,
|
|
NULL // no additional data
|
|
);
|
|
|
|
if (!b)
|
|
{
|
|
DWORD s = GetLastError();
|
|
LogError("unable to log file-deletion-failure event %!winerr!", s);
|
|
return HRESULT_FROM_WIN32( s );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT EVENT_LOG::ReportStateFileCleared()
|
|
{
|
|
BOOL b;
|
|
b = ReportEvent(
|
|
m_hEventLog,
|
|
EVENTLOG_ERROR_TYPE,
|
|
0, // no category
|
|
MC_STATE_FILE_CORRUPT,
|
|
NULL, // no user
|
|
0, // no plug-in strings
|
|
0, // no additional data
|
|
NULL, // no plug-in strings
|
|
NULL // no additional data
|
|
);
|
|
|
|
if (!b)
|
|
{
|
|
DWORD s = GetLastError();
|
|
LogError("unable to log state-file-cleared event %!winerr!", s);
|
|
return HRESULT_FROM_WIN32( s );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT EVENT_LOG::SidToUser( PSID Sid, LPWSTR Name, size_t Length )
|
|
{
|
|
DWORD s;
|
|
DWORD NameLength = 0;
|
|
DWORD DomainLength = 0;
|
|
SID_NAME_USE Use;
|
|
|
|
//
|
|
// Determine the usern-name and domain-name lengths.
|
|
//
|
|
LookupAccountSid( NULL, // default lookup spaces
|
|
Sid,
|
|
NULL,
|
|
&NameLength,
|
|
NULL,
|
|
&DomainLength,
|
|
&Use
|
|
);
|
|
|
|
s = GetLastError();
|
|
|
|
if (s == ERROR_NONE_MAPPED)
|
|
{
|
|
return GetUnknownUserName( Name, Length );
|
|
}
|
|
|
|
if (s != ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
LogError("LookupAccountSid #1 failed %!winerr!", s);
|
|
return HRESULT_FROM_WIN32(s);
|
|
}
|
|
|
|
if (NameLength + DomainLength > Length)
|
|
{
|
|
return HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
|
|
}
|
|
|
|
//
|
|
// Capture the user-name and domain-name.
|
|
//
|
|
NameLength = Length - DomainLength;
|
|
if (!LookupAccountSid( NULL,
|
|
Sid,
|
|
Name + DomainLength,
|
|
&NameLength,
|
|
Name,
|
|
&DomainLength,
|
|
&Use ))
|
|
{
|
|
s = GetLastError();
|
|
LogError("LookupAccountSid #2 failed %!winerr!", s);
|
|
return HRESULT_FROM_WIN32(s);
|
|
}
|
|
|
|
//
|
|
// The domain and user name are separated by a NULL instead of a backslash; fix that.
|
|
//
|
|
Name[wcslen(Name)] = '\\';
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
EVENT_LOG::GetUnknownUserName(
|
|
WCHAR Name[],
|
|
size_t Length
|
|
)
|
|
{
|
|
DWORD s;
|
|
|
|
if (!LoadString( g_hInstance, IDS_UNKNOWN_USER, Name, Length ))
|
|
{
|
|
s = GetLastError();
|
|
LogError("LoadString failed %!winerr!", s);
|
|
return HRESULT_FROM_WIN32(s);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|