296 lines
6.8 KiB
C
296 lines
6.8 KiB
C
/*++
|
||
|
||
Copyright (c) 1991-92 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
alconfig.c
|
||
|
||
Abstract:
|
||
|
||
This module contains the Alerter service configuration routines.
|
||
|
||
Author:
|
||
|
||
Rita Wong (ritaw) 16-July-1991
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "alconfig.h"
|
||
#include <tstr.h> // STRCPY(), etc.
|
||
|
||
STATIC
|
||
NET_API_STATUS
|
||
AlGetLocalComputerName(
|
||
VOID
|
||
);
|
||
|
||
//-------------------------------------------------------------------//
|
||
// //
|
||
|
||
// Global variables //
|
||
// //
|
||
//-------------------------------------------------------------------//
|
||
|
||
//
|
||
// Alert names
|
||
//
|
||
LPSTR AlertNamesA; // For inclusion into message text (space-separated)
|
||
LPTSTR AlertNamesW; // For sending message to (NULL-separated)
|
||
|
||
//
|
||
// Local computer name
|
||
//
|
||
LPSTR AlLocalComputerNameA;
|
||
LPTSTR AlLocalComputerNameW;
|
||
|
||
|
||
|
||
NET_API_STATUS
|
||
AlGetAlerterConfiguration(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine reads in alerter configuration info which is the alert names.
|
||
If a failure occurs, or alert names could not be found, the error is
|
||
logged but it will not prevent the Alerter service from starting up.
|
||
|
||
Arguments:
|
||
|
||
AlUicCode - Supplies the termination code to the Service Controller.
|
||
|
||
Return Value:
|
||
|
||
NERR_Success or error getting the computer name.
|
||
|
||
--*/
|
||
{
|
||
NET_API_STATUS status;
|
||
LPNET_CONFIG_HANDLE AlerterSection;
|
||
LPTSTR UnicodeAlertNames;
|
||
LPSTR AnsiAlertNames;
|
||
#ifdef UNICODE
|
||
LPSTR Name; // for conversion from Unicode to ANSI
|
||
#endif
|
||
DWORD AlertNamesSize;
|
||
LPWSTR SubString[1];
|
||
TCHAR StatusString[25];
|
||
|
||
|
||
AlertNamesA = NULL;
|
||
AlertNamesW = NULL;
|
||
|
||
//
|
||
// Get the computer name.
|
||
//
|
||
if ((status = AlGetLocalComputerName()) != NERR_Success) {
|
||
return status;
|
||
}
|
||
|
||
//
|
||
// Open config file and get handle to the Alerter section
|
||
//
|
||
if ((status = NetpOpenConfigData(
|
||
&AlerterSection,
|
||
NULL, // local server
|
||
SECT_NT_ALERTER,
|
||
TRUE // read-only
|
||
)) != NERR_Success) {
|
||
NetpKdPrint(("[Alerter] Could not open config section %lu\n", status));
|
||
|
||
SubString[0] = ultow(status, StatusString, 10);
|
||
AlLogEvent(
|
||
NELOG_Build_Name,
|
||
1,
|
||
SubString
|
||
);
|
||
return NO_ERROR;
|
||
}
|
||
|
||
//
|
||
// Get the alert names from the configuration file
|
||
//
|
||
if ((status = NetpGetConfigTStrArray(
|
||
AlerterSection,
|
||
|
||
ALERTER_KEYWORD_ALERTNAMES,
|
||
&AlertNamesW // alloc and set ptr
|
||
)) != NERR_Success) {
|
||
NetpKdPrint(("[Alerter] Could not get alert names %lu\n", status));
|
||
|
||
SubString[0] = ultow(status, StatusString, 10);
|
||
AlLogEvent(
|
||
NELOG_Build_Name,
|
||
1,
|
||
SubString
|
||
);
|
||
|
||
AlertNamesW = NULL;
|
||
goto CloseConfigFile;
|
||
}
|
||
|
||
AlertNamesSize = NetpTStrArraySize(AlertNamesW) / sizeof(TCHAR) * sizeof(CHAR);
|
||
|
||
if ((AlertNamesA = (LPSTR) LocalAlloc(
|
||
LMEM_ZEROINIT,
|
||
AlertNamesSize
|
||
)) == NULL) {
|
||
NetpKdPrint(("[Alerter] Error allocating AlertNamesA %lu\n", GetLastError()));
|
||
NetApiBufferFree(AlertNamesW);
|
||
AlertNamesW = NULL;
|
||
goto CloseConfigFile;
|
||
}
|
||
|
||
AnsiAlertNames = AlertNamesA;
|
||
UnicodeAlertNames = AlertNamesW;
|
||
|
||
//
|
||
// Canonicalize alert names, and convert the unicode names to ANSI
|
||
//
|
||
while (*UnicodeAlertNames != TCHAR_EOS) {
|
||
|
||
AlCanonicalizeMessageAlias(UnicodeAlertNames);
|
||
|
||
#ifdef UNICODE
|
||
Name = NetpAllocStrFromWStr(UnicodeAlertNames);
|
||
if (Name != NULL) {
|
||
(void) strcpy(AnsiAlertNames, Name);
|
||
AnsiAlertNames += (strlen(AnsiAlertNames) + 1);
|
||
}
|
||
(void) NetApiBufferFree(Name);
|
||
#else
|
||
(void) strcpy(AnsiAlertNames, UnicodeAlertNames);
|
||
AnsiAlertNames += (strlen(AnsiAlertNames) + 1);
|
||
#endif
|
||
|
||
UnicodeAlertNames += (STRLEN(UnicodeAlertNames) + 1);
|
||
}
|
||
|
||
|
||
//
|
||
// Substitute the NULL terminators, which separate the alert names,
|
||
// in AlertNamesA with spaces. There's a space after the last alert
|
||
// name.
|
||
//
|
||
AnsiAlertNames = AlertNamesA;
|
||
while (*AnsiAlertNames != AL_NULL_CHAR) {
|
||
AnsiAlertNames = strchr(AnsiAlertNames, AL_NULL_CHAR);
|
||
*AnsiAlertNames++ = AL_SPACE_CHAR;
|
||
}
|
||
|
||
CloseConfigFile:
|
||
(void) NetpCloseConfigData( AlerterSection );
|
||
|
||
//
|
||
// Errors from reading AlertNames should be ignored so we always
|
||
// return success here.
|
||
//
|
||
return NERR_Success;
|
||
}
|
||
|
||
|
||
STATIC
|
||
NET_API_STATUS
|
||
AlGetLocalComputerName(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function gets the local computer name and stores both the ANSI
|
||
and Unicode versions of it.
|
||
|
||
Arguments:
|
||
|
||
None. Sets the global pointers AlLocalComputerNameA and
|
||
AlLocalComputerNameW.
|
||
|
||
Return Value:
|
||
|
||
NERR_Success or error getting the local computer name.
|
||
|
||
--*/
|
||
{
|
||
NET_API_STATUS status;
|
||
|
||
|
||
AlLocalComputerNameA = NULL;
|
||
AlLocalComputerNameW = NULL;
|
||
|
||
if ((status = NetpGetComputerName(
|
||
&AlLocalComputerNameW
|
||
)) != NERR_Success) {
|
||
AlLocalComputerNameW = NULL;
|
||
return status;
|
||
}
|
||
|
||
AlCanonicalizeMessageAlias(AlLocalComputerNameW);
|
||
|
||
//
|
||
// Convert the computer name into ANSI
|
||
//
|
||
#ifdef UNICODE
|
||
AlLocalComputerNameA = NetpAllocStrFromWStr(AlLocalComputerNameW);
|
||
|
||
if (AlLocalComputerNameA == NULL) {
|
||
status = ERROR_NOT_ENOUGH_MEMORY;
|
||
}
|
||
#else
|
||
status = NetApiBufferAllocate(
|
||
STRSIZE(AlLocalComputerNameW),
|
||
&AlLocalComputerNameA
|
||
);
|
||
if (status == NERR_Success) {
|
||
(void) strcpy(AlLocalComputerNameA, AlLocalComputerNameW);
|
||
}
|
||
else {
|
||
AlLocalComputerNameA = NULL;
|
||
}
|
||
#endif
|
||
|
||
return status;
|
||
}
|
||
|
||
|
||
VOID
|
||
AlLogEvent(
|
||
DWORD MessageId,
|
||
DWORD NumberOfSubStrings,
|
||
LPWSTR *SubStrings
|
||
)
|
||
{
|
||
HANDLE LogHandle;
|
||
|
||
|
||
LogHandle = RegisterEventSourceW (
|
||
NULL,
|
||
SERVICE_ALERTER
|
||
);
|
||
|
||
if (LogHandle == NULL) {
|
||
NetpKdPrint(("[Alerter] RegisterEventSourceW failed %lu\n",
|
||
GetLastError()));
|
||
return;
|
||
}
|
||
|
||
(void) ReportEventW(
|
||
LogHandle,
|
||
EVENTLOG_ERROR_TYPE,
|
||
0, // event category
|
||
MessageId,
|
||
(PSID) NULL, // no SID
|
||
(WORD)NumberOfSubStrings,
|
||
0,
|
||
SubStrings,
|
||
(PVOID) NULL
|
||
);
|
||
|
||
DeregisterEventSource(LogHandle);
|
||
}
|