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

381 lines
11 KiB
C

//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
// All rights reserved.
//
// File Name:
// load.c
//
// Description:
//
// This file implements LoadAllAnswers() which is called by the
// NewOrEdit page.
//
// When LoadAllAnswers is called, the NewOrEdit page passes whether
// we should load settings from an existing answer file, from the
// registry on the current machine, or whether we should reset to
// true defaults.
//
// The global variables GenSettings, WizGlobals and NetSettings
// are populated and the wizard pages init from there and scribble
// into there.
//
//----------------------------------------------------------------------------
#include "pch.h"
#include "allres.h"
//
// External functions we call
//
BOOL ReadSettingsFromAnswerFile(HWND hwnd); // loadfile.c
VOID ResetAnswersToDefaults(HWND hwnd, int iOrigin); // reset.c
VOID LoadOriginalSettingsLowHalScsi(HWND hwnd,
LPTSTR lpFileName,
QUEUENUM dwWhichQueue);
//
// Local prototypes
//
VOID LoadOriginalSettingsLow(HWND hwnd,
LPTSTR lpFileName,
QUEUENUM dwWhichQueue);
static BOOL IsOkToLoadFile(HWND hwnd, LPTSTR lpAnswerFileName);
static VOID LoadOriginalSettings(HWND hwnd);
static VOID RemoveNotPreservedSettings( VOID );
//----------------------------------------------------------------------------
//
// Function: LoadAllAnswers
//
// Purpose: This is the entry for setting all the answers in our globals
// called by the NewEdit page.
//
// NewEdit calls us with one of the following 3 flags depending
// on the radio button the user selected.
//
// LOAD_NEWSCRIPT_DEFAULTS
// Reset all controls and and answer file settings to defaults.
//
// LOAD_FROM_ANSWER_FILE
// Reset all controls and answer file settings to defaults,
// then load answers from an existing answer file.
//
// Arguments: HWND hwnd
//
// Returns: BOOL
//
//----------------------------------------------------------------------------
BOOL LoadAllAnswers(HWND hwnd, LOAD_TYPES iOrigin)
{
TCHAR szTxtSetupPathAndFileName[MAX_PATH + 1] = _T("");
//
// Call into common\reset.c
//
ResetAnswersToDefaults(hwnd, iOrigin);
//
// If editing an answer file, load all of the original settings onto
// a SettingQueue.
//
// Then call into common\loadfile.c to set init the globals vars.
//
if ( iOrigin == LOAD_FROM_ANSWER_FILE ) {
if ( ! IsOkToLoadFile(hwnd, FixedGlobals.ScriptName) )
return FALSE;
LoadOriginalSettings(hwnd);
RemoveNotPreservedSettings();
ReadSettingsFromAnswerFile(hwnd);
//
// If a txtsetup.oem exists, load it into its queue
//
if( WizGlobals.DistFolder[0] != _T('\0') ) {
ConcatenatePaths( szTxtSetupPathAndFileName,
WizGlobals.DistFolder,
_T("\\$oem$\\Textmode\\txtsetup.oem"),
NULL );
if( DoesFileExist( szTxtSetupPathAndFileName ) ) {
LoadOriginalSettingsLowHalScsi(hwnd,
szTxtSetupPathAndFileName,
SETTING_QUEUE_TXTSETUP_OEM);
}
}
}
//
// Detemine if it is sysprep
//
if ( LSTRCMPI( MyGetFullPath( FixedGlobals.ScriptName ), _T("sysprep.inf") ) == 0 )
{
WizGlobals.iProductInstall = PRODUCT_SYSPREP;
}
return TRUE;
}
//----------------------------------------------------------------------------
//
// Function: IsOkToLoadFile
//
// Purpose: Checks to see if the file was created by SetupMgr before the
// caller attempts to load settings from it. If the file was not
// created by SetupMgr, it gives the user a chance to say "Load
// it anyway. The given filename must be a full pathname.
//
//----------------------------------------------------------------------------
static BOOL IsOkToLoadFile(HWND hwnd,
LPTSTR lpAnswerFileName)
{
TCHAR Buffer[MAX_INILINE_LEN];
BOOL bLoadIt = TRUE;
FILE *fp = My_fopen( FixedGlobals.ScriptName, _T("r") );
if ( fp == NULL ) {
ReportErrorId(hwnd,
MSGTYPE_ERR,
IDS_ERR_CANNOT_FIND_ANSWER_FILE,
FixedGlobals.ScriptName);
return FALSE;
}
//
// If we can't find ;SetupMgrTag on the first line of this answer file,
// then Setup Manager didn't create this file.
//
// In that case, ask the user if they want to load it anyway.
//
if ( My_fgets(Buffer, MAX_INILINE_LEN - 1, fp) == NULL ||
lstrcmp(Buffer, _T(";SetupMgrTag\n") ) != 0 ) {
INT iRet;
iRet = ReportErrorId(hwnd,
MSGTYPE_YESNO,
IDS_ERR_FILE_NOT_SETUPMGR,
FixedGlobals.ScriptName);
if ( iRet == IDNO )
bLoadIt = FALSE;
}
My_fclose(fp);
return bLoadIt;
}
//----------------------------------------------------------------------------
//
// Function: LoadOriginalSettings
//
// Purpose: Stub that loads the orginal settings of the answer file
// and the .udf
//
//----------------------------------------------------------------------------
static
VOID
LoadOriginalSettings(HWND hwnd)
{
LoadOriginalSettingsLow(hwnd,
FixedGlobals.ScriptName,
SETTING_QUEUE_ORIG_ANSWERS);
LoadOriginalSettingsLow(hwnd,
FixedGlobals.UdfFileName,
SETTING_QUEUE_ORIG_UDF);
}
//----------------------------------------------------------------------------
//
// Function: LoadOriginalSettingsLow
//
// Purpose:
//
//----------------------------------------------------------------------------
VOID
LoadOriginalSettingsLow(HWND hwnd,
LPTSTR lpFileName,
QUEUENUM dwWhichQueue)
{
TCHAR Buffer[MAX_INILINE_LEN];
FILE *fp;
TCHAR SectionName[MAX_ININAME_LEN + 1] = _T("");
TCHAR KeyName[MAX_ININAME_LEN + 1] = _T("");
TCHAR *pValue;
//
// Open the answer file for reading
//
if ( (fp = My_fopen( lpFileName, _T("r") )) == NULL )
return;
//
// Read each line
//
while ( My_fgets(Buffer, MAX_INILINE_LEN - 1, fp) != NULL ) {
BOOL bSectionLine = FALSE;
BOOL bSettingLine = FALSE;
BOOL bCreatedPriorSection = FALSE;
TCHAR *p;
TCHAR *pEqual;
//
// A semicolon(;) denotes that the rest of the line is a comment.
// Thus, if a semicolon(;) exists in the Buffer, place a null char
// there and send the Buffer on for further processing.
//
// ISSUE-2002/02/28-stelo - but if the ; is in a string, that is OK so we need to watch
// for quotes as well
for( p = Buffer; *p != _T('\0') && *p != _T(';'); p++ )
; // purposely do nothing
if( *p == _T(';') ) {
*p = _T('\0');
}
//
// Look for [SectionName]
//
if ( Buffer[0] == _T('[') ) {
for ( p=Buffer+1; *p && *p != _T(']'); p++ )
;
if ( p ) {
*p = _T('\0');
bSectionLine = TRUE;
}
}
//
// If this line has [SectionName], be sure we made a section node
// on the setting queue before overwriting SectionName buffer. This
// is the only way to get the SettingQueueFlush routine to write
// out an empty section. The user had an empty section originally,
// so we'll preserve it.
//
if ( bSectionLine ) {
if ( ! bCreatedPriorSection && SectionName[0] ) {
SettingQueue_AddSetting(SectionName,
_T(""),
_T(""),
dwWhichQueue);
}
lstrcpyn(SectionName, Buffer+1, AS(SectionName));
bSectionLine = FALSE;
bCreatedPriorSection = FALSE;
}
//
// Look for a key=value line, if it is one, add the setting.
//
// Adding a setting to the setting queue has the effect of creating
// the section node if needed.
//
if ( (pEqual = lstrchr( Buffer, _T('=') )) != NULL ) {
p = CleanLeadSpace(Buffer);
lstrcpyn(KeyName, p, (UINT)(pEqual - p + 1));
CleanTrailingSpace( KeyName );
pValue = pEqual + 1;
p = CleanSpaceAndQuotes(pValue);
//
// Strip the quotes but leave the spaces in
// An example of where this is needed is for SCSI and HAL section
//
StripQuotes( KeyName );
SettingQueue_AddSetting(SectionName,
KeyName,
p,
dwWhichQueue);
bCreatedPriorSection = TRUE;
}
}
My_fclose(fp);
return;
}
//----------------------------------------------------------------------------
//
// Function: RemoveNotPreservedSettings
//
// Purpose: To removed sections from the answer queue that are not preserved
// on an edit.
//
//----------------------------------------------------------------------------
static VOID
RemoveNotPreservedSettings( VOID ) {
// ISSUE-2002/02/28-stelo - all of these should be string should be made constants and put in a header file
//
// Do not preserve any of the SCSI drivers from the previous script
//
SettingQueue_RemoveSection( _T("MassStorageDrivers"),
SETTING_QUEUE_ORIG_ANSWERS );
//
// The OEM Boot files get generated depending on the users choices on the
// SCSI and HAL pages so there is no need to preserve it.
//
SettingQueue_RemoveSection( _T("OEMBootFiles"),
SETTING_QUEUE_ORIG_ANSWERS );
//
// Do not preserve any IE Favorites from the previous script, they get
// written out from the in-memory settings.
//
SettingQueue_RemoveSection( _T("FavoritesEx"),
SETTING_QUEUE_ORIG_ANSWERS );
}