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