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.

1590 lines
36 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ManagedResource.cpp
  7. //
  8. // Description:
  9. // CManagedResource implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 22-NOV-1999
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "Pch.h"
  16. #include "ManagedResource.h"
  17. DEFINE_THISCLASS("CManagedResource")
  18. // ************************************************************************
  19. //
  20. // Constructor / Destructor
  21. //
  22. // ************************************************************************
  23. //////////////////////////////////////////////////////////////////////////////
  24. //++
  25. //
  26. // HRESULT
  27. // CManagedResource::S_HrCreateInstance(
  28. // IUnknown ** ppunkOut
  29. // )
  30. //
  31. //--
  32. //////////////////////////////////////////////////////////////////////////////
  33. HRESULT
  34. CManagedResource::S_HrCreateInstance(
  35. IUnknown ** ppunkOut
  36. )
  37. {
  38. TraceFunc( "" );
  39. HRESULT hr = S_OK;
  40. CManagedResource * pmr = NULL;
  41. Assert( ppunkOut != NULL );
  42. if ( ppunkOut == NULL )
  43. {
  44. hr = THR( E_POINTER );
  45. goto Cleanup;
  46. }
  47. pmr = new CManagedResource;
  48. if ( pmr == NULL )
  49. {
  50. hr = THR( E_OUTOFMEMORY );
  51. goto Cleanup;
  52. }
  53. hr = THR( pmr->HrInit() );
  54. if ( FAILED( hr ) )
  55. {
  56. goto Cleanup;
  57. }
  58. hr = THR( pmr->TypeSafeQI( IUnknown, ppunkOut ) );
  59. if ( FAILED( hr ) )
  60. {
  61. goto Cleanup;
  62. }
  63. Cleanup:
  64. if ( pmr != NULL )
  65. {
  66. pmr->Release();
  67. }
  68. HRETURN( hr );
  69. } //*** CManagedResource::S_HrCreateInstance
  70. //////////////////////////////////////////////////////////////////////////////
  71. //++
  72. //
  73. // CManagedResource::CManagedResource
  74. //
  75. //--
  76. //////////////////////////////////////////////////////////////////////////////
  77. CManagedResource::CManagedResource( void )
  78. : m_cRef( 1 )
  79. {
  80. TraceFunc( "" );
  81. InterlockedIncrement( &g_cObjects );
  82. TraceFuncExit();
  83. } //*** CManagedResource::CManagedResource
  84. //////////////////////////////////////////////////////////////////////////////
  85. //++
  86. //
  87. // STDMETHODIMP
  88. // CManagedResource::HrInit
  89. //
  90. //--
  91. //////////////////////////////////////////////////////////////////////////////
  92. STDMETHODIMP
  93. CManagedResource::HrInit( void )
  94. {
  95. TraceFunc( "" );
  96. HRESULT hr = S_OK;
  97. // IUnknown stuff
  98. Assert( m_cRef == 1 );
  99. // IClusCfgManagedResourceInfo
  100. Assert( m_bstrUID == NULL );
  101. Assert( m_bstrName == NULL );
  102. Assert( m_fHasNameChanged == FALSE );
  103. Assert( m_bstrType == NULL );
  104. Assert( m_fIsManaged == FALSE );
  105. Assert( m_fIsQuorumResource == FALSE );
  106. Assert( m_fIsQuorumCapable == FALSE );
  107. Assert( m_fIsQuorumResourceMultiNodeCapable == FALSE );
  108. Assert( m_pbPrivateData == NULL );
  109. Assert( m_cbPrivateData == 0 );
  110. Assert( m_cookieResourcePrivateData == 0 );
  111. Assert( m_cookieVerifyQuorum == 0 );
  112. Assert( m_dlmDriveLetterMapping.dluDrives[ 0 ] == dluUNKNOWN );
  113. // IExtendObjectManager
  114. Assert( m_pgit == NULL );
  115. hr = THR( CoCreateInstance( CLSID_StdGlobalInterfaceTable,
  116. NULL,
  117. CLSCTX_INPROC_SERVER,
  118. IID_IGlobalInterfaceTable,
  119. reinterpret_cast< void ** >( &m_pgit )
  120. ) );
  121. HRETURN( hr );
  122. } //*** CManagedResource::HrInit
  123. //////////////////////////////////////////////////////////////////////////////
  124. //++
  125. //
  126. // CManagedResource::~CManagedResource
  127. //
  128. //--
  129. //////////////////////////////////////////////////////////////////////////////
  130. CManagedResource::~CManagedResource( void )
  131. {
  132. TraceFunc( "" );
  133. TraceSysFreeString( m_bstrUID );
  134. TraceSysFreeString( m_bstrName );
  135. TraceSysFreeString( m_bstrType );
  136. TraceFree( m_pbPrivateData );
  137. if ( m_pgit != NULL )
  138. {
  139. if ( m_cookieResourcePrivateData != 0 )
  140. {
  141. //
  142. // TODO: 05-DEC-2001 GalenB
  143. //
  144. // These THRs are causing invalid parameter popups. Need to figure out why
  145. // this is happening, but since it is a shutdown it is not a pressing need.
  146. //
  147. /*THR*/( m_pgit->RevokeInterfaceFromGlobal( m_cookieResourcePrivateData ) );
  148. } // if:
  149. if ( m_cookieVerifyQuorum != 0 )
  150. {
  151. /*THR*/( m_pgit->RevokeInterfaceFromGlobal( m_cookieVerifyQuorum ) );
  152. } // if:
  153. m_pgit->Release();
  154. } // if:
  155. InterlockedDecrement( &g_cObjects );
  156. TraceFuncExit();
  157. } //*** CManagedResource::~CManagedResource
  158. // ************************************************************************
  159. //
  160. // IUnknown
  161. //
  162. // ************************************************************************
  163. //////////////////////////////////////////////////////////////////////////////
  164. //++
  165. //
  166. // CManagedResource::QueryInterface
  167. //
  168. // Description:
  169. // Query this object for the passed in interface.
  170. //
  171. // Arguments:
  172. // riidIn
  173. // Id of interface requested.
  174. //
  175. // ppvOut
  176. // Pointer to the requested interface.
  177. //
  178. // Return Value:
  179. // S_OK
  180. // If the interface is available on this object.
  181. //
  182. // E_NOINTERFACE
  183. // If the interface is not available.
  184. //
  185. // E_POINTER
  186. // ppvOut was NULL.
  187. //
  188. // Remarks:
  189. // None.
  190. //
  191. //--
  192. //////////////////////////////////////////////////////////////////////////////
  193. STDMETHODIMP
  194. CManagedResource::QueryInterface(
  195. REFIID riidIn
  196. , LPVOID * ppvOut
  197. )
  198. {
  199. TraceQIFunc( riidIn, ppvOut );
  200. HRESULT hr = S_OK;
  201. //
  202. // Validate arguments.
  203. //
  204. Assert( ppvOut != NULL );
  205. if ( ppvOut == NULL )
  206. {
  207. hr = THR( E_POINTER );
  208. goto Cleanup;
  209. }
  210. //
  211. // Handle known interfaces.
  212. //
  213. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  214. {
  215. *ppvOut = static_cast< IClusCfgManagedResourceInfo * >( this );
  216. } // if: IUnknown
  217. else if ( IsEqualIID( riidIn, IID_IClusCfgManagedResourceInfo ) )
  218. {
  219. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgManagedResourceInfo, this, 0 );
  220. } // else if: IClusCfgManagedResourceInfo
  221. else if ( IsEqualIID( riidIn, IID_IGatherData ) )
  222. {
  223. *ppvOut = TraceInterface( __THISCLASS__, IGatherData, this, 0 );
  224. } // else if: IGatherData
  225. else if ( IsEqualIID( riidIn, IID_IExtendObjectManager ) )
  226. {
  227. *ppvOut = TraceInterface( __THISCLASS__, IExtendObjectManager, this, 0 );
  228. } // else if: IGatherData
  229. else if ( IsEqualIID( riidIn, IID_IClusCfgManagedResourceData ) )
  230. {
  231. //
  232. // If this cookie is not 0 then the server object's interface is in the GIT and it
  233. // supported this interface. If the server object supported the interface then we
  234. // will too.
  235. //
  236. if ( m_cookieResourcePrivateData != 0 )
  237. {
  238. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgManagedResourceData, this, 0 );
  239. } // if:
  240. else
  241. {
  242. *ppvOut = NULL;
  243. hr = E_NOINTERFACE;
  244. } // else:
  245. } // else if: IClusCfgManagedResourceData
  246. else if ( IsEqualIID( riidIn, IID_IClusCfgVerifyQuorum ) )
  247. {
  248. //
  249. // If this cookie is not 0 then the server object's interface is in the GIT and it
  250. // supported this interface. If the server object supported the interface then we
  251. // will too.
  252. //
  253. if ( m_cookieVerifyQuorum != 0 )
  254. {
  255. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgVerifyQuorum, this, 0 );
  256. } // if:
  257. else
  258. {
  259. *ppvOut = NULL;
  260. hr = E_NOINTERFACE;
  261. } // else:
  262. } // else if: IClusCfgVerifyQuorum
  263. else
  264. {
  265. *ppvOut = NULL;
  266. hr = E_NOINTERFACE;
  267. }
  268. //
  269. // Add a reference to the interface if successful.
  270. //
  271. if ( SUCCEEDED( hr ) )
  272. {
  273. ((IUnknown *) *ppvOut)->AddRef();
  274. } // if: success
  275. Cleanup:
  276. //
  277. // Since we don't always want to support IClusCfgManagedResourceData then we
  278. // need to ignore it here since we don't want an errant pop-up complaining
  279. // to the user that this interface is not supported. It is expected that
  280. // we won't always support this interface.
  281. //
  282. QIRETURN_IGNORESTDMARSHALLING2(
  283. hr
  284. , riidIn
  285. , IID_IClusCfgManagedResourceData
  286. , IID_IClusCfgVerifyQuorum
  287. );
  288. } //*** CManagedResource::QueryInterface
  289. //////////////////////////////////////////////////////////////////////////////
  290. //++
  291. //
  292. // STDMETHODIMP_( ULONG )
  293. // CManagedResource::AddRef
  294. //
  295. //--
  296. //////////////////////////////////////////////////////////////////////////////
  297. STDMETHODIMP_( ULONG )
  298. CManagedResource::AddRef( void )
  299. {
  300. TraceFunc( "[IUnknown]" );
  301. InterlockedIncrement( &m_cRef );
  302. CRETURN( m_cRef );
  303. } //*** CManagedResource::AddRef
  304. //////////////////////////////////////////////////////////////////////////////
  305. //++
  306. //
  307. // STDMETHODIMP_( ULONG )
  308. // CManagedResource::Release
  309. //
  310. //--
  311. //////////////////////////////////////////////////////////////////////////////
  312. STDMETHODIMP_( ULONG )
  313. CManagedResource::Release( void )
  314. {
  315. TraceFunc( "[IUnknown]" );
  316. LONG cRef;
  317. cRef = InterlockedDecrement( &m_cRef );
  318. if ( cRef == 0 )
  319. {
  320. TraceDo( delete this );
  321. }
  322. CRETURN( cRef );
  323. } //*** CManagedResource::Release
  324. // ************************************************************************
  325. //
  326. // IClusCfgManagedResourceInfo
  327. //
  328. // ************************************************************************
  329. ///////////////////////////////////////////////////////////////////////////////
  330. //++
  331. //
  332. // STDMETHODIMP
  333. // CManagedResource::GetUID(
  334. // BSTR * pbstrUIDOut
  335. // )
  336. //
  337. //--
  338. ///////////////////////////////////////////////////////////////////////////////
  339. STDMETHODIMP
  340. CManagedResource::GetUID(
  341. BSTR * pbstrUIDOut
  342. )
  343. {
  344. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  345. HRESULT hr = S_OK;
  346. if ( pbstrUIDOut == NULL )
  347. {
  348. hr = THR( E_POINTER );
  349. goto Cleanup;
  350. }
  351. if ( m_bstrUID == NULL )
  352. {
  353. hr = THR( E_POINTER );
  354. goto Cleanup;
  355. }
  356. *pbstrUIDOut = SysAllocString( m_bstrUID );
  357. if ( *pbstrUIDOut == NULL )
  358. {
  359. hr = THR( E_OUTOFMEMORY );
  360. goto Cleanup;
  361. }
  362. Cleanup:
  363. HRETURN( hr );
  364. } //*** CManagedResource::GetUID
  365. ///////////////////////////////////////////////////////////////////////////////
  366. //++
  367. //
  368. // STDMETHODIMP
  369. // CManagedResource::GetName(
  370. // BSTR * pbstrNameOut
  371. // )
  372. //
  373. //--
  374. ///////////////////////////////////////////////////////////////////////////////
  375. STDMETHODIMP
  376. CManagedResource::GetName(
  377. BSTR * pbstrNameOut
  378. )
  379. {
  380. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  381. HRESULT hr = S_OK;
  382. if ( pbstrNameOut == NULL )
  383. {
  384. hr = THR( E_POINTER );
  385. goto Cleanup;
  386. }
  387. if ( m_bstrName == NULL )
  388. {
  389. hr = THR( E_POINTER );
  390. goto Cleanup;
  391. }
  392. *pbstrNameOut = SysAllocString( m_bstrName );
  393. if ( *pbstrNameOut == NULL )
  394. {
  395. hr = THR( E_OUTOFMEMORY );
  396. goto Cleanup;
  397. }
  398. Cleanup:
  399. HRETURN( hr );
  400. } //*** CManagedResource::GetName
  401. ///////////////////////////////////////////////////////////////////////////////
  402. //++
  403. //
  404. // STDMETHODIMP
  405. // CManagedResource::SetName(
  406. // BSTR bstrNameIn
  407. // )
  408. //
  409. //--
  410. ///////////////////////////////////////////////////////////////////////////////
  411. STDMETHODIMP
  412. CManagedResource::SetName(
  413. LPCWSTR pcszNameIn
  414. )
  415. {
  416. TraceFunc1( "[IClusCfgManagedResourceInfo] pcszNameIn = '%ws'", ( pcszNameIn == NULL ? L"<null>" : pcszNameIn ) );
  417. HRESULT hr = S_OK; // Bug #294649
  418. BSTR bstrNewName;
  419. if ( pcszNameIn == NULL )
  420. {
  421. hr = THR( E_INVALIDARG );
  422. goto Cleanup;
  423. }
  424. bstrNewName = TraceSysAllocString( pcszNameIn );
  425. if ( bstrNewName == NULL )
  426. {
  427. hr = THR( E_OUTOFMEMORY );
  428. goto Cleanup;
  429. }
  430. if ( m_bstrName != NULL )
  431. {
  432. TraceSysFreeString( m_bstrName );
  433. }
  434. m_bstrName = bstrNewName;
  435. m_fHasNameChanged = TRUE;
  436. Cleanup:
  437. HRETURN( hr );
  438. } //*** CManagedResource::SetName
  439. ///////////////////////////////////////////////////////////////////////////////
  440. //++
  441. //
  442. // STDMETHODIMP
  443. // CManagedResource::IsManaged
  444. //
  445. //--
  446. ///////////////////////////////////////////////////////////////////////////////
  447. STDMETHODIMP
  448. CManagedResource::IsManaged( void )
  449. {
  450. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  451. HRESULT hr;
  452. if ( m_fIsManaged )
  453. {
  454. hr = S_OK;
  455. }
  456. else
  457. {
  458. hr = S_FALSE;
  459. }
  460. HRETURN( hr );
  461. } //*** CManagedResource::IsManaged
  462. ///////////////////////////////////////////////////////////////////////////////
  463. //++
  464. //
  465. // STDMETHODIMP
  466. // CManagedResource::SetManaged(
  467. // BOOL fIsManagedIn
  468. // )
  469. //
  470. //--
  471. ///////////////////////////////////////////////////////////////////////////////
  472. STDMETHODIMP
  473. CManagedResource::SetManaged(
  474. BOOL fIsManagedIn
  475. )
  476. {
  477. TraceFunc1( "[IClusCfgManagedResourceInfo] fIsManagedIn = '%s'", BOOLTOSTRING( fIsManagedIn ) );
  478. m_fIsManaged = fIsManagedIn;
  479. HRETURN( S_OK );
  480. } //*** CManagedResource::SetManaged
  481. ///////////////////////////////////////////////////////////////////////////////
  482. //++
  483. //
  484. // STDMETHODIMP
  485. // CManagedResource::IsQuorumResource
  486. //
  487. //--
  488. ///////////////////////////////////////////////////////////////////////////////
  489. STDMETHODIMP
  490. CManagedResource::IsQuorumResource( void )
  491. {
  492. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  493. HRESULT hr;
  494. if ( m_fIsQuorumResource )
  495. {
  496. hr = S_OK;
  497. }
  498. else
  499. {
  500. hr = S_FALSE;
  501. }
  502. HRETURN( hr );
  503. } //*** CManagedResource::IsQuorumResource
  504. ///////////////////////////////////////////////////////////////////////////////
  505. //++
  506. //
  507. // STDMETHODIMP
  508. // CManagedResource::SetQuorumResource(
  509. // BOOL fIsQuorumResourceIn
  510. // )
  511. //
  512. //--
  513. ///////////////////////////////////////////////////////////////////////////////
  514. STDMETHODIMP
  515. CManagedResource::SetQuorumResource(
  516. BOOL fIsQuorumResourceIn
  517. )
  518. {
  519. TraceFunc1( "[IClusCfgManagedResourceInfo] fIsQuorumResourceIn = '%ws'", BOOLTOSTRING( fIsQuorumResourceIn ) );
  520. //
  521. // Since this is a client side proxy object for a server object there is no need
  522. // to validate this input. It will be validated by the server object if, and when,
  523. // we send it down to the server...
  524. //
  525. m_fIsQuorumResource = fIsQuorumResourceIn;
  526. HRETURN( S_OK );
  527. } //*** CManagedResource::SetQuorumResource
  528. ///////////////////////////////////////////////////////////////////////////////
  529. //++
  530. //
  531. // STDMETHODIMP
  532. // CManagedResource::IsQuorumCapable
  533. //
  534. //--
  535. ///////////////////////////////////////////////////////////////////////////////
  536. STDMETHODIMP
  537. CManagedResource::IsQuorumCapable( void )
  538. {
  539. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  540. HRESULT hr;
  541. if ( m_fIsQuorumCapable )
  542. {
  543. hr = S_OK;
  544. } // if:
  545. else
  546. {
  547. hr = S_FALSE;
  548. } // else:
  549. HRETURN( hr );
  550. } //*** CManagedResource::IsQuorumCapable
  551. ///////////////////////////////////////////////////////////////////////////////
  552. //++
  553. //
  554. // STDMETHODIMP
  555. // CManagedResource::SetQuorumCapable
  556. //
  557. //--
  558. ///////////////////////////////////////////////////////////////////////////////
  559. STDMETHODIMP
  560. CManagedResource::SetQuorumCapable(
  561. BOOL fIsQuorumCapableIn
  562. )
  563. {
  564. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  565. HRESULT hr = S_OK;
  566. m_fIsQuorumCapable = fIsQuorumCapableIn;
  567. HRETURN( hr );
  568. } //*** CManagedResource::SetQuorumCapable
  569. ///////////////////////////////////////////////////////////////////////////////
  570. //++
  571. //
  572. // STDMETHODIMP
  573. // CManagedResource::GetDriveLetterMappings(
  574. // SDriveLetterMapping * pdlmDriveLetterMappingOut
  575. // )
  576. //
  577. //--
  578. ///////////////////////////////////////////////////////////////////////////////
  579. STDMETHODIMP
  580. CManagedResource::GetDriveLetterMappings(
  581. SDriveLetterMapping * pdlmDriveLetterMappingOut
  582. )
  583. {
  584. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  585. *pdlmDriveLetterMappingOut = m_dlmDriveLetterMapping;
  586. HRETURN( S_OK );
  587. } //*** CManagedResource::GetDriveLetterMappings
  588. ///////////////////////////////////////////////////////////////////////////////
  589. //++
  590. //
  591. // STDMETHODIMP
  592. // CManagedResource::SetDriveLetterMappings(
  593. // SDriveLetterMapping dlmDriveLetterMappingIn
  594. // )
  595. //
  596. //--
  597. ///////////////////////////////////////////////////////////////////////////////
  598. STDMETHODIMP
  599. CManagedResource::SetDriveLetterMappings(
  600. SDriveLetterMapping dlmDriveLetterMappingIn
  601. )
  602. {
  603. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  604. m_dlmDriveLetterMapping = dlmDriveLetterMappingIn;
  605. HRETURN( S_OK );
  606. } //*** CManagedResource::SetDriveLetterMappings
  607. ///////////////////////////////////////////////////////////////////////////////
  608. //++
  609. //
  610. // STDMETHODIMP
  611. // CManagedResource::IsManagedByDefault
  612. //
  613. //--
  614. ///////////////////////////////////////////////////////////////////////////////
  615. STDMETHODIMP
  616. CManagedResource::IsManagedByDefault( void )
  617. {
  618. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  619. HRESULT hr;
  620. if ( m_fIsManagedByDefault )
  621. {
  622. hr = S_OK;
  623. }
  624. else
  625. {
  626. hr = S_FALSE;
  627. }
  628. HRETURN( hr );
  629. } //*** CManagedResource::IsManagedByDefault
  630. ///////////////////////////////////////////////////////////////////////////////
  631. //++
  632. //
  633. // STDMETHODIMP
  634. // CManagedResource::SetManagedByDefault(
  635. // BOOL fIsManagedByDefaultIn
  636. // )
  637. //
  638. //--
  639. ///////////////////////////////////////////////////////////////////////////////
  640. STDMETHODIMP
  641. CManagedResource::SetManagedByDefault(
  642. BOOL fIsManagedByDefaultIn
  643. )
  644. {
  645. TraceFunc1( "[IClusCfgManagedResourceInfo] fIsManagedByDefaultIn = '%s'", BOOLTOSTRING( fIsManagedByDefaultIn ) );
  646. m_fIsManagedByDefault = fIsManagedByDefaultIn;
  647. HRETURN( S_OK );
  648. } //*** CManagedResource::SetManagedByDefault
  649. //****************************************************************************
  650. //
  651. // IGatherData
  652. //
  653. //****************************************************************************
  654. //////////////////////////////////////////////////////////////////////////////
  655. //++
  656. //
  657. // CManagedResource::Gather
  658. //
  659. //--
  660. //////////////////////////////////////////////////////////////////////////////
  661. STDMETHODIMP
  662. CManagedResource::Gather(
  663. OBJECTCOOKIE cookieParentIn
  664. , IUnknown * punkIn
  665. )
  666. {
  667. TraceFunc( "[IGatherData]" );
  668. HRESULT hr;
  669. IClusCfgManagedResourceInfo * pccmri = NULL;
  670. IClusCfgManagedResourceData * piccmrd = NULL;
  671. BYTE * pbBuffer = NULL;
  672. DWORD cbBuffer = 0;
  673. IClusCfgVerifyQuorum * piccvq = NULL;
  674. //
  675. // Check parameters
  676. //
  677. if ( punkIn == NULL )
  678. {
  679. hr = THR( E_INVALIDARG );
  680. goto Cleanup;
  681. }
  682. //
  683. // Find the inteface we need to gather our info.
  684. //
  685. hr = THR( punkIn->TypeSafeQI( IClusCfgManagedResourceInfo, &pccmri ) );
  686. if ( FAILED( hr ) )
  687. {
  688. goto Cleanup;
  689. }
  690. //
  691. // Gather UID
  692. //
  693. hr = THR( pccmri->GetUID( &m_bstrUID ) );
  694. if ( FAILED( hr ) )
  695. {
  696. goto Error;
  697. }
  698. TraceMemoryAddBSTR( m_bstrUID );
  699. //
  700. // Gather Name
  701. //
  702. hr = THR( pccmri->GetName( &m_bstrName ) );
  703. if ( FAILED( hr ) )
  704. {
  705. goto Error;
  706. }
  707. TraceMemoryAddBSTR( m_bstrName );
  708. //
  709. // Gather IsManaged
  710. //
  711. hr = STHR( pccmri->IsManaged() );
  712. if ( FAILED( hr ) )
  713. {
  714. goto Error;
  715. }
  716. if ( hr == S_OK )
  717. {
  718. m_fIsManaged = TRUE;
  719. }
  720. else
  721. {
  722. m_fIsManaged = FALSE;
  723. }
  724. //
  725. // Gather IsManagedByDefault
  726. //
  727. hr = STHR( pccmri->IsManagedByDefault() );
  728. if ( FAILED( hr ) )
  729. {
  730. goto Error;
  731. }
  732. if ( hr == S_OK )
  733. {
  734. m_fIsManagedByDefault = TRUE;
  735. }
  736. else
  737. {
  738. m_fIsManagedByDefault = FALSE;
  739. }
  740. //
  741. // Gather Quorum Capable
  742. //
  743. hr = STHR( pccmri->IsQuorumCapable() );
  744. if ( FAILED( hr ) )
  745. {
  746. goto Error;
  747. }
  748. if ( hr == S_OK )
  749. {
  750. m_fIsQuorumCapable = TRUE;
  751. }
  752. else
  753. {
  754. m_fIsQuorumCapable = FALSE;
  755. }
  756. //
  757. // Gather if resource is the quorum resource.
  758. //
  759. hr = STHR( pccmri->IsQuorumResource() );
  760. if ( FAILED( hr ) )
  761. {
  762. goto Cleanup;
  763. }
  764. if ( hr == S_OK )
  765. {
  766. m_fIsQuorumResource = TRUE;
  767. }
  768. else
  769. {
  770. m_fIsQuorumResource = FALSE;
  771. }
  772. //
  773. // Gather Device Mappings
  774. //
  775. hr = STHR( pccmri->GetDriveLetterMappings( &m_dlmDriveLetterMapping ) );
  776. if ( FAILED( hr ) )
  777. goto Error;
  778. if ( hr == S_FALSE )
  779. {
  780. // Make sure this is nuked
  781. ZeroMemory( &m_dlmDriveLetterMapping, sizeof(m_dlmDriveLetterMapping) );
  782. }
  783. //
  784. // Gather the resource's private data, if it supports it...
  785. //
  786. hr = punkIn->TypeSafeQI( IClusCfgManagedResourceData, &piccmrd );
  787. if ( hr == E_NOINTERFACE )
  788. {
  789. hr = S_OK;
  790. } // if:
  791. else if ( FAILED( hr ) )
  792. {
  793. THR( hr );
  794. goto Error;
  795. } // if:
  796. else
  797. {
  798. if ( m_cookieResourcePrivateData != 0 )
  799. {
  800. hr = THR( m_pgit->RevokeInterfaceFromGlobal( m_cookieResourcePrivateData ) );
  801. if ( FAILED( hr ) )
  802. {
  803. goto Cleanup;
  804. } // if:
  805. m_cookieResourcePrivateData = 0;
  806. } // if:
  807. hr = THR( m_pgit->RegisterInterfaceInGlobal( piccmrd, IID_IClusCfgManagedResourceData, &m_cookieResourcePrivateData ) );
  808. if ( FAILED( hr ) )
  809. {
  810. goto Cleanup;
  811. } // if:
  812. Assert( m_pbPrivateData == NULL );
  813. cbBuffer = 512; // pick some reasonable starting value
  814. pbBuffer = (BYTE *) TraceAlloc( 0, cbBuffer );
  815. if ( pbBuffer == NULL )
  816. {
  817. hr = THR( E_OUTOFMEMORY );
  818. goto Cleanup;
  819. } // if:
  820. hr = piccmrd->GetResourcePrivateData( pbBuffer, &cbBuffer );
  821. if ( hr == HR_RPC_INSUFFICIENT_BUFFER )
  822. {
  823. TraceFree( pbBuffer );
  824. pbBuffer = NULL;
  825. pbBuffer = (BYTE *) TraceAlloc( 0, cbBuffer );
  826. if ( pbBuffer == NULL )
  827. {
  828. hr = THR( E_OUTOFMEMORY );
  829. goto Cleanup;
  830. } // if:
  831. hr = piccmrd->GetResourcePrivateData( pbBuffer, &cbBuffer );
  832. } // if:
  833. if ( hr == S_OK )
  834. {
  835. m_pbPrivateData = pbBuffer;
  836. m_cbPrivateData = cbBuffer;
  837. pbBuffer = NULL; // give away ownership
  838. } // if:
  839. else if ( hr == S_FALSE )
  840. {
  841. hr = S_OK;
  842. } // else if:
  843. else
  844. {
  845. THR( hr );
  846. goto Error;
  847. } // else:
  848. } // else:
  849. //
  850. // Gather the resource's verify quorum interface, if it supports it...
  851. //
  852. hr = punkIn->TypeSafeQI( IClusCfgVerifyQuorum, &piccvq );
  853. if ( hr == E_NOINTERFACE )
  854. {
  855. hr = S_OK;
  856. } // if:
  857. else if ( FAILED( hr ) )
  858. {
  859. THR( hr );
  860. goto Error;
  861. } // if:
  862. else
  863. {
  864. if ( m_cookieVerifyQuorum != 0 )
  865. {
  866. hr = THR( m_pgit->RevokeInterfaceFromGlobal( m_cookieVerifyQuorum ) );
  867. if ( FAILED( hr ) )
  868. {
  869. goto Cleanup;
  870. } // if:
  871. m_cookieVerifyQuorum = 0;
  872. } // if:
  873. hr = THR( m_pgit->RegisterInterfaceInGlobal( piccvq, IID_IClusCfgVerifyQuorum, &m_cookieVerifyQuorum ) );
  874. if ( FAILED( hr ) )
  875. {
  876. goto Cleanup;
  877. } // if:
  878. //
  879. // If this resource is quorum capable then gather its multi node support.
  880. //
  881. if ( m_fIsQuorumCapable )
  882. {
  883. //
  884. // Does this quorum resource support multi node clusters?
  885. //
  886. hr = STHR( piccvq->IsMultiNodeCapable() );
  887. if ( FAILED( hr ) )
  888. {
  889. goto Error;
  890. }
  891. if ( hr == S_OK )
  892. {
  893. m_fIsQuorumResourceMultiNodeCapable = TRUE;
  894. }
  895. else
  896. {
  897. m_fIsQuorumResourceMultiNodeCapable = FALSE;
  898. }
  899. } // if: device is quorum capable
  900. else
  901. {
  902. m_fIsQuorumResourceMultiNodeCapable = FALSE;
  903. }
  904. } // else:
  905. //
  906. // Anything else to gather??
  907. //
  908. hr = S_OK;
  909. goto Cleanup;
  910. Error:
  911. //
  912. // On error, invalidate all data.
  913. //
  914. TraceSysFreeString( m_bstrUID );
  915. m_bstrUID = NULL;
  916. TraceSysFreeString( m_bstrName );
  917. m_bstrName = NULL;
  918. TraceSysFreeString( m_bstrType );
  919. m_bstrType = NULL;
  920. m_fIsManaged = FALSE;
  921. m_fIsQuorumCapable = FALSE;
  922. m_fIsQuorumResourceMultiNodeCapable = FALSE;
  923. m_fIsQuorumResource = FALSE;
  924. ZeroMemory( &m_dlmDriveLetterMapping, sizeof( m_dlmDriveLetterMapping ) );
  925. Cleanup:
  926. if ( piccvq != NULL )
  927. {
  928. piccvq->Release();
  929. } // if:
  930. if ( piccmrd != NULL )
  931. {
  932. piccmrd->Release();
  933. } // if:
  934. if ( pccmri != NULL )
  935. {
  936. pccmri->Release();
  937. } // if:
  938. TraceFree( pbBuffer );
  939. HRETURN( hr );
  940. } //*** CManagedResource::Gather
  941. // ************************************************************************
  942. //
  943. // IExtendObjectManager
  944. //
  945. // ************************************************************************
  946. //////////////////////////////////////////////////////////////////////////////
  947. //++
  948. //
  949. // STDMETHODIMP
  950. // CManagedResource::FindObject(
  951. // OBJECTCOOKIE cookieIn
  952. // , REFCLSID rclsidTypeIn
  953. // , LPCWSTR pcszNameIn
  954. // , LPUNKNOWN * punkOut
  955. // )
  956. //
  957. //--
  958. //////////////////////////////////////////////////////////////////////////////
  959. STDMETHODIMP
  960. CManagedResource::FindObject(
  961. OBJECTCOOKIE cookieIn
  962. , REFCLSID rclsidTypeIn
  963. , LPCWSTR pcszNameIn
  964. , LPUNKNOWN * ppunkOut
  965. )
  966. {
  967. TraceFunc( "[IExtendObjectManager]" );
  968. HRESULT hr = S_OK;
  969. //
  970. // Validate arguments.
  971. //
  972. if ( cookieIn == 0 )
  973. {
  974. hr = THR( E_INVALIDARG );
  975. goto Cleanup;
  976. }
  977. if ( rclsidTypeIn != CLSID_ManagedResourceType )
  978. {
  979. hr = THR( E_INVALIDARG );
  980. goto Cleanup;
  981. }
  982. if ( pcszNameIn == NULL )
  983. {
  984. hr = THR( E_INVALIDARG );
  985. goto Cleanup;
  986. }
  987. if ( ppunkOut == NULL )
  988. {
  989. hr = THR( E_POINTER );
  990. goto Cleanup;
  991. }
  992. hr = THR( QueryInterface( DFGUID_ManagedResource, reinterpret_cast< void ** >( ppunkOut ) ) );
  993. if ( FAILED( hr ) )
  994. {
  995. goto Cleanup;
  996. }
  997. hr = S_OK;
  998. Cleanup:
  999. HRETURN( hr );
  1000. } //*** CManagedResource::FindObject
  1001. // ************************************************************************
  1002. //
  1003. // IClusCfgManagedResourceData
  1004. //
  1005. // ************************************************************************
  1006. //////////////////////////////////////////////////////////////////////////////
  1007. //++
  1008. //
  1009. // CManagedResource::GetResourcePrivateData
  1010. //
  1011. // Description:
  1012. // Return the private data for this resource when it is hosted on the
  1013. // cluster.
  1014. //
  1015. // Arguments:
  1016. // pbBufferOut
  1017. //
  1018. // pcbBufferInout
  1019. //
  1020. // Return Value:
  1021. // S_OK
  1022. // Success
  1023. //
  1024. // S_FALSE
  1025. // No data available.
  1026. //
  1027. // ERROR_INSUFFICIENT_BUFFER as an HRESULT
  1028. // When the passed in buffer is too small to hold the data.
  1029. // pcbBufferOutIn will contain the size required.
  1030. //
  1031. // Win32 error as HRESULT when an error occurs.
  1032. //
  1033. //--
  1034. //////////////////////////////////////////////////////////////////////////////
  1035. STDMETHODIMP
  1036. CManagedResource::GetResourcePrivateData(
  1037. BYTE * pbBufferOut
  1038. , DWORD * pcbBufferInout
  1039. )
  1040. {
  1041. TraceFunc( "[IClusCfgManagedResourceData]" );
  1042. Assert( pcbBufferInout != NULL );
  1043. HRESULT hr = S_OK;
  1044. DWORD cb;
  1045. if ( pcbBufferInout == NULL )
  1046. {
  1047. hr = THR( E_POINTER );
  1048. goto Cleanup;
  1049. } // if:
  1050. //
  1051. // There might not be any actual private data for the resource
  1052. // that we are proxying for. All Middle Tier objects will
  1053. // support the IClusCfgManagedResourceData interface, even
  1054. // if the server side object does not. S_FALSE is the way
  1055. // to indicate in the Middle Tier that there is no data
  1056. // available.
  1057. //
  1058. if ( ( m_pbPrivateData == NULL ) || ( m_cbPrivateData == 0 ) )
  1059. {
  1060. hr = S_FALSE;
  1061. goto Cleanup;
  1062. } // if:
  1063. //
  1064. // Save off the input buffer size.
  1065. //
  1066. cb = *pcbBufferInout;
  1067. //
  1068. // Set the out param buffer size since we always want
  1069. // to return it.
  1070. //
  1071. *pcbBufferInout = m_cbPrivateData;
  1072. if ( cb >= m_cbPrivateData )
  1073. {
  1074. Assert( pbBufferOut != NULL );
  1075. CopyMemory( pbBufferOut, m_pbPrivateData, m_cbPrivateData );
  1076. } // if:
  1077. else
  1078. {
  1079. hr = HR_RPC_INSUFFICIENT_BUFFER;
  1080. } // else:
  1081. Cleanup:
  1082. HRETURN( hr );
  1083. } //*** CManagedResource::GetResourcePrivateData
  1084. //////////////////////////////////////////////////////////////////////////////
  1085. //++
  1086. //
  1087. // CManagedResource::SetResourcePrivateData
  1088. //
  1089. // Description:
  1090. // Accept the private data for this resource from another hosted instance
  1091. // when this node is being added to the cluster.
  1092. //
  1093. // Arguments:
  1094. // pcbBufferIn
  1095. //
  1096. // cbBufferIn
  1097. //
  1098. // Return Value:
  1099. // S_OK
  1100. // Success
  1101. //
  1102. // Win32 error as HRESULT when an error occurs.
  1103. //
  1104. //--
  1105. //////////////////////////////////////////////////////////////////////////////
  1106. STDMETHODIMP
  1107. CManagedResource::SetResourcePrivateData(
  1108. const BYTE * pcbBufferIn
  1109. , DWORD cbBufferIn
  1110. )
  1111. {
  1112. TraceFunc( "[IClusCfgManagedResourceData]" );
  1113. Assert( pcbBufferIn != NULL );
  1114. Assert( cbBufferIn > 0 );
  1115. Assert( m_cookieResourcePrivateData != 0 );
  1116. Assert( m_pgit != NULL );
  1117. HRESULT hr = S_OK;
  1118. BYTE * pb = NULL;
  1119. IClusCfgManagedResourceData * piccmrd = NULL;
  1120. if ( ( pcbBufferIn == NULL ) || ( cbBufferIn == 0 ) )
  1121. {
  1122. hr = THR( E_INVALIDARG );
  1123. goto Cleanup;
  1124. } // if:
  1125. pb = (BYTE * ) TraceAlloc( 0, cbBufferIn );
  1126. if ( pb == NULL )
  1127. {
  1128. hr = THR( E_OUTOFMEMORY );
  1129. goto Cleanup;
  1130. } // if:
  1131. CopyMemory( pb, pcbBufferIn, cbBufferIn );
  1132. if ( ( m_pbPrivateData != NULL ) && ( m_cbPrivateData > 0 ) )
  1133. {
  1134. TraceFree( m_pbPrivateData );
  1135. } // if:
  1136. m_pbPrivateData = pb;
  1137. m_cbPrivateData = cbBufferIn;
  1138. //
  1139. // Now push the new data down to the server side object.
  1140. //
  1141. hr = THR( m_pgit->GetInterfaceFromGlobal( m_cookieResourcePrivateData, TypeSafeParams( IClusCfgManagedResourceData, &piccmrd ) ) );
  1142. if ( FAILED( hr ) )
  1143. {
  1144. goto Cleanup;
  1145. } // if:
  1146. hr = THR( piccmrd->SetResourcePrivateData( m_pbPrivateData, m_cbPrivateData ) );
  1147. if ( FAILED( hr ) )
  1148. {
  1149. goto Cleanup;
  1150. } // if:
  1151. Cleanup:
  1152. if ( piccmrd != NULL )
  1153. {
  1154. piccmrd->Release();
  1155. } // if:
  1156. HRETURN( hr );
  1157. } //*** CManagedResource::SetResourcePrivateData
  1158. // ************************************************************************
  1159. //
  1160. // IClusCfgVerifyQuorum
  1161. //
  1162. // ************************************************************************
  1163. //////////////////////////////////////////////////////////////////////////////
  1164. //++
  1165. //
  1166. // CManagedResource::PrepareToHostQuorumResource
  1167. //
  1168. // Description:
  1169. // Do any configuration necessary in preparation for this node hosting
  1170. // the quorum.
  1171. //
  1172. // In this class we need to ensure that we can connect to the proper
  1173. // disk share. The data about what share to connect to should have
  1174. // already been set using SetResourcePrivateData() above.
  1175. //
  1176. // Arguments:
  1177. // None.
  1178. //
  1179. // Return Value:
  1180. // S_OK
  1181. // Success
  1182. //
  1183. // Win32 error as HRESULT when an error occurs.
  1184. //
  1185. //--
  1186. //////////////////////////////////////////////////////////////////////////////
  1187. STDMETHODIMP
  1188. CManagedResource::PrepareToHostQuorumResource( void )
  1189. {
  1190. TraceFunc( "[IClusCfgVerifyQuorum]" );
  1191. Assert( m_cookieVerifyQuorum != 0 );
  1192. Assert( m_pgit != NULL );
  1193. HRESULT hr = S_OK;
  1194. IClusCfgVerifyQuorum * piccvq = NULL;
  1195. //
  1196. // Get the interface to the server object from the GIT.
  1197. //
  1198. hr = THR( m_pgit->GetInterfaceFromGlobal( m_cookieVerifyQuorum, TypeSafeParams( IClusCfgVerifyQuorum, &piccvq ) ) );
  1199. if ( FAILED( hr ) )
  1200. {
  1201. goto Cleanup;
  1202. } // if:
  1203. //
  1204. // Call through to the server object.
  1205. //
  1206. hr = STHR( piccvq->PrepareToHostQuorumResource() );
  1207. if ( FAILED( hr ) )
  1208. {
  1209. goto Cleanup;
  1210. } // if:
  1211. Cleanup:
  1212. if ( piccvq != NULL )
  1213. {
  1214. piccvq->Release();
  1215. } // if:
  1216. HRETURN( hr );
  1217. } //*** CManagedResource::PrepareToHostQuorumResource
  1218. //////////////////////////////////////////////////////////////////////////////
  1219. //++
  1220. //
  1221. // CManagedResource::Cleanup
  1222. //
  1223. // Description:
  1224. // Do any necessay cleanup from the PrepareToHostQuorumResource()
  1225. // method.
  1226. //
  1227. // If the cleanup method is anything other than successful completion
  1228. // then the share needs to be torn down.
  1229. //
  1230. // Arguments:
  1231. // cccrReasonIn
  1232. //
  1233. // Return Value:
  1234. // S_OK
  1235. // Success
  1236. //
  1237. // Win32 error as HRESULT when an error occurs.
  1238. //
  1239. //--
  1240. //////////////////////////////////////////////////////////////////////////////
  1241. STDMETHODIMP
  1242. CManagedResource::Cleanup(
  1243. EClusCfgCleanupReason cccrReasonIn
  1244. )
  1245. {
  1246. TraceFunc( "[IClusCfgVerifyQuorum]" );
  1247. Assert( m_cookieVerifyQuorum != 0 );
  1248. Assert( m_pgit != NULL );
  1249. HRESULT hr = S_OK;
  1250. IClusCfgVerifyQuorum * piccvq = NULL;
  1251. //
  1252. // Get the interface to the server object from the GIT.
  1253. //
  1254. hr = THR( m_pgit->GetInterfaceFromGlobal( m_cookieVerifyQuorum, TypeSafeParams( IClusCfgVerifyQuorum, &piccvq ) ) );
  1255. if ( FAILED( hr ) )
  1256. {
  1257. goto Cleanup;
  1258. } // if:
  1259. //
  1260. // Call through to the server object.
  1261. //
  1262. hr = STHR( piccvq->Cleanup( cccrReasonIn ) );
  1263. if ( FAILED( hr ) )
  1264. {
  1265. goto Cleanup;
  1266. } // if:
  1267. Cleanup:
  1268. if ( piccvq != NULL )
  1269. {
  1270. piccvq->Release();
  1271. } // if:
  1272. HRETURN( hr );
  1273. } //*** CManagedResource::Cleanup
  1274. ///////////////////////////////////////////////////////////////////////////////
  1275. //++
  1276. //
  1277. // STDMETHODIMP
  1278. // CManagedResource::IsMultiNodeCapable
  1279. //
  1280. //--
  1281. ///////////////////////////////////////////////////////////////////////////////
  1282. STDMETHODIMP
  1283. CManagedResource::IsMultiNodeCapable( void )
  1284. {
  1285. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  1286. HRESULT hr;
  1287. if ( m_fIsQuorumResourceMultiNodeCapable )
  1288. {
  1289. hr = S_OK;
  1290. }
  1291. else
  1292. {
  1293. hr = S_FALSE;
  1294. }
  1295. HRETURN( hr );
  1296. } //*** CManagedResource::IsMultiNodeCapable
  1297. ///////////////////////////////////////////////////////////////////////////////
  1298. //++
  1299. //
  1300. // STDMETHODIMP
  1301. // CManagedResource::SetMultiNodeCapable
  1302. //
  1303. //--
  1304. ///////////////////////////////////////////////////////////////////////////////
  1305. STDMETHODIMP
  1306. CManagedResource::SetMultiNodeCapable( BOOL fMultiNodeCapableIn )
  1307. {
  1308. TraceFunc( "[IClusCfgManagedResourceInfo]" );
  1309. HRETURN( THR( E_NOTIMPL ) );
  1310. } //*** CManagedResource::SetMultiNodeCapable