#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; im_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 ); } }