////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2001 Microsoft Corporation // // Module Name: // ManagedDevice.cpp // // Description: // CManagedDevice implementation. // // Maintained By: // Galen Barbee (GalenB) 02-FEB-2000 // ////////////////////////////////////////////////////////////////////////////// #include "pch.h" #include "ManagedDevice.h" DEFINE_THISCLASS("CManagedDevice") // ************************************************************************ // // Constructor / Destructor // // ************************************************************************ ////////////////////////////////////////////////////////////////////////////// //++ // // HRESULT // CManagedDevice::S_HrCreateInstance( // IUnknown ** ppunkOut // ) // //-- ////////////////////////////////////////////////////////////////////////////// HRESULT CManagedDevice::S_HrCreateInstance( IUnknown ** ppunkOut ) { TraceFunc( "" ); Assert( ppunkOut != NULL ); HRESULT hr; CManagedDevice * pmd = new CManagedDevice; if ( pmd != NULL ) { hr = THR( pmd->Init( ) ); if ( SUCCEEDED( hr ) ) { hr = THR( pmd->TypeSafeQI( IUnknown, ppunkOut ) ); } pmd->Release( ); } else { hr = E_OUTOFMEMORY; } HRETURN( hr ); } //*** CManagedDevice::S_HrCreateInstance( ) ////////////////////////////////////////////////////////////////////////////// //++ // // CManagedDevice::CManagedDevice( void ) // //-- ////////////////////////////////////////////////////////////////////////////// CManagedDevice::CManagedDevice( void ) { TraceFunc( "" ); InterlockedIncrement( &g_cObjects ); TraceFuncExit(); } //*** CManagedDevice::CManagedDevice( ) ////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::Init( void ) // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::Init( void ) { TraceFunc( "" ); HRESULT hr = S_OK; // IUnknown stuff Assert( m_cRef == 0 ); AddRef( ); // Add one count // IClusCfgManagedResourceInfo Assert( m_bstrUID == NULL ); Assert( m_bstrName == NULL ); Assert( m_fHasNameChanged == FALSE ); Assert( m_bstrType == NULL ); Assert( m_fIsManaged == FALSE ); Assert( m_fIsQuorumDevice == FALSE ); Assert( m_fIsQuorumCapable == FALSE ); Assert( m_fIsQuorumJoinable == FALSE ); Assert( m_dlmDriveLetterMapping.dluDrives[ 0 ] = dluUNUSED ); // IExtendObjectManager HRETURN( hr ); } //*** CManagedDevice::Init( ) ////////////////////////////////////////////////////////////////////////////// //++ // // CManagedDevice::~CManagedDevice( void ) // //-- ////////////////////////////////////////////////////////////////////////////// CManagedDevice::~CManagedDevice( void ) { TraceFunc( "" ); if ( m_bstrUID != NULL ) { TraceSysFreeString( m_bstrUID ); } if ( m_bstrName != NULL ) { TraceSysFreeString( m_bstrName ); } if ( m_bstrType != NULL ) { TraceSysFreeString( m_bstrType ); } InterlockedDecrement( &g_cObjects ); TraceFuncExit(); } //*** CManagedDevice::~CManagedDevice( ) // ************************************************************************ // // IUnknown // // ************************************************************************ ////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::QueryInterface( // REFIID riidIn, // LPVOID * ppvOut // ) // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::QueryInterface( REFIID riidIn, LPVOID * ppvOut ) { TraceQIFunc( riidIn, ppvOut ); HRESULT hr = E_NOINTERFACE; if ( IsEqualIID( riidIn, IID_IUnknown ) ) { *ppvOut = static_cast< IClusCfgManagedResourceInfo * >( this ); hr = S_OK; } // if: IUnknown else if ( IsEqualIID( riidIn, IID_IClusCfgManagedResourceInfo ) ) { *ppvOut = TraceInterface( __THISCLASS__, IClusCfgManagedResourceInfo, this, 0 ); hr = S_OK; } // else if: IClusCfgManagedResourceInfo else if ( IsEqualIID( riidIn, IID_IGatherData ) ) { *ppvOut = TraceInterface( __THISCLASS__, IGatherData, this, 0 ); hr = S_OK; } // else if: IGatherData else if ( IsEqualIID( riidIn, IID_IExtendObjectManager ) ) { *ppvOut = TraceInterface( __THISCLASS__, IExtendObjectManager, this, 0 ); hr = S_OK; } // else if: IGatherData if ( SUCCEEDED( hr ) ) { ((IUnknown*) *ppvOut)->AddRef( ); } // if: success QIRETURN_IGNORESTDMARSHALLING( hr, riidIn ); } //*** CManagedDevice::QueryInterface( ) ////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP_( ULONG ) // CManagedDevice::AddRef( void ) // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP_( ULONG ) CManagedDevice::AddRef( void ) { TraceFunc( "[IUnknown]" ); InterlockedIncrement( &m_cRef ); RETURN( m_cRef ); } //*** CManagedDevice::AddRef( ) ////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP_( ULONG ) // CManagedDevice::Release( void ) // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP_( ULONG ) CManagedDevice::Release( void ) { TraceFunc( "[IUnknown]" ); InterlockedDecrement( &m_cRef ); if ( m_cRef ) RETURN( m_cRef ); TraceDo( delete this ); RETURN(0); } //*** CManagedDevice::Release( ) // ************************************************************************ // // IClusCfgManagedResourceInfo // // ************************************************************************ /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::GetUID( // BSTR * pbstrUIDOut // ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::GetUID( BSTR * pbstrUIDOut ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr = S_OK; if ( pbstrUIDOut == NULL ) goto InvalidPointer; if ( m_bstrUID == NULL ) goto UnexpectedError; *pbstrUIDOut = SysAllocString( m_bstrUID ); if ( *pbstrUIDOut == NULL ) goto OutOfMemory; Cleanup: HRETURN( hr ); InvalidPointer: hr = THR( E_POINTER ); goto Cleanup; UnexpectedError: hr = THR( E_UNEXPECTED ); goto Cleanup; OutOfMemory: hr = E_OUTOFMEMORY; goto Cleanup; } //*** CManagedDevice::GetUID( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::GetName( // BSTR * pbstrNameOut // ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::GetName( BSTR * pbstrNameOut ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr = S_OK; if ( pbstrNameOut == NULL ) goto InvalidPointer; if ( m_bstrName == NULL ) goto UnexpectedError; *pbstrNameOut = SysAllocString( m_bstrName ); if ( *pbstrNameOut == NULL ) goto OutOfMemory; Cleanup: HRETURN( hr ); InvalidPointer: hr = THR( E_POINTER ); goto Cleanup; UnexpectedError: hr = THR( E_UNEXPECTED ); goto Cleanup; OutOfMemory: hr = E_OUTOFMEMORY; goto Cleanup; } //*** CManagedDevice::GetName( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::SetName( // BSTR bstrNameIn // ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::SetName( LPCWSTR pcszNameIn ) { TraceFunc1( "[IClusCfgManagedResourceInfo] pcszNameIn = '%ws'", ( pcszNameIn == NULL ? L"" : pcszNameIn ) ); HRESULT hr = S_OK; // Bug #294649 BSTR bstrNewName; if ( pcszNameIn == NULL ) goto InvalidArg; bstrNewName = TraceSysAllocString( pcszNameIn ); if ( bstrNewName == NULL ) goto OutOfMemory; if ( m_bstrName != NULL ) { TraceSysFreeString( m_bstrName ); } m_bstrName = bstrNewName; m_fHasNameChanged = TRUE; Cleanup: HRETURN( hr ); InvalidArg: hr = THR( E_INVALIDARG ); goto Cleanup; OutOfMemory: hr = E_OUTOFMEMORY; goto Cleanup; } //*** CManagedDevice::SetName( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::IsManaged( void ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::IsManaged( void ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr; if ( m_fIsManaged ) { hr = S_OK; } else { hr = S_FALSE; } HRETURN( hr ); } //*** CManagedDevice::IsManaged( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::SetManaged( // BOOL fIsManagedIn // ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::SetManaged( BOOL fIsManagedIn ) { TraceFunc1( "[IClusCfgManagedResourceInfo] fIsManagedIn = '%s'", BOOLTOSTRING( fIsManagedIn ) ); m_fIsManaged = fIsManagedIn; HRETURN( S_OK ); } //*** CManagedDevice::SetManaged( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::IsQuorumDevice( void ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::IsQuorumDevice( void ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr; if ( m_fIsQuorumDevice ) { hr = S_OK; } else { hr = S_FALSE; } HRETURN( hr ); } //*** CManagedDevice::IsQuorumDevice( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::SetQuorumedDevice( // BOOL fIsQuorumDeviceIn // ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::SetQuorumedDevice( BOOL fIsQuorumDeviceIn ) { TraceFunc1( "[IClusCfgManagedResourceInfo] fIsQuorumDeviceIn = '%s'", BOOLTOSTRING( fIsQuorumDeviceIn ) ); m_fIsQuorumDevice = fIsQuorumDeviceIn; HRETURN( S_OK ); } //*** CManagedDevice::SetQuorumedDevice( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::IsQuorumCapable( void ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::IsQuorumCapable( void ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr; if ( m_fIsQuorumCapable ) { hr = S_OK; } else { hr = S_FALSE; } HRETURN( hr ); } //*** CManagedDevice::IsQuorumCapable( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::GetDriveLetterMappings( // SDriveLetterMapping * pdlmDriveLetterMappingOut // ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::GetDriveLetterMappings( SDriveLetterMapping * pdlmDriveLetterMappingOut ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); *pdlmDriveLetterMappingOut = m_dlmDriveLetterMapping; HRETURN( S_OK ); } //*** CManagedDevice::GetDriveLetterMappings( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::SetDriveLetterMappings( // SDriveLetterMapping dlmDriveLetterMappingIn // ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::SetDriveLetterMappings( SDriveLetterMapping dlmDriveLetterMappingIn ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); m_dlmDriveLetterMapping = dlmDriveLetterMappingIn; HRETURN( S_OK ); } //*** CManagedDevice::SetDriveLetterMappings( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::IsDeviceJoinable( void ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::IsDeviceJoinable( void ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRESULT hr; if ( m_fIsQuorumJoinable ) { hr = S_OK; } else { hr = S_FALSE; } HRETURN( hr ); } //*** CManagedDevice::IsDeviceJoinable( ) /////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::SetDeviceJoinable( void ) // //-- /////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::SetDeviceJoinable( BOOL fIsJoinableIn ) { TraceFunc( "[IClusCfgManagedResourceInfo]" ); HRETURN( THR( E_NOTIMPL ) ); } //*** CManagedDevice::SetDeviceJoinable( ) //**************************************************************************** // // IGatherData // //**************************************************************************** ////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::Gather( // OBJECTCOOKIE cookieParentIn, // IUnknown * punkIn // ) // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::Gather( OBJECTCOOKIE cookieParentIn, IUnknown * punkIn ) { TraceFunc( "[IGatherData]" ); HRESULT hr; BSTR bstr = NULL; IClusCfgManagedResourceInfo * pccmri = NULL; // // Check parameters // if ( punkIn == NULL ) goto InvalidArg; // // Find the inteface we need to gather our info. // hr = THR( punkIn->TypeSafeQI( IClusCfgManagedResourceInfo, &pccmri ) ); if ( FAILED( hr ) ) goto Cleanup; // // Gather UID // hr = THR( pccmri->GetUID( &m_bstrUID ) ); if ( FAILED( hr ) ) goto Error; TraceMemoryAddBSTR( m_bstrUID ); // // Gather Name // hr = THR( pccmri->GetName( &m_bstrName ) ); if ( FAILED( hr ) ) goto Error; TraceMemoryAddBSTR( m_bstrName ); // // Gather IsManaged // hr = STHR( pccmri->IsManaged( ) ); if ( FAILED( hr ) ) goto Error; if ( hr == S_OK ) { m_fIsManaged = TRUE; } else { m_fIsManaged = FALSE; } // // Gather Quorum Capable // hr = STHR( pccmri->IsQuorumCapable( ) ); if ( FAILED( hr ) ) goto Error; if ( hr == S_OK ) { m_fIsQuorumCapable = TRUE; } else { m_fIsQuorumCapable = FALSE; } // // If the device is quorumable, does it allow joins. // if(m_fIsQuorumCapable) { hr = STHR( pccmri->IsDeviceJoinable( ) ); if( FAILED( hr ) ) goto Error; if( hr == S_OK ) { m_fIsQuorumJoinable = TRUE; } else { m_fIsQuorumJoinable = FALSE; } } else { m_fIsQuorumJoinable = FALSE; } // // Gather if resource is the quorum resource. // hr = STHR( pccmri->IsQuorumDevice( ) ); if ( FAILED( hr ) ) goto Cleanup; if ( hr == S_OK ) { m_fIsQuorumDevice = TRUE; } else { m_fIsQuorumDevice = FALSE; } // // Gather Device Mappings // hr = STHR( pccmri->GetDriveLetterMappings( &m_dlmDriveLetterMapping ) ); if ( FAILED( hr ) ) goto Error; if ( hr == S_FALSE ) { // Make sure this is nuked ZeroMemory( &m_dlmDriveLetterMapping, sizeof(m_dlmDriveLetterMapping) ); } // // Anything else to gather?? // hr = S_OK; Cleanup: if ( pccmri != NULL ) { pccmri->Release( ); } HRETURN( hr ); Error: // // On error, invalidate all data. // if ( m_bstrUID != NULL ) { TraceSysFreeString( m_bstrUID ); m_bstrUID = NULL; } if ( m_bstrName != NULL ) { TraceSysFreeString( m_bstrName ); m_bstrName = NULL; } if ( m_bstrType != NULL ) { TraceSysFreeString( m_bstrType ); m_bstrType = NULL; } m_fIsManaged = FALSE; m_fIsQuorumCapable = FALSE; m_fIsQuorumJoinable = FALSE; m_fIsQuorumDevice = FALSE; ZeroMemory( &m_dlmDriveLetterMapping, sizeof( m_dlmDriveLetterMapping ) ); goto Cleanup; InvalidArg: hr = THR( E_INVALIDARG ); goto Cleanup; } //*** CManagedDevice::Gather( ) // ************************************************************************ // // IExtendObjectManager // // ************************************************************************ ////////////////////////////////////////////////////////////////////////////// //++ // // STDMETHODIMP // CManagedDevice::FindObject( // OBJECTCOOKIE cookieIn // , REFCLSID rclsidTypeIn // , LPCWSTR pcszNameIn // , LPUNKNOWN * punkOut // ) // //-- ////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CManagedDevice::FindObject( OBJECTCOOKIE cookieIn , REFCLSID rclsidTypeIn , LPCWSTR pcszNameIn , LPUNKNOWN * ppunkOut ) { TraceFunc( "[IExtendObjectManager]" ); HRESULT hr = E_UNEXPECTED; // // Validate arguments. // if ( cookieIn == 0 ) goto InvalidArg; if ( rclsidTypeIn != CLSID_ManagedResourceType ) goto InvalidArg; if ( pcszNameIn == NULL ) goto InvalidArg; if ( ppunkOut == NULL ) goto InvalidPointer; hr = THR( QueryInterface( DFGUID_ManagedResource, reinterpret_cast< void ** >( ppunkOut ) ) ); if ( FAILED( hr ) ) goto Cleanup; hr = S_OK; Cleanup: HRETURN( hr ); InvalidArg: hr = THR( E_INVALIDARG ); goto Cleanup; InvalidPointer: hr = THR( E_POINTER ); goto Cleanup; } //*** CManagedDevice::FindObject( )