Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2355 lines
79 KiB

#include "stdafx.h"
#include <ole2.h>
#include "log.h"
#include <winnetwk.h>
extern int g_GlobalDebugLevelFlag;
extern int g_GlobalDebugLevelFlag_WasSetByUnattendFile;
extern int g_CheckIfMetabaseValueWasWritten;
extern MyLogFile g_MyLogFile;
void Check_For_DebugServiceFlag(void)
{
INFCONTEXT Context;
TSTR strSectionName( MAX_PATH );
TSTR strEntry( MAX_PATH );
// Do this only if unattended install
if (!g_pTheApp->m_fUnattended)
{
return;
}
// The section name to look for in the unattended file
if ( !strSectionName.Copy( UNATTEND_FILE_SECTION ) ||
!strEntry.Copy( _T("") ) )
{
return;
}
//
// Look for our special setting
//
if ( SetupFindFirstLine(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("DebugService"), &Context) )
{
SetupGetStringField(&Context, 1, strEntry.QueryStr(), strEntry.QuerySize(), NULL);
if (0 == _tcsicmp(strEntry.QueryStr(), _T("1")) || 0 == _tcsicmp(strEntry.QueryStr(), _T("true")) )
{
SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle, 34101, strEntry.QueryStr());
}
}
return;
}
void Check_For_DebugLevel(void)
{
INFCONTEXT Context;
TSTR strSectionName( MAX_PATH );
TSTR strEntry( MAX_PATH );
// Do this only if unattended install
if (!g_pTheApp->m_fUnattended)
{
return;
}
// The section name to look for in the unattended file
if ( !strSectionName.Copy( UNATTEND_FILE_SECTION ) ||
!strEntry.Copy( _T("") ) )
{
return;
}
//
// Look for our special setting
//
if ( SetupFindFirstLine(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("DebugLevel"), &Context) )
{
SetupGetStringField(&Context, 1, strEntry.QueryStr(), strEntry.QuerySize(), NULL);
if (IsValidNumber( strEntry.QueryStr() ))
{
g_GlobalDebugLevelFlag = _ttoi( strEntry.QueryStr() );
g_GlobalDebugLevelFlag_WasSetByUnattendFile = TRUE;
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("DebugLevel=%d."),g_GlobalDebugLevelFlag));
}
if (g_GlobalDebugLevelFlag >= LOG_TYPE_TRACE_WIN32_API )
{
g_CheckIfMetabaseValueWasWritten = TRUE;
}
}
return;
}
void Check_Custom_IIS_INF(void)
{
INFCONTEXT Context;
TSTR strSectionName( MAX_PATH );
TSTR_PATH strFullPath( MAX_PATH );
// Do this only if unattended install
if (!g_pTheApp->m_fUnattended)
{
return;
}
// The section name to look for in the unattended file
if ( !strSectionName.Copy( UNATTEND_FILE_SECTION ) )
{
return;
}
//
// Look for our special setting
//
if ( SetupFindFirstLine(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("AlternateIISINF"), &Context) &&
SetupGetStringField(&Context, 1, strFullPath.QueryStr(), strFullPath.QuerySize(), NULL) &&
strFullPath.ExpandEnvironmentVariables()
)
{
if (!IsFileExist( strFullPath.QueryStr() ))
{
iisDebugOut((LOG_TYPE_WARN, _T("Check_Custom_IIS_INF:AlternateIISINF=%s.Not Valid.ignoring unattend value. WARNING.\n"), strFullPath.QueryStr() ));
return;
}
g_pTheApp->m_hInfHandleAlternate = SetupOpenInfFile( strFullPath.QueryStr(), NULL, INF_STYLE_WIN4, NULL);
if ( !g_pTheApp->m_hInfHandleAlternate ||
( g_pTheApp->m_hInfHandleAlternate == INVALID_HANDLE_VALUE )
)
{
iisDebugOut((LOG_TYPE_WARN, _T("Check_Custom_IIS_INF: SetupOpenInfFile failed on file: %s.\n"), strFullPath.QueryStr() ));
return;
}
iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("Check_Custom_IIS_INF:AlternateIISINF=%s\n"), strFullPath.QueryStr() ));
}
}
void Check_Custom_WWW_or_FTP_Path(void)
{
INFCONTEXT Context;
TSTR strSectionName( MAX_PATH );
TSTR_PATH strPath( MAX_PATH );
// Do this only if unattended install
if (!g_pTheApp->m_fUnattended)
{
return;
}
//iisDebugOut((LOG_TYPE_TRACE, _T("Check_Custom_WWW_or_FTP_Path:start\n")));
// The section name to look for in the unattended file
if ( !strSectionName.Copy( UNATTEND_FILE_SECTION ) )
{
return;
}
//
// FTP
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("PathFTPRoot"), &Context) &&
SetupGetStringField(&Context, 1, strPath.QueryStr(), strPath.QuerySize(), NULL) &&
strPath.ExpandEnvironmentVariables() )
{
if (IsValidDirectoryName( strPath.QueryStr() ))
{
iisDebugOut((LOG_TYPE_TRACE, _T("Check_Custom_WWW_or_FTP_Path:Unattendfilepath:PathFTPRoot=%s\n"), strPath.QueryStr() ));
CustomFTPRoot( strPath.QueryStr() );
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_PATH_FTP;
}
else
{
iisDebugOut((LOG_TYPE_WARN, _T("Check_Custom_WWW_or_FTP_Path:Unattendfilepath:PathFTPRoot=%s.Not Valid.ignoring unattend value. WARNING.\n"), strPath.QueryStr() ));
}
}
//
// WWW
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("PathWWWRoot"), &Context) &&
SetupGetStringField(&Context, 1, strPath.QueryStr(), strPath.QuerySize(), NULL) &&
strPath.ExpandEnvironmentVariables() )
{
if (IsValidDirectoryName( strPath.QueryStr() ))
{
iisDebugOut((LOG_TYPE_TRACE, _T("Check_Custom_WWW_or_FTP_Path:Unattendfilepath:PathFTPRoot=%s\n"), strPath.QueryStr() ));
CustomWWWRoot( strPath.QueryStr() );
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_PATH_FTP;
}
else
{
iisDebugOut((LOG_TYPE_WARN, _T("Check_Custom_WWW_or_FTP_Path:Unattendfilepath:PathFTPRoot=%s.Not Valid.ignoring unattend value. WARNING.\n"), strPath.QueryStr() ));
}
}
//iisDebugOut((LOG_TYPE_TRACE, _T("Check_Custom_WWW_or_FTP_Path:end\n")));
return;
}
CInitApp::CInitApp()
{
m_err = 0;
m_hInfHandle = NULL;
m_hInfHandleAlternate = NULL;
m_bAllowMessageBoxPopups = TRUE;
m_bThereWereErrorsChkLogfile = FALSE;
m_bThereWereErrorsFromMTS = FALSE;
m_bWin95Migration = FALSE;
m_bIISAdminWasDisabled = FALSE;
// Product name and application name
m_csAppName = _T("");
m_csIISGroupName = _T("");
// account + passwd for anonymous user
m_csGuestName = _T("");
m_csGuestPassword = _T("");
m_csWAMAccountName = _T("");
m_csWAMAccountPassword = _T("");
m_csWWWAnonyName = _T("");
m_csWWWAnonyPassword = _T("");
m_csFTPAnonyName = _T("");
m_csFTPAnonyPassword = _T("");
dwUnattendConfig = 0;
m_csWAMAccountName_Unattend = _T("");
m_csWAMAccountPassword_Unattend = _T("");
m_csWWWAnonyName_Unattend = _T("");
m_csWWWAnonyPassword_Unattend = _T("");
m_csFTPAnonyName_Unattend = _T("");
m_csFTPAnonyPassword_Unattend = _T("");
m_csWAMAccountName_Remove = _T("");
m_csWWWAnonyName_Remove = _T("");
m_csFTPAnonyName_Remove = _T("");
// machine status
m_csMachineName = _T("");
m_csUsersDomain = _T("");
m_csUsersAccount = _T("");
m_fUninstallMapList_Dirty = FALSE;
m_csWinDir = _T("");
m_csSysDir = _T("");
m_csSysDrive = _T("");
m_csPathSource = _T("");
m_csPathOldInetsrv = _T(""); // the primary destination used by previous iis/pws products
m_csPathInetsrv = _T(""); // the primary destination defaults to m_csSysDir\inetsrv
m_csPathInetpub = _T("");
m_csPathFTPRoot = _T("");
m_csPathWWWRoot = _T("");
m_csPathWebPub = _T("");
m_csPathProgramFiles = _T("");
m_csPathIISSamples = _T("");
m_csPathScripts = _T("");
m_csPathASPSamp = _T("");
m_csPathAdvWorks = _T("");
m_csPathIASDocs = _T("");
m_csPathOldPWSFiles = _T("");
m_csPathOldPWSSystemFiles = _T("");
m_dwOSServicePack = 0;
m_eOS = OS_OTHERS; // OS_W95, OS_NT, OS_OTHERS
m_fNT5 = FALSE;
m_fW95 = FALSE; // TRUE if Win95 (build xxx) or greater
m_eNTOSType = OT_NT_UNKNOWN; // OT_PDC, OT_SAM, OT_BDC, OT_NTS, OT_NTW
m_csPlatform = _T("");
m_fTCPIP = FALSE; // TRUE if TCP/IP is installed
m_eUpgradeType = UT_NONE; // UT_NONE, UT_10, UT_20, etc.
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_eInstallMode = IM_FRESH; // IM_FRESH, IM_MAINTENANCE, IM_UPGRADE
m_dwSetupMode = SETUPMODE_CUSTOM;
m_bRefreshSettings = FALSE;
m_bPleaseDoNotInstallByDefault = FALSE;
m_fNTOperationFlags=0;
m_fNTGuiMode=0;
m_fNtWorkstation=0;
m_fInvokedByNT = 0;
m_fUnattended = FALSE;
m_csUnattendFile = _T("");
m_hUnattendFile = NULL;
m_fEULA = FALSE;
// TRUE if m_csPathOldInetsrv != m_csPathInetsrv, which means,
// we need to migrate the old inetsrv to the new one that is system32\inetsrv.
m_fMoveInetsrv = FALSE;
m_csPathSrcDir = _T("");
m_csMissingFile = _T("");
m_csMissingFilePath = _T("");
m_fWebDownload = FALSE;
}
CInitApp::~CInitApp()
{
}
// function: IsUpgrade
//
// Return whether this is an upgrade or not
//
BOOL
CInitApp::IsUpgrade()
{
return ( m_eUpgradeType != UT_NONE );
}
// function: GetUpgradeVersion
//
// Return the version that we are upgrading from
//
DWORD
CInitApp::GetUpgradeVersion()
{
DWORD dwVer = 0;
if ( !IsUpgrade() )
{
// This is not an upgrade, so return 0
return 0;
}
switch ( m_eUpgradeType )
{
case UT_351:
case UT_10_W95:
case UT_10:
return 1;
break;
case UT_20:
dwVer = 2;
break;
case UT_30:
dwVer = 3;
break;
case UT_40:
dwVer = 4;
break;
case UT_50:
case UT_51:
dwVer = 5;
break;
case UT_60:
dwVer = 6;
break;
case UT_NONE:
default:
dwVer = 0;
}
return dwVer;
}
// The one and only CInitApp object <Global variable>
// --------------------------------------------------
BOOL CInitApp::GetMachineName()
{
TCHAR buf[ CNLEN + 10 ];
DWORD dwLen = CNLEN + 10;
m_csMachineName = _T("");
// Get computername
if ( GetComputerName( buf, &dwLen ))
{
if ( buf[0] != _T('\\') )
{
m_csMachineName = _T("\\");
m_csMachineName += _T("\\");
}
m_csMachineName += buf;
}
else
{
m_err = IDS_CANNOT_GET_MACHINE_NAME;
}
return ( !(m_csMachineName.IsEmpty()) );
}
// Return TRUE, if NT or Win95
// --------------------------------------------------
BOOL CInitApp::GetOS()
{
OSVERSIONINFO VerInfo;
VerInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
GetVersionEx( &VerInfo );
switch (VerInfo.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
m_eOS = OS_NT;
break;
case VER_PLATFORM_WIN32_WINDOWS:
m_eOS = OS_W95;
break;
default:
m_eOS = OS_OTHERS;
break;
}
if ( m_eOS == OS_OTHERS ) {m_err = IDS_OS_NOT_SUPPORT;}
return (m_eOS != OS_OTHERS);
}
// Support NT 4.0 (SP3) or greater
// --------------------------------------------------
BOOL CInitApp::GetOSVersion()
/*++
Routine Description:
This function detects OS version. NT5 or greater is required to run this setup.
Arguments:
None
Return Value:
BOOL
return FALSE, if we fails to detect the OS version,
or it is a NT version which is smaller than v5.0
--*/
{
BOOL fReturn = FALSE;
if ( m_eOS == OS_NT )
{
OSVERSIONINFO vInfo;
vInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if ( GetVersionEx(&vInfo) )
{
// NT5 or greater is required.
if ( vInfo.dwMajorVersion < 5 )
{
m_err = IDS_NT5_NEEDED;
return FALSE;
}
// Start allowing NT 6 for Longhorn builds
if ( ( vInfo.dwMajorVersion == 5 ) ||
( vInfo.dwMajorVersion == 6 ) )
{
m_fNT5 = TRUE;
fReturn = TRUE;
}
}
}
// this line may be used for win98
if (m_eOS == OS_W95)
{
fReturn = TRUE;
}
if ( !fReturn )
{
m_err = IDS_OS_VERSION_NOT_SUPPORTED;
}
return (fReturn);
}
// find out it's a NTS, PDC, BDC, NTW, SAM(PDC)
// --------------------------------------------------
BOOL CInitApp::GetOSType()
{
BOOL fReturn = TRUE;
if ( m_eOS == OS_NT )
{
// If we are in NT guimode setup
// then the registry key stuff is not yet setup
// use the passed in ocmanage.dll stuff to determine
// what we are installing upon.
if (g_pTheApp->m_fNTGuiMode)
{
if (g_pTheApp->m_fNtWorkstation) {m_eNTOSType = OT_NTW;}
else {m_eNTOSType = OT_NTS;}
}
else
{
m_eNTOSType = OT_NTS; // default to stand-alone NTS
CRegKey regProductPath( HKEY_LOCAL_MACHINE, REG_PRODUCTOPTIONS, KEY_READ);
if ( (HKEY)regProductPath )
{
CString strProductType;
LONG lReturnedErrCode = regProductPath.QueryValue( _T("ProductType"), strProductType );
if (lReturnedErrCode == ERROR_SUCCESS)
{
strProductType.MakeUpper();
// ToDo: Sam ?
if (strProductType == _T("WINNT"))
{
m_eNTOSType = OT_NTW;
}
else if (strProductType == _T("SERVERNT"))
{
m_eNTOSType = OT_NTS;
}
else if (strProductType == _T("LANMANNT"))
{
m_eNTOSType = OT_PDC_OR_BDC;
}
else
{
iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("ProductType=%1!s! (UnKnown). FAILER to detect ProductType\n"), strProductType));
fReturn = FALSE;
}
}
else
{
// Shoot, we can't get the registry key,
// let's try using the ocmanage.dll passed in stuff.
if (g_pTheApp->m_fNTGuiMode)
{
if (g_pTheApp->m_fNtWorkstation) {m_eNTOSType = OT_NTW;}
else {m_eNTOSType = OT_NTS;}
}
else
{
GetErrorMsg(lReturnedErrCode, REG_PRODUCTOPTIONS);
m_eNTOSType = OT_NTS; // default to stand-alone NTS
}
}
}
else
{
// Shoot, we can't get the registry key,
// let's try using the ocmanage.dll passed in stuff.
if (g_pTheApp->m_fNTGuiMode)
{
if (g_pTheApp->m_fNtWorkstation) {m_eNTOSType = OT_NTW;}
else {m_eNTOSType = OT_NTS;}
}
else
{
GetErrorMsg(ERROR_CANTOPEN, REG_PRODUCTOPTIONS);
}
}
}
}
if ( !fReturn )
m_err = IDS_CANNOT_DETECT_OS_TYPE;
return(fReturn);
}
// Get WinDir and SysDir of the machine
// WinDir = C:\winnt SysDir = C:\Winnt\system32
// --------------------------------------------------
BOOL CInitApp::GetSysDirs()
{
BOOL fReturn = TRUE;
TCHAR buf[_MAX_PATH];
m_csWinDir = _T("");
m_csSysDir = _T("");
if ( !GetWindowsDirectory( buf, _MAX_PATH ) )
{
return FALSE;
}
m_csWinDir = buf;
if ( !GetSystemDirectory( buf, _MAX_PATH ) )
{
return FALSE;
}
m_csSysDir = buf;
if ( _tcslen( buf ) <= 2 )
{
return FALSE;
}
buf[2] = _T('\0'); // now buf contains the system drive letter
m_csSysDrive = buf;
return fReturn;
}
BOOL CInitApp::IsTCPIPInstalled()
/*++
Routine Description:
This function detects whether TCP/IP is installed,
and set m_fTCPIP appropriately.
Arguments:
None
Return Value:
BOOL
set m_fTCPIP appropriately, and always return TRUE here.
m_fTCPIP will be used later.
--*/
{
// NT 5.0 STUFF
m_fTCPIP = TCPIP_Check_Temp_Hack();
return TRUE;
}
BOOL CInitApp::SetInstallMode()
{
BOOL fReturn = TRUE;
int iTempInstallFreshNT = TRUE;
m_eInstallMode = IM_FRESH;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
// -----------------------------------
// Get the install mode from NT setup (g_pTheApp->m_fNTUpgrade_Mode)
// Can either be:
// 1. SETUPMODE_FRESH. user clicked on fresh option and wants to install NT5 fresh
// a. install iis fresh. do not attempt to upgrade the old iis stuff.
// 2. SETUPMODE_UPGRADE. user clicked on upgrade option and wants to upgrade to NT5
// a. upgrade any iis installations
// b. if no old iis detected, then do not install iis
// 3. SETUPMODE_MAINTENANCE. user is running setup from the control panel add/remove.
// -----------------------------------
if (!m_fInvokedByNT)
{
// if we are not guimode or in add/remove
// then we must be running standalone.
// if we are running standalone, then everything is
// either fresh or maintenance.
m_eInstallMode = IM_FRESH;
m_eUpgradeType = UT_NONE;
if (TRUE == AreWeCurrentlyInstalled())
{
m_eInstallMode = IM_MAINTENANCE;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = TRUE;
}
else
{
CRegKey regINetStp( HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
if ((HKEY) regINetStp)
{
// This must be an upgrade....
if (SetUpgradeType() == TRUE)
{
iisDebugOut((LOG_TYPE_TRACE, _T("SetInstallMode=SETUPMODE_UPGRADE.Upgrading.\n")));
}
else
{
iisDebugOut((LOG_TYPE_TRACE, _T("SetInstallMode=SETUPMODE_UPGRADE.NothingToUpgrade.\n")));
}
}
}
goto SetInstallMode_Exit;
}
// --------------------------------
// Check if we are in the ADD/REMOVE mode...
// --------------------------------
if (g_pTheApp->m_fNTOperationFlags & SETUPOP_STANDALONE)
{
//
// We are in add remove...
//
iisDebugOut((LOG_TYPE_TRACE, _T("SetInstallMode=IM_MAINTENANCE\n")));
m_eInstallMode = IM_MAINTENANCE;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
goto SetInstallMode_Exit;
}
// --------------------------------
//
// FRESH IIS install
//
// if we are not in NT upgrade
// then set everything to do a fresh!
//
// --------------------------------
iTempInstallFreshNT = TRUE;
if (g_pTheApp->m_fNTOperationFlags & SETUPOP_WIN31UPGRADE){iTempInstallFreshNT = FALSE;}
if (g_pTheApp->m_fNTOperationFlags & SETUPOP_WIN95UPGRADE){iTempInstallFreshNT = FALSE;}
if (g_pTheApp->m_fNTOperationFlags & SETUPOP_NTUPGRADE){iTempInstallFreshNT = FALSE;}
if (iTempInstallFreshNT)
{
iisDebugOut((LOG_TYPE_TRACE, _T("SetInstallMode=IM_FRESH\n")));
m_eInstallMode = IM_FRESH;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
goto SetInstallMode_Exit;
}
// --------------------------------
//
// UPGRADE iis install
//
// if we get here then the user checked the "upgrade" button and
// is trying to upgrade from an earlier WIN95/NT351/NT4/NT5 installation.
//
// --------------------------------
//
// Set Upgrade ONLY if there are iis components to upgrade!
// do not install if there is nothing to upgrade
ProcessSection(g_pTheApp->m_hInfHandle, _T("Set_Upgrade_Type_chk"));
// if we processed the upgrade section from the inf and
// we are still in a fresh install, then call this other
// function to make sure we catch known iis upgrade types.
if (g_pTheApp->m_eUpgradeType == UT_NONE)
{SetUpgradeType();}
SetInstallMode_Exit:
if (m_fInvokedByNT){DefineSetupModeOnNT();}
return fReturn;
}
void CInitApp::DefineSetupModeOnNT()
/*++
Routine Description:
This function defines IIS setup mode when invoked by NT5.
NOTE:
Since IIS setup does not run as a standalone program on NT5,
user won't see buttons like Minimum, Typical, Custom,
AddRemove, Reinstall, RemoveAll, UpgradeOnly, UpgradePlus
any more. Hence, we have a totally different way to decide
what mode the setup is running in.
Arguments:
none
Return Value:
set m_dwSetupMode appropriately.
--*/
{
if (m_fInvokedByNT) {
switch (m_eInstallMode) {
case IM_FRESH:
m_dwSetupMode = SETUPMODE_CUSTOM;
break;
case IM_MAINTENANCE:
if (m_fNTGuiMode) {
// invoked in NT GUI mode setup
// treat minor os upgrade like a reinstall
m_dwSetupMode = SETUPMODE_REINSTALL;
m_bRefreshSettings = TRUE;
} else {
// invoked by ControlPanel\AddRemoveApplet
m_dwSetupMode = SETUPMODE_ADDREMOVE;
}
break;
case IM_UPGRADE:
m_dwSetupMode = SETUPMODE_ADDEXTRACOMPS;
break;
default:
break;
}
}
return;
}
void GetVRootValue( CString strRegPath, CString csName, LPTSTR szRegName, CString &csRegValue)
{
CString csRegName;
strRegPath +=_T("\\Parameters\\Virtual Roots");
CRegKey regVR( HKEY_LOCAL_MACHINE, strRegPath, KEY_READ);
csRegName = szRegName;
if ( (HKEY) regVR )
{
regVR.m_iDisplayWarnings = FALSE;
csRegName = csName;
if ( regVR.QueryValue( csName, csRegValue ) != ERROR_SUCCESS )
{
csName += _T(",");
if ( regVR.QueryValue(csName, csRegValue) != ERROR_SUCCESS )
{
// well, we need to scan all the keys
CRegValueIter regEnum( regVR );
CString strName;
DWORD dwType;
int nLen = csName.GetLength();
while ( regEnum.Next( &strName, &dwType ) == ERROR_SUCCESS )
{
CString strLeft = strName.Left(nLen);
if ( strLeft.CompareNoCase(csName) == 0)
{
csRegName = strName;
regVR.QueryValue( strName, csRegValue );
break;
}
}
}
}
// remove the ending ",,something"
int cPos = csRegValue.Find(_T(','));
if ( cPos != (-1))
{
csRegValue = csRegValue.Left( cPos );
}
}
}
void CInitApp::DeriveInetpubFromWWWRoot(void)
{
TSTR strParentDir( MAX_PATH );
if ( !strParentDir.Resize( _tcslen( m_csPathWWWRoot.GetBuffer(0) ) ) )
{
// String is too long to deal with
return;
}
// Try to figure out InetPub Root
// ------------------------------
// Get inetpub dir from wwwroot
// take the m_csPathWWWRoot and back off one dir to find it.
InetGetFilePath(m_csPathWWWRoot, strParentDir.QueryStr() );
if ((IsFileExist( strParentDir.QueryStr() )))
{
m_csPathInetpub = strParentDir.QueryStr();
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Old InetPub='%1!s!'. Exists. so we'll use it.\n"), m_csPathInetpub));
}
else
{
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("Old InetPub='%1!s!'. Does not exist. we'll use the default. WARNING.\n"), strParentDir.QueryStr()));
}
return;
}
void CInitApp::GetOldInetSrvDir(void)
{
CRegKey regINetStp( HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
// Get old InetSrv dir
// -------------------
m_csPathOldInetsrv = m_csPathInetsrv;
if ((HKEY)regINetStp)
{
// Get the old inetsrv dir, and check if it's different
regINetStp.m_iDisplayWarnings = FALSE;
regINetStp.QueryValue( _T("InstallPath"), m_csPathOldInetsrv);
if (-1 != m_csPathOldInetsrv.Find(_T('%')) )
{
// there is a '%' in the string
TSTR_PATH strTempDir;
if ( !strTempDir.Copy( m_csPathOldInetsrv.GetBuffer(0) ) ||
!strTempDir.ExpandEnvironmentVariables() )
{
return;
}
m_csPathOldInetsrv = strTempDir.QueryStr();
}
m_fMoveInetsrv = (m_csPathOldInetsrv.CompareNoCase(m_csPathInetsrv) != 0);
}
return;
}
void CInitApp::GetOldWWWRootDir(void)
{
CString csOldWWWRoot;
//
// Try to get it from the old iis2,3,4 setup location if it's there.
//
CRegKey regINetStp( HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
if ((HKEY) regINetStp)
{
//
// get the old wwwroot from the registry if there.
//
regINetStp.m_iDisplayWarnings = FALSE;
regINetStp.QueryValue(_T("PathWWWRoot"), csOldWWWRoot);
if (-1 != csOldWWWRoot.Find(_T('%')) )
{
TSTR_PATH strTempDir;
if ( !strTempDir.Copy( csOldWWWRoot.GetBuffer(0) ) &&
!strTempDir.ExpandEnvironmentVariables() )
{
return;
}
csOldWWWRoot = strTempDir.QueryStr();
}
// The old wwwRoot may be a network drive.
// what to do then?
// at least check if we can access it!
if ((IsFileExist(csOldWWWRoot)))
{
iisDebugOutSafeParams((LOG_TYPE_TRACE, _T("Old WWWRoot='%1!s!'. Exists. so we'll use it.\n"), csOldWWWRoot));
m_csPathWWWRoot = csOldWWWRoot;
}
else
{
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("OldWWWRoot='%1!s!'. Does not exist. we'll use the default. WARNING.\n"), csOldWWWRoot));
}
}
//
// Try to get it from the old iis2,3,4 Actual W3svc Service location if it's there.
// and overwrite anything that we got from setup -- since w3svc is what is actually used!
//
GetVRootValue(REG_W3SVC, _T("/"), _T("/"), m_csPathWWWRoot);
return;
}
void CInitApp::GetOldIISSamplesLocation(void)
{
//
// Try to get it from the old iis2,3,4 setup location if it's there.
//
CRegKey regINetStp( HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
if ((HKEY)regINetStp)
{
//
// Get the location of the where the samples were installed.
//
m_csPathIISSamples.Empty();
regINetStp.m_iDisplayWarnings = FALSE;
regINetStp.QueryValue( _T("/IISSamples"), m_csPathIISSamples );
if (-1 != m_csPathIISSamples.Find(_T('%')) )
{
TSTR_PATH strTempDir;
if ( !strTempDir.Copy( m_csPathIISSamples.GetBuffer(0) ) &&
!strTempDir.ExpandEnvironmentVariables() )
{
return;
}
m_csPathIISSamples = strTempDir.QueryStr();
}
if ( m_csPathIISSamples.IsEmpty())
{
//
// if Samples path is empty then this an Upgrade,
// Guess where to put Sample Site
//
TSTR strParentDir( MAX_PATH );
TSTR strDir( MAX_PATH );
if ( !strParentDir.Resize( _tcslen( m_csPathWWWRoot.GetBuffer(0) ) ) ||
!strDir.Resize( _tcslen( m_csPathWWWRoot.GetBuffer(0) ) +
_tcslen( _T("iissamples" ) )
)
)
{
return;
}
//
// Get the parent Dir path
//
InetGetFilePath((LPCTSTR)m_csPathWWWRoot, strParentDir.QueryStr() );
//
// Append the samples dir to parent path
//
AppendDir(strParentDir.QueryStr(), _T("iissamples"), strDir.QueryStr() );
m_csPathIISSamples = strDir.QueryStr();
}
}
if (m_eUpgradeType == UT_10_W95)
{
TSTR strParentDir( MAX_PATH );
TSTR strDir( MAX_PATH );
if ( !strParentDir.Resize( _tcslen( m_csPathWWWRoot.GetBuffer(0) ) + _tcslen( _T("iissamples") ) ) ||
!strDir.Resize( _tcslen( m_csPathWWWRoot.GetBuffer(0) ) + _tcslen( _T("webpub") ) )
)
{
return;
}
InetGetFilePath(m_csPathWWWRoot, strParentDir.QueryStr() );
AppendDir(strParentDir.QueryStr() , _T("iissamples"), strDir.QueryStr() );
m_csPathIISSamples = strDir.QueryStr() ;
AppendDir(strParentDir.QueryStr() , _T("webpub"), strDir.QueryStr() );
m_csPathWebPub = strDir.QueryStr() ;
}
return;
}
void CInitApp::GetOldIISDirs(void)
{
CRegKey regINetStp( HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
//
// get values from the previous setup for II2/4 upgrade
//
// Try to get old WWW Root from the service itself
// -----------------------
GetOldWWWRootDir();
// Set Inetpub from whatever we got from www root
DeriveInetpubFromWWWRoot();
// Reset Vars relying on Inetpub
// -----------------------------
m_csPathFTPRoot = m_csPathInetpub + _T("\\ftproot");
m_csPathIISSamples = m_csPathInetpub + _T("\\iissamples");
m_csPathScripts = m_csPathInetpub + _T("\\Scripts");
m_csPathWebPub = m_csPathInetpub + _T("\\webpub");
m_csPathASPSamp = m_csPathInetpub + _T("\\ASPSamp");
m_csPathAdvWorks = m_csPathInetpub + _T("\\ASPSamp\\AdvWorks");
// Try to get old FTP Root from the service itself
// -----------------------
GetVRootValue(REG_MSFTPSVC, _T("/"), _T("/"), m_csPathFTPRoot);
// Get old iis samples location
// ----------------------------
GetOldIISSamplesLocation();
// Get iis 3.0 locations.
// ----------------------
GetVRootValue(REG_W3SVC, _T("/Scripts"), _T("/Scripts"), m_csPathScripts);
GetVRootValue(REG_W3SVC, _T("/ASPSamp"), _T("/ASPSamp"), m_csPathASPSamp);
GetVRootValue(REG_W3SVC, _T("/AdvWorks"), _T("/AdvWorks"), m_csPathAdvWorks);
GetVRootValue(REG_W3SVC, _T("/IASDocs"), _T("/IASDocs"), m_csPathIASDocs);
// Get old InetSrv dir
// -------------------
GetOldInetSrvDir();
return;
}
void CInitApp::SetInetpubDerivatives()
{
m_csPathFTPRoot = m_csPathInetpub + _T("\\ftproot");
m_csPathWWWRoot = m_csPathInetpub + _T("\\wwwroot");
m_csPathWebPub = m_csPathInetpub + _T("\\webpub");
m_csPathIISSamples = m_csPathInetpub + _T("\\iissamples");
m_csPathScripts = m_csPathInetpub + _T("\\scripts");
m_csPathASPSamp = m_csPathInetpub + _T("\\ASPSamp");
m_csPathAdvWorks = m_csPathInetpub + _T("\\ASPSamp\\AdvWorks");
switch (m_eInstallMode)
{
case IM_DEGRADE:
case IM_FRESH:
// use the initialized values
break;
case IM_UPGRADE:
case IM_MAINTENANCE:
{
// override, what ever we just set above!
GetOldIISDirs();
break;
}
}
}
void CInitApp::SetInetpubDir()
{
m_csPathInetpub = m_csSysDrive + _T("\\Inetpub");
// Check if the user wants to override this with a unattend setting
Check_Custom_InetPub();
}
void CInitApp::ResetWAMPassword()
{
LPTSTR pszPassword = NULL;
// create a iwam password
pszPassword = CreatePassword(LM20_PWLEN+1);
if (pszPassword)
{
m_csWAMAccountPassword = pszPassword;
GlobalFree(pszPassword);pszPassword = NULL;
}
}
// Init/Set m_csGuestName, m_csGuestPassword, destinations
// -------------------------------------------------------
void CInitApp::SetSetupParams()
{
// check if the debug level is set in the unattend file
// ----------------------------------------------------
Check_For_DebugLevel();
// init m_csGuestName as IUSR_MachineName, init m_csGuestPassword as a random password
TCHAR szGuestName[UNLEN+1];
memset( (PVOID)szGuestName, 0, sizeof(szGuestName));
CString csMachineName;
csMachineName = m_csMachineName;
csMachineName = csMachineName.Right(csMachineName.GetLength() - 2);
LPTSTR pszPassword = NULL;
// create a default guest name
CString strDefGuest;
MyLoadString( IDS_GUEST_NAME, strDefGuest);
strDefGuest += csMachineName;
_tcsncpy( szGuestName, (LPCTSTR) strDefGuest, LM20_UNLEN+1);
m_csGuestName = szGuestName;
// create a default guest password
pszPassword = CreatePassword(LM20_PWLEN+1);
if (pszPassword)
{
m_csGuestPassword = pszPassword;
GlobalFree(pszPassword);pszPassword = NULL;
}
// Set the ftp/www users to use this default specified one...
m_csWWWAnonyName = m_csGuestName;
m_csWWWAnonyPassword = m_csGuestPassword;
m_csFTPAnonyName = m_csGuestName;
m_csFTPAnonyPassword = m_csGuestPassword;
// init all 4 destinations
m_csPathInetsrv = m_csSysDir + _T("\\inetsrv");
m_csPathIASDocs = m_csPathInetsrv + _T("\\Docs");
m_csPathProgramFiles = m_csSysDrive + _T("\\Program Files");
CRegKey regCurrentVersion(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion"), KEY_READ);
if ( (HKEY)regCurrentVersion )
{
if (regCurrentVersion.QueryValue(_T("ProgramFilesDir"), m_csPathProgramFiles) != 0)
{m_csPathProgramFiles = m_csSysDrive + _T("\\Program Files");}
else
{
if (-1 != m_csPathProgramFiles.Find(_T('%')) )
{
// there is a '%' in the string
TCHAR szTempDir[_MAX_PATH];
_tcscpy(szTempDir, m_csPathProgramFiles);
if (ExpandEnvironmentStrings( (LPCTSTR)m_csPathProgramFiles, szTempDir, sizeof(szTempDir)/sizeof(TCHAR)))
{
m_csPathProgramFiles = szTempDir;
}
}
}
}
CRegKey regCurrentVersionSetup(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Setup"), KEY_READ);
if ( (HKEY)regCurrentVersionSetup )
{
// Get NT installation path
if (regCurrentVersionSetup.QueryValue(_T("SourcePath"), m_csPathNTSrcDir) != 0)
{m_csPathNTSrcDir = m_csSysDrive + _T("\\$WIN_NT$.~LS");}
else
{
if (-1 != m_csPathNTSrcDir.Find(_T('%')) )
{
// there is a '%' in the string
TCHAR szTempDir[_MAX_PATH];
_tcscpy(szTempDir, m_csPathNTSrcDir);
if (ExpandEnvironmentStrings( (LPCTSTR)m_csPathNTSrcDir, szTempDir, sizeof(szTempDir)/sizeof(TCHAR)))
{
m_csPathNTSrcDir = szTempDir;
}
}
}
}
//#ifdef _CHICAGO_
if (m_eUpgradeType == UT_10_W95)
{
BOOL bOSR2 = TRUE;
CRegKey regVersion(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion"), KEY_READ);
if ((HKEY)regVersion)
{
CString csString;
// VersionNumber for OSR2 is 4.00.1111
// VersionNumber for the original win95 is 4.00.950
if (regVersion.QueryValue(_T("VersionNumber"), csString) == ERROR_SUCCESS)
{
if (csString.Compare(_T("4.00.950")) == 0)
bOSR2 = FALSE;
}
}
if (!bOSR2)
{
g_pTheApp->m_csPathOldPWSFiles = m_csPathProgramFiles + _T("\\WebSvr");
g_pTheApp->m_csPathOldPWSSystemFiles = m_csPathProgramFiles + _T("\\WebSvr\\System");
}
else
{
g_pTheApp->m_csPathOldPWSFiles = m_csPathProgramFiles + _T("\\Personal Web Server");
g_pTheApp->m_csPathOldPWSSystemFiles = m_csPathProgramFiles + _T("\\Personal Web Server\\WebServer");
}
}
//#endif //_CHICAGO
return;
}
// Get Platform info
void CInitApp::GetPlatform()
{
if ( m_eOS == OS_NT)
{
SYSTEM_INFO si;
GetSystemInfo( &si );
m_csPlatform = _T("x86");
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {m_csPlatform = _T("x86");}
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) {m_csPlatform = _T("IA64");}
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {m_csPlatform = _T("AMD64");}
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_UNKNOWN) {m_csPlatform = _T("UNKNOWN");}
// save the number of processors for this machine.
m_dwNumberOfProcessors = si.dwNumberOfProcessors;
/* old
TCHAR *p = _tgetenv(_T("PROCESSOR_ARCHITECTURE"));
if ( p )
{m_csPlatform = p;}
else
{m_csPlatform = _T("x86");}
*/
}
return;
}
BOOL CInitApp::GetMachineStatus()
{
if ( ( !GetMachineName() ) || // m_csMachineName
( !GetOS() ) || // m_fOSNT
( !GetOSVersion() ) || // NT 4.0 (Build 1381) or greater
( !GetOSType() ) || // m_eOSType = NT_SRV or NT_WKS
( !GetSysDirs() ) || // m_csWinDir. m_csSysDir
( !IsTCPIPInstalled()) || // errmsg: if NO TCPIP is installed
( !SetInstallMode()) ) // errmsg: if down grade the product
{
return FALSE;
}
SetSetupParams(); // Guest account, destinations
ReGetMachineAndAccountNames();
ResetWAMPassword();
SetInetpubDir();
SetInetpubDerivatives();
UnInstallList_RegRead(); // Get Uninstall information
UnInstallList_SetVars(); // set member variables for uninstall info
// check for any unattend file\custom settings.
Check_Unattend_Settings();
GetPlatform();
GetUserDomain();
return TRUE;
}
int CInitApp::MsgBox(HWND hWnd, int iID, UINT nType, BOOL bGlobalTitle)
{
if (iID == -1) {return IDOK;}
CString csMsg, csTitle;
MyLoadString(iID, csMsg);
csTitle = m_csAppName;
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("CInitApp::MsgBox('%1!s!')\n"), csMsg));
return (::MessageBoxEx(NULL, (LPCTSTR)csMsg, csTitle, nType | MB_SETFOREGROUND, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT)));
}
int CInitApp::MsgBox2(HWND hWnd, int iID,CString csInsertionString,UINT nType)
{
if (iID == -1) {return IDOK;}
CString csFormat, csMsg, csTitle;
MyLoadString(iID, csFormat);
csMsg.Format(csFormat, csInsertionString);
csTitle = m_csAppName;
iisDebugOutSafeParams((LOG_TYPE_WARN, _T("CInitApp::MsgBox2('%1!s!')\n"), csMsg));
return (::MessageBoxEx(NULL, (LPCTSTR)csMsg, csTitle, nType | MB_SETFOREGROUND, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT)));
}
BOOL CInitApp::InitApplication()
// Return Value:
// TRUE: application is initiliazed correctly, continue processing
// FALSE: application is missing some required parameters, like the correct OS, TCPIP, etc.
// setup should be terminated.
{
BOOL fReturn = FALSE;
do {
// Get Machine Status:
// m_eInstallMode(Fresh, Maintenance, Upgrade, Degrade),
// m_eUpgradeType(PROD 2.0, PROD 3.0)
if ( !GetMachineStatus() )
{
CString csMsg;
MyLoadString(m_err, csMsg);
::MessageBoxEx(NULL, (LPCTSTR)csMsg, (LPCTSTR) g_pTheApp->m_csAppName , MB_SETFOREGROUND, MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT));
iisDebugOutSafeParams((LOG_TYPE_ERROR, _T("GetMachineStatus(); MessageBoxEx('%1!s!') FAILER\n"), csMsg));
break;
}
if ( g_pTheApp->m_eInstallMode == IM_MAINTENANCE )
{g_pTheApp->m_fEULA = TRUE;}
fReturn = TRUE;
} while (0);
return fReturn;
}
// open the tcp/ip registry key
// if it's there then tcp/ip is installed
int TCPIP_Check_Temp_Hack(void)
{
int TheReturn = FALSE;
CRegKey regTheKey(HKEY_LOCAL_MACHINE,_T("System\\CurrentControlSet\\Services\\Tcpip"),KEY_READ);
if ((HKEY) regTheKey)
{
TheReturn = TRUE;
}
if (FALSE == TheReturn)
{
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("DETECT:TCPIP not Installed (yet), but we'll proceed as if it were.")));
TheReturn = TRUE;
}
return TheReturn;
}
void GetUserDomain(void)
{
HANDLE hProcess, hAccessToken;
TCHAR InfoBuffer[1000],szAccountName[200], szDomainName[200];
PTOKEN_USER pTokenUser = (PTOKEN_USER)InfoBuffer;
DWORD dwInfoBufferSize;
DWORD dwAccountSize = sizeof(szAccountName)/sizeof(szAccountName[0]);
DWORD dwDomainSize = sizeof(szDomainName)/sizeof(szDomainName[0]);
SID_NAME_USE snu;
hProcess = GetCurrentProcess();
OpenProcessToken(hProcess,TOKEN_READ,&hAccessToken);
GetTokenInformation(hAccessToken,TokenUser,InfoBuffer,1000, &dwInfoBufferSize);
if (LookupAccountSid(NULL, pTokenUser->User.Sid, szAccountName,&dwAccountSize,szDomainName, &dwDomainSize, &snu))
{
if (dwDomainSize)
{
g_pTheApp->m_csUsersDomain = szDomainName;
//_tcscpy(g_szUsersDomain, szDomainName);
}
else
{
g_pTheApp->m_csUsersDomain = _T(" ");
//_tcscpy(g_szUsersDomain, _T(" "));
}
if (dwDomainSize)
{
g_pTheApp->m_csUsersAccount = szAccountName;
//_tcscpy(g_szUsersAccount, szAccountName);
}
else
{
g_pTheApp->m_csUsersAccount = _T(" ");
}
}
}
// This function should only be called in FRESH NT5 setup.
void CInitApp::ReGetMachineAndAccountNames()
{
GetMachineName();
// re-calculate the IUSR_ and IWAM_ account names
TCHAR szGuestName[UNLEN+1];
memset( (PVOID)szGuestName, 0, sizeof(szGuestName));
CString csMachineName;
csMachineName = m_csMachineName;
csMachineName = csMachineName.Right(csMachineName.GetLength() - 2);
CString strDefGuest;
MyLoadString( IDS_GUEST_NAME, strDefGuest);
strDefGuest += csMachineName;
_tcsncpy( szGuestName, (LPCTSTR) strDefGuest, LM20_UNLEN+1);
m_csGuestName = szGuestName;
MyLoadString( IDS_WAM_ACCOUNT_NAME, strDefGuest);
strDefGuest += csMachineName;
_tcsncpy( szGuestName, (LPCTSTR) strDefGuest, LM20_UNLEN+1);
m_csWAMAccountName = szGuestName;
}
void CInitApp::DumpAppVars(void)
{
int iDoOnlyInThisMode = LOG_TYPE_TRACE;
// only do this if the debug mode is trace.
if (g_GlobalDebugLevelFlag >= iDoOnlyInThisMode)
{
iisDebugOut((iDoOnlyInThisMode, _T("=======================\n")));
// machine status
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csMachineName=%1!s!\n"), m_csMachineName));
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csUsersDomain=%1!s!\n"), m_csUsersDomain));
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csUsersAccount=%1!s!\n"), m_csUsersAccount));
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csWinDir=%1!s!\n"), m_csWinDir));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csSysDir=%1!s!\n"), m_csSysDir));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csSysDrive=%1!s!\n"), m_csSysDrive));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathNTSrcDir=%1!s!\n"), m_csPathNTSrcDir));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathSource=%1!s!\n"), m_csPathSource));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathOldInetsrv=%1!s!\n"), m_csPathOldInetsrv));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathInetsrv=%1!s!\n"), m_csPathInetsrv));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathInetpub=%1!s!\n"), m_csPathInetpub));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathFTPRoot=%1!s!\n"), m_csPathFTPRoot));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathWWWRoot=%1!s!\n"), m_csPathWWWRoot));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathWebPub=%1!s!\n"), m_csPathWebPub));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathProgramFiles=%1!s!\n"), m_csPathProgramFiles));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathIISSamples=%1!s!\n"), m_csPathIISSamples));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathScripts=%1!s!\n"), m_csPathScripts));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathASPSamp=%1!s!\n"), m_csPathASPSamp));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathAdvWorks=%1!s!\n"), m_csPathAdvWorks));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathIASDocs=%1!s!\n"), m_csPathIASDocs));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathOldPWSFiles=%1!s!\n"), m_csPathOldPWSFiles));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathOldPWSSystemFiles=%1!s!\n"), m_csPathOldPWSSystemFiles));;
if (m_eOS == OS_NT) {iisDebugOut((iDoOnlyInThisMode, _T("OS=NT\n")));}
if (m_eOS == OS_W95) {iisDebugOut((iDoOnlyInThisMode, _T("OS=W95\n")));}
if (m_eOS == OS_OTHERS) {iisDebugOut((iDoOnlyInThisMode, _T("OS=OTHER\n")));}
if (m_eNTOSType == OT_NTW){iisDebugOut((iDoOnlyInThisMode, _T("m_eNTOSType=OT_NTW (Workstation)\n")));}
if (m_eNTOSType == OT_NTS){iisDebugOut((iDoOnlyInThisMode, _T("m_eNTOSType=OT_NTS (Server)\n")));}
if (m_eNTOSType == OT_PDC_OR_BDC){iisDebugOut((iDoOnlyInThisMode, _T("m_eNTOSType=OT_PDC_OR_BDC (Primary/Backup Domain Controller)\n")));}
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPlatform=%1!s!\n"), m_csPlatform));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_dwNumberOfProcessors=%1!d!\n"), m_dwNumberOfProcessors));;
if (m_fNT5) {iisDebugOut((iDoOnlyInThisMode, _T("OSVersion=5\n")));}
if (m_fW95) {iisDebugOut((iDoOnlyInThisMode, _T("OSVersion=Win95\n")));}
iisDebugOut((iDoOnlyInThisMode, _T("m_dwOSBuild=%d\n"), m_dwOSBuild));
iisDebugOut((iDoOnlyInThisMode, _T("m_dwOSServicePack=0x%x\n"), m_dwOSServicePack));
iisDebugOut((iDoOnlyInThisMode, _T("m_fTCPIP Exists=%d\n"), m_fTCPIP));
if (m_eUpgradeType == UT_NONE){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_NONE\n")));}
if (m_eUpgradeType == UT_10_W95){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_10_W95\n")));}
if (m_eUpgradeType == UT_351){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_351\n")));}
if (m_eUpgradeType == UT_10){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_10\n")));}
if (m_eUpgradeType == UT_20){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_20\n")));}
if (m_eUpgradeType == UT_30){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_30\n")));}
if (m_eUpgradeType == UT_40){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_40\n")));}
if (m_eUpgradeType == UT_50){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_50\n")));}
if (m_eUpgradeType == UT_51){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_51\n")));}
if (m_eUpgradeType == UT_60){iisDebugOut((iDoOnlyInThisMode, _T("m_eUpgradeType=UT_60\n")));}
if (m_eInstallMode == IM_FRESH){iisDebugOut((iDoOnlyInThisMode, _T("m_eInstallMode=IM_FRESH\n")));}
if (m_eInstallMode == IM_UPGRADE){iisDebugOut((iDoOnlyInThisMode, _T("m_eInstallMode=IM_UPGRADE\n")));}
if (m_eInstallMode == IM_MAINTENANCE){iisDebugOut((iDoOnlyInThisMode, _T("m_eInstallMode=IM_MAINTENANCE\n")));}
if (m_eInstallMode == IM_DEGRADE){iisDebugOut((iDoOnlyInThisMode, _T("m_eInstallMode=IM_DEGRADE\n")));}
if (m_dwSetupMode & SETUPMODE_UPGRADE){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_UPGRADE\n")));}
if (m_dwSetupMode == SETUPMODE_UPGRADEONLY){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_UPGRADE | SETUPMODE_UPGRADEONLY\n")));}
if (m_dwSetupMode == SETUPMODE_ADDEXTRACOMPS){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_UPGRADE | SETUPMODE_ADDEXTRACOMPS\n")));}
if (m_dwSetupMode & SETUPMODE_UPGRADE){iisDebugOut((iDoOnlyInThisMode, _T("m_bUpgradeTypeHasMetabaseFlag=%d\n"),m_bUpgradeTypeHasMetabaseFlag));}
if (m_dwSetupMode & SETUPMODE_MAINTENANCE){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_MAINTENANCE\n")));}
if (m_dwSetupMode == SETUPMODE_ADDREMOVE){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_MAINTENANCE | SETUPMODE_ADDREMOVE\n")));}
if (m_dwSetupMode == SETUPMODE_REINSTALL){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_MAINTENANCE | SETUPMODE_REINSTALL\n")));}
if (m_dwSetupMode == SETUPMODE_REMOVEALL){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_MAINTENANCE | SETUPMODE_REMOVEALL\n")));}
if (m_dwSetupMode & SETUPMODE_FRESH){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_FRESH\n")));}
if (m_dwSetupMode == SETUPMODE_MINIMAL){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_FRESH | SETUPMODE_MINIMAL\n")));}
if (m_dwSetupMode == SETUPMODE_TYPICAL){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_FRESH | SETUPMODE_TYPICAL\n")));}
if (m_dwSetupMode == SETUPMODE_CUSTOM){iisDebugOut((iDoOnlyInThisMode, _T("m_dwSetupMode=SETUPMODE_FRESH | SETUPMODE_CUSTOM\n")));}
iisDebugOut((iDoOnlyInThisMode, _T("m_bPleaseDoNotInstallByDefault=%d\n"), m_bPleaseDoNotInstallByDefault));
//if (m_bRefreshSettings == TRUE){iisDebugOut((iDoOnlyInThisMode, _T("m_bRefreshSettings=refresh files + refresh all settings\n")));}
//if (m_bRefreshSettings == FALSE){iisDebugOut((iDoOnlyInThisMode, _T("m_bRefreshSettings=refresh files only\n")));}
if (m_eAction == AT_DO_NOTHING){iisDebugOut((iDoOnlyInThisMode, _T("m_eAction=AT_DO_NOTHING\n")));}
if (m_eAction == AT_REMOVE){iisDebugOut((iDoOnlyInThisMode, _T("m_eAction=AT_REMOVE\n")));}
if (m_eAction == AT_INSTALL_FRESH){iisDebugOut((iDoOnlyInThisMode, _T("m_eAction=AT_INSTALL_FRESH\n")));}
if (m_eAction == AT_INSTALL_UPGRADE){iisDebugOut((iDoOnlyInThisMode, _T("m_eAction=AT_INSTALL_UPGRADE\n")));}
if (m_eAction == AT_INSTALL_REINSTALL){iisDebugOut((iDoOnlyInThisMode, _T("m_eAction=AT_INSTALL_REINSTALL\n")));}
iisDebugOut((iDoOnlyInThisMode, _T("m_fNTOperationFlags=0x%x\n"), m_fNTOperationFlags));
iisDebugOut((iDoOnlyInThisMode, _T("m_fNTGuiMode=%d\n"), m_fNTGuiMode));
iisDebugOut((iDoOnlyInThisMode, _T("m_fInvokedByNT=%d\n"), m_fInvokedByNT));
iisDebugOut((iDoOnlyInThisMode, _T("m_fNtWorkstation=%d\n"), m_fNtWorkstation));
iisDebugOut((iDoOnlyInThisMode, _T("m_fUnattended=%d\n"), m_fUnattended));
iisDebugOut((iDoOnlyInThisMode, _T("m_csUnattendFile=%s\n"), m_csUnattendFile));;
iisDebugOutSafeParams((iDoOnlyInThisMode, _T("m_csPathSrcDir=%1!s!\n"), m_csPathSrcDir));;
iisDebugOut((iDoOnlyInThisMode, _T("=======================\n")));
}
return;
}
int AreWeCurrentlyInstalled()
{
int iReturn = FALSE;
DWORD dwMajorVersion = 0;
CRegKey regINetStp( HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
if ((HKEY) regINetStp)
{
LONG lReturnedErrCode = regINetStp.QueryValue(_T("MajorVersion"), dwMajorVersion);
if (lReturnedErrCode == ERROR_SUCCESS)
{
if (dwMajorVersion == 5)
{
iReturn = TRUE;
}
}
}
return iReturn;
}
#define sz_PreviousIISVersion_string _T("PreviousIISVersion")
int CInitApp::SetUpgradeType(void)
{
int iReturn = FALSE;
DWORD dwMajorVersion = 0;
DWORD dwMinorVersion = 0;
CString csFrontPage;
m_eInstallMode = IM_UPGRADE;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = TRUE;
CRegKey regINetStp( HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
if ((HKEY) regINetStp)
{
LONG lReturnedErrCode = regINetStp.QueryValue(_T("MajorVersion"), dwMajorVersion);
if (lReturnedErrCode == ERROR_SUCCESS)
{
if (dwMajorVersion <= 1)
{
m_eUpgradeType = UT_10;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=0x%x.\n"),sz_PreviousIISVersion_string, dwMajorVersion));
goto SetUpgradeType_Exit;
}
if (dwMajorVersion == 2)
{
m_eUpgradeType = UT_20;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=0x%x.\n"),sz_PreviousIISVersion_string, dwMajorVersion));
goto SetUpgradeType_Exit;
}
if (dwMajorVersion == 3)
{
m_eUpgradeType = UT_30;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=0x%x.\n"),sz_PreviousIISVersion_string, dwMajorVersion));
goto SetUpgradeType_Exit;
}
if (dwMajorVersion == 4)
{
CString csSetupString;
m_eUpgradeType = UT_40;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = TRUE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = TRUE;
regINetStp.m_iDisplayWarnings = FALSE;
if (regINetStp.QueryValue(_T("SetupString"), csSetupString) == NERR_Success)
{
if (csSetupString.CompareNoCase(_T("K2 RTM")) != 0)
{
// Error: upgrade not supported on K2 Beta versions
// Do a fresh if it's k2 beta2!!!!
m_eInstallMode = IM_FRESH;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = FALSE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=0x%x.Beta2.\n"),sz_PreviousIISVersion_string, dwMajorVersion));
goto SetUpgradeType_Exit;
}
}
iisDebugOut((LOG_TYPE_TRACE, _T("%s=0x%x.\n"),sz_PreviousIISVersion_string, dwMajorVersion));
goto SetUpgradeType_Exit;
}
if (dwMajorVersion == 5)
{
// There is a previous version of iis5 on the machine...
// Could be they are upgrading from nt5Workstation to and nt5Server machine!
// or from and server to a workstation! what a nightmare!!!
//m_eInstallMode = IM_FRESH;
m_eUpgradeType = UT_50;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = TRUE;
m_bPleaseDoNotInstallByDefault = FALSE;
regINetStp.m_iDisplayWarnings = FALSE;
if (regINetStp.QueryValue(_T("MinorVersion"), dwMinorVersion) == NERR_Success)
{
if (dwMinorVersion >= 1)
{
m_eUpgradeType = UT_51;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = TRUE;
m_bPleaseDoNotInstallByDefault = FALSE;
}
}
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=0x%x.0x%x\n"),sz_PreviousIISVersion_string, dwMajorVersion,dwMinorVersion));
goto SetUpgradeType_Exit;
}
if (dwMajorVersion == 6)
{
// There is a previous version of iis5 on the machine...
// Could be they are upgrading from nt5Workstation to and nt5Server machine!
// or from and server to a workstation! what a nightmare!!!
//m_eInstallMode = IM_FRESH;
m_eUpgradeType = UT_60;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = TRUE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=0x%x.0x%x\n"),sz_PreviousIISVersion_string, dwMajorVersion,dwMinorVersion));
goto SetUpgradeType_Exit;
}
if (dwMajorVersion > 6)
{
m_eInstallMode = IM_UPGRADE;
m_eUpgradeType = UT_60;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = TRUE;
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=0x%x.0x%x\n"),sz_PreviousIISVersion_string, dwMajorVersion,dwMinorVersion));
goto SetUpgradeType_Exit;
}
// if we get here, then that means
// that we found a version like 7.0 or something
// which we should not upgrade since it is newer than us.
// but hey we're in upgrade mode, so we should set something
m_eInstallMode = IM_UPGRADE;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = TRUE;
iReturn = FALSE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=some other iis version\n"),sz_PreviousIISVersion_string));
}
}
// -----------------------------------
//
// Check for other Rogue versions of IIS
//
// win95 pws 1.0
// win95 fontpage installed pws 1.0 (actually totally different from pws 1.0)
//
// on NT5 we are able to upgrade from:
// Win95 pws 1.0
// Win95 pws 4.0
// on win95 pws 1.0, there was no inetstp dir
// so we must check other things.
// -----------------------------------
{
CRegKey regW3SVC(HKEY_LOCAL_MACHINE, REG_WWWPARAMETERS, KEY_READ);
if ((HKEY)regW3SVC)
{
CByteArray baMajorVersion;
regW3SVC.m_iDisplayWarnings = FALSE;
if (regW3SVC.QueryValue(_T("MajorVersion"), baMajorVersion) == NERR_Success)
{
// Check if we can read the MajorVersion value should be set to '\0' if pws 1.0
if (baMajorVersion[0] == '\0')
{
m_eUpgradeType = UT_10_W95;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=1.\n"),sz_PreviousIISVersion_string));
goto SetUpgradeType_Exit;
}
}
}
}
//
// on win 95 there could be an
// installation of frontpg pws version 1.0
// we don't support upgrading this, so we'll do a fresh if we ever get here.
//
csFrontPage = g_pTheApp->m_csSysDir + _T("\\frontpg.ini");
if (IsFileExist(csFrontPage))
{
TCHAR buf[_MAX_PATH];
GetPrivateProfileString(_T("FrontPage 1.1"), _T("PWSRoot"), _T(""), buf, _MAX_PATH, csFrontPage);
if (*buf && IsFileExist(buf))
{
m_eInstallMode = IM_FRESH;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=1.FrontPage Installation.\n"),sz_PreviousIISVersion_string));
goto SetUpgradeType_Exit;
}
}
//
// This could be an upgrade from WinNT 3.51
// which could have an FTPSVC installed.
// if it's here then install ftp.
// Software\Microsoft\FTPSVC
//
{
CRegKey regNT351FTP(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\FTPSVC"), KEY_READ);
if ((HKEY) regNT351FTP)
{
m_eUpgradeType = UT_351;
m_eInstallMode = IM_UPGRADE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = FALSE;
iReturn = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=NT351.ftp.\n"),sz_PreviousIISVersion_string));
goto SetUpgradeType_Exit;
}
}
// if we get here...then
// 1. we were not able to open the inetsrv reg
// 2. did not find an old pws 1.0 installation
// 3. did not find an old frontpg pws installation.
// 4. did not find nt 3.51 FTPSVC installed.
// since this is supposed to set the upgrade type, and there is nothing to upgrade...
// then we will Not install.....
//iisDebugOut((LOG_TYPE_PROGRAM_FLOW, _T("FRESH FRESH FRESH\n")));
m_eInstallMode = IM_UPGRADE;
m_eUpgradeType = UT_NONE;
m_bUpgradeTypeHasMetabaseFlag = FALSE;
m_bPleaseDoNotInstallByDefault = TRUE;
iisDebugOut((LOG_TYPE_TRACE, _T("%s=None.\n"),sz_PreviousIISVersion_string));
iReturn = FALSE;
SetUpgradeType_Exit:
return iReturn;
}
int CInitApp::Check_Custom_InetPub(void)
{
int iReturn = FALSE;
INFCONTEXT Context;
TSTR strSectionName( MAX_PATH );
TSTR_PATH strCustomInetpub( MAX_PATH );
// Do this only if unattended install
if (!g_pTheApp->m_fUnattended)
{
return iReturn;
}
// The section name to look for in the unattended file
if ( !strSectionName.Copy( UNATTEND_FILE_SECTION ) )
{
return iReturn;
}
//
// InetPub
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("PathInetpub"), &Context) &&
SetupGetStringField(&Context, 1, strCustomInetpub.QueryStr() , strCustomInetpub.QuerySize(), NULL) &&
strCustomInetpub.ExpandEnvironmentVariables() )
{
if (IsValidDirectoryName(strCustomInetpub.QueryStr()))
{
iisDebugOut((LOG_TYPE_TRACE, _T("Check_Custom_InetPub:PathInetpub=%s\n"), strCustomInetpub.QueryStr() ));
m_csPathInetpub = strCustomInetpub.QueryStr();
iReturn = TRUE;
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_PATH_INETPUB;
}
else
{
iisDebugOut((LOG_TYPE_WARN, _T("Check_Custom_InetPub:PathInetpub=%s.Not Valid.ignoring unattend value. WARNING.\n"),strCustomInetpub.QueryStr()));
}
}
return iReturn;
}
void CInitApp::Check_Unattend_Settings(void)
{
// if there are unattended values specified for the ftp or www root,
// then set them here.
Check_Custom_WWW_or_FTP_Path();
DeriveInetpubFromWWWRoot();
// Check if there is an alternate iis.inf specified in the unattend file.
// this way the user can change sections in the iis.inf file without changing the iis.inf file itself
Check_Custom_IIS_INF();
// Check if the user wants to use a specific iusr\iwam name.
Check_Custom_Users();
// Check if the user wants to not automatically start WWW and/or FTP services
Check_SvcManualStart();
// Check if user wants applications setup in inprocess by default (not pooled out of process)
return;
}
void Check_SvcManualStart()
{
// Unattend flag format
// SvcManualStart=WWW,FTP
INFCONTEXT Context;
TCHAR szSectionName[_MAX_PATH];
TCHAR szValue[_MAX_PATH] = _T("");
// Do this only if unattended install
if ( !g_pTheApp->m_fUnattended ) return;
// The section name to look for in the unattended file
_tcscpy(szSectionName, UNATTEND_FILE_SECTION);
if ( !SetupFindFirstLine_Wrapped( g_pTheApp->m_hUnattendFile, szSectionName, _T("SvcManualStart"), &Context) )
{
// No such line
return;
}
int i = 1; // This is the specific part of the line ( www, ftp )
while( SetupGetStringField( &Context, i++, szValue, _MAX_PATH, NULL ) )
{
if ( *szValue )
{
if ( ::_tcsicmp( szValue, _T("WWW") ) == 0 )
{
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_MANUAL_START_WWW;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Manual start requested for WWW service\n")));
}
else if ( ::_tcsicmp( szValue, _T("FTP") ) == 0 )
{
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_MANUAL_START_FTP;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Manual start requested for FTP service\n")));
}
}
}
}
void Check_Custom_Users(void)
{
INFCONTEXT Context;
TSTR strSectionName( MAX_PATH );
TSTR_PATH strValue( MAX_PATH );
// Do this only if unattended install
if (!g_pTheApp->m_fUnattended)
{
return;
}
// The section name to look for in the unattended file
if ( !strSectionName.Copy( UNATTEND_FILE_SECTION ) )
{
return;
}
//
// IUSR: BOTH FTP AND WWW
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("IUSR"), &Context) &&
SetupGetStringField(&Context, 1, strValue.QueryStr() , strValue.QuerySize(), NULL) &&
strValue.ExpandEnvironmentVariables() )
{
if (_tcsicmp(strValue.QueryStr(), _T("")) != 0)
{
// assign it to the appropriate member variables.
g_pTheApp->m_csWWWAnonyName_Unattend = strValue.QueryStr();
g_pTheApp->m_csFTPAnonyName_Unattend = strValue.QueryStr();
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_NAME;
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_NAME;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Custom iusr specified for ftp/www\n")));
}
}
//
// IUSR: BOTH FTP AND WWW password
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("IUSR_PASS"), &Context) &&
SetupGetStringField(&Context, 1, strValue.QueryStr() , strValue.QuerySize(), NULL) &&
strValue.ExpandEnvironmentVariables() )
{
// assign it to the appropriate member variables.
if (_tcsicmp(strValue.QueryStr(), _T("")) != 0)
{
g_pTheApp->m_csWWWAnonyPassword_Unattend = strValue.QueryStr();
g_pTheApp->m_csFTPAnonyPassword_Unattend = strValue.QueryStr();
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_PASS;
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_PASS;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Custom iusr pass specified for ftp/www\n")));
}
}
//
// IUSR: FTP
// If there a value specified here, then it will override the one taken from "IUSR"
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("IUSR_FTP"), &Context) &&
SetupGetStringField(&Context, 1, strValue.QueryStr() , strValue.QuerySize(), NULL) &&
strValue.ExpandEnvironmentVariables() )
{
if (_tcsicmp(strValue.QueryStr(), _T("")) != 0)
{
// assign it to the appropriate member variables.
g_pTheApp->m_csFTPAnonyName_Unattend = strValue.QueryStr();
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_NAME;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Custom iusr specified for ftp\n")));
}
}
//
// IUSR: FTP password
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("IUSR_FTP_PASS"), &Context) &&
SetupGetStringField(&Context, 1, strValue.QueryStr() , strValue.QuerySize(), NULL) &&
strValue.ExpandEnvironmentVariables() )
{
if (_tcsicmp(strValue.QueryStr(), _T("")) != 0)
{
// assign it to the appropriate member variables.
g_pTheApp->m_csFTPAnonyPassword_Unattend = strValue.QueryStr();
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_FTP_USER_PASS;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Custom iusr pass specified for ftp\n")));
}
}
//
// IUSR: WWW
// If there a value specified here, then it will override the one taken from "IUSR"
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("IUSR_WWW"), &Context) &&
SetupGetStringField(&Context, 1, strValue.QueryStr() , strValue.QuerySize(), NULL) &&
strValue.ExpandEnvironmentVariables() )
{
// assign it to the appropriate member variables.
g_pTheApp->m_csWWWAnonyName_Unattend = strValue.QueryStr();
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_NAME;
//g_pTheApp->m_csWWWAnonyPassword_Unattend = _T("");
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Custom iusr specified for www\n")));
}
//
// IUSR: WWW password
// If there a value specified here, then it will override the one taken from "IUSR"
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("IUSR_WWW_PASS"), &Context) &&
SetupGetStringField(&Context, 1, strValue.QueryStr() , strValue.QuerySize(), NULL) &&
strValue.ExpandEnvironmentVariables() )
{
if (_tcsicmp(strValue.QueryStr(), _T("")) != 0)
{
// assign it to the appropriate member variables.
g_pTheApp->m_csWWWAnonyPassword_Unattend = strValue.QueryStr();
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WWW_USER_PASS;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Custom iusr pass specified for www\n")));
}
}
//
// IWAM: WWW
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("IWAM"), &Context) &&
SetupGetStringField(&Context, 1, strValue.QueryStr() , strValue.QuerySize(), NULL) &&
strValue.ExpandEnvironmentVariables() )
{
// assign it to the appropriate member variables.
g_pTheApp->m_csWAMAccountName_Unattend = strValue.QueryStr();
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WAM_USER_NAME;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Custom iwam specified\n")));
}
//
// IWAM: WWW password
//
if ( SetupFindFirstLine_Wrapped(g_pTheApp->m_hUnattendFile, strSectionName.QueryStr(), _T("IWAM_PASS"), &Context) &&
SetupGetStringField(&Context, 1, strValue.QueryStr() , strValue.QuerySize(), NULL) &&
strValue.ExpandEnvironmentVariables() )
{
if (_tcsicmp(strValue.QueryStr(), _T("")) != 0)
{
// assign it to the appropriate member variables.
g_pTheApp->m_csWAMAccountPassword_Unattend = strValue.QueryStr();
g_pTheApp->dwUnattendConfig |= USER_SPECIFIED_INFO_WAM_USER_PASS;
iisDebugOut((LOG_TYPE_TRACE, _T("(unattend) Custom iwam pass specified\n")));
}
}
return;
}
// reads the registry and fills up the list
void CInitApp::UnInstallList_RegRead()
{
int iGetOut = FALSE;
CString csBoth;
CString csKey;
CString csData;
CRegKey regInetstp( HKEY_LOCAL_MACHINE, REG_INETSTP, KEY_READ);
if ((HKEY) regInetstp)
{
int iPosition1;
int iLength;
CString csUninstallInfo;
LONG lReturnedErrCode = regInetstp.QueryValue( REG_SETUP_UNINSTALLINFO, csUninstallInfo);
if (lReturnedErrCode == ERROR_SUCCESS)
{
// add a "," to the end for parsing...
iLength = csUninstallInfo.GetLength();
if (iLength == 0)
{
goto UnInstallList_RegRead_Exit;
}
csUninstallInfo += _T(",");
iPosition1 = 0;
#ifdef _CHICAGO_
// quick fix so that it compiles under ansi
// i guess Find(parm1,parm2) under ansi doesn't take 2 parms
#else
int iPosition2;
int iPosition3;
iPosition1 = 0;
iPosition2 = csUninstallInfo.Find(_T(','),iPosition1);
iPosition3 = csUninstallInfo.Find(_T(','),iPosition2+1);
if (-1 == iPosition3){iPosition3 = iLength + 1;}
// loop thru and add to our list!
iGetOut = FALSE;
while (iGetOut == FALSE)
{
csKey = csUninstallInfo.Mid(iPosition1, iPosition2 - iPosition1);
csData = csUninstallInfo.Mid(iPosition2+1, iPosition3 - (iPosition2 + 1));
csKey.MakeUpper(); // uppercase the key
//iisDebugOut((LOG_TYPE_TRACE, _T(" UnInstallList_RegRead: %s=%s\n"),csKey,csData));
// add to our list
m_cmssUninstallMapList.SetAt(csKey, csData);
iPosition1 = iPosition3+1;
iPosition2 = csUninstallInfo.Find(_T(','),iPosition1);
if (-1 == iPosition2){iGetOut = TRUE;}
iPosition3 = csUninstallInfo.Find(_T(','),iPosition2+1);
if (-1 == iPosition3)
{
iPosition3 = iLength + 1;
iGetOut = TRUE;
}
}
#endif
}
}
UnInstallList_RegRead_Exit:
m_fUninstallMapList_Dirty = FALSE;
return;
}
void CInitApp::UnInstallList_RegWrite()
{
int i = 0;
POSITION pos;
CString csKey;
CString csData;
CString csAllData;
csAllData = _T("");
if (TRUE == m_fUninstallMapList_Dirty)
{
// loop thru the list to see if, we already have this entry
if (m_cmssUninstallMapList.IsEmpty())
{
CRegKey regInetstp(REG_INETSTP,HKEY_LOCAL_MACHINE);
if ((HKEY) regInetstp)
{regInetstp.DeleteValue(REG_SETUP_UNINSTALLINFO);}
//iisDebugOut((LOG_TYPE_TRACE, _T(" UnInstallList_RegWrite: empty\n")));
}
else
{
pos = m_cmssUninstallMapList.GetStartPosition();
while (pos)
{
i++;
csKey.Empty();
csData.Empty();
m_cmssUninstallMapList.GetNextAssoc(pos, csKey, csData);
if (i > 1)
{
csAllData += _T(",");
}
csAllData += csKey;
csAllData += _T(",");
csAllData += csData;
}
// write out csAllData
CRegKey regInetstp(REG_INETSTP,HKEY_LOCAL_MACHINE);
if ((HKEY) regInetstp)
{
regInetstp.SetValue(REG_SETUP_UNINSTALLINFO,csAllData);
}
else
{
iisDebugOut((LOG_TYPE_TRACE, _T("UnInstallList_RegWrite: failed! not writen!!!\n")));
}
}
}
}
void CInitApp::UnInstallList_Add(CString csItemUniqueKeyName,CString csDataToAdd)
{
CString csGottenValue;
csItemUniqueKeyName.MakeUpper(); // uppercase the key
if (TRUE == m_cmssUninstallMapList.Lookup(csItemUniqueKeyName, csGottenValue))
{
// found the key, replace the value
m_cmssUninstallMapList.SetAt(csItemUniqueKeyName, csDataToAdd);
}
else
{
// add the key and value pair
m_cmssUninstallMapList.SetAt(csItemUniqueKeyName, csDataToAdd);
}
iisDebugOut((LOG_TYPE_TRACE, _T("UnInstallList_Add:please addkey=%s,%s\n"),csItemUniqueKeyName,csDataToAdd));
m_fUninstallMapList_Dirty = TRUE;
}
void CInitApp::UnInstallList_DelKey(CString csItemUniqueKeyName)
{
iisDebugOut((LOG_TYPE_TRACE, _T("UnInstallList_DelKey:please delkey=%s\n"),csItemUniqueKeyName));
csItemUniqueKeyName.MakeUpper(); // uppercase the key
m_cmssUninstallMapList.RemoveKey(csItemUniqueKeyName);
m_fUninstallMapList_Dirty = TRUE;
}
void CInitApp::UnInstallList_DelData(CString csDataValue)
{
POSITION pos;
CString csKey;
CString csData;
// loop thru the list to see if, we already have this entry
if (m_cmssUninstallMapList.IsEmpty())
{
}
else
{
pos = m_cmssUninstallMapList.GetStartPosition();
while (pos)
{
csKey.Empty();
csData.Empty();
m_cmssUninstallMapList.GetNextAssoc(pos, csKey, csData);
if ( _tcsicmp(csData, csDataValue) == 0)
{
UnInstallList_DelKey(csKey);
}
}
}
}
void CInitApp::UnInstallList_Dump()
{
POSITION pos;
CString csKey;
CString csData;
// loop thru the list to see if, we already have this entry
if (m_cmssUninstallMapList.IsEmpty())
{
//iisDebugOut((LOG_TYPE_TRACE, _T(" UnInstallList_Dump: empty\n")));
}
else
{
pos = m_cmssUninstallMapList.GetStartPosition();
while (pos)
{
csKey.Empty();
csData.Empty();
m_cmssUninstallMapList.GetNextAssoc(pos, csKey, csData);
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T(" UnInstallList_Dump: %s=%s\n"), csKey, csData));
}
}
}
// Get values from list into our Variables!
void CInitApp::UnInstallList_SetVars()
{
POSITION pos;
CString csKey;
CString csData;
// loop thru the list to see if, we already have this entry
if (m_cmssUninstallMapList.IsEmpty())
{
//iisDebugOut((LOG_TYPE_TRACE, _T(" UnInstallList_Dump: empty\n")));
}
else
{
pos = m_cmssUninstallMapList.GetStartPosition();
while (pos)
{
csKey.Empty();
csData.Empty();
m_cmssUninstallMapList.GetNextAssoc(pos, csKey, csData);
if ( _tcsicmp(csKey, _T("IUSR_WAM")) == 0)
{
m_csWAMAccountName_Remove = csData;
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("UnInstallList_SetVars: m_csWAMAccountName_Remove=%s\n"), m_csWAMAccountName_Remove));
}
else if ( _tcsicmp(csKey, _T("IUSR_WWW")) == 0)
{
m_csWWWAnonyName_Remove = csData;
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("UnInstallList_SetVars: m_csWWWAnonyName_Remove=%s\n"), m_csWWWAnonyName_Remove));
}
else if ( _tcsicmp(csKey, _T("IUSR_FTP")) == 0)
{
m_csFTPAnonyName_Remove = csData;
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("UnInstallList_SetVars: m_csFTPAnonyName_Remove=%s\n"), m_csFTPAnonyName_Remove));
}
}
}
}
CString CInitApp::UnInstallList_QueryKey(CString csItemUniqueKeyName)
{
CString csGottenValue;
csGottenValue.Empty();
csItemUniqueKeyName.MakeUpper(); // uppercase the key
m_cmssUninstallMapList.Lookup(csItemUniqueKeyName, csGottenValue);
return csGottenValue;
}
// InitApplicationforSysPrep
//
// Do the initialization work necessary for sysprep to work
//
BOOL
CInitApp::InitApplicationforSysPrep()
{
if ( !GetSysDirs() )
{
return FALSE;
}
// Speficy this, so that it thinks it is an upgrade, and
// we will set the current IUSR_ and IWAM_ correctly
// later on
m_eUpgradeType = UT_60;
SetInetpubDir();
SetInetpubDerivatives();
return TRUE;
}