/*++ 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 // 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); }