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

345 lines
11 KiB

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2001 Microsoft Corporation
//
// Module Name:
// CTaskUpgradeWin2k.cpp
//
// Header File:
// CTaskUpgradeWin2k.h
//
// Description:
// Implementation file for the CTaskUpgradeWindows2000 class.
//
// Maintained By:
// David Potter (DavidP) 07-SEP-2001
// Vij Vasu (Vvasu) 18-APR-2000
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
// Precompiled header for this DLL.
#include "Pch.h"
// The header file for this module.
#include "CTaskUpgradeWin2k.h"
//////////////////////////////////////////////////////////////////////////////
// Macro Definitions
//////////////////////////////////////////////////////////////////////////////
// Needed for tracing.
DEFINE_THISCLASS( "CTaskUpgradeWindows2000" )
/////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskUpgradeWindows2000::CTaskUpgradeWindows2000
//
// Description:
// Constructor of the CTaskUpgradeWindows2000 class.
//
// Arguments:
// const CClusOCMApp & rAppIn
// Reference to the CClusOCMApp object that is hosting this task.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CTaskUpgradeWindows2000::CTaskUpgradeWindows2000( const CClusOCMApp & rAppIn )
: BaseClass( rAppIn )
{
TraceFunc( "" );
TraceFuncExit();
} //*** CTaskUpgradeWindows2000::CTaskUpgradeWindows2000
/////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskUpgradeWindows2000::~CTaskUpgradeWindows2000
//
// Description:
// Destructor of the CTaskUpgradeWindows2000 class.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CTaskUpgradeWindows2000::~CTaskUpgradeWindows2000( void )
{
TraceFunc( "" );
TraceFuncExit();
} //*** CTaskUpgradeWindows2000::~CTaskUpgradeWindows2000
/////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskUpgradeWindows2000::DwOcQueueFileOps
//
// Description:
// This function handles the OC_QUEUE_FILE_OPS messages from the Optional
// Components Manager. It installs the files needed for an upgrade from
// Windows 2000.
//
// Arguments:
// HSPFILEQ hSetupFileQueueIn
// Handle to the file queue to operate upon.
//
// Return Value:
// NO_ERROR if all went well.
// Other Win32 error codes on failure.
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD
CTaskUpgradeWindows2000::DwOcQueueFileOps( HSPFILEQ hSetupFileQueueIn )
{
TraceFunc( "" );
LogMsg( "Entering " __FUNCTION__ "()" );
DWORD dwReturnValue = NO_ERROR;
// Do different things based on whether this node is already part of a cluster or not.
if ( RGetApp().CisGetClusterInstallState() == eClusterInstallStateFilesCopied )
{
LogMsg( "The cluster binaries are installed, but this node is not part of a cluster." );
// The base class helper function does everything that we need to do here.
// So, just call it.
dwReturnValue = TW32( BaseClass::DwOcQueueFileOps( hSetupFileQueueIn, INF_SECTION_WIN2K_UPGRADE_UNCLUSTERED_NODE ) );
} // if: the node is not part of a cluster
else
{
LogMsg( "This node is part of a cluster." );
// The base class helper function does everything that we need to do here.
// So, just call it.
dwReturnValue = TW32( BaseClass::DwOcQueueFileOps( hSetupFileQueueIn, INF_SECTION_WIN2K_UPGRADE ) );
} // else: the node is part of a cluster
LogMsg( "Return Value is %#x.", dwReturnValue );
RETURN( dwReturnValue );
} //*** CTaskUpgradeWindows2000::DwOcQueueFileOps
/////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskUpgradeWindows2000::DwOcCompleteInstallation
//
// Description:
// This function handles the OC_COMPLETE_INSTALLATION messages from the
// Optional Components Manager during an upgrade from Windows 2000.
//
// Registry operations, COM component registrations, creation of servies
// etc. are performed in this function.
//
// Arguments:
// None.
//
// Return Value:
// NO_ERROR if all went well.
// Other Win32 error codes on failure.
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD
CTaskUpgradeWindows2000::DwOcCompleteInstallation( void )
{
TraceFunc( "" );
LogMsg( "Entering " __FUNCTION__ "()" );
DWORD dwReturnValue = NO_ERROR;
// Do different things based on whether this node is already part of a cluster or not.
if ( RGetApp().CisGetClusterInstallState() == eClusterInstallStateFilesCopied )
{
LogMsg( "The cluster binaries are installed, but this node is not part of a cluster." );
// The base class helper function does everything that we need to do here.
// So, just call it.
dwReturnValue = TW32( BaseClass::DwOcCompleteInstallation( INF_SECTION_WIN2K_UPGRADE_UNCLUSTERED_NODE ) );
} // if: the node is not part of a cluster
else
{
LogMsg( "This node is part of a cluster." );
// The base class helper function does everything that we need to do here.
// So, just call it.
dwReturnValue = TW32( BaseClass::DwOcCompleteInstallation( INF_SECTION_WIN2K_UPGRADE ) );
} // else: the node is part of a cluster
LogMsg( "Return Value is %#x.", dwReturnValue );
RETURN( dwReturnValue );
} //*** CTaskUpgradeWindows2000::DwOcCompleteInstallation
/////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskUpgradeWindows2000::DwOcCleanup
//
// Description:
// This function handles the OC_CLEANUP messages from the
// Optional Components Manager during an upgrade from Windows 2000.
//
// If an error has previously occurred during this task, cleanup operations
// are performed. Otherwise nothing is done by this function.
//
// Arguments:
// None.
//
// Return Value:
// NO_ERROR if all went well.
// Other Win32 error codes on failure.
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD
CTaskUpgradeWindows2000::DwOcCleanup( void )
{
TraceFunc( "" );
LogMsg( "Entering " __FUNCTION__ "()" );
DWORD dwReturnValue = NO_ERROR;
// Do different things based on whether this node is already part of a cluster or not.
if ( RGetApp().CisGetClusterInstallState() == eClusterInstallStateFilesCopied )
{
LogMsg( "The cluster binaries are installed, but this node is not part of a cluster." );
// The base class helper function does everything that we need to do here.
// So, just call it.
dwReturnValue = TW32( BaseClass::DwOcCleanup( INF_SECTION_WIN2K_UPGRADE_UNCLUSTERED_NODE_CLEANUP ) );
} // if: the node is not part of a cluster
else
{
LogMsg( "This node is part of a cluster." );
// The base class helper function does everything that we need to do here.
// So, just call it.
dwReturnValue = TW32( BaseClass::DwOcCleanup( INF_SECTION_WIN2K_UPGRADE_CLEANUP ) );
} // else: the node is part of a cluster
LogMsg( "Return Value is %#x.", dwReturnValue );
RETURN( dwReturnValue );
} //*** CTaskUpgradeWindows2000::DwOcCleanup
/////////////////////////////////////////////////////////////////////////////
//++
//
// CTaskUpgradeWindows2000::DwSetDirectoryIds
//
// Description:
// This function maps ids specified in the INF file to directories.
// The behavior of this function is different for different cluster
// installation states.
//
// If the cluster binaries are installed, but the node is not part
// of a cluster, the cluster installation directory is set to the
// default value.
//
// If the node is already a part of a cluster, the cluster installation
// directory is got from the service control manager, since it is possible
// the the cluster binaries are installed in a non-default location if
// this node was upgraded from NT4 previously.
//
// Arguments:
// None.
//
// Return Value:
// NO_ERROR if all went well.
// Other Win32 error codes on failure.
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD
CTaskUpgradeWindows2000::DwSetDirectoryIds( void )
{
TraceFunc( "" );
LogMsg( "Entering " __FUNCTION__ "()" );
DWORD dwReturnValue = NO_ERROR;
const WCHAR * pcszInstallDir = NULL;
if ( RGetApp().CisGetClusterInstallState() == eClusterInstallStateFilesCopied )
{
// If the cluster binaries have been install previously, and the node is
// not part of a cluster, the binaries have to be installed in the default
// location. This is because the binaries were always installed in the
// default location in Win2k and it is not possible to be in this state
// on a Win2k node by upgrading from NT4.
// The base class helper function does everything that we need to do here.
// So, just call it.
LogMsg( "This node is not part of a cluster. Upgrading files in the default directory." );
dwReturnValue = TW32( BaseClass::DwSetDirectoryIds() );
// We are done.
goto Cleanup;
} // if: the node is not part of a cluster
// If we are here, the this node is already a part of a cluster. So, get the
// installation directory from SCM.
LogMsg( "This node is part of a cluster. Trying to determine the installation directory." );
// Do not free the pointer returned by this call.
dwReturnValue = TW32( DwGetClusterServiceDirectory( pcszInstallDir ) );
if ( dwReturnValue != NO_ERROR )
{
LogMsg( "Error %#x occurred trying to determine the directory in which the cluster binaries are installed.", dwReturnValue );
goto Cleanup;
} // if: we could not get the cluster service installation directory
LogMsg( "The cluster binaries are installed in the directory '%ws'.", pcszInstallDir );
// Create the mapping between the directory id and the path
if ( SetupSetDirectoryId(
RGetApp().RsicGetSetupInitComponent().ComponentInfHandle
, CLUSTER_DEFAULT_INSTALL_DIRID
, pcszInstallDir
)
== FALSE
)
{
dwReturnValue = TW32( GetLastError() );
LogMsg( "Error %#x occurred trying set the cluster install directory id.", dwReturnValue );
goto Cleanup;
} // if: SetupSetDirectoryId() failed
LogMsg( "The id %d maps to '%ws'.", CLUSTER_DEFAULT_INSTALL_DIRID, pcszInstallDir );
Cleanup:
LogMsg( "Return Value is %#x.", dwReturnValue );
RETURN( dwReturnValue );
} //*** CTaskUpgradeWindows2000::DwSetDirectoryIds