206 lines
6.2 KiB
C++
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()
|