2025-04-27 07:49:33 -04:00

290 lines
6.3 KiB
C++

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
Dfseventlog.cxx
Abstract:
This module defines APIs for logging events.
Author:
Rohan Phillips (Rohanp) 31-March-2001
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <dfsheader.h>
#define DFS_EVENT_SOURCE_SYSTEM_PATH_PREFIX \
"System\\CurrentControlSet\\Services\\EventLog\\System\\"
#define DFS_EVENT_SOURCE_APPLICATION_PATH_PREFIX \
"System\\CurrentControlSet\\Services\\EventLog\\Application\\"
DFSSTATUS
DfsAddEventSourceToRegistry(void)
{
DFSSTATUS Status = ERROR_SUCCESS;
DWORD dwData = 0;
HKEY hkEventSource = NULL;
CHAR szBuf[100];
// Add source name as a subkey under the Application
// key in the EventLog registry key.
if (RegCreateKeyA(HKEY_LOCAL_MACHINE,
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\system\\DfsSvc", &hkEventSource))
{
Status = GetLastError();
goto Exit;
}
// Set the name of the message file.
strcpy(szBuf, "%SystemRoot%\\System\\dfssvc.exe");
// Add the name to the EventMessageFile subkey.
if (RegSetValueExA(hkEventSource, // subkey handle
"EventMessageFile", // value name
0, // must be zero
REG_EXPAND_SZ, // value type
(LPBYTE) szBuf, // pointer to value data
strlen(szBuf) + 1)) // length of value data
{
Status = GetLastError();
goto Exit;
}
// Set the supported event types in the TypesSupported subkey.
dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE |
EVENTLOG_INFORMATION_TYPE;
if (RegSetValueExA(hkEventSource, // subkey handle
"TypesSupported", // value name
0, // must be zero
REG_DWORD, // value type
(LPBYTE) &dwData, // pointer to value data
sizeof(DWORD))) // length of value data
{
Status = GetLastError();
goto Exit;
}
Exit:
if(hkEventSource)
{
RegCloseKey(hkEventSource);
}
return Status;
}
//
// Unregister your event source in the registry.
//
// Parameters:
// szEventSource - the name of the eventsource
//
DFSSTATUS
DfsRemoveEventSourceFromRegistry(void)
{
DFSSTATUS Status = ERROR_SUCCESS;
// delete the key and its values
Status = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\EventLog\\system\\DfsSvc");
return Status;
}
HANDLE
DfsOpenEventLog(void)
{
DFSSTATUS Status = ERROR_SUCCESS;
HANDLE EventLogHandle = NULL;
EventLogHandle = RegisterEventSource( NULL, L"DfsSvc");
if (EventLogHandle == NULL )
{
Status = GetLastError();
}
return EventLogHandle;
}
DFSSTATUS
DfsCloseEventLog(HANDLE EventLogHandle)
{
DFSSTATUS Status = ERROR_SUCCESS;
BOOL fSuccess = TRUE;
if ( EventLogHandle != NULL)
{
fSuccess = DeregisterEventSource(EventLogHandle);
if ( !fSuccess)
{
Status = GetLastError();
}
}
return Status;
}
DFSSTATUS
DfsLogEventEx(IN DWORD idMessage,
IN WORD wEventType,
IN WORD cSubstrings,
IN LPCTSTR *rgszSubstrings,
IN DWORD errCode)
{
DFSSTATUS Status = ERROR_SUCCESS;
HANDLE EventLogHandle = NULL;
void *pRawData = NULL;
DWORD cbRawData = 0;
//
// Also include errCode in raw data form
// where people can view it from EventViewer
//
if (errCode != 0) {
cbRawData = sizeof(errCode);
pRawData = &errCode;
}
EventLogHandle = DfsOpenEventLog();
if(EventLogHandle != NULL)
{
//
// log the event
//
if (!ReportEvent(EventLogHandle,
wEventType,
0,
idMessage,
NULL,
cSubstrings,
cbRawData,
rgszSubstrings,
pRawData))
{
Status = GetLastError();
}
DfsCloseEventLog(EventLogHandle);
}
return Status;
}
DFSSTATUS
DFsLogEvent(IN DWORD idMessage,
IN const TCHAR * ErrorString,
IN DWORD ErrCode)
{
DFSSTATUS Status = ERROR_SUCCESS;
WORD wEventType = 0;
const TCHAR * apszSubStrings[2];
apszSubStrings[0] = ErrorString;
if ( NT_INFORMATION( idMessage))
{
wEventType = EVENTLOG_INFORMATION_TYPE;
}
else if ( NT_WARNING( idMessage))
{
wEventType = EVENTLOG_WARNING_TYPE;
}
else
{
wEventType = EVENTLOG_ERROR_TYPE;
}
Status = DfsLogEventEx(idMessage,
wEventType,
1,
apszSubStrings,
ErrCode);
return Status;
}
//usage:
// const TCHAR * apszSubStrings[4];
// apszSubStrings[0] = L"Root1";
// DfsLogDfsEvent(DFS_ERROR_ROOT_DELETION_FAILURE,
// 1,
// apszSubStrings,
// errorcode);
//
//
DFSSTATUS
DfsLogDfsEvent(IN DWORD idMessage,
IN WORD cSubStrings,
IN const TCHAR * apszSubStrings[],
IN DWORD ErrCode)
{
DFSSTATUS Status = ERROR_SUCCESS;
WORD wEventType = 0;
if ( NT_INFORMATION( idMessage))
{
wEventType = EVENTLOG_INFORMATION_TYPE;
}
else if ( NT_WARNING( idMessage))
{
wEventType = EVENTLOG_WARNING_TYPE;
}
else
{
wEventType = EVENTLOG_ERROR_TYPE;
}
Status = DfsLogEventEx(idMessage,
wEventType,
cSubStrings,
apszSubStrings,
ErrCode);
return Status;
}
void
DfsLogEventSimple(DWORD MessageId, DWORD ErrorCode=0)
{
DfsLogDfsEvent(MessageId, 0, NULL, ErrorCode);
}