Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

2392 lines
75 KiB

// base2.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "lzexpand.h"
#include <string.h>
#include "import.h"
#include "registry.h"
#include "machine.h"
#include "base.h"
#include "w3svc.h"
#include "ftpd.h"
#include "inetinfo.h"
#include "messaged.h"
#include "options.h"
#include "copydlg.h"
#include "mosaicga.h"
#include "welcomed.h"
#include "maintena.h"
#include "thread.h"
#include "singleop.h"
#include "basedlg.h"
#include "billboar.h"
#include "odbcinst.h"
#include "lm.h"
extern "C"
{
#include "userenv.h"
#include "userenvp.h"
}
#ifdef _DEBUG
#undef THIS_FILE
static TCHAR BASED_CODE THIS_FILE[] = __FILE__;
#endif
//
// Global Default
//
#define SZ_HTM _T(".htm")
#define SZ_DOT_HTML _T(".html")
#define SZ_HTML _T("HTML")
#define SZ_SHELL _T("Shell")
#define SZ_OPEN _T("Open")
#define SZ_COMMAND _T("Command")
// perf mon file assocation
#define SZ_PERFFILE _T("PerfFile")
#define SZ_DOT_PMA _T(".pma")
#define SZ_DOT_PML _T(".pml")
#define SZ_DOT_PMC _T(".pmc")
#define SZ_DOT_PMR _T(".pmr")
#define SZ_DOT_PMW _T(".pmw")
// Return TRUE if file exists
BOOL IsFileExist(LPCTSTR strFile)
{
return ( GetFileAttributes(strFile) != 0xFFFFFFFF );
}
// Compare two files Byte-by-Byte, return TRUE if equal
BOOL FileComp(LPCTSTR strFile1, LPCTSTR strFile2)
{
HANDLE hFile1=NULL, hFile2=NULL, hFile1Map=NULL, hFile2Map=NULL;
LPVOID lpvFile1=NULL, lpvFile2=NULL;
LPCSTR lpch1, lpch2;
int dwFile1Size, dwFile2Size;
BOOL fResult = FALSE;
int i;
do {
if (_stricmp(strFile1, strFile2) == 0) {
fResult = TRUE;
break;
}
hFile1 = CreateFile(strFile1, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile1 == INVALID_HANDLE_VALUE)
break;
hFile2 = CreateFile(strFile2, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile2== INVALID_HANDLE_VALUE)
break;
// Get the size of the file. I am assuming that the file
// is less than 4 gigabytes long here.
dwFile1Size = GetFileSize(hFile1, NULL);
dwFile2Size = GetFileSize(hFile2, NULL);
if (dwFile1Size != dwFile2Size)
break;
// Create the file mapping object.
if (!(hFile1Map = CreateFileMapping(hFile1, NULL, PAGE_READONLY, 0, dwFile1Size, NULL)))
break;
if (!(hFile2Map = CreateFileMapping(hFile2, NULL, PAGE_READONLY, 0, dwFile2Size, NULL)))
break;
// Get the addess to where the first byte of the file is mapped into memory
if (!(lpvFile1 = MapViewOfFile(hFile1Map, FILE_MAP_READ, 0, 0, 0)))
break;
if (!(lpvFile2 = MapViewOfFile(hFile2Map, FILE_MAP_READ, 0, 0, 0)))
break;
lpch1 = (LPSTR) lpvFile1;
lpch2 = (LPSTR) lpvFile2;
i = 0;
while ((i++ < dwFile1Size) && (*lpch1++ == *lpch2++))
;
if (i > dwFile1Size)
fResult = TRUE;
} while (FALSE);
// Cleanup everything before exiting.
UnmapViewOfFile(lpvFile1);
CloseHandle(hFile1Map);
CloseHandle(hFile1);
UnmapViewOfFile(lpvFile2);
CloseHandle(hFile2Map);
CloseHandle(hFile2);
return(fResult);
}
// just copy one file, TRUE if succeed
BOOL CopyOneFile(LPCTSTR strSrc, LPCTSTR strDest)
{
OFSTRUCT ofStructSrc, ofStructDest;
INT iSrc, iDest;
BOOL fResult = FALSE;
TCHAR lpszSrc[_MAX_PATH];
TCHAR lpszDest[_MAX_PATH];
strcpy(lpszSrc, strSrc);
strcpy(lpszDest, strDest);
do {
iSrc = LZOpenFile(lpszSrc, &ofStructSrc, OF_READ | OF_SHARE_DENY_NONE);
iDest = LZOpenFile(lpszDest, &ofStructDest, OF_CREATE | OF_WRITE | OF_SHARE_DENY_NONE);
if (iSrc < 0 || iDest < 0)
break;
if (LZCopy(iSrc, iDest) >= 0)
fResult = TRUE;
} while (FALSE);
LZClose(iSrc);
LZClose(iDest);
return (fResult);
}
// get virtual root
void GetVRootValue( CString strRegPath, CString csName, CString &csRegName, CString &csRegValue)
{
strRegPath+=_T("\\Parameters\\Virtual Roots");
CRegKey regVR( HKEY_LOCAL_MACHINE, strRegPath, KEY_ALL_ACCESS, NULL );
if ( (HKEY) regVR )
{
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.Compare(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 );
}
}
}
// get virtual root
void GetVRootPath( CString strRegPath, CString &csRegValue )
{
CString csRegName;
GetVRootValue(strRegPath, _T("/"), csRegName, csRegValue);
}
// get script installation location for WWW
void GetVScriptPath( CString strRegPath, CString &csRegValue )
{
CString csRegName;
GetVRootValue(strRegPath, _T("/Scripts"), csRegName, csRegValue);
}
// get iisadmin installation location
void GetVAdminPath( CString strRegPath, CString &csRegValue )
{
CString csRegName;
GetVRootValue(strRegPath, _T("/iisadmin"), csRegName, csRegValue);
}
// Given a fullpathname of a directory, remove any empty dirs under it including itself
BOOL RecRemoveEmptyDir(LPCTSTR szName)
{
DWORD retCode;
BOOL fRemoveDir = TRUE;
WIN32_FIND_DATA FindFileData;
HANDLE hFile = INVALID_HANDLE_VALUE;
char szSubDir[_MAX_PATH] = "";
char szDirName[_MAX_PATH] = "";
retCode = GetFileAttributes(szName);
if (retCode == 0xFFFFFFFF || !(retCode & FILE_ATTRIBUTE_DIRECTORY))
return FALSE;
sprintf(szDirName, "%s\\*", szName);
hFile = FindFirstFile(szDirName, &FindFileData);
if (hFile != INVALID_HANDLE_VALUE) {
do {
if (strcmp(FindFileData.cFileName, ".") != 0 &&
strcmp(FindFileData.cFileName, "..") != 0 ) {
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
sprintf(szSubDir, "%s\\%s", szName, FindFileData.cFileName);
fRemoveDir = RecRemoveEmptyDir(szSubDir) && fRemoveDir;
} else {
fRemoveDir = FALSE; // it is a file, this Dir is not empty
}
}
if (FindNextFile(hFile, &FindFileData)) {
continue;
} else {
FindClose(hFile);
break;
}
} while (TRUE);
}
if (fRemoveDir)
return( RemoveDirectory(szName) );
else
return FALSE;
}
//
// scan the buffer and split the string by "," character
//
INT ScanBuffer( TCHAR *szBuf, TCHAR szField[10][BUF_SIZE] )
{
INT nField = 0;
TCHAR *pStart = szBuf;
TCHAR *pField = szField[0];
while (( *pStart != '\0' ) && (*pStart != '\n'))
{
if ( *pStart == ',')
{
nField++;
pField = szField[nField];
} else
{
*pField = *pStart;
*pField++;
*pField='\0';
}
pStart++;
}
return(nField+1);
}
/////////////////////////////////////////////////////////////////////////////
// OPTION_STATE
/////////////////////////////////////////////////////////////////////////////
OPTION_STATE::OPTION_STATE( INT ID, MACHINE *pMachine )
: m_pMachine( pMachine ),
nID( ID )
{
iSize = 0;
fVisible = TRUE;
}
OPTION_STATE::~OPTION_STATE()
{
CFileInfo *pInfo;
POSITION pos = FileList.GetHeadPosition();
while ( pos )
{
pInfo = (CFileInfo *)FileList.GetAt( pos );
delete pInfo;
FileList.GetNext( pos );
}
FileList.RemoveAll();
}
CString OPTION_STATE::LocalPath()
{
return( m_pMachine->strDirectory );
}
// Install specified options
INT OPTION_STATE::DoAdd()
{
INT err = INSTALL_SUCCESSFULL;
if (( nID == IDS_SN_INETSTP ) || ( fVisible ))
{
if (iAction == ACTION_INSTALL && iState == STATE_NOT_INSTALLED) {
((CBaseDlg *) theApp.m_pMainWnd)->SetBillBoard( IDB_BILLBOARD1 );
theApp.m_fSvcPackWarning = TRUE;
err = Install();
}
}
return(err);
}
// Remove specified options
INT OPTION_STATE::DoRemove()
{
INT err = INSTALL_SUCCESSFULL;
if (( nID == IDS_SN_INETSTP ) || ( fVisible ))
{
if (iAction == ACTION_REMOVE && iState == STATE_INSTALLED)
err = Remove();
}
return(err);
}
void OPTION_STATE::DoNotInstallOption(int nID)
{
OPTION_STATE *pOption = FindOption( m_pMachine->m_OptionsList, nID);
if ( pOption && (pOption->iAction == ACTION_INSTALL) )
pOption->SetAction(ACTION_DO_NOTHING);
}
void OPTION_STATE::DoNotRemoveOption(int nID)
{
OPTION_STATE *pOption = FindOption( m_pMachine->m_OptionsList, nID);
if ( pOption && (pOption->iAction == ACTION_REMOVE) )
pOption->SetAction(ACTION_DO_NOTHING);
}
INT OPTION_STATE::Install()
{
return NERR_Success;
}
INT OPTION_STATE::Remove()
{
return NERR_Success;
}
// get all the batch installation information
void OPTION_STATE::GetBatchInstallMode( CString InfName )
{
if (theApp.m_strBatchSectionName.IsEmpty())
iAction = ACTION_INSTALL;
else {
TCHAR szOption[BUF_SIZE];
wsprintf( szOption, _T("Install%s"), strServiceName );
iAction = (::GetPrivateProfileInt( theApp.m_strBatchSectionName, szOption, 1, InfName ) ? ACTION_INSTALL : ACTION_DO_NOTHING);
}
}
//
// Get the file list from the inf file
//
void OPTION_STATE::GetFileList( CStdioFile &InfFile )
{
InfFile.SeekToBegin();
TCHAR buf[BUF_SIZE];
// read the file
while ( InfFile.ReadString(buf,BUF_SIZE))
{
INT i=0;
if ( buf[0] == ';' )
{
continue;
}
if ( buf[0] == '[' )
{
CString strTitle = buf;
iSize = 0;
if ( strTitle.Find( strServiceName ) != (-1))
{
INT iDisk;
TCHAR szName[BUF_SIZE];
// find it, add the following line to the list
do
{
if ( InfFile.ReadString(buf,BUF_SIZE) == NULL )
{
// end of file
break;
}
if ( buf[0] == ';' )
{
continue;
}
if ( buf[0] == '[' )
{
break;
}
if ( isdigit(buf[0]))
{
DWORD iNewSize;
TCHAR szOption[BUF_SIZE];
TCHAR szField[10][BUF_SIZE];
INT iField;
iField = ScanBuffer( buf, szField );
iDisk = atoi( szField[0] );
iNewSize = atoi( szField[1] );
lstrcpy( szName, szField[2] );
//
// scan for option in the file list line
//
CFileInfo *pNew = new CFileInfo( iDisk, szName, iNewSize );
for ( INT i = 3; i < iField ; i++ )
{
lstrcpy( szOption, szField[i] );
if ( strncmp( _T("RENAME="),szOption,lstrlen(_T("RENAME="))) == 0 )
{
TCHAR *pStart = szOption;
pStart += lstrlen(_T("RENAME="));
pNew->m_rename = pStart;
} else if ( strncmp( _T("FROM"),szOption,lstrlen(_T("FROM"))) == 0 )
{
TCHAR *pStart = szOption;
pStart += lstrlen(_T("FROM="));
pNew->m_from = pStart;
} else if ( strncmp( _T("TO"),szOption,lstrlen(_T("TO"))) == 0 )
{
TCHAR *pStart = szOption;
pStart += lstrlen(_T("TO="));
pNew->m_To = pStart;
} else if ( strncmp( _T("SYSTEM"),szOption,lstrlen(_T("SYSTEM"))) == 0 )
{
pNew->m_fSystem = TRUE;
} else if ( strncmp( _T("WINDIR"),szOption,lstrlen(_T("WINDIR"))) == 0 )
{
pNew->m_fWinDir = TRUE;
} else if ( strncmp( _T("DONTREMOVE"),szOption,lstrlen(_T("DONTREMOVE"))) == 0 )
{
pNew->m_fDontRemove = TRUE;
} else if ( strncmp( _T("REFCOUNT"), szOption,lstrlen(_T("REFCOUNT"))) == 0 )
{
pNew->m_fRefCount = TRUE;
} else if ( strncmp( _T("SCRIPTFILE"), szOption,lstrlen(_T("SCRIPTFILE"))) == 0 )
{
pNew->m_fScriptFile = TRUE;
} else if ( strncmp( _T("ROOTFILE"), szOption,lstrlen(_T("ROOTFILE"))) == 0 )
{
pNew->m_fRootFile = TRUE;
} else if ( strncmp( _T("DONTOVERWRITE"), szOption,lstrlen(_T("DONTOVERWRITE"))) == 0 )
{
pNew->m_fDontOverwrite = TRUE;
}
}
FileList.AddTail( pNew );
iSize += iNewSize;
}
} while (TRUE);
break;
}
}
}
}
//
// Create the File Copy Dialog and copy each file
//
INT OPTION_STATE::CopyFile()
{
INT err = INSTALL_SUCCESSFULL;
CWnd *pMainWnd = AfxGetMainWnd();
CCopyDlg CopyDlg( this, m_pMachine->m_MachineType );
if ( CopyDlg.DoModal() == IDCANCEL )
{
theApp.m_fTerminate = INSTALL_INTERRUPT;
err = INSTALL_INTERRUPT;
}
return err;
}
//
// Remove file from the system
//
INT OPTION_STATE::RemoveFiles()
{
INT err = INSTALL_SUCCESSFULL;
CString strDir = GetInstallDirectory();
if ( strDir != _T(""))
{
POSITION pos = FileList.GetHeadPosition();
while ( pos )
{
CFileInfo *pInfo = (CFileInfo *)FileList.GetAt( pos );
CString strFile;
if ( pInfo->m_fDontRemove == FALSE )
{
if ( pInfo->m_fSystem )
{
strFile = m_pMachine->m_strDestinationPath;
} else if ( pInfo->m_fWinDir )
{
strFile = m_pMachine->GetWinDir();
} else
{
strFile = strDir;
}
if ( !pInfo->m_To.IsEmpty())
{
strFile += _T("\\");
strFile += pInfo->m_To;
}
strFile += _T("\\");
if ( pInfo->m_rename.IsEmpty() )
{
strFile += pInfo->m_strName;
} else
{
strFile += pInfo->m_rename;
}
if (!pInfo->m_fRefCount ||
(pInfo->m_fRefCount && 0 == m_pMachine->FileDecRefCount(strFile)) )
DeleteFile(strFile);
}
FileList.GetNext( pos );
}
}
return err;
}
void OPTION_STATE::DeleteFile(CString csFileName)
{
// if file exists but DeleteFile() fails
if ( (GetFileAttributes(csFileName) != 0xFFFFFFFF) && !(::DeleteFile(csFileName)) ) {
// if we cannot delete it, then move delay until reboot
// well, may be we should leave it alone and do nothing
TCHAR TmpPath[BUF_SIZE];
TCHAR TmpName[BUF_SIZE];
if ( GetTempPath( BUF_SIZE, TmpPath ) == 0 )
lstrcpy( TmpPath, _T("c:\\"));
if ( GetTempFileName( TmpPath, _T("INT"), 0, TmpName ) ) {
MoveFileEx( csFileName, TmpName, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED );
MoveFileEx( TmpName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT );
}
}
}
//
// get the installation directory
//
CString OPTION_STATE::GetInstallDirectory()
{
return(m_pMachine->strDirectory);
}
//
// Check whether the options is installed or not
//
BOOL OPTION_STATE::IsInstalled()
{
BOOL fReturn = FALSE;
fReturn = (*(m_pMachine->m_pIsInstalled))( m_pMachine->m_MachineName, strRegPath );
return fReturn;
}
//
// Reset the state of the option
//
void OPTION_STATE::ResetOption()
{
fVisible = TRUE;
iState = IsInstalled() ? STATE_INSTALLED : STATE_NOT_INSTALLED;
iAction = ACTION_DO_NOTHING;
}
//
// get the total size of the option
// it is a virtual function. It is for the sub option class
//
DWORD OPTION_STATE::GetTotalSize()
{
return(iSize);
}
//
// set the installation action of the option
//
void OPTION_STATE::SetAction( INT nAction )
{
if ( (( nAction == ACTION_INSTALL ) && ( iState == STATE_INSTALLED )) ||
(( nAction == ACTION_REMOVE ) && ( iState == STATE_NOT_INSTALLED )) )
{
iAction = ACTION_DO_NOTHING;
} else
{
iAction = nAction;
}
}
/////////////////////////////////////////////////////
// UPG1314_OPTION
/////////////////////////////////////////////////////
UPG1314_OPTION::UPG1314_OPTION( MACHINE *pMachine )
: OPTION_STATE( IDS_SN_UPG1314, pMachine )
{
strName = _T("");
strDescription = _T("");
strServiceName = _T("");
strRegPath = _T("");
strInstallDirPath = _T("");
}
//
// Remove files installed by build 1314
//
INT UPG1314_OPTION::Remove()
{
INT err = INSTALL_SUCCESSFULL;
RemoveFiles();
return(err);
}
/////////////////////////////////////////////////////
// WWW Service Samples Option
/////////////////////////////////////////////////////
W3SAMP_OPTION::W3SAMP_OPTION( MACHINE *pMachine )
: OPTION_STATE( IDS_SN_W3SAMP, pMachine )
{
strName.LoadString( IDS_OPTION_W3SAMP );
strDescription.LoadString( IDS_DES_W3SAMP );
strServiceName.LoadString( IDS_SN_W3SAMP );
strRegPath = W3SAMP_REG_PATH;
strInstallDirPath = W3SAMP_REG_PATH;
}
//
// Install WWW Service Sample Files:
// \InetPub\scripts\samples
// \InetPub\scripts\tools
// \InetPub\wwwroot\samples
//
INT W3SAMP_OPTION::Install()
{
INT err = INSTALL_SUCCESSFULL;
if (theApp.m_fOldFTPInstalled && !IsInstalled())
return err;
CString csW3VRoot, csW3VScript;
GetVRootPath( WWW_REG_PATH, csW3VRoot );
GetVScriptPath( WWW_REG_PATH, csW3VScript);
do
{
POSITION pos = FileList.GetHeadPosition();
while ( pos != NULL )
{
CFileInfo *pInfo = (CFileInfo *) FileList.GetAt( pos );
if ( pInfo != NULL )
{
if ( pInfo->m_fScriptFile )
pInfo->m_strDest = csW3VScript;
else
pInfo->m_strDest = csW3VRoot;
if ( _stricmp(pInfo->m_strName, _T("default1.htm")) == 0 ) {
CString csExFile = pInfo->m_strDest;
if ( !pInfo->m_To.IsEmpty() )
{
csExFile += _T("\\");
csExFile += pInfo->m_To;
}
csExFile += _T("\\default.htm");
CString csFile0 = theApp.m_strSrcLocation;
if ( csFile0.Right(1) != _T("\\") )
csFile0 += _T("\\");
if ( !pInfo->m_from.IsEmpty() )
csFile0 += pInfo->m_from;
csFile0 += _T("default0.htm");
if (FileComp((LPCTSTR)csExFile, (LPCTSTR)csFile0))
pInfo->m_fDontOverwrite = FALSE;
else
pInfo->m_fDontOverwrite = TRUE;
}
FileList.GetNext( pos );
} else
break;
}
CopyFile();
if ( theApp.m_fTerminate )
{
err = INSTALL_INTERRUPT;
break;
}
// create registry key
CRegKey reg( strRegPath, HKEY_LOCAL_MACHINE, REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
} while (FALSE);
return(err);
}
//
// Remove WWW Sample Files
//
INT W3SAMP_OPTION::Remove()
{
INT err = INSTALL_SUCCESSFULL;
CBillBoard BillBoard( IDS_REMOVE_W3SAMP, AfxGetMainWnd(), TRUE );
BillBoard.Create();
// remove file first
RemoveFiles();
// remove registry key
CRegKey regMachine = HKEY_LOCAL_MACHINE;
CString csKeyName = REG_W3SAMP_KEY;
CString csRegPath = WWW_REG_PATH;
CRegKey regAgent(regMachine, csRegPath);
if (regAgent)
regAgent.Delete(csKeyName);
BillBoard.DestroyWindow();
return(err);
}
INT W3SAMP_OPTION::RemoveFiles()
{
INT err = INSTALL_SUCCESSFULL;
CString csFileName;
CString csW3VScript, csW3VRoot;
GetVScriptPath( WWW_REG_PATH, csW3VScript);
GetVRootPath( WWW_REG_PATH, csW3VRoot);
POSITION pos = FileList.GetHeadPosition();
while ( pos )
{
CFileInfo *pInfo = (CFileInfo *) FileList.GetAt( pos );
if ( pInfo->m_fScriptFile )
pInfo->m_strDest = csW3VScript;
else
pInfo->m_strDest = csW3VRoot;
csFileName = pInfo->m_strDest;
if ( !pInfo->m_To.IsEmpty())
{
csFileName += _T("\\");
csFileName += pInfo->m_To;
}
CString csExFile = csFileName;
csFileName += _T("\\");
if ( pInfo->m_rename.IsEmpty() )
csFileName += pInfo->m_strName;
else
csFileName += pInfo->m_rename;
if (_stricmp(pInfo->m_strName, _T("default1.htm")) == 0) {
csExFile += _T("\\default.htm");
CString csFrom = theApp.m_strSrcLocation;
if ( csFrom.Right(1) != _T("\\") )
csFrom += _T("\\");
if ( !pInfo->m_from.IsEmpty() )
csFrom += pInfo->m_from;
CString csFile0 = csFrom + _T("default0.htm");
CString csFile1 = csFrom + _T("default1.htm");
if (FileComp((LPCTSTR)csExFile, (LPCTSTR)csFile1)) {
CopyOneFile((LPCTSTR)csFile0, (LPCTSTR)csExFile);
pInfo->m_fDontRemove = TRUE;
}
}
if (pInfo->m_fDontRemove == FALSE && (!pInfo->m_fRefCount ||
(pInfo->m_fRefCount && 0 == m_pMachine->FileDecRefCount(csFileName))) )
DeleteFile(csFileName);
FileList.GetNext( pos );
}
CString csRmDir = csW3VRoot + _T("\\samples");
RecRemoveEmptyDir((LPCTSTR)csRmDir);
csRmDir = csW3VScript + _T("\\samples");
RecRemoveEmptyDir((LPCTSTR)csRmDir);
csRmDir = csW3VScript + _T("\\tools");
RecRemoveEmptyDir((LPCTSTR)csRmDir);
return err;
}
/////////////////////////////////////////////////////
// HTMLA Option
/////////////////////////////////////////////////////
HTMLA_OPTION::HTMLA_OPTION( MACHINE *pMachine )
: OPTION_STATE( IDS_SN_HTMLA, pMachine )
{
strName.LoadString( IDS_OPTION_HTMLA );
strDescription.LoadString( IDS_DES_HTMLA );
strServiceName.LoadString( IDS_SN_HTMLA );
strRegPath = HTMLA_REG_PATH;
strInstallDirPath = HTMLA_REG_PATH;
}
INT HTMLA_OPTION::Install()
{
INT err = INSTALL_SUCCESSFULL;
if (theApp.m_fOldFTPInstalled && !IsInstalled())
return err;
CString csW3VRoot, csW3VScript, csW3VAdmin;
GetVScriptPath( WWW_REG_PATH, csW3VScript);
GetVAdminPath( WWW_REG_PATH, csW3VAdmin);
do
{
POSITION pos = FileList.GetHeadPosition();
while ( pos != NULL )
{
CFileInfo *pInfo = (CFileInfo *) FileList.GetAt( pos );
if ( pInfo != NULL )
{
if ( pInfo->m_fScriptFile )
{
pInfo->m_strDest = csW3VScript;
} else {
pInfo->m_strDest = csW3VAdmin;
}
if ( _stricmp(pInfo->m_strName, _T("default1.htm")) == 0 ) {
CString csExFile = pInfo->m_strDest;
if ( !pInfo->m_To.IsEmpty() )
{
csExFile += _T("\\");
csExFile += pInfo->m_To;
}
csExFile += _T("\\default.htm");
CString csFile0 = theApp.m_strSrcLocation;
if ( csFile0.Right(1) != _T("\\") )
csFile0 += _T("\\");
if ( !pInfo->m_from.IsEmpty() )
csFile0 += pInfo->m_from;
csFile0 += _T("default0.htm");
if (FileComp((LPCTSTR)csExFile, (LPCTSTR)csFile0))
pInfo->m_fDontOverwrite = FALSE;
else
pInfo->m_fDontOverwrite = TRUE;
}
FileList.GetNext( pos );
} else
break;
}
CopyFile();
if ( theApp.m_fTerminate )
{
err = INSTALL_INTERRUPT;
break;
}
// create registry key
CRegKey reg( strRegPath, HKEY_LOCAL_MACHINE, REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
// add Program Item: iexplore.exe http://localhost/iisadmin/default.htm
// Ted Miller confirmed: %SystemDrive%\Program Files\Plus!\Microsoft Internet\iexplore.exe
CString csGroupName;
csGroupName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )? IDS_WINNT_GROUP_NAME : IDS_LANMANNT_GROUP_NAME );
//CreateGroup( csGroupName, TRUE );
CString csAppName;
csAppName.LoadString(IDS_IIS_ADMIN);
DeleteItem ( csGroupName, TRUE, csAppName, TRUE );
CString csMsg, csIexplore;
csIexplore.LoadString(IDS_IEXPLORE);
csMsg = _T("\"%SystemDrive%");
csMsg += csIexplore;
csMsg += _T("\" http://localhost/iisadmin/default.htm");
//CString csIconPath( _T("\"%SystemDrive%\\Program Files\\Plus!\\Microsoft Internet\\iexplore.exe\"") );
AddItem( csGroupName, TRUE, csAppName, csMsg, NULL, 0, NULL, 0, SW_SHOWNORMAL );
} while (FALSE);
return(err);
}
INT HTMLA_OPTION::Remove()
{
INT err = INSTALL_SUCCESSFULL;
CBillBoard BillBoard( IDS_REMOVE_HTMLA, AfxGetMainWnd(), TRUE );
BillBoard.Create();
// remove file first
RemoveFiles();
// Remove program item Internet Service Manager (HTML)
CString csGroupName;
csGroupName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )? IDS_WINNT_GROUP_NAME : IDS_LANMANNT_GROUP_NAME );
CString csAppName;
csAppName.LoadString(IDS_IIS_ADMIN);
DeleteItem ( csGroupName, TRUE, csAppName, TRUE );
// remove registry key
CRegKey regMachine = HKEY_LOCAL_MACHINE;
CString csKeyName = REG_HTMLA_KEY;
CString csRegPath = WWW_REG_PATH;
CRegKey regAgent(regMachine, csRegPath);
if (regAgent)
regAgent.Delete(csKeyName);
BillBoard.DestroyWindow();
return(err);
}
INT HTMLA_OPTION::RemoveFiles()
{
INT err = INSTALL_SUCCESSFULL;
CString csFileName;
CString csW3VScript, csW3VAdmin;
GetVScriptPath( WWW_REG_PATH, csW3VScript);
GetVAdminPath( WWW_REG_PATH, csW3VAdmin);
POSITION pos = FileList.GetHeadPosition();
while ( pos )
{
CFileInfo *pInfo = (CFileInfo *) FileList.GetAt( pos );
if ( pInfo->m_fScriptFile )
pInfo->m_strDest = csW3VScript;
else
pInfo->m_strDest = csW3VAdmin;
csFileName = pInfo->m_strDest;
if ( !pInfo->m_To.IsEmpty())
{
csFileName += _T("\\");
csFileName += pInfo->m_To;
}
CString csExFile = csFileName;
csFileName += _T("\\");
if ( pInfo->m_rename.IsEmpty() )
csFileName += pInfo->m_strName;
else
csFileName += pInfo->m_rename;
if (_stricmp(pInfo->m_strName, _T("default1.htm")) == 0) {
csExFile += _T("\\default.htm");
CString csFrom = theApp.m_strSrcLocation;
if ( csFrom.Right(1) != _T("\\") )
csFrom += _T("\\");
if ( !pInfo->m_from.IsEmpty() )
csFrom += pInfo->m_from;
CString csFile0 = csFrom + _T("default0.htm");
CString csFile1 = csFrom + _T("default1.htm");
if (FileComp((LPCTSTR)csExFile, (LPCTSTR)csFile1)) {
CopyOneFile((LPCTSTR)csFile0, (LPCTSTR)csExFile);
pInfo->m_fDontRemove = TRUE;
}
}
if (pInfo->m_fDontRemove == FALSE && (!pInfo->m_fRefCount ||
(pInfo->m_fRefCount && 0 == m_pMachine->FileDecRefCount(csFileName))) )
DeleteFile(csFileName);
FileList.GetNext( pos );
}
CString csRmDir = csW3VScript + _T("\\iisadmin");
RecRemoveEmptyDir((LPCTSTR)csRmDir);
return err;
}
/////////////////////////////////////////////////////
// Internet Service Manager Option
/////////////////////////////////////////////////////
ADMIN_OPTION::ADMIN_OPTION( MACHINE *pMachine )
: OPTION_STATE( IDS_SN_ADMIN, pMachine )
{
strName.LoadString( IDS_OPTION_ADMIN );
strDescription.LoadString( IDS_DES_ADMIN );
strServiceName.LoadString( IDS_SN_ADMIN );
strRegPath = ADMIN_REG_PATH;
fVisible = FALSE;
strInstallDirPath = ADMIN_REG_PATH;
strInstallDirPath += _T("\\Parameters");
}
BOOL ADMIN_OPTION::IsInstalled()
{
BOOL fReturn = FALSE;
CRegKey reg( HKEY_LOCAL_MACHINE, ADMIN_REG_PATH );
if ( (HKEY) reg )
fReturn = TRUE;
return( fReturn );
}
INT ADMIN_OPTION::Install()
{
INT err = INSTALL_SUCCESSFULL;
do
{
if ( IsInstalled() )
GetInstallDirectory();
// copy file first
CopyFile();
if ( theApp.m_fTerminate )
{
err = INSTALL_INTERRUPT;
DoNotInstallOption(IDS_SN_FTP);
DoNotInstallOption(IDS_SN_GOPHER);
DoNotInstallOption(IDS_SN_WWW);
DoNotInstallOption(IDS_SN_W3SAMP);
DoNotInstallOption(IDS_SN_HTMLA);
} else
{
CBillBoard BillBoard( IDS_INSTALL_INETMGR, AfxGetMainWnd() );
BillBoard.Create();
// InetMgr Registry
do
{
CString strDll;
// Key: KeyRing
CRegKey regKeyRing( KEYRING_REG_PATH, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if ( NULL == (HKEY) regKeyRing )
break;
// Key: KeyRing\Parameters
CRegKey regKeyRingParam( KEYRING_PARAM_REG_PATH, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if ( NULL == (HKEY) regKeyRingParam)
break;
// Key: KeyRing\Parameters\AddOnServices
CRegKey regKeyRingAddOnServices( KEYRING_ADD_ON_SERVICES, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if ( NULL == (HKEY) regKeyRingAddOnServices )
break;
strDll = _T("w3key.dll");
regKeyRingAddOnServices.SetValue( _T("WWW") , strDll);
// Key: INetMgr
CRegKey regINetMgr( ADMIN_REG_PATH, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if ( NULL == (HKEY) regINetMgr )
break;
CString strInetstp = SZ_INETSTP;
regINetMgr.SetValue(_T("InstalledBy"), strInetstp );
// Key: INetMgr\Parameters
CRegKey regINetParam( ADMIN_PARAM_REG_PATH, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if ( NULL == (HKEY) regINetParam)
break;
DWORD dwVersion = MAJORVERSION;
regINetParam.SetValue( _T("MajorVersion"), dwVersion );
dwVersion = MINORVERSION;
regINetParam.SetValue( _T("MinorVersion"), dwVersion );
CString csHelp = _T("iisadmin\\htmldocs\\inetdocs.htm");
regINetParam.SetValue(_T("HelpLocation"), csHelp);
// Key: INetMgr\Parameters\AddOnServices
CRegKey regINetAddOnServices( ADD_ON_SERVICES, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if ( NULL == (HKEY) regINetAddOnServices )
break;
strDll = _T("fscfg.dll");
regINetAddOnServices.SetValue( _T("FTP") , strDll);
strDll = _T("gscfg.dll");
regINetAddOnServices.SetValue( _T("Gopher") , strDll);
strDll = _T("w3scfg.dll");
regINetAddOnServices.SetValue( _T("WWW") , strDll);
// Key: INetMgr\Parameters\AddOnTools
CRegKey regINetAddOnTools( ADD_ON_TOOLS, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if ( NULL == (HKEY) regINetAddOnTools )
break;
CString strAddOnToolsValue = m_pMachine->strDirectory;
strAddOnToolsValue += _T("\\keyring.exe;");
CString csKeyMgrTip;
csKeyMgrTip.LoadString(IDS_KEYMGR_TIP_STRING);
strAddOnToolsValue += csKeyMgrTip;
CString csKeyMgrMenu;
csKeyMgrMenu.LoadString(IDS_KEYMGR_MENU_STRING);
regINetAddOnTools.SetValue( csKeyMgrMenu, strAddOnToolsValue, FALSE);
// add inetmgr.exe into AppPath
CRegKey regINETMGRAppPath(APP_INETMGR_REG_PATH, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if (NULL == (HKEY)regINETMGRAppPath)
break;
CString strAppDirPath = m_pMachine->strDirectory;
CString strAppPath = strAppDirPath + _T("\\");
strAppPath += SZ_INETMGR_EXE;
regINETMGRAppPath.SetValue(_T(""), strAppPath, FALSE);
regINETMGRAppPath.SetValue(_T("Path"), strAppDirPath, FALSE);
// add keyring.exe into AppPath
CRegKey regKEYRINGAppPath(APP_KEYRING_REG_PATH, HKEY_LOCAL_MACHINE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_pMachine->m_MachineName );
if (NULL == (HKEY)regKEYRINGAppPath)
break;
strAppPath = strAppDirPath + _T("\\");
strAppPath += SZ_KEYRING_EXE;
regKEYRINGAppPath.SetValue(_T(""), strAppPath, FALSE);
regKEYRINGAppPath.SetValue(_T("Path"), strAppDirPath, FALSE);
} while (FALSE);
InstallPerfmonType();
// create Program Group Item: Internet Service Manager
CString csGroupName;
csGroupName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )? IDS_WINNT_GROUP_NAME : IDS_LANMANNT_GROUP_NAME );
//CreateGroup( csGroupName, TRUE );
CString csAppName;
csAppName.LoadString( IDS_INET_ADMIN );
DeleteItem ( csGroupName, TRUE, csAppName, TRUE );
CString csPath = LocalPath();
CString csMsg;
csMsg.Format( _T("%s\\inetmgr.exe"), (LPCSTR)csPath );
AddItem( csGroupName, TRUE, csAppName, csMsg, csMsg, 0, NULL, 0, SW_SHOWNORMAL );
// create Program Group Item: Key Manager
csAppName.LoadString( IDS_KEYRING );
DeleteItem ( csGroupName, TRUE, csAppName, TRUE );
csMsg.Format( _T("%s\\keyring.exe"), (LPCSTR)csPath );
AddItem( csGroupName, TRUE, csAppName, csMsg, csMsg, 0, NULL, 0, SW_SHOWNORMAL );
// create Program Group Item: Product Documentation
csAppName.LoadString( IDS_INET_ADMIN_HELP );
DeleteItem ( csGroupName, TRUE, csAppName, TRUE );
csMsg.Format( _T("%s\\iisadmin\\htmldocs\\inetdocs.htm"), (LPCSTR)csPath);
AddItem( csGroupName, TRUE, csAppName, csMsg, NULL, 0, NULL, 0, SW_SHOWNORMAL );
BillBoard.DestroyWindow();
}
} while(FALSE);
return err;
}
INT ADMIN_OPTION::Remove()
{
INT err = INSTALL_SUCCESSFULL;
// remove if only install by us
CRegKey regINetMgr( HKEY_LOCAL_MACHINE, ADMIN_REG_PATH );
if ( regINetMgr )
{
CString strBy;
if ( regINetMgr.QueryValue(_T("InstalledBy"), strBy ) == NERR_Success )
if ( strBy != SZ_INETSTP )
return(err);
// if we don't know, continue to remove it
}
CBillBoard BillBoard( IDS_REMOVE_ADMIN_OPTION, AfxGetMainWnd(), TRUE );
BillBoard.Create();
RemoveFiles();
// Remove Program Group Item: Internet Service Manager
CString csGroupName;
csGroupName.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )? IDS_WINNT_GROUP_NAME : IDS_LANMANNT_GROUP_NAME );
CString csMsg;
CString csAppName;
csAppName.LoadString( IDS_INET_ADMIN );
DeleteItem( csGroupName, TRUE, csAppName, TRUE );
// Remove Program Group Item: Key Manager
csAppName.LoadString( IDS_KEYRING );
DeleteItem ( csGroupName, TRUE, csAppName, TRUE );
// Remove Program Group Item: Product Documentation
csAppName.LoadString( IDS_INET_ADMIN_HELP );
DeleteItem ( csGroupName, TRUE, csAppName, TRUE );
// Remove Registry Key: INetMgr and KeyRing
CRegKey regSoftwareMicrosoft( HKEY_LOCAL_MACHINE, SOFTWARE_MICROSOFT, KEY_ALL_ACCESS, m_pMachine->m_MachineName );
if ( (HKEY) regSoftwareMicrosoft ) {
regSoftwareMicrosoft.DeleteTree( SZ_INETMGR );
regSoftwareMicrosoft.DeleteTree( SZ_KEYRING );
}
// delete inetmgr.exe + keyring.exe from App Path
CRegKey regAppPath( HKEY_LOCAL_MACHINE, APP_REG_PATH, KEY_ALL_ACCESS, m_pMachine->m_MachineName );
if ( (HKEY) regAppPath )
{
regAppPath.DeleteTree( SZ_INETMGR_EXE );
regAppPath.DeleteTree( SZ_KEYRING_EXE );
}
BillBoard.DestroyWindow();
AfxGetMainWnd()->SetForegroundWindow();
return err;
}
INT ADMIN_OPTION::RemoveFiles()
{
INT err = INSTALL_SUCCESSFULL;
CString csInstallPath = OPTION_STATE::GetInstallDirectory();
csInstallPath += _T("\\iisadmin");
OPTION_STATE::RemoveFiles();
RecRemoveEmptyDir((LPCTSTR)csInstallPath);
return err;
}
void ADMIN_OPTION::CreateExtension( CString strName, CString strValue )
{
CRegKey reg( strName, HKEY_CLASSES_ROOT, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, NULL );
if ( (HKEY)reg )
reg.SetValue( _T(""), strValue );
}
void ADMIN_OPTION::InstallPerfmonType()
{
do
{
CRegKey regOldPerfFile( HKEY_CLASSES_ROOT, SZ_PERFFILE, KEY_ALL_ACCESS, NULL );
if ( NULL == (HKEY)regOldPerfFile )
{
// it does not exist, create it
CreateExtension( SZ_DOT_PMA, SZ_PERFFILE );
CreateExtension( SZ_DOT_PMC, SZ_PERFFILE );
CreateExtension( SZ_DOT_PML, SZ_PERFFILE );
CreateExtension( SZ_DOT_PMR, SZ_PERFFILE );
CreateExtension( SZ_DOT_PMW, SZ_PERFFILE );
CRegKey regPerfFile( SZ_PERFFILE, HKEY_CLASSES_ROOT,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, NULL );
if ( NULL != (HKEY) regPerfFile )
{
CString strPerfFile;
strPerfFile.LoadString( IDS_PERF_MON_FILE );
regPerfFile.SetValue( _T(""), strPerfFile);
CRegKey regShell( SZ_SHELL, regPerfFile,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, NULL );
if ( NULL != (HKEY) regShell)
{
CRegKey regOpen( SZ_OPEN, regShell,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, NULL );
if ( NULL != (HKEY) regOpen)
{
CRegKey regCommand( SZ_COMMAND, regOpen,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, NULL );
if ( NULL != (HKEY) regCommand)
{
CString strCmd = _T("perfmon.exe %1");
regCommand.SetValue(_T(""), strCmd);
}
}
}
}
}
} while(FALSE);
}
/////////////////////////////////////////////////////
// ODBC Option
/////////////////////////////////////////////////////
ODBC_OPTION::ODBC_OPTION( MACHINE *pMachine )
: OPTION_STATE( IDS_SN_ODBC, pMachine )
{
strName.LoadString( IDS_OPTION_ODBC );
strDescription.LoadString( IDS_DES_ODBC );
strServiceName.LoadString( IDS_SN_ODBC );
strRegPath = ODBC_REG_PATH;
}
typedef LONG (*P_SQLInstallODBC)(HWND hwnd, LPSTR lpszINF, LPSTR lpszSrc, LPSTR lpszDrivers);
INT ODBC_OPTION::Install()
{
INT err = NERR_Success;
TCHAR lpszCplFile[_MAX_PATH];
GetWindowsDirectory(lpszCplFile, _MAX_PATH);
strcat(lpszCplFile, "\\system32\\odbccp32.cpl");
if (IsFileExist(lpszCplFile)) {
int iMsgBoxID;
BOOL fCloseCtrlPanel = FALSE;
HWND hCtrlPanel = NULL;
CString csCtrlPanelClass, csCtrlPanelTitle, csCtrlPanelWarn;
csCtrlPanelClass = _T("CabinetWClass");
csCtrlPanelTitle.LoadString(IDS_CTRLPANEL_TITLE);
hCtrlPanel = FindWindow((LPCTSTR)csCtrlPanelClass, (LPCTSTR)csCtrlPanelTitle);
if (hCtrlPanel) {
if ( theApp.m_fBatch )
fCloseCtrlPanel = TRUE;
else {
CString csMsgBoxTitle, csCtrlPanelWarn;
csMsgBoxTitle.LoadString((theApp.TargetMachine.m_actualProductType == PT_WINNT)? IDS_DES_INETSTP_NTW:IDS_DES_INETSTP_NTS);
csCtrlPanelWarn.LoadString(IDS_CTRLPANEL_WARN);
iMsgBoxID = MessageBox(NULL, (LPCTSTR)csCtrlPanelWarn, (LPCTSTR)csMsgBoxTitle, MB_OKCANCEL);
if (iMsgBoxID != IDOK) {
DoNotInstallOption(IDS_SN_ODBC);
return (err); // skip ODBC installation
}
fCloseCtrlPanel = TRUE;
}
}
while (hCtrlPanel && fCloseCtrlPanel) {
SendMessage(hCtrlPanel, WM_CLOSE, (WPARAM)0, (LPARAM)0);
hCtrlPanel = FindWindow((LPCTSTR)csCtrlPanelClass, (LPCTSTR)csCtrlPanelTitle);
}
}
do {
CString csODBCSrc = theApp.m_strSrcLocation;
if ( csODBCSrc.Right(1) != _T("\\") )
csODBCSrc += _T("\\");
csODBCSrc += _T("odbccp32.dll");
HINSTANCE ODBCDll = LoadLibraryEx( (LPCTSTR)csODBCSrc, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
if (ODBCDll) {
P_SQLInstallODBC pProc= (P_SQLInstallODBC)GetProcAddress( ODBCDll, "SQLInstallODBC");
if (pProc) {
CString strLocationInf = theApp.m_strSrcLocation;
if ( strLocationInf.Right(1) != _T("\\") )
strLocationInf += _T("\\");
strLocationInf += _T("odbc.inf");
if ( theApp.m_fBatch )
{
// batch file
(*pProc)( NULL, (LPTSTR)(LPCTSTR)strLocationInf, (LPTSTR)(LPCTSTR)theApp.m_strSrcLocation, NULL );
} else
{
// non batch
CWnd *pWnd = AfxGetMainWnd();
(*pProc)( pWnd->m_hWnd, (LPTSTR)(LPCTSTR)strLocationInf, (LPTSTR)(LPCTSTR)theApp.m_strSrcLocation, NULL );
}
FreeLibrary(ODBCDll);
break;
}
}
// LoadLibrary failure
if (ODBCDll)
FreeLibrary(ODBCDll);
/*
if ( !(theApp.m_fNTUpgrade) && !theApp.m_fUnattended) {
theApp.MsgBox(NULL, IDS_ODBC_LIB_FAILURE, MB_OK);
}
*/
} while (0);
CopyFile();
return(err);
}
INT ODBC_OPTION::Remove()
{
INT err = NERR_Success;
return(err);
}
/////////////////////////////////////////////////////
// FTP Service Option
/////////////////////////////////////////////////////
FTP_OPTION::FTP_OPTION( MACHINE *pMachine )
: OPTION_STATE( IDS_SN_FTP, pMachine )
{
TCHAR szDefaultDir[BUF_SIZE];
CString csINetPub("C:\\InetPub");
GetDriveLetter(m_pMachine->strDirectory, &csINetPub);
sprintf( szDefaultDir, _T("%s%s"), csINetPub, FTP_DEFAULT_DIR );
strName.LoadString( IDS_OPTION_FTP );
strDescription.LoadString( IDS_DES_FTP );
strServiceName.LoadString( IDS_SN_FTP );
strRegPath = FTP_REG_PATH;
strInstallDirPath = FTP_REG_PATH;
strInstallDirPath += _T("\\Parameters");
m_vroot = szDefaultDir;
m_vroot_name = _T("/");
m_fNeedToRestart = FALSE;
m_pSetupFTP = (P_SetupFTP)GetProcAddress( m_pMachine->m_WorkerDll, _T("SetupFTP"));
m_pRemoveFTP = (P_RemoveFTP)GetProcAddress( m_pMachine->m_WorkerDll, _T("RemoveFTP"));
m_pStopFTP = (P_StopFTP)GetProcAddress( m_pMachine->m_WorkerDll, _T("StopFTP"));
m_pDisableService = (P_DisableService)GetProcAddress( m_pMachine->m_WorkerDll, _T("DisableService"));
m_pINetStartService = (P_INetStartService)GetProcAddress( m_pMachine->m_WorkerDll, _T("INetStartService"));
m_pGuestAccEnabled = (P_GuestAccEnabled)GetProcAddress( m_pMachine->m_WorkerDll, _T("GuestAccEnabled"));
m_pRemoveOldFTP = (P_RemoveOldFTP)GetProcAddress( m_pMachine->m_WorkerDll, _T("RemoveOldFTP"));
}
BOOL FTP_OPTION::IsInstalled()
{
BOOL fReturn = FALSE;
// call the parent class to check
fReturn = OPTION_STATE::IsInstalled();
return( fReturn );
}
void OPTION_STATE::SetAnonymousAccountInfo(int nID)
{
int nID1, nID2;
CString csSecretKey, csSecretKey1, csSecretKey2;
CString csRegPath, csRegPath1, csRegPath2;
BOOL fInstalled, fInstalled1, fInstalled2;
switch (nID)
{
case IDS_SN_FTP:
nID1 = IDS_SN_WWW;
nID2 = IDS_SN_GOPHER;
csRegPath = FTP_REG_PATH;
csRegPath1 = WWW_REG_PATH;
csRegPath2 = GOPHER_REG_PATH;
csSecretKey = FTPD_ANONYMOUS_SECRET_W;
csSecretKey1 = W3_ANONYMOUS_SECRET_W;
csSecretKey2 = GOPHERD_ANONYMOUS_SECRET_W;
break;
case IDS_SN_WWW:
nID1 = IDS_SN_FTP;
nID2 = IDS_SN_GOPHER;
csRegPath = WWW_REG_PATH;
csRegPath1 = FTP_REG_PATH;
csRegPath2 = GOPHER_REG_PATH;
csSecretKey = W3_ANONYMOUS_SECRET_W;
csSecretKey1 = FTPD_ANONYMOUS_SECRET_W;
csSecretKey2 = GOPHERD_ANONYMOUS_SECRET_W;
break;
case IDS_SN_GOPHER:
nID1 = IDS_SN_WWW;
nID2 = IDS_SN_FTP;
csRegPath = GOPHER_REG_PATH;
csRegPath1 = WWW_REG_PATH;
csRegPath2 = FTP_REG_PATH;
csSecretKey = GOPHERD_ANONYMOUS_SECRET_W;
csSecretKey1 = W3_ANONYMOUS_SECRET_W;
csSecretKey2 = FTPD_ANONYMOUS_SECRET_W;
break;
}
CString csRegParam = csRegPath + _T("\\Parameters");;
CRegKey regParam( HKEY_LOCAL_MACHINE, csRegParam, KEY_ALL_ACCESS, NULL );
if ((HKEY)regParam) { // service is installed
// get its anonymous usr account name
CString csAnonymousUser;
regParam.QueryValue(_T("AnonymousUserName"), csAnonymousUser);
m_GuestName = csAnonymousUser;
TCHAR szSecret[LM20_PWLEN+1];
(*(theApp.m_pGetSecret))( csSecretKey, szSecret );
m_GuestPassword = szSecret;
return;
}
// init GuestName as IUSR_MachineName, and GuestPassword as ""
m_GuestName = theApp.m_GuestName;
m_GuestPassword = theApp.m_GuestPassword;
if (!(theApp.m_fCreateUser)) { // no CreateUser() action so far
// IsUserExist() will fail during NT upgrade, use theApp.m_fCreateUser to remember whether we created or not
if ( (!theApp.m_fUpgrade && !(*(theApp.m_pIsUserExist))(m_GuestName)) ||
( theApp.m_fUpgrade && !theApp.m_fInstalled) ) {
// create one
if ( !theApp.m_fBatch || m_GuestPassword.IsEmpty() ) {
TCHAR szPassword[LM20_PWLEN+1];
theApp.CreatePassword( szPassword );
m_GuestPassword = szPassword;
}
BOOL fCreateUser = FALSE;
(*(theApp.m_pCreateUser))(&fCreateUser, m_GuestName, m_GuestPassword );
if (!fCreateUser) {
// popup error msgbox: create user failed, please manually create m_GuestName later
}
theApp.m_fCreateUser = TRUE; // remember that we already tried the CreateUser()
return;
}
}
// check to see if service#1 is using this user account or not
CString csRegParam1 = csRegPath1 + _T("\\Parameters");
CRegKey regParam1( HKEY_LOCAL_MACHINE, csRegParam1, KEY_ALL_ACCESS, NULL );
if ((HKEY)regParam1) { // service#1 is installed
// get its anonymous usr account name
CString csAnonymousUser;
regParam1.QueryValue(_T("AnonymousUserName"), csAnonymousUser);
if (csAnonymousUser==m_GuestName) {
// it is using the same account, so retrieve/re-use its password
TCHAR szSecret[LM20_PWLEN+1];
(*(theApp.m_pGetSecret))( csSecretKey1, szSecret );
m_GuestPassword = szSecret;
return;
}
// it's using a different account, go check service#2
}
// check to see if service#2 is using this user account or not
CString csRegParam2 = csRegPath2 + _T("\\Parameters");
CRegKey regParam2( HKEY_LOCAL_MACHINE, csRegParam2, KEY_ALL_ACCESS, NULL );
if ((HKEY)regParam2) { // service#2 is installed
// get its anonymous user account name
CString csAnonymousUser;
regParam2.QueryValue(_T("AnonymousUserName"), csAnonymousUser);
if (csAnonymousUser==m_GuestName) {
// it is using the same account, so retrieve/re-use its password
TCHAR szSecret[LM20_PWLEN+1];
(*(theApp.m_pGetSecret))( csSecretKey2, szSecret );
m_GuestPassword = szSecret;
return;
}
// it's using a different account, need to create a new account
}
// delete account first
(*(theApp.m_pDeleteGuestUser))(m_GuestName );
TCHAR szPassword[LM20_PWLEN+1];
theApp.CreatePassword( szPassword );
m_GuestPassword = szPassword;
BOOL fCreateUser = FALSE;
(*(theApp.m_pCreateUser))(&fCreateUser, m_GuestName, m_GuestPassword );
if (!fCreateUser) {
// popup error msgbox: create user failed, please manually create m_GuestName later, set its passwd to ""
}
theApp.m_fCreateUser = TRUE; // remember that we already tried the CreateUser()
return;
}
INT FTP_OPTION::Install()
{
INT err = INSTALL_SUCCESSFULL;
do
{
CWnd *pMainWnd = AfxGetMainWnd();
// before we do anything, check for FTPSVC
CRegKey regFTPSVC( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\FTPSVC"));
if ( regFTPSVC != NULL )
{
DWORD dwStartType;
regFTPSVC.QueryValue(_T("start"), dwStartType );
if ( dwStartType != SERVICE_DISABLED )
{
do
{
// always disable the old FTPSVC service
if ( !theApp.m_fInstallFromSetup )
{
if ( !theApp.m_fBatch )
{
CString strWarning;
strWarning.LoadString( IDS_DISABLE_FTPSVC );
CString strLogo;
strLogo.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
if ( AfxGetMainWnd()->MessageBox( strWarning, strLogo, MB_YESNO ) == IDNO )
break;
}
}
// disable the FTPSVC service
(*m_pDisableService)( _T("FTPSVC"));
} while (FALSE);
}
}
if ( IsInstalled() )
GetInstallDirectory();
CreateLayerDirectory( m_vroot );
// copy file first
CopyFile( );
if ( theApp.m_fTerminate )
{
err = INSTALL_INTERRUPT;
break;
} else
{
CBillBoard BillBoard( IDS_INSTALL_FTP, AfxGetMainWnd() );
BillBoard.Create();
CString strDir = m_pMachine->strDirectory;
SetAnonymousAccountInfo(IDS_SN_FTP);
// setup ftp services
(*m_pSetupFTP)( m_pMachine->m_fUpgradeFrom1314, m_pMachine->m_MachineName, strDir,
m_vroot, m_vroot_name, m_GuestName, m_GuestPassword );
if ((*m_pGuestAccEnabled)())
{
// disable guest account
if ( !theApp.m_fBatch )
{
CString strWarning;
strWarning.LoadString( IDS_DISABLE_GUEST_ACCESS );
CString strLogo;
strLogo.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
if ( AfxGetMainWnd()->MessageBox( strWarning, strLogo, MB_YESNO ) == IDYES )
{
// disable guest account access
CRegKey regMSFTP( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\msftpsvc\\parameters"));
if ( regMSFTP != NULL )
{
DWORD dwValue = 0;
regMSFTP.SetValue( _T("AllowGuestAccess"), dwValue );
}
}
}
}
//
// Remove old ftp service if it exist
//
CRegKey regFTPSVC( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\FTPSVC\\Parameters"));
if ( NULL != (HKEY) regFTPSVC )
{
// if remove old FTP, migrate the old value to the new service
do
{
// migrate the following parameters :
// ConnectionTimeOut
// MaxConnections
CRegKey regMSFTPSVC( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\MSFTPSVC\\Parameters"));
if (( regFTPSVC != (HKEY)NULL ) &&
( regMSFTPSVC != (HKEY) NULL ))
{
DWORD dwValue;
if ( regFTPSVC.QueryValue( _T("ConnectionTimeout"), dwValue ) == 0 )
{
regMSFTPSVC.SetValue( _T("ConnectionTimeout"), dwValue );
}
if ( regFTPSVC.QueryValue( _T("MaxConnections"), dwValue ) == 0 )
{
regMSFTPSVC.SetValue( _T("MaxConnections"), dwValue );
}
CString strHomeDirectory;
if ( regFTPSVC.QueryValue( _T("HomeDirectory"), strHomeDirectory ) == 0 )
{
CRegKey regMSFTPSVCVR( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\MSFTPSVC\\Parameters\\Virtual Roots"));
if ( NULL != (HKEY) regMSFTPSVCVR )
{
regMSFTPSVCVR.SetValue( _T("/"), strHomeDirectory );
}
}
}
} while (FALSE);
}
if (( m_fNeedToRestart ) || ( !theApp.m_fInstallFromSetup ))
{
// because of reinstall, we need to restart the service
(*m_pINetStartService)( _T("MSFTPSVC"));
}
BillBoard.DestroyWindow();
}
(*m_pRemoveOldFTP)();
} while(FALSE);
return err;
}
INT FTP_OPTION::Remove()
{
INT err = INSTALL_SUCCESSFULL;
CWnd *pWnd = AfxGetMainWnd();
CBillBoard BillBoard( IDS_REMOVE_FTP, pWnd, TRUE );
BillBoard.Create();
if ((*m_pStopFTP)( pWnd->m_hWnd, m_pMachine->m_MachineName, theApp.m_fBatch? FALSE:TRUE ) == NERR_Success )
{
RemoveFiles();
(*m_pRemoveFTP)( m_pMachine->m_MachineName );
} else {
DoNotRemoveOption(IDS_SN_ADMIN);
DoNotRemoveOption(IDS_SN_INETSTP);
}
BillBoard.DestroyWindow();
return err;
}
CString FTP_OPTION::GetInstallDirectory()
{
CString strReturn = OPTION_STATE::GetInstallDirectory();
GetVRootValue( FTP_REG_PATH, _T("/"), m_vroot_name, m_vroot );
return(strReturn);
}
INT FTP_OPTION::RemoveFiles()
{
INT err = INSTALL_SUCCESSFULL;
GetInstallDirectory();
OPTION_STATE::RemoveFiles();
//RecRemoveEmptyDir((LPCTSTR)m_vroot);
return err;
}
void FTP_OPTION::GetBatchInstallMode( CString strInfName )
{
TCHAR buf[BUF_SIZE];
TCHAR szDefaultDir[BUF_SIZE];
CString csINetPub("C:\\InetPub");
GetDriveLetter(m_pMachine->strDirectory, &csINetPub);
sprintf( szDefaultDir, _T("%s%s"), csINetPub, FTP_DEFAULT_DIR );
OPTION_STATE::GetBatchInstallMode( strInfName );
if (theApp.m_strBatchSectionName.IsEmpty())
m_vroot = szDefaultDir;
else {
::GetPrivateProfileString( theApp.m_strBatchSectionName, _T("FTPRoot"), szDefaultDir, buf, BUF_SIZE, strInfName );
m_vroot = buf;
}
}
/////////////////////////////////////////////////////
// Gopher Service Option
/////////////////////////////////////////////////////
GOPHER_OPTION::GOPHER_OPTION( MACHINE *pMachine )
: OPTION_STATE( IDS_SN_GOPHER, pMachine )
{
TCHAR szDefaultDir[BUF_SIZE];
CString csINetPub("C:\\InetPub");
GetDriveLetter(m_pMachine->strDirectory, &csINetPub);
sprintf( szDefaultDir, _T("%s%s"), csINetPub, GOPHER_DEFAULT_DIR );
strName.LoadString( IDS_OPTION_GOPHER );
strDescription.LoadString( IDS_DES_GOPHER );
strServiceName.LoadString( IDS_SN_GOPHER );
strRegPath = GOPHER_REG_PATH;
strInstallDirPath = GOPHER_REG_PATH;
strInstallDirPath += _T("\\Parameters");
m_vroot = szDefaultDir;
m_vroot_name = _T("/");
m_fNeedToRestart = FALSE;
m_pSetupGopher = (P_SetupGopher)GetProcAddress( m_pMachine->m_WorkerDll, _T("SetupGopher"));
m_pRemoveGopher = (P_RemoveGopher)GetProcAddress( m_pMachine->m_WorkerDll, _T("RemoveGopher"));
m_pStopGopher = (P_StopGopher)GetProcAddress( m_pMachine->m_WorkerDll, _T("StopGopher"));
m_pINetStartService = (P_INetStartService)GetProcAddress( m_pMachine->m_WorkerDll, _T("INetStartService"));
}
INT GOPHER_OPTION::Install()
{
INT err = INSTALL_SUCCESSFULL;
if (theApp.m_fOldFTPInstalled && !IsInstalled())
return err;
do
{
if ( IsInstalled() )
GetInstallDirectory();
CreateLayerDirectory( m_vroot );
// copy file first
CopyFile();
if ( theApp.m_fTerminate )
{
err = INSTALL_INTERRUPT;
} else
{
CBillBoard BillBoard( IDS_INSTALL_GOPHER, AfxGetMainWnd() );
BillBoard.Create();
CString strDir = m_pMachine->strDirectory;
SetAnonymousAccountInfo(IDS_SN_GOPHER);
// setup gopher services
(*m_pSetupGopher)( m_pMachine->m_fUpgradeFrom1314, m_pMachine->m_MachineName, strDir,
m_vroot, m_vroot_name, m_GuestName, m_GuestPassword );
// check for domain name
CString nlsReg = _T("System\\CurrentControlSet\\Services\\Tcpip\\Parameters");
CRegKey regTcp( HKEY_LOCAL_MACHINE, nlsReg );
do
{
if ( NULL != (HKEY)regTcp )
{
CString strDhcpDomain;
CString strDomain;
regTcp.QueryValue( _T("DhcpDomain"), strDhcpDomain );
regTcp.QueryValue( _T("Domain"), strDomain );
if ( strDhcpDomain.IsEmpty() && strDomain.IsEmpty())
{
// popup an warning dialog
if ( !theApp.m_fBatch )
{
CString strWarning;
strWarning.LoadString( IDS_NEED_DOMAIN );
CString strLogo;
strLogo.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
AfxGetMainWnd()->MessageBox( strWarning, strLogo, MB_OK );
}
}
}
} while ( FALSE );
if (( m_fNeedToRestart ) || ( !theApp.m_fInstallFromSetup ))
{
// because of reinstall, we need to restart the service
(*m_pINetStartService)( _T("GOPHERSVC"));
}
BillBoard.DestroyWindow();
}
} while(FALSE);
return err;
}
INT GOPHER_OPTION::Remove()
{
INT err = INSTALL_SUCCESSFULL;
CWnd *pWnd = AfxGetMainWnd();
CBillBoard BillBoard( IDS_REMOVE_GOPHER, pWnd, TRUE );
BillBoard.Create();
if ((*m_pStopGopher)( pWnd->m_hWnd, m_pMachine->m_MachineName, theApp.m_fBatch?FALSE:TRUE ) == NERR_Success )
{
RemoveFiles();
(*m_pRemoveGopher)( m_pMachine->m_MachineName );
} else {
DoNotRemoveOption(IDS_SN_ADMIN);
DoNotRemoveOption(IDS_SN_INETSTP);
}
BillBoard.DestroyWindow();
return err;
}
CString GOPHER_OPTION::GetInstallDirectory()
{
CString strReturn = OPTION_STATE::GetInstallDirectory();
GetVRootValue( GOPHER_REG_PATH, _T("/"), m_vroot_name, m_vroot );
return(strReturn);
}
INT GOPHER_OPTION::RemoveFiles()
{
INT err = INSTALL_SUCCESSFULL;
GetInstallDirectory();
OPTION_STATE::RemoveFiles();
//RecRemoveEmptyDir((LPCTSTR)m_vroot);
return err;
}
void GOPHER_OPTION::GetBatchInstallMode( CString strInfName )
{
TCHAR buf[BUF_SIZE];
TCHAR szDefaultDir[BUF_SIZE];
CString csINetPub("C:\\InetPub");
GetDriveLetter(m_pMachine->strDirectory, &csINetPub);
sprintf( szDefaultDir, _T("%s%s"), csINetPub, GOPHER_DEFAULT_DIR );
OPTION_STATE::GetBatchInstallMode( strInfName );
if (theApp.m_strBatchSectionName.IsEmpty())
m_vroot = szDefaultDir;
else {
::GetPrivateProfileString( theApp.m_strBatchSectionName, _T("GopherRoot"), szDefaultDir, buf, BUF_SIZE, strInfName );
m_vroot = buf;
}
}
/////////////////////////////////////////////////////
// WWW Service Option
/////////////////////////////////////////////////////
WWW_OPTION::WWW_OPTION( MACHINE *pMachine )
: OPTION_STATE( IDS_SN_WWW, pMachine )
{
TCHAR szDefaultDir[BUF_SIZE];
CString csINetPub("C:\\InetPub");
GetDriveLetter(m_pMachine->strDirectory, &csINetPub);
sprintf( szDefaultDir, _T("%s%s"), csINetPub, WWW_DEFAULT_DIR );
strName.LoadString( IDS_OPTION_WWW );
strDescription.LoadString( IDS_DES_WWW );
strServiceName.LoadString( IDS_SN_WWW );
strRegPath = WWW_REG_PATH;
strInstallDirPath = WWW_REG_PATH;
strInstallDirPath += _T("\\Parameters");
m_vroot = szDefaultDir;
m_vroot_name = _T("/");
m_vScript = _T("");
m_vScript_name = _T("/Scripts");
m_vIISadmin = _T("");
m_vIISadmin_name = _T("/iisadmin");
m_fNeedToRestart = FALSE;
m_pSetupWWW = (P_SetupWWW)GetProcAddress( m_pMachine->m_WorkerDll, _T("SetupWWW"));
m_pRemoveWWW = (P_RemoveWWW)GetProcAddress( m_pMachine->m_WorkerDll, _T("RemoveWWW"));
m_pStopWWW = (P_StopWWW)GetProcAddress( m_pMachine->m_WorkerDll, _T("StopWWW"));
m_pDisableService = (P_DisableService)GetProcAddress( m_pMachine->m_WorkerDll, _T("DisableService"));
m_pINetStartService = (P_INetStartService)GetProcAddress( m_pMachine->m_WorkerDll, _T("INetStartService"));
}
void WWW_OPTION::GetBatchInstallMode( CString strInfName )
{
TCHAR buf[BUF_SIZE];
TCHAR szDefaultDir[BUF_SIZE];
CString csINetPub("C:\\InetPub");
GetDriveLetter(m_pMachine->strDirectory, &csINetPub);
sprintf( szDefaultDir, _T("%s%s"), csINetPub, WWW_DEFAULT_DIR );
OPTION_STATE::GetBatchInstallMode( strInfName );
if (theApp.m_strBatchSectionName.IsEmpty()) {
m_vroot = szDefaultDir;
m_Mode = DEFAULT_WWW_MODE;
m_NumUser = DEFAULT_WWW_USERCOUNT;
} else {
::GetPrivateProfileString( theApp.m_strBatchSectionName, _T("WWWRoot"), szDefaultDir, buf, BUF_SIZE, strInfName );
m_vroot = buf;
::GetPrivateProfileString( theApp.m_strBatchSectionName, _T("WWWMode"), DEFAULT_WWW_MODE, buf, BUF_SIZE, strInfName );
m_Mode = buf;
::GetPrivateProfileString( theApp.m_strBatchSectionName, _T("WWWUserCount"), DEFAULT_WWW_USERCOUNT, buf, BUF_SIZE, strInfName );
m_NumUser = buf;
}
}
CString WWW_OPTION::GetInstallDirectory()
{
CString strReturn = OPTION_STATE::GetInstallDirectory();
GetVRootValue( WWW_REG_PATH, _T("/"), m_vroot_name, m_vroot );
GetVRootValue( WWW_REG_PATH, _T("/Scripts"), m_vScript_name, m_vScript);
GetVRootValue( WWW_REG_PATH, _T("/iisadmin"), m_vIISadmin_name, m_vIISadmin);
return(strReturn);
}
INT WWW_OPTION::RemoveFiles()
{
INT err = INSTALL_SUCCESSFULL;
CString strDir = GetInstallDirectory();
if ( strDir != _T(""))
{
POSITION pos = FileList.GetHeadPosition();
while ( pos )
{
CFileInfo *pInfo = (CFileInfo *)FileList.GetAt( pos );
CString strFile;
if ( pInfo->m_fSystem )
{
strFile = m_pMachine->m_strDestinationPath;
} else if ( pInfo->m_fWinDir )
{
strFile = m_pMachine->GetWinDir();
} else if ( pInfo->m_fRootFile )
{
strFile = m_vroot;
} else
{
strFile = strDir;
}
if ( !pInfo->m_To.IsEmpty())
{
strFile += _T("\\");
strFile += pInfo->m_To;
}
CString csExFile = strFile;
strFile += _T("\\");
if ( pInfo->m_rename.IsEmpty() )
{
strFile += pInfo->m_strName;
} else
{
strFile += pInfo->m_rename;
}
if (_stricmp(pInfo->m_strName, _T("default0.htm")) == 0) {
csExFile += _T("\\default.htm");
CString csFrom = theApp.m_strSrcLocation;
if ( csFrom.Right(1) != _T("\\") )
csFrom += _T("\\");
if ( !pInfo->m_from.IsEmpty() )
csFrom += pInfo->m_from;
CString csFile0 = csFrom + _T("default0.htm");
if (FileComp((LPCTSTR)csExFile, (LPCTSTR)csFile0))
pInfo->m_fDontRemove = FALSE;
}
if (pInfo->m_fDontRemove == FALSE && (!pInfo->m_fRefCount ||
(pInfo->m_fRefCount && 0 == m_pMachine->FileDecRefCount(strFile))) )
DeleteFile(strFile);
FileList.GetNext( pos );
}
}
//RecRemoveEmptyDir((LPCTSTR)m_vroot);
//RecRemoveEmptyDir((LPCTSTR)m_vScript);
return err;
}
typedef BOOL (*T_pCPlSetup)( DWORD nArgs, LPSTR apszArgs[], LPSTR *ppszResult );
INT WWW_OPTION::Install()
{
INT err = INSTALL_SUCCESSFULL;
if (theApp.m_fOldFTPInstalled && !IsInstalled())
return err;
do
{
// before we do anything, check for HTTPS
CRegKey regHTTPS( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\HTTPS"));
if ( regHTTPS != NULL )
{
DWORD dwStartType;
regHTTPS.QueryValue(_T("start"), dwStartType );
if ( dwStartType != SERVICE_DISABLED )
{
do
{
if ( !theApp.m_fBatch )
{
CString strWarning;
strWarning.LoadString( IDS_DISABLE_HTTPS );
CString strLogo;
strLogo.LoadString(( theApp.TargetMachine.m_actualProductType == PT_WINNT )?IDS_WINNT_LOGO:IDS_LANMAN_LOGO );
if ( AfxGetMainWnd()->MessageBox( strWarning, strLogo, MB_YESNO ) == IDNO )
{
break;
}
}
// disable the HTTPS service
(*m_pDisableService)( _T("HTTPS"));
} while (FALSE);
}
}
if ( IsInstalled() )
{
GetInstallDirectory();
}
if (m_vScript.IsEmpty())
{
int cPos = m_vroot.ReverseFind(_T('\\'));
if ( cPos == (-1))
{
cPos = m_vroot.ReverseFind(_T(':'));
if ( cPos == (-1))
cPos = 0;
else
cPos++;
}
m_vScript = m_vroot.Left( cPos );
m_vScript += _T("\\scripts");
}
if (m_vIISadmin.IsEmpty())
{
m_vIISadmin = GetInstallDirectory();
m_vIISadmin += _T("\\iisadmin");
}
CreateLayerDirectory( m_vroot );
CreateLayerDirectory( m_vScript );
// make sure all the root files are copying to the vroot directory
POSITION pos = FileList.GetHeadPosition();
while ( pos != NULL )
{
CFileInfo *pInfo = (CFileInfo *) FileList.GetAt( pos );
if ( pInfo != NULL )
{
if ( pInfo->m_fRootFile )
{
pInfo->m_strDest = m_vroot;
}
FileList.GetNext( pos );
} else
break;
}
// copy file first
CopyFile( );
if ( theApp.m_fTerminate )
{
err = INSTALL_INTERRUPT;
DoNotInstallOption(IDS_SN_W3SAMP);
DoNotInstallOption(IDS_SN_HTMLA);
break;
} else
{
CBillBoard BillBoard( IDS_INSTALL_WWW, AfxGetMainWnd() );
BillBoard.Create();
CString strDir = m_pMachine->strDirectory;
SetAnonymousAccountInfo(IDS_SN_WWW);
// setup WWW services
(*m_pSetupWWW)( m_pMachine->m_fUpgradeFrom1314, m_pMachine->m_MachineName, strDir,
m_vroot, m_vroot_name,
m_vScript, m_vScript_name,
m_vIISadmin, m_vIISadmin_name,
m_GuestName, m_GuestPassword);
#ifdef NEVER
// set up the license stuff
TCHAR szService[100];
TCHAR szDisplayName[100];
TCHAR szFamilyDisplayName[100];
TCHAR szRoutine[100];
TCHAR *szResult;
CString strDisplayName;
strDisplayName.LoadString( IDS_WWW_DISPLAYNAME );
lstrcpy( szService, _T("W3Svc"));
lstrcpy( szDisplayName, strDisplayName );
lstrcpy( szFamilyDisplayName, strDisplayName );
do
{
HINSTANCE hLiccpa = LoadLibrary(_T("liccpa.cpl"));
if ( hLiccpa == NULL )
break;
T_pCPlSetup pCPlSetup;
pCPlSetup = (T_pCPlSetup)GetProcAddress( hLiccpa, _T("CPlSetup"));
LPSTR apszArgs[10];
if ( theApp.m_fBatch )
{
lstrcpy( szRoutine, _T("UNATTENDED"));
apszArgs[0]=szRoutine;
apszArgs[1]=szService;
apszArgs[2]=szFamilyDisplayName;
apszArgs[3]=szDisplayName;
TCHAR szMode[100];
TCHAR szNumUser[100];
lstrcpy( szMode, m_Mode );
lstrcpy( szNumUser, m_NumUser );
apszArgs[4]=szMode;
apszArgs[5]=szNumUser;
(*pCPlSetup)( 6, apszArgs, &szResult );
} else
{
lstrcpy( szRoutine, _T("FULLSETUPNOEXIT"));
apszArgs[0]=szRoutine;
CWnd *pMainWnd = AfxGetMainWnd();
TCHAR szHwnd[100];
wsprintf( szHwnd,_T("%x"), pMainWnd->m_hWnd );
apszArgs[1]=szHwnd;
apszArgs[2]=szService;
apszArgs[3]=szFamilyDisplayName;
apszArgs[4]=szDisplayName;
(*pCPlSetup)( 5, apszArgs, &szResult );
}
} while (FALSE);
#endif
if (( m_fNeedToRestart ) || ( !theApp.m_fInstallFromSetup ))
{
// because of reinstall, we need to restart the service
(*m_pINetStartService)( _T("W3SVC"));
}
BillBoard.DestroyWindow();
}
} while(FALSE);
return err;
}
INT WWW_OPTION::Remove()
{
INT err = INSTALL_SUCCESSFULL;
CWnd *pWnd = AfxGetMainWnd();
CBillBoard BillBoard( IDS_REMOVE_WWW, pWnd, TRUE );
BillBoard.Create();
if ((*m_pStopWWW)( pWnd->m_hWnd, m_pMachine->m_MachineName, theApp.m_fBatch?FALSE:TRUE ) == NERR_Success )
{
// before we remove all the files, we need to run setkey -d
CString strSetKey = GetInstallDirectory();
strSetKey += _T("\\setkey.exe");
theApp.RunProgram( (LPCSTR)strSetKey, _T(" -d"));
RemoveFiles();
(*m_pRemoveWWW)( m_pMachine->m_MachineName );
} else {
DoNotRemoveOption(IDS_SN_ADMIN);
DoNotRemoveOption(IDS_SN_INETSTP);
}
BillBoard.DestroyWindow();
return err;
}