462 lines
11 KiB
C++
462 lines
11 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1998-2000 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// Version.cpp
|
|
//
|
|
// Description:
|
|
// Implementation of the cluster version classes for the MSCLUS
|
|
// automation classes.
|
|
//
|
|
// Author:
|
|
// Galen Barbee (galenb) 26-Oct-1998
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Notes:
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#include "stdafx.h"
|
|
#include "version.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Global variables
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
static const IID * iidCClusVersion[] =
|
|
{
|
|
&IID_ISClusVersion
|
|
};
|
|
|
|
|
|
//*************************************************************************//
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CClusVersion class
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::CClusVersion
|
|
//
|
|
// Description:
|
|
// Constructor
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CClusVersion::CClusVersion( void )
|
|
{
|
|
m_piids = (const IID *) iidCClusVersion;
|
|
m_piidsSize = ARRAYSIZE( iidCClusVersion );
|
|
|
|
ZeroMemory( &m_clusinfo, sizeof( CLUSTERVERSIONINFO ) );
|
|
m_clusinfo.dwVersionInfoSize = sizeof( CLUSTERVERSIONINFO );
|
|
|
|
} //*** CClusVersion::CClusVersion()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::Create
|
|
//
|
|
// Description:
|
|
// Finish creating this object from the data in the cluster.
|
|
//
|
|
// Arguments:
|
|
// pClusRefObject [IN] - Wraps the cluster handle.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, other HRESULT error, or other Win32 error.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CClusVersion::Create( IN ISClusRefObject * pClusRefObject )
|
|
{
|
|
ASSERT( pClusRefObject != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pClusRefObject != NULL )
|
|
{
|
|
HCLUSTER _hCluster = NULL;
|
|
|
|
m_ptrClusRefObject = pClusRefObject;
|
|
|
|
_hr = m_ptrClusRefObject->get_Handle( (ULONG_PTR *) &_hCluster );
|
|
if ( SUCCEEDED( _hr ) )
|
|
{
|
|
LPWSTR _pwszName = NULL;
|
|
DWORD _sc;
|
|
|
|
_sc = ::WrapGetClusterInformation( _hCluster, &_pwszName, &m_clusinfo );
|
|
if ( _sc == ERROR_SUCCESS )
|
|
{
|
|
m_bstrClusterName = _pwszName;
|
|
::LocalFree( _pwszName );
|
|
_pwszName = NULL;
|
|
} // if: WrapGetClusterInformation OK
|
|
|
|
_hr = HRESULT_FROM_WIN32( _sc );
|
|
} //if: get cluster handle
|
|
} // if: pClusRefObject != NULL
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::Create()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_Name
|
|
//
|
|
// Description:
|
|
// Return the name of the cluster.
|
|
//
|
|
// Arguments:
|
|
// pbstrClusterName [OUT] - Catches the name of this cluster.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_Name( OUT BSTR * pbstrClusterName )
|
|
{
|
|
//ASSERT( pbstrClusterName != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pbstrClusterName != NULL )
|
|
{
|
|
*pbstrClusterName = m_bstrClusterName.Copy();
|
|
_hr = S_OK;
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_Name()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_VendorId
|
|
//
|
|
// Description:
|
|
// Return the vendor ID from the CLUSTERVERSIONINFO struct.
|
|
//
|
|
// Arguments:
|
|
// pbstrVendorId [OUT] - Catches the value of the vendo id.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_VendorId( OUT BSTR * pbstrVendorId )
|
|
{
|
|
//ASSERT( pbstrVendorId != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pbstrVendorId != NULL )
|
|
{
|
|
*pbstrVendorId = ::SysAllocString( m_clusinfo.szVendorId );
|
|
if ( *pbstrVendorId == NULL )
|
|
{
|
|
_hr = E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
{
|
|
_hr = S_OK;
|
|
}
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_VendorId()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_CSDVersion
|
|
//
|
|
// Description:
|
|
// Return the value the CSDVersion from the CLUSTERVERSIONINFO struct.
|
|
//
|
|
// Arguments:
|
|
// pbstrCSDVersion [OUT] - Catches the value of CSDVersion.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_CSDVersion( OUT BSTR * pbstrCSDVersion )
|
|
{
|
|
//ASSERT( pbstrCSDVersion != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pbstrCSDVersion != NULL )
|
|
{
|
|
*pbstrCSDVersion = ::SysAllocString( m_clusinfo.szCSDVersion );
|
|
if ( *pbstrCSDVersion == NULL )
|
|
{
|
|
_hr = E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
{
|
|
_hr = S_OK;
|
|
}
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_CSDVersion()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_MajorVersion
|
|
//
|
|
// Description:
|
|
// Returns the cluster major version.
|
|
//
|
|
// Arguments:
|
|
// pnMajorVersion [OUT] - Catches the cluster major version value.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_MajorVersion( OUT long * pnMajorVersion )
|
|
{
|
|
//ASSERT( pnMajorVersion != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pnMajorVersion != NULL )
|
|
{
|
|
*pnMajorVersion = m_clusinfo.MajorVersion;
|
|
_hr = S_OK;
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_MajorVersion()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_MinorVersion
|
|
//
|
|
// Description:
|
|
// Returns the cluster minor version.
|
|
//
|
|
// Arguments:
|
|
// pnMinorVersion [OUT] - Catches the cluster minor version value.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_MinorVersion( OUT long * pnMinorVersion )
|
|
{
|
|
//ASSERT( pnMinorVersion != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pnMinorVersion != NULL )
|
|
{
|
|
*pnMinorVersion = m_clusinfo.MinorVersion;
|
|
_hr = S_OK;
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_MinorVersion()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_BuildNumber
|
|
//
|
|
// Description:
|
|
// Returns the value of the cluster build number.
|
|
//
|
|
// Arguments:
|
|
// pnBuildNumber [OUT] - Catches the build number.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_BuildNumber( OUT short * pnBuildNumber )
|
|
{
|
|
//ASSERT( pnBuildNumber != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pnBuildNumber != NULL )
|
|
{
|
|
*pnBuildNumber = m_clusinfo.BuildNumber;
|
|
_hr = S_OK;
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_BuildNumber()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_ClusterHighestVersion
|
|
//
|
|
// Description:
|
|
// Returns the value of the highest cluster version.
|
|
//
|
|
// Arguments:
|
|
// pnClusterHighestVersion [OUT] - Catches the value.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_ClusterHighestVersion(
|
|
OUT long * pnClusterHighestVersion
|
|
)
|
|
{
|
|
//ASSERT( pnClusterHighestVersion != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pnClusterHighestVersion != NULL )
|
|
{
|
|
*pnClusterHighestVersion = m_clusinfo.dwClusterHighestVersion;
|
|
_hr = S_OK;
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_ClusterHighestVersion()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_ClusterLowestVersion
|
|
//
|
|
// Description:
|
|
// Returns the value of the lowest cluster version.
|
|
//
|
|
// Arguments:
|
|
// pnClusterLowestVersion [OUT] - Catches the value.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_ClusterLowestVersion(
|
|
OUT long * pnClusterLowestVersion
|
|
)
|
|
{
|
|
//ASSERT( pnClusterLowestVersion != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pnClusterLowestVersion != NULL )
|
|
{
|
|
*pnClusterLowestVersion = m_clusinfo.dwClusterLowestVersion;
|
|
_hr = S_OK;
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_ClusterLowestVersion()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_Flags
|
|
//
|
|
// Description:
|
|
// Get the CLUSTERINFO.dwFlags value.
|
|
//
|
|
// Arguments:
|
|
// pnFlags [OUT] - Catches the flags value.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_Flags( OUT long * pnFlags )
|
|
{
|
|
//ASSERT( pnFlags != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pnFlags != NULL )
|
|
{
|
|
*pnFlags = m_clusinfo.dwFlags;
|
|
_hr = S_OK;
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_Flags()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CClusVersion::get_MixedVersion
|
|
//
|
|
// Description:
|
|
// Is this cluster composed of mixed version nodes?
|
|
//
|
|
// Arguments:
|
|
// pvarMixedVersion [OUT] - Catches the mixed version state.
|
|
//
|
|
// Return Value:
|
|
// S_OK if successful, or E_POINTER.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CClusVersion::get_MixedVersion( OUT VARIANT * pvarMixedVersion )
|
|
{
|
|
//ASSERT( pvarMixedVersion != NULL );
|
|
|
|
HRESULT _hr = E_POINTER;
|
|
|
|
if ( pvarMixedVersion != NULL )
|
|
{
|
|
pvarMixedVersion->vt = VT_BOOL;
|
|
|
|
if ( m_clusinfo.dwFlags & CLUSTER_VERSION_FLAG_MIXED_MODE )
|
|
{
|
|
pvarMixedVersion->boolVal = VARIANT_TRUE;
|
|
} // if: the mixed version bit is set...
|
|
else
|
|
{
|
|
pvarMixedVersion->boolVal = VARIANT_FALSE;
|
|
} // else: the mixed version bit is not set...
|
|
|
|
_hr = S_OK;
|
|
}
|
|
|
|
return _hr;
|
|
|
|
} //*** CClusVersion::get_MixedVersion()
|