//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999  Microsoft Corporation
// All rights reserved.
//
// File Name:
//      savenet.c
//
// Description:
//      Adds the appropriate settings to the output queue for each of the
//      Clients, Services and Protocols installed.
//
//----------------------------------------------------------------------------

#include "pch.h"
#include "allres.h"

//
// String constants
//

static const LPTSTR StrConstYes  = _T("Yes");
static const LPTSTR StrConstNo   = _T("No");
static const LPTSTR StrConstStar = _T("*");
static const LPTSTR StrComma     = _T(",");

//
// local prototypes
//

static VOID WriteOutCustomNetSettings( HWND );
static VOID WriteOutAppleTalkSettings( VOID );
static VOID WriteOutDlcProtocolSettings( VOID );
static VOID WriteOutFileAndPrintSharingSettings( VOID );
static VOID WriteOutIpxSettings( VOID );
static VOID WriteOutMSClientSettings( VOID );
static VOID WriteOutNetBeuiSettings( VOID );
static VOID WriteOutNetWareSettings( VOID );
static VOID WriteOutNetworkMonitorSettings( VOID );
static VOID WriteOutPacketSchedulingDriverSettings( VOID );
static VOID WriteOutSapAgentSettings( VOID );
static VOID WriteOutTcpipSettings( IN HWND hwnd );
static VOID WriteOutAdapterSpecificTcpipSettings( IN HWND hwnd,
                                                  IN TCHAR *szSectionName,
                                                  IN NETWORK_ADAPTER_NODE *pAdapter );

extern VOID NamelistToCommaString( IN NAMELIST* pNamelist, OUT TCHAR *szBuffer, IN DWORD cbSize);

//----------------------------------------------------------------------------
//
// Function: WriteOutNetSettings
//
// Purpose:  Writes out network settings
//
// Arguments:  IN HWND hwnd - handle to the dialog 
//
// Returns: VOID
//
//----------------------------------------------------------------------------
extern VOID 
WriteOutNetSettings( IN HWND hwnd ) {

    if( NetSettings.iNetworkingMethod == CUSTOM_NETWORKING ) {

        SettingQueue_AddSetting(_T("Networking"),
                                _T("InstallDefaultComponents"),
                                StrConstNo,
                                SETTING_QUEUE_ANSWERS);
        
        WriteOutCustomNetSettings( hwnd );
        
    }
    else {

        SettingQueue_AddSetting(_T("Networking"),
                                _T("InstallDefaultComponents"),
                                StrConstYes,
                                SETTING_QUEUE_ANSWERS);

    }

}

