windows-nt/Source/XPSP1/NT/base/remoteboot/rbsetup/server/dialogs.cpp
2020-09-26 16:20:57 +08:00

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;
}