////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2001 Microsoft Corporation // // Module Name: // CUnknownQuorum.cpp // // Description: // This file contains the definition of the CUnknownQuorum class. // // The class CUnknownQuorum represents a cluster quorum // device. It implements the IClusCfgManagedResourceInfo interface. // // Documentation: // // Header File: // CUnknownQuorum.h // // Maintained By: // Galen Barbee (GalenB) 18-DEC-2000 // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Include Files ////////////////////////////////////////////////////////////////////////////// #include "pch.h" #include "CUnknownQuorum.h" ////////////////////////////////////////////////////////////////////////////// // Constant Definitions ////////////////////////////////////////////////////////////////////////////// DEFINE_THISCLASS( "CUnknownQuorum" ); #define UNKNOWN_QUORUM L"Unknown Quorum" //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CUnknownQuorum class ///////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::S_HrCreateInstance // // Description: // Create a CUnknownQuorum instance. // // Arguments: // None. // // Return Values: // Pointer to CUnknownQuorum instance. // //-- ////////////////////////////////////////////////////////////////////////////// HRESULT CUnknownQuorum::S_HrCreateInstance( IUnknown ** ppunkOut ) { TraceFunc( "" ); HRESULT hr; CUnknownQuorum * lpccs = NULL; if ( ppunkOut == NULL ) { hr = THR( E_POINTER ); goto Cleanup; } // if: lpccs = new CUnknownQuorum(); if ( lpccs == NULL ) { hr = THR( E_OUTOFMEMORY ); goto Cleanup; } // if: error allocating object hr = THR( lpccs->HrInit( NULL ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: HrInit() failed hr = THR( lpccs->TypeSafeQI( IUnknown, ppunkOut ) ); Cleanup: if ( FAILED( hr ) ) { LogMsg( L"[SRV] CUnknownQuorum::S_HrCreateInstance() failed. (hr = %#08x)", hr ); } // if: if ( lpccs != NULL ) { lpccs->Release(); } // if: HRETURN( hr ); } //*** CUnknownQuorum::S_HrCreateInstance ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::S_HrCreateInstance // // Description: // Create a CUnknownQuorum instance. // // Arguments: // None. // // Return Values: // Pointer to CUnknownQuorum instance. // //-- ////////////////////////////////////////////////////////////////////////////// HRESULT CUnknownQuorum::S_HrCreateInstance( LPCWSTR pcszNameIn , BOOL fMakeQuorumIn , IUnknown ** ppunkOut ) { TraceFunc( "" ); HRESULT hr; CUnknownQuorum * lpccs = NULL; if ( ppunkOut == NULL ) { hr = THR( E_POINTER ); goto Cleanup; } // if: lpccs = new CUnknownQuorum(); if ( lpccs == NULL ) { hr = THR( E_OUTOFMEMORY ); goto Cleanup; } // if: error allocating object hr = THR( lpccs->HrInit( pcszNameIn, fMakeQuorumIn ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: HrInit() failed hr = THR( lpccs->TypeSafeQI( IUnknown, ppunkOut ) ); Cleanup: if ( FAILED( hr ) ) { LogMsg( L"[SRV] CUnknownQuorum::S_HrCreateInstance() failed. (hr = %#08x)", hr ); } // if: if ( lpccs != NULL ) { lpccs->Release(); } // if: HRETURN( hr ); } //*** CUnknownQuorum::S_HrCreateInstance //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CUnknownQuorum class -- Private Methods. ///////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::CUnknownQuorum // // Description: // Constructor of the CUnknownQuorum class. This initializes // the m_cRef variable to 1 instead of 0 to account of possible // QueryInterface failure in DllGetClassObject. // // Arguments: // None. // // Return Value: // None. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// CUnknownQuorum::CUnknownQuorum( void ) : m_cRef( 1 ) { TraceFunc( "" ); // Increment the count of components in memory so the DLL hosting this // object cannot be unloaded. InterlockedIncrement( &g_cObjects ); Assert( m_lcid == 0 ); Assert( m_picccCallback == NULL ); Assert( !m_fIsQuorum ); Assert( !m_fIsJoinable ); Assert( !m_fIsManaged ); Assert( m_bstrName == NULL ); TraceFuncExit(); } //*** CUnknownQuorum::CUnknownQuorum ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::~CUnknownQuorum // // Description: // Desstructor of the CUnknownQuorum class. // // Arguments: // None. // // Return Value: // None. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// CUnknownQuorum::~CUnknownQuorum( void ) { TraceFunc( "" ); if ( m_picccCallback != NULL ) { m_picccCallback->Release(); } // if: TraceSysFreeString( m_bstrName ); // There's going to be one less component in memory. Decrement component count. InterlockedDecrement( &g_cObjects ); TraceFuncExit(); } //*** CUnknownQuorum::~CUnknownQuorum ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::HrInit // // Description: // Initialize this component. // // Arguments: // None. // // Return Value: // // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// HRESULT CUnknownQuorum::HrInit( LPCWSTR pcszNameIn, BOOL fMakeQuorumIn /* = FALSE */ ) { TraceFunc( "" ); HRESULT hr = S_OK; // // If we were handed a name then use it. // if ( pcszNameIn != NULL ) { m_bstrName = TraceSysAllocString( pcszNameIn ); } // if: else { m_bstrName = TraceSysAllocString( UNKNOWN_QUORUM ); } // else: if ( m_bstrName == NULL ) { hr = THR( E_OUTOFMEMORY ); } // if: // // Default to being joinable. // m_fIsJoinable = TRUE; m_fIsQuorum = fMakeQuorumIn; HRETURN( hr ); } //*** CUnknownQuorum::HrInit //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CUnknownQuorum -- IUknkown interface. ///////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP_( ULONG ) // CUnknownQuorum:: [IUNKNOWN] AddRef // // Description: // Increment the reference count of this object by one. // // Arguments: // None. // // Return Value: // The new reference count. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP_( ULONG ) CUnknownQuorum::AddRef( void ) { TraceFunc( "[IUnknown]" ); InterlockedIncrement( & m_cRef ); RETURN( m_cRef ); } //*** CUnknownQuorum::AddRef ////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP_( ULONG ) // CUnknownQuorum:: [IUNKNOWN] Release // // Description: // Decrement the reference count of this object by one. // // Arguments: // None. // // Return Value: // The new reference count. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP_( ULONG ) CUnknownQuorum::Release( void ) { TraceFunc( "[IUnknown]" ); LONG cRef; cRef = InterlockedDecrement( &m_cRef ); if ( cRef == 0 ) { TraceDo( delete this ); } // if: reference count equal to zero RETURN( cRef ); } //*** CUnknownQuorum::Release ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum:: [INKNOWN] QueryInterface // // Description: // Query this object for the passed in interface. // // Arguments: // IN REFIID riid, // Id of interface requested. // // OUT void ** ppv // Pointer to the requested interface. // // Return Value: // S_OK // If the interface is available on this object. // // E_NOINTERFACE // If the interface is not available. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::QueryInterface( REFIID riid, void ** ppv ) { TraceQIFunc( riid, ppv ); HRESULT hr = E_NOINTERFACE; if ( IsEqualIID( riid, IID_IUnknown ) ) { *ppv = static_cast< IClusCfgManagedResourceInfo * >( this ); hr = S_OK; } // if: IUnknown else if ( IsEqualIID( riid, IID_IClusCfgManagedResourceInfo ) ) { *ppv = TraceInterface( __THISCLASS__, IClusCfgManagedResourceInfo, this, 0 ); hr = S_OK; } // else if: else if ( IsEqualIID( riid, IID_IClusCfgInitialize ) ) { *ppv = TraceInterface( __THISCLASS__, IClusCfgInitialize, this, 0 ); hr = S_OK; } // else if: else if ( IsEqualIID( riid, IID_IClusCfgManagedResourceCfg ) ) { *ppv = TraceInterface( __THISCLASS__, IClusCfgManagedResourceCfg, this, 0 ); hr = S_OK; } // else if: if ( SUCCEEDED( hr ) ) { ((IUnknown *) *ppv)->AddRef( ); } // if: success QIRETURN_IGNORESTDMARSHALLING1( hr, riid, IID_IEnumClusCfgPartitions ); } //*** CUnknownQuorum::QueryInterface //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CUnknownQuorum -- IClusCfgInitialize interface. ///////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::Initialize // // Description: // Initialize this component. // // Arguments: // IN IUknown * punkCallbackIn // // IN LCID lcidIn // // Return Value: // S_OK // Success // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::Initialize( IUnknown * punkCallbackIn, LCID lcidIn ) { TraceFunc( "[IClusCfgInitialize]" ); Assert( m_picccCallback == NULL ); HRESULT hr = S_OK; m_lcid = lcidIn; if ( punkCallbackIn == NULL ) { hr = THR( E_POINTER ); goto Cleanup; } // if: hr = THR( punkCallbackIn->TypeSafeQI( IClusCfgCallback, &m_picccCallback ) ); Cleanup: HRETURN( hr ); } //*** CUnknownQuorum::Initialize //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CUnknownQuorum -- IClusCfgManagedResourceInfo interface. ///////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::GetUID // // Description: // // Arguments: // // Return Value: // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::GetUID( BSTR * pbstrUIDOut ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr = S_OK; if ( pbstrUIDOut == NULL ) { hr = THR( E_POINTER ); STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_LocalQuorum_GetUID_Pointer, IDS_ERROR_NULL_POINTER, hr ); goto Cleanup; } // if: *pbstrUIDOut = SysAllocString( UNKNOWN_QUORUM ); if ( *pbstrUIDOut == NULL ) { hr = THR( E_OUTOFMEMORY ); STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_LocalQuorum_GetUID_Memory, IDS_ERROR_OUTOFMEMORY, hr ); } // if: Cleanup: HRETURN( hr ); } //*** CUnknownQuorum::GetUID ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::GetName // // Description: // // Arguments: // // Return Value: // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::GetName( BSTR * pbstrNameOut ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr = S_OK; if ( pbstrNameOut == NULL ) { hr = THR( E_POINTER ); STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_LocalQuorum_GetName_Pointer, IDS_ERROR_NULL_POINTER, hr ); goto Cleanup; } // if: *pbstrNameOut = SysAllocString( m_bstrName ); if ( *pbstrNameOut == NULL ) { hr = THR( E_OUTOFMEMORY ); STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_LocalQuorum_GetName_Memory, IDS_ERROR_OUTOFMEMORY, hr ); } // if: Cleanup: HRETURN( hr ); } //*** CUnknownQuorum::GetName ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::SetName // // Description: // // Arguments: // // Return Value: // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::SetName( LPCWSTR pcszNameIn ) { TraceFunc1( "[IClusCfgManagedResourceInfo] pcszNameIn = '%ls'", pcszNameIn == NULL ? L"" : pcszNameIn ); HRESULT hr = S_OK; BSTR bstr = NULL; if ( pcszNameIn == NULL ) { hr = THR( E_INVALIDARG ); goto Cleanup; } // if: bstr = TraceSysAllocString( pcszNameIn ); if ( bstr == NULL ) { hr = THR( E_OUTOFMEMORY ); goto Cleanup; } // if: TraceSysFreeString( m_bstrName ); m_bstrName = bstr; Cleanup: HRETURN( hr ); } //*** CUnknownQuorum::SetName ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::IsManaged // // Description: // // Arguments: // // Return Value: // S_OK // The device is managed. // // S_FALSE // The device is not managed. // // Win32 error as HRESULT when an error occurs. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::IsManaged( void ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr = S_FALSE; if ( m_fIsManaged ) { hr = S_OK; } // if: HRETURN( hr ); } //*** CUnknownQuorum::IsManaged ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::SetManaged // // Description: // // Arguments: // // Return Value: // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::SetManaged( BOOL fIsManagedIn ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); m_fIsManaged = fIsManagedIn; HRETURN( S_OK ); } //*** CUnknownQuorum::SetManaged ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::IsQuorumDevice // // Description: // // Arguments: // // Return Value: // S_OK // The device is the quorum device. // // S_FALSE // The device is not the quorum device. // // Win32 error as HRESULT when an error occurs. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::IsQuorumDevice( void ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr = S_FALSE; if ( m_fIsQuorum ) { hr = S_OK; } // if: LOG_STATUS_REPORT_STRING( L"Local quorum '%1!ws!' the quorum device." , m_fIsQuorum ? L"is" : L"is not" , hr ); Cleanup: HRETURN( hr ); } //*** CUnknownQuorum::IsQuorumDevice ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::SetQuorumedDevice // // Description: // // Arguments: // // Return Value: // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::SetQuorumedDevice( BOOL fIsQuorumDeviceIn ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr = S_OK; m_fIsQuorum = fIsQuorumDeviceIn; LOG_STATUS_REPORT_STRING( L"Setting local quorum '%1!ws!' the quorum device." , m_fIsQuorum ? L"to be" : L"to not be" , hr ); Cleanup: HRETURN( hr ); } //*** CUnknownQuorum::SetQuorumedDevice ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::IsQuorumCapable // // Description: // // Arguments: // // Return Value: // S_OK // The device is a quorum capable device. // // S_FALSE // The device is not a quorum capable device. // // Win32 error as HRESULT when an error occurs. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::IsQuorumCapable( void ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRETURN( S_OK ); } //*** CUnknownQuorum::IsQuorumCapable ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::GetDriveLetterMappings // // Description: // // Arguments: // // Return Value: // S_FALSE // There are not drive letters on this device. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::GetDriveLetterMappings( SDriveLetterMapping * pdlmDriveLetterMappingOut ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRETURN( S_FALSE ); } //*** CUnknownQuorum::GetDriveLetterMappings ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::SetDriveLetterMappings // // Description: // // Arguments: // // Return Value: // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::SetDriveLetterMappings( SDriveLetterMapping dlmDriveLetterMappingIn ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRETURN( THR( E_NOTIMPL ) ); } //*** CUnknownQuorum::SetDriveLetterMappings ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::IsDeviceJoinable // // Description: // // Arguments: // // Return Value: // S_OK // The device allows join. // // S_FALSE // The device does not allow join. // // Win32 error as HRESULT when an error occurs. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::IsDeviceJoinable( void ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr = S_FALSE; if ( m_fIsJoinable ) { hr = S_OK; } // if: HRETURN( hr ); } //*** CUnknownQuorum::IsDeviceJoinable ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::SetDeviceJoinable // // Description: // Sets the joinable flag // // Arguments: // // Return Value: // S_OK // The device allows join. // // S_FALSE // The device does not allow join. // // Win32 error as HRESULT when an error occurs. // // Remarks: // None. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::SetDeviceJoinable( BOOL fIsJoinableIn ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); m_fIsJoinable = fIsJoinableIn; HRETURN( S_OK ); } //*** CUnknownQuorum::IsDeviceJoinable //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CUnknownQuorum class -- IClusCfgManagedResourceCfg ///////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::PreCreate // // Description: // // Arguments: // // Return Value: // S_OK // Success // // Win32 error as HRESULT when an error occurs. // // Remarks: // This functions should do nothing but return S_OK. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::PreCreate( IUnknown * punkServicesIn ) { TraceFunc( "[IClusCfgManagedResourceCfg]" ); HRETURN( S_OK ); } //*** CUnknownQuorum::PreCreate ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::Create // // Description: // // Arguments: // // Return Value: // S_OK // Success // // Win32 error as HRESULT when an error occurs. // // Remarks: // This functions should do nothing but return S_OK. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::Create( IUnknown * punkServicesIn ) { TraceFunc( "[IClusCfgManagedResourceCfg]" ); HRETURN( S_OK ); } //*** CUnknownQuorum::Create ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::PostCreate // // Description: // // Arguments: // // Return Value: // S_OK // Success // // Remarks: // This functions should do nothing but return S_OK. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::PostCreate( IUnknown * punkServicesIn ) { TraceFunc( "[IClusCfgManagedResourceCfg]" ); HRETURN( S_OK ); } //*** CUnknownQuorum::PostCreate ////////////////////////////////////////////////////////////////////////////// //++ // // CUnknownQuorum::Evict // // Description: // // Arguments: // // Return Value: // S_OK // Success // // Win32 error as HRESULT when an error occurs. // // Remarks: // This functions should do nothing but return S_OK. // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CUnknownQuorum::Evict( IUnknown * punkServicesIn ) { TraceFunc( "[IClusCfgManagedResourceCfg]" ); HRETURN( S_OK ); } //*** CUnknownQuorum::Evict