windows-nt/Source/XPSP1/NT/ds/dns/dnsapi/event.c
2020-09-26 16:20:57 +08:00

171 lines
3.6 KiB
C

/*++
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
event.c
Abstract:
DNS event logging.
Author:
Ramv June-02-1997
Revision History:
--*/
#include "local.h"
#define DNSAPI_LOG_SOURCE (L"DnsApi")
//
// Globals to suppress event logging
//
DWORD g_TimeLastDnsEvent = 0;
DWORD g_DnsEventCount = 0;
#define DNS_EVENTS_MAX_COUNT (5)
#define DNS_EVENT_LOG_BLOCK_INTERVAL (1800) // 30 minutes
VOID
DnsLogEvent(
IN DWORD MessageId,
IN WORD EventType,
IN DWORD NumberOfSubStrings,
IN LPSTR * SubStrings,
IN DWORD ErrorCode
)
{
HANDLE logHandle;
DWORD dataLength = 0;
PVOID pdata = NULL;
//
// protect against log spin
//
// we'll allow a few events to log, then slam the door for
// a while to avoid filling event log
//
// note: none of these protection structures are MT safe, but
// there's no issue here, the failure mode is allowing an additional
// log entry or denying one that should now be allowed; I don't
// believe there's any failure mode that permanently turns logging
// to always on or always off
//
if ( g_DnsEventCount > DNS_EVENTS_MAX_COUNT )
{
DWORD currentTime = Dns_GetCurrentTimeInSeconds();
if ( g_TimeLastDnsEvent + DNS_EVENT_LOG_BLOCK_INTERVAL > currentTime )
{
DNS_PRINT((
"DNSAPI: Refusing event logging!\n"
"\tevent count = %d\n"
"\tlast time = %d\n"
"\tcurrent time = %d\n",
g_DnsEventCount,
g_TimeLastDnsEvent,
currentTime ));
return;
}
// interval has elapsed, clear counters and continue logging
g_DnsEventCount = 0;
}
#if 0
//
// open event log -- if haven't already
//
// DCR_PERF: better to just open this and close on process detach?
// will be open for services (maybe netlogon) but not much else
//
if ( !g_DnsEventlogHandle )
{
HANDLE hlog;
hlog = RegisterEventSourceW(
NULL,
DNSAPI_LOG_SOURCE
);
if ( hlog == NULL )
{
DNS_PRINT(("DNSAPI : RegisterEventSourceA failed %lu\n",
GetLastError()));
return;
}
g_DnsEventlogHandle = hlog;
}
#endif
//
// open event log
//
logHandle = RegisterEventSourceW(
NULL,
DNSAPI_LOG_SOURCE
);
if ( logHandle == NULL )
{
DNS_PRINT(("DNSAPI : RegisterEventSourceA failed %lu\n",
GetLastError()));
return;
}
//
// log the event
// - get ptr and sizeof data
//
if ( ErrorCode != NO_ERROR )
{
dataLength = sizeof(DWORD);
pdata = (PVOID) &ErrorCode;
}
//
// DCR_FIX0: event logging should be unicode
//
ReportEventA(
logHandle,
EventType,
0, // event category
MessageId,
(PSID) NULL,
(WORD) NumberOfSubStrings,
dataLength,
(LPSTR *)SubStrings,
pdata );
DeregisterEventSource( logHandle );
//
// successful logging spin protection
// - inc count
// - if at max, save last logging time
//
if ( ++g_DnsEventCount >= DNS_EVENTS_MAX_COUNT )
{
g_TimeLastDnsEvent = Dns_GetCurrentTimeInSeconds();
}
}
//
// End of event.c
//