windows-nt/Source/XPSP1/NT/base/ntsetup/opktools/setupmgr/common/savefile.c
2020-09-26 16:20:57 +08:00

1598 lines
47 KiB
C

//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
// All rights reserved.
//
// File Name:
// savefile.c
//
// Description:
// The wizard pages plug in here to get there settings queued to
// the answer file. We read the globals in setupmgr.h and figure
// out what needs to be written or deleted.
//
//----------------------------------------------------------------------------
#include "pch.h"
#include "allres.h"
#include "encrypt.h"
#include "optcomp.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
//
// NTRAID#NTBUG9-551746-2002/02/27-stelo,swamip - Unused code, should be removed
//
static VOID WriteOutOemBootFiles( VOID );
static VOID WriteOutMassStorageDrivers( VOID );
static VOID WriteOutTapiSettings(VOID);
static VOID WriteOutRegionalSettings(VOID);
static VOID WriteOutRemoteInstallSettings(VOID);
static VOID WriteOutIeSettings(VOID);
//
// Call out to savenet.c to save the network settings
//
extern VOID WriteOutNetSettings( HWND );
//----------------------------------------------------------------------------
//
// Function: QueueSettingsToAnswerFile
//
// Purpose: This function looks at the global structs that dlgprocs
// have been scribbling into and queues up all the settings
// in preparation to be written out to disk.
//
// This function is called by the SaveScript page indirectly.
// See common\save.c for details.
//
// The answer file queue (and the .udf queue) is initialized
// with the original settings in the answer file loaded near
// the beginning of the wizard.
//
// Ensure that you clear settings that should not be present
// in the answer file.
//
// Arguments: VOID
//
// Returns: BOOL
//
//----------------------------------------------------------------------------
BOOL
QueueSettingsToAnswerFile(HWND hwnd)
{
TCHAR *lpValue;
TCHAR Buffer[MAX_INILINE_LEN];
HRESULT hrPrintf;
//
// Create each of the sections in the order we want them to appear
// in the outputed answer file.
//
SettingQueue_AddSetting(
_T("Data"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("SetupData"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("Unattended"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("GuiUnattended"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("UserData"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("Display"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("LicenseFilePrintData"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("TapiLocation"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("RegionalSettings"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("MassStorageDrivers"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("OEMBootFiles"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("OEM_Ads"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(
_T("SetupMgr"), _T(""), _T(""), SETTING_QUEUE_ANSWERS);
// Let networking go last, then remaining RIS sections
//
// Set the UnattendMode
//
lpValue = _T("");
//
// Don't write out the Unattend Mode on a sysprep
//
if( WizGlobals.iProductInstall != PRODUCT_SYSPREP ) {
switch ( GenSettings.iUnattendMode ) {
case UMODE_GUI_ATTENDED: lpValue = _T("GuiAttended"); break;
case UMODE_PROVIDE_DEFAULT: lpValue = _T("ProvideDefault"); break;
case UMODE_DEFAULT_HIDE: lpValue = _T("DefaultHide"); break;
case UMODE_READONLY: lpValue = _T("ReadOnly"); break;
case UMODE_FULL_UNATTENDED: lpValue = _T("FullUnattended"); break;
default:
AssertMsg(FALSE, "Bad case for UnattendMode");
break;
}
}
SettingQueue_AddSetting(_T("Unattended"),
_T("UnattendMode"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// Skip the EULA if they said 'yes' on the EULA page
//
if( GenSettings.bSkipEulaAndWelcome ) {
SettingQueue_AddSetting(_T("Unattended"),
_T("OemSkipEula"),
StrConstYes,
SETTING_QUEUE_ANSWERS);
}
//
// Write out OemPreInstall depending how user answer StandAlone page
//
if( WizGlobals.iProductInstall == PRODUCT_REMOTEINSTALL )
lpValue = StrConstNo;
else if( WizGlobals.iProductInstall == PRODUCT_SYSPREP )
lpValue = _T("");
else
lpValue = WizGlobals.bStandAloneScript ? StrConstNo : StrConstYes;
SettingQueue_AddSetting(_T("Unattended"),
_T("OemPreinstall"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// Write out the PnpDriver path that was computed in adddirs.c
//
SettingQueue_AddSetting(_T("Unattended"),
_T("OemPnPDriversPath"),
WizGlobals.OemPnpDriversPath,
SETTING_QUEUE_ANSWERS);
if( WizGlobals.iProductInstall == PRODUCT_SYSPREP )
{
TCHAR szDrive[MAX_PATH];
TCHAR szSysprepPath[MAX_PATH] = _T("");
ExpandEnvironmentStrings( _T("%SystemDrive%"),
szDrive,
MAX_PATH );
// Note-ConcatenatePaths truncates to prevent overflow
ConcatenatePaths( szSysprepPath,
szDrive,
_T("\\sysprep\\i386"),
NULL );
SettingQueue_AddSetting(_T("Unattended"),
_T("InstallFilesPath"),
szSysprepPath,
SETTING_QUEUE_ANSWERS);
}
//
// Don't write out the AutoPartition, MsDosInitiated and the
// UnattendedInstall keys on a sysprep install.
//
if( WizGlobals.iProductInstall != PRODUCT_SYSPREP )
{
SettingQueue_AddSetting(_T("Data"),
_T("AutoPartition"),
_T("1"),
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Data"),
_T("MsDosInitiated"),
_T("\"0\""),
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Data"),
_T("UnattendedInstall"),
_T("\"Yes\""),
SETTING_QUEUE_ANSWERS);
}
//
// Product ID
//
Buffer[0] = _T('\0');
if ( GenSettings.ProductId[0][0] != _T('\0') ) {
hrPrintf=StringCchPrintf(Buffer, AS(Buffer),
_T("%s-%s-%s-%s-%s"),
GenSettings.ProductId[0],
GenSettings.ProductId[1],
GenSettings.ProductId[2],
GenSettings.ProductId[3],
GenSettings.ProductId[4]);
}
SettingQueue_AddSetting(_T("UserData"),
_T("ProductKey"),
Buffer,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("UserData"),
_T("ProductId"),
NULLSTR,
SETTING_QUEUE_ANSWERS);
//
// Username & org
//
{
TCHAR szName[MAX_PATH],
szOrg[MAX_PATH];
hrPrintf=StringCchPrintf(szName, AS(szName), _T("\"%s\""), GenSettings.UserName);
hrPrintf=StringCchPrintf(szOrg, AS(szOrg), _T("\"%s\""), GenSettings.Organization);
SettingQueue_AddSetting(_T("UserData"),
_T("FullName"),
szName,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("UserData"),
_T("OrgName"),
szOrg,
SETTING_QUEUE_ANSWERS);
}
#ifdef OPTCOMP
//
// Write out the windows component settings only if doing an unattended installation
//
if ( WizGlobals.iProductInstall == PRODUCT_UNATTENDED_INSTALL )
{
DWORD dwIndex;
BOOL bInstallComponent = FALSE;
// Iterate through each component and determine if we should install
//
for (dwIndex=0;dwIndex<AS(s_cComponent);dwIndex++)
{
// Determine if the component should be installed and write out proper setting
//
bInstallComponent = (GenSettings.dwWindowsComponents & s_cComponent[dwIndex].dwComponent) ? TRUE : FALSE;
SettingQueue_AddSetting(_T("Components"), s_cComponent[dwIndex].lpComponentString, (bInstallComponent ? _T("On") : _T("Off")), SETTING_QUEUE_ANSWERS);
}
}
#endif
//
// Write out IE settings
//
WriteOutIeSettings();
//
// Set the [LicenseFilePrintData] section.
//
// Note that we'll allow changing product type between workstation and
// server on an edit, so be sure to clear these settings in case we're
// changing from server to workstation.
//
{
TCHAR *pAutoMode = _T("");
TCHAR *pAutoUsers = _T("");
if ( WizGlobals.iPlatform == PLATFORM_SERVER || WizGlobals.iPlatform == PLATFORM_ENTERPRISE || WizGlobals.iPlatform == PLATFORM_WEBBLADE) {
if ( GenSettings.bPerSeat ) {
pAutoMode = _T("PerSeat");
} else {
pAutoMode = _T("PerServer");
hrPrintf=StringCchPrintf(Buffer, AS(Buffer), _T("%d"), GenSettings.NumConnections);
pAutoUsers = Buffer;
}
}
SettingQueue_AddSetting(_T("LicenseFilePrintData"),
_T("AutoMode"),
pAutoMode,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("LicenseFilePrintData"),
_T("AutoUsers"),
pAutoUsers,
SETTING_QUEUE_ANSWERS);
}
//
// Computer name(s).
//
// ComputerName=* means setup should autogenerate a name
//
{
INT nEntries = GetNameListSize(&GenSettings.ComputerNames);
INT i;
LPTSTR pName;
//
// Figure out computername setting. Make sure it is not present
// in the case of multiple computer names.
//
if ( (GenSettings.bAutoComputerName && GenSettings.Organization[0]) || ( nEntries > 1 ) )
pName = StrConstStar;
else if ( nEntries == 1 )
pName = GetNameListName(&GenSettings.ComputerNames, 0);
else
pName = _T("");
SettingQueue_AddSetting(_T("UserData"),
_T("ComputerName"),
pName,
SETTING_QUEUE_ANSWERS);
//
// If multiple computer names, we need to queue the proper settings
// to the .udf.
//
// ISSUE-2002/02/27-stelo -Should read the .udf instead of saving in [SetupMgr]
//
// Here is a sample udf
// [UniqueIds]
// foo0=UserData
// foo1=UserData
//
// [foo0:UserData]
// ComputerName=foo0
//
// [foo1:UserData]
// ComputerName=foo1
//
if ( nEntries > 1 ) {
for ( i=0; i<nEntries; i++ ) {
pName = GetNameListName(&GenSettings.ComputerNames, i);
hrPrintf=StringCchPrintf(Buffer, AS(Buffer), _T("ComputerName%d"), i);
SettingQueue_AddSetting(_T("SetupMgr"),
Buffer,
pName,
SETTING_QUEUE_ANSWERS);
//
// Write the UniqueIds entry to the udf
//
SettingQueue_AddSetting(_T("UniqueIds"),
pName,
_T("UserData"),
SETTING_QUEUE_UDF);
//
// Now write the foo0:UserData section for this pName
//
hrPrintf=StringCchPrintf(Buffer, AS(Buffer), _T("%s:UserData"), pName);
SettingQueue_AddSetting(Buffer,
_T("ComputerName"),
pName,
SETTING_QUEUE_UDF);
}
}
}
//
// Targetpath
//
if ( GenSettings.iTargetPath == TARGPATH_WINNT )
lpValue = _T("\\WINDOWS");
else if ( GenSettings.iTargetPath == TARGPATH_SPECIFY )
lpValue = GenSettings.TargetPath;
else if ( GenSettings.iTargetPath == TARGPATH_AUTO )
lpValue = StrConstStar;
else
lpValue = _T("");
SettingQueue_AddSetting(_T("Unattended"),
_T("TargetPath"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// Write out the HAL to be used
//
// ISSUE-2002/02/27-stelo -There are spaces in the friendly name so it gets quoted but I assume
// the ,OEM has to be outside the quotes
if( GenSettings.szHalFriendlyName[0] != _T('\0') ) {
hrPrintf=StringCchPrintf( Buffer, AS(Buffer), _T("\"%s\",OEM"), GenSettings.szHalFriendlyName );
SettingQueue_AddSetting(_T("Unattended"),
_T("ComputerType"),
Buffer,
SETTING_QUEUE_ANSWERS);
}
WriteOutMassStorageDrivers();
WriteOutOemBootFiles();
//
// Write out OEM Ads Logo and Background bitmaps
//
if ( ! (lpValue = MyGetFullPath( GenSettings.lpszLogoBitmap ) ) )
lpValue = _T("");
SettingQueue_AddSetting(_T("OEM_Ads"),
_T("Logo"),
lpValue,
SETTING_QUEUE_ANSWERS);
if ( ! (lpValue = MyGetFullPath( GenSettings.lpszBackgroundBitmap ) ) )
lpValue = _T("");
SettingQueue_AddSetting(_T("OEM_Ads"),
_T("Background"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// Admin password
//
if ( GenSettings.bSpecifyPassword )
{
if ( GenSettings.AdminPassword[0] )
{
lpValue = GenSettings.AdminPassword;
// See if we should encrypt the admin password
if (GenSettings.bEncryptAdminPassword)
{
TCHAR owfPwd[STRING_ENCODED_PASSWORD_SIZE];
if (StringEncodeOwfPassword (lpValue, owfPwd, NULL))
{
lpValue = (LPTSTR) owfPwd;
}
else
{
// Error Case. Popup up a message box asking if the user
// wants to continue using an non-encrypted password
int iRet = ReportErrorId(hwnd,
MSGTYPE_YESNO,
IDS_ERR_PASSWORD_ENCRYPT_FAILED);
if ( iRet == IDYES )
{
GenSettings.bEncryptAdminPassword = FALSE;
}
else
{
SetLastError(ERROR_CANCELLED);
return FALSE;
}
}
}
// Now make sure that the password is surrounded by quotes (if it hasn't been encrypted)
//
if (!GenSettings.bEncryptAdminPassword)
{
TCHAR szTemp[MAX_PASSWORD + 3]; // +3 is for surrounding quotes and terminating '\0"
lstrcpyn(szTemp, GenSettings.AdminPassword,AS(szTemp));
hrPrintf=StringCchPrintf(GenSettings.AdminPassword,AS(GenSettings.AdminPassword), _T("\"%s\""), szTemp);
}
}
else
{
lpValue = StrConstStar; // blank password
GenSettings.bEncryptAdminPassword = FALSE; // Cannot encrypt a blank password
}
}
else
{
lpValue = _T(""); // prompt user
GenSettings.bEncryptAdminPassword = FALSE; // Cannot encrypt nothing
}
SettingQueue_AddSetting(_T("GuiUnattended"),
_T("AdminPassword"),
lpValue,
SETTING_QUEUE_ANSWERS);
// set the value in the answer file indicating that
// state of the admin password
SettingQueue_AddSetting(_T("GuiUnattended"),
_T("EncryptedAdminPassword"),
GenSettings.bEncryptAdminPassword ? _T("Yes") : _T("NO"),
SETTING_QUEUE_ANSWERS);
{
TCHAR *lpAutoLogonCount;
if( GenSettings.bAutoLogon )
{
lpValue = StrConstYes;
hrPrintf=StringCchPrintf( Buffer, AS(Buffer), _T("%d"), GenSettings.nAutoLogonCount );
lpAutoLogonCount = Buffer;
}
else
{
lpValue = _T("");
lpAutoLogonCount= _T("");
}
SettingQueue_AddSetting(_T("GuiUnattended"),
_T("AutoLogon"),
lpValue,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("GuiUnattended"),
_T("AutoLogonCount"),
lpAutoLogonCount,
SETTING_QUEUE_ANSWERS);
}
//
// Write out whether to show Regional Settings pages in NT setup
//
lpValue = _T("");
//
// If they didn't do advanced pages and
//
if( ! WizGlobals.bDoAdvancedPages ) {
if( GenSettings.iUnattendMode == UMODE_FULL_UNATTENDED ) {
lpValue = _T("1");
}
}
else {
switch( GenSettings.iRegionalSettings ) {
case REGIONAL_SETTINGS_NOT_SPECIFIED:
AssertMsg(FALSE, "User went to the regional settings page but regional settings data never got set.");
break;
case REGIONAL_SETTINGS_SKIP:
lpValue = _T("0");
break;
case REGIONAL_SETTINGS_DEFAULT:
case REGIONAL_SETTINGS_SPECIFY:
lpValue = _T("1");
break;
default:
AssertMsg(FALSE, "Bad case for Regional Settings");
break;
}
}
SettingQueue_AddSetting(_T("GuiUnattended"),
_T("OEMSkipRegional"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// Write out Sysprep OEM Duplicator string
//
lpValue = _T("");
if ( WizGlobals.iProductInstall == PRODUCT_SYSPREP )
lpValue = GenSettings.szOemDuplicatorString;
SettingQueue_AddSetting(_T("GuiUnattended"),
_T("OEMDuplicatorstring"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// Display settings
//
lpValue = _T("");
if ( GenSettings.DisplayColorBits >= 0 ) {
hrPrintf=StringCchPrintf(Buffer, AS(Buffer), _T("%d"), GenSettings.DisplayColorBits);
lpValue = Buffer;
}
SettingQueue_AddSetting(_T("Display"),
_T("BitsPerPel"),
lpValue,
SETTING_QUEUE_ANSWERS);
lpValue = _T("");
if ( GenSettings.DisplayXResolution >= 0 ) {
hrPrintf=StringCchPrintf(Buffer, AS(Buffer), _T("%d"), GenSettings.DisplayXResolution);
lpValue = Buffer;
}
SettingQueue_AddSetting(_T("Display"),
_T("Xresolution"),
lpValue,
SETTING_QUEUE_ANSWERS);
lpValue = _T("");
if ( GenSettings.DisplayYResolution >= 0 ) {
hrPrintf=StringCchPrintf(Buffer, AS(Buffer), _T("%d"), GenSettings.DisplayYResolution);
lpValue = Buffer;
}
SettingQueue_AddSetting(_T("Display"),
_T("YResolution"),
lpValue,
SETTING_QUEUE_ANSWERS);
lpValue = _T("");
if ( GenSettings.DisplayRefreshRate >= 0 ) {
hrPrintf=StringCchPrintf(Buffer, AS(Buffer), _T("%d"), GenSettings.DisplayRefreshRate);
lpValue = Buffer;
}
SettingQueue_AddSetting(_T("Display"),
_T("Vrefresh"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// RunOnce commands
//
{
TCHAR szCommandLineBuffer[MAX_INILINE_LEN + 1];
INT nEntries = GetNameListSize(&GenSettings.RunOnceCmds);
INT i;
LPTSTR pName;
for ( i=0; i<nEntries; i++ )
{
hrPrintf=StringCchPrintf(Buffer,AS(Buffer), _T("Command%d"), i);
pName = GetNameListName(&GenSettings.RunOnceCmds, i);
//
// Force the command line to always be quoted
//
hrPrintf=StringCchPrintf( szCommandLineBuffer,AS(szCommandLineBuffer), _T("\"%s\""), pName );
SettingQueue_AddSetting(_T("GuiRunOnce"),
Buffer,
pName,
SETTING_QUEUE_ANSWERS);
}
}
//
// Timezone
//
// Must handle the case that the user never went to the timezone page
//
if ( GenSettings.TimeZoneIdx == TZ_IDX_UNDEFINED )
{
if ( WizGlobals.iProductInstall == PRODUCT_REMOTEINSTALL )
GenSettings.TimeZoneIdx = TZ_IDX_SETSAMEASSERVER;
else
GenSettings.TimeZoneIdx = TZ_IDX_DONOTSPECIFY;
}
if( GenSettings.TimeZoneIdx == TZ_IDX_SETSAMEASSERVER )
lpValue = _T("%TIMEZONE%");
else if ( GenSettings.TimeZoneIdx == TZ_IDX_DONOTSPECIFY )
lpValue = _T("");
else {
hrPrintf=StringCchPrintf(Buffer, AS(Buffer),_T("%d"), GenSettings.TimeZoneIdx);
lpValue = Buffer;
}
SettingQueue_AddSetting(_T("GuiUnattended"),
_T("TimeZone"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// Skip the Welcome page if they said 'yes' on the EULA page
//
if( GenSettings.bSkipEulaAndWelcome ) {
SettingQueue_AddSetting(_T("GuiUnattended"),
_T("OemSkipWelcome"),
_T("1"),
SETTING_QUEUE_ANSWERS);
}
//
// Write out the distribution share to the [SetupMgr] section so
// that we remember it on an edit.
//
if( WizGlobals.bStandAloneScript ) {
lpValue = _T("");
}
else {
lpValue = WizGlobals.DistFolder;
}
SettingQueue_AddSetting(_T("SetupMgr"),
_T("DistFolder"),
lpValue,
SETTING_QUEUE_ANSWERS);
lpValue = !WizGlobals.bStandAloneScript ? WizGlobals.DistShareName : _T("");
SettingQueue_AddSetting(_T("SetupMgr"),
_T("DistShare"),
lpValue,
SETTING_QUEUE_ANSWERS);
//
// Write out [Identification] section
//
{
LPTSTR lpWorkgroup = _T("");
LPTSTR lpDomain = _T("");
LPTSTR lpAdmin = _T("");
LPTSTR lpPassword = _T("");
if( WizGlobals.iProductInstall == PRODUCT_REMOTEINSTALL ) {
lpDomain = _T("%MACHINEDOMAIN%");
} else if ( NetSettings.bWorkgroup ) {
lpWorkgroup = NetSettings.WorkGroupName;
} else {
lpDomain = NetSettings.DomainName;
if ( NetSettings.bCreateAccount ) {
lpAdmin = NetSettings.DomainAccount;
lpPassword = NetSettings.DomainPassword;
}
}
SettingQueue_AddSetting(_T("Identification"),
_T("JoinWorkgroup"),
lpWorkgroup,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Identification"),
_T("JoinDomain"),
lpDomain,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Identification"),
_T("DomainAdmin"),
lpAdmin,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Identification"),
_T("DomainAdminPassword"),
lpPassword,
SETTING_QUEUE_ANSWERS);
}
//
// Write out network settings
//
WriteOutNetSettings( hwnd );
//
// TAPI and regional settings
//
WriteOutTapiSettings();
WriteOutRegionalSettings();
//
// Write out the remaining RIS specific settings
//
if( WizGlobals.iProductInstall == PRODUCT_REMOTEINSTALL ) {
WriteOutRemoteInstallSettings();
}
return TRUE;
}
//
// NTRAID#NTBUG9-551746-2002/02/27-stelo,swamip - Unused code, should be removed
//
//----------------------------------------------------------------------------
//
// Function: WriteOutMassStorageDrivers
//
// Purpose:
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutMassStorageDrivers( VOID ) {
INT i;
TCHAR *lpValue;
INT iEntries = GetNameListSize( &GenSettings.MassStorageDrivers );
for( i = 0; i < iEntries; i++ ) {
lpValue = GetNameListName( &GenSettings.MassStorageDrivers, i );
SettingQueue_AddSetting(_T("MassStorageDrivers"),
lpValue,
_T("OEM"),
SETTING_QUEUE_ANSWERS);
}
}
//
// NTRAID#NTBUG9-551746-2002/02/27-stelo,swamip - Unused code, should be removed
//
//----------------------------------------------------------------------------
//
// Function: WriteOutOemBootFiles
//
// Purpose: Write out OEM Boot files (this includes the filenames for the
// HAL and SCSI drivers)
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutOemBootFiles( VOID ) {
INT i;
TCHAR *lpValue;
INT iHalEntries = GetNameListSize( &GenSettings.OemHalFiles );
INT iScsiEntries = GetNameListSize( &GenSettings.OemScsiFiles );
if( iHalEntries != 0 || iScsiEntries != 0 ) {
//
// Write out the txtsetup.oem file
//
SettingQueue_AddSetting(_T("OEMBootFiles"),
_T(""),
OEM_TXTSETUP_NAME,
SETTING_QUEUE_ANSWERS);
//
// Write out all the HAL and SCSI files
//
for( i = 0; i < iHalEntries; i++ ) {
lpValue = GetNameListName( &GenSettings.OemHalFiles, i );
SettingQueue_AddSetting(_T("OEMBootFiles"),
_T(""),
lpValue,
SETTING_QUEUE_ANSWERS);
}
for( i = 0; i < iScsiEntries; i++ ) {
lpValue = GetNameListName( &GenSettings.OemScsiFiles, i );
SettingQueue_AddSetting(_T("OEMBootFiles"),
_T(""),
lpValue,
SETTING_QUEUE_ANSWERS);
}
}
}
//----------------------------------------------------------------------------
//
// Function: WriteOutTapiSettings
//
// Purpose: Queue up the remaining settings that need to be in the
// answerfile tapi settings.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutTapiSettings( VOID ) {
TCHAR Buffer[MAX_INILINE_LEN];
TCHAR *lpValue;
HRESULT hrPrintf;
//
// Set or clear the country code. If user selected DONTSPECIFY, be
// sure the setting is removed.
//
Buffer[0] = _T('\0');
if( GenSettings.dwCountryCode != DONTSPECIFYSETTING )
{
hrPrintf=StringCchPrintf(Buffer, AS(Buffer),_T("%d"), GenSettings.dwCountryCode);
}
SettingQueue_AddSetting(_T("TapiLocation"),
_T("CountryCode"),
Buffer,
SETTING_QUEUE_ANSWERS);
//
// Set or clear the dialing method. Make sure it is cleared if "Don't
// specify setting" was selected.
//
if ( GenSettings.iDialingMethod == TONE )
lpValue = _T("Tone");
else if ( GenSettings.iDialingMethod == PULSE )
lpValue = _T("Pulse");
else
lpValue = _T("");
SettingQueue_AddSetting( _T("TapiLocation"),
_T("Dialing"),
lpValue,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("TapiLocation"),
_T("AreaCode"),
GenSettings.szAreaCode,
SETTING_QUEUE_ANSWERS );
Buffer[0] = _T('\0');
if( GenSettings.szOutsideLine[0] != _T('\0') )
{
hrPrintf=StringCchPrintf( Buffer,AS(Buffer), _T("\"%s\""), GenSettings.szOutsideLine );
}
SettingQueue_AddSetting( _T("TapiLocation"),
_T("LongDistanceAccess"),
Buffer,
SETTING_QUEUE_ANSWERS );
}
//----------------------------------------------------------------------------
//
// Function: WriteOutRegionalSettings
//
// Purpose: Queue up the remaining settings that need to be in the
// answerfile regional settings.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutRegionalSettings( VOID ) {
TCHAR Buffer[MAX_INILINE_LEN] = _T("");
LPTSTR lpLanguageGroup = _T("");
LPTSTR lpLanguage = _T("");
LPTSTR lpSystemLocale = _T("");
LPTSTR lpUserLocale = _T("");
LPTSTR lpInputLocale = _T("");
if( GenSettings.iRegionalSettings == REGIONAL_SETTINGS_SPECIFY ) {
if( GenSettings.bUseCustomLocales ) {
lpSystemLocale = GenSettings.szMenuLanguage;
lpUserLocale = GenSettings.szNumberLanguage;
lpInputLocale = GenSettings.szKeyboardLayout;
}
else {
lpLanguage = GenSettings.szLanguage;
}
}
if( GetNameListSize( &GenSettings.LanguageGroups ) > 0 ) {
NamelistToCommaString( &GenSettings.LanguageGroups, Buffer, AS(Buffer) );
lpLanguageGroup = Buffer;
}
SettingQueue_AddSetting(_T("RegionalSettings"),
_T("LanguageGroup"),
lpLanguageGroup,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("RegionalSettings"),
_T("Language"),
lpLanguage,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("RegionalSettings"),
_T("SystemLocale"),
lpSystemLocale,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("RegionalSettings"),
_T("UserLocale"),
lpUserLocale,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("RegionalSettings"),
_T("InputLocale"),
lpInputLocale,
SETTING_QUEUE_ANSWERS);
}
//----------------------------------------------------------------------------
//
// Function: WriteOutRemoteInstallSettings
//
// Purpose: Queue up the remaining settings that need to be in the
// answerfile for a remote install to work.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
//
// Some long string constants used by this function
//
#define RIS_ORISRC _T("\"\\\\%SERVERNAME%\\RemInst\\%INSTALLPATH%\"")
#define RIS_SRCDEVICE _T("\"\\Device\\LanmanRedirector\\") \
_T("%SERVERNAME%\\RemInst\\%INSTALLPATH%\"")
#define RIS_LAUNCHFILE _T("\"%INSTALLPATH%\\%MACHINETYPE%\\templates\\startrom.com\"")
static VOID
WriteOutRemoteInstallSettings(VOID)
{
SettingQueue_AddSetting(_T("Data"),
_T("floppyless"),
_T("\"1\""),
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Data"),
_T("msdosinitiated"),
_T("\"1\""),
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Data"),
_T("OriSrc"),
RIS_ORISRC,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Data"),
_T("OriTyp"),
_T("\"4\""),
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Data"),
_T("LocalSourceOnCD"),
_T("1"),
SETTING_QUEUE_ANSWERS);
//
// [SetupData] section. This section is only written out if RIS.
//
SettingQueue_AddSetting(_T("SetupData"),
_T("OsLoadOptions"),
_T("/noguiboot /fastdetect"),
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("SetupData"),
_T("SetupSourceDevice"),
RIS_SRCDEVICE,
SETTING_QUEUE_ANSWERS);
//
// Write some RIS specific settings to [Unattended]. Only write settings
// that QueueSettingsToAnswerFile() does not write.
//
// RIS requires these settings to be present in the .sif and requires
// them to have a fixed value. We will not preserve the value we read
// on an edit (in case user changed it by hand).
//
SettingQueue_AddSetting(_T("Unattended"),
_T("FileSystem"),
_T("LeaveAlone"),
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Unattended"),
_T("NtUpgrade"),
StrConstNo,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Unattended"),
_T("OverwriteOemFilesOnUpgrade"),
StrConstNo,
SETTING_QUEUE_ANSWERS);
//
// Additional settings for
// [RemoteInstall]
// [Display]
// [Networking]
// [Identification]
// [OSChooser]
//
SettingQueue_AddSetting(_T("RemoteInstall"),
_T("Repartition"),
StrConstYes,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Networking"),
_T("ProcessPageSections"),
StrConstYes,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("Identification"),
_T("DoOldStyleDomainJoin"),
StrConstYes,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("OSChooser"),
_T("Description"),
GenSettings.szSifDescription,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("OSChooser"),
_T("Help"),
GenSettings.szSifHelpText,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("OSChooser"),
_T("LaunchFile"),
RIS_LAUNCHFILE,
SETTING_QUEUE_ANSWERS);
SettingQueue_AddSetting(_T("OSChooser"),
_T("ImageType"),
_T("Flat"),
SETTING_QUEUE_ANSWERS);
}
//
// Write out the IE Favorites
//
static VOID
WriteOutIeFavorites( VOID )
{
INT nEntries = GetNameListSize( &GenSettings.Favorites );
INT i;
INT iEntryNumber;
LPTSTR pFriendlyName;
LPTSTR pWebAddress;
TCHAR Key[MAX_INILINE_LEN + 1];
TCHAR Value[MAX_INILINE_LEN + 1];
HRESULT hrPrintf;
// ISSUE-2002/02/27-stelo - make sure to clear the entries if they are no favorites
for( i = 0; i < nEntries; i = i + 2 )
{
iEntryNumber = ( i / 2 ) + 1;
pFriendlyName = GetNameListName( &GenSettings.Favorites, i );
pWebAddress = GetNameListName( &GenSettings.Favorites, i + 1 );
hrPrintf=StringCchPrintf( Key,AS(Key),
_T("Title%d"),
iEntryNumber );
//
// Always quote the friendly name
//
hrPrintf=StringCchPrintf( Value,AS(Value),
_T("\"%s.url\""),
pFriendlyName );
SettingQueue_AddSetting( _T("FavoritesEx"),
Key,
Value,
SETTING_QUEUE_ANSWERS );
hrPrintf=StringCchPrintf( Key,AS(Key),
_T("URL%d"),
iEntryNumber );
//
// Always quote the web address
//
hrPrintf=StringCchPrintf( Value,AS(Value),
_T("\"%s\""),
pWebAddress );
SettingQueue_AddSetting( _T("FavoritesEx"),
Key,
Value,
SETTING_QUEUE_ANSWERS );
}
}
static LPTSTR
AllocateAddressPortString( LPTSTR lpszAddressString, LPTSTR lpszPortString )
{
LPTSTR lpszAddressPortString;
int iAddressPortStringLen;
HRESULT hrCat;
iAddressPortStringLen=(lstrlen(lpszAddressString) + lstrlen(lpszPortString) + 2);
lpszAddressPortString = MALLOC(iAddressPortStringLen * sizeof(TCHAR) );
if ( lpszAddressPortString )
{
lstrcpyn( lpszAddressPortString, lpszAddressString, iAddressPortStringLen);
if ( *lpszPortString )
{
hrCat=StringCchCat( lpszAddressPortString, iAddressPortStringLen, _T(":") );
hrCat=StringCchCat( lpszAddressPortString, iAddressPortStringLen, lpszPortString );
}
}
return lpszAddressPortString;
}
//----------------------------------------------------------------------------
//
// Function: WriteOutIeSettings
//
// Purpose: Queue up the answerfile settings for IE.
//
// Arguments: VOID
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID
WriteOutIeSettings( VOID )
{
LPTSTR lpIeBrandingFile = _T("");
LPTSTR lpAutoConfig = _T("");
LPTSTR lpAutoConfigUrl = _T("");
LPTSTR lpAutoConfigUrlJscript = _T("");
LPTSTR lpUseProxyServer = _T("");
LPTSTR lpUseSameProxyForAllProtocols = _T("");
LPTSTR lpProxyExceptions = _T("");
LPTSTR lpHomePage = _T("");
LPTSTR lpHelpPage = _T("");
LPTSTR lpSearchPage = _T("");
LPTSTR lpHttpProxy = NULL;
LPTSTR lpSecureProxy = NULL;
LPTSTR lpFtpProxy = NULL;
LPTSTR lpGopherProxy = NULL;
LPTSTR lpSocksProxy = NULL;
LPTSTR lpUseUnattendFileForBranding = _T("Yes");
HRESULT hrCat;
if( GenSettings.IeCustomizeMethod == IE_NO_CUSTOMIZATION )
{
//
// Don't write out any IE keys when the choose not to customize IE
//
return;
}
else if( GenSettings.IeCustomizeMethod == IE_USE_BRANDING_FILE )
{
lpIeBrandingFile = GenSettings.szInsFile;
lpUseUnattendFileForBranding = _T("No");
//
// Write out the Auto Config settings
//
if( GenSettings.bUseAutoConfigScript )
{
lpAutoConfig = _T("1");
lpAutoConfigUrl = GenSettings.szAutoConfigUrl;
lpAutoConfigUrlJscript = GenSettings.szAutoConfigUrlJscriptOrPac;
}
else
{
lpAutoConfig = _T("0");
}
}
//
// Write out the proxy settings
//
if( GenSettings.bUseProxyServer )
{
lpUseProxyServer = _T("1");
}
else
{
lpUseProxyServer = _T("0");
}
if( GenSettings.bUseSameProxyForAllProtocols )
{
lpUseSameProxyForAllProtocols = _T("1");
}
else
{
lpUseSameProxyForAllProtocols = _T("0");
}
//
// For each proxy server, if the port is not empty concatenate it.
//
lpHttpProxy = AllocateAddressPortString( GenSettings.szHttpProxyAddress, GenSettings.szHttpProxyPort );
//
// Only write out the proxy server if they aren't using the same one
//
if( ! GenSettings.bUseSameProxyForAllProtocols )
{
lpSecureProxy = AllocateAddressPortString( GenSettings.szSecureProxyAddress, GenSettings.szSecureProxyPort );
lpFtpProxy = AllocateAddressPortString( GenSettings.szFtpProxyAddress, GenSettings.szFtpProxyPort );
lpGopherProxy = AllocateAddressPortString( GenSettings.szGopherProxyAddress, GenSettings.szGopherProxyPort );
lpSocksProxy = AllocateAddressPortString( GenSettings.szSocksProxyAddress, GenSettings.szSocksProxyPort );
}
//
// Append the string <local> to the exception list if the user wants to
// bypass the proxy for local addresses
//
if( GenSettings.bBypassProxyForLocalAddresses )
{
if( GenSettings.szProxyExceptions[0] != _T('\0') )
{
INT iLastChar;
iLastChar = lstrlen( GenSettings.szProxyExceptions );
if( GenSettings.szProxyExceptions[iLastChar - 1] != _T(';') )
{
hrCat=StringCchCat( GenSettings.szProxyExceptions, AS(GenSettings.szProxyExceptions),_T(";") );
}
}
hrCat=StringCchCat( GenSettings.szProxyExceptions, AS(GenSettings.szProxyExceptions),_T("<local>") );
}
lpProxyExceptions = GenSettings.szProxyExceptions;
lpHomePage = GenSettings.szHomePage;
lpHelpPage = GenSettings.szHelpPage;
lpSearchPage = GenSettings.szSearchPage;
//
// Write out the IE Favorites...
//
WriteOutIeFavorites( );
SettingQueue_AddSetting( _T("Branding"),
_T("BrandIEUsingUnattended"),
lpUseUnattendFileForBranding,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Branding"),
_T("IEBrandingFile"),
lpIeBrandingFile,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("URL"),
_T("AutoConfig"),
lpAutoConfig,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("URL"),
_T("AutoConfigURL"),
lpAutoConfigUrl,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("URL"),
_T("AutoConfigJSURL"),
lpAutoConfigUrlJscript,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Proxy"),
_T("Proxy_Enable"),
lpUseProxyServer,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Proxy"),
_T("Use_Same_Proxy"),
lpUseSameProxyForAllProtocols,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Proxy"),
_T("HTTP_Proxy_Server"),
lpHttpProxy ? lpHttpProxy : _T(""),
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Proxy"),
_T("Secure_Proxy_Server"),
lpSecureProxy ? lpSecureProxy : _T(""),
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Proxy"),
_T("FTP_Proxy_Server"),
lpFtpProxy ? lpFtpProxy : _T(""),
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Proxy"),
_T("Gopher_Proxy_Server"),
lpGopherProxy ? lpGopherProxy : _T(""),
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Proxy"),
_T("Socks_Proxy_Server"),
lpSocksProxy ? lpSocksProxy : _T(""),
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("Proxy"),
_T("Proxy_Override"),
lpProxyExceptions,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("URL"),
_T("Home_Page"),
lpHomePage,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("URL"),
_T("Help_Page"),
lpHelpPage,
SETTING_QUEUE_ANSWERS );
SettingQueue_AddSetting( _T("URL"),
_T("Search_Page"),
lpSearchPage,
SETTING_QUEUE_ANSWERS );
//
// Free any memory we may have allocated...
//
if ( lpHttpProxy )
FREE ( lpHttpProxy );
if ( lpSecureProxy )
FREE ( lpSecureProxy );
if ( lpFtpProxy )
FREE ( lpFtpProxy );
if ( lpGopherProxy )
FREE ( lpGopherProxy );
if ( lpSocksProxy )
FREE ( lpSocksProxy );
}