Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1169 lines
25 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // CClusterResource.cpp
  7. //
  8. // Description:
  9. // This file contains the definition of the CClusterResource
  10. // class.
  11. //
  12. // The class CClusterResource represents a cluster manageable
  13. // device. It implements the IClusCfgManagedResourceInfo interface.
  14. //
  15. // Documentation:
  16. //
  17. // Header File:
  18. // CClusterResource.h
  19. //
  20. // Maintained By:
  21. // Galen Barbee (GalenB) 13-JUN-2000
  22. //
  23. //////////////////////////////////////////////////////////////////////////////
  24. //////////////////////////////////////////////////////////////////////////////
  25. // Include Files
  26. //////////////////////////////////////////////////////////////////////////////
  27. #include "pch.h"
  28. #include "CClusterResource.h"
  29. #include <PropList.h>
  30. //////////////////////////////////////////////////////////////////////////////
  31. // Constant Definitions
  32. //////////////////////////////////////////////////////////////////////////////
  33. DEFINE_THISCLASS( "CClusterResource" );
  34. //*************************************************************************//
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CClusterResource class
  37. /////////////////////////////////////////////////////////////////////////////
  38. //////////////////////////////////////////////////////////////////////////////
  39. //++
  40. //
  41. // CClusterResource::S_HrCreateInstance()
  42. //
  43. // Description:
  44. // Create a CClusterResource instance.
  45. //
  46. // Arguments:
  47. // None.
  48. //
  49. // Return Values:
  50. // Pointer to CClusterResource instance.
  51. //
  52. //--
  53. //////////////////////////////////////////////////////////////////////////////
  54. HRESULT
  55. CClusterResource::S_HrCreateInstance( IUnknown ** ppunkOut )
  56. {
  57. TraceFunc( "" );
  58. HRESULT hr;
  59. CClusterResource * lpccs = NULL;
  60. if ( ppunkOut == NULL )
  61. {
  62. hr = THR( E_POINTER );
  63. goto Cleanup;
  64. } // if:
  65. lpccs = new CClusterResource();
  66. if ( lpccs == NULL )
  67. {
  68. hr = THR( E_OUTOFMEMORY );
  69. goto Cleanup;
  70. } // if: error allocating object
  71. hr = THR( lpccs->HrInit() );
  72. if ( FAILED( hr ) )
  73. {
  74. goto Cleanup;
  75. } // if: HrInit() failed
  76. hr = THR( lpccs->TypeSafeQI( IUnknown, ppunkOut ) );
  77. Cleanup:
  78. if ( FAILED( hr ) )
  79. {
  80. LogMsg( L"[SRV] CClusterResource::S_HrCreateInstance() failed. (hr = %#08x)", hr );
  81. } // if:
  82. if ( lpccs != NULL )
  83. {
  84. lpccs->Release();
  85. } // if:
  86. HRETURN( hr );
  87. } //*** CClusterResource::S_HrCreateInstance()
  88. //////////////////////////////////////////////////////////////////////////////
  89. //++
  90. //
  91. // CClusterResource::CClusterResource()
  92. //
  93. // Description:
  94. // Constructor of the CClusterResource class. This initializes
  95. // the m_cRef variable to 1 instead of 0 to account of possible
  96. // QueryInterface failure in DllGetClassObject.
  97. //
  98. // Arguments:
  99. // None.
  100. //
  101. // Return Value:
  102. // None.
  103. //
  104. // Remarks:
  105. // None.
  106. //
  107. //--
  108. //////////////////////////////////////////////////////////////////////////////
  109. CClusterResource::CClusterResource( void )
  110. : m_cRef( 1 )
  111. {
  112. TraceFunc( "" );
  113. // Increment the count of components in memory so the DLL hosting this
  114. // object cannot be unloaded.
  115. InterlockedIncrement( &g_cObjects );
  116. Assert( m_dwFlags == 0 );
  117. Assert( m_lcid == 0 );
  118. Assert( m_picccCallback == NULL );
  119. Assert( m_bstrDescription == NULL );
  120. Assert( m_bstrType == NULL );
  121. TraceFuncExit();
  122. } //*** CClusterResource::CClusterResource
  123. //////////////////////////////////////////////////////////////////////////////
  124. //++
  125. //
  126. // CClusterResource::~CClusterResource()
  127. //
  128. // Description:
  129. // Desstructor of the CClusterResource class.
  130. //
  131. // Arguments:
  132. // None.
  133. //
  134. // Return Value:
  135. // None.
  136. //
  137. // Remarks:
  138. // None.
  139. //
  140. //--
  141. //////////////////////////////////////////////////////////////////////////////
  142. CClusterResource::~CClusterResource( void )
  143. {
  144. TraceFunc( "" );
  145. if ( m_picccCallback != NULL )
  146. {
  147. m_picccCallback->Release();
  148. } // if:
  149. TraceSysFreeString( m_bstrDescription );
  150. TraceSysFreeString( m_bstrType );
  151. // There's going to be one less component in memory. Decrement component count.
  152. InterlockedDecrement( &g_cObjects );
  153. TraceFuncExit();
  154. } //*** CClusterResource::~CClusterResource
  155. //*************************************************************************//
  156. /////////////////////////////////////////////////////////////////////////////
  157. // CClusterResource -- IUknkown interface.
  158. /////////////////////////////////////////////////////////////////////////////
  159. //////////////////////////////////////////////////////////////////////////////
  160. //++
  161. //
  162. // STDMETHODIMP_( ULONG )
  163. // CClusterResource:: [IUNKNOWN] AddRef()
  164. //
  165. // Description:
  166. // Increment the reference count of this object by one.
  167. //
  168. // Arguments:
  169. // None.
  170. //
  171. // Return Value:
  172. // The new reference count.
  173. //
  174. // Remarks:
  175. // None.
  176. //
  177. //--
  178. //////////////////////////////////////////////////////////////////////////////
  179. STDMETHODIMP_( ULONG )
  180. CClusterResource::AddRef( void )
  181. {
  182. TraceFunc( "[IUnknown]" );
  183. InterlockedIncrement( & m_cRef );
  184. RETURN( m_cRef );
  185. } //*** CClusterResource::AddRef()
  186. //////////////////////////////////////////////////////////////////////////////
  187. //++
  188. //
  189. // STDMETHODIMP_( ULONG )
  190. // CClusterResource:: [IUNKNOWN] Release()
  191. //
  192. // Description:
  193. // Decrement the reference count of this object by one.
  194. //
  195. // Arguments:
  196. // None.
  197. //
  198. // Return Value:
  199. // The new reference count.
  200. //
  201. // Remarks:
  202. // None.
  203. //
  204. //--
  205. //////////////////////////////////////////////////////////////////////////////
  206. STDMETHODIMP_( ULONG )
  207. CClusterResource::Release( void )
  208. {
  209. TraceFunc( "[IUnknown]" );
  210. LONG cRef;
  211. cRef = InterlockedDecrement( &m_cRef );
  212. if ( cRef == 0 )
  213. {
  214. TraceDo( delete this );
  215. } // if: reference count equal to zero
  216. RETURN( cRef );
  217. } //*** CClusterResource::Release()
  218. //////////////////////////////////////////////////////////////////////////////
  219. //++
  220. //
  221. // CClusterResource:: [INKNOWN] QueryInterface()
  222. //
  223. // Description:
  224. // Query this object for the passed in interface.
  225. //
  226. // Arguments:
  227. // IN REFIID riid,
  228. // Id of interface requested.
  229. //
  230. // OUT void ** ppv
  231. // Pointer to the requested interface.
  232. //
  233. // Return Value:
  234. // S_OK
  235. // If the interface is available on this object.
  236. //
  237. // E_NOINTERFACE
  238. // If the interface is not available.
  239. //
  240. // Remarks:
  241. // None.
  242. //
  243. //--
  244. //////////////////////////////////////////////////////////////////////////////
  245. STDMETHODIMP
  246. CClusterResource::QueryInterface( REFIID riid, void ** ppv )
  247. {
  248. TraceQIFunc( riid, ppv );
  249. HRESULT hr = E_NOINTERFACE;
  250. if ( IsEqualIID( riid, IID_IUnknown ) )
  251. {
  252. *ppv = static_cast< IClusCfgManagedResourceInfo * >( this );
  253. hr = S_OK;
  254. } // if: IUnknown
  255. else if ( IsEqualIID( riid, IID_IClusCfgManagedResourceInfo ) )
  256. {
  257. *ppv = TraceInterface( __THISCLASS__, IClusCfgManagedResourceInfo, this, 0 );
  258. hr = S_OK;
  259. } // else if:
  260. else if ( IsEqualIID( riid, IID_IClusCfgInitialize ) )
  261. {
  262. *ppv = TraceInterface( __THISCLASS__, IClusCfgInitialize, this, 0 );
  263. hr = S_OK;
  264. } // else if:
  265. else if ( IsEqualIID( riid, IID_IClusCfgLoadResource ) )
  266. {
  267. *ppv = TraceInterface( __THISCLASS__, IClusCfgLoadResource, this, 0 );
  268. hr = S_OK;
  269. } // else if:
  270. if ( SUCCEEDED( hr ) )
  271. {
  272. ((IUnknown *) *ppv)->AddRef( );
  273. } // if: success
  274. QIRETURN_IGNORESTDMARSHALLING( hr, riid );
  275. } //*** CClusterResource::QueryInterface()
  276. //*************************************************************************//
  277. /////////////////////////////////////////////////////////////////////////////
  278. // CClusterResource -- IClusCfgInitialize interface.
  279. /////////////////////////////////////////////////////////////////////////////
  280. //////////////////////////////////////////////////////////////////////////////
  281. //++
  282. //
  283. // CClusterResource::Initialize()
  284. //
  285. // Description:
  286. // Initialize this component.
  287. //
  288. // Arguments:
  289. // IN IUknown * punkCallbackIn
  290. //
  291. // IN LCID lcidIn
  292. //
  293. // Return Value:
  294. // S_OK
  295. // Success
  296. //
  297. // Remarks:
  298. // None.
  299. //
  300. //--
  301. //////////////////////////////////////////////////////////////////////////////
  302. STDMETHODIMP
  303. CClusterResource::Initialize(
  304. IUnknown * punkCallbackIn,
  305. LCID lcidIn
  306. )
  307. {
  308. TraceFunc( "[IClusCfgInitialize]" );
  309. Assert( m_picccCallback == NULL );
  310. HRESULT hr = S_OK;
  311. m_lcid = lcidIn;
  312. if ( punkCallbackIn == NULL )
  313. {
  314. hr = THR( E_POINTER );
  315. goto Cleanup;
  316. } // if:
  317. hr = THR( punkCallbackIn->TypeSafeQI( IClusCfgCallback, &m_picccCallback ) );
  318. Cleanup:
  319. HRETURN( hr );
  320. } //*** CClusterResource::Initialize()
  321. //*************************************************************************//
  322. /////////////////////////////////////////////////////////////////////////////
  323. // CClusterResource -- IClusCfgLoadResource interface.
  324. /////////////////////////////////////////////////////////////////////////////
  325. //////////////////////////////////////////////////////////////////////////////
  326. //++
  327. //
  328. // CClusterResource::LoadResource()
  329. //
  330. // Description:
  331. // Initialize this component from the cluster resource.
  332. //
  333. // Arguments:
  334. //
  335. // Return Value:
  336. // S_OK
  337. // Success
  338. //
  339. // Remarks:
  340. // None.
  341. //
  342. //--
  343. //////////////////////////////////////////////////////////////////////////////
  344. STDMETHODIMP
  345. CClusterResource::LoadResource(
  346. HCLUSTER hClusterIn,
  347. HRESOURCE hResourceIn
  348. )
  349. {
  350. TraceFunc( "[IClusCfgLoadResource]" );
  351. HRESULT hr = S_OK;
  352. DWORD sc;
  353. CClusPropList cpl;
  354. CLUSPROP_BUFFER_HELPER cpbh;
  355. sc = TW32( cpl.ScGetResourceProperties( hResourceIn, CLUSCTL_RESOURCE_GET_COMMON_PROPERTIES ) );
  356. if ( sc != ERROR_SUCCESS )
  357. {
  358. goto MakeHr;
  359. } // if:
  360. sc = TW32( cpl.ScMoveToPropertyByName( L"Description" ) );
  361. if ( sc != ERROR_SUCCESS )
  362. {
  363. goto MakeHr;
  364. } // if:
  365. cpbh = cpl.CbhCurrentValue();
  366. Assert( cpbh.pSyntax->dw == CLUSPROP_SYNTAX_LIST_VALUE_SZ );
  367. m_bstrDescription = TraceSysAllocString( cpbh.pStringValue->sz );
  368. if ( m_bstrDescription == NULL )
  369. {
  370. goto OutOfMemory;
  371. } // if:
  372. sc = TW32( cpl.ScMoveToPropertyByName( L"Name" ) );
  373. if ( sc != ERROR_SUCCESS )
  374. {
  375. goto MakeHr;
  376. } // if:
  377. cpbh = cpl.CbhCurrentValue();
  378. Assert( cpbh.pSyntax->dw == CLUSPROP_SYNTAX_LIST_VALUE_SZ );
  379. m_bstrName = TraceSysAllocString( cpbh.pStringValue->sz );
  380. if ( m_bstrName == NULL )
  381. {
  382. goto OutOfMemory;
  383. } // if:
  384. sc = TW32( cpl.ScMoveToPropertyByName( L"Type" ) );
  385. if ( sc != ERROR_SUCCESS )
  386. {
  387. goto MakeHr;
  388. } // if:
  389. cpbh = cpl.CbhCurrentValue();
  390. Assert( cpbh.pSyntax->dw == CLUSPROP_SYNTAX_LIST_VALUE_SZ );
  391. m_bstrType = TraceSysAllocString( cpbh.pStringValue->sz );
  392. if ( m_bstrType == NULL )
  393. {
  394. goto OutOfMemory;
  395. } // if:
  396. hr = THR( HrIsResourceQuorumCapabile( hResourceIn ) );
  397. if ( FAILED( hr ) )
  398. {
  399. goto Cleanup;
  400. } // if:
  401. else if ( hr == S_OK )
  402. {
  403. m_dwFlags |= eIsQuorumCapable;
  404. }
  405. // Do this only if the above is true i.e. Device quorum capable...
  406. if( hr == S_OK )
  407. {
  408. hr = THR( HrDetermineQuorumJoinable( hResourceIn ) );
  409. if ( FAILED( hr ) )
  410. {
  411. goto Cleanup;
  412. } // if:
  413. else if ( hr == S_OK )
  414. {
  415. m_dwFlags |= eIsQuorumJoinable;
  416. }
  417. }
  418. goto Cleanup;
  419. OutOfMemory:
  420. hr = THR( E_OUTOFMEMORY );
  421. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_LoadResource, IDS_ERROR_OUTOFMEMORY, hr );
  422. goto Cleanup;
  423. MakeHr:
  424. hr = HRESULT_FROM_WIN32( sc );
  425. Cleanup:
  426. HRETURN( hr );
  427. } //*** CClusterResource::LoadResource()
  428. //*************************************************************************//
  429. /////////////////////////////////////////////////////////////////////////////
  430. // CClusterResource -- IClusCfgManagedResourceInfo interface.
  431. /////////////////////////////////////////////////////////////////////////////
  432. #if 0 // DEAD CODE: GPease 27-JUL-2000 Method Removed
  433. /*
  434. //////////////////////////////////////////////////////////////////////////////
  435. //++
  436. //
  437. // CClusterResource::TransferInformation()
  438. //
  439. // Description:
  440. // Transfer node information from another source.
  441. //
  442. // Arguments:
  443. // IN IClusCfgManagedResourceInfo * pccmriIn
  444. //
  445. // Return Value:
  446. // S_OK
  447. // Success
  448. //
  449. // E_OUTOFMEMORY
  450. // Out of memory.
  451. //
  452. // Remarks:
  453. // none
  454. //
  455. //--
  456. //////////////////////////////////////////////////////////////////////////////
  457. STDMETHODIMP
  458. CClusterResource::TransferInformation(
  459. IClusCfgManagedResourceInfo * pccmriIn
  460. )
  461. {
  462. TraceFunc( "" );
  463. HRESULT hr = THR( E_NOTIMPL );
  464. HRETURN( hr );
  465. } //*** CClusterResource::TransferInformation()
  466. */
  467. #endif // End Dead Code
  468. //////////////////////////////////////////////////////////////////////////////
  469. //++
  470. //
  471. // CClusterResource::GetUID()
  472. //
  473. // Description:
  474. //
  475. // Arguments:
  476. //
  477. // Return Value:
  478. //
  479. // Remarks:
  480. // None.
  481. //
  482. //--
  483. //////////////////////////////////////////////////////////////////////////////
  484. STDMETHODIMP
  485. CClusterResource::GetUID( BSTR * pbstrUIDOut )
  486. {
  487. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  488. HRESULT hr = S_OK;
  489. if ( pbstrUIDOut == NULL )
  490. {
  491. hr = THR( E_POINTER );
  492. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_ClusterResource_GetUID_Pointer, IDS_ERROR_NULL_POINTER, hr );
  493. goto Cleanup;
  494. } // if:
  495. *pbstrUIDOut = SysAllocString( m_bstrName );
  496. if ( *pbstrUIDOut == NULL )
  497. {
  498. hr = THR( E_OUTOFMEMORY );
  499. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_ClusterResource_GetUID_Memory, IDS_ERROR_OUTOFMEMORY, hr );
  500. } // if:
  501. Cleanup:
  502. HRETURN( hr );
  503. } //*** CClusterResource::GetUID()
  504. //////////////////////////////////////////////////////////////////////////////
  505. //++
  506. //
  507. // CClusterResource::GetName()
  508. //
  509. // Description:
  510. //
  511. // Arguments:
  512. //
  513. // Return Value:
  514. //
  515. // Remarks:
  516. // None.
  517. //
  518. //--
  519. //////////////////////////////////////////////////////////////////////////////
  520. STDMETHODIMP
  521. CClusterResource::GetName( BSTR * pbstrNameOut )
  522. {
  523. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  524. HRESULT hr = S_OK;
  525. if ( pbstrNameOut != NULL )
  526. {
  527. hr = THR( E_POINTER );
  528. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetName_Pointer, IDS_ERROR_NULL_POINTER, hr );
  529. goto Cleanup;
  530. } // if:
  531. *pbstrNameOut = SysAllocString( m_bstrName );
  532. if ( *pbstrNameOut == NULL )
  533. {
  534. hr = THR( E_OUTOFMEMORY );
  535. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_GetName_Memory, IDS_ERROR_OUTOFMEMORY, hr );
  536. } // if:
  537. Cleanup:
  538. HRETURN( hr );
  539. } //*** CClusterResource::GetName()
  540. //////////////////////////////////////////////////////////////////////////////
  541. //++
  542. //
  543. // CClusterResource::SetName()
  544. //
  545. // Description:
  546. //
  547. // Arguments:
  548. //
  549. // Return Value:
  550. //
  551. // Remarks:
  552. // None.
  553. //
  554. //--
  555. //////////////////////////////////////////////////////////////////////////////
  556. STDMETHODIMP
  557. CClusterResource::SetName( BSTR bstrNameIn )
  558. {
  559. TraceFunc1( "[IClusCfgManagedResourceInfo] bstrNameIn = '%ls'", bstrNameIn == NULL ? L"<null>" : bstrNameIn );
  560. HRESULT hr = S_OK;
  561. if ( bstrNameIn == NULL )
  562. {
  563. hr = THR( E_INVALIDARG );
  564. goto Cleanup;
  565. } // if:
  566. TraceSysFreeString( m_bstrName );
  567. m_bstrName = NULL;
  568. m_bstrName = TraceSysAllocString( bstrNameIn );
  569. if ( m_bstrName == NULL )
  570. {
  571. hr = THR( E_OUTOFMEMORY );
  572. STATUS_REPORT( TASKID_Major_Find_Devices, TASKID_Minor_SetName_Cluster_Resource, IDS_ERROR_OUTOFMEMORY, hr );
  573. } // if:
  574. Cleanup:
  575. HRETURN( hr );
  576. } //*** CClusterResource::SetName()
  577. //////////////////////////////////////////////////////////////////////////////
  578. //++
  579. //
  580. // CClusterResource::IsManaged()
  581. //
  582. // Description:
  583. //
  584. // Arguments:
  585. //
  586. // Return Value:
  587. // S_OK
  588. // The device is managed.
  589. //
  590. // S_FALSE
  591. // The device is not managed.
  592. //
  593. // Win32 error as HRESULT when an error occurs.
  594. //
  595. // Remarks:
  596. // None.
  597. //
  598. //--
  599. //////////////////////////////////////////////////////////////////////////////
  600. STDMETHODIMP
  601. CClusterResource::IsManaged( void )
  602. {
  603. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  604. HRETURN( S_OK );
  605. } //*** CClusterResource::IsManaged()
  606. //////////////////////////////////////////////////////////////////////////////
  607. //++
  608. //
  609. // CClusterResource::SetManaged()
  610. //
  611. // Description:
  612. //
  613. // Arguments:
  614. //
  615. // Return Value:
  616. //
  617. // Remarks:
  618. // None.
  619. //
  620. //--
  621. //////////////////////////////////////////////////////////////////////////////
  622. STDMETHODIMP
  623. CClusterResource::SetManaged( BOOL fIsManagedIn )
  624. {
  625. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  626. HRESULT hr = THR( E_NOTIMPL );
  627. HRETURN( hr );
  628. } //*** CClusterResource::SetManaged()
  629. //////////////////////////////////////////////////////////////////////////////
  630. //++
  631. //
  632. // CClusterResource::IsQuorumDevice()
  633. //
  634. // Description:
  635. //
  636. // Arguments:
  637. //
  638. // Return Value:
  639. // S_OK
  640. // The device is the quorum device.
  641. //
  642. // S_FALSE
  643. // The device is not the quorum device.
  644. //
  645. // Win32 error as HRESULT when an error occurs.
  646. //
  647. // Remarks:
  648. // None.
  649. //
  650. //--
  651. //////////////////////////////////////////////////////////////////////////////
  652. STDMETHODIMP
  653. CClusterResource::IsQuorumDevice( void )
  654. {
  655. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  656. HRESULT hr = S_FALSE;
  657. if ( m_dwFlags & eIsQuorumDevice )
  658. {
  659. hr = S_OK;
  660. } // if:
  661. HRETURN( hr );
  662. } //*** CClusterResource::IsQuorumDevice()
  663. //////////////////////////////////////////////////////////////////////////////
  664. //++
  665. //
  666. // CClusterResource::SetQuorumedDevice()
  667. //
  668. // Description:
  669. //
  670. // Arguments:
  671. //
  672. // Return Value:
  673. //
  674. // Remarks:
  675. // None.
  676. //
  677. //--
  678. //////////////////////////////////////////////////////////////////////////////
  679. STDMETHODIMP
  680. CClusterResource::SetQuorumedDevice( BOOL fIsQuorumDeviceIn )
  681. {
  682. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  683. HRESULT hr = THR( E_NOTIMPL );
  684. HRETURN( hr );
  685. } //*** CClusterResource::SetQuorumedDevice()
  686. //////////////////////////////////////////////////////////////////////////////
  687. //++
  688. //
  689. // CClusterResource::IsDeviceJoinable()
  690. //
  691. // Description:
  692. // Does the Quorumable device allow other nodes to join.
  693. //
  694. // Arguments:
  695. //
  696. // Return Value:
  697. // S_OK
  698. // The device is joinable.
  699. //
  700. // S_FALSE
  701. // The device is not joinable.
  702. //
  703. // Win32 error as HRESULT when an error occurs.
  704. //
  705. // Remarks:
  706. // None.
  707. //
  708. //--
  709. //////////////////////////////////////////////////////////////////////////////
  710. STDMETHODIMP
  711. CClusterResource::IsDeviceJoinable( void )
  712. {
  713. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  714. HRESULT hr = S_FALSE;
  715. if ( m_dwFlags & eIsQuorumJoinable )
  716. {
  717. hr = S_OK;
  718. } // if:
  719. HRETURN( hr );
  720. } //*** CClusterResource::IsDeviceJoijnable()
  721. //////////////////////////////////////////////////////////////////////////////
  722. //++
  723. //
  724. // CClusterResource::SetDeviceJoinable()
  725. //
  726. // Description:
  727. // Set the joinable flag.
  728. //
  729. // Arguments:
  730. //
  731. // Return Value:
  732. // S_OK
  733. // The device is joinable.
  734. //
  735. // S_FALSE
  736. // The device is not joinable.
  737. //
  738. // Win32 error as HRESULT when an error occurs.
  739. //
  740. // Remarks:
  741. // This method should never be called.
  742. //
  743. //--
  744. //////////////////////////////////////////////////////////////////////////////
  745. STDMETHODIMP
  746. CClusterResource::SetDeviceJoinable( BOOL fIsJoinableIn )
  747. {
  748. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  749. HRETURN( THR( E_NOTIMPL ) );
  750. } //*** CClusterResource::SetDeviceJoijnable()
  751. //////////////////////////////////////////////////////////////////////////////
  752. //++
  753. //
  754. // CClusterResource::IsQuorumCapable()
  755. //
  756. // Description:
  757. //
  758. // Arguments:
  759. //
  760. // Return Value:
  761. // S_OK
  762. // The device is a quorum capable device.
  763. //
  764. // S_FALSE
  765. // The device is not a quorum capable device.
  766. //
  767. // Win32 error as HRESULT when an error occurs.
  768. //
  769. // Remarks:
  770. // None.
  771. //
  772. //--
  773. //////////////////////////////////////////////////////////////////////////////
  774. STDMETHODIMP
  775. CClusterResource::IsQuorumCapable( void )
  776. {
  777. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  778. HRESULT hr = S_FALSE;
  779. if ( m_dwFlags & eIsQuorumCapable )
  780. {
  781. hr = S_OK;
  782. } // if:
  783. HRETURN( hr );
  784. } //*** CClusterResource::IsQuorumCapable()
  785. //////////////////////////////////////////////////////////////////////////////
  786. //++
  787. //
  788. // CClusterResource::GetDriveLetterMappings()
  789. //
  790. // Description:
  791. //
  792. // Arguments:
  793. //
  794. // Return Value:
  795. //
  796. // Remarks:
  797. // None.
  798. //
  799. //--
  800. //////////////////////////////////////////////////////////////////////////////
  801. STDMETHODIMP
  802. CClusterResource::GetDriveLetterMappings(
  803. SDriveLetterMapping * pdlmDriveLetterMappingOut
  804. )
  805. {
  806. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  807. HRESULT hr = THR( E_NOTIMPL );
  808. HRETURN( hr );
  809. } //*** CClusterResource::GetDriveLetterMappings()
  810. //////////////////////////////////////////////////////////////////////////////
  811. //++
  812. //
  813. // CClusterResource::SetDriveLetterMappings()
  814. //
  815. // Description:
  816. //
  817. // Arguments:
  818. //
  819. // Return Value:
  820. //
  821. // Remarks:
  822. // None.
  823. //
  824. //--
  825. //////////////////////////////////////////////////////////////////////////////
  826. STDMETHODIMP
  827. CClusterResource::SetDriveLetterMappings(
  828. SDriveLetterMapping dlmDriveLetterMappingIn
  829. )
  830. {
  831. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  832. HRESULT hr = THR( E_NOTIMPL );
  833. HRETURN( hr );
  834. } //*** CClusterResource::SetDriveLetterMappings()
  835. //*************************************************************************//
  836. /////////////////////////////////////////////////////////////////////////////
  837. // CClusterResource class -- Private Methods.
  838. /////////////////////////////////////////////////////////////////////////////
  839. //////////////////////////////////////////////////////////////////////////////
  840. //++
  841. //
  842. // CClusterResource::HrInit()
  843. //
  844. // Description:
  845. // Initialize this component.
  846. //
  847. // Arguments:
  848. // None.
  849. //
  850. // Return Value:
  851. //
  852. //
  853. // Remarks:
  854. // None.
  855. //
  856. //--
  857. //////////////////////////////////////////////////////////////////////////////
  858. HRESULT
  859. CClusterResource::HrInit( void )
  860. {
  861. TraceFunc( "" );
  862. HRESULT hr = S_OK;
  863. HRETURN( hr );
  864. } //*** CClusterResource::HrInit()
  865. //////////////////////////////////////////////////////////////////////////////
  866. //++
  867. //
  868. // CClusterResource::HrIsResourceQuorumCapabile()
  869. //
  870. // Description:
  871. // Is this resource quorum capable?
  872. //
  873. // Arguments:
  874. // None.
  875. //
  876. // Return Value:
  877. //
  878. // S_OK
  879. // The resource is quorum capable.
  880. //
  881. // S_FALSE
  882. // The resource is not quorum capable.
  883. //
  884. // Other Win32 error as HRESULT.
  885. //
  886. // Remarks:
  887. // None.
  888. //
  889. //--
  890. //////////////////////////////////////////////////////////////////////////////
  891. HRESULT
  892. CClusterResource::HrIsResourceQuorumCapabile( HRESOURCE hResourceIn )
  893. {
  894. TraceFunc( "" );
  895. HRESULT hr = S_FALSE;
  896. DWORD sc;
  897. DWORD dwFlags;
  898. DWORD cbReturned;
  899. sc = TW32( ClusterResourceControl(
  900. hResourceIn,
  901. NULL,
  902. CLUSCTL_RESOURCE_GET_CHARACTERISTICS,
  903. &dwFlags,
  904. sizeof( dwFlags ),
  905. NULL,
  906. NULL,
  907. &cbReturned
  908. ) );
  909. if ( sc != ERROR_SUCCESS )
  910. {
  911. hr = HRESULT_FROM_WIN32( sc );
  912. goto Cleanup;
  913. } // if:
  914. if ( dwFlags & ( CLUS_CHAR_QUORUM | CLUS_CHAR_LOCAL_QUORUM | CLUS_CHAR_LOCAL_QUORUM_DEBUG ) )
  915. {
  916. hr = S_OK;
  917. } // if:
  918. Cleanup:
  919. HRETURN( hr );
  920. } //*** CClusterResource::HrIsResourceQuorumCapabile()
  921. //////////////////////////////////////////////////////////////////////////////
  922. //++
  923. //
  924. // CClusterResource::HrDetermineQuorumJoinable()
  925. //
  926. // Description:
  927. // Is this quorumable resource joinable?
  928. //
  929. // Arguments:
  930. // None.
  931. //
  932. // Return Value:
  933. //
  934. //
  935. // Remarks:
  936. // None.
  937. //
  938. //--
  939. //////////////////////////////////////////////////////////////////////////////
  940. HRESULT
  941. CClusterResource::HrDetermineQuorumJoinable( HRESOURCE hResourceIn )
  942. {
  943. TraceFunc( "" );
  944. HRESULT hr = S_FALSE;
  945. DWORD sc;
  946. DWORD dwFlags;
  947. DWORD cbReturned;
  948. sc = TW32( ClusterResourceControl(
  949. hResourceIn,
  950. NULL,
  951. CLUSCTL_RESOURCE_GET_CHARACTERISTICS,
  952. &dwFlags,
  953. sizeof( dwFlags ),
  954. NULL,
  955. NULL,
  956. &cbReturned
  957. ) );
  958. if ( sc != ERROR_SUCCESS )
  959. {
  960. hr = HRESULT_FROM_WIN32( sc );
  961. goto Cleanup;
  962. } // if:
  963. if ( dwFlags & (CLUS_CHAR_QUORUM|CLUS_CHAR_LOCAL_QUORUM_DEBUG))
  964. {
  965. hr = S_OK;
  966. } // if:
  967. Cleanup:
  968. HRETURN( hr );
  969. }