/*++ Copyright (c) 1987-1992 Microsoft Corporation Module Name: parse.c Abstract: Routine to parse the command line. Author: Ported from Lan Man 2.0 Environment: User mode only. Contains NT-specific code. Requires ANSI C extensions: slash-slash comments, long external names. Revision History: 01-Aug-1991 (cliffv) Ported to NT. Converted to NT style. 09-May-1992 JohnRo Enable use of win32 registry. Use net config helpers for NetLogon. Fixed UNICODE bug handling debug file name. Use equates. --*/ // // Common include files. // #include // Include files common to entire service #include // net config helpers. #include // USE_WIN32_CONFIG (if defined), etc. #include // SECTION_ equates, NETLOGON_KEYWORD_ equates. #include // NetApiBufferFree(). #include // NERR_ equates. #include // SERVICE_NETLOGON. #include // SERVICE_UIC codes are defined here #include // PREFIX_ equates. #include // NetpNCopy{type}To{type}. // // Include files specific to this .c file // #include // DEFAULT_, MIN_, and MAX_ equates. #include // C library functions (rand, etc) #include // strnicmp #include // NetpCopy... NET_API_STATUS NlParseOne( IN LPNET_CONFIG_HANDLE SectionHandle, IN LPWSTR Keyword, IN ULONG DefaultValue, IN ULONG MinimumValue, IN ULONG MaximumValue, OUT PULONG Value ) /*++ Routine Description: Get a single numeric parameter from the netlogon section of the registry. Arguments: SectionHandle - Handle into the registry. Keyword - Name of the value to read. DefaultValue - Default value if parameter doesn't exist. MinimumValue - Minumin valid value. MaximumValue - Maximum valid value. Value - Returns the value parsed. Return Value: Status of the operation --*/ { NET_API_STATUS NetStatus; LPWSTR ValueT = NULL; // // Determine if the value is specified in the registry at all. // NetStatus = NetpGetConfigValue ( SectionHandle, Keyword, &ValueT ); if( ValueT != NULL ) { NetApiBufferFree( ValueT ); ValueT = NULL; } // // If the value wasn't specified, // use the default. // if ( NetStatus == NERR_CfgParamNotFound ) { *Value = DefaultValue; // // If the value was specifed, // get it from the registry. // } else { NetStatus = NetpGetConfigDword ( SectionHandle, Keyword, // keyword wanted DefaultValue, Value ); if (NetStatus == NO_ERROR) { if ( *Value > MaximumValue || *Value < MinimumValue ) { LPWSTR MsgStrings[1]; MsgStrings[0] = Keyword; NlpWriteEventlog( SERVICE_UIC_BADPARMVAL, EVENTLOG_WARNING_TYPE, (LPBYTE)Value, sizeof(*Value), MsgStrings, 1 ); if ( *Value > MaximumValue ) { *Value = MaximumValue; } else if ( *Value < MinimumValue ) { *Value = MinimumValue; } } } else { return NetStatus; } } return NERR_Success; } // // Table of numeric parameters to parse. // struct { LPWSTR Keyword; ULONG DefaultValue; ULONG MinimumValue; ULONG MaximumValue; PULONG Value; } ParseTable[] = { { NETLOGON_KEYWORD_PULSE, DEFAULT_PULSE, MIN_PULSE, MAX_PULSE, &NlGlobalPulseParameter }, { NETLOGON_KEYWORD_RANDOMIZE, DEFAULT_RANDOMIZE, MIN_RANDOMIZE, MAX_RANDOMIZE, &NlGlobalRandomizeParameter }, { NETLOGON_KEYWORD_PULSEMAXIMUM, DEFAULT_PULSEMAXIMUM, MIN_PULSEMAXIMUM, MAX_PULSEMAXIMUM, &NlGlobalPulseMaximumParameter }, { NETLOGON_KEYWORD_PULSECONCURRENCY, DEFAULT_PULSECONCURRENCY, MIN_PULSECONCURRENCY, MAX_PULSECONCURRENCY, &NlGlobalPulseConcurrencyParameter }, { NETLOGON_KEYWORD_PULSETIMEOUT1, DEFAULT_PULSETIMEOUT1, MIN_PULSETIMEOUT1, MAX_PULSETIMEOUT1, &NlGlobalPulseTimeout1Parameter }, { NETLOGON_KEYWORD_PULSETIMEOUT2, DEFAULT_PULSETIMEOUT2, MIN_PULSETIMEOUT2, MAX_PULSETIMEOUT2, &NlGlobalPulseTimeout2Parameter }, { NETLOGON_KEYWORD_GOVERNOR, DEFAULT_GOVERNOR, MIN_GOVERNOR, MAX_GOVERNOR, &NlGlobalGovernorParameter }, { NETLOGON_KEYWORD_MAXIMUMMAILSLOTMESSAGES, DEFAULT_MAXIMUMMAILSLOTMESSAGES, MIN_MAXIMUMMAILSLOTMESSAGES, MAX_MAXIMUMMAILSLOTMESSAGES, &NlGlobalMaximumMailslotMessagesParameter }, { NETLOGON_KEYWORD_MAILSLOTMESSAGETIMEOUT, DEFAULT_MAILSLOTMESSAGETIMEOUT, MIN_MAILSLOTMESSAGETIMEOUT, MAX_MAILSLOTMESSAGETIMEOUT, &NlGlobalMailslotMessageTimeoutParameter }, { NETLOGON_KEYWORD_MAILSLOTDUPLICATETIMEOUT,DEFAULT_MAILSLOTDUPLICATETIMEOUT,MIN_MAILSLOTDUPLICATETIMEOUT,MAX_MAILSLOTDUPLICATETIMEOUT,&NlGlobalMailslotDuplicateTimeoutParameter }, { NETLOGON_KEYWORD_EXPECTEDDIALUPDELAY, DEFAULT_EXPECTEDDIALUPDELAY, MIN_EXPECTEDDIALUPDELAY, MAX_EXPECTEDDIALUPDELAY, &NlGlobalExpectedDialupDelayParameter }, { NETLOGON_KEYWORD_SCAVENGEINTERVAL, DEFAULT_SCAVENGEINTERVAL, MIN_SCAVENGEINTERVAL, MAX_SCAVENGEINTERVAL, &NlGlobalScavengeIntervalParameter }, #if DBG { NETLOGON_KEYWORD_DBFLAG, 0, 0, 0xFFFFFFFF, &NlGlobalTrace }, { NETLOGON_KEYWORD_MAXIMUMLOGFILESIZE, DEFAULT_MAXIMUM_LOGFILE_SIZE, 0, 0xFFFFFFFF, &NlGlobalLogFileMaxSize }, #endif // DBG }; // // Table of boolean to parse. // struct { LPWSTR Keyword; BOOL DefaultValue; PBOOL Value; } BoolParseTable[] = { { NETLOGON_KEYWORD_UPDATE, DEFAULT_SYNCHRONIZE, &NlGlobalSynchronizeParameter }, { NETLOGON_KEYWORD_DISABLEPASSWORDCHANGE, DEFAULT_DISABLE_PASSWORD_CHANGE, &NlGlobalDisablePasswordChangeParameter }, { NETLOGON_KEYWORD_REFUSEPASSWORDCHANGE, DEFAULT_REFUSE_PASSWORD_CHANGE, &NlGlobalRefusePasswordChangeParameter }, }; BOOL Nlparse( VOID ) /*++ Routine Description: Get parameters from registry. All of the parameters are described in iniparm.h. Arguments: None. Return Value: TRUE -- iff the parse was successful. --*/ { NET_API_STATUS NetStatus; LPWSTR ValueT = NULL; LPWSTR Keyword = NULL; ULONG i; // // Variables for scanning the configuration data. // LPNET_CONFIG_HANDLE SectionHandle = NULL; // // Open the NetLogon configuration section. // NetStatus = NetpOpenConfigData( &SectionHandle, NULL, // no server name. #if defined(USE_WIN32_CONFIG) SERVICE_NETLOGON, #else SECT_NT_NETLOGON, // section name #endif TRUE ); // we only want readonly access if ( NetStatus != NO_ERROR ) { SectionHandle = NULL; NlExit(SERVICE_UIC_BADPARMVAL, NetStatus, LogError, NULL ); goto Cleanup; } // // Loop parsing all the numeric parameters. // for ( i=0; i