windows-nt/Source/XPSP1/NT/base/cluster/clusrtl/inststat.cpp
2020-09-26 16:20:57 +08:00

206 lines
6.2 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1999 Microsoft Corporation
//
// Module Name:
// InstallState.cpp
//
// Desription:
// The function(s) in this file are used to interrogate the state of the
// Clustering Services installation.
//
// Author:
// C. Brent Thomas (a-brentt) 6 May 1998
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include <clusrtlp.h>
#include <stdlib.h>
#include "clusrtl.h"
/////////////////////////////////////////////////////////////////////////////
//++
//
// ClRtlGetClusterInstallState
//
// Routine Description:
// This function retrieves an indicator of the state of the Cluster Server
// installation.
//
// Arguments:
// pszNodeName - Name of the node to check, or NULL for the local machine.
// peState - State value returned from this function:
// eClusterInstallStateUnknown - indicates that the state of the Cluster
// Server installation could not be determined.
// eClusterInstallStateFilesCopied - indicates that clusocm.dll has prevoiusly,
// successfully copied the Cluster Server files.
// eClusterInstallStateConfigured - indicates that the Cluster Server has previously
// been configured successfully.
// See cluster\inc\clusrtl.h for the definition of eClusterInstallState.
//
// Return Value:
// Any error codes returned from RegConnectRegistryW, RegOpenKeyExW, or RegQueryValueExW.
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD ClRtlGetClusterInstallState(
IN LPCWSTR pszNodeName,
OUT eClusterInstallState * peState
)
{
HKEY hKey = NULL;
HKEY hParentKey = HKEY_LOCAL_MACHINE;
DWORD dwStatus; // returned by registry API functions
DWORD dwClusterInstallState;
DWORD dwValueType;
DWORD dwDataBufferSize = sizeof( DWORD );
*peState = eClusterInstallStateUnknown;
// Connect to a remote computer if specified.
if ( pszNodeName != NULL )
{
dwStatus = RegConnectRegistryW( pszNodeName, HKEY_LOCAL_MACHINE, &hParentKey );
if ( dwStatus != ERROR_SUCCESS )
{
goto FnExit;
} // if: error connecting to remote registry
} // if: node name specified
// Read the registry key that indicates whether cluster files are installed.
dwStatus = RegOpenKeyExW( hParentKey,
L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Cluster Server",
0, // reserved
KEY_READ,
&hKey );
// Was the registry key opened successfully ?
if ( dwStatus != ERROR_SUCCESS )
{
if ( dwStatus == ERROR_FILE_NOT_FOUND )
{
dwStatus = ERROR_SUCCESS;
}
goto FnExit;
}
// Read the entry.
dwStatus = RegQueryValueExW( hKey,
L"ClusterInstallationState",
0, // reserved
&dwValueType,
(LPBYTE) &dwClusterInstallState,
&dwDataBufferSize );
// Was the value read successfully ?
if ( dwStatus != ERROR_SUCCESS )
{
if ( dwStatus == ERROR_FILE_NOT_FOUND )
{
dwStatus = ERROR_SUCCESS;
}
goto FnExit;
}
if ( dwValueType == REG_DWORD )
{
*peState = (eClusterInstallState) dwClusterInstallState;
}
FnExit:
// Close the registry key.
if ( hKey )
{
RegCloseKey( hKey );
}
if ( hParentKey != HKEY_LOCAL_MACHINE )
{
RegCloseKey( hParentKey );
}
return ( dwStatus );
} //*** ClRtlGetClusterInstallState()
/////////////////////////////////////////////////////////////////////////////
//++
//
// ClRtlSetClusterInstallState
//
// Routine Description:
// This function sets the registry value that records the state of the
// Clustering Service installation.
//
// Arguments:
// hInstance - The handle to the application instance - necessary for the calls
// to LoadString.
//
// eInstallState - the state to which the registry value should be set.
//
// Return Value:
// TRUE - indicates that the registry value was set successfully
// FALSE - indicates that some error occured.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL ClRtlSetClusterInstallState( eClusterInstallState eInstallState )
{
//initialize return to FALSE
BOOL fReturnValue = FALSE;
// Set the state of the ClusterInstallationState registry key to indicate
// that Cluster Server has been configured.
HKEY hKey;
DWORD dwStatus; // returned by registry API functions
// Attempt to open an existing key in the registry.
dwStatus = RegOpenKeyExW( HKEY_LOCAL_MACHINE,
L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Cluster Server",
0, // reserved
KEY_WRITE,
&hKey );
// Was the regustry key opened successfully ?
if ( dwStatus == ERROR_SUCCESS )
{
// Update the value.
DWORD dwClusterInstallState = eInstallState;
DWORD dwValueType = REG_DWORD;
DWORD dwDataBufferSize = sizeof( DWORD );
dwStatus = RegSetValueExW( hKey,
L"ClusterInstallationState",
0, // reserved
dwValueType,
(LPBYTE) &dwClusterInstallState,
dwDataBufferSize );
// Close the registry key.
RegCloseKey( hKey );
// Was the value set successfully?
if ( dwStatus == ERROR_SUCCESS )
{
fReturnValue = TRUE;
}
}
return ( fReturnValue );
} //*** ClRtlSetClusterInstallState()