|
|
//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
// All rights reserved.
//
// File Name:
// savescr.c
//
// Description:
// This is the dialog proc for the Save Script page.
//
//----------------------------------------------------------------------------
#include "pch.h"
#include "resource.h"
#define DEFAULT_SCRIPT_NAME _T("unattend.txt")
#define DEFAULT_REMBOOT_NAME _T("remboot.sif")
#define DEFAULT_SYSPREP_NAME _T("sysprep.inf")
#define DEFAULT_SYSPREP_BAT_NAME _T("sysprep.bat")
static TCHAR *StrWinntSifText;
//----------------------------------------------------------------------------
//
// Function: AddEntryToRenameFile
//
// Purpose:
//
// Arguments:
//
// Returns: VOID
//
//----------------------------------------------------------------------------
static VOID AddEntryToRenameFile( const TCHAR *pszDirPath, const TCHAR *pszShortName, const TCHAR *pszLongName ) {
TCHAR szQuotedLongName[MAX_PATH + 1]; TCHAR szFullRenamePath[MAX_PATH + 1] = _T(""); HRESULT hrPrintf;
//
// Quote the long file name
hrPrintf=StringCchPrintf( szQuotedLongName, AS(szQuotedLongName), _T("\"%s\""), pszLongName ); //
// Note:ConcatenatePaths truncates to avoid buffer overrun
if( ! ConcatenatePaths( szFullRenamePath, pszDirPath, _T("$$Rename.txt"), NULL ) ) { return; }
WritePrivateProfileString( pszDirPath, pszShortName, szQuotedLongName, szFullRenamePath );
}
//----------------------------------------------------------------------------
//
// Function: CreateRenameFiles
//
// Purpose: Walk all the dirs of the given path and lower. If there are any
// long file names, put them in the $$Rename.txt file.
//
// Arguments: IN const TCHAR *pszDirPath - sub-dir to search for long filenames
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID CreateRenameFiles( IN const TCHAR *pszDirPath ) {
HANDLE FindHandle; WIN32_FIND_DATA FindData; TCHAR *pszShortName; TCHAR szLongPathAndFilename[MAX_PATH + 1]; TCHAR szShortPathAndFilename[MAX_PATH + 1]; TCHAR szAllFiles[MAX_PATH + 1] = _T(""); TCHAR szNewPath[MAX_PATH + 1] = _T("");
// Note: ConcatenatePaths truncates to avoid buffer overrun
if( ! ConcatenatePaths( szAllFiles, pszDirPath, _T("*"), NULL ) ) { return; }
//
// Look for * in this dir
//
// ISSUE-2002/02/27-stelo,swamip - Clean up the FindFirstFile Logic
FindHandle = FindFirstFile( szAllFiles, &FindData );
if( FindHandle == INVALID_HANDLE_VALUE ) {
return;
}
do {
//
// skip over the . and .. entries
//
if( 0 == lstrcmp( FindData.cFileName, _T(".") ) || 0 == lstrcmp( FindData.cFileName, _T("..") ) ) { continue; }
szLongPathAndFilename[0] = _T('\0');
if( ! ConcatenatePaths( szLongPathAndFilename, pszDirPath, FindData.cFileName, NULL ) ) { continue; }
if( ! GetShortPathName( szLongPathAndFilename, szShortPathAndFilename, MAX_PATH ) ) {
ReportErrorId(NULL, MSGTYPE_ERR | MSGTYPE_WIN32, IDS_DONTSPECIFYSETTING);
continue; }
pszShortName = MyGetFullPath( szShortPathAndFilename ); //
// If the LFN and the short name are different, then add it to the
// rename file
//
if( pszShortName && ( lstrcmpi( FindData.cFileName, pszShortName ) != 0 ) ) { AddEntryToRenameFile( pszDirPath, pszShortName, FindData.cFileName ); }
//
// If this is a dir entry, recurse.
//
if( FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
//
// Build the full pathname, if >= MAX_PATH, skip it
//
// Note: ConcatenatePaths truncates to avoid buffer overrun
if( ! ConcatenatePaths( szNewPath, pszDirPath, FindData.cFileName, NULL ) ) { continue; }
CreateRenameFiles( szNewPath );
szNewPath[0] = _T('\0');
}
} while ( FindNextFile( FindHandle, &FindData ) );
FindClose( FindHandle );
}
//----------------------------------------------------------------------------
//
// Function: OnSetActiveSaveScript
//
// Purpose: Init's the controls.
//
//----------------------------------------------------------------------------
VOID OnSetActiveSaveScript(HWND hwnd) { //
// If there is no script name at all. Put a default into the field
// that includes the path to the current directory
//
if ( FixedGlobals.ScriptName[0] == _T('\0') ) {
LPTSTR lpPath; LPTSTR lpFileName;
if ( WizGlobals.iProductInstall == PRODUCT_REMOTEINSTALL ) {
lpFileName = DEFAULT_REMBOOT_NAME;
} else if( WizGlobals.iProductInstall == PRODUCT_SYSPREP ) {
lpFileName = DEFAULT_SYSPREP_NAME;
} else {
lpFileName = DEFAULT_SCRIPT_NAME;
}
if( WizGlobals.bStandAloneScript || ( ! WizGlobals.bStandAloneScript && WizGlobals.iProductInstall == PRODUCT_SYSPREP ) ) { lpPath = FixedGlobals.szSavePath; } else { lpPath = WizGlobals.DistFolder; }
// Note: ConcatenatePaths truncates to avoid buffer overrun
ConcatenatePaths(FixedGlobals.ScriptName, lpPath, lpFileName, NULL); }
//
// Set the controls
//
SetDlgItemText(hwnd, IDT_SCRIPTNAME, FixedGlobals.ScriptName);
PropSheet_SetWizButtons(GetParent(hwnd), PSWIZB_BACK | PSWIZB_NEXT); }
//----------------------------------------------------------------------------
//
// Function: OnWizNext
//
// Purpose: Get user's input and validate
//
//----------------------------------------------------------------------------
BOOL OnWizNextSaveScript(HWND hwnd) { BOOL bResult = TRUE;
//
// Retrieve the pathname
//
GetDlgItemText(hwnd, IDT_SCRIPTNAME, FixedGlobals.ScriptName, MAX_PATH);
//
// Can't be empty
//
if ( FixedGlobals.ScriptName[0] == _T('\0') ) { ReportErrorId(hwnd, MSGTYPE_ERR, IDS_ERR_ENTER_FILENAME); bResult = FALSE; }
//
// Lookin' good, go try save the file(s) now
//
else {
TCHAR szFullPath[MAX_PATH] = NULLSTR; LPTSTR lpFind = NULL;
//
// ISSUE-2002/02/27-stelo,swamip - Investigate the call below. Seems to be not using the return value.
//
MyGetFullPath(FixedGlobals.ScriptName);
// We should create the path before we try and save the script file
//
if (GetFullPathName(FixedGlobals.ScriptName, AS(szFullPath), szFullPath, &lpFind) && szFullPath[0] && lpFind) { // Chop off the file part of the buffer
//
*lpFind = NULLCHR;
// If the path does not exist, attempt to create the path
//
if ( !DirectoryExists(szFullPath) ) { //
// ISSUE-2002/02/27-stelo,swamip - Need to chech the return value of CreatePath
//
CreatePath(szFullPath); }
}
if ( ! SaveAllSettings(hwnd) ) { if (ERROR_CANCELLED == GetLastError()) { PostMessage(GetParent(hwnd), PSM_SETCURSELID, (WPARAM) 0, (LPARAM) IDD_FINISH2); return TRUE; } else { bResult = FALSE; } } }
//
// If it is a sysprep, place a copy of the inf and batch files in the
// %systemdrive%\sysprep dir (most likely c:\sysprep)
//
if( WizGlobals.iProductInstall == PRODUCT_SYSPREP ) {
TCHAR szSysprepPath[MAX_PATH] = _T(""); TCHAR szSysprepPathAndFileName[MAX_PATH] = _T("");
ExpandEnvironmentStrings( _T("%SystemDrive%"), szSysprepPath, MAX_PATH );
lstrcatn( szSysprepPath, _T("\\sysprep"), MAX_PATH );
// Note: ConcatenatePaths truncates to avoid buffer overrun
ConcatenatePaths( szSysprepPathAndFileName, szSysprepPath, DEFAULT_SYSPREP_NAME, NULL );
CopyFile( FixedGlobals.ScriptName, szSysprepPathAndFileName, FALSE );
szSysprepPathAndFileName[0] = _T('\0');
// Note: ConcatenatePaths truncates to avoid buffer overrun
ConcatenatePaths( szSysprepPathAndFileName, szSysprepPath, DEFAULT_SYSPREP_BAT_NAME, NULL );
CopyFile( FixedGlobals.BatchFileName, szSysprepPathAndFileName, FALSE );
}
//
// Add the $$Rename.txt files where necessary
//
if( ! WizGlobals.bStandAloneScript && WizGlobals.OemFilesPath[0] != _T('\0') ) { CreateRenameFiles( WizGlobals.OemFilesPath ); }
return ( bResult ); }
//----------------------------------------------------------------------------
//
// Function: OnBrowseSaveScript
//
// Purpose: Takes care of the Browse... button push
//
//----------------------------------------------------------------------------
VOID OnBrowseSaveScript(HWND hwnd) { //
// Let user browse for a filename, then update the display with
// the filename.
//
GetAnswerFileName(hwnd, FixedGlobals.ScriptName, TRUE);
SendDlgItemMessage(hwnd, IDT_SCRIPTNAME, WM_SETTEXT, (WPARAM) MAX_PATH, (LPARAM) FixedGlobals.ScriptName); }
//----------------------------------------------------------------------------
//
// Function: DlgSaveScriptPage
//
// Purpose: This is the dialog procedure the save script page.
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK DlgSaveScriptPage( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam) { BOOL bStatus = TRUE;
switch (uMsg) {
case WM_INITDIALOG:
// Activate the dialog
//
OnSetActiveSaveScript(hwnd); //
// ISSUE-2002/02/27-stelo,swamip - Never gets Freed
//
StrWinntSifText = MyLoadString( IDS_WINNTSIF_TEXT );
break;
case WM_COMMAND:
switch ( LOWORD(wParam) ) {
case IDC_BROWSE: if ( HIWORD(wParam) == BN_CLICKED ) OnBrowseSaveScript(hwnd); break;
case IDOK: if ( OnWizNextSaveScript(hwnd) ) EndDialog(hwnd, TRUE); break;
case IDCANCEL:
EndDialog(hwnd, FALSE); break;
default: bStatus = FALSE; break; } break;
case WM_NOTIFY: { LPNMHDR pnmh = (LPNMHDR)lParam;
// ISSUE-2002/02/27-stelo,swamip - should check for valid pointer (possible dereference)
//
switch( pnmh->code ) {
case PSN_QUERYCANCEL: WIZ_CANCEL(hwnd); break;
case PSN_SETACTIVE: OnSetActiveSaveScript(hwnd); break;
case PSN_WIZBACK: bStatus = FALSE; break;
case PSN_WIZNEXT: if ( !OnWizNextSaveScript(hwnd) ) WIZ_FAIL(hwnd); else bStatus = FALSE; break;
default: bStatus = FALSE; break; } } break;
default: bStatus = FALSE; break; } return bStatus; }
|