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.

1014 lines
23 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // CEnumClusterResources.cpp
  7. //
  8. // Description:
  9. // This file contains the definition of the CEnumClusterResources
  10. // class.
  11. //
  12. // The class CEnumClusterResources is the enumeration of cluster
  13. // storage devices. It implements the IEnumClusCfgManagedResources
  14. // interface.
  15. //
  16. // Maintained By:
  17. // Galen Barbee (GalenB) 12-JUN-2000
  18. //
  19. //////////////////////////////////////////////////////////////////////////////
  20. //////////////////////////////////////////////////////////////////////////////
  21. // Include Files
  22. //////////////////////////////////////////////////////////////////////////////
  23. #include "Pch.h"
  24. #include "CEnumClusterResources.h"
  25. #include "CClusterResource.h"
  26. //////////////////////////////////////////////////////////////////////////////
  27. // Constant Definitions
  28. //////////////////////////////////////////////////////////////////////////////
  29. DEFINE_THISCLASS( "CEnumClusterResources" );
  30. //*************************************************************************//
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CEnumClusterResources class
  33. /////////////////////////////////////////////////////////////////////////////
  34. //////////////////////////////////////////////////////////////////////////////
  35. //++
  36. //
  37. // CEnumClusterResources::S_HrCreateInstance
  38. //
  39. // Description:
  40. // Create a CEnumClusterResources instance.
  41. //
  42. // Arguments:
  43. // None.
  44. //
  45. // Return Values:
  46. // Pointer to CEnumClusterResources instance.
  47. //
  48. //--
  49. //////////////////////////////////////////////////////////////////////////////
  50. HRESULT
  51. CEnumClusterResources::S_HrCreateInstance( IUnknown ** ppunkOut )
  52. {
  53. TraceFunc( "" );
  54. HRESULT hr = S_OK;
  55. CEnumClusterResources * pecr = NULL;
  56. if ( ppunkOut == NULL )
  57. {
  58. hr = THR( E_POINTER );
  59. goto Cleanup;
  60. } // if:
  61. pecr = new CEnumClusterResources();
  62. if ( pecr == NULL )
  63. {
  64. hr = THR( E_OUTOFMEMORY );
  65. goto Cleanup;
  66. } // if: error allocating object
  67. hr = THR( pecr->HrInit() );
  68. if ( FAILED( hr ) )
  69. {
  70. goto Cleanup;
  71. } // if: HrInit() failed
  72. hr = THR( pecr->TypeSafeQI( IUnknown, ppunkOut ) );
  73. if ( FAILED( hr ) )
  74. {
  75. goto Cleanup;
  76. } // if: QI failed
  77. Cleanup:
  78. if ( FAILED( hr ) )
  79. {
  80. LogMsg( L"[SRV] CEnumClusterResources::S_HrCreateInstance() failed. (hr = %#08x)", hr );
  81. } // if:
  82. if ( pecr != NULL )
  83. {
  84. pecr->Release();
  85. } // if:
  86. HRETURN( hr );
  87. } //*** CEnumClusterResources::S_HrCreateInstance
  88. //////////////////////////////////////////////////////////////////////////////
  89. //++
  90. //
  91. // IUnknown *
  92. // CEnumClusterResources::S_RegisterCatIDSupport
  93. //
  94. // Description:
  95. // Registers/unregisters this class with the categories that it belongs
  96. // to.
  97. //
  98. // Arguments:
  99. // IN ICatRegister * picrIn
  100. // Used to register/unregister our CATID support.
  101. //
  102. // IN BOOL fCreateIn
  103. // When true we are registering the server. When false we are
  104. // un-registering the server.
  105. //
  106. // Return Values:
  107. // S_OK
  108. // Success.
  109. //
  110. // E_INVALIDARG
  111. // The passed in ICatRgister pointer was NULL.
  112. //
  113. // other HRESULTs
  114. // Registration/Unregistration failed.
  115. //
  116. //--
  117. //////////////////////////////////////////////////////////////////////////////
  118. HRESULT
  119. CEnumClusterResources::S_RegisterCatIDSupport(
  120. ICatRegister * picrIn,
  121. BOOL fCreateIn
  122. )
  123. {
  124. TraceFunc( "" );
  125. HRESULT hr = S_OK;
  126. CATID rgCatIds[ 1 ];
  127. if ( picrIn == NULL )
  128. {
  129. hr = THR( E_INVALIDARG );
  130. goto Cleanup;
  131. } // if:
  132. rgCatIds[ 0 ] = CATID_EnumClusCfgManagedResources;
  133. if ( fCreateIn )
  134. {
  135. hr = THR( picrIn->RegisterClassImplCategories( CLSID_EnumPhysicalDisks, 1, rgCatIds ) );
  136. } // if:
  137. Cleanup:
  138. HRETURN( hr );
  139. } //*** CEnumClusterResources::S_RegisterCatIDSupport
  140. //////////////////////////////////////////////////////////////////////////////
  141. //++
  142. //
  143. // CEnumClusterResources::CEnumClusterResources
  144. //
  145. // Description:
  146. // Constructor of the CEnumClusterResources class. This initializes
  147. // the m_cRef variable to 1 instead of 0 to account of possible
  148. // QueryInterface failure in DllGetClassObject.
  149. //
  150. // Arguments:
  151. // None.
  152. //
  153. // Return Value:
  154. // None.
  155. //
  156. // Remarks:
  157. // None.
  158. //
  159. //--
  160. //////////////////////////////////////////////////////////////////////////////
  161. CEnumClusterResources::CEnumClusterResources( void )
  162. : m_cRef( 1 )
  163. , m_lcid( LOCALE_NEUTRAL )
  164. , m_fLoadedResources( false )
  165. {
  166. TraceFunc( "" );
  167. // Increment the count of components in memory so the DLL hosting this
  168. // object cannot be unloaded.
  169. InterlockedIncrement( &g_cObjects );
  170. Assert( m_picccCallback == NULL );
  171. Assert( m_prgResources == NULL );
  172. Assert( m_idxNext == 0 );
  173. Assert( m_idxEnumNext == 0 );
  174. Assert( m_bstrNodeName == NULL );
  175. Assert( m_cTotalResources == 0 );
  176. TraceFuncExit();
  177. } //*** CEnumClusterResources::CEnumClusterResources
  178. //////////////////////////////////////////////////////////////////////////////
  179. //++
  180. //
  181. // CEnumClusterResources::~CEnumClusterResources
  182. //
  183. // Description:
  184. // Desstructor of the CEnumClusterResources class.
  185. //
  186. // Arguments:
  187. // None.
  188. //
  189. // Return Value:
  190. // None.
  191. //
  192. // Remarks:
  193. // None.
  194. //
  195. //--
  196. //////////////////////////////////////////////////////////////////////////////
  197. CEnumClusterResources::~CEnumClusterResources( void )
  198. {
  199. TraceFunc( "" );
  200. ULONG idx;
  201. if ( m_picccCallback != NULL )
  202. {
  203. m_picccCallback->Release();
  204. } // if:
  205. for ( idx = 0; idx < m_idxNext; idx++ )
  206. {
  207. if ( (*m_prgResources)[ idx ] != NULL )
  208. {
  209. ((*m_prgResources)[ idx ])->Release();
  210. } // end if:
  211. } // for:
  212. TraceFree( m_prgResources );
  213. TraceSysFreeString( m_bstrNodeName );
  214. // There's going to be one less component in memory. Decrement component count.
  215. InterlockedDecrement( &g_cObjects );
  216. TraceFuncExit();
  217. } //*** CEnumClusterResources::~CEnumClusterResources
  218. //*************************************************************************//
  219. /////////////////////////////////////////////////////////////////////////////
  220. // CEnumClusterResources -- IUknkown interface.
  221. /////////////////////////////////////////////////////////////////////////////
  222. //////////////////////////////////////////////////////////////////////////////
  223. //++
  224. //
  225. // CEnumClusterResources::AddRef
  226. //
  227. // Description:
  228. // Increment the reference count of this object by one.
  229. //
  230. // Arguments:
  231. // None.
  232. //
  233. // Return Value:
  234. // The new reference count.
  235. //
  236. // Remarks:
  237. // None.
  238. //
  239. //--
  240. //////////////////////////////////////////////////////////////////////////////
  241. STDMETHODIMP_( ULONG )
  242. CEnumClusterResources::AddRef( void )
  243. {
  244. TraceFunc( "[IUnknown]" );
  245. InterlockedIncrement( &m_cRef );
  246. CRETURN( m_cRef );
  247. } //*** CEnumClusterResources::AddRef
  248. //////////////////////////////////////////////////////////////////////////////
  249. //++
  250. //
  251. // CEnumClusterResources::Release
  252. //
  253. // Description:
  254. // Decrement the reference count of this object by one.
  255. //
  256. // Arguments:
  257. // None.
  258. //
  259. // Return Value:
  260. // The new reference count.
  261. //
  262. // Remarks:
  263. // None.
  264. //
  265. //--
  266. //////////////////////////////////////////////////////////////////////////////
  267. STDMETHODIMP_( ULONG )
  268. CEnumClusterResources::Release( void )
  269. {
  270. TraceFunc( "[IUnknown]" );
  271. LONG cRef;
  272. cRef = InterlockedDecrement( &m_cRef );
  273. if ( cRef == 0 )
  274. {
  275. TraceDo( delete this );
  276. } // if: reference count equal to zero
  277. CRETURN( cRef );
  278. } //*** CEnumClusterResources::Release
  279. //////////////////////////////////////////////////////////////////////////////
  280. //++
  281. //
  282. // CEnumClusterResources::QueryInterface
  283. //
  284. // Description:
  285. // Query this object for the passed in interface.
  286. //
  287. // Arguments:
  288. // riidIn
  289. // Id of interface requested.
  290. //
  291. // ppvOut
  292. // Pointer to the requested interface.
  293. //
  294. // Return Value:
  295. // S_OK
  296. // If the interface is available on this object.
  297. //
  298. // E_NOINTERFACE
  299. // If the interface is not available.
  300. //
  301. // E_POINTER
  302. // ppvOut was NULL.
  303. //
  304. // Remarks:
  305. // None.
  306. //
  307. //--
  308. //////////////////////////////////////////////////////////////////////////////
  309. STDMETHODIMP
  310. CEnumClusterResources::QueryInterface(
  311. REFIID riidIn
  312. , void ** ppvOut
  313. )
  314. {
  315. TraceQIFunc( riidIn, ppvOut );
  316. HRESULT hr = S_OK;
  317. //
  318. // Validate arguments.
  319. //
  320. Assert( ppvOut != NULL );
  321. if ( ppvOut == NULL )
  322. {
  323. hr = THR( E_POINTER );
  324. goto Cleanup;
  325. }
  326. //
  327. // Handle known interfaces.
  328. //
  329. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  330. {
  331. *ppvOut = static_cast< IEnumClusCfgManagedResources * >( this );
  332. } // if: IUnknown
  333. else if ( IsEqualIID( riidIn, IID_IEnumClusCfgManagedResources ) )
  334. {
  335. *ppvOut = TraceInterface( __THISCLASS__, IEnumClusCfgManagedResources, this, 0 );
  336. } // else if: IEnumClusCfgManagedResources
  337. else if ( IsEqualIID( riidIn, IID_IClusCfgInitialize ) )
  338. {
  339. *ppvOut = TraceInterface( __THISCLASS__, IClusCfgInitialize, this, 0 );
  340. } // else if: IClusCfgInitialize
  341. else
  342. {
  343. *ppvOut = NULL;
  344. hr = E_NOINTERFACE;
  345. }
  346. //
  347. // Add a reference to the interface if successful.
  348. //
  349. if ( SUCCEEDED( hr ) )
  350. {
  351. ((IUnknown *) *ppvOut)->AddRef();
  352. } // if: success
  353. Cleanup:
  354. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  355. } //*** CEnumClusterResources::QueryInterface
  356. //*************************************************************************//
  357. /////////////////////////////////////////////////////////////////////////////
  358. // CEnumClusterResources -- IClusCfgInitialize interface.
  359. /////////////////////////////////////////////////////////////////////////////
  360. //////////////////////////////////////////////////////////////////////////////
  361. //++
  362. //
  363. // CEnumClusterResources::Initialize
  364. //
  365. // Description:
  366. // Initialize this component.
  367. //
  368. // Arguments:
  369. // punkCallbackIn
  370. // lcidIn
  371. //
  372. // Return Value:
  373. // S_OK - Success.
  374. // E_INVALIDARG - Required input argument not specified.
  375. // Other HRESULTs.
  376. //
  377. //--
  378. //////////////////////////////////////////////////////////////////////////////
  379. STDMETHODIMP
  380. CEnumClusterResources::Initialize(
  381. IUnknown * punkCallbackIn
  382. , LCID lcidIn
  383. )
  384. {
  385. TraceFunc( "[IClusCfgInitialize]" );
  386. Assert( m_picccCallback == NULL );
  387. HRESULT hr = S_OK;
  388. m_lcid = lcidIn;
  389. if ( punkCallbackIn == NULL )
  390. {
  391. hr = THR( E_INVALIDARG );
  392. goto Cleanup;
  393. } // if:
  394. hr = THR( punkCallbackIn->TypeSafeQI( IClusCfgCallback, &m_picccCallback ) );
  395. if ( FAILED( hr ) )
  396. {
  397. goto Cleanup;
  398. } // if:
  399. hr = THR( HrGetComputerName(
  400. ComputerNameDnsHostname
  401. , &m_bstrNodeName
  402. , TRUE // fBestEffortIn
  403. ) );
  404. if ( FAILED( hr ) )
  405. {
  406. goto Cleanup;
  407. } // if:
  408. Cleanup:
  409. HRETURN( hr );
  410. } //*** CEnumClusterResources::Initialize
  411. //*************************************************************************//
  412. /////////////////////////////////////////////////////////////////////////////
  413. // CEnumClusterResources -- IEnumClusCfgManagedResources interface.
  414. /////////////////////////////////////////////////////////////////////////////
  415. //////////////////////////////////////////////////////////////////////////////
  416. //++
  417. //
  418. // CEnumClusterResources::Next
  419. //
  420. // Description:
  421. //
  422. // Arguments:
  423. //
  424. // Return Value:
  425. //
  426. // Remarks:
  427. // None.
  428. //
  429. //--
  430. //////////////////////////////////////////////////////////////////////////////
  431. STDMETHODIMP
  432. CEnumClusterResources::Next(
  433. ULONG cNumberRequestedIn,
  434. IClusCfgManagedResourceInfo ** rgpManagedResourceInfoOut,
  435. ULONG * pcNumberFetchedOut
  436. )
  437. {
  438. TraceFunc( "[IEnumClusCfgManagedResources]" );
  439. HRESULT hr = S_FALSE;
  440. ULONG cFetched = 0;
  441. ULONG idx;
  442. ULONG idxOutBuf;
  443. IClusCfgManagedResourceInfo * pccsdi;
  444. IUnknown * punk;
  445. ULONG ulStop;
  446. if ( rgpManagedResourceInfoOut == NULL )
  447. {
  448. hr = THR( E_POINTER );
  449. STATUS_REPORT_REF( TASKID_Major_Find_Devices, TASKID_Minor_Next_Enum_Cluster_Resources, IDS_ERROR_NULL_POINTER, IDS_ERROR_NULL_POINTER_REF, hr );
  450. goto Cleanup;
  451. } // if:
  452. if ( !m_fLoadedResources )
  453. {
  454. hr = THR( HrGetResources() );
  455. if ( FAILED( hr ) )
  456. {
  457. goto Cleanup;
  458. } // if:
  459. } // if:
  460. cFetched = ulStop = min( cNumberRequestedIn, ( m_idxNext - m_idxEnumNext ) );
  461. for ( idx = 0, idxOutBuf = 0; idx < ulStop; idx++, m_idxEnumNext++ )
  462. {
  463. punk = (*m_prgResources)[ m_idxEnumNext ];
  464. if ( punk != NULL )
  465. {
  466. hr = THR( punk->TypeSafeQI( IClusCfgManagedResourceInfo, &pccsdi ) );
  467. if ( FAILED( hr ) )
  468. {
  469. break;
  470. } // if:
  471. rgpManagedResourceInfoOut[ idxOutBuf++ ] = pccsdi;
  472. } // if:
  473. else
  474. {
  475. cFetched--;
  476. } // else:
  477. } // for:
  478. if ( FAILED( hr ) )
  479. {
  480. ULONG idxStop = idxOutBuf - 1;
  481. m_idxEnumNext -= idx;
  482. for ( idx = 0; idx < idxStop; idx++ )
  483. {
  484. (rgpManagedResourceInfoOut[ idx ])->Release();
  485. } // for:
  486. cFetched = 0;
  487. goto Cleanup;
  488. } // if:
  489. if ( cFetched < cNumberRequestedIn )
  490. {
  491. hr = S_FALSE;
  492. } // if:
  493. Cleanup:
  494. if ( pcNumberFetchedOut != NULL )
  495. {
  496. *pcNumberFetchedOut = cFetched;
  497. } // if:
  498. HRETURN( hr );
  499. } //*** CEnumClusterResources::Next
  500. //////////////////////////////////////////////////////////////////////////////
  501. //++
  502. //
  503. // CEnumClusterResources::Skip
  504. //
  505. // Description:
  506. //
  507. // Arguments:
  508. //
  509. // Return Value:
  510. //
  511. // Remarks:
  512. // None.
  513. //
  514. //--
  515. //////////////////////////////////////////////////////////////////////////////
  516. STDMETHODIMP
  517. CEnumClusterResources::Skip( ULONG cNumberToSkipIn )
  518. {
  519. TraceFunc( "[IEnumClusCfgManagedResources]" );
  520. HRESULT hr = S_OK;
  521. m_idxEnumNext += cNumberToSkipIn;
  522. if ( m_idxEnumNext >= m_idxNext )
  523. {
  524. m_idxEnumNext = m_idxNext;
  525. hr = STHR( S_FALSE );
  526. } // if:
  527. HRETURN( hr );
  528. } //*** CEnumClusterResources::Skip
  529. //////////////////////////////////////////////////////////////////////////////
  530. //++
  531. //
  532. // CEnumClusterResources::Reset
  533. //
  534. // Description:
  535. //
  536. // Arguments:
  537. //
  538. // Return Value:
  539. //
  540. // Remarks:
  541. // None.
  542. //
  543. //--
  544. //////////////////////////////////////////////////////////////////////////////
  545. STDMETHODIMP
  546. CEnumClusterResources::Reset( void )
  547. {
  548. TraceFunc( "[IEnumClusCfgManagedResources]" );
  549. m_idxEnumNext = 0;
  550. HRETURN( S_OK );
  551. } //*** CEnumClusterResources::Reset
  552. //////////////////////////////////////////////////////////////////////////////
  553. //++
  554. //
  555. // CEnumClusterResources::Clone
  556. //
  557. // Description:
  558. //
  559. // Arguments:
  560. //
  561. // Return Value:
  562. //
  563. // Remarks:
  564. // None.
  565. //
  566. //--
  567. //////////////////////////////////////////////////////////////////////////////
  568. STDMETHODIMP
  569. CEnumClusterResources::Clone(
  570. IEnumClusCfgManagedResources ** ppEnumClusCfgStorageDevicesOut
  571. )
  572. {
  573. TraceFunc( "[IEnumClusCfgManagedResources]" );
  574. HRESULT hr = S_OK;
  575. if ( ppEnumClusCfgStorageDevicesOut == NULL )
  576. {
  577. hr = THR( E_POINTER );
  578. STATUS_REPORT_REF( TASKID_Major_Find_Devices, TASKID_Minor_Clone_Enum_Cluster_Resources, IDS_ERROR_NULL_POINTER, IDS_ERROR_NULL_POINTER_REF, hr );
  579. goto Cleanup;
  580. } // if:
  581. hr = THR( E_NOTIMPL );
  582. Cleanup:
  583. HRETURN( hr );
  584. } //*** CEnumClusterResources::Clone
  585. //////////////////////////////////////////////////////////////////////////////
  586. //++
  587. //
  588. // CEnumClusterResources::Count
  589. //
  590. // Description:
  591. //
  592. // Arguments:
  593. //
  594. // Return Value:
  595. //
  596. // Remarks:
  597. // None.
  598. //
  599. //--
  600. //////////////////////////////////////////////////////////////////////////////
  601. STDMETHODIMP
  602. CEnumClusterResources::Count( DWORD * pnCountOut )
  603. {
  604. HRESULT hr = S_OK;
  605. if ( pnCountOut == NULL )
  606. {
  607. hr = THR( E_POINTER );
  608. goto Cleanup;
  609. } // if:
  610. if ( !m_fLoadedResources )
  611. {
  612. hr = THR( HrGetResources() );
  613. if ( FAILED( hr ) )
  614. {
  615. goto Cleanup;
  616. } // if:
  617. } // if:
  618. *pnCountOut = m_cTotalResources;
  619. Cleanup:
  620. HRETURN( hr );
  621. } //*** CEnumClusterResources::Count
  622. //*************************************************************************//
  623. /////////////////////////////////////////////////////////////////////////////
  624. // CEnumClusterResources class -- Private Methods.
  625. /////////////////////////////////////////////////////////////////////////////
  626. //////////////////////////////////////////////////////////////////////////////
  627. //++
  628. //
  629. // CEnumClusterResources::HrInit
  630. //
  631. // Description:
  632. // Initialize this component.
  633. //
  634. // Arguments:
  635. // None.
  636. //
  637. // Return Value:
  638. //
  639. //
  640. // Remarks:
  641. // None.
  642. //
  643. //--
  644. //////////////////////////////////////////////////////////////////////////////
  645. HRESULT
  646. CEnumClusterResources::HrInit( void )
  647. {
  648. TraceFunc( "" );
  649. HRESULT hr = S_OK;
  650. // IUnknown
  651. Assert( m_cRef == 1 );
  652. HRETURN( hr );
  653. } //*** CEnumClusterResources::HrInit
  654. /////////////////////////////////////////////////////////////////////////////
  655. //++
  656. //
  657. // CEnumClusterResources::HrGetResources
  658. //
  659. // Description:
  660. //
  661. // Arguments:
  662. //
  663. //
  664. // Return Value:
  665. //
  666. //
  667. // Remarks:
  668. // None.
  669. //
  670. //--
  671. //////////////////////////////////////////////////////////////////////////////
  672. HRESULT
  673. CEnumClusterResources::HrGetResources( void )
  674. {
  675. TraceFunc( "" );
  676. HRESULT hr = S_OK;
  677. BSTR bstrLocalNetBIOSName = NULL;
  678. //
  679. // Get netbios name for clusapi calls.
  680. //
  681. hr = THR( HrGetComputerName( ComputerNameNetBIOS, &bstrLocalNetBIOSName, TRUE ) );
  682. if ( FAILED( hr ) )
  683. {
  684. goto Cleanup;
  685. } // if:
  686. hr = THR( HrEnumNodeResources( bstrLocalNetBIOSName ) );
  687. if ( FAILED( hr ) )
  688. goto Cleanup;
  689. m_fLoadedResources = true;
  690. Cleanup:
  691. TraceSysFreeString( bstrLocalNetBIOSName );
  692. HRETURN( hr );
  693. } //*** CEnumClusterResources::HrGetResources
  694. /////////////////////////////////////////////////////////////////////////////
  695. //++
  696. //
  697. // CEnumClusterResources::HrCreateResourceAndAddToArray
  698. //
  699. // Description:
  700. //
  701. // Arguments:
  702. //
  703. //
  704. // Return Value:
  705. //
  706. //
  707. // Remarks:
  708. // None.
  709. //
  710. //--
  711. //////////////////////////////////////////////////////////////////////////////
  712. HRESULT
  713. CEnumClusterResources::HrCreateResourceAndAddToArray(
  714. HCLUSTER hClusterIn,
  715. HRESOURCE hResourceIn
  716. )
  717. {
  718. TraceFunc( "" );
  719. HRESULT hr = S_OK;
  720. IUnknown * punk = NULL;
  721. IClusCfgLoadResource * picclr = NULL;
  722. hr = THR( CClusterResource::S_HrCreateInstance( &punk ) );
  723. if ( FAILED( hr ) )
  724. {
  725. goto Cleanup;
  726. } // if:
  727. hr = THR( HrSetInitialize( punk, m_picccCallback, m_lcid ) );
  728. if ( FAILED( hr ))
  729. {
  730. goto Cleanup;
  731. } // if:
  732. hr = THR( punk->TypeSafeQI( IClusCfgLoadResource, &picclr ) );
  733. if ( FAILED( hr ) )
  734. {
  735. goto Cleanup;
  736. } // if:
  737. hr = THR( picclr->LoadResource( hClusterIn, hResourceIn ) );
  738. if ( FAILED( hr ) )
  739. {
  740. goto Cleanup;
  741. } // if:
  742. hr = THR( HrAddResourceToArray( punk ) );
  743. Cleanup:
  744. if ( picclr != NULL )
  745. {
  746. picclr->Release();
  747. } // if:
  748. if ( punk != NULL )
  749. {
  750. punk->Release();
  751. } // if:
  752. HRETURN( hr );
  753. } //*** CEnumClusterResources::HrCreateResourceAndAddToArray
  754. /////////////////////////////////////////////////////////////////////////////
  755. //++
  756. //
  757. // CEnumClusterResources:HrAddResourceToArray
  758. //
  759. // Description:
  760. // Add the passed in disk to the array of punks that holds the disks.
  761. //
  762. // Arguments:
  763. //
  764. //
  765. // Return Value:
  766. // S_OK
  767. // Success
  768. //
  769. // E_OUTOFMEMORY
  770. // Couldn't allocate memeory.
  771. //
  772. // Remarks:
  773. // None.
  774. //
  775. //--
  776. //////////////////////////////////////////////////////////////////////////////
  777. HRESULT
  778. CEnumClusterResources::HrAddResourceToArray( IUnknown * punkIn )
  779. {
  780. TraceFunc( "" );
  781. HRESULT hr = S_OK;
  782. IUnknown * ((*prgpunks)[]);
  783. prgpunks = (IUnknown *((*)[])) TraceReAlloc( m_prgResources, sizeof( IUnknown * ) * ( m_idxNext + 1 ), HEAP_ZERO_MEMORY );
  784. if ( prgpunks == NULL )
  785. {
  786. hr = THR( E_OUTOFMEMORY );
  787. STATUS_REPORT_REF( TASKID_Major_Find_Devices, TASKID_Minor_HrAddResourceToArray, IDS_ERROR_OUTOFMEMORY, IDS_ERROR_OUTOFMEMORY_REF, hr );
  788. goto Cleanup;
  789. } // if:
  790. m_prgResources = prgpunks;
  791. (*m_prgResources)[ m_idxNext++ ] = punkIn;
  792. punkIn->AddRef();
  793. m_cTotalResources += 1;
  794. Cleanup:
  795. HRETURN( hr );
  796. } //*** CEnumClusterResources::HrAddResourceToArray
  797. /////////////////////////////////////////////////////////////////////////////
  798. //++
  799. //
  800. // CEnumClusterResources:HrNodeResourceCallback
  801. //
  802. // Description:
  803. // Called by CClusterUtils::HrEnumNodeResources() when it finds a
  804. // resource for this node.
  805. //
  806. // Arguments:
  807. //
  808. //
  809. // Return Value:
  810. // S_OK
  811. // Success.
  812. //
  813. // Win32 Error
  814. // something failed.
  815. //
  816. // Remarks:
  817. // None.
  818. //
  819. //--
  820. //////////////////////////////////////////////////////////////////////////////
  821. HRESULT
  822. CEnumClusterResources::HrNodeResourceCallback(
  823. HCLUSTER hClusterIn,
  824. HRESOURCE hResourceIn
  825. )
  826. {
  827. TraceFunc( "" );
  828. HRETURN( HrCreateResourceAndAddToArray( hClusterIn, hResourceIn ) );
  829. } //*** CEnumClusterResources::HrNodeResourceCallback