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.
 
 
 
 
 
 

281 lines
6.4 KiB

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: elog.cpp
//
// Contents: Cert Server Core implementation
//
// History: 02-Jan-97 terences created
//
//---------------------------------------------------------------------------
// TBD: add AddLoggingEvent, which will log to file instead of the event log
// TBD: add audit events
// TBD: add filtering so that criticality sorting of events can take place
#include <pch.cpp>
#pragma hdrstop
#include "certlog.h"
#include "elog.h"
#define __dwFILE__ __dwFILE_CERTSRV_ELOG_CPP__
#if DBG_CERTSRV
WCHAR const *
wszEventType(
IN DWORD dwEventType)
{
WCHAR const *pwsz;
switch (dwEventType)
{
case EVENTLOG_ERROR_TYPE: pwsz = L"Error"; break;
case EVENTLOG_WARNING_TYPE: pwsz = L"Warning"; break;
case EVENTLOG_INFORMATION_TYPE: pwsz = L"Information"; break;
case EVENTLOG_AUDIT_SUCCESS: pwsz = L"AuditSuccess"; break;
case EVENTLOG_AUDIT_FAILURE: pwsz = L"AuditFailure"; break;
default: pwsz = L"???"; break;
}
return(pwsz);
}
#endif // DBG_CERTSRV
typedef struct _ELOGTHROTTLE {
DWORD dwIdEvent;
DWORD dwSeconds;
LLFILETIME llftNext;
} ELOGTHROTTLE;
ELOGTHROTTLE s_elogThrottle[] = {
{ MSG_E_POSSIBLE_DENIAL_OF_SERVICE_ATTACK, 20 * CVT_MINUTES, },
{ MSG_E_BAD_DEFAULT_CA_XCHG_CSP, 1 * CVT_DAYS, },
{ MSG_E_BAD_REGISTRY_CA_XCHG_CSP, 1 * CVT_DAYS, },
{ MSG_CLAMPED_BY_CA_CERT, 1 * CVT_DAYS, },
};
BOOL
LogThrottleEvent(
IN DWORD dwIdEvent)
{
BOOL fThrottle = FALSE;
if (CERTLOG_EXHAUSTIVE > g_dwLogLevel)
{
ELOGTHROTTLE *pet;
for (
pet = s_elogThrottle;
pet < &s_elogThrottle[ARRAYSIZE(s_elogThrottle)];
pet++)
{
if (dwIdEvent == pet->dwIdEvent)
{
LLFILETIME llft;
LLFILETIME llftNext;
GetSystemTimeAsFileTime(&llft.ft);
// if it's time to log the next msg (Next < Now)
llftNext = pet->llftNext;
if (0 > CompareFileTime(&llftNext.ft, &llft.ft))
{
llft.ll += ((LONGLONG) pet->dwSeconds) * CVT_BASE;
pet->llftNext = llft;
}
else
{
fThrottle = TRUE;
}
break;
}
}
}
//error:
return(fThrottle);
}
/*********************************************************************
* FUNCTION: LogEvent( DWORD dwEventType, *
* DWORD dwIdEvent, *
* WORD cStrings, *
* LPTSTR *apwszStrings); *
* *
* PURPOSE: add the event to the event log *
* *
* INPUT: the event ID to report in the log, the number of insert *
* strings, and an array of null-terminated insert strings *
* *
* RETURNS: none *
*********************************************************************/
HRESULT
LogEvent(
IN DWORD dwEventType,
IN DWORD dwIdEvent,
IN WORD cStrings,
IN WCHAR const * const *apwszStrings)
{
HRESULT hr;
HANDLE hAppLog = NULL;
#if DBG_CERTSRV
CONSOLEPRINT3((
DBG_SS_CERTSRV,
"LogEvent(Type=%x(%ws), Id=%x)\n",
dwEventType,
wszEventType(dwEventType),
dwIdEvent));
for (DWORD i = 0; i < cStrings; i++)
{
CONSOLEPRINT2((
DBG_SS_CERTSRV,
"LogEvent[%u]: %ws\n",
i,
apwszStrings[i]));
}
#endif // DBG_CERTSRV
if (!LogThrottleEvent(dwIdEvent))
{
WORD wElogType = (WORD) dwEventType;
hAppLog = RegisterEventSource(NULL, g_wszCertSrvServiceName);
if (NULL == hAppLog)
{
hr = myHLastError();
_JumpError(hr, error, "RegisterEventSource");
}
if (!ReportEvent(
hAppLog,
wElogType,
0,
dwIdEvent,
NULL,
cStrings,
0,
const_cast<WCHAR const **>(apwszStrings),
NULL))
{
hr = myHLastError();
_JumpError(hr, error, "ReportEvent");
}
}
hr = S_OK;
error:
if (NULL != hAppLog)
{
DeregisterEventSource(hAppLog);
}
return(hr);
}
HRESULT
LogEventHResult(
IN DWORD dwEventType,
IN DWORD dwIdEvent,
IN HRESULT hrEvent)
{
HRESULT hr;
WCHAR const *apwsz[1];
WORD cpwsz;
WCHAR awchr[cwcHRESULTSTRING];
apwsz[0] = myGetErrorMessageText(hrEvent, TRUE);
cpwsz = ARRAYSIZE(apwsz);
if (NULL == apwsz[0])
{
apwsz[0] = myHResultToString(awchr, hrEvent);
}
hr = LogEvent(dwEventType, dwIdEvent, cpwsz, apwsz);
_JumpIfError(hr, error, "LogEvent");
error:
if (NULL != apwsz[0] && awchr != apwsz[0])
{
LocalFree(const_cast<WCHAR *>(apwsz[0]));
}
return(hr);
}
HRESULT
LogEventString(
IN DWORD dwEventType,
IN DWORD dwIdEvent,
OPTIONAL IN WCHAR const *pwszString)
{
return(LogEvent(
dwEventType,
dwIdEvent,
(WORD) (NULL == pwszString? 0 : 1),
NULL == pwszString? NULL : &pwszString));
}
HRESULT
LogEventStringHResult(
IN DWORD dwEventType,
IN DWORD dwIdEvent,
IN WCHAR const *pwszString,
IN HRESULT hrEvent)
{
return(LogEventStringArrayHResult(
dwEventType,
dwIdEvent,
1, // cStrings
&pwszString,
hrEvent));
}
HRESULT
LogEventStringArrayHResult(
IN DWORD dwEventType,
IN DWORD dwIdEvent,
IN DWORD cStrings,
IN WCHAR const * const *apwszStrings,
IN HRESULT hrEvent)
{
HRESULT hr;
WCHAR const *apwsz[10];
DWORD cpwsz;
WCHAR awchr[cwcHRESULTSTRING];
WCHAR const *pwszError = NULL;
CSASSERT(ARRAYSIZE(apwsz) > cStrings);
cpwsz = min(ARRAYSIZE(apwsz) - 1, cStrings);
CopyMemory(apwsz, apwszStrings, cpwsz * sizeof(apwsz[0]));
pwszError = myGetErrorMessageText(hrEvent, TRUE);
if (NULL == pwszError)
{
pwszError = myHResultToString(awchr, hrEvent);
}
apwsz[cpwsz] = pwszError;
cpwsz++;
hr = LogEvent(dwEventType, dwIdEvent, (WORD) cpwsz, apwsz);
_JumpIfError(hr, error, "LogEvent");
error:
if (NULL != pwszError && awchr != pwszError)
{
LocalFree(const_cast<WCHAR *>(pwszError));
}
return(hr);
}