//----------------------------------------------------------------------------
//
// Function: WriteOutCustomNetSettings
//
// Purpose:  Add to the output queue the settings for each of the Clients,
//           Services and Protocols installed.
//
// Arguments: IN HWND hwnd - handle to the dialog
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID 
WriteOutCustomNetSettings( IN HWND hwnd ) {

    INT iCount;

    NETWORK_ADAPTER_NODE *pAdapter;
    NETWORK_COMPONENT *pNetComponent;

    TCHAR szAdapter[MAX_STRING_LEN] = _T("");
    TCHAR szParams[MAX_STRING_LEN]  = _T("");
   HRESULT hrPrintf;

    //
    //  Don't write out [NetAdapters] or params section on a sysprep because
    //  they aren't supported.
    //

    if( WizGlobals.iProductInstall != PRODUCT_SYSPREP )
    {

        for( pAdapter = NetSettings.NetworkAdapterHead, iCount = 1;
             pAdapter;
             pAdapter = pAdapter->next, iCount++ ) {

            hrPrintf=StringCchPrintf( szAdapter, AS(szAdapter), _T("Adapter%d"), iCount );

            hrPrintf=StringCchPrintf( szParams, AS(szParams), _T("params.%s"), szAdapter );

            SettingQueue_AddSetting( _T("NetAdapters"),
                                     szAdapter,
                                     szParams,
                                     SETTING_QUEUE_ANSWERS );

            //
            //  If more than 1 network adapter will be installed then we have
            //  to specify the Plug and Play IDs
            //
            if( NetSettings.iNumberOfNetworkCards > 1) {

                SettingQueue_AddSetting( szParams,
                                         _T("INFID"),
                                         pAdapter->szPlugAndPlayID,
                                         SETTING_QUEUE_ANSWERS );

            }

            szAdapter[0] = _T('\0');
            szParams[0]  = _T('\0');

        }

        if( NetSettings.iNumberOfNetworkCards == 1 ) {

            SettingQueue_AddSetting( _T("params.Adapter1"),
                                     _T("INFID"),
                                     StrConstStar,
                                     SETTING_QUEUE_ANSWERS );

        }

    }

    //
    //  Iterate over the Net list writing out settings for the
    //  installed components
    //

    for( pNetComponent = NetSettings.NetComponentsList;
         pNetComponent;
         pNetComponent = pNetComponent->next )
    {

        if( pNetComponent->bInstalled ) {

            //
            // find the appropriate function to call to write its settings
            //

            switch( pNetComponent->iPosition ) {

            case MS_CLIENT_POSITION:

                WriteOutMSClientSettings();

                break;
            
            case NETWARE_CLIENT_POSITION: 

                if( WizGlobals.iPlatform == PLATFORM_WORKSTATION || WizGlobals.iPlatform == PLATFORM_PERSONAL )
                {
                    WriteOutNetWareSettings();
                }

                break;

            case GATEWAY_FOR_NETWARE_POSITION:

                if( WizGlobals.iPlatform == PLATFORM_SERVER || WizGlobals.iPlatform == PLATFORM_ENTERPRISE || WizGlobals.iPlatform == PLATFORM_WEBBLADE)
                {
                    WriteOutNetWareSettings();
                }

                break;
            
            case FILE_AND_PRINT_SHARING_POSITION:

                WriteOutFileAndPrintSharingSettings();

                break;
            
            case PACKET_SCHEDULING_POSITION:

                WriteOutPacketSchedulingDriverSettings();

                break;

            case SAP_AGENT_POSITION:

                WriteOutSapAgentSettings();
                
                break;
            
            case APPLETALK_POSITION:

                WriteOutAppleTalkSettings();
                
                break;

            case DLC_POSITION: 

                WriteOutDlcProtocolSettings();
                
                break;
            
            case TCPIP_POSITION: 

                WriteOutTcpipSettings( hwnd );
                
                break;

            case NETBEUI_POSITION:

                WriteOutNetBeuiSettings();
                
                break;
            
            case NETWORK_MONITOR_AGENT_POSITION:

                WriteOutNetworkMonitorSettings();
                
                break;
            
            case IPX_POSITION:

                WriteOutIpxSettings();
                
                break;

            default:

                AssertMsg( FALSE,
                           "Bad case in Net Save switch block." );

            }

        }

    }

}

//----------------------------------------------------------------------------
//
// Function: WriteOutMSClientSettings
//
// Purpose:  Adds the settings for the Client for MS Networks to the 
//           output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID 
WriteOutMSClientSettings( VOID ) {


    LPTSTR lpNameServiceProvider        = _T("");
    LPTSTR lpNameServiceNetworkAddress  = _T("");

    SettingQueue_AddSetting( _T("NetClients"),
                             _T("MS_MSClient"),
                             _T("params.MS_MSClient"),
                             SETTING_QUEUE_ANSWERS );

    if( NetSettings.NameServiceProvider == MS_CLIENT_WINDOWS_LOCATOR )
    {
        lpNameServiceProvider = _T("");
    }
    else if( NetSettings.NameServiceProvider == MS_CLIENT_DCE_CELL_DIR_SERVICE )
    {
        lpNameServiceProvider = _T("ncacn_ip_tcp");

        lpNameServiceNetworkAddress = NetSettings.szNetworkAddress;
    }
    else
    {
        AssertMsg( FALSE,
                   "Invalid case for NameServiceProvider" );
    }
    
    SettingQueue_AddSetting( _T("params.MS_MSClient"),
                             _T("NameServiceProtocol"),
                             lpNameServiceProvider,
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_MSClient"),
                             _T("NameServiceNetworkAddress"),
                             lpNameServiceNetworkAddress,
                             SETTING_QUEUE_ANSWERS );


}

