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.

1051 lines
23 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ResourceEntry.h
  7. //
  8. // Description:
  9. // ResourceEntry implementation.
  10. //
  11. // Maintained By:
  12. // Geoffrey Pease (GPease) 15-JUN-2000
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "pch.h"
  16. #include "GroupHandle.h"
  17. #include "ResourceEntry.h"
  18. DEFINE_THISCLASS("CResourceEntry")
  19. #define DEPENDENCY_INCREMENT 10
  20. #define PROPLIST_INCREMENT 128
  21. // ************************************************************************
  22. //
  23. // Constructor / Destructor
  24. //
  25. // ************************************************************************
  26. //////////////////////////////////////////////////////////////////////////////
  27. //
  28. // CResourceEntry::CResourceEntry( void )
  29. //
  30. //////////////////////////////////////////////////////////////////////////////
  31. CResourceEntry::CResourceEntry( void )
  32. {
  33. TraceFunc( "" );
  34. Assert( m_fConfigured == FALSE );
  35. Assert( m_bstrName == NULL );
  36. Assert( m_pccmrcResource == NULL );
  37. Assert( m_clsidType == IID_NULL );
  38. Assert( m_clsidClassType == IID_NULL );
  39. Assert( m_dfFlags == dfUNKNOWN );
  40. Assert( m_cAllocedDependencies == 0 );
  41. Assert( m_cDependencies == 0 );
  42. Assert( m_rgDependencies == NULL );
  43. Assert( m_cAllocedDependents == 0 );
  44. Assert( m_cDependents == 0 );
  45. Assert( m_rgDependents == NULL );
  46. Assert( m_groupHandle == NULL );
  47. Assert( m_hResource == NULL );
  48. Assert( m_cbAllocedPropList == 0 );
  49. Assert( m_cbPropList == 0 );
  50. Assert( m_pPropList == NULL );
  51. TraceFuncExit();
  52. } // CResourceEntry( )
  53. //////////////////////////////////////////////////////////////////////////////
  54. //
  55. // CResourceEntry::~CResourceEntry( )
  56. //
  57. //////////////////////////////////////////////////////////////////////////////
  58. CResourceEntry::~CResourceEntry( )
  59. {
  60. TraceFunc( "" );
  61. if ( m_bstrName != NULL )
  62. {
  63. TraceSysFreeString( m_bstrName );
  64. }
  65. if ( m_rgDependencies != NULL )
  66. {
  67. TraceFree( m_rgDependencies );
  68. }
  69. if ( m_rgDependents != NULL )
  70. {
  71. THR( ClearDependents( ) );
  72. }
  73. if ( m_groupHandle != NULL )
  74. {
  75. m_groupHandle->Release( );
  76. }
  77. if ( m_hResource != NULL )
  78. {
  79. CloseClusterResource( m_hResource );
  80. }
  81. if ( m_pPropList != NULL )
  82. {
  83. TraceFree( m_pPropList );
  84. }
  85. TraceFuncExit();
  86. } // ~CResourceEntry( )
  87. //****************************************************************************
  88. //
  89. // IResourceEntry
  90. //
  91. //****************************************************************************
  92. //////////////////////////////////////////////////////////////////////////////
  93. //
  94. // STDMETHODIMP
  95. // CResourceEntry::SetName(
  96. // BSTR bstrIn
  97. // )
  98. //
  99. //////////////////////////////////////////////////////////////////////////////
  100. STDMETHODIMP
  101. CResourceEntry::SetName(
  102. BSTR bstrIn
  103. )
  104. {
  105. TraceFunc( "[IResourceEntry]" );
  106. HRESULT hr = S_OK;
  107. Assert( bstrIn != NULL );
  108. if ( m_bstrName != NULL )
  109. {
  110. TraceSysFreeString( m_bstrName );
  111. }
  112. m_bstrName = bstrIn;
  113. HRETURN( hr );
  114. } // SetName( )
  115. //////////////////////////////////////////////////////////////////////////////
  116. //
  117. // STDMETHODIMP
  118. // CResourceEntry::GetName(
  119. // BSTR * pbstrOut
  120. // )
  121. //
  122. //////////////////////////////////////////////////////////////////////////////
  123. STDMETHODIMP
  124. CResourceEntry::GetName(
  125. BSTR * pbstrOut
  126. )
  127. {
  128. TraceFunc( "[IResourceEntry]" );
  129. HRESULT hr = S_OK;
  130. Assert( pbstrOut != NULL );
  131. *pbstrOut = m_bstrName;
  132. HRETURN( hr );
  133. } // GetName( )
  134. //////////////////////////////////////////////////////////////////////////////
  135. //
  136. // STDMETHODIMP
  137. // CResourceEntry::SetAssociatedResource(
  138. // IClusCfgManagedResourceCfg * pccmrcIn
  139. // )
  140. //
  141. //////////////////////////////////////////////////////////////////////////////
  142. STDMETHODIMP
  143. CResourceEntry::SetAssociatedResource(
  144. IClusCfgManagedResourceCfg * pccmrcIn
  145. )
  146. {
  147. TraceFunc( "[IResourceEntry]" );
  148. HRESULT hr = S_OK;
  149. if ( m_pccmrcResource != NULL )
  150. {
  151. m_pccmrcResource->Release( );
  152. }
  153. m_pccmrcResource = pccmrcIn;
  154. m_pccmrcResource->AddRef( );
  155. HRETURN( hr );
  156. } // SetAssociatedResource( )
  157. //////////////////////////////////////////////////////////////////////////////
  158. //
  159. // STDMETHODIMP
  160. // CResourceEntry::GetAssociatedResource(
  161. // IClusCfgManagedResourceCfg ** ppccmrcOut
  162. // )
  163. //
  164. //////////////////////////////////////////////////////////////////////////////
  165. STDMETHODIMP
  166. CResourceEntry::GetAssociatedResource(
  167. IClusCfgManagedResourceCfg ** ppccmrcOut
  168. )
  169. {
  170. TraceFunc( "[IResourceEntry]" );
  171. HRESULT hr;
  172. if ( m_pccmrcResource != NULL )
  173. {
  174. *ppccmrcOut = m_pccmrcResource;
  175. (*ppccmrcOut)->AddRef( );
  176. hr = S_OK;
  177. }
  178. else
  179. {
  180. hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA );
  181. }
  182. HRETURN( hr );
  183. } // GetAssociatedResource( )
  184. //////////////////////////////////////////////////////////////////////////////
  185. //
  186. // STDMETHODIMP
  187. // CResourceEntry::SetType(
  188. // const CLSID * pclsidIn
  189. // )
  190. //
  191. //////////////////////////////////////////////////////////////////////////////
  192. STDMETHODIMP
  193. CResourceEntry::SetType(
  194. const CLSID * pclsidIn
  195. )
  196. {
  197. TraceFunc( "[IResourceEntry]" );
  198. HRESULT hr = S_OK;
  199. m_clsidType = * pclsidIn;
  200. HRETURN( hr );
  201. } // SetType( )
  202. //////////////////////////////////////////////////////////////////////////////
  203. //
  204. // STDMETHODIMP
  205. // CResourceEntry::GetType(
  206. // CLSID * pclsidOut
  207. // )
  208. //
  209. //////////////////////////////////////////////////////////////////////////////
  210. STDMETHODIMP
  211. CResourceEntry::GetType(
  212. CLSID * pclsidOut
  213. )
  214. {
  215. TraceFunc( "[IResourceEntry]" );
  216. HRESULT hr = S_OK;
  217. *pclsidOut = m_clsidType;
  218. HRETURN( hr );
  219. } // GetType( )
  220. //////////////////////////////////////////////////////////////////////////////
  221. //
  222. // STDMETHODIMP
  223. // CResourceEntry::GetTypePtr(
  224. // const CLSID ** ppclsidOut
  225. // )
  226. //
  227. //////////////////////////////////////////////////////////////////////////////
  228. STDMETHODIMP
  229. CResourceEntry::GetTypePtr(
  230. const CLSID ** ppclsidOut
  231. )
  232. {
  233. TraceFunc( "[IResourceEntry]" );
  234. HRESULT hr = S_OK;
  235. Assert( ppclsidOut != NULL );
  236. *ppclsidOut = &m_clsidType;
  237. HRETURN( hr );
  238. } // GetTypePtr( )
  239. //////////////////////////////////////////////////////////////////////////////
  240. //
  241. // STDMETHODIMP
  242. // CResourceEntry::SetClassType(
  243. // const CLSID * pclsidIn
  244. // )
  245. //
  246. //////////////////////////////////////////////////////////////////////////////
  247. STDMETHODIMP
  248. CResourceEntry::SetClassType(
  249. const CLSID * pclsidIn
  250. )
  251. {
  252. TraceFunc( "[IResourceEntry]" );
  253. HRESULT hr = S_OK;
  254. m_clsidClassType = *pclsidIn;
  255. HRETURN( hr );
  256. } // SetClassType( )
  257. //////////////////////////////////////////////////////////////////////////////
  258. //
  259. // STDMETHODIMP
  260. // CResourceEntry::GetClassType(
  261. // CLSID * pclsidOut
  262. // )
  263. //
  264. //////////////////////////////////////////////////////////////////////////////
  265. STDMETHODIMP
  266. CResourceEntry::GetClassType(
  267. CLSID * pclsidOut
  268. )
  269. {
  270. TraceFunc( "[IResourceEntry]" );
  271. HRESULT hr = S_OK;
  272. *pclsidOut = m_clsidClassType;
  273. HRETURN( hr );
  274. } // GetClassType( )
  275. //////////////////////////////////////////////////////////////////////////////
  276. //
  277. // STDMETHODIMP
  278. // CResourceEntry::GetClassTypePtr(
  279. // const CLSID ** ppclsidOut
  280. // )
  281. //
  282. //////////////////////////////////////////////////////////////////////////////
  283. STDMETHODIMP
  284. CResourceEntry::GetClassTypePtr(
  285. const CLSID ** ppclsidOut
  286. )
  287. {
  288. TraceFunc( "[IResourceEntry]" );
  289. HRESULT hr = S_OK;
  290. Assert( ppclsidOut != NULL );
  291. *ppclsidOut = &m_clsidClassType;
  292. HRETURN( hr );
  293. } // GetClassTypePtr( )
  294. //////////////////////////////////////////////////////////////////////////////
  295. //
  296. // STDMETHODIMP
  297. // CResourceEntry::SetFlags(
  298. // EDependencyFlags dfIn
  299. // )
  300. //
  301. //////////////////////////////////////////////////////////////////////////////
  302. STDMETHODIMP
  303. CResourceEntry::SetFlags(
  304. EDependencyFlags dfIn
  305. )
  306. {
  307. TraceFunc( "[IResourceEntry]" );
  308. HRESULT hr = S_OK;
  309. m_dfFlags = dfIn;
  310. HRETURN( hr );
  311. } // SetFlags( )
  312. //////////////////////////////////////////////////////////////////////////////
  313. //
  314. // STDMETHODIMP
  315. // CResourceEntry::GetFlags(
  316. // EDependencyFlags * pdfOut
  317. // )
  318. //
  319. //////////////////////////////////////////////////////////////////////////////
  320. STDMETHODIMP
  321. CResourceEntry::GetFlags(
  322. EDependencyFlags * pdfOut
  323. )
  324. {
  325. TraceFunc( "[IResourceEntry]" );
  326. HRESULT hr = S_OK;
  327. Assert( pdfOut != NULL );
  328. *pdfOut = m_dfFlags;
  329. HRETURN( hr );
  330. } // GetFlags( )
  331. //////////////////////////////////////////////////////////////////////////////
  332. //
  333. // STDMETHODIMP
  334. // CResourceEntry::AddTypeDependency(
  335. // const CLSID * pclsidIn,
  336. // EDependencyFlags dfIn
  337. // )
  338. //
  339. //////////////////////////////////////////////////////////////////////////////
  340. STDMETHODIMP
  341. CResourceEntry::AddTypeDependency(
  342. const CLSID * pclsidIn,
  343. EDependencyFlags dfIn
  344. )
  345. {
  346. TraceFunc( "[IResourceEntry]" );
  347. HRESULT hr = S_OK;
  348. if ( m_cAllocedDependencies == 0 )
  349. {
  350. m_rgDependencies = (DependencyEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependencyEntry) * DEPENDENCY_INCREMENT );
  351. if ( m_rgDependencies == NULL )
  352. goto OutOfMemory;
  353. m_cAllocedDependencies = DEPENDENCY_INCREMENT;
  354. Assert( m_cDependencies == 0 );
  355. }
  356. else if ( m_cDependencies == m_cAllocedDependencies )
  357. {
  358. DependencyEntry * pdepends;
  359. pdepends = (DependencyEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependencyEntry) * ( m_cAllocedDependencies + DEPENDENCY_INCREMENT ) );
  360. if ( pdepends == NULL )
  361. goto OutOfMemory;
  362. CopyMemory( pdepends, m_rgDependencies, sizeof(DependencyEntry) * m_cAllocedDependencies );
  363. TraceFree( m_rgDependencies );
  364. m_rgDependencies = pdepends;
  365. }
  366. m_rgDependencies[ m_cDependencies ].clsidType = *pclsidIn;
  367. m_rgDependencies[ m_cDependencies ].dfFlags = (EDependencyFlags) dfIn;
  368. m_cDependencies++;
  369. Cleanup:
  370. HRETURN( hr );
  371. OutOfMemory:
  372. hr = E_OUTOFMEMORY;
  373. goto Cleanup;
  374. } // AddTypeDependency( )
  375. //////////////////////////////////////////////////////////////////////////////
  376. //
  377. // STDMETHODIMP
  378. // CResourceEntry::GetCountOfTypeDependencies(
  379. // ULONG * pcOut
  380. // )
  381. //
  382. //////////////////////////////////////////////////////////////////////////////
  383. STDMETHODIMP
  384. CResourceEntry::GetCountOfTypeDependencies(
  385. ULONG * pcOut
  386. )
  387. {
  388. TraceFunc( "[IResourceEntry]" );
  389. HRESULT hr = S_OK;
  390. Assert( pcOut != NULL );
  391. *pcOut = m_cDependencies;
  392. HRETURN( hr );
  393. } // GetCountOfTypeDependencies( )
  394. //////////////////////////////////////////////////////////////////////////////
  395. //
  396. // STDMETHODIMP
  397. // CResourceEntry::GetTypeDependency(
  398. // ULONG idxIn,
  399. // const CLSID * pclsidOut,
  400. // EDependencyFlags * dfOut
  401. // )
  402. //
  403. //////////////////////////////////////////////////////////////////////////////
  404. STDMETHODIMP
  405. CResourceEntry::GetTypeDependency(
  406. ULONG idxIn,
  407. CLSID * pclsidOut,
  408. EDependencyFlags * dfOut
  409. )
  410. {
  411. TraceFunc( "[IResourceEntry]" );
  412. HRESULT hr = S_OK;
  413. Assert( pclsidOut != NULL );
  414. Assert( dfOut != NULL );
  415. Assert( idxIn < m_cDependencies );
  416. *pclsidOut = m_rgDependencies[ idxIn ].clsidType;
  417. *dfOut = m_rgDependencies[ idxIn ].dfFlags;
  418. HRETURN( hr );
  419. } // GetTypeDependency( )
  420. //////////////////////////////////////////////////////////////////////////////
  421. //
  422. // STDMETHODIMP
  423. // CResourceEntry::GetTypeDependencyPtr(
  424. // ULONG idxIn,
  425. // const CLSID ** ppclsidOut,
  426. // EDependencyFlags * dfOut
  427. // )
  428. //
  429. //////////////////////////////////////////////////////////////////////////////
  430. STDMETHODIMP
  431. CResourceEntry::GetTypeDependencyPtr(
  432. ULONG idxIn,
  433. const CLSID ** ppclsidOut,
  434. EDependencyFlags * dfOut
  435. )
  436. {
  437. TraceFunc( "[IResourceEntry]" );
  438. HRESULT hr = S_OK;
  439. Assert( ppclsidOut != NULL );
  440. Assert( dfOut != NULL );
  441. Assert( idxIn < m_cDependencies );
  442. *ppclsidOut = &m_rgDependencies[ idxIn ].clsidType;
  443. *dfOut = m_rgDependencies[ idxIn ].dfFlags;
  444. HRETURN( hr );
  445. } // GetTypeDependencyPtr( )
  446. //////////////////////////////////////////////////////////////////////////////
  447. //
  448. // STDMETHODIMP
  449. // CResourceEntry::AddDependent(
  450. // ULONG idxIn,
  451. // EDependencyFlags dfFlagsIn
  452. // )
  453. //
  454. //////////////////////////////////////////////////////////////////////////////
  455. STDMETHODIMP
  456. CResourceEntry::AddDependent(
  457. ULONG idxIn,
  458. EDependencyFlags dfFlagsIn
  459. )
  460. {
  461. TraceFunc( "[IResourceEntry]" );
  462. HRESULT hr = S_OK;
  463. if ( m_cAllocedDependents == 0 )
  464. {
  465. m_rgDependents = (DependentEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependentEntry) * DEPENDENCY_INCREMENT );
  466. if ( m_rgDependents == NULL )
  467. goto OutOfMemory;
  468. m_cAllocedDependents = DEPENDENCY_INCREMENT;
  469. Assert( m_cDependents == 0 );
  470. }
  471. else if ( m_cDependents == m_cAllocedDependents )
  472. {
  473. DependentEntry * pdepends;
  474. pdepends = (DependentEntry *) TraceAlloc( HEAP_ZERO_MEMORY, sizeof(DependentEntry) * ( m_cAllocedDependents + DEPENDENCY_INCREMENT ) );
  475. if ( pdepends == NULL )
  476. goto OutOfMemory;
  477. CopyMemory( pdepends, m_rgDependents, sizeof(DependentEntry) * m_cAllocedDependents );
  478. TraceFree( m_rgDependents );
  479. m_rgDependents = pdepends;
  480. }
  481. m_rgDependents[ m_cDependents ].idxResource = idxIn;
  482. m_rgDependents[ m_cDependents ].dfFlags = dfFlagsIn;
  483. m_cDependents++;
  484. Cleanup:
  485. HRETURN( hr );
  486. OutOfMemory:
  487. hr = E_OUTOFMEMORY;
  488. goto Cleanup;
  489. } // AddDependent( )
  490. //////////////////////////////////////////////////////////////////////////////
  491. //
  492. // STDMETHODIMP
  493. // CResourceEntry::GetCountOfDependents(
  494. // ULONG * pcOut
  495. // )
  496. //
  497. //////////////////////////////////////////////////////////////////////////////
  498. STDMETHODIMP
  499. CResourceEntry::GetCountOfDependents(
  500. ULONG * pcOut
  501. )
  502. {
  503. TraceFunc( "[IResourceEntry]" );
  504. HRESULT hr = S_OK;
  505. Assert( pcOut != NULL );
  506. *pcOut = m_cDependents;
  507. HRETURN( hr );
  508. } // GetCountOfDependents( )
  509. //////////////////////////////////////////////////////////////////////////////
  510. //
  511. // STDMETHODIMP
  512. // CResourceEntry::GetDependent(
  513. // ULONG idxIn,
  514. // ULONG * pidxOut
  515. // EDependencyFlags * pdfOut
  516. // )
  517. //
  518. //////////////////////////////////////////////////////////////////////////////
  519. STDMETHODIMP
  520. CResourceEntry::GetDependent(
  521. ULONG idxIn,
  522. ULONG * pidxOut,
  523. EDependencyFlags * pdfOut
  524. )
  525. {
  526. TraceFunc( "[IResourceEntry]" );
  527. HRESULT hr = S_OK;
  528. Assert( idxIn < m_cDependents );
  529. Assert( pidxOut != NULL );
  530. Assert( pdfOut != NULL );
  531. *pidxOut = m_rgDependents[ idxIn ].idxResource;
  532. *pdfOut = m_rgDependents[ idxIn ].dfFlags;
  533. HRETURN( hr );
  534. } // GetDependent( )
  535. //////////////////////////////////////////////////////////////////////////////
  536. //
  537. // STDMETHODIMP
  538. // CResourceEntry::ClearDependents( void )
  539. //
  540. //////////////////////////////////////////////////////////////////////////////
  541. STDMETHODIMP
  542. CResourceEntry::ClearDependents( void )
  543. {
  544. TraceFunc( "[IResourceEntry]" );
  545. HRESULT hr = S_OK;
  546. TraceFree( m_rgDependents );
  547. m_cAllocedDependents = 0;
  548. m_cDependents = 0;
  549. HRETURN( hr );
  550. } // ClearDependents( )
  551. //////////////////////////////////////////////////////////////////////////////
  552. //
  553. // STDMETHODIMP
  554. // CResourceEntry::SetGroupHandle(
  555. // HGROUP hGroupIn
  556. // )
  557. //
  558. //////////////////////////////////////////////////////////////////////////////
  559. STDMETHODIMP
  560. CResourceEntry::SetGroupHandle(
  561. CGroupHandle * pghIn
  562. )
  563. {
  564. TraceFunc( "[IResourceEntry]" );
  565. HRESULT hr = S_OK;
  566. Assert( pghIn != NULL );
  567. if ( m_groupHandle != NULL )
  568. {
  569. m_groupHandle->Release( );
  570. }
  571. m_groupHandle = pghIn;
  572. m_groupHandle->AddRef( );
  573. HRETURN( hr );
  574. } // SetGroupHandle( )
  575. //////////////////////////////////////////////////////////////////////////////
  576. //
  577. // STDMETHODIMP
  578. // CResourceEntry::GetGroupHandle(
  579. // CGroupHandle ** pghIn
  580. // )
  581. //
  582. //////////////////////////////////////////////////////////////////////////////
  583. STDMETHODIMP
  584. CResourceEntry::GetGroupHandle(
  585. CGroupHandle ** pghOut
  586. )
  587. {
  588. TraceFunc( "[IResourceEntry]" );
  589. HRESULT hr = S_OK;
  590. Assert( pghOut != NULL );
  591. *pghOut = m_groupHandle;
  592. if ( *pghOut != NULL )
  593. {
  594. (*pghOut)->AddRef( );
  595. }
  596. HRETURN( hr );
  597. } // GetGroupHandle( )
  598. //////////////////////////////////////////////////////////////////////////////
  599. //
  600. // STDMETHODIMP
  601. // CResourceEntry::SetHResource(
  602. // HRESOURCE hResourceIn
  603. // )
  604. //
  605. //////////////////////////////////////////////////////////////////////////////
  606. STDMETHODIMP
  607. CResourceEntry::SetHResource(
  608. HRESOURCE hResourceIn
  609. )
  610. {
  611. TraceFunc( "[IResourceEntry]" );
  612. HRESULT hr = S_OK;
  613. if ( m_hResource != NULL )
  614. {
  615. BOOL bRet = CloseClusterResource( m_hResource );
  616. // This shouldn't fail - and what would we do if it did?
  617. Assert( bRet );
  618. }
  619. m_hResource = hResourceIn;
  620. HRETURN( hr );
  621. } // SetHResource( )
  622. //////////////////////////////////////////////////////////////////////////////
  623. //
  624. // STDMETHODIMP
  625. // CResourceEntry::GetHResource(
  626. // HRESOURCE * phResourceOut
  627. // )
  628. //
  629. //////////////////////////////////////////////////////////////////////////////
  630. STDMETHODIMP
  631. CResourceEntry::GetHResource(
  632. HRESOURCE * phResourceOut
  633. )
  634. {
  635. TraceFunc( "[IResourceEntry]" );
  636. HRESULT hr = S_OK;
  637. Assert( phResourceOut != NULL );
  638. *phResourceOut = m_hResource;
  639. if ( *phResourceOut == NULL )
  640. {
  641. hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA );
  642. }
  643. HRETURN( hr );
  644. } // GetHResource( )
  645. //////////////////////////////////////////////////////////////////////////////
  646. //
  647. // STDMETHODIMP
  648. // CResourceEntry::SetConfigured(
  649. // BOOL fConfiguredIn
  650. // )
  651. //
  652. //////////////////////////////////////////////////////////////////////////////
  653. STDMETHODIMP
  654. CResourceEntry::SetConfigured(
  655. BOOL fConfiguredIn
  656. )
  657. {
  658. TraceFunc( "[IResourceEntry]" );
  659. HRESULT hr = S_OK;
  660. m_fConfigured = fConfiguredIn;
  661. HRETURN( hr );
  662. } // SetConfigured( )
  663. //////////////////////////////////////////////////////////////////////////////
  664. //
  665. // STDMETHODIMP
  666. // CResourceEntry::IsConfigured( void )
  667. //
  668. //////////////////////////////////////////////////////////////////////////////
  669. STDMETHODIMP
  670. CResourceEntry::IsConfigured( void )
  671. {
  672. TraceFunc( "[IResourceEntry]" );
  673. HRESULT hr;
  674. if ( m_fConfigured )
  675. {
  676. hr = S_OK;
  677. }
  678. else
  679. {
  680. hr = S_FALSE;
  681. }
  682. HRETURN( hr );
  683. } // IsConfigured( )
  684. //////////////////////////////////////////////////////////////////////////////
  685. //
  686. // STDMETHODIMP
  687. // CResourceEntry::StoreClusterResourceControl(
  688. // DWORD dwClusCtlIn,
  689. // LPVOID pvInBufferIn,
  690. // DWORD cbInBufferIn
  691. // )
  692. //
  693. //////////////////////////////////////////////////////////////////////////////
  694. STDMETHODIMP
  695. CResourceEntry::StoreClusterResourceControl(
  696. DWORD dwClusCtlIn,
  697. LPVOID pvInBufferIn,
  698. DWORD cbInBufferIn
  699. )
  700. {
  701. TraceFunc( "[IResourceEntry]" );
  702. HRESULT hr;
  703. DWORD cbNewSize;
  704. LPBYTE pb;
  705. CLUSPROP_LIST * plist;
  706. if ( dwClusCtlIn == CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES )
  707. {
  708. //
  709. // Grow the buffer (if needed)
  710. //
  711. if ( ALIGN_CLUSPROP( cbInBufferIn - sizeof(plist->nPropertyCount) ) >= m_cbAllocedPropList - m_cbPropList )
  712. {
  713. if ( cbInBufferIn > PROPLIST_INCREMENT )
  714. {
  715. cbNewSize = m_cbAllocedPropList + ALIGN_CLUSPROP( cbInBufferIn - sizeof(plist->nPropertyCount) );
  716. }
  717. else
  718. {
  719. cbNewSize = m_cbAllocedPropList + PROPLIST_INCREMENT;
  720. }
  721. if ( m_cbAllocedPropList == 0 )
  722. {
  723. pb = (LPBYTE) TraceAlloc( HEAP_ZERO_MEMORY, cbNewSize );
  724. if ( pb == NULL )
  725. goto OutOfMemory;
  726. m_cbPropList = sizeof(plist->nPropertyCount);
  727. }
  728. else
  729. {
  730. pb = (LPBYTE) TraceReAlloc( m_pPropList, cbNewSize, HEAP_ZERO_MEMORY );
  731. if ( pb == NULL )
  732. goto OutOfMemory;
  733. }
  734. m_cbAllocedPropList = cbNewSize;
  735. m_pPropList = (CLUSPROP_LIST * )pb;
  736. }
  737. //
  738. // Copy the properties in to the list.
  739. //
  740. pb = ((LPBYTE) m_pPropList) + m_cbPropList;
  741. plist = (CLUSPROP_LIST * ) pvInBufferIn;
  742. CopyMemory( pb, &plist->PropertyName, cbInBufferIn - sizeof(plist->nPropertyCount) );
  743. //
  744. // Increment the property count
  745. //
  746. m_pPropList->nPropertyCount += plist->nPropertyCount;
  747. //
  748. // Adjust the list size allowing for entry padding.
  749. //
  750. m_cbPropList += ALIGN_CLUSPROP( cbInBufferIn - sizeof(plist->nPropertyCount) );
  751. }
  752. else
  753. {
  754. //
  755. // TODO: 20-JUN-2000
  756. // Implement buffering other/custom clusctls.
  757. //
  758. hr = THR( E_NOTIMPL );
  759. goto Cleanup;
  760. }
  761. hr = S_OK;
  762. Cleanup:
  763. HRETURN( hr );
  764. OutOfMemory:
  765. hr = E_OUTOFMEMORY;
  766. goto Cleanup;
  767. } // StoreClusterResourceControl( )
  768. //////////////////////////////////////////////////////////////////////////////
  769. //
  770. // STDMETHODIMP
  771. // CResourceEntry::Configure( void )
  772. //
  773. //////////////////////////////////////////////////////////////////////////////
  774. STDMETHODIMP
  775. CResourceEntry::Configure( void )
  776. {
  777. TraceFunc( "[IResourceEntry]" );
  778. HRESULT hr;
  779. DWORD dw;
  780. Assert( m_hResource != NULL );
  781. //
  782. // Send down the property list.
  783. //
  784. if ( m_pPropList != NULL )
  785. {
  786. dw = TW32( ClusterResourceControl( m_hResource,
  787. NULL,
  788. CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES,
  789. m_pPropList,
  790. m_cbPropList,
  791. NULL,
  792. NULL,
  793. NULL
  794. ) );
  795. if ( dw != ERROR_SUCCESS )
  796. {
  797. hr = HRESULT_FROM_WIN32( dw );
  798. goto Cleanup;
  799. }
  800. }
  801. //
  802. // TODO: 20-JUN-2000
  803. // Send down buffered other/custom clusctls.
  804. //
  805. hr = S_OK;
  806. Cleanup:
  807. HRETURN( hr );
  808. } // Configure( )