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

965 lines
21 KiB

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