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.
 
 
 
 
 
 

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