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.

1254 lines
33 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2002 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ClusKeys.cpp
  7. //
  8. // Description:
  9. // Implementation of the cluster registry and crypto key collection
  10. // classes for the MSCLUS automation classes.
  11. //
  12. // Author:
  13. // Galen Barbee (galenb) 12-Feb-1999
  14. //
  15. // Revision History:
  16. //
  17. // Notes:
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #if CLUSAPI_VERSION >= 0x0500
  22. #include <PropList.h>
  23. #else
  24. #include "PropList.h"
  25. #endif // CLUSAPI_VERSION >= 0x0500
  26. #include "ClusKeys.h"
  27. /////////////////////////////////////////////////////////////////////////////
  28. // Global variables
  29. /////////////////////////////////////////////////////////////////////////////
  30. static const IID * iidCClusRegistryKeys[] =
  31. {
  32. &IID_ISClusRegistryKeys
  33. };
  34. static const IID * iidCClusCryptoKeys[] =
  35. {
  36. &IID_ISClusCryptoKeys
  37. };
  38. //*************************************************************************//
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CKeys class
  41. /////////////////////////////////////////////////////////////////////////////
  42. /////////////////////////////////////////////////////////////////////////////
  43. //++
  44. //
  45. // CKeys::CKeys
  46. //
  47. // Description:
  48. // Constructor.
  49. //
  50. // Arguments:
  51. // None.
  52. //
  53. // Return Value:
  54. // None.
  55. //
  56. //--
  57. /////////////////////////////////////////////////////////////////////////////
  58. CKeys::CKeys( void )
  59. {
  60. m_pClusRefObject = NULL;
  61. } //*** CKeys::CKeys()
  62. /////////////////////////////////////////////////////////////////////////////
  63. //++
  64. //
  65. // CKeys::~CKeys
  66. //
  67. // Description:
  68. // Destructor.
  69. //
  70. // Arguments:
  71. // None.
  72. //
  73. // Return Value:
  74. // None.
  75. //
  76. //--
  77. /////////////////////////////////////////////////////////////////////////////
  78. CKeys::~CKeys( void )
  79. {
  80. Clear();
  81. if ( m_pClusRefObject != NULL )
  82. {
  83. m_pClusRefObject->Release();
  84. m_pClusRefObject = NULL;
  85. }
  86. } //*** CKeys::~CKeys()
  87. /////////////////////////////////////////////////////////////////////////////
  88. //++
  89. //
  90. // CKeys::HrCreate
  91. //
  92. // Description:
  93. // Finish creating the object by doing things that cannot be done in
  94. // a light weight constructor.
  95. //
  96. // Arguments:
  97. // pClusRefObject [IN] - Wraps the cluster handle.
  98. //
  99. // Return Value:
  100. // S_OK if successful or E_POINTER if not.
  101. //
  102. //--
  103. /////////////////////////////////////////////////////////////////////////////
  104. HRESULT CKeys::HrCreate( IN ISClusRefObject * pClusRefObject )
  105. {
  106. ASSERT( pClusRefObject != NULL );
  107. HRESULT _hr = E_POINTER;
  108. if ( pClusRefObject != NULL )
  109. {
  110. m_pClusRefObject = pClusRefObject;
  111. m_pClusRefObject->AddRef();
  112. _hr = S_OK;
  113. }
  114. return _hr;
  115. } //*** CKeys::HrCreate()
  116. /////////////////////////////////////////////////////////////////////////////
  117. //++
  118. //
  119. // CKeys::Clear
  120. //
  121. // Description:
  122. // Empty the vector of keys.
  123. //
  124. // Arguments:
  125. // None.
  126. //
  127. // Return Value:
  128. // None.
  129. //
  130. //--
  131. /////////////////////////////////////////////////////////////////////////////
  132. void CKeys::Clear( void )
  133. {
  134. if ( ! m_klKeys.empty() )
  135. {
  136. KeyList::iterator _itCurrent = m_klKeys.begin();
  137. KeyList::iterator _itLast = m_klKeys.end();
  138. for ( ; _itCurrent != _itLast; _itCurrent++ )
  139. {
  140. delete (*_itCurrent);
  141. } // for:
  142. m_klKeys.erase( m_klKeys.begin(), _itLast );
  143. } // if:
  144. } //*** CKeys::Clear()
  145. /////////////////////////////////////////////////////////////////////////////
  146. //++
  147. //
  148. // CKeys::FindItem
  149. //
  150. // Description:
  151. // Find the passed in key in the vector and return its index.
  152. //
  153. // Arguments:
  154. // pwsKey [IN] - The node to find.
  155. // pnIndex [OUT] - Catches the node's index.
  156. //
  157. // Return Value:
  158. //
  159. //
  160. //--
  161. /////////////////////////////////////////////////////////////////////////////
  162. HRESULT CKeys::FindItem(
  163. IN LPWSTR pwsKey,
  164. OUT ULONG * pnIndex
  165. )
  166. {
  167. //ASSERT( pwsKey != NULL );
  168. //ASSERT( pnIndex != NULL );
  169. HRESULT _hr = E_POINTER;
  170. if ( ( pwsKey != NULL ) && ( pnIndex != NULL ) )
  171. {
  172. _hr = E_INVALIDARG;
  173. if ( ! m_klKeys.empty() )
  174. {
  175. CComBSTR * _pKey = NULL;
  176. KeyList::iterator _itCurrent = m_klKeys.begin();
  177. KeyList::iterator _itLast = m_klKeys.end();
  178. ULONG _iIndex;
  179. for ( _iIndex = 0; _itCurrent != _itLast; _itCurrent++, _iIndex++ )
  180. {
  181. _pKey = *_itCurrent;
  182. if ( _pKey && ( ClRtlStrICmp( pwsKey, (*_pKey) ) == 0 ) )
  183. {
  184. *pnIndex = _iIndex;
  185. _hr = S_OK;
  186. break;
  187. } // if: match!
  188. } // for: each item in the vector
  189. } // if: the vector is not empty
  190. } // if: args not NULL
  191. return _hr;
  192. } //*** CKeys::FindItem()
  193. /////////////////////////////////////////////////////////////////////////////
  194. //++
  195. //
  196. // CKeys::HrGetIndex
  197. //
  198. // Description:
  199. // Convert the passed in 1 based index into a 0 based index.
  200. //
  201. // Arguments:
  202. // varIndex [IN] - holds the 1 based index.
  203. // pnIndex [OUT] - catches the 0 based index.
  204. //
  205. // Return Value:
  206. // S_OK if successful, E_POINTER, or E_INVALIDARG if out of range.
  207. //
  208. //--
  209. /////////////////////////////////////////////////////////////////////////////
  210. HRESULT CKeys::HrGetIndex( IN VARIANT varIndex, OUT ULONG * pnIndex )
  211. {
  212. //ASSERT( pnIndex != NULL );
  213. HRESULT _hr = E_POINTER;
  214. if ( pnIndex != NULL )
  215. {
  216. ULONG _nIndex = 0;
  217. CComVariant _var;
  218. *pnIndex = 0;
  219. _hr = _var.Attach( &varIndex );
  220. if ( SUCCEEDED( _hr ) )
  221. {
  222. // Check to see if the index is a number.
  223. _hr = _var.ChangeType( VT_I4 );
  224. if ( SUCCEEDED( _hr ) )
  225. {
  226. _nIndex = _var.lVal;
  227. _nIndex--; // Adjust index to be 0 relative instead of 1 relative
  228. } // if: the variant is a number
  229. else
  230. {
  231. // Check to see if the index is a string
  232. _hr = _var.ChangeType( VT_BSTR );
  233. if ( SUCCEEDED( _hr ) )
  234. {
  235. _hr = FindItem( _var.bstrVal, &_nIndex );
  236. } // if: the variant is a string
  237. } // else:
  238. if ( SUCCEEDED( _hr ) )
  239. {
  240. if ( _nIndex < m_klKeys.size() )
  241. {
  242. *pnIndex = _nIndex;
  243. } // if: in range
  244. else
  245. {
  246. _hr = E_INVALIDARG;
  247. } // else: out of range
  248. } // if: we found an index value
  249. _var.Detach( &varIndex );
  250. } // if: we attched to the variant
  251. } // if: args not NULL
  252. return _hr;
  253. } //*** CKeys::HrGetIndex()
  254. /////////////////////////////////////////////////////////////////////////////
  255. //++
  256. //
  257. // CKeys::HrGetItem
  258. //
  259. // Description:
  260. // Get the key at the passed in index.
  261. //
  262. // Arguments:
  263. // varIndex [IN] - Contains the index of the requested key.
  264. // ppKey [OUT] - Catches the key.
  265. //
  266. // Return Value:
  267. // S_OK if successful, E_POINTER, or E_INVALIDARG if out of range.
  268. //
  269. //--
  270. /////////////////////////////////////////////////////////////////////////////
  271. HRESULT CKeys::HrGetItem( IN VARIANT varIndex, OUT BSTR * ppKey )
  272. {
  273. //ASSERT( ppKey != NULL );
  274. HRESULT _hr = E_POINTER;
  275. if ( ppKey != NULL )
  276. {
  277. ULONG _nIndex = 0;
  278. _hr = HrGetIndex( varIndex, &_nIndex );
  279. if ( SUCCEEDED( _hr ) )
  280. {
  281. *ppKey = m_klKeys[ _nIndex ]->Copy();
  282. _hr = S_OK;
  283. }
  284. }
  285. return _hr;
  286. } //*** CKeys::HrGetItem()
  287. /////////////////////////////////////////////////////////////////////////////
  288. //++
  289. //
  290. // CKeys::HrRemoveAt
  291. //
  292. // Description:
  293. // Remove the object from the vector at the passed in position.
  294. //
  295. // Arguments:
  296. // pos [IN] - the position of the object to remove.
  297. //
  298. // Return Value:
  299. // S_OK if successful, or E_INVALIDARG if the position is out of range.
  300. //
  301. //--
  302. /////////////////////////////////////////////////////////////////////////////
  303. HRESULT CKeys::HrRemoveAt( size_t pos )
  304. {
  305. KeyList::iterator _itCurrent = m_klKeys.begin();
  306. KeyList::const_iterator _itLast = m_klKeys.end();
  307. HRESULT _hr = E_INVALIDARG;
  308. size_t _iIndex;
  309. for ( _iIndex = 0; ( _iIndex < pos ) && ( _itCurrent != _itLast ); _iIndex++, _itCurrent++ )
  310. {
  311. } // for:
  312. if ( _itCurrent != _itLast )
  313. {
  314. m_klKeys.erase( _itCurrent );
  315. _hr = S_OK;
  316. }
  317. return _hr;
  318. } //*** CKeys::HrRemoveAt()
  319. /////////////////////////////////////////////////////////////////////////////
  320. //++
  321. //
  322. // CKeys::HrFindItem
  323. //
  324. // Description:
  325. // Find the passed in key in the collection.
  326. //
  327. // Arguments:
  328. // bstrKey [IN] - The key to find.
  329. // pnIndex [OUT] - Catches the index.
  330. //
  331. // Return Value:
  332. // S_OK if found, or E_INVALIDARG if not.
  333. //
  334. //--
  335. /////////////////////////////////////////////////////////////////////////////
  336. HRESULT CKeys::HrFindItem( IN BSTR bstrKey, OUT ULONG * pnIndex )
  337. {
  338. HRESULT _hr = E_INVALIDARG;
  339. if ( ! m_klKeys.empty() )
  340. {
  341. KeyList::iterator _itCurrent = m_klKeys.begin();
  342. KeyList::iterator _itLast = m_klKeys.end();
  343. ULONG _iIndex;
  344. for ( _iIndex = 0; _itCurrent != _itLast; _itCurrent++, _iIndex++ )
  345. {
  346. if ( lstrcmp( *(*_itCurrent), bstrKey ) == 0 )
  347. {
  348. *pnIndex = _iIndex;
  349. _hr = S_OK;
  350. break;
  351. }
  352. }
  353. } // if:
  354. return _hr;
  355. } //*** CKeys::HrFindItem()
  356. /////////////////////////////////////////////////////////////////////////////
  357. //++
  358. //
  359. // CKeys::HrGetCount
  360. //
  361. // Description:
  362. // Get the count of objects in the collection.
  363. //
  364. // Arguments:
  365. // plCount [OUT] - Catches the count.
  366. //
  367. // Return Value:
  368. // S_OK if successful or E_POINTER.
  369. //
  370. //--
  371. /////////////////////////////////////////////////////////////////////////////
  372. HRESULT CKeys::HrGetCount( OUT long * plCount )
  373. {
  374. //ASSERT( plCount != NULL );
  375. HRESULT _hr = E_POINTER;
  376. if ( plCount != NULL )
  377. {
  378. *plCount = m_klKeys.size();
  379. _hr = S_OK;
  380. }
  381. return _hr;
  382. } //*** CKeys::HrGetCount()
  383. /////////////////////////////////////////////////////////////////////////////
  384. //++
  385. //
  386. // CKeys::HrAddItem
  387. //
  388. // Description:
  389. // Create a new key and add it to the collection.
  390. //
  391. // Arguments:
  392. // bstrKey [IN] - Registry key to add to the collection.
  393. //
  394. // Return Value:
  395. // S_OK if successful, E_POINTER, or other HRESULT error.
  396. //
  397. //--
  398. /////////////////////////////////////////////////////////////////////////////
  399. HRESULT CKeys::HrAddItem( IN BSTR bstrKey )
  400. {
  401. //ASSERT( bstrKey != NULL );
  402. HRESULT _hr = E_POINTER;
  403. if ( bstrKey != NULL )
  404. {
  405. ULONG _nIndex;
  406. _hr = HrFindItem( bstrKey, &_nIndex );
  407. if ( FAILED( _hr ) )
  408. {
  409. CComBSTR * pbstr = NULL;
  410. pbstr = new CComBSTR( bstrKey );
  411. if ( pbstr != NULL )
  412. {
  413. m_klKeys.insert( m_klKeys.end(), pbstr );
  414. _hr = S_OK;
  415. } // if:
  416. else
  417. {
  418. _hr = E_OUTOFMEMORY;
  419. } // else:
  420. }
  421. else
  422. {
  423. _hr = E_INVALIDARG;
  424. } // else:
  425. }
  426. return _hr;
  427. } //*** CKeys::HrAddItem()
  428. /////////////////////////////////////////////////////////////////////////////
  429. //++
  430. //
  431. // CKeys::HrRemoveItem
  432. //
  433. // Description:
  434. // Remove the key at the passed in index.
  435. //
  436. // Arguments:
  437. // varIndex [IN] - contains the index to remove.
  438. //
  439. // Return Value:
  440. // S_OK if successful, or other HRESULT error.
  441. //
  442. //--
  443. /////////////////////////////////////////////////////////////////////////////
  444. HRESULT CKeys::HrRemoveItem( IN VARIANT varIndex )
  445. {
  446. HRESULT _hr = S_OK;
  447. ULONG _nIndex = 0;
  448. _hr = HrGetIndex( varIndex, &_nIndex );
  449. if ( SUCCEEDED( _hr ) )
  450. {
  451. delete m_klKeys[ _nIndex ];
  452. HrRemoveAt( _nIndex );
  453. }
  454. return _hr;
  455. } //*** CKeys::HrRemoveItem()
  456. //*************************************************************************//
  457. /////////////////////////////////////////////////////////////////////////////
  458. // CResourceKeys class
  459. /////////////////////////////////////////////////////////////////////////////
  460. /////////////////////////////////////////////////////////////////////////////
  461. //++
  462. //
  463. // CResourceKeys::HrRefresh
  464. //
  465. // Description:
  466. // Load the collection from the cluster database.
  467. //
  468. // Arguments:
  469. // dwControlCode [IN] - Control code
  470. //
  471. // Return Value:
  472. // S_OK if successful, or other HRESULT error.
  473. //
  474. //--
  475. /////////////////////////////////////////////////////////////////////////////
  476. HRESULT CResourceKeys::HrRefresh( IN DWORD dwControlCode )
  477. {
  478. HRESULT _hr = S_FALSE;
  479. PWSTR _psz = NULL;
  480. DWORD _cbPsz = 512;
  481. DWORD _cbRequired = 0;
  482. DWORD _sc = ERROR_SUCCESS;
  483. _psz = (PWSTR) ::LocalAlloc( LMEM_ZEROINIT, _cbPsz );
  484. if ( _psz != NULL )
  485. {
  486. _sc = ::ClusterResourceControl(
  487. m_hResource,
  488. NULL,
  489. dwControlCode,
  490. NULL,
  491. 0,
  492. _psz,
  493. _cbPsz,
  494. &_cbRequired
  495. );
  496. if ( _sc == ERROR_MORE_DATA )
  497. {
  498. ::LocalFree( _psz );
  499. _psz = NULL;
  500. _cbPsz = _cbRequired;
  501. _psz = (PWSTR) ::LocalAlloc( LMEM_ZEROINIT, _cbPsz );
  502. if ( _psz != NULL )
  503. {
  504. _sc = ::ClusterResourceControl(
  505. m_hResource,
  506. NULL,
  507. dwControlCode,
  508. NULL,
  509. 0,
  510. _psz,
  511. _cbPsz,
  512. &_cbRequired
  513. );
  514. _hr = HRESULT_FROM_WIN32( _sc );
  515. } // if: alloc OK
  516. else
  517. {
  518. _sc = GetLastError();
  519. _hr = HRESULT_FROM_WIN32( _sc );
  520. } // else: alloc failed
  521. } // if: error was no more item, re-alloc and try again.
  522. else
  523. {
  524. _hr = HRESULT_FROM_WIN32( _sc );
  525. } // else: error was not no more items -- could be no error
  526. if ( SUCCEEDED( _hr ) )
  527. {
  528. CComBSTR * _pbstr = NULL;
  529. Clear();
  530. while( *_psz != L'\0' )
  531. {
  532. _pbstr = new CComBSTR( _psz );
  533. if ( _pbstr != NULL )
  534. {
  535. m_klKeys.insert( m_klKeys.end(), _pbstr );
  536. _psz += wcslen( _psz ) + 1;
  537. _pbstr = NULL;
  538. } // if:
  539. else
  540. {
  541. _hr = E_OUTOFMEMORY;
  542. break;
  543. } // else:
  544. } // while: not EOS
  545. } // if: keys were retrieved ok
  546. ::LocalFree( _psz );
  547. } // if: alloc ok
  548. else
  549. {
  550. _sc = GetLastError();
  551. _hr = HRESULT_FROM_WIN32( _sc );
  552. } // else: alloc failed
  553. return _hr;
  554. } //*** CResourceKeys::HrRefresh()
  555. /////////////////////////////////////////////////////////////////////////////
  556. //++
  557. //
  558. // CResourceKeys::HrAddItem
  559. //
  560. // Description:
  561. // Create a new key and add it to the collection.
  562. //
  563. // Arguments:
  564. // bstrKey [IN] - Registry key to add to the collection.
  565. // dwControlCode [IN] - Control code
  566. //
  567. // Return Value:
  568. // S_OK if successful, E_POINTER, or other HRESULT error.
  569. //
  570. //--
  571. /////////////////////////////////////////////////////////////////////////////
  572. HRESULT CResourceKeys::HrAddItem(
  573. IN BSTR bstrKey,
  574. IN DWORD dwControlCode
  575. )
  576. {
  577. //ASSERT( bstrKey != NULL );
  578. HRESULT _hr = E_POINTER;
  579. if ( bstrKey != NULL )
  580. {
  581. DWORD _sc = ERROR_SUCCESS;
  582. _sc = ::ClusterResourceControl(
  583. m_hResource,
  584. NULL,
  585. dwControlCode,
  586. bstrKey,
  587. ( wcslen( bstrKey ) + 1) * sizeof( WCHAR ),
  588. NULL,
  589. 0,
  590. NULL
  591. );
  592. _hr = HRESULT_FROM_WIN32( _sc );
  593. if ( SUCCEEDED( _hr ) )
  594. {
  595. _hr = CKeys::HrAddItem( bstrKey );
  596. } // if:
  597. } // if:
  598. return _hr;
  599. } //*** CResourceKeys::HrAddItem()
  600. /////////////////////////////////////////////////////////////////////////////
  601. //++
  602. //
  603. // CResourceKeys::HrRemoveItem
  604. //
  605. // Description:
  606. // Remove the key at the passed in index.
  607. //
  608. // Arguments:
  609. // varIndex [IN] - contains the index to remove.
  610. // dwControlCode [IN] - Control code
  611. //
  612. // Return Value:
  613. // S_OK if successful, or other HRESULT error.
  614. //
  615. //--
  616. /////////////////////////////////////////////////////////////////////////////
  617. HRESULT CResourceKeys::HrRemoveItem(
  618. IN VARIANT varIndex,
  619. IN DWORD dwControlCode
  620. )
  621. {
  622. HRESULT _hr = S_OK;
  623. ULONG _nIndex = 0;
  624. _hr = HrGetIndex( varIndex, &_nIndex );
  625. if ( SUCCEEDED( _hr ) )
  626. {
  627. DWORD _sc = ERROR_SUCCESS;
  628. CComBSTR * _pbstr = NULL;
  629. _pbstr = m_klKeys[ _nIndex ];
  630. _sc = ::ClusterResourceControl(
  631. m_hResource,
  632. NULL,
  633. dwControlCode,
  634. (BSTR) (*_pbstr),
  635. ( _pbstr->Length() + 1 ) * sizeof( WCHAR ),
  636. NULL,
  637. 0,
  638. NULL
  639. );
  640. _hr = HRESULT_FROM_WIN32( _sc );
  641. if ( SUCCEEDED( _hr ) )
  642. {
  643. _hr = CKeys::HrRemoveItem( varIndex );
  644. }
  645. }
  646. return _hr;
  647. } //*** CResourceKeys::HrRemoveItem()
  648. //*************************************************************************//
  649. /////////////////////////////////////////////////////////////////////////////
  650. // CClusResourceRegistryKeys class
  651. /////////////////////////////////////////////////////////////////////////////
  652. /////////////////////////////////////////////////////////////////////////////
  653. //++
  654. //
  655. // CClusResourceRegistryKeys::CClusResourceRegistryKeys
  656. //
  657. // Description:
  658. // Constructor.
  659. //
  660. // Arguments:
  661. // None.
  662. //
  663. // Return Value:
  664. // None.
  665. //
  666. //--
  667. /////////////////////////////////////////////////////////////////////////////
  668. CClusResourceRegistryKeys::CClusResourceRegistryKeys( void )
  669. {
  670. m_hResource = NULL;
  671. m_piids = (const IID *) iidCClusRegistryKeys;
  672. m_piidsSize = ARRAYSIZE( iidCClusRegistryKeys );
  673. } //*** CClusResourceRegistryKeys::CClusResourceRegistryKeys()
  674. /////////////////////////////////////////////////////////////////////////////
  675. //++
  676. //
  677. // CClusResourceRegistryKeys::Create
  678. //
  679. // Description:
  680. // Finish creating the object by doing things that cannot be done in
  681. // a light weight constructor.
  682. //
  683. // Arguments:
  684. // hResource [IN] - Resource this collection belongs to.
  685. //
  686. // Return Value:
  687. // S_OK if successful.
  688. //
  689. //--
  690. /////////////////////////////////////////////////////////////////////////////
  691. HRESULT CClusResourceRegistryKeys::Create( IN HRESOURCE hResource )
  692. {
  693. m_hResource = hResource;
  694. return S_OK;
  695. } //*** CClusResourceRegistryKeys::Create()
  696. /////////////////////////////////////////////////////////////////////////////
  697. //++
  698. //
  699. // CClusResourceRegistryKeys::get_Count
  700. //
  701. // Description:
  702. // Get the count of objects in the collection.
  703. //
  704. // Arguments:
  705. // plCount [OUT] - Catches the count.
  706. //
  707. // Return Value:
  708. // S_OK if successful or E_POINTER.
  709. //
  710. //--
  711. /////////////////////////////////////////////////////////////////////////////
  712. STDMETHODIMP CClusResourceRegistryKeys::get_Count( OUT long * plCount )
  713. {
  714. return CKeys::HrGetCount( plCount );
  715. } //*** CClusResourceRegistryKeys::get_Count()
  716. /////////////////////////////////////////////////////////////////////////////
  717. //++
  718. //
  719. // CClusResourceRegistryKeys::get_Item
  720. //
  721. // Description:
  722. // Get the item (key) at the passed in index.
  723. //
  724. // Arguments:
  725. // varIndex [IN] - Contains the index requested.
  726. // ppbstrRegistryKey [OUT] - Catches the key.
  727. //
  728. // Return Value:
  729. // S_OK if successful, E_POINTER, or other HRESULT error.
  730. //
  731. //--
  732. /////////////////////////////////////////////////////////////////////////////
  733. STDMETHODIMP CClusResourceRegistryKeys::get_Item(
  734. IN VARIANT varIndex,
  735. OUT BSTR * ppbstrRegistryKey
  736. )
  737. {
  738. return HrGetItem( varIndex, ppbstrRegistryKey );
  739. } //*** CClusResourceRegistryKeys::get_Item()
  740. /////////////////////////////////////////////////////////////////////////////
  741. //++
  742. //
  743. // CClusResourceRegistryKeys::get__NewEnum
  744. //
  745. // Description:
  746. // Create and return a new enumeration for this collection.
  747. //
  748. // Arguments:
  749. // ppunk [OUT] - Catches the new enumeration.
  750. //
  751. // Return Value:
  752. // S_OK if successful, E_POINTER, or other HRESULT error.
  753. //
  754. //--
  755. /////////////////////////////////////////////////////////////////////////////
  756. STDMETHODIMP CClusResourceRegistryKeys::get__NewEnum( IUnknown ** ppunk )
  757. {
  758. return ::HrNewCComBSTREnum< KeyList >( ppunk, m_klKeys );
  759. } //*** CClusResourceRegistryKeys::get__NewEnum()
  760. /////////////////////////////////////////////////////////////////////////////
  761. //++
  762. //
  763. // CClusResourceRegistryKeys::AddItem
  764. //
  765. // Description:
  766. // Create a new item (key) and add it to the collection.
  767. //
  768. // Arguments:
  769. // bstrRegistryKey [IN] - Registry key to add to the collection.
  770. //
  771. // Return Value:
  772. // S_OK if successful, E_POINTER, or other HRESULT error.
  773. //
  774. //--
  775. /////////////////////////////////////////////////////////////////////////////
  776. STDMETHODIMP CClusResourceRegistryKeys::AddItem(
  777. IN BSTR bstrRegistryKey
  778. )
  779. {
  780. return HrAddItem( bstrRegistryKey, CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT );
  781. } //*** CClusResourceRegistryKeys::AddItem()
  782. /////////////////////////////////////////////////////////////////////////////
  783. //++
  784. //
  785. // CClusResourceRegistryKeys::RemoveItem
  786. //
  787. // Description:
  788. // Remove the item (key) at the passed in index.
  789. //
  790. // Arguments:
  791. // varIndex [IN] - contains the index to remove.
  792. //
  793. // Return Value:
  794. // S_OK if successful, or other HRESULT error.
  795. //
  796. //--
  797. /////////////////////////////////////////////////////////////////////////////
  798. STDMETHODIMP CClusResourceRegistryKeys::RemoveItem( IN VARIANT varIndex )
  799. {
  800. return HrRemoveItem( varIndex, CLUSCTL_RESOURCE_DELETE_REGISTRY_CHECKPOINT );
  801. } //*** CClusResourceRegistryKeys::RemoveItem()
  802. /////////////////////////////////////////////////////////////////////////////
  803. //++
  804. //
  805. // CClusResourceRegistryKeys::Refresh
  806. //
  807. // Description:
  808. // Load the collection from the cluster database.
  809. //
  810. // Arguments:
  811. // None.
  812. //
  813. // Return Value:
  814. // S_OK if successful, or other HRESULT error.
  815. //
  816. //--
  817. /////////////////////////////////////////////////////////////////////////////
  818. STDMETHODIMP CClusResourceRegistryKeys::Refresh( void )
  819. {
  820. return HrRefresh( CLUSCTL_RESOURCE_GET_REGISTRY_CHECKPOINTS );
  821. } //*** CClusResourceRegistryKeys::Refresh()
  822. //*************************************************************************//
  823. #if CLUSAPI_VERSION >= 0x0500
  824. /////////////////////////////////////////////////////////////////////////////
  825. // CClusResourceCryptoKeys class
  826. /////////////////////////////////////////////////////////////////////////////
  827. /////////////////////////////////////////////////////////////////////////////
  828. //++
  829. //
  830. // CClusResourceCryptoKeys::CClusResourceCryptoKeys
  831. //
  832. // Description:
  833. // Constructor.
  834. //
  835. // Arguments:
  836. // None.
  837. //
  838. // Return Value:
  839. // None.
  840. //
  841. //--
  842. /////////////////////////////////////////////////////////////////////////////
  843. CClusResourceCryptoKeys::CClusResourceCryptoKeys( void )
  844. {
  845. m_hResource = NULL;
  846. m_piids = (const IID *) iidCClusCryptoKeys;
  847. m_piidsSize = ARRAYSIZE( iidCClusCryptoKeys );
  848. } //*** CClusResourceCryptoKeys::CClusResourceCryptoKeys()
  849. /////////////////////////////////////////////////////////////////////////////
  850. //++
  851. //
  852. // CClusResourceCryptoKeys::Create
  853. //
  854. // Description:
  855. // Finish creating the object by doing things that cannot be done in
  856. // a light weight constructor.
  857. //
  858. // Arguments:
  859. // hResource [IN] - Resource this collection belongs to.
  860. //
  861. // Return Value:
  862. // S_OK if successful.
  863. //
  864. //--
  865. /////////////////////////////////////////////////////////////////////////////
  866. HRESULT CClusResourceCryptoKeys::Create( IN HRESOURCE hResource )
  867. {
  868. m_hResource = hResource;
  869. return S_OK;
  870. } //*** CClusResourceCryptoKeys::Create()
  871. /////////////////////////////////////////////////////////////////////////////
  872. //++
  873. //
  874. // CClusResourceCryptoKeys::get_Count
  875. //
  876. // Description:
  877. // Get the count of objects in the collection.
  878. //
  879. // Arguments:
  880. // plCount [OUT] - Catches the count.
  881. //
  882. // Return Value:
  883. // S_OK if successful or E_POINTER.
  884. //
  885. //--
  886. /////////////////////////////////////////////////////////////////////////////
  887. STDMETHODIMP CClusResourceCryptoKeys::get_Count( OUT long * plCount )
  888. {
  889. return CKeys::HrGetCount( plCount );
  890. } //*** CClusResourceCryptoKeys::get_Count()
  891. /////////////////////////////////////////////////////////////////////////////
  892. //++
  893. //
  894. // CClusResourceCryptoKeys::get_Item
  895. //
  896. // Description:
  897. // Get the item (key) at the passed in index.
  898. //
  899. // Arguments:
  900. // varIndex [IN] - Contains the index requested.
  901. // ppbstrRegistryKey [OUT] - Catches the key.
  902. //
  903. // Return Value:
  904. // S_OK if successful, E_POINTER, or other HRESULT error.
  905. //
  906. //--
  907. /////////////////////////////////////////////////////////////////////////////
  908. STDMETHODIMP CClusResourceCryptoKeys::get_Item(
  909. IN VARIANT varIndex,
  910. OUT BSTR * ppbstrRegistryKey
  911. )
  912. {
  913. return HrGetItem( varIndex, ppbstrRegistryKey );
  914. } //*** CClusResourceCryptoKeys::get_Item()
  915. /////////////////////////////////////////////////////////////////////////////
  916. //++
  917. //
  918. // CClusResourceCryptoKeys::get__NewEnum
  919. //
  920. // Description:
  921. // Create and return a new enumeration for this collection.
  922. //
  923. // Arguments:
  924. // ppunk [OUT] - Catches the new enumeration.
  925. //
  926. // Return Value:
  927. // S_OK if successful, E_POINTER, or other HRESULT error.
  928. //
  929. //--
  930. /////////////////////////////////////////////////////////////////////////////
  931. STDMETHODIMP CClusResourceCryptoKeys::get__NewEnum( IUnknown ** ppunk )
  932. {
  933. return ::HrNewCComBSTREnum< KeyList >( ppunk, m_klKeys );
  934. } //*** CClusResourceCryptoKeys::get__NewEnum()
  935. /////////////////////////////////////////////////////////////////////////////
  936. //++
  937. //
  938. // CClusResourceCryptoKeys::AddItem
  939. //
  940. // Description:
  941. // Create a new item (key) and add it to the collection.
  942. //
  943. // Arguments:
  944. // bstrRegistryKey [IN] - Registry key to add to the collection.
  945. //
  946. // Return Value:
  947. // S_OK if successful, E_POINTER, or other HRESULT error.
  948. //
  949. //--
  950. /////////////////////////////////////////////////////////////////////////////
  951. STDMETHODIMP CClusResourceCryptoKeys::AddItem(
  952. IN BSTR bstrRegistryKey
  953. )
  954. {
  955. return HrAddItem( bstrRegistryKey, CLUSCTL_RESOURCE_ADD_CRYPTO_CHECKPOINT );
  956. } //*** CClusResourceCryptoKeys::AddItem()
  957. /////////////////////////////////////////////////////////////////////////////
  958. //++
  959. //
  960. // CClusResourceCryptoKeys::RemoveItem
  961. //
  962. // Description:
  963. // Remove the item (key) at the passed in index.
  964. //
  965. // Arguments:
  966. // varIndex [IN] - contains the index to remove.
  967. //
  968. // Return Value:
  969. // S_OK if successful, or other HRESULT error.
  970. //
  971. //--
  972. /////////////////////////////////////////////////////////////////////////////
  973. STDMETHODIMP CClusResourceCryptoKeys::RemoveItem( IN VARIANT varIndex )
  974. {
  975. return HrRemoveItem( varIndex, CLUSCTL_RESOURCE_DELETE_CRYPTO_CHECKPOINT );
  976. } //*** CClusResourceCryptoKeys::RemoveItem()
  977. /////////////////////////////////////////////////////////////////////////////
  978. //++
  979. //
  980. // CClusResourceCryptoKeys::Refresh
  981. //
  982. // Description:
  983. // Load the collection from the cluster database.
  984. //
  985. // Arguments:
  986. // None.
  987. //
  988. // Return Value:
  989. // S_OK if successful, or other HRESULT error.
  990. //
  991. //--
  992. /////////////////////////////////////////////////////////////////////////////
  993. STDMETHODIMP CClusResourceCryptoKeys::Refresh( void )
  994. {
  995. return HrRefresh( CLUSCTL_RESOURCE_GET_CRYPTO_CHECKPOINTS );
  996. } //*** CClusResourceCryptoKeys::Refresh()
  997. #endif // CLUSAPI_VERSION >= 0x0500
  998. //*************************************************************************//
  999. /////////////////////////////////////////////////////////////////////////////
  1000. // CResTypeKeys class
  1001. /////////////////////////////////////////////////////////////////////////////
  1002. /////////////////////////////////////////////////////////////////////////////
  1003. //++
  1004. //
  1005. // CResTypeKeys::HrRefresh
  1006. //
  1007. // Description:
  1008. // Load the collection from the cluster database.
  1009. //
  1010. // Arguments:
  1011. // dwControlCode [IN] - Control code
  1012. //
  1013. // Return Value:
  1014. // S_OK if successful, or other HRESULT error.
  1015. //
  1016. //--
  1017. /////////////////////////////////////////////////////////////////////////////
  1018. HRESULT CResTypeKeys::HrRefresh( IN DWORD dwControlCode )
  1019. {
  1020. HRESULT _hr = S_FALSE;
  1021. PWSTR _psz = NULL;
  1022. DWORD _cbPsz = 512;
  1023. DWORD _cbRequired = 0;
  1024. DWORD _sc = ERROR_SUCCESS;
  1025. HCLUSTER hCluster = NULL;
  1026. _hr = m_pClusRefObject->get_Handle( (ULONG_PTR *) &hCluster );
  1027. if ( SUCCEEDED( _hr ) )
  1028. {
  1029. _psz = (PWSTR) ::LocalAlloc( LMEM_ZEROINIT, _cbPsz );
  1030. if ( _psz != NULL )
  1031. {
  1032. _sc = ::ClusterResourceTypeControl(
  1033. hCluster,
  1034. m_bstrResourceTypeName,
  1035. NULL,
  1036. dwControlCode,
  1037. NULL,
  1038. 0,
  1039. _psz,
  1040. _cbPsz,
  1041. &_cbRequired
  1042. );
  1043. if ( _sc == ERROR_MORE_DATA )
  1044. {
  1045. ::LocalFree( _psz );
  1046. _psz = NULL;
  1047. _cbPsz = _cbRequired;
  1048. _psz = (PWSTR) ::LocalAlloc( LMEM_ZEROINIT, _cbPsz );
  1049. if ( _psz != NULL )
  1050. {
  1051. _sc = ::ClusterResourceTypeControl(
  1052. hCluster,
  1053. m_bstrResourceTypeName,
  1054. NULL,
  1055. dwControlCode,
  1056. NULL,
  1057. 0,
  1058. _psz,
  1059. _cbPsz,
  1060. &_cbRequired
  1061. );
  1062. _hr = HRESULT_FROM_WIN32( _sc );
  1063. } // if: alloc OK
  1064. else
  1065. {
  1066. _sc = GetLastError();
  1067. _hr = HRESULT_FROM_WIN32( _sc );
  1068. } // else: alloc failed
  1069. } // if: error was no more item, re-alloc and try again.
  1070. else
  1071. {
  1072. _hr = HRESULT_FROM_WIN32( _sc );
  1073. } // else: error was not no more items -- could be no error
  1074. if ( SUCCEEDED( _hr ) )
  1075. {
  1076. CComBSTR * _pbstr = NULL;
  1077. Clear();
  1078. while( *_psz != L'\0' )
  1079. {
  1080. _pbstr = new CComBSTR( _psz );
  1081. if ( _pbstr != NULL )
  1082. {
  1083. m_klKeys.insert( m_klKeys.end(), _pbstr );
  1084. _psz += wcslen( _psz ) + 1;
  1085. _pbstr = NULL;
  1086. } // if:
  1087. else
  1088. {
  1089. _hr = E_OUTOFMEMORY;
  1090. break;
  1091. } // else:
  1092. } // while: not EOS
  1093. } // if: keys were retrieved ok
  1094. } // if: alloc ok
  1095. else
  1096. {
  1097. _sc = GetLastError();
  1098. _hr = HRESULT_FROM_WIN32( _sc );
  1099. } // else: alloc failed
  1100. } // if: we got a cluster handle
  1101. return _hr;
  1102. } //*** CResTypeKeys::HrRefresh()