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.

1265 lines
28 KiB

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