///////////////////////////////////////////////////////////////////////////// // // 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 #include #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()