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

247 lines
6.8 KiB
C++

/****************************************************************************
Copyright (c) Microsoft Corporation 1998
All rights reserved
File: SETUPDLG.CPP
***************************************************************************/
#include "pch.h"
#include "callback.h"
#include "utils.h"
DEFINE_MODULE( "RIPREP" )
//
// DetermineSetupPath( )
//
// Try to figure out if the server selected is the same server
// that this client computer was installed from. If so, make the
// assumption that he'll choose the same image that installed it.
// We'll bypass the screen and auto-fill the g_ImageName.
//
// Returns: TRUE if we were able to that the system was installed
// from the save server that we are posting to.
// otherwize FALSE
//
BOOLEAN
DetermineSetupPath( )
{
HKEY hkeySetup = (HKEY) INVALID_HANDLE_VALUE;
LONG lResult;
WCHAR szServerPath[ MAX_PATH ];
WCHAR szPath[ MAX_PATH ];
DWORD cbPath;
BOOLEAN fMatch = FALSE;
TraceFunc( "DetermineSetupPath( )\n" );
wsprintf( szServerPath, L"\\\\%s", g_ServerName );
lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Setup",
0, // reserved
KEY_READ,
&hkeySetup );
if ( lResult != ERROR_SUCCESS )
goto Error;
cbPath = sizeof(szPath );
lResult = RegQueryValueEx( hkeySetup,
L"SourcePath",
0, // reserved
NULL,
(LPBYTE) &szPath,
&cbPath );
if ( lResult != ERROR_SUCCESS )
goto Error;
if ( StrCmpNI( szPath, szServerPath, wcslen( szServerPath ) ) == 0 )
{
wsprintf( g_ImageName, L"%s\\%s", szPath, g_Architecture );
DebugMsg( "Found Match! Using %s for SetupPath\n", g_ImageName );
fMatch = TRUE;
}
Error:
if ( hkeySetup != INVALID_HANDLE_VALUE )
RegCloseKey( hkeySetup );
RETURN(fMatch);
}
void
PopulateImagesListbox2(
HWND hwndList,
LPWSTR pszDirName,
LPWSTR pszOSPath )
{
HANDLE hFind;
WIN32_FIND_DATA fd;
WCHAR szPath[ MAX_PATH ];
TraceFunc( "PopulateImagesListbox2( )\n" );
wsprintf( szPath, L"%s\\%s\\%s\\templates\\*.sif", pszOSPath, pszDirName, g_Architecture );
hFind = FindFirstFile( szPath, &fd );
if ( hFind != INVALID_HANDLE_VALUE )
{
do
{
if (( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 )
{
WCHAR szType[ 64 ];
DWORD dwCount;
wsprintf( szPath, L"%s\\%s\\%s\\templates\\%s", pszOSPath, pszDirName, g_Architecture, fd.cFileName );
dwCount = GetPrivateProfileString( L"OSChooser",
L"ImageType",
L"",
szType,
ARRAYSIZE(szType),
szPath );
if ( dwCount
&& StrCmpIW( szType, L"flat" ) == 0 )
{
ListBox_AddString( hwndList, pszDirName );
break; // list only once!
}
}
} while ( FindNextFile( hFind, &fd ) );
FindClose( hFind );
}
TraceFuncExit( );
}
void
PopulateImagesListbox(
HWND hwndList )
{
HANDLE hFind;
WIN32_FIND_DATA fd;
WCHAR szPath[ MAX_PATH ];
TraceFunc( "PopulateImagesListbox( )\n" );
ListBox_ResetContent( hwndList );
wsprintf( szPath, L"\\\\%s\\REMINST\\Setup\\%s\\%s\\*", g_ServerName, g_Language, REMOTE_INSTALL_IMAGE_DIR_W );
hFind = FindFirstFile( szPath, &fd );
if ( hFind != INVALID_HANDLE_VALUE )
{
szPath[wcslen(szPath) - 2] = L'\0';
do
{
if ( ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
&& StrCmp( fd.cFileName, L"." ) !=0
&& StrCmp( fd.cFileName, L".." ) !=0 )
{
PopulateImagesListbox2( hwndList, fd.cFileName, szPath );
}
} while ( FindNextFile( hFind, &fd ) );
FindClose( hFind );
}
TraceFuncExit( );
}
//
// SetupPathCheckNextButtonActivation( )
//
VOID
SetupPathCheckNextButtonActivation(
HWND hDlg )
{
TraceFunc( "SetupPathCheckNextButtonActivation( )\n" );
LRESULT lResult = ListBox_GetCurSel( GetDlgItem( hDlg, IDC_L_IMAGES ) );
PropSheet_SetWizButtons( GetParent( hDlg ), PSWIZB_BACK | ( lResult == LB_ERR ? 0 : PSWIZB_NEXT ));
TraceFuncExit( );
}
//
// SetupPathDlgProc()
//
INT_PTR CALLBACK
SetupPathDlgProc(
HWND hDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam )
{
switch (uMsg)
{
default:
return FALSE;
case WM_INITDIALOG:
CenterDialog( GetParent( hDlg ) );
return FALSE;
case WM_COMMAND:
switch ( LOWORD( wParam ) )
{
case IDC_L_IMAGES:
if ( HIWORD( wParam ) == LBN_SELCHANGE )
{
SetupPathCheckNextButtonActivation( hDlg );
}
}
break;
case WM_NOTIFY:
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, FALSE );
LPNMHDR lpnmhdr = (LPNMHDR) lParam;
switch ( lpnmhdr->code )
{
case PSN_WIZNEXT:
{
HWND hwndList = GetDlgItem( hDlg, IDC_L_IMAGES );
UINT sel = ListBox_GetCurSel( hwndList );
if ( sel == -1 )
{
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 );
}
else
{
WCHAR szPath[ MAX_PATH ];
ListBox_GetText( hwndList, sel, szPath );
wsprintf( g_ImageName,
L"\\\\%s\\REMINST\\Setup\\%s\\%s\\%s\\%s",
g_ServerName,
g_Language,
REMOTE_INSTALL_IMAGE_DIR_W,
szPath,
g_Architecture );
}
}
break;
case PSN_QUERYCANCEL:
return VerifyCancel( hDlg );
case PSN_SETACTIVE:
if ( DetermineSetupPath( ) )
{
DebugMsg( "Skipping SetupPath...\n" );
SetWindowLongPtr( hDlg, DWLP_MSGRESULT, -1 ); // don't show
}
else
{
PopulateImagesListbox( GetDlgItem( hDlg, IDC_L_IMAGES ) );
SetupPathCheckNextButtonActivation( hDlg );
ClearMessageQueue( );
}
break;
}
break;
}
return TRUE;
}