/*++ 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 //