Leaked source code of windows server 2003
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.

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