381 lines
11 KiB
C
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 );
|
||
|
|
||
|
}
|