//----------------------------------------------------------------------------
//
// Function: WriteOutNetWareSettings
//
// Purpose:  Adds the settings for Netware to the output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID 
WriteOutNetWareSettings( VOID ) {

    LPTSTR lpPreferredServer  = _T("");
    LPTSTR lpDefaultTree      = _T("");
    LPTSTR lpDefaultContext   = _T("");
    LPTSTR lpLogonScript      = _T("");

    SettingQueue_AddSetting( _T("NetClients"),
                             _T("MS_NWClient"),
                             _T("params.MS_NWClient"),
                             SETTING_QUEUE_ANSWERS );

    if( NetSettings.bDefaultTreeContext ) {

        lpDefaultTree    = NetSettings.szDefaultTree;
        lpDefaultContext = NetSettings.szDefaultContext;

    }
    else {

        lpPreferredServer = NetSettings.szPreferredServer;

    }

    if( NetSettings.bNetwareLogonScript ) {

        lpLogonScript = StrConstYes;

    }
    else {

        lpLogonScript = StrConstNo;

    }

    SettingQueue_AddSetting( _T("params.MS_NWClient"),
                             _T("PreferredServer"),
                             lpPreferredServer,
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_NWClient"),
                             _T("DefaultTree"),
                             lpDefaultTree,
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_NWClient"),
                             _T("DefaultContext"),
                             lpDefaultContext,
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_NWClient"),
                             _T("LogonScript"),
                             lpLogonScript,
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: WriteOutFileAndPrintSharingSettings
//
// Purpose:  Adds the settings for File and Print Sharing to the output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID 
WriteOutFileAndPrintSharingSettings( VOID ) {

    SettingQueue_AddSetting( _T("NetServices"),
                             _T("MS_SERVER"),
                             _T("params.MS_SERVER"),
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_SERVER"),
                             _T(""),
                             _T(""),
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: WriteOutPacketSchedulingDriverSettings
//
// Purpose:  Adds the settings for the QoS Packet Scheduler to the
//           output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID 
WriteOutPacketSchedulingDriverSettings( VOID ) {

    SettingQueue_AddSetting( _T("NetServices"),
                             _T("MS_PSched"),
                             _T("params.MS_PSched"),
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_PSched"),
                             _T(""),
                             _T(""),
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: WriteOutSapAgentSettings
//
// Purpose:  Adds the settings for the SAP Agent to the output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID 
WriteOutSapAgentSettings( VOID )  {

    SettingQueue_AddSetting( _T("NetServices"),
                             _T("MS_NwSapAgent"),
                             _T("params.MS_NwSapAgent"),
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_NwSapAgent"),
                             _T(""),
                             _T(""),
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: WriteOutAppleTalkSettings
//
// Purpose:  Adds the settings for AppleTalk to the output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID 
WriteOutAppleTalkSettings( VOID ) {

    // ISSUE-2002/02/28-stelo- fill in the parameters, once I know what ones to use


    SettingQueue_AddSetting( _T("NetProtocols"),
                             _T("MS_AppleTalk"),
                             _T("params.MS_AppleTalk"),
                             SETTING_QUEUE_ANSWERS );

    /*
    SettingQueue_AddSetting( _T("params.MS_AppleTalk"),
                             _T("DefaultZone"),
                             NetSettings.szDefaultZone,
                             SETTING_QUEUE_ANSWERS );
    */


}

//----------------------------------------------------------------------------
//
// Function: WriteOutDlcProtocolSettings
//
// Purpose:  Adds the settings for the DLC protocol to the output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutDlcProtocolSettings( VOID ) {

    SettingQueue_AddSetting( _T("NetProtocols"),
                             _T("MS_DLC"),
                             _T("params.MS_DLC"),
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_DLC"),
                             _T(""),
                             _T(""),
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: WriteOutNetBeuiSettings
//
// Purpose:  Adds the settings for Net BEUI to the output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutNetBeuiSettings( VOID ) {

    SettingQueue_AddSetting( _T("NetProtocols"),
                             _T("MS_NetBEUI"),
                             _T("params.MS_NetBEUI"),
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_NetBEUI"),
                             _T(""),
                             _T(""),
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: WriteOutNetworkMonitorSettings
//
// Purpose:  Adds the settings for the Network Monitor to the output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID 
WriteOutNetworkMonitorSettings( VOID ) {

    SettingQueue_AddSetting( _T("NetProtocols"),
                             _T("MS_NetMon"),
                             _T("params.MS_NetMon"),
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_NetMon"),
                             _T(""),
                             _T(""),
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: WriteOutIpxSettings
//
// Purpose:  Adds the settings for the IPX protocol to the output queue.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutIpxSettings( VOID ) {

    INT iCount     = 0;
    INT iCharCount = 0;

    TCHAR szAdapterSectionsBuffer[MAX_INILINE_LEN] = _T("");
    TCHAR szAdapter[MAX_INILINE_LEN]               = _T("");
    TCHAR szParams[MAX_INILINE_LEN]                = _T("");

    NETWORK_ADAPTER_NODE *pAdapter;
    HRESULT hrCat;
    HRESULT hrPrintf;

    SettingQueue_AddSetting( _T("NetProtocols"),
                             _T("MS_NWIPX"),
                             _T("params.MS_NWIPX"),
                             SETTING_QUEUE_ANSWERS );

    SettingQueue_AddSetting( _T("params.MS_NWIPX"),
                             _T("VirtualNetworkNumber"),
                             NetSettings.szInternalNetworkNumber,
                             SETTING_QUEUE_ANSWERS );

    //
    //  Build up the AdapterSections string by iterating over the list and
    //  appending a string for each entry and then write out the IPX settings
    //  specific for that adapter
    //
    for( pAdapter = NetSettings.NetworkAdapterHead, iCount = 1;
         pAdapter;
         pAdapter = pAdapter->next, iCount++ ) {

        hrPrintf=StringCchPrintf( szParams, AS(szParams), _T("params.MS_NWIPX.Adapter%d"), iCount );
        iCharCount= lstrlen(szParams);

        //
        //  Break out of the for loop if there is no more room in the buffer
        //      - the +1 is to take into account the space the comma takes up
        //
        if( ( lstrlen( szAdapterSectionsBuffer ) + iCharCount + 1 ) >= MAX_INILINE_LEN ) {

            break;   

        }

        //
        //  Don't add the comma before the first item in the list
        //
        if( iCount != 1 ) {

            hrCat=StringCchCat( szAdapterSectionsBuffer, AS(szAdapterSectionsBuffer), StrComma );

        }

        hrCat=StringCchCat( szAdapterSectionsBuffer, AS(szAdapterSectionsBuffer), szParams );

        hrPrintf=StringCchPrintf( szAdapter, AS(szAdapter), _T("Adapter%d"), iCount );

        SettingQueue_AddSetting( szParams,
                                 _T("SpecificTo"),
                                 szAdapter,
                                 SETTING_QUEUE_ANSWERS );

        SettingQueue_AddSetting( szParams,
                                 _T("PktType"),
                                 pAdapter->szFrameType,
                                 SETTING_QUEUE_ANSWERS );

        SettingQueue_AddSetting( szParams,
                                 _T("NetworkNumber"),
                                 pAdapter->szNetworkNumber,
                                 SETTING_QUEUE_ANSWERS );

    }

    SettingQueue_AddSetting( _T("params.MS_NWIPX"),
                             _T("AdapterSections"),
                             szAdapterSectionsBuffer,
                             SETTING_QUEUE_ANSWERS );


}

//----------------------------------------------------------------------------
//
// Function: WriteOutTcpipSettings
//
// Purpose:  Adds the settings for TCPIP to the output queue.
//
// Arguments:  IN HWND hwnd - handle to the dialog 
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutTcpipSettings( IN HWND hwnd ) {

    LPTSTR lpDns;
    LPTSTR lpDomainNameDevolution;
    LPTSTR lpLmHosts;

    INT iCount;
    INT iCharCount;

    NETWORK_ADAPTER_NODE *pAdapter;

    TCHAR szBuffer[MAX_INILINE_LEN];

    TCHAR szAdapterSectionsBuffer[MAX_INILINE_LEN] = _T("");
    TCHAR szAdapter[MAX_INILINE_LEN]               = _T("");
    TCHAR szParams[MAX_INILINE_LEN]                = _T("");
    HRESULT hrCat;
    HRESULT hrPrintf;

    SettingQueue_AddSetting( _T("NetProtocols"),
                             _T("MS_TCPIP"),
                             _T("params.MS_TCPIP"),
                             SETTING_QUEUE_ANSWERS );

    //
    //  Write out if DNS is going to be configured automatically or if not,
    //  the actual IP addresses
    //
    if( NetSettings.bObtainDNSServerAutomatically ) {

        lpDns = StrConstYes;
 
    }
    else {

        lpDns = StrConstNo;

    }

    SettingQueue_AddSetting( _T("params.MS_TCPIP"),
                             _T("DNS"),            
                             lpDns,
                             SETTING_QUEUE_ANSWERS );

    //
    //  Write out the DNS suffix names
    //
    NamelistToCommaString( &NetSettings.TCPIP_DNS_Domains, szBuffer, AS(szBuffer) );

    SettingQueue_AddSetting( _T("params.MS_TCPIP"),
                             _T("DNSSuffixSearchOrder"),
                             szBuffer,
                             SETTING_QUEUE_ANSWERS );

    //
    //  Write out if we are using Domain Name Devolution or not
    //  (another name for "Include parent Domains"
    //
    if( NetSettings.bIncludeParentDomains ) {

        lpDomainNameDevolution = StrConstYes;

    }
    else {

        lpDomainNameDevolution = StrConstNo;

    }

    SettingQueue_AddSetting( _T("params.MS_TCPIP"),
                             _T("UseDomainNameDevolution"),
                             lpDomainNameDevolution,
                             SETTING_QUEUE_ANSWERS );

    //
    //    Write out if LM Hosts is enabled or not
    //
    if( NetSettings.bEnableLMHosts ) {

        lpLmHosts = StrConstYes;

    }
    else {

        lpLmHosts = StrConstNo;

    }

    SettingQueue_AddSetting( _T("params.MS_TCPIP"),
                             _T("EnableLMHosts"),
                             lpLmHosts,
                             SETTING_QUEUE_ANSWERS );

    //
    //  Setup for and write out the Adapter Specific TCP/IP Settings
    //
    for( pAdapter = NetSettings.NetworkAdapterHead, iCount = 1;
         pAdapter;
         pAdapter = pAdapter->next, iCount++ ) {

        hrPrintf=StringCchPrintf( szParams, AS(szParams), _T("params.MS_TCPIP.Adapter%d"), iCount );
        iCharCount= lstrlen(szParams);

        //
        //  Break out of the for loop if there is no more room in the buffer
        //      - the +1 is to take into account the space the comma takes up
        //
        if( ( lstrlen( szAdapterSectionsBuffer ) + iCharCount + 1 ) >= MAX_INILINE_LEN ) {

            break;   

        }

        //
        //  Don't add the comma before the first item in the list
        //
        if( iCount != 1) {

            hrCat=StringCchCat( szAdapterSectionsBuffer, AS(szAdapterSectionsBuffer), StrComma );

        }

        hrCat=StringCchCat( szAdapterSectionsBuffer, AS(szAdapterSectionsBuffer), szParams );

        hrPrintf=StringCchPrintf( szAdapter, AS(szAdapter), _T("Adapter%d"), iCount );

        SettingQueue_AddSetting( szParams,
                                 _T("SpecificTo"),
                                 szAdapter,
                                 SETTING_QUEUE_ANSWERS );


        WriteOutAdapterSpecificTcpipSettings( hwnd, szParams, pAdapter );


    }

    SettingQueue_AddSetting( _T("params.MS_TCPIP"),
                             _T("AdapterSections"),
                             szAdapterSectionsBuffer,
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: WriteOutAdapterSpecificTcpipSettings
//
// Purpose:  Writes out settings to the output queue that are specific to a 
//           particular network adapter.
//
// Arguments: IN HWND hwnd - handle to the dialog window
//            IN TCHAR *szSectionName - section name to write in settings under
//            IN NETWORK_ADAPTER_NODE *pAdapter - the network adapter that has
//                  the settings to write out
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutAdapterSpecificTcpipSettings( IN HWND hwnd,
                                      IN TCHAR *szSectionName,
                                      IN NETWORK_ADAPTER_NODE *pAdapter ) {

    INT nEntries;

    LPTSTR lpNetBios = NULL;

    TCHAR szIpAddresses[MAX_INILINE_LEN];
    TCHAR szSubnetMaskAddresses[MAX_INILINE_LEN];
    TCHAR szGatewayAddresses[MAX_INILINE_LEN];
    TCHAR szDnsAddresses[MAX_INILINE_LEN];
    TCHAR szWinsServerAddresses[MAX_INILINE_LEN];

    //
    //  Write out if we are using DHCP or not
    //     If we are not then write the IP, Subnet masks and Gateway
    //     IP addresses
    //

    if( pAdapter->bObtainIPAddressAutomatically ) {

        SettingQueue_AddSetting( szSectionName,
                                 _T("DHCP"),
                                 _T("Yes"),
                                 SETTING_QUEUE_ANSWERS );

    }
    else {

        SettingQueue_AddSetting( szSectionName,
                                 _T("DHCP"),
                                 _T("No"),
                                 SETTING_QUEUE_ANSWERS );

        //
        //  Write out the IP addresses
        //
        NamelistToCommaString( &pAdapter->Tcpip_IpAddresses,
                               szIpAddresses,
                               AS(szIpAddresses));

        SettingQueue_AddSetting( szSectionName,
                                 _T("IPAddress"),
                                 szIpAddresses,
                                 SETTING_QUEUE_ANSWERS );
        //
        //  Write out the Subnet Masks
        //
        NamelistToCommaString( &pAdapter->Tcpip_SubnetMaskAddresses, 
                               szSubnetMaskAddresses,
                               AS(szSubnetMaskAddresses));

        SettingQueue_AddSetting( szSectionName,
                                 _T("SubnetMask"),
                                 szSubnetMaskAddresses,
                                 SETTING_QUEUE_ANSWERS );

        //
        //  Write out the gateways
        //
        NamelistToCommaString( &pAdapter->Tcpip_GatewayAddresses, 
                               szGatewayAddresses,
                               AS(szGatewayAddresses));

        SettingQueue_AddSetting( szSectionName,
                                 _T("DefaultGateway"),
                                 szGatewayAddresses,
                                 SETTING_QUEUE_ANSWERS );

    }

    //
    //  Write out the DNS Server addresses
    //
    if( ! NetSettings.bObtainDNSServerAutomatically ) {

        NamelistToCommaString( &pAdapter->Tcpip_DnsAddresses, 
                               szDnsAddresses,
                               AS(szGatewayAddresses));

        SettingQueue_AddSetting( szSectionName,
                                 _T("DNSServerSearchOrder"),
                                 szDnsAddresses,
                                 SETTING_QUEUE_ANSWERS );

    }

    //
    //  Write out if we are using WINS or not
    //

    nEntries = GetNameListSize( &pAdapter->Tcpip_WinsAddresses );

    // ISSUE-2002/02/28-stelo- is this the correct way of detecting if we are using WINS
    //       or not, just checking to see if they added anything in the
    //       list box?

    if( nEntries == 0 ) {

        SettingQueue_AddSetting( szSectionName,
                                 _T("WINS"),
                                 _T("No"),
                                 SETTING_QUEUE_ANSWERS );

    }
    else {

        SettingQueue_AddSetting( szSectionName,
                                 _T("WINS"),
                                 _T("Yes"),
                                 SETTING_QUEUE_ANSWERS );

        NamelistToCommaString( &pAdapter->Tcpip_WinsAddresses, 
                               szWinsServerAddresses,
                               AS(szWinsServerAddresses));

        SettingQueue_AddSetting( szSectionName,
                                 _T("WinsServerList"),
                                 szWinsServerAddresses,
                                 SETTING_QUEUE_ANSWERS );
            
    }

    //
    //    Write out the NetBIOS option
    //
    switch( pAdapter->iNetBiosOption ) {

        case 0:  lpNetBios = _T("0"); break;  // Use value generated by DHCP
        case 1:  lpNetBios = _T("1"); break;  // Enable NetBIOS over TCP/IP
        case 2:  lpNetBios = _T("2"); break;  // Disable NetBIOS over TCP/IP
        default: AssertMsg( FALSE,
                            "Bad case in Net BIOS switch" );

    }

    if ( lpNetBios )
    {
        SettingQueue_AddSetting( szSectionName,
                                 _T("NetBIOSOptions"),
                                 lpNetBios,
                                 SETTING_QUEUE_ANSWERS );
    }

    //
    //    Write out the DNS Domain name
    //

    SettingQueue_AddSetting( szSectionName,
                             _T("DNSDomain"),
                             pAdapter->szDNSDomainName,
                             SETTING_QUEUE_ANSWERS );

}

//----------------------------------------------------------------------------
//
// Function: NamelistToCommaString
//
// Purpose:  takes the elements of a Namelist and concatenates them together
//           into a string with each element separated by a comma
//
//           For instance, the namelist 1->2->3->4 becomes the string 1,2,3,4
//
//           it does NOT preserve the string inside of szBuffer
//
//           assumes szBuffer is of size MAX_INILINE_LEN
//
// Arguments: 
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID
NamelistToCommaString( IN NAMELIST* pNamelist, OUT TCHAR *szBuffer, IN DWORD cbSize ) {

    INT i;
    INT nEntries;
    TCHAR *pString;
    HRESULT hrCat;

    szBuffer[0] = _T('\0');

    nEntries = GetNameListSize( pNamelist );

    for( i = 0; i < nEntries; i++ ) {

        //
        //  Separate entries by a comma (but leave it off the first one)
        //
        if( i != 0 ) {

            hrCat=StringCchCat( szBuffer, cbSize, StrComma );

        }
    
        //
        //  Get the new string
        //
        pString = GetNameListName( pNamelist, i );

        //
        //  Append the IP string to the buffer
        //
        hrCat=StringCchCat( szBuffer, cbSize, pString );
    
    }

}