mirror of https://github.com/lianthony/NT4.0
985 lines
31 KiB
985 lines
31 KiB
#include "stdafx.h"
|
|
#include "const.h"
|
|
#include "import.h"
|
|
#include "registry.h"
|
|
#include "machine.h"
|
|
#include "base.h"
|
|
|
|
#include "messaged.h"
|
|
#include "options.h"
|
|
#include "copydlg.h"
|
|
#include "mosaicga.h"
|
|
#include "welcomed.h"
|
|
#include "maintena.h"
|
|
#include "createac.h"
|
|
#include "targetdi.h"
|
|
#include "thread.h"
|
|
#include "singleop.h"
|
|
#include "basedlg.h"
|
|
#include "billboar.h"
|
|
#include "consrv.h"
|
|
#include "setup.h"
|
|
#include "lm.h"
|
|
#include "regstr.h"
|
|
#include "NTUpgDlg.h"
|
|
extern "C"
|
|
{
|
|
#include "sslsp.h"
|
|
#include "userenv.h"
|
|
#include "userenvp.h"
|
|
}
|
|
|
|
//
|
|
// Given a directory path, this subroutine will create the direct layer by layer
|
|
//
|
|
|
|
BOOL CreateLayerDirectory( CString str )
|
|
{
|
|
BOOL fReturn = TRUE;
|
|
|
|
do
|
|
{
|
|
INT index=0;
|
|
INT iLength = str.GetLength();
|
|
|
|
// first find the index for the first directory
|
|
if ( iLength > 2 )
|
|
{
|
|
if ( str[1] == _T(':'))
|
|
{
|
|
// assume the first character is driver letter
|
|
if ( str[2] == _T('\\'))
|
|
{
|
|
index = 2;
|
|
} else
|
|
{
|
|
index = 1;
|
|
}
|
|
} else if ( str[0] == _T('\\'))
|
|
{
|
|
if ( str[1] == _T('\\'))
|
|
{
|
|
BOOL fFound = FALSE;
|
|
INT i;
|
|
INT nNum = 0;
|
|
// unc name
|
|
for (i = 2; i < iLength; i++ )
|
|
{
|
|
if ( str[i]==_T('\\'))
|
|
{
|
|
// find it
|
|
nNum ++;
|
|
if ( nNum == 2 )
|
|
{
|
|
fFound = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if ( fFound )
|
|
{
|
|
index = i;
|
|
} else
|
|
{
|
|
// bad name
|
|
break;
|
|
}
|
|
} else
|
|
{
|
|
index = 1;
|
|
}
|
|
}
|
|
} else if ( str[0] == _T('\\'))
|
|
{
|
|
index = 0;
|
|
}
|
|
|
|
// okay ... build directory
|
|
do
|
|
{
|
|
// find next one
|
|
do
|
|
{
|
|
if ( index < ( iLength - 1))
|
|
{
|
|
index ++;
|
|
} else
|
|
{
|
|
break;
|
|
}
|
|
} while ( str[index] != _T('\\'));
|
|
|
|
|
|
TCHAR szCurrentDir[MAX_PATH+1];
|
|
|
|
GetCurrentDirectory( MAX_PATH+1, szCurrentDir );
|
|
|
|
if ( !SetCurrentDirectory( str.Left( index + 1 )))
|
|
{
|
|
if (( fReturn = CreateDirectory( str.Left( index + 1 ), NULL )) != TRUE )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
SetCurrentDirectory( szCurrentDir );
|
|
|
|
if ( index >= ( iLength - 1 ))
|
|
{
|
|
fReturn = TRUE;
|
|
break;
|
|
}
|
|
} while ( TRUE );
|
|
} while (FALSE);
|
|
|
|
return(fReturn);
|
|
}
|
|
|
|
//
|
|
// Reset the option state
|
|
//
|
|
|
|
void INETSTP_OPTION::ResetOption()
|
|
{
|
|
fVisible = FALSE;
|
|
iState = IsInstalled() ? STATE_INSTALLED : STATE_NOT_INSTALLED;
|
|
iAction = ACTION_DO_NOTHING;
|
|
}
|
|
|
|
void INETSTP_OPTION::GetBatchInstallMode( CString strInfName )
|
|
{
|
|
TCHAR buf[BUF_SIZE];
|
|
|
|
OPTION_STATE::GetBatchInstallMode( strInfName );
|
|
|
|
if ( !(theApp.m_strBatchSectionName.IsEmpty()) ) {
|
|
::GetPrivateProfileString( theApp.m_strBatchSectionName, _T("GuestAccountName"), _T(""), buf, BUF_SIZE, strInfName );
|
|
if (strlen(buf))
|
|
theApp.m_GuestName = buf;
|
|
::GetPrivateProfileString( theApp.m_strBatchSectionName, _T("GuestAccountPassword"), _T(""), buf, BUF_SIZE, strInfName );
|
|
if (strlen(buf))
|
|
theApp.m_GuestPassword = buf;
|
|
}
|
|
}
|
|
|
|
typedef void (*P_SslGenerateRandomBits)( PUCHAR pRandomData, LONG size );
|
|
P_SslGenerateRandomBits ProcSslGenerateRandomBits = NULL;
|
|
|
|
int GetRandomNum()
|
|
{
|
|
int RandomNum;
|
|
UCHAR cRandomByte;
|
|
|
|
if ( ProcSslGenerateRandomBits != NULL )
|
|
{
|
|
(*ProcSslGenerateRandomBits)( &cRandomByte, 1 );
|
|
RandomNum = cRandomByte;
|
|
} else
|
|
{
|
|
RandomNum = rand();
|
|
}
|
|
|
|
return(RandomNum);
|
|
}
|
|
static char six2pr[64] =
|
|
{
|
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
|
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
|
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '%', '_'
|
|
};
|
|
|
|
//
|
|
// Create a random password
|
|
//
|
|
void CBaseApp::CreatePassword( TCHAR *pszPassword )
|
|
{
|
|
// create a random password
|
|
ProcSslGenerateRandomBits = NULL;
|
|
|
|
HINSTANCE hSslDll = LoadLibraryEx(_T("schannel.dll"), NULL, 0 );
|
|
if ( hSslDll != NULL )
|
|
{
|
|
ProcSslGenerateRandomBits = (P_SslGenerateRandomBits)GetProcAddress( hSslDll, _T("SslGenerateRandomBits"));
|
|
}
|
|
|
|
time_t timer;
|
|
time( &timer );
|
|
srand( timer );
|
|
|
|
int RandomNum = GetRandomNum();
|
|
//
|
|
// Use Maximum available password length, as
|
|
// setting any other length might run afoul
|
|
// of the minimum password length setting
|
|
//
|
|
int nLength = LM20_PWLEN;
|
|
int i;
|
|
|
|
for (i=0; i<sizeof(six2pr);i++ )
|
|
{
|
|
// shuffle the array
|
|
RandomNum=GetRandomNum();
|
|
TCHAR c = six2pr[i];
|
|
six2pr[i]=six2pr[RandomNum%sizeof(six2pr)];
|
|
six2pr[RandomNum%sizeof(six2pr)]=c;
|
|
}
|
|
|
|
for ( i=0;i<nLength;i++ )
|
|
{
|
|
// set up the password
|
|
|
|
RandomNum=GetRandomNum();
|
|
pszPassword[i]=six2pr[RandomNum%sizeof(six2pr)];
|
|
}
|
|
pszPassword[i]=_T('\0');
|
|
|
|
if ( hSslDll != NULL )
|
|
{
|
|
FreeLibrary( hSslDll );
|
|
}
|
|
}
|
|
|
|
const DWORD INFINSTALL_PRIMARYINSTALL = 0x00000001;
|
|
const DWORD INFINSTALL_INPROCINTERP = 0x00000002;
|
|
|
|
extern "C"
|
|
{
|
|
typedef LONG (*P_NetSetupComponentInstall)( HWND hwndParent,
|
|
PCWSTR pszInfOption,
|
|
PCWSTR pszInfName,
|
|
PCWSTR pszInstallPath, // optional, may be NULL if not needed
|
|
PCWSTR pszInfSymbol, // optional, may be NULL if not needed
|
|
DWORD dwInstallFlags, // see flags below
|
|
PDWORD pdwReturn );
|
|
|
|
typedef LONG (*P_NetSetupComponentRemove)( HWND hwndParent,
|
|
PCWSTR pszInfOption,
|
|
DWORD dwInstallFlags, // see flags below
|
|
PDWORD pdwReturn );
|
|
|
|
typedef LONG (*P_NetSetupFindSoftwareComponent)( PCWSTR pszInfOption,
|
|
PWSTR pszInfName,
|
|
PDWORD pcchInfName,
|
|
PWSTR pszRegBase, // optional, may be NULL
|
|
PDWORD pcchRegBase ); // optional, NULL if pszRegBase is NULL
|
|
}
|
|
|
|
//++++++++++++++++++++++
|
|
// Internet Setup Option
|
|
//
|
|
|
|
INETSTP_OPTION::INETSTP_OPTION( MACHINE *pMachine )
|
|
: OPTION_STATE( IDS_SN_INETSTP, pMachine )
|
|
{
|
|
strName.LoadString( IDS_OPTION_INETSTP );
|
|
strDescription.LoadString( (theApp.TargetMachine.m_actualProductType==PT_WINNT)?IDS_DES_INETSTP_NTW:IDS_DES_INETSTP_NTS );
|
|
strServiceName.LoadString( IDS_SN_INETSTP );
|
|
strRegPath = INETSTP_REG_PATH;
|
|
strInstallDirPath = INETSTP_REG_PATH;
|
|
fVisible = FALSE;
|
|
|
|
m_pSetupINetStp = (P_SetupINetStp)GetProcAddress( m_pMachine->m_WorkerDll, _T("SetupINetStp"));
|
|
m_pRemoveINetStp = (P_RemoveINetStp)GetProcAddress( m_pMachine->m_WorkerDll, _T("RemoveINetStp"));
|
|
}
|
|
|
|
INT INETSTP_OPTION::Install()
|
|
{
|
|
INT err = INSTALL_SUCCESSFULL;
|
|
|
|
do
|
|
{
|
|
if ( IsInstalled() )
|
|
{
|
|
GetInstallDirectory();
|
|
}
|
|
CreateLayerDirectory( m_pMachine->strDirectory );
|
|
|
|
theApp.TargetMachine.DeleteShareDllEntries();
|
|
|
|
// copy file first
|
|
CopyFile();
|
|
|
|
if ( theApp.m_fTerminate )
|
|
{
|
|
err = INSTALL_INTERRUPT;
|
|
DoNotInstallOption(IDS_SN_ADMIN);
|
|
DoNotInstallOption(IDS_SN_FTP);
|
|
DoNotInstallOption(IDS_SN_GOPHER);
|
|
DoNotInstallOption(IDS_SN_WWW);
|
|
DoNotInstallOption(IDS_SN_W3SAMP);
|
|
DoNotInstallOption(IDS_SN_HTMLA);
|
|
DoNotInstallOption(IDS_SN_ODBC);
|
|
break;
|
|
} else
|
|
{
|
|
CRegKey regINetStp( INETSTP_REG_PATH, HKEY_LOCAL_MACHINE,
|
|
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
|
|
|
|
CBillBoard BillBoard((theApp.TargetMachine.m_actualProductType==PT_WINNT)?IDS_INSTALL_INETSTP_NTW: IDS_INSTALL_INETSTP_NTS );
|
|
BillBoard.Create();
|
|
|
|
if ( NULL != (HKEY) regINetStp )
|
|
{
|
|
// set version
|
|
DWORD dwVersion = MAJORVERSION;
|
|
regINetStp.SetValue( _T("MajorVersion"), dwVersion );
|
|
dwVersion = MINORVERSION;
|
|
regINetStp.SetValue( _T("MinorVersion"), dwVersion );
|
|
|
|
regINetStp.SetValue( SZ_INSTALL_PATH, m_pMachine->strDirectory );
|
|
|
|
DWORD dwSetupID = SETUPID_THIS; // IIS 3.0 Setup
|
|
regINetStp.SetValue( _T("SetupID"), dwSetupID );
|
|
}
|
|
|
|
regINetStp.SetValue( _T("AnonymousUser"), theApp.m_GuestName );
|
|
|
|
(*m_pSetupINetStp)( m_pMachine->m_MachineName );
|
|
|
|
// always try to clean the old IIS Program Group first
|
|
CString csOldGroupName;
|
|
if ( theApp.TargetMachine.m_actualProductType == PT_WINNT ) // remove previous server IIS
|
|
csOldGroupName.LoadString(IDS_LANMANNT_GROUP_NAME);
|
|
else // remove previous wks IIS
|
|
csOldGroupName.LoadString( IDS_WINNT_GROUP_NAME );
|
|
DeleteGroup(csOldGroupName, TRUE);
|
|
|
|
// create the new IIS Program Group
|
|
CString csGroupName;
|
|
csGroupName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_GROUP_NAME: IDS_LANMANNT_GROUP_NAME );
|
|
DeleteGroup(csGroupName, TRUE);
|
|
CreateGroup( csGroupName, TRUE );
|
|
|
|
CString csAppName;
|
|
csAppName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_INET_APP:IDS_LANMAN_INET_APP );
|
|
DeleteItem( csGroupName, TRUE, csAppName, TRUE );
|
|
|
|
CString csPath = LocalPath();
|
|
CString csMsg;
|
|
csMsg.Format( _T("%s\\setup.exe"), (LPCSTR)csPath );
|
|
|
|
AddItem( csGroupName, TRUE, csAppName, csMsg, csMsg, 0, NULL, 0, SW_SHOWNORMAL );
|
|
|
|
//
|
|
// set up the add/remove program registry value
|
|
//
|
|
CString AddRemoveRegPath = REGSTR_PATH_UNINSTALL;
|
|
AddRemoveRegPath += _T("\\MSIIS");
|
|
|
|
CRegKey regAddRemove( AddRemoveRegPath, HKEY_LOCAL_MACHINE,
|
|
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, NULL );
|
|
if ( NULL != (HKEY)regAddRemove )
|
|
{
|
|
CString strName;
|
|
strName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_INET_APP_AM:IDS_LANMAN_INET_APP_AM );
|
|
|
|
regAddRemove.SetValue( REGSTR_VAL_UNINSTALLER_DISPLAYNAME, strName );
|
|
|
|
CString strSetupExe;
|
|
strSetupExe = csPath;
|
|
strSetupExe += _T("\\setup.exe");
|
|
regAddRemove.SetValue( REGSTR_VAL_UNINSTALLER_COMMANDLINE, strSetupExe );
|
|
}
|
|
|
|
// setup the NCPA parameter also
|
|
HINSTANCE NetCfgDll;
|
|
|
|
NetCfgDll = LoadLibraryEx( _T("netcfg.dll"), NULL, 0 );
|
|
|
|
do
|
|
{
|
|
if ( NetCfgDll != NULL )
|
|
{
|
|
TCHAR pszSysDir[MAX_PATH+1];
|
|
TCHAR pszCurDir[MAX_PATH+1];
|
|
|
|
// use the system directory as the current directory
|
|
// when running INFS
|
|
//
|
|
::GetSystemDirectory( pszSysDir, MAX_PATH );
|
|
::GetCurrentDirectory( MAX_PATH, pszCurDir );
|
|
::SetCurrentDirectory( pszSysDir );
|
|
|
|
P_NetSetupComponentInstall pProc= (P_NetSetupComponentInstall)GetProcAddress( NetCfgDll, _T("NetSetupComponentInstall"));
|
|
if ( pProc != NULL )
|
|
{
|
|
DWORD dwReturn;
|
|
|
|
(*pProc)( AfxGetMainWnd()->m_hWnd, (PCWSTR)L"Inetsrv", (PCWSTR)L"oemnsvin.inf", NULL, NULL, INFINSTALL_PRIMARYINSTALL | INFINSTALL_INPROCINTERP, &dwReturn );
|
|
::SetCurrentDirectory( pszCurDir );
|
|
FreeLibrary( NetCfgDll );
|
|
break;
|
|
}
|
|
::SetCurrentDirectory( pszCurDir );
|
|
}
|
|
FreeLibrary( NetCfgDll );
|
|
|
|
CRegKey regNCPA( _T("Software\\Microsoft\\Inetsrv"), HKEY_LOCAL_MACHINE,
|
|
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, NULL );
|
|
if ( NULL != (HKEY) regNCPA )
|
|
{
|
|
CRegKey regCurrentVersion( _T("CurrentVersion"), regNCPA,
|
|
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, NULL );
|
|
if ( NULL != (HKEY) regCurrentVersion )
|
|
{
|
|
CString strTmp;
|
|
CString strProductPath = PRODUCT_REG_PATH;
|
|
CString strProductType;
|
|
BOOL fWinnt;
|
|
|
|
CRegKey regProductPath( HKEY_LOCAL_MACHINE, strProductPath, KEY_ALL_ACCESS,
|
|
NULL );
|
|
|
|
if ( NULL != (HKEY)regProductPath )
|
|
{
|
|
regProductPath.QueryValue( SZ_PRODUCTTYPE, strProductType );
|
|
strProductType.MakeUpper();
|
|
|
|
fWinnt = ( strProductType == "WINNT" );
|
|
}
|
|
|
|
strTmp.LoadString( fWinnt? IDS_WINNT_DESC : IDS_LANMAN_DESC );
|
|
regCurrentVersion.SetValue( _T("Description"), strTmp );
|
|
strTmp = _T("service");
|
|
regCurrentVersion.SetValue( _T("SoftwareType"), strTmp );
|
|
strTmp.LoadString( fWinnt? IDS_WINNT_TITLE : IDS_LANMAN_TITLE );
|
|
regCurrentVersion.SetValue( _T("TITLE"), strTmp );
|
|
|
|
DWORD dw;
|
|
dw = time(NULL);
|
|
regCurrentVersion.SetValue( _T("InstallDate"), dw );
|
|
|
|
dw= MAJORVERSION;
|
|
regCurrentVersion.SetValue( _T("MajorVersion"), dw );
|
|
|
|
dw= MINORVERSION;
|
|
regCurrentVersion.SetValue( _T("MinorVersion"), dw );
|
|
|
|
CRegKey regNetRules( _T("NetRules"), regCurrentVersion,
|
|
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, NULL );
|
|
if ( NULL != (HKEY) regNetRules )
|
|
{
|
|
strTmp = _T("oemnsvin.inf");
|
|
regNetRules.SetValue( _T("InfName"), strTmp );
|
|
|
|
strTmp = _T("Inetsrv");
|
|
regNetRules.SetValue( _T("InfOption"), strTmp );
|
|
}
|
|
}
|
|
}
|
|
} while (FALSE);
|
|
|
|
// create cache and logfile directory
|
|
TCHAR buf[MAX_PATH];
|
|
|
|
GetSystemDirectory( buf, MAX_PATH);
|
|
CString strCache = buf;
|
|
strCache += _T("\\cache");
|
|
CreateLayerDirectory( strCache );
|
|
|
|
CString strLogfile = buf;
|
|
strLogfile += _T("\\LogFiles");
|
|
CreateLayerDirectory( strLogfile );
|
|
|
|
// delete Desktop icon
|
|
CString csIconDesc;
|
|
csIconDesc.LoadString( IDS_NS_IIS_ICONTITLE );
|
|
DeleteDesktopItem(TRUE, csIconDesc);
|
|
|
|
BillBoard.DestroyWindow();
|
|
}
|
|
} while(FALSE);
|
|
return err;
|
|
}
|
|
|
|
INT INETSTP_OPTION::Remove()
|
|
{
|
|
INT err = INSTALL_SUCCESSFULL;
|
|
CBillBoard BillBoard( IDS_REMOVE_INETSTP, AfxGetMainWnd(), TRUE );
|
|
|
|
BillBoard.Create();
|
|
|
|
// remove software key
|
|
CRegKey regSoftwareMicrosoft( HKEY_LOCAL_MACHINE, SOFTWARE_MICROSOFT, KEY_ALL_ACCESS, m_pMachine->m_MachineName );
|
|
|
|
RemoveFiles();
|
|
|
|
theApp.TargetMachine.DeleteShareDllEntries();
|
|
|
|
(*m_pRemoveINetStp)( m_pMachine->m_MachineName );
|
|
|
|
if ( NULL != (HKEY) regSoftwareMicrosoft )
|
|
regSoftwareMicrosoft.DeleteTree( SZ_INETSTP );
|
|
|
|
// remove Program Group
|
|
CString csGroupName;
|
|
csGroupName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )? IDS_WINNT_GROUP_NAME : IDS_LANMANNT_GROUP_NAME );
|
|
|
|
CString csAppName;
|
|
csAppName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_INET_APP:IDS_LANMAN_INET_APP );
|
|
DeleteItem( csGroupName, TRUE, csAppName, TRUE );
|
|
|
|
// if gateway server is still here, don't
|
|
CRegKey regINetStpGW( HKEY_LOCAL_MACHINE, INETSTPGW_REG_PATH, KEY_ALL_ACCESS, NULL );
|
|
|
|
if ( NULL == (HKEY)regINetStpGW )
|
|
DeleteGroup( csGroupName, TRUE );
|
|
|
|
//
|
|
// Remove the "Add/Remove Program" registry value
|
|
//
|
|
CString AddRemoveRegPath = REGSTR_PATH_UNINSTALL;
|
|
|
|
CRegKey regAddRemove( HKEY_LOCAL_MACHINE, AddRemoveRegPath, KEY_ALL_ACCESS, m_pMachine->m_MachineName );
|
|
|
|
if ( (HKEY) regAddRemove )
|
|
regAddRemove.DeleteTree( _T("MSIIS"));
|
|
|
|
// remove NCPA registry value
|
|
HINSTANCE NetCfgDll;
|
|
|
|
NetCfgDll = LoadLibraryEx( _T("netcfg.dll"), NULL, 0 );
|
|
do
|
|
{
|
|
if ( NetCfgDll != NULL )
|
|
{
|
|
TCHAR pszSysDir[MAX_PATH+1];
|
|
TCHAR pszCurDir[MAX_PATH+1];
|
|
|
|
::GetSystemDirectory( pszSysDir, MAX_PATH );
|
|
::GetCurrentDirectory( MAX_PATH, pszCurDir );
|
|
::SetCurrentDirectory( pszSysDir );
|
|
|
|
P_NetSetupComponentRemove pProc= (P_NetSetupComponentRemove)GetProcAddress( NetCfgDll, _T("NetSetupComponentRemove"));
|
|
if ( pProc != NULL )
|
|
{
|
|
DWORD dwReturn;
|
|
|
|
(*pProc)( AfxGetMainWnd()->m_hWnd, L"Inetsrv", INFINSTALL_PRIMARYINSTALL | INFINSTALL_INPROCINTERP, &dwReturn );
|
|
::SetCurrentDirectory( pszCurDir );
|
|
FreeLibrary( NetCfgDll );
|
|
break;
|
|
}
|
|
::SetCurrentDirectory( pszCurDir );
|
|
}
|
|
FreeLibrary( NetCfgDll );
|
|
|
|
CRegKey regNCPA( _T("Software\\Microsoft"), HKEY_LOCAL_MACHINE,
|
|
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, NULL );
|
|
if ( NULL != (HKEY) regNCPA )
|
|
{
|
|
regNCPA.DeleteTree( _T("Inetsrv"));
|
|
}
|
|
} while (FALSE);
|
|
|
|
(*(theApp.m_pDeleteGuestUser))(theApp.m_GuestName );
|
|
|
|
BillBoard.DestroyWindow();
|
|
|
|
AfxGetMainWnd()->SetForegroundWindow();
|
|
|
|
return err;
|
|
}
|
|
|
|
INT INETSTP_OPTION::RemoveFiles()
|
|
{
|
|
INT err = INSTALL_SUCCESSFULL;
|
|
|
|
CString csInstallPath = OPTION_STATE::GetInstallDirectory();
|
|
|
|
OPTION_STATE::RemoveFiles();
|
|
|
|
//RecRemoveEmptyDir((LPCTSTR)csInstallPath);
|
|
// if this dir is empty, remove it
|
|
RemoveDirectory((LPCTSTR)csInstallPath);
|
|
return err;
|
|
}
|
|
|
|
BOOL CBaseApp::InitInstance()
|
|
{
|
|
BOOL fReturn = FALSE;
|
|
|
|
SetRegistryKey("");
|
|
LoadStdProfileSettings(0);
|
|
|
|
do {
|
|
|
|
TCHAR szCurrentPath[MAX_PATH];
|
|
CString strCurrentPath;
|
|
GetModuleFileName( AfxGetInstanceHandle(), szCurrentPath, MAX_PATH );
|
|
strCurrentPath = szCurrentPath;
|
|
strCurrentPath = strCurrentPath.Left( strCurrentPath.ReverseFind(_T('\\')));
|
|
SetCurrentDirectory( strCurrentPath );
|
|
m_strSrcLocation = strCurrentPath;
|
|
m_strSrcDir = strCurrentPath;
|
|
|
|
int err = TargetMachine.Init();
|
|
CString strLogo;
|
|
strLogo.LoadString(( TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
|
|
|
|
if ( err != 0 )
|
|
{
|
|
CString strError;
|
|
strError.LoadString( err );
|
|
MessageBox( NULL, strError, strLogo, MB_OK );
|
|
break;
|
|
}
|
|
TargetMachine.SetMachine(_T(""));
|
|
|
|
// init m_GuestName as IUSR_MachineName, init m_GuestPassword as ""
|
|
TCHAR szGuestName[UNLEN+1];
|
|
memset( (PVOID)szGuestName, 0, sizeof(szGuestName));
|
|
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
|
|
GetComputerName( szGuestName, &dwSize );
|
|
CString strDefGuest;
|
|
strDefGuest.LoadString( IDS_GUEST_NAME );
|
|
strDefGuest += szGuestName;
|
|
lstrcpyn( szGuestName, (LPCTSTR) strDefGuest, LM20_UNLEN+1);
|
|
m_GuestName = szGuestName;
|
|
m_GuestPassword = _T("");
|
|
|
|
// detect if TCP/IP is installed or not
|
|
BOOL fTCPIP = FALSE;
|
|
HINSTANCE NetCfgDll;
|
|
NetCfgDll = LoadLibraryEx( _T("netcfg.dll"), NULL, 0 );
|
|
|
|
P_NetSetupFindSoftwareComponent pProc = NULL;
|
|
|
|
if (NetCfgDll)
|
|
pProc = (P_NetSetupFindSoftwareComponent)GetProcAddress( NetCfgDll, _T("NetSetupFindSoftwareComponent"));
|
|
|
|
if (pProc)
|
|
{
|
|
WCHAR pszInfName[MAX_PATH+1];
|
|
DWORD cchInfName = MAX_PATH;
|
|
|
|
if (ERROR_SUCCESS == (*pProc)( (PCWSTR)L"TC", pszInfName, &cchInfName, NULL, NULL ))
|
|
fTCPIP = TRUE;
|
|
}
|
|
|
|
FreeLibrary(NetCfgDll);
|
|
|
|
// detect whether we have IIS installed on this machine previously
|
|
m_fInstalled = FALSE;
|
|
CRegKey regINetStp( HKEY_LOCAL_MACHINE, INETSTP_REG_PATH, KEY_ALL_ACCESS, TargetMachine.m_MachineName );
|
|
if ((HKEY)regINetStp) {
|
|
m_fInstalled = TRUE;
|
|
regINetStp.QueryValue("AnonymousUser", m_GuestName );
|
|
}
|
|
|
|
// parse cmd-line options, will re-set m_GuestName, m_GuestPassword if found in Batch mode
|
|
if ( m_lpCmdLine && m_lpCmdLine[0] )
|
|
ParseCmdLine( m_lpCmdLine );
|
|
|
|
// Make sure it is at least NT RC1 1345
|
|
if (!TargetMachine.IsSupportVersion())
|
|
{
|
|
// popup error msgbox
|
|
CString strError;
|
|
strError.LoadString( IDS_UPGRADE_FIRST );
|
|
|
|
CString strMsg = strLogo;
|
|
strMsg += strError;
|
|
|
|
MessageBox( NULL, strMsg, strLogo, MB_OK );
|
|
break;
|
|
}
|
|
|
|
// if (Not invoked by NT setup) && (NO TCP/IP)
|
|
if (!m_fInstallFromSetup && !fTCPIP)
|
|
{
|
|
// popup error msgbox in case of NT fresh installation
|
|
CString strError;
|
|
strError.LoadString( IDS_TCPIP_NOT_INSTALLED );
|
|
|
|
CString strMsg = strLogo;
|
|
strMsg += strError;
|
|
|
|
MessageBox( NULL, strMsg, strLogo, MB_OK );
|
|
break; // exit
|
|
}
|
|
|
|
// detect if the Old FTP Service is installed
|
|
CRegKey regFTPSVC( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\FTPSVC"));
|
|
if ( (HKEY)regFTPSVC )
|
|
m_fOldFTPInstalled = TRUE;
|
|
|
|
// if (invoked by NT setup) && (NO Previous IIS) && (NO Old FTP) && (NO TCP/IP)
|
|
if (m_fInstallFromSetup && !m_fInstalled && !m_fOldFTPInstalled && !fTCPIP)
|
|
{
|
|
if (!m_fUpgrade) {
|
|
// popup error msgbox in case of NT fresh installation
|
|
CString strError;
|
|
strError.LoadString( IDS_TCPIP_NOT_INSTALLED );
|
|
|
|
CString strMsg = strLogo;
|
|
strMsg += strError;
|
|
|
|
MessageBox( NULL, strMsg, strLogo, MB_OK );
|
|
}
|
|
break; // exit
|
|
}
|
|
|
|
// popup dlg if invoked by NT setup, NT upgrade, attended mode, no previous IIS, TCPIP installed, No old FTP
|
|
if (m_fInstallFromSetup && m_fUpgrade && !m_fNTUpgrade && !m_fInstalled && fTCPIP && !m_fOldFTPInstalled)
|
|
{
|
|
// For WKS product, not to install by default
|
|
if (TargetMachine.m_actualProductType == PT_WINNT)
|
|
break;
|
|
|
|
// For SRV product, popup dlg
|
|
CNTUpgradeDlg dlgNTUpgradeIIS(NULL);
|
|
if (dlgNTUpgradeIIS.DoModal() == IDOK) {
|
|
// check whether user selects checkbox or not
|
|
if (dlgNTUpgradeIIS.m_InstallIIS != 1) { // not to install IIS at this time
|
|
// create desktop icon for SRV
|
|
INT err;
|
|
CString strDescription;
|
|
|
|
strDescription.LoadString( IDS_NS_IIS_ICONTITLE );
|
|
err = AddDesktopItem( TRUE, // common item
|
|
strDescription,
|
|
_T("inetins.exe"),
|
|
NULL, // icon path, NULL will use command program
|
|
0, // Icon Index
|
|
NULL, // working directory (NULL will defualt to home)
|
|
0, // hot key
|
|
SW_SHOWNORMAL); // command show
|
|
break; // exit
|
|
}
|
|
}
|
|
}
|
|
|
|
// For unattended NT upgrade, no previous IIS, no old FTP
|
|
if (m_fInstallFromSetup && m_fUpgrade && m_fNTUpgrade && !m_fInstalled && !m_fOldFTPInstalled)
|
|
break;
|
|
|
|
CBillBoard BillBoard( (TargetMachine.m_actualProductType==PT_WINNT)?IDS_INITIALIZE_SETUP_NTW:IDS_INITIALIZE_SETUP_NTS, NULL, TRUE );
|
|
BillBoard.Create();
|
|
|
|
// parse .INF file
|
|
if ( ParseFileInf() != 0 )
|
|
{
|
|
BillBoard.DestroyWindow();
|
|
break;
|
|
}
|
|
|
|
LoadWorkerDll();
|
|
|
|
if ( !(*m_pRunningAsAdministrator)())
|
|
{
|
|
BillBoard.DestroyWindow();
|
|
|
|
CString strError;
|
|
strError.LoadString( (TargetMachine.m_actualProductType==PT_WINNT)?IDS_NOT_ADMINISTRATOR_NTW:IDS_NOT_ADMINISTRATOR_NTS );
|
|
MessageBox( NULL, strError, strLogo, MB_OK );
|
|
break;
|
|
}
|
|
|
|
BillBoard.DestroyWindow();
|
|
|
|
m_pMainWnd = new CBaseDlg;
|
|
((CDialog *)m_pMainWnd)->Create(m_fRemoveBackground?IDD_MAIN_WINDOW_I:IDD_MAIN_WINDOW_NTS);
|
|
|
|
if ( m_fBatch )
|
|
{
|
|
// make sure we are fresh before we do install
|
|
if (( m_fInstalled ) && ( !m_fUpgrade ))
|
|
{
|
|
// remove it before you install it
|
|
CString strError;
|
|
|
|
strError.LoadString( (TargetMachine.m_actualProductType==PT_WINNT)?IDS_UNATTEND_REMOVE_IT_FIRST_NTW:IDS_UNATTEND_REMOVE_IT_FIRST_NTS );
|
|
m_pMainWnd->MessageBox( strError );
|
|
break;
|
|
|
|
} else
|
|
{
|
|
if (m_fUpgrade && !m_fInstalled)
|
|
m_pMainWnd->PostMessage( WM_DO_INSTALL, 0 );
|
|
else
|
|
m_pMainWnd->PostMessage( m_fUpgrade?WM_MAINTENANCE_REINSTALL:WM_DO_INSTALL, 0 );
|
|
}
|
|
} else
|
|
{
|
|
m_pMainWnd->PostMessage( m_fInstallFromSetup?
|
|
((m_fUpgrade)?WM_MAINTENANCE_REINSTALL:WM_FINISH_WELCOME):
|
|
WM_WELCOME, 0 );
|
|
}
|
|
|
|
fReturn = TRUE;
|
|
|
|
} while (FALSE);
|
|
|
|
// Since the dialog has been closed, return FALSE so that we exit the
|
|
// application, rather than start the application's message pump.
|
|
return fReturn;
|
|
}
|
|
|
|
INT MACHINE::Init()
|
|
{
|
|
// assume it is local
|
|
// make sure we are build 1057 and higher first;
|
|
DWORD dwCurVer;
|
|
|
|
dwCurVer = (GetVersion() & 0x7fff0000) >> 16;
|
|
|
|
if (dwCurVer < 1057)
|
|
return( IDS_DO_NOT_SUPPORT_35);
|
|
|
|
if ( !LoadDLL())
|
|
m_err = (theApp.TargetMachine.m_actualProductType==PT_WINNT)?IDS_CANNOT_LOAD_DLL_NTW:IDS_CANNOT_LOAD_DLL_NTS ;
|
|
|
|
// set up the src directory
|
|
TCHAR buf[BUF_SIZE];
|
|
GetSystemDirectory( buf, BUF_SIZE-1);
|
|
strDirectory = buf;
|
|
strDirectory += DEFAULT_DIR;
|
|
|
|
CRegKey regDirPath( HKEY_LOCAL_MACHINE, INETSTP_REG_PATH, KEY_ALL_ACCESS, m_MachineName );
|
|
|
|
if ( NULL != (HKEY)regDirPath )
|
|
{
|
|
// get the install path
|
|
regDirPath.QueryValue( SZ_INSTALL_PATH, strDirectory );
|
|
|
|
DWORD dwSetupID = 0;
|
|
regDirPath.QueryValue(_T("SetupID"), dwSetupID);
|
|
if (dwSetupID == SETUPID_THIS || dwSetupID == SETUPID_IIS20)
|
|
m_fAlreadyInstall = TRUE;
|
|
else {
|
|
CRegKey regOldMosaic( HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\INetStp\\Mosaic"));
|
|
if ( (HKEY) regOldMosaic )
|
|
m_fUpgradeFrom67 = TRUE;
|
|
else
|
|
m_fUpgradeFrom1314 = TRUE;
|
|
}
|
|
} else
|
|
{
|
|
CRegKey regDirPath2( HKEY_LOCAL_MACHINE, INETSTPGW_REG_PATH, KEY_ALL_ACCESS, m_MachineName );
|
|
|
|
if ( NULL != (HKEY)regDirPath2 )
|
|
{
|
|
// get the install path
|
|
regDirPath2.QueryValue( SZ_INSTALL_PATH, strDirectory );
|
|
m_fAlreadyInstall = TRUE;
|
|
}
|
|
}
|
|
|
|
SetupOptions();
|
|
|
|
return m_err;
|
|
}
|
|
|
|
void MACHINE::SetupOptions()
|
|
{
|
|
OPTION_STATE *pOption;
|
|
|
|
do
|
|
{
|
|
pOption = (OPTION_STATE *) new INETSTP_OPTION( this );
|
|
if ( pOption == NULL )
|
|
break;
|
|
m_OptionsList.AddTail( pOption );
|
|
|
|
pOption = (OPTION_STATE *) new ADMIN_OPTION( this );
|
|
if ( pOption == NULL )
|
|
break;
|
|
m_OptionsList.AddTail( pOption );
|
|
|
|
pOption = (OPTION_STATE *) new WWW_OPTION( this );
|
|
if ( pOption == NULL )
|
|
break;
|
|
m_OptionsList.AddTail( pOption );
|
|
|
|
pOption = (OPTION_STATE *) new W3SAMP_OPTION( this );
|
|
if ( pOption == NULL )
|
|
break;
|
|
m_OptionsList.AddTail( pOption );
|
|
|
|
pOption = (OPTION_STATE *) new HTMLA_OPTION( this );
|
|
if ( pOption == NULL )
|
|
break;
|
|
m_OptionsList.AddTail( pOption );
|
|
|
|
pOption = (OPTION_STATE *) new GOPHER_OPTION( this );
|
|
if ( pOption == NULL )
|
|
break;
|
|
m_OptionsList.AddTail( pOption );
|
|
|
|
pOption = (OPTION_STATE *) new FTP_OPTION( this );
|
|
if ( pOption == NULL )
|
|
break;
|
|
m_OptionsList.AddTail( pOption );
|
|
|
|
pOption = (OPTION_STATE *) new ODBC_OPTION( this );
|
|
if ( pOption == NULL )
|
|
break;
|
|
m_OptionsList.AddTail( pOption );
|
|
|
|
} while(FALSE);
|
|
}
|
|
|
|
INT MACHINE::SetMachine( CString MachineName )
|
|
{
|
|
m_err = 0;
|
|
|
|
GetLocalMachineName();
|
|
|
|
if (( MachineName == m_MachineName ) ||
|
|
( MachineName == _T("")))
|
|
{
|
|
m_fLocal = TRUE;
|
|
} else
|
|
{
|
|
m_fLocal = FALSE;
|
|
if ( MachineName[0] != _T('\\'))
|
|
{
|
|
CString strTmp = m_MachineName;
|
|
m_MachineName = _T("\\\\");
|
|
m_MachineName += strTmp;
|
|
} else
|
|
{
|
|
m_MachineName = MachineName;
|
|
}
|
|
}
|
|
|
|
if ((( m_err = GetMachineOS()) == 0 ) &&
|
|
(( m_err = GetSysPath()) == 0 ) &&
|
|
(( m_err = GetMachineType()) == 0 ))
|
|
{
|
|
GetProductType();
|
|
|
|
OPTION_STATE *pOption = FindOption( m_OptionsList, IDS_SN_INETSTP );
|
|
// nothing strange happen
|
|
if ( pOption != NULL )
|
|
{
|
|
if ( !pOption->IsInstalled())
|
|
{
|
|
SetNewInstallation();
|
|
} else
|
|
{
|
|
SetMaintenance();
|
|
}
|
|
} else
|
|
{
|
|
}
|
|
}
|
|
return m_err;
|
|
}
|
|
|
|
void MACHINE::RemoveAll()
|
|
{
|
|
ResetOptionState();
|
|
OPTION_STATE *pOption;
|
|
POSITION pos = m_OptionsList.GetHeadPosition();
|
|
|
|
while ( pos )
|
|
{
|
|
pOption = (OPTION_STATE*)m_OptionsList.GetAt( pos );
|
|
pOption->SetAction(( pOption->iState == STATE_INSTALLED )? ACTION_REMOVE : ACTION_DO_NOTHING );
|
|
m_OptionsList.GetNext( pos );
|
|
}
|
|
}
|