2030 lines
66 KiB
C++
2030 lines
66 KiB
C++
/****************************************************************************
|
|
|
|
Copyright (c) Microsoft Corporation 1997
|
|
All rights reserved
|
|
|
|
***************************************************************************/
|
|
|
|
#include "pch.h"
|
|
|
|
#include "dialogs.h"
|
|
#include "setup.h"
|
|
#include "check.h"
|
|
#include "dhcp.h"
|
|
|
|
DEFINE_MODULE("Dialogs");
|
|
|
|
#define BITMAP_WIDTH 16
|
|
#define BITMAP_HEIGHT 16
|
|
#define LG_BITMAP_WIDTH 32
|
|
#define LG_BITMAP_HEIGHT 32
|
|
|
|
static WNDPROC g_pOldEditWndProc;
|
|
|
|
//
|
|
// global window message for cancelling autoplay.
|
|
//
|
|
UINT g_uQueryCancelAutoPlay = 0;
|
|
|
|
|
|
//
|
|
// Check to see if the directory exists. If not, ask the user if we
|
|
// should create it.
|
|
//
|
|
HRESULT
|
|
CheckDirectory( HWND hDlg, LPWSTR pszPath )
|
|
{
|
|
TraceFunc( "CheckDirectory( ... )\n" );
|
|
|
|
HRESULT hr = E_FAIL;
|
|
DWORD dwAttrib = GetFileAttributes( pszPath );
|
|
|
|
if ( dwAttrib != 0xFFFFffff
|
|
&& g_Options.fAutomated == FALSE )
|
|
{
|
|
INT iResult = MessageBoxFromStrings( hDlg,
|
|
IDS_DIRECTORYEXISTS_CAPTION,
|
|
IDS_DIRECTORYEXISTS_TEXT,
|
|
MB_YESNO );
|
|
if ( iResult == IDNO )
|
|
goto Cleanup;
|
|
}
|
|
|
|
|
|
hr = S_OK;
|
|
|
|
Cleanup:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, (hr == S_OK ? 0 : -1 ) );
|
|
|
|
HRETURN(hr);
|
|
}
|
|
|
|
//
|
|
// Base dialog proc - all unhandled calls are passed here. If they are not
|
|
// handled here, then the default dialog proc will handle them.
|
|
//
|
|
INT_PTR CALLBACK
|
|
BaseDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
SetDialogFont( hDlg, IDC_S_TITLE1, DlgFontTitle );
|
|
//SetDialogFont( hDlg, IDC_S_TITLE2, DlgFontTitle );
|
|
//SetDialogFont( hDlg, IDC_S_TITLE3, DlgFontTitle );
|
|
SetDialogFont( hDlg, IDC_S_BOLD1, DlgFontBold );
|
|
SetDialogFont( hDlg, IDC_S_BOLD2, DlgFontBold );
|
|
SetDialogFont( hDlg, IDC_S_BOLD3, DlgFontBold );
|
|
break;
|
|
|
|
case WM_PALETTECHANGED:
|
|
if ((HWND)wParam != hDlg)
|
|
{
|
|
InvalidateRect(hDlg, NULL, NULL);
|
|
UpdateWindow(hDlg);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// WelcomeDlgProc( )
|
|
//
|
|
// "Welcome's" (the first page's) dialog proc.
|
|
//
|
|
INT_PTR CALLBACK
|
|
WelcomeDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
CenterDialog( GetParent( hDlg ) );
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fAddOption
|
|
|| g_Options.fCheckServer )
|
|
{
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
break;
|
|
}
|
|
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_NEXT );
|
|
ClearMessageQueue( );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// VerifyRootDirectoryName( )
|
|
//
|
|
BOOL
|
|
VerifyRootDirectoryName( )
|
|
{
|
|
TraceFunc( "VerifyRootDirectoryName()\n" );
|
|
BOOL fReturn = FALSE;
|
|
|
|
LPWSTR psz = g_Options.szIntelliMirrorPath;
|
|
|
|
while ( *psz >= 32 && *psz < 127 )
|
|
psz++;
|
|
|
|
if ( *psz == L'\0' )
|
|
{
|
|
fReturn = TRUE;
|
|
}
|
|
|
|
RETURN(fReturn);
|
|
}
|
|
|
|
//
|
|
// IntelliMirrorRootDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
IntelliMirrorRootDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
DWORD dwPathLength;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
HWND hwndEdit = GetDlgItem( hDlg, IDC_E_INTELLIMIRRORROOT );
|
|
Edit_LimitText( hwndEdit, ARRAYSIZE(g_Options.szIntelliMirrorPath) - 1 );
|
|
Edit_SetText( hwndEdit, g_Options.szIntelliMirrorPath );
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_WIZNEXT:
|
|
Edit_GetText( GetDlgItem( hDlg, IDC_E_INTELLIMIRRORROOT ),
|
|
g_Options.szIntelliMirrorPath,
|
|
ARRAYSIZE( g_Options.szIntelliMirrorPath ) );
|
|
if ( !CheckIntelliMirrorDrive( hDlg ) )
|
|
{
|
|
g_Options.fIMirrorDirectory = TRUE;
|
|
}
|
|
//
|
|
// Remove any trailing \ from the path, since NetShareAdd
|
|
// can't handle those.
|
|
//
|
|
dwPathLength = lstrlen( g_Options.szIntelliMirrorPath );
|
|
while ( ( dwPathLength > 0 ) &&
|
|
( g_Options.szIntelliMirrorPath[dwPathLength-1] == L'\\' ) ) {
|
|
g_Options.szIntelliMirrorPath[dwPathLength-1] = L'\0';
|
|
--dwPathLength;
|
|
}
|
|
if ( !VerifyRootDirectoryName( ) )
|
|
{
|
|
MessageBoxFromStrings( hDlg, IDS_OSCHOOSER_ROOT_DIRECTORY_RESTRICTION_TITLE, IDS_OSCHOOSER_ROOT_DIRECTORY_RESTRICTION_TEXT, MB_OK );
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT );
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fError
|
|
|| g_Options.fAbort
|
|
|| g_Options.fIMirrorShareFound
|
|
|| g_Options.fTFTPDDirectoryFound ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
}
|
|
else
|
|
{
|
|
DWORD dwLen = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_INTELLIMIRRORROOT ) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ),
|
|
(dwLen ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK) );
|
|
ClearMessageQueue( );
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch( LOWORD( wParam))
|
|
{
|
|
case IDC_E_INTELLIMIRRORROOT:
|
|
{
|
|
if ( HIWORD(wParam) == EN_CHANGE )
|
|
{
|
|
DWORD dwLen = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_INTELLIMIRRORROOT) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), dwLen ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_B_BROWSE:
|
|
{
|
|
WCHAR szTitle[ SMALL_BUFFER_SIZE ];
|
|
WCHAR szPath[ MAX_PATH ];
|
|
|
|
BROWSEINFO bs;
|
|
DWORD dw;
|
|
ZeroMemory( &bs, sizeof(bs) );
|
|
bs.hwndOwner = hDlg;
|
|
dw = LoadString( g_hinstance, IDS_BROWSECAPTION_RBDIR, szTitle, ARRAYSIZE( szTitle ));
|
|
Assert( dw );
|
|
bs.lpszTitle = (LPWSTR) &szTitle;
|
|
bs.ulFlags = BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS;
|
|
LPITEMIDLIST pidl = SHBrowseForFolder( &bs );
|
|
|
|
if ( pidl && SHGetPathFromIDList( pidl, szPath ) ) {
|
|
if ( wcslen( szPath ) > ARRAYSIZE(g_Options.szSourcePath) - 2 ) {
|
|
MessageBoxFromStrings( hDlg, IDS_PATH_TOO_LONG_TITLE, IDS_PATH_TOO_LONG_TEXT, MB_OK );
|
|
szPath[ ARRAYSIZE(g_Options.szSourcePath) - 1 ] = L'\0';
|
|
}
|
|
Edit_SetText( GetDlgItem( hDlg, IDC_E_INTELLIMIRRORROOT ), szPath );
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// SCPCheckWindows( )
|
|
//
|
|
void
|
|
SCPCheckWindows( HWND hDlg )
|
|
{
|
|
// LONG lAllowNewClients = Button_GetCheck( GetDlgItem( hDlg, IDC_C_ACCEPTSNEWCLIENTS ) );
|
|
// LONG lLimitClients = Button_GetCheck( GetDlgItem( hDlg, IDC_C_LIMITCLIENTS ) );
|
|
LONG lAnswerRequests = Button_GetCheck( GetDlgItem( hDlg, IDC_C_RESPOND ) );
|
|
|
|
// EnableWindow( GetDlgItem( hDlg, IDC_C_LIMITCLIENTS ), lAllowNewClients );
|
|
// EnableWindow( GetDlgItem( hDlg, IDC_E_LIMIT ), lAllowNewClients && lLimitClients );
|
|
// EnableWindow( GetDlgItem( hDlg, IDC_SPIN_LIMIT ), lAllowNewClients && lLimitClients );
|
|
EnableWindow( GetDlgItem( hDlg, IDC_C_KNOWNCLIENTS ), lAnswerRequests );
|
|
}
|
|
|
|
//
|
|
// SCPDlgProc( )
|
|
//
|
|
// SCP default setup settings
|
|
//
|
|
INT_PTR CALLBACK
|
|
SCPDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
static UINT uDlgState = 0;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
// Edit_LimitText( GetDlgItem( hDlg, IDC_E_LIMIT ), 3 );
|
|
SCPCheckWindows( hDlg );
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_WIZNEXT:
|
|
{
|
|
LONG lResult;
|
|
//lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_C_ACCEPTSNEWCLIENTS ) );
|
|
//scpdata[0].pszValue = ( lResult == BST_CHECKED ? L"TRUE" : L"FALSE" );
|
|
|
|
//lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_C_LIMITCLIENTS ) );
|
|
//scpdata[1].pszValue = ( lResult == BST_CHECKED ? L"TRUE" : L"FALSE" );
|
|
|
|
//if ( lResult == BST_CHECKED ) {
|
|
// GetDlgItemText( hDlg, IDC_E_LIMIT, scpdata[3].pszValue, 4 );
|
|
//}
|
|
|
|
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_C_RESPOND ) );
|
|
scpdata[4].pszValue = ( lResult == BST_CHECKED ? L"TRUE" : L"FALSE" );
|
|
|
|
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_C_KNOWNCLIENTS ) );
|
|
scpdata[5].pszValue = ( lResult == BST_CHECKED ? L"TRUE" : L"FALSE" );
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), 0 );
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fError || g_Options.fAbort || g_Options.fBINLSCPFound ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
break;
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_NEXT | PSWIZB_BACK );
|
|
ClearMessageQueue( );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
if ( HIWORD( wParam ) == BN_CLICKED ) {
|
|
SCPCheckWindows( hDlg );
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// WarningDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
WarningDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fError || g_Options.fAbort || g_Options.fNewOS) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
}
|
|
else
|
|
{
|
|
HRESULT hr = CheckInstallation( );
|
|
if ( hr == S_OK || g_Options.fFirstTime ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // do not show this page
|
|
break;
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_FINISH );
|
|
ClearMessageQueue( );
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//
|
|
// OptionsDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
OptionsDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
Button_SetCheck( GetDlgItem( hDlg, IDC_B_ADD ), BST_CHECKED );
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_WIZNEXT:
|
|
if ( BST_CHECKED == Button_GetCheck( GetDlgItem( hDlg, IDC_B_ADD ) ) ) {
|
|
g_Options.fNewOS = TRUE;
|
|
} else {
|
|
g_Options.fNewOS = FALSE;
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), 0 );
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fFirstTime
|
|
|| g_Options.fAddOption ) {
|
|
g_Options.fNewOS = TRUE;
|
|
}
|
|
if ( g_Options.fFirstTime
|
|
|| g_Options.fAddOption
|
|
|| g_Options.fError
|
|
|| g_Options.fAbort
|
|
|| g_Options.fCheckServer ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
break;
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT );
|
|
ClearMessageQueue( );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// ImageSourceDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
ImageSourceDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
HWND hwndEdit = GetDlgItem( hDlg, IDC_E_IMAGESOURCE );
|
|
SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_FILESYSTEM);
|
|
Edit_LimitText( hwndEdit, ARRAYSIZE(g_Options.szSourcePath) - 1 );
|
|
Edit_SetText( hwndEdit, g_Options.szSourcePath );
|
|
#ifdef SHOW_ARCHITECTURERADIOBUTTON
|
|
if( g_Options.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL ) {
|
|
Button_SetCheck( GetDlgItem( hDlg, IDC_C_X86 ), BST_CHECKED );
|
|
} else if( g_Options.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ) {
|
|
Button_SetCheck( GetDlgItem( hDlg, IDC_C_IA64 ), BST_CHECKED );
|
|
}
|
|
#endif
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_WIZNEXT:
|
|
{
|
|
CWaitCursor Wait;
|
|
HRESULT hr;
|
|
DWORD pathlen,archlen;
|
|
WCHAR archscratch[10];
|
|
BOOL FirstTime = TRUE;
|
|
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), 0 );
|
|
Edit_GetText( GetDlgItem( hDlg, IDC_E_IMAGESOURCE ),
|
|
g_Options.szSourcePath,
|
|
ARRAYSIZE( g_Options.szSourcePath ) );
|
|
#ifdef SHOW_ARCHITECTURERADIOBUTTON
|
|
if( ( 0x0003 & Button_GetState( GetDlgItem( hDlg, IDC_C_X86 ) ) ) == BST_CHECKED ) {
|
|
g_Options.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;
|
|
wcscpy( g_Options.ProcessorArchitectureString, L"i386" );
|
|
wcscpy( archscracth, L"\\i386");
|
|
archlen = 5;
|
|
}
|
|
|
|
if( ( 0x0003 & Button_GetState( GetDlgItem( hDlg, IDC_C_IA64 ) ) ) == BST_CHECKED ) {
|
|
g_Options.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_IA64;
|
|
wcscpy(g_Options.ProcessorArchitectureString, L"ia64" );
|
|
wcscpy( archscracth, L"\\ia64");
|
|
archlen = 5;
|
|
}
|
|
|
|
pathlen = wcslen(g_Options.szSourcePath);
|
|
|
|
|
|
// Remove any trailing slashes
|
|
if ( g_Options.szSourcePath[ pathlen - 1 ] == L'\\' ) {
|
|
g_Options.szSourcePath[ pathlen - 1 ] = L'\0';
|
|
pathlen -= 1;
|
|
}
|
|
|
|
//
|
|
// remove any processor specific subdir at the end of the path
|
|
// if that's there as well, being careful not to underflow
|
|
// the array
|
|
//
|
|
if ( (pathlen > archlen) &&
|
|
(0 == _wcsicmp(
|
|
&g_Options.szSourcePath[pathlen-archlen],
|
|
archscracth))) {
|
|
g_Options.szSourcePath[ pathlen - archlen ] = L'\0';
|
|
}
|
|
|
|
hr = FindImageSource( hDlg );
|
|
if ( hr != S_OK ) {
|
|
Edit_SetText( GetDlgItem( hDlg, IDC_E_IMAGESOURCE ), g_Options.szSourcePath );
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
#else
|
|
if (g_Options.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {
|
|
wcscpy(g_Options.ProcessorArchitectureString, L"i386" );
|
|
wcscpy( archscratch, L"\\i386");
|
|
archlen = 5;
|
|
} else {
|
|
wcscpy(g_Options.ProcessorArchitectureString, L"ia64" );
|
|
wcscpy( archscratch, L"\\ia64");
|
|
archlen = 5;
|
|
}
|
|
pathlen = wcslen(g_Options.szSourcePath);
|
|
|
|
// Remove any trailing slashes
|
|
if ( g_Options.szSourcePath[ pathlen - 1 ] == L'\\' ) {
|
|
g_Options.szSourcePath[ pathlen - 1 ] = L'\0';
|
|
pathlen -= 1;
|
|
}
|
|
|
|
tryfindimagesource:
|
|
//
|
|
// remove any processor specific subdir at the end of the path
|
|
// if that's there as well, being careful not to underflow
|
|
// the array
|
|
//
|
|
if ( (pathlen > archlen) &&
|
|
(0 == _wcsicmp(
|
|
&g_Options.szSourcePath[pathlen-archlen],
|
|
archscratch))) {
|
|
g_Options.szSourcePath[ pathlen - archlen ] = L'\0';
|
|
}
|
|
|
|
|
|
//
|
|
// try the default architecture for the image.
|
|
// If it doesn't work then try again with another architecture.
|
|
//
|
|
hr = FindImageSource( hDlg );
|
|
if ( hr != S_OK ) {
|
|
if (FirstTime) {
|
|
FirstTime = FALSE;
|
|
if (g_Options.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) {
|
|
g_Options.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;
|
|
wcscpy( g_Options.ProcessorArchitectureString, L"i386" );
|
|
wcscpy( archscratch, L"\\i386");
|
|
archlen = 5;
|
|
} else {
|
|
g_Options.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_IA64;
|
|
wcscpy(g_Options.ProcessorArchitectureString, L"ia64" );
|
|
wcscpy( archscratch, L"\\ia64");
|
|
archlen = 5;
|
|
}
|
|
goto tryfindimagesource;
|
|
} else {
|
|
//
|
|
// We didn't find it. print a failure message.
|
|
//
|
|
MessageBoxFromStrings( hDlg, IDS_FILE_NOT_FOUND_TITLE, IDS_FILE_NOT_FOUND_TEXT, MB_OK );
|
|
Edit_SetText( GetDlgItem( hDlg, IDC_E_IMAGESOURCE ), g_Options.szSourcePath );
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
hr = CheckImageSource( hDlg );
|
|
|
|
if ( hr != S_OK )
|
|
{
|
|
Edit_SetText( GetDlgItem( hDlg, IDC_E_IMAGESOURCE ), g_Options.szSourcePath );
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
|
|
Edit_SetText( GetDlgItem( hDlg, IDC_E_IMAGESOURCE ), g_Options.szSourcePath );
|
|
hr = CheckInstallation( );
|
|
}
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fError
|
|
|| g_Options.fAbort
|
|
|| !g_Options.fNewOS ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwLen = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_IMAGESOURCE) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ),
|
|
(dwLen ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK) );
|
|
ClearMessageQueue( );
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
DWORD dwLen;
|
|
switch( LOWORD( wParam))
|
|
{
|
|
case IDC_E_IMAGESOURCE:
|
|
if ( HIWORD(wParam) != EN_CHANGE )
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
// fall thru...
|
|
#ifdef SHOW_ARCHITECTURERADIOBUTTON
|
|
case IDC_C_X86:
|
|
case IDC_C_IA64:
|
|
{
|
|
if( ( 0x0003 & Button_GetState( GetDlgItem( hDlg, IDC_C_X86 ) ) ) == BST_CHECKED ) {
|
|
g_Options.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;
|
|
wcscpy( g_Options.ProcessorArchitectureString, L"i386" );
|
|
}
|
|
|
|
if( ( 0x0003 & Button_GetState( GetDlgItem( hDlg, IDC_C_IA64 ) ) ) == BST_CHECKED ) {
|
|
g_Options.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_IA64;
|
|
wcscpy( g_Options.ProcessorArchitectureString, L"ia64" );
|
|
}
|
|
dwLen = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_IMAGESOURCE ) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ),
|
|
( dwLen) ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK );
|
|
}
|
|
break;
|
|
#else
|
|
dwLen = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_IMAGESOURCE ) );
|
|
PropSheet_SetWizButtons(
|
|
GetParent( hDlg ),
|
|
( dwLen) ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK );
|
|
break;
|
|
#endif
|
|
case IDC_B_BROWSE:
|
|
{
|
|
WCHAR szPath[ MAX_PATH ];
|
|
WCHAR szTitle[ SMALL_BUFFER_SIZE ];
|
|
BROWSEINFO bs;
|
|
DWORD dw;
|
|
ZeroMemory( &bs, sizeof(bs) );
|
|
bs.hwndOwner = hDlg;
|
|
dw = LoadString( g_hinstance, IDS_BROWSECAPTION_SOURCEDIR, szTitle, ARRAYSIZE( szTitle ));
|
|
Assert( dw );
|
|
bs.lpszTitle = (LPWSTR) &szTitle;
|
|
bs.ulFlags = BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS;
|
|
LPITEMIDLIST pidl = SHBrowseForFolder( &bs );
|
|
|
|
if ( pidl && SHGetPathFromIDList( pidl, szPath) ) {
|
|
if ( wcslen( szPath ) > ARRAYSIZE(g_Options.szSourcePath) - 2 ) {
|
|
MessageBoxFromStrings( hDlg, IDS_PATH_TOO_LONG_TITLE, IDS_PATH_TOO_LONG_TEXT, MB_OK );
|
|
//
|
|
// SHGetPathFromIDList() returns the path with a
|
|
// trailing backslash, which we want to drop
|
|
// The directory that the user selected will be
|
|
// validated when the user clicks next
|
|
szPath[ ARRAYSIZE(g_Options.szSourcePath) - 1 ] = L'\0';
|
|
}
|
|
Edit_SetText( GetDlgItem( hDlg, IDC_E_IMAGESOURCE ), szPath );
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
//
|
|
// try to cancel CD autoplay
|
|
//
|
|
if (!g_uQueryCancelAutoPlay) {
|
|
g_uQueryCancelAutoPlay = RegisterWindowMessage(TEXT("QueryCancelAutoPlay"));
|
|
DebugMsg( "generate autoplay message %d\n", g_uQueryCancelAutoPlay );
|
|
}
|
|
|
|
if (uMsg == g_uQueryCancelAutoPlay) {
|
|
DebugMsg( "received autoplay message\n" );
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, 1 );
|
|
return 1; // cancel auto-play
|
|
}
|
|
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// VerifyDirectoryName( )
|
|
//
|
|
BOOL
|
|
VerifyDirectoryName( )
|
|
{
|
|
TraceFunc( "VerifyDirectoryName()\n" );
|
|
BOOL fReturn = FALSE;
|
|
|
|
LPWSTR psz = g_Options.szInstallationName;
|
|
|
|
while ( *psz > 32 && *psz < 127 )
|
|
psz++;
|
|
|
|
if ( *psz == L'\0' )
|
|
{
|
|
fReturn = TRUE;
|
|
}
|
|
|
|
RETURN(fReturn);
|
|
}
|
|
|
|
//
|
|
// OSDirectoryDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
OSDirectoryDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
HWND hwndEdit = GetDlgItem( hDlg, IDC_E_OSDIRECTORY );
|
|
Edit_LimitText( hwndEdit, ARRAYSIZE(g_Options.szInstallationName) - 1 );
|
|
Edit_SetText( hwndEdit, g_Options.szInstallationName );
|
|
}
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_WIZNEXT:
|
|
Edit_GetText( GetDlgItem( hDlg, IDC_E_OSDIRECTORY ),
|
|
g_Options.szInstallationName,
|
|
ARRAYSIZE( g_Options.szInstallationName ) );
|
|
if ( !VerifyDirectoryName( ) )
|
|
{
|
|
MessageBoxFromStrings( hDlg, IDS_OSCHOOSER_DIRECTORY_RESTRICTION_TITLE, IDS_OSCHOOSER_DIRECTORY_RESTRICTION_TEXT, MB_OK );
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
BuildDirectories( );
|
|
CheckDirectory( hDlg, g_Options.szInstallationPath );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_NEXT );
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fError
|
|
|| g_Options.fAbort
|
|
|| !g_Options.fNewOS ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
DWORD dwLen = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_OSDIRECTORY) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ),
|
|
(dwLen ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK) );
|
|
ClearMessageQueue( );
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
if ( HIWORD( wParam ) == EN_CHANGE ) {
|
|
DWORD dwLen = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_OSDIRECTORY ) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), ( dwLen ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK ) );
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// HelpTextEditWndProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
HelpTextEditWndProc(
|
|
HWND hWnd,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
switch ( uMsg )
|
|
{
|
|
case WM_KEYDOWN:
|
|
// ignore CONTROL characters
|
|
if ( 0 <= GetKeyState( VK_CONTROL ) )
|
|
{
|
|
// fake button presses
|
|
if ( LOWORD( wParam ) == VK_RETURN ) {
|
|
PropSheet_PressButton( GetParent( GetParent( hWnd ) ), PSBTN_NEXT );
|
|
return FALSE;
|
|
} else if ( LOWORD( wParam ) == VK_ESCAPE ) {
|
|
PropSheet_PressButton( GetParent( GetParent( hWnd ) ), PSBTN_CANCEL );
|
|
return FALSE;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return CallWindowProc(g_pOldEditWndProc, hWnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
//
|
|
// VerifySIFText( )
|
|
//
|
|
BOOL
|
|
VerifySIFText(
|
|
LPWSTR pszText )
|
|
{
|
|
TraceFunc( "VerifySIFText()\n" );
|
|
BOOL fReturn = FALSE;
|
|
|
|
if ( !pszText )
|
|
RETURN(fReturn);
|
|
|
|
//
|
|
// make sure the string consists of valid characters that can be displayed
|
|
// by the OS Chooser. Note that the OS Chooser is not localized, so this
|
|
// check is really for ASCII chars >= 32 (space) and < 127 (DEL)
|
|
//
|
|
while ( *pszText >= 32 && *pszText < 127 )
|
|
pszText++;
|
|
|
|
if ( *pszText == L'\0' )
|
|
{
|
|
fReturn = TRUE;
|
|
}
|
|
|
|
RETURN(fReturn);
|
|
}
|
|
|
|
//
|
|
// DefaultSIFDlgProc( )
|
|
//
|
|
// Generates the default SIF.
|
|
//
|
|
INT_PTR CALLBACK
|
|
DefaultSIFDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
WCHAR szHelpTextFromInf[200];
|
|
WCHAR szDescriptionFromInf[200];
|
|
WCHAR szHelpTextFormat [200];
|
|
DWORD dw;
|
|
|
|
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
|
|
Edit_LimitText( GetDlgItem( hDlg, IDC_E_DESCRIPTION ), ARRAYSIZE(g_Options.szDescription) - 1 );
|
|
Edit_LimitText( GetDlgItem( hDlg, IDC_E_HELPTEXT ), ARRAYSIZE(g_Options.szHelpText) - 1 );
|
|
// subclass the edit boxes
|
|
g_pOldEditWndProc = (WNDPROC) SetWindowLongPtr( GetDlgItem( hDlg, IDC_E_HELPTEXT), GWLP_WNDPROC, (LONG_PTR)&HelpTextEditWndProc);
|
|
SetWindowLongPtr( GetDlgItem( hDlg, IDC_E_HELPTEXT), GWLP_WNDPROC, (LONG_PTR)&HelpTextEditWndProc);
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_WIZBACK: //fall through
|
|
case PSN_WIZNEXT:
|
|
Edit_GetText( GetDlgItem( hDlg, IDC_E_DESCRIPTION ),
|
|
szDescriptionFromInf,
|
|
ARRAYSIZE(szDescriptionFromInf) );
|
|
Edit_GetText( GetDlgItem( hDlg, IDC_E_HELPTEXT ),
|
|
szHelpTextFromInf,
|
|
ARRAYSIZE(szHelpTextFromInf) );
|
|
if ( !VerifySIFText( szDescriptionFromInf ) )
|
|
{
|
|
MessageBoxFromStrings( hDlg,
|
|
IDS_OSCHOOSER_RESTRICTION_FIELDS_TITLE,
|
|
IDS_OSCHOOSER_RESTRICTION_FIELDS_TEXT,
|
|
MB_OK );
|
|
SetFocus( GetDlgItem( hDlg, IDC_E_DESCRIPTION ) );
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't go to next dialog
|
|
break;
|
|
}
|
|
|
|
wcscpy( g_Options.szDescription, szDescriptionFromInf );
|
|
|
|
if ( !VerifySIFText( szHelpTextFromInf ) )
|
|
{
|
|
MessageBoxFromStrings( hDlg,
|
|
IDS_OSCHOOSER_RESTRICTION_FIELDS_TITLE,
|
|
IDS_OSCHOOSER_RESTRICTION_FIELDS_TEXT,
|
|
MB_OK );
|
|
SetFocus( GetDlgItem( hDlg, IDC_E_HELPTEXT ) );
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't go to next dialog
|
|
break;
|
|
}
|
|
|
|
wcscpy( g_Options.szHelpText, szHelpTextFromInf );
|
|
|
|
g_Options.fRetrievedWorkstationString = TRUE;
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), 0 );
|
|
break;
|
|
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fError
|
|
|| g_Options.fAbort
|
|
|| !g_Options.fNewOS ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
break;
|
|
}
|
|
|
|
if (g_Options.szDescription[0] == L'\0') {
|
|
//
|
|
// we did not find a description from txtsetup.sif
|
|
//
|
|
if (SUCCEEDED(GetHelpAndDescriptionTextFromSif(
|
|
szHelpTextFromInf,
|
|
ARRAYSIZE(szHelpTextFromInf),
|
|
szDescriptionFromInf,
|
|
ARRAYSIZE(szDescriptionFromInf)))) {
|
|
wcscpy(g_Options.szDescription,szDescriptionFromInf);
|
|
wcscpy(g_Options.szHelpText,szHelpTextFromInf);
|
|
}
|
|
} else {
|
|
//
|
|
// We got a description and need to build the Help text
|
|
//
|
|
if (g_Options.szHelpText[0] == L'\0') {
|
|
dw = LoadString( g_hinstance, IDS_DEFAULT_HELPTEXT,
|
|
szHelpTextFormat, ARRAYSIZE(szHelpTextFormat) );
|
|
Assert( dw );
|
|
wsprintf(g_Options.szHelpText, szHelpTextFormat, g_Options.szDescription);
|
|
}
|
|
}
|
|
|
|
SetDlgItemText( hDlg, IDC_E_DESCRIPTION, g_Options.szDescription );
|
|
SetDlgItemText( hDlg, IDC_E_HELPTEXT, g_Options.szHelpText );
|
|
|
|
DWORD dwLen1 = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_DESCRIPTION) );
|
|
DWORD dwLen2 = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_HELPTEXT) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ),
|
|
(dwLen1 && dwLen2 ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK) );
|
|
|
|
ClearMessageQueue( );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch( LOWORD( wParam ) )
|
|
{
|
|
case IDC_E_DESCRIPTION:
|
|
if ( HIWORD( wParam ) == EN_CHANGE ) {
|
|
DWORD dwLen1 = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_DESCRIPTION) );
|
|
DWORD dwLen2 = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_HELPTEXT) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ),
|
|
(dwLen1 && dwLen2 ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK) );
|
|
}
|
|
break;
|
|
|
|
case IDC_E_HELPTEXT:
|
|
if ( HIWORD( wParam ) == EN_CHANGE ) {
|
|
DWORD dwLen1 = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_DESCRIPTION) );
|
|
DWORD dwLen2 = Edit_GetTextLength( GetDlgItem( hDlg, IDC_E_HELPTEXT) );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ),
|
|
(dwLen1 && dwLen2 ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK) );
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// ScreensDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
ScreensDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
SetFocus( GetDlgItem( hDlg, IDC_R_SAVEOLDFILES ) );
|
|
BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
return FALSE;
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fError
|
|
|| g_Options.fAbort
|
|
|| !g_Options.fNewOS
|
|
|| !g_Options.fOSChooserScreensDirectory
|
|
|| g_Options.fFirstTime ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
|
|
break;
|
|
}
|
|
|
|
LONG lResult;
|
|
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_R_LEAVEALONE ) );
|
|
g_Options.fScreenLeaveAlone = !!(lResult == BST_CHECKED);
|
|
|
|
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_R_OVERWRITE ) );
|
|
g_Options.fScreenOverwrite = !!(lResult == BST_CHECKED);
|
|
|
|
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_R_SAVEOLDFILES ) );
|
|
g_Options.fScreenSaveOld = !!(lResult == BST_CHECKED);
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK |
|
|
( g_Options.fScreenLeaveAlone
|
|
| g_Options.fScreenOverwrite
|
|
| g_Options.fScreenSaveOld ? PSWIZB_NEXT : 0 ) );
|
|
ClearMessageQueue( );
|
|
break;
|
|
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
if ( HIWORD( wParam ) == BN_CLICKED ) {
|
|
LONG lResult;
|
|
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_R_LEAVEALONE ) );
|
|
g_Options.fScreenLeaveAlone = !!(lResult == BST_CHECKED);
|
|
|
|
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_R_OVERWRITE ) );
|
|
g_Options.fScreenOverwrite = !!(lResult == BST_CHECKED);
|
|
|
|
lResult = Button_GetCheck( GetDlgItem( hDlg, IDC_R_SAVEOLDFILES ) );
|
|
g_Options.fScreenSaveOld = !!(lResult == BST_CHECKED);
|
|
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK |
|
|
( g_Options.fScreenLeaveAlone
|
|
| g_Options.fScreenOverwrite
|
|
| g_Options.fScreenSaveOld ? PSWIZB_NEXT : 0 ) );
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// LanguageDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
LanguageDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( !g_Options.fNewOS
|
|
|| g_Options.fError
|
|
|| g_Options.fAbort ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // do not show this page
|
|
return TRUE;
|
|
} else {
|
|
|
|
WCHAR szCodePage[ 32 ];
|
|
DWORD dwCodePage;
|
|
LPTSTR psz;
|
|
|
|
if (g_Options.fAutomated) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
}
|
|
|
|
// we should have the workstation language by now
|
|
Assert( g_Options.fLanguageSet );
|
|
|
|
if ((dwCodePage = GetSystemDefaultLCID())) {
|
|
DebugMsg( "Server's Installation Code Page: 0x%04x\n", dwCodePage );
|
|
if ( dwCodePage != g_Options.dwWksCodePage ) {
|
|
// Check to see if the OSChooser\<Language> exists. If it does,
|
|
// we don't show the warning page.
|
|
WCHAR szPath[ MAX_PATH ];
|
|
wsprintf(
|
|
szPath,
|
|
L"%s\\OSChooser\\%s",
|
|
g_Options.szIntelliMirrorPath,
|
|
g_Options.szLanguage );
|
|
|
|
DebugMsg( "Checking for %s directory....", szPath );
|
|
if ( 0xFFFFffff == GetFileAttributes( szPath ) ) // doesn't exist
|
|
{ // show the page
|
|
DebugMsg( "doesn't exist.\n" );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_NEXT | PSWIZB_BACK );
|
|
ClearMessageQueue( );
|
|
return TRUE;
|
|
}
|
|
DebugMsg( "does. Skip warning.\n" );
|
|
// don't show the page, must have already been prompted
|
|
// before.
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
return TRUE;
|
|
} else {
|
|
// don't show the page, the locales match
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//
|
|
// SummaryDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
SummaryDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( !g_Options.fNewOS
|
|
|| g_Options.fError
|
|
|| g_Options.fAbort ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // do not show this page
|
|
break;
|
|
} else {
|
|
WCHAR szText[ SMALL_BUFFER_SIZE ] = { L'\0' };
|
|
WCHAR szFilepath[ MAX_PATH ];
|
|
DWORD dwLen = 0;
|
|
RECT rect;
|
|
|
|
if( g_Options.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL ) {
|
|
|
|
DWORD dw = LoadString( g_hinstance, IDS_X86, szText, ARRAYSIZE( szText ));
|
|
Assert( dw );
|
|
|
|
} else if ( g_Options.ProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ) {
|
|
|
|
DWORD dw = LoadString( g_hinstance, IDS_IA64, &szText[ dwLen ], ARRAYSIZE( szText ) - dwLen );
|
|
Assert( dw );
|
|
}
|
|
|
|
// attempt to ellipsis path
|
|
lstrcpy( szFilepath, g_Options.szSourcePath );
|
|
GetWindowRect( GetDlgItem( hDlg, IDC_S_SOURCEPATH ), &rect );
|
|
PathCompactPath( NULL, szFilepath, rect.right - rect.left );
|
|
|
|
SetDlgItemText( hDlg, IDC_S_SOURCEPATH, szFilepath );
|
|
SetDlgItemText( hDlg, IDC_S_OSDIRECTORY, g_Options.szInstallationName );
|
|
SetDlgItemText( hDlg, IDC_S_PLATFORM, szText );
|
|
|
|
SetDlgItemText( hDlg, IDC_S_INTELLIMIRRORROOT, g_Options.szIntelliMirrorPath );
|
|
SetDlgItemText( hDlg, IDC_S_LANGUAGE, g_Options.szLanguage );
|
|
|
|
wsprintf( szFilepath, L"%s.%s", g_Options.szMajorVersion, g_Options.szMinorVersion );
|
|
SetDlgItemText( hDlg, IDC_S_NTVERSION, szFilepath );
|
|
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_FINISH | PSWIZB_BACK );
|
|
ClearMessageQueue( );
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// ServerOKDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
ServerOKDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fNewOS
|
|
|| g_Options.fError
|
|
|| g_Options.fAbort ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
HRESULT hr = CheckInstallation( );
|
|
if ( hr != S_OK ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
PropSheet_PressButton( GetParent( hDlg ), PSBTN_FINISH );
|
|
break;
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | PSWIZB_FINISH );
|
|
ClearMessageQueue( );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//
|
|
// CheckWelcomeDlgProc( )
|
|
//
|
|
// "Check's Welcome" dialog proc.
|
|
//
|
|
INT_PTR CALLBACK
|
|
CheckWelcomeDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( !g_Options.fCheckServer ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_NEXT );
|
|
ClearMessageQueue( );
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
// CheckInstallation( );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), 0 );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//
|
|
// AddWelcomeDlgProc( )
|
|
//
|
|
// "Add's Welcome" dialog proc.
|
|
//
|
|
INT_PTR CALLBACK
|
|
AddWelcomeDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( !g_Options.fAddOption ) {
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_NEXT );
|
|
ClearMessageQueue( );
|
|
break;
|
|
|
|
case PSN_WIZNEXT:
|
|
// CheckInstallation( );
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), 0 );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// ExamineServerDlgProc( )
|
|
//
|
|
// This is the screen that is shown wait CheckInstallation() runs for
|
|
// the first time. I had to move it from the InitializeOptions() because
|
|
// "-upgrade" shouldn't go through the exhaustive search and possibly
|
|
// show UI.
|
|
//
|
|
INT_PTR CALLBACK
|
|
ExamineServerDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
NMHDR FAR *lpnmhdr;
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_NOTIFY:
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
|
|
lpnmhdr = (NMHDR FAR *) lParam;
|
|
switch ( lpnmhdr->code )
|
|
{
|
|
case PSN_QUERYCANCEL:
|
|
return VerifyCancel( hDlg );
|
|
|
|
case PSN_SETACTIVE:
|
|
if ( g_Options.fAlreadyChecked
|
|
|| g_Options.fError
|
|
|| g_Options.fAbort )
|
|
{
|
|
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
|
|
break;
|
|
}
|
|
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), 0 );
|
|
ClearMessageQueue( );
|
|
PostMessage( hDlg, WM_USER, 0, 0 );
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_USER:
|
|
{
|
|
DWORD hr;
|
|
HANDLE hThread;
|
|
hThread = CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE) &CheckInstallation, NULL, NULL, NULL );
|
|
while ( WAIT_TIMEOUT == WaitForSingleObject( hThread, 0) )
|
|
{
|
|
MSG Msg;
|
|
if ( PeekMessage( &Msg, NULL, 0, 0, PM_REMOVE ) )
|
|
{
|
|
DispatchMessage( &Msg );
|
|
}
|
|
}
|
|
if ( GetExitCodeThread( hThread, &hr ) )
|
|
{
|
|
DebugMsg( "Thread Exit Code was 0x%08x\n", hr );
|
|
// If check installation failed, bail!
|
|
if ( FAILED( hr ) ) {
|
|
// Bail on the whole thing. Fake the finish button so
|
|
// we can exit without the "Are you sure?" dialog popping up.
|
|
g_Options.fError = TRUE;
|
|
PropSheet_SetWizButtons( GetParent( hDlg ), PSBTN_FINISH );
|
|
PropSheet_PressButton( GetParent( hDlg ), PSBTN_FINISH );
|
|
break;
|
|
}
|
|
}
|
|
|
|
CloseHandle( hThread );
|
|
g_Options.fAlreadyChecked = TRUE;
|
|
|
|
// Push the next button
|
|
PropSheet_PressButton( GetParent( hDlg ), PSBTN_NEXT );
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
LBITEMDATA items[] = {
|
|
{ STATE_NOTSTARTED, IDS_CREATINGDIRECTORYTREE, CreateDirectories, TEXT("") }, // 0
|
|
{ STATE_NOTSTARTED, IDS_COPYSERVERFILES, CopyServerFiles, TEXT("") }, // 1
|
|
{ STATE_NOTSTARTED, IDS_COPYINGFILES, CopyClientFiles, TEXT("") }, // 2
|
|
{ STATE_NOTSTARTED, IDS_UPDATINGSCREENS, CopyScreenFiles, TEXT("") }, // 3
|
|
{ STATE_NOTSTARTED, IDS_COPYTEMPLATEFILES, CopyTemplateFiles, TEXT("") }, // 4
|
|
{ STATE_NOTSTARTED, IDS_CREATING_SERVICES, CreateRemoteBootServices, TEXT("") }, // 5
|
|
{ STATE_NOTSTARTED, IDS_UPDATINGREGISTRY, ModifyRegistry, TEXT("") }, // 6
|
|
{ STATE_NOTSTARTED, IDS_CREATING_SIS_VOLUME, CreateSISVolume, TEXT("") }, // 7
|
|
{ STATE_NOTSTARTED, IDS_STARTING_SERVICES, StartRemoteBootServices, TEXT("") }, // 8
|
|
{ STATE_NOTSTARTED, IDS_AUTHORIZING_DHCP, AuthorizeDhcp, TEXT("") } // 9
|
|
};
|
|
|
|
|
|
//
|
|
// SetupDlgProc( )
|
|
//
|
|
INT_PTR CALLBACK
|
|
SetupDlgProc(
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam )
|
|
{
|
|
static BOOL bDoneFirstPass;
|
|
static UINT nItems;
|
|
static HBRUSH hBrush = NULL;
|
|
LPSETUPDLGDATA psdd = (LPSETUPDLGDATA) GetWindowLongPtr( hDlg, GWLP_USERDATA );
|
|
|
|
switch ( uMsg )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
BITMAP bm;
|
|
|
|
// grab the bitmaps
|
|
psdd = (LPSETUPDLGDATA) TraceAlloc( GMEM_FIXED, sizeof(SETUPDLGDATA) );
|
|
|
|
if (psdd == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
psdd->hChecked = LoadImage( g_hinstance,
|
|
MAKEINTRESOURCE( IDB_CHECK ),
|
|
IMAGE_BITMAP,
|
|
0, 0,
|
|
LR_DEFAULTSIZE | LR_LOADTRANSPARENT );
|
|
DebugMemoryAddHandle( psdd->hChecked );
|
|
GetObject( psdd->hChecked, sizeof(bm), &bm );
|
|
psdd->dwWidth = bm.bmWidth;
|
|
|
|
psdd->hError = LoadImage( g_hinstance,
|
|
MAKEINTRESOURCE( IDB_X ),
|
|
IMAGE_BITMAP,
|
|
0, 0,
|
|
LR_DEFAULTSIZE | LR_LOADTRANSPARENT );
|
|
DebugMemoryAddHandle( psdd->hError );
|
|
GetObject( psdd->hError, sizeof(bm), &bm );
|
|
psdd->dwWidth = ( psdd->dwWidth > bm.bmWidth ? psdd->dwWidth : bm.bmWidth );
|
|
|
|
psdd->hArrow = LoadImage( g_hinstance,
|
|
MAKEINTRESOURCE( IDB_ARROW ),
|
|
IMAGE_BITMAP,
|
|
0, 0,
|
|
LR_DEFAULTSIZE | LR_LOADTRANSPARENT );
|
|
DebugMemoryAddHandle( psdd->hArrow );
|
|
GetObject( psdd->hArrow, sizeof(bm), &bm );
|
|
psdd->dwWidth = ( psdd->dwWidth > bm.bmWidth ?
|
|
psdd->dwWidth :
|
|
bm.bmWidth );
|
|
|
|
HWND hwnd = GetDlgItem( hDlg, IDC_L_SETUP );
|
|
|
|
HFONT hFontOld = (HFONT) SendMessage( hwnd, WM_GETFONT, 0, 0);
|
|
if(hFontOld != NULL)
|
|
{
|
|
LOGFONT lf;
|
|
if ( GetObject( hFontOld, sizeof(LOGFONT), (LPSTR) &lf ) )
|
|
{
|
|
psdd->hFontNormal = CreateFontIndirect(&lf);
|
|
DebugMemoryAddHandle( psdd->hFontNormal );
|
|
|
|
lf.lfWeight = FW_BOLD;
|
|
psdd->hFontBold = CreateFontIndirect(&lf);
|
|
DebugMemoryAddHandle( psdd->hFontBold );
|
|
}
|
|
}
|
|
|
|
HDC hDC = GetDC( NULL );
|
|
HANDLE hOldFont = SelectObject( hDC, psdd->hFontBold );
|
|
TEXTMETRIC tm;
|
|
GetTextMetrics( hDC, &tm );
|
|
psdd->dwHeight = tm.tmHeight + 2;
|
|
SelectObject( hDC, hOldFont );
|
|
ReleaseDC( NULL, hDC );
|
|
|
|
ListBox_SetItemHeight( hwnd, -1, psdd->dwHeight );
|
|
|
|
SetWindowLongPtr( hDlg, GWLP_USERDATA, (LONG_PTR) psdd );
|
|
|
|
//
|
|
// Eliminate things that have already been done
|
|
//
|
|
if ( g_Options.fDirectoryTreeExists
|
|
&& g_Options.fIMirrorShareFound ) {
|
|
items[ 0 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
if ( !g_Options.fFirstTime
|
|
&& g_Options.fTFTPDFilesFound
|
|
&& g_Options.fSISFilesFound
|
|
&& g_Options.fSISGrovelerFilesFound
|
|
&& g_Options.fOSChooserInstalled
|
|
&& g_Options.fBINLFilesFound
|
|
&& g_Options.fRegSrvDllsFilesFound ) {
|
|
items[ 1 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
if ( !g_Options.fNewOS ) {
|
|
items[ 2 ].uState = STATE_WONTSTART;
|
|
items[ 3 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
if ( !g_Options.fNewOS
|
|
|| ( g_Options.fScreenLeaveAlone
|
|
&& !g_Options.fFirstTime ) ) {
|
|
items[ 3 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
if ( !g_Options.fNewOS ) {
|
|
items[ 4 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
if ( g_Options.fBINLServiceInstalled
|
|
&& g_Options.fTFTPDServiceInstalled
|
|
&& g_Options.fSISServiceInstalled
|
|
&& g_Options.fSISGrovelerServiceInstalled
|
|
&& g_Options.fBINLSCPFound ) {
|
|
items[ 5 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
if ( g_Options.fRegistryIntact
|
|
&& g_Options.fRegSrvDllsRegistered
|
|
&& g_Options.fTFTPDDirectoryFound ) {
|
|
items[ 6 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
if ( g_Options.fSISVolumeCreated ) {
|
|
items[ 7 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
if( g_Options.fDontAuthorizeDhcp ) {
|
|
items[ 9 ].uState = STATE_WONTSTART;
|
|
}
|
|
|
|
nItems = 0;
|
|
for( int i = 0; i < ARRAYSIZE(items); i++ )
|
|
{
|
|
if ( items[i].uState != STATE_WONTSTART ) {
|
|
DWORD dw = LoadString( g_hinstance,
|
|
items[ i ].rsrcId,
|
|
items[ i ].szText,
|
|
ARRAYSIZE( items[ i ].szText ) );
|
|
Assert( dw );
|
|
|
|
ListBox_AddString( hwnd, &items[ i ] );
|
|
nItems++;
|
|
}
|
|
}
|
|
|
|
bDoneFirstPass = FALSE;
|
|
|
|
//
|
|
// Set a timer to fire in a few seconds so that we can force
|
|
// the setup to proceed even if we don't get the WM_DRAWITEM
|
|
// messages
|
|
//
|
|
SetTimer(hDlg,1,3 * 1000,NULL);
|
|
|
|
}
|
|
|
|
CenterDialog( hDlg );
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
|
|
case WM_DESTROY:
|
|
{
|
|
Assert( psdd );
|
|
if ( hBrush != NULL )
|
|
{
|
|
DeleteObject(hBrush);
|
|
hBrush = NULL;
|
|
}
|
|
DeleteObject( psdd->hChecked );
|
|
DebugMemoryDelete( psdd->hChecked );
|
|
DeleteObject( psdd->hError );
|
|
DebugMemoryDelete( psdd->hError );
|
|
DeleteObject( psdd->hArrow );
|
|
DebugMemoryDelete( psdd->hArrow );
|
|
DeleteObject( psdd->hFontNormal );
|
|
DebugMemoryDelete( psdd->hFontNormal );
|
|
DeleteObject( psdd->hFontBold );
|
|
DebugMemoryDelete( psdd->hFontBold );
|
|
TraceFree( psdd );
|
|
SetWindowLongPtr( hDlg, GWLP_USERDATA, NULL );
|
|
}
|
|
break;
|
|
|
|
case WM_STARTSETUP:
|
|
{
|
|
HWND hwnd = GetDlgItem( hDlg, IDC_L_SETUP );
|
|
RECT rc;
|
|
INT nProgressBoxHeight = 0;
|
|
HRESULT hr;
|
|
|
|
SetDlgItemText( hDlg, IDC_S_OPERATION, TEXT("") );
|
|
SendMessage( GetDlgItem( hDlg, IDC_P_METER) , PBM_SETPOS, 0, 0 );
|
|
GetClientRect( hwnd, &rc );
|
|
|
|
//
|
|
// Create the directories paths...
|
|
//
|
|
BuildDirectories( );
|
|
INT i = 0;
|
|
|
|
if (g_Options.fError) {
|
|
// Already tanked, set the first item with an error.
|
|
for(i=0;i< ARRAYSIZE(items);i++){
|
|
if(items[i].uState != STATE_WONTSTART){
|
|
items[i].uState = STATE_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
while ( i < ARRAYSIZE( items )
|
|
&& !g_Options.fError
|
|
&& !g_Options.fAbort )
|
|
{
|
|
if ( items[ i ].uState != STATE_WONTSTART )
|
|
{
|
|
hr = CheckInstallation( );
|
|
if ( FAILED(hr) ) {
|
|
g_Options.fError = TRUE;
|
|
items[i].uState = STATE_ERROR;
|
|
break;
|
|
}
|
|
items[ i ].uState = STATE_STARTED;
|
|
InvalidateRect( hwnd, &rc, TRUE );
|
|
|
|
// process some messages
|
|
MSG Msg;
|
|
while ( PeekMessage( &Msg, NULL, 0, 0, PM_REMOVE ) )
|
|
{
|
|
TranslateMessage( &Msg );
|
|
DispatchMessage( &Msg );
|
|
}
|
|
hr = THR( items[ i ].pfn( hDlg ) );
|
|
if ( FAILED(hr) ) {
|
|
// fatal error - halt installation
|
|
items[ i ].uState = STATE_ERROR;
|
|
g_Options.fError = TRUE;
|
|
} else if ( hr == S_FALSE ) {
|
|
// non-fatal error - but something went wrong
|
|
items[ i ].uState = STATE_ERROR;
|
|
} else {
|
|
items[ i ].uState = STATE_DONE;
|
|
}
|
|
InvalidateRect( hwnd, &rc, TRUE );
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
hr = THR( CheckInstallation( ) );
|
|
|
|
if (g_Options.fFirstTime) {
|
|
// We believe this is the first time risetup has been run
|
|
if ( i > 0 ) {
|
|
// There were items in the list to start with
|
|
if ( items[ i - 1].rsrcId == IDS_AUTHORIZING_DHCP) {
|
|
//
|
|
// We reached the dhcp task, which implies we
|
|
// finished
|
|
GetSetRanFlag( FALSE, FALSE );
|
|
} else {
|
|
//
|
|
// We never reached dhcp authorization (or we
|
|
// skipped it)
|
|
//
|
|
GetSetRanFlag( FALSE, g_Options.fError );
|
|
}
|
|
}
|
|
}
|
|
|
|
// If no errors, exit.
|
|
if ( g_Options.fAutomated && !g_Options.fError )
|
|
{
|
|
EndDialog( hDlg, 1 );
|
|
}
|
|
else
|
|
{ // we are not bailing, resize, etc.
|
|
// disable & hide "Cancel" button
|
|
HWND hwndCancel = GetDlgItem( hDlg, IDCANCEL );
|
|
ShowWindow( hwndCancel, SW_HIDE );
|
|
EnableWindow( hwndCancel, FALSE );
|
|
|
|
// hide progress bar stuff
|
|
HWND hwndGroupBox = GetDlgItem( hDlg, IDC_G_OPERATION );
|
|
ShowWindow( GetDlgItem( hDlg, IDC_S_OPERATION), SW_HIDE );
|
|
ShowWindow( GetDlgItem( hDlg, IDC_P_METER), SW_HIDE );
|
|
ShowWindow( hwndGroupBox, SW_HIDE );
|
|
GetWindowRect( hwndGroupBox, &rc );
|
|
nProgressBoxHeight = rc.bottom - rc.top;
|
|
|
|
// make "Done" button move it up and make it visible
|
|
HWND hwndOK = GetDlgItem( hDlg, IDOK );
|
|
GetWindowRect( hwndOK, &rc );
|
|
MapWindowPoints( NULL, hDlg, (LPPOINT) &rc, 2 );
|
|
SetWindowPos( hwndOK,
|
|
NULL,
|
|
rc.left, rc.top - nProgressBoxHeight,
|
|
0, 0,
|
|
SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW );
|
|
|
|
// make "Done" the default button
|
|
LONG lStyle = GetWindowLong( hwndOK, GWL_STYLE );
|
|
lStyle |= BS_DEFPUSHBUTTON;
|
|
SetWindowLong( hwndOK, GWL_STYLE, lStyle );
|
|
EnableWindow( hwndOK, TRUE );
|
|
|
|
// Shrink dialog
|
|
GetWindowRect( hDlg, &rc );
|
|
MoveWindow( hDlg,
|
|
rc.left, rc.top,
|
|
rc.right - rc.left, rc.bottom - rc.top - nProgressBoxHeight,
|
|
TRUE );
|
|
}
|
|
}
|
|
break;
|
|
|
|
|
|
case WM_MEASUREITEM:
|
|
{
|
|
LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT) lParam;
|
|
RECT rc;
|
|
HWND hwnd = GetDlgItem( hDlg, IDC_L_SETUP );
|
|
|
|
GetClientRect( hwnd, &rc );
|
|
|
|
lpmis->itemWidth = rc.right - rc.left;
|
|
lpmis->itemHeight = 15;
|
|
}
|
|
break;
|
|
|
|
case WM_DRAWITEM:
|
|
{
|
|
Assert( psdd );
|
|
|
|
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
|
|
LPLBITEMDATA plbid = (LPLBITEMDATA) lpdis->itemData;
|
|
RECT rc = lpdis->rcItem;
|
|
HANDLE hOldFont = INVALID_HANDLE_VALUE;
|
|
|
|
rc.right = rc.bottom = psdd->dwWidth;
|
|
|
|
switch ( plbid->uState )
|
|
{
|
|
case STATE_NOTSTARTED:
|
|
hOldFont = SelectObject( lpdis->hDC, psdd->hFontNormal );
|
|
break;
|
|
|
|
case STATE_STARTED:
|
|
DrawBitmap( psdd->hArrow, lpdis, &rc );
|
|
hOldFont = SelectObject( lpdis->hDC, psdd->hFontBold );
|
|
break;
|
|
|
|
case STATE_DONE:
|
|
DrawBitmap( psdd->hChecked, lpdis, &rc );
|
|
hOldFont = SelectObject( lpdis->hDC, psdd->hFontNormal );
|
|
break;
|
|
|
|
case STATE_ERROR:
|
|
DrawBitmap( psdd->hError, lpdis, &rc );
|
|
hOldFont = SelectObject( lpdis->hDC, psdd->hFontNormal );
|
|
break;
|
|
}
|
|
|
|
rc = lpdis->rcItem;
|
|
rc.left += psdd->dwHeight;
|
|
|
|
DrawText( lpdis->hDC, plbid->szText, -1, &rc, DT_LEFT | DT_VCENTER );
|
|
|
|
if ( hOldFont != INVALID_HANDLE_VALUE )
|
|
{
|
|
SelectObject( lpdis->hDC, hOldFont );
|
|
}
|
|
|
|
if ( !bDoneFirstPass && lpdis->itemID == nItems - 1 )
|
|
{
|
|
// delay the message until we have painted at least once.
|
|
bDoneFirstPass = TRUE;
|
|
PostMessage( hDlg, WM_STARTSETUP, 0, 0 );
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case WM_CTLCOLORLISTBOX:
|
|
{
|
|
if ( hBrush == NULL )
|
|
{
|
|
LOGBRUSH brush;
|
|
brush.lbColor = GetSysColor( COLOR_3DFACE );
|
|
brush.lbStyle = BS_SOLID;
|
|
hBrush = (HBRUSH) CreateBrushIndirect( &brush );
|
|
}
|
|
SetBkMode( (HDC) wParam, OPAQUE );
|
|
SetBkColor( (HDC) wParam, GetSysColor( COLOR_3DFACE ) );
|
|
return (INT_PTR)hBrush;
|
|
}
|
|
break;
|
|
|
|
case WM_SETTINGCHANGE:
|
|
if ( hBrush ) {
|
|
DeleteObject( hBrush );
|
|
hBrush = NULL;
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
switch( LOWORD( wParam ) )
|
|
{
|
|
case IDCANCEL:
|
|
if ( HIWORD(wParam) == BN_CLICKED )
|
|
{
|
|
if ( !VerifyCancel( hDlg ) ) {
|
|
EndDialog( hDlg, 0 );
|
|
}
|
|
}
|
|
break;
|
|
case IDOK:
|
|
if ( HIWORD(wParam) == BN_CLICKED )
|
|
{
|
|
EndDialog( hDlg, 1 );
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
case WM_TIMER:
|
|
if ( !bDoneFirstPass && g_Options.fAutomated ) {
|
|
//
|
|
// we're in an unattended setup. We haven't gotten the
|
|
// WM_STARTSETUP signal yet, so we'll do that right here.
|
|
//
|
|
bDoneFirstPass = TRUE;
|
|
PostMessage( hDlg, WM_STARTSETUP, 0, 0 );
|
|
}
|
|
KillTimer(hDlg, 1);
|
|
//
|
|
// fall through
|
|
//
|
|
default:
|
|
return BaseDlgProc( hDlg, uMsg, wParam, lParam );
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|