mirror of https://github.com/lianthony/NT4.0
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.
502 lines
12 KiB
502 lines
12 KiB
#include "stdafx.h"
|
|
#include "import.h"
|
|
#include "registry.h"
|
|
#include "machine.h"
|
|
#include "base.h"
|
|
|
|
#include "lm.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
OPTION_STATE * FindOption( OPTIONS_LIST &List, INT nOption )
|
|
{
|
|
OPTION_STATE *pReturn = NULL;
|
|
|
|
if ( List.GetCount() != 0 )
|
|
{
|
|
POSITION pos = List.GetHeadPosition();
|
|
OPTION_STATE *pOption;
|
|
|
|
while ( pos )
|
|
{
|
|
pOption = (OPTION_STATE*)List.GetAt( pos );
|
|
if ( pOption->nID == nOption )
|
|
{
|
|
pReturn = pOption;
|
|
break;
|
|
}
|
|
List.GetNext( pos );
|
|
}
|
|
}
|
|
return(pReturn);
|
|
}
|
|
|
|
void MACHINE::ResetOptionState()
|
|
{
|
|
POSITION pos = m_OptionsList.GetHeadPosition();
|
|
OPTION_STATE *pOption;
|
|
|
|
while ( pos )
|
|
{
|
|
pOption = (OPTION_STATE*)m_OptionsList.GetAt( pos );
|
|
pOption->ResetOption( );
|
|
m_OptionsList.GetNext( pos );
|
|
}
|
|
}
|
|
|
|
void MACHINE::GetInstalledList( OPTIONS_LIST &List )
|
|
{
|
|
m_fReinstall = TRUE;
|
|
if ( List.GetCount() != 0 )
|
|
{
|
|
POSITION pos = List.GetHeadPosition();
|
|
OPTION_STATE *pOption;
|
|
|
|
while ( pos )
|
|
{
|
|
pOption = (OPTION_STATE*)m_OptionsList.GetAt( pos );
|
|
|
|
if ( pOption->iState == STATE_INSTALLED )
|
|
arReinstallList.Add( pOption->nID );
|
|
List.GetNext( pos );
|
|
}
|
|
}
|
|
}
|
|
|
|
void MACHINE::Reinstall( OPTIONS_LIST &List )
|
|
{
|
|
ResetOptionState();
|
|
m_fReinstall = TRUE;
|
|
OPTION_STATE *pAdmin = (OPTION_STATE*)FindOption( List, IDS_SN_ADMIN );
|
|
OPTION_STATE *pW3SAMP = (OPTION_STATE*)FindOption( List, IDS_SN_W3SAMP );
|
|
OPTION_STATE *pHTMLA = (OPTION_STATE*)FindOption( List, IDS_SN_HTMLA );
|
|
|
|
OPTION_STATE *pOption;
|
|
if ( List.GetCount() != 0 )
|
|
{
|
|
POSITION pos = List.GetHeadPosition();
|
|
while ( pos )
|
|
{
|
|
pOption = (OPTION_STATE*)m_OptionsList.GetAt( pos );
|
|
|
|
// upgrade special case for FTP
|
|
if ( pOption->nID == IDS_SN_FTP )
|
|
{
|
|
CRegKey regFTPSVC( HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Services\\FTPSVC"));
|
|
if ( NULL != (HKEY)regFTPSVC )
|
|
{
|
|
pOption->iState = STATE_INSTALLED;
|
|
|
|
OPTION_STATE *pSetup = (OPTION_STATE*)FindOption( List, IDS_SN_INETSTP );
|
|
if ( pSetup->iAction != ACTION_INSTALL )
|
|
{
|
|
pSetup->iAction = ACTION_INSTALL;
|
|
pSetup->iState = STATE_NOT_INSTALLED;
|
|
}
|
|
|
|
// we also need to install the inetmgr admin app
|
|
OPTION_STATE *pAdmin = (OPTION_STATE*)FindOption( List, IDS_SN_ADMIN );
|
|
if ( pAdmin != NULL )
|
|
{
|
|
if ( pAdmin->iAction != ACTION_INSTALL )
|
|
{
|
|
pAdmin->iAction = ACTION_INSTALL;
|
|
pAdmin->iState = STATE_NOT_INSTALLED;
|
|
}
|
|
}
|
|
}
|
|
} // ftp
|
|
|
|
if ( pOption->iState == STATE_INSTALLED )
|
|
{
|
|
pOption->iAction = ACTION_INSTALL;
|
|
pOption->iState = STATE_NOT_INSTALLED;
|
|
|
|
// if one service was installed previously, we'll install InetMgr as well
|
|
if ( pOption->nID == IDS_SN_FTP || pOption->nID == IDS_SN_WWW || pOption->nID == IDS_SN_GOPHER ) {
|
|
if (pAdmin && pAdmin->iAction != ACTION_INSTALL) {
|
|
pAdmin->iAction = ACTION_INSTALL;
|
|
pAdmin->iState = STATE_NOT_INSTALLED;
|
|
}
|
|
}
|
|
|
|
// if it's upgrade from 1314, and WWW_OPTION was installed previously
|
|
// then install W3SAMP and HTMLA as well.
|
|
if ( pOption->nID == IDS_SN_WWW && m_fUpgradeFrom1314 ) {
|
|
if (pW3SAMP && pW3SAMP->iAction != ACTION_INSTALL) {
|
|
pW3SAMP->iAction = ACTION_INSTALL;
|
|
pW3SAMP->iState = STATE_NOT_INSTALLED;
|
|
}
|
|
if (pHTMLA && pHTMLA->iAction != ACTION_INSTALL) {
|
|
pHTMLA->iAction = ACTION_INSTALL;
|
|
pHTMLA->iState = STATE_NOT_INSTALLED;
|
|
}
|
|
}
|
|
}
|
|
|
|
List.GetNext( pos );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void MACHINE::SetMaintenance()
|
|
{
|
|
ResetOptionState();
|
|
}
|
|
|
|
INT Win32InstallOptions[] = {
|
|
//IDS_SN_ADMIN,
|
|
IDS_SN_INETSTP,
|
|
IDS_SN_MOSAIC,
|
|
IDS_SN_SMALLPROX,
|
|
#ifdef BETA1
|
|
IDS_SN_WEB_BROWSER,
|
|
IDS_SN_CLIENT_ADMIN_TOOLS,
|
|
#endif
|
|
0
|
|
};
|
|
|
|
void MACHINE::DisableOption( INT nID )
|
|
{
|
|
OPTION_STATE *pState = FindOption( m_OptionsList, nID );
|
|
if ( pState )
|
|
{
|
|
pState->fVisible = FALSE;
|
|
pState->iState = STATE_NOT_INSTALLED;
|
|
pState->iAction = ACTION_DO_NOTHING;
|
|
}
|
|
}
|
|
|
|
void MACHINE::SetNewInstallation()
|
|
{
|
|
ResetOptionState();
|
|
POSITION pos = m_OptionsList.GetHeadPosition();
|
|
OPTION_STATE *pOption;
|
|
|
|
while ( pos )
|
|
{
|
|
pOption = (OPTION_STATE*)m_OptionsList.GetAt( pos );
|
|
if (pOption->nID != IDS_SN_HTMLA)
|
|
pOption->SetAction( ACTION_INSTALL );
|
|
m_OptionsList.GetNext( pos );
|
|
}
|
|
}
|
|
|
|
MACHINE::MACHINE()
|
|
{
|
|
m_err = 0;
|
|
m_fLocal = TRUE;
|
|
m_fReinstall = FALSE;
|
|
m_fOSNT = FALSE;
|
|
m_fUpgradeFrom67 = FALSE;
|
|
m_fUpgradeFrom1314 = FALSE;
|
|
m_fAlreadyInstall = FALSE;
|
|
m_InstallMode = INSTALL_ALL;
|
|
GetProductType();
|
|
arReinstallList.SetSize(20);
|
|
|
|
GetMachineOS();
|
|
}
|
|
|
|
BOOL MACHINE::LoadDLL()
|
|
{
|
|
BOOL fReturn = TRUE;
|
|
|
|
if (((m_WorkerDll = LoadLibraryEx( _T("inetstp.dll"), NULL, 0 )) == NULL ) ||
|
|
(( m_pGetNTSysPath = (P_GetNTSysPath)GetProcAddress( m_WorkerDll, _T("GetNTSysPath"))) == NULL ) ||
|
|
(( m_pGetWIN95SysPath = (P_GetWIN95SysPath)GetProcAddress( m_WorkerDll, _T("GetWIN95SysPath"))) == NULL ) ||
|
|
(( m_pGetMachineOS = (P_GetMachineOS)GetProcAddress( m_WorkerDll, _T("GetMachineOS"))) == NULL ) ||
|
|
(( m_pIsInstalled = (P_IsInstalled)GetProcAddress( m_WorkerDll, _T("IsInstalled"))) == NULL ) ||
|
|
(( m_pGetMachineType = (P_GetMachineType)GetProcAddress( m_WorkerDll, _T("GetMachineType"))) == NULL ))
|
|
{
|
|
fReturn = FALSE;
|
|
}
|
|
return(fReturn);
|
|
}
|
|
|
|
MACHINE::~MACHINE()
|
|
{
|
|
if ( m_WorkerDll != NULL )
|
|
{
|
|
FreeLibrary( m_WorkerDll );
|
|
}
|
|
POSITION pos = m_OptionsList.GetHeadPosition();
|
|
OPTION_STATE *pOption;
|
|
|
|
while ( pos != NULL )
|
|
{
|
|
pOption = (OPTION_STATE*)m_OptionsList.GetAt( pos );
|
|
delete pOption;
|
|
m_OptionsList.GetNext( pos );
|
|
}
|
|
|
|
m_OptionsList.RemoveAll();
|
|
}
|
|
|
|
enum PRODUCT_TYPE MACHINE::GetProductType()
|
|
{
|
|
enum PRODUCT_TYPE PType = PT_WINNT;
|
|
if ( m_fOSNT )
|
|
{
|
|
CString strProductPath = PRODUCT_REG_PATH;
|
|
CString strProductType;
|
|
|
|
CRegKey regProductPath( HKEY_LOCAL_MACHINE, strProductPath, KEY_ALL_ACCESS,
|
|
m_MachineName );
|
|
|
|
if ( NULL != (HKEY)regProductPath )
|
|
{
|
|
regProductPath.QueryValue( SZ_PRODUCTTYPE, strProductType );
|
|
strProductType.MakeUpper();
|
|
|
|
if ( strProductType == "WINNT" )
|
|
{
|
|
#ifdef NoServiceOnWorkstation
|
|
PType = PT_WINNT;
|
|
#else
|
|
PType = PT_NTAS;
|
|
#endif
|
|
m_actualProductType = PT_WINNT;
|
|
} else
|
|
{
|
|
PType = PT_NTAS;
|
|
m_actualProductType = PT_NTAS;
|
|
}
|
|
}
|
|
}
|
|
m_ProductType = PType;
|
|
return(PType);
|
|
}
|
|
|
|
//
|
|
// Get the local machine name
|
|
//
|
|
|
|
void MACHINE::GetLocalMachineName()
|
|
{
|
|
TCHAR buf[ CNLEN + 10 ];
|
|
DWORD dwLen = CNLEN + 10;
|
|
|
|
if ( GetComputerName( buf, &dwLen ))
|
|
{
|
|
m_MachineName = buf;
|
|
|
|
if ( m_MachineName[0] != _T('\\') )
|
|
{
|
|
CString strTmp = m_MachineName;
|
|
|
|
m_MachineName = _T("\\\\");
|
|
m_MachineName += strTmp;
|
|
}
|
|
} else
|
|
{
|
|
m_MachineName = _T("");
|
|
}
|
|
}
|
|
|
|
//
|
|
// Set the foucs machine
|
|
//
|
|
|
|
#ifdef BETA1
|
|
//
|
|
// Set the destination option path
|
|
//
|
|
|
|
void MACHINE::SetOptionPath()
|
|
{
|
|
POSITION pos = m_OptionsList.GetHeadPosition();
|
|
OPTION_STATE *pOption;
|
|
|
|
while ( pos )
|
|
{
|
|
pOption = (OPTION_STATE*)m_OptionsList.GetAt( pos );
|
|
pOption->SetDirectory( m_strDestinationPath );
|
|
m_OptionsList.GetNext( pos );
|
|
}
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// Get the machine type
|
|
//
|
|
|
|
INT MACHINE::GetMachineOS()
|
|
{
|
|
INT err = 0;
|
|
if ( m_fLocal )
|
|
{
|
|
// see whether we install it from chicago or nt
|
|
OSVERSIONINFO VerInfo;
|
|
|
|
VerInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
|
|
GetVersionEx( &VerInfo );
|
|
m_fOSNT = ( VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT );
|
|
|
|
} else
|
|
{
|
|
DWORD OSType = (*m_pGetMachineOS)( m_MachineName );
|
|
if ( OSType == SV_TYPE_NT )
|
|
m_fOSNT = TRUE ;
|
|
else {
|
|
m_fOSNT = FALSE;
|
|
err = m_err = IDS_UNKNOWN_OS_TYPE_NTS;
|
|
}
|
|
}
|
|
return err;
|
|
}
|
|
|
|
//
|
|
// Get the system path of the machine
|
|
//
|
|
|
|
INT MACHINE::GetSysPath()
|
|
{
|
|
INT err = 0;
|
|
TCHAR buf[BUF_SIZE];
|
|
INT iSize = BUF_SIZE;
|
|
|
|
// get the machine path
|
|
if ( m_fLocal )
|
|
{
|
|
// get the environment variable
|
|
GetSystemDirectory( buf, BUF_SIZE );
|
|
} else
|
|
{
|
|
// get it from the registry
|
|
(*m_pGetNTSysPath)( m_MachineName, buf, &iSize );
|
|
}
|
|
|
|
if ( m_fLocal )
|
|
{
|
|
// just use the path
|
|
m_strDestinationPath = buf;
|
|
} else
|
|
{
|
|
// add the machine name
|
|
if ( buf[1] == _T(':'))
|
|
{
|
|
// replace it with "$"
|
|
buf[1]=_T('$');
|
|
} else
|
|
{
|
|
err = m_err = IDS_UNKNOWN_OS_TYPE_NTS ;
|
|
// something very wrong
|
|
}
|
|
m_strDestinationPath = m_MachineName;
|
|
m_strDestinationPath += _T('\\');
|
|
m_strDestinationPath += buf;
|
|
}
|
|
return err;
|
|
}
|
|
|
|
CString MACHINE::GetWinDir()
|
|
{
|
|
TCHAR buf[BUF_SIZE];
|
|
INT iSize = BUF_SIZE;
|
|
CString strReturn;
|
|
|
|
// get the machine path
|
|
if ( m_fLocal )
|
|
{
|
|
// get the environment variable
|
|
GetWindowsDirectory( buf, BUF_SIZE );
|
|
} else
|
|
{
|
|
// get it from the registry
|
|
(*m_pGetNTSysPath)( m_MachineName, buf, &iSize );
|
|
lstrcat( buf, _T("\\.."));
|
|
}
|
|
|
|
strReturn = buf;
|
|
|
|
return strReturn;
|
|
}
|
|
|
|
//
|
|
// Get the current machine type, check whether it is intel, ppc, mips or alpha
|
|
//
|
|
|
|
INT MACHINE::GetMachineType()
|
|
{
|
|
INT err = 0;
|
|
|
|
m_MachineType = (enum MACHINE_TYPE)(*m_pGetMachineType)( m_MachineName);
|
|
if ( m_MachineType == (-1))
|
|
{
|
|
err = m_err = IDS_CANNOT_DET_MACHINE_TYPE ;
|
|
}
|
|
return err;
|
|
}
|
|
|
|
INT MACHINE::FileIncRefCount( CString strName )
|
|
{
|
|
DWORD dwCount = 0;
|
|
|
|
CRegKey regPath( SHARE_DLL_REG_PATH, HKEY_LOCAL_MACHINE );
|
|
|
|
if ( NULL != (HKEY) regPath )
|
|
{
|
|
regPath.QueryValue( strName, dwCount );
|
|
dwCount ++;
|
|
regPath.SetValue( strName, dwCount );
|
|
}
|
|
|
|
return(dwCount);
|
|
}
|
|
|
|
INT MACHINE::FileDecRefCount( CString strName )
|
|
{
|
|
DWORD dwCount = 0;
|
|
|
|
CRegKey regPath( HKEY_LOCAL_MACHINE, SHARE_DLL_REG_PATH, KEY_ALL_ACCESS, m_MachineName );
|
|
|
|
if ( NULL != (HKEY) regPath )
|
|
{
|
|
if (regPath.QueryValue( strName, dwCount ) == 0) { //value exists
|
|
dwCount --;
|
|
if (dwCount > 0)
|
|
regPath.SetValue( strName, dwCount );
|
|
else {
|
|
dwCount = 0;
|
|
::RegDeleteValue((HKEY)regPath, (LPCTSTR)strName);
|
|
}
|
|
}
|
|
}
|
|
|
|
return(dwCount);
|
|
}
|
|
|
|
void MACHINE::ChangeDir( CString strDir )
|
|
{
|
|
strDirectory = strDir;
|
|
}
|
|
|
|
BOOL MACHINE::IsNewInstall()
|
|
{
|
|
BOOL fReturn = FALSE;
|
|
|
|
OPTION_STATE *pOption = FindOption( m_OptionsList, IDS_SN_INETSTP );
|
|
ASSERT( pOption != NULL );
|
|
if ( pOption->iState == STATE_NOT_INSTALLED )
|
|
fReturn = TRUE;
|
|
|
|
return(fReturn);
|
|
}
|
|
|
|
// we support (NT 1345+)
|
|
BOOL MACHINE::IsSupportVersion()
|
|
{
|
|
DWORD dwCurVer;
|
|
|
|
dwCurVer = (GetVersion() & 0x7fff0000) >> 16;
|
|
|
|
if (dwCurVer < 1345)
|
|
return(FALSE);
|
|
else
|
|
return(TRUE);
|
|
}
|