mirror of https://github.com/lianthony/NT4.0
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.
199 lines
4.8 KiB
199 lines
4.8 KiB
/*++
|
|
|
|
Copyright (c) 1987-1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
report.c
|
|
|
|
Abstract:
|
|
|
|
Prints messages to the error log of Lan Manager.
|
|
|
|
Provides similar functionality to rplermsg.c in LANMAN 2.1 code.
|
|
|
|
Author:
|
|
|
|
Vladimir Z. Vulovic 27 - July - 1993
|
|
|
|
Environment:
|
|
|
|
User mode
|
|
|
|
Revision History :
|
|
|
|
--*/
|
|
|
|
#include "local.h"
|
|
#include "report.h"
|
|
|
|
VOID RplAlertRaise( IN DWORD ErrorCode);
|
|
|
|
|
|
VOID RplEnd( IN DWORD ErrorCode)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function is called under very unusual circumstances!
|
|
It provides a convenient way for service to log an event, send
|
|
an alert, then exits.
|
|
|
|
Arguments:
|
|
ErrorCode - termination error code
|
|
|
|
Return Value:
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
RplReportEvent( ErrorCode, NULL, 0, NULL );
|
|
RplAlertRaise( (RG_ServiceStatus.dwCurrentState == SERVICE_INSTALL_PENDING)
|
|
? NERR_RplBootStartFailed : NERR_RplBootServiceTerm);
|
|
(VOID)RplServiceAttemptStop(); // signal service to stop
|
|
}
|
|
|
|
|
|
|
|
VOID RplAlertRaise( IN DWORD ErrorCode)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Sends an ADMIN alert. The input is a LanManager error message.
|
|
|
|
This is a combination of the original Send_alert() routine &&
|
|
RaiseAlert() routine from logonsrv\server\error.c
|
|
|
|
Arguments:
|
|
ErrorCode - the alert to be raised, text in alertmsg.h
|
|
|
|
Return Value:
|
|
None.
|
|
|
|
Notes:
|
|
Failing to post an alert is considered unimportant. This is why this
|
|
function is VOID.
|
|
|
|
--*/
|
|
{
|
|
char message[ ALERTSZ + sizeof(STD_ALERT) + sizeof(ADMIN_OTHER_INFO)];
|
|
PSTD_ALERT alert = (PSTD_ALERT)message;
|
|
PADMIN_OTHER_INFO other = (PADMIN_OTHER_INFO)ALERT_OTHER_INFO( alert);
|
|
LARGE_INTEGER time;
|
|
HANDLE fileHandle;
|
|
DWORD inBytes;
|
|
DWORD outBytes;
|
|
|
|
NtQuerySystemTime( &time);
|
|
RtlTimeToSecondsSince1970( &time, &alert->alrt_timestamp );
|
|
|
|
// Original code used alrt_servicename == SERVICE_SERVER
|
|
wcscpy( alert->alrt_servicename, SERVICE_RIPL);
|
|
wcscpy( alert->alrt_eventname, ALERT_ADMIN_EVENT );
|
|
|
|
other->alrtad_errcode = ErrorCode;
|
|
other->alrtad_numstrings = 0;
|
|
|
|
|
|
// NetAlertRaise() is gone, must use mailslots instead. So, first
|
|
// open the Alerter mailslot to write to it.
|
|
|
|
fileHandle = CreateFile(
|
|
ALERTER_MAILSLOT,
|
|
GENERIC_WRITE,
|
|
FILE_SHARE_WRITE | FILE_SHARE_READ,
|
|
(LPSECURITY_ATTRIBUTES) NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
if ( fileHandle == INVALID_HANDLE_VALUE) {
|
|
RplDump( RG_DebugLevel & RPL_DEBUG_MISC,(
|
|
"AlertRaise: Error opening alerter mailslot, error=%d",
|
|
GetLastError()));
|
|
return;
|
|
}
|
|
|
|
inBytes = min( sizeof( message),
|
|
(DWORD)( (PCHAR)ALERT_VAR_DATA(other) - (PCHAR)message));
|
|
|
|
// Write alert notification to mailslot to be read by Alerter service
|
|
if ( !WriteFile(
|
|
fileHandle,
|
|
message,
|
|
inBytes,
|
|
&outBytes,
|
|
NULL) || inBytes != outBytes) {
|
|
|
|
RplDump( RG_DebugLevel & RPL_DEBUG_MISC,(
|
|
"AlertRaise: Error writing to alerter mailslot %d",
|
|
GetLastError()));
|
|
|
|
} else if ( ! CloseHandle( fileHandle)) {
|
|
|
|
RplDump( RG_DebugLevel & RPL_DEBUG_MISC,(
|
|
"AlertRaise: Error closing alerter mailslot %d",
|
|
GetLastError()
|
|
));
|
|
}
|
|
(VOID)CloseHandle( fileHandle);
|
|
}
|
|
|
|
|
|
|
|
VOID RplReportEventEx(
|
|
IN DWORD MessageId,
|
|
IN LPWSTR * aStrings
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Writes an event in the event log.
|
|
A related function lives is RplReportEvent() in lib\report.c.
|
|
These two functions should be united.
|
|
|
|
Arguments:
|
|
|
|
MessageId - Message ID
|
|
aStrings - a NULL terminated array of strings
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
WORD cStrings;
|
|
HANDLE logHandle;
|
|
|
|
logHandle = RegisterEventSource( NULL, RPL_EVENTLOG_NAME);
|
|
|
|
// If the event log cannot be opened, just return.
|
|
|
|
if ( logHandle == NULL) {
|
|
RplDump( ++RG_Assert, ("Error=%d", GetLastError()));
|
|
return;
|
|
}
|
|
|
|
for ( cStrings = 0; aStrings[ cStrings] != NULL; cStrings++) {
|
|
NOTHING;
|
|
}
|
|
|
|
if ( !ReportEvent(
|
|
logHandle,
|
|
EVENTLOG_ERROR_TYPE,
|
|
0, // event category
|
|
MessageId, // event id
|
|
NULL, // user SID. We're local system - uninteresting
|
|
cStrings, // number of strings
|
|
0, // raw data size
|
|
aStrings, // string array
|
|
NULL // raw data buffer
|
|
)) {
|
|
RplDump( ++RG_Assert, ( "Error=%d", GetLastError()));
|
|
}
|
|
|
|
DeregisterEventSource( logHandle);
|
|
}
|
|
|