///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1999 Microsoft Corporation // // Module Name: // ClusKeys.cpp // // Description: // Implementation of the cluster registry and crypto key collection // classes for the MSCLUS automation classes. // // Author: // Galen Barbee (galenb) 12-Feb-1999 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #if CLUSAPI_VERSION >= 0x0500 #include #else #include "PropList.h" #endif // CLUSAPI_VERSION >= 0x0500 #include "ClusKeys.h" ///////////////////////////////////////////////////////////////////////////// // Global variables ///////////////////////////////////////////////////////////////////////////// static const IID * iidCClusRegistryKeys[] = { &IID_ISClusRegistryKeys }; static const IID * iidCClusCryptoKeys[] = { &IID_ISClusCryptoKeys }; //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CKeys class ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::CKeys // // Description: // Constructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CKeys::CKeys( void ) { m_pClusRefObject = NULL; } //*** CKeys::CKeys() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::~CKeys // // Description: // Destructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CKeys::~CKeys( void ) { Clear(); if ( m_pClusRefObject != NULL ) { m_pClusRefObject->Release(); m_pClusRefObject = NULL; } } //*** CKeys::~CKeys() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::HrCreate // // Description: // Finish creating the object by doing things that cannot be done in // a light weight constructor. // // Arguments: // pClusRefObject [IN] - Wraps the cluster handle. // // Return Value: // S_OK if successful or E_POINTER if not. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::HrCreate( IN ISClusRefObject * pClusRefObject ) { ASSERT( pClusRefObject != NULL ); HRESULT _hr = E_POINTER; if ( pClusRefObject != NULL ) { m_pClusRefObject = pClusRefObject; m_pClusRefObject->AddRef(); _hr = S_OK; } return _hr; } //*** CKeys::HrCreate() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::Clear // // Description: // Empty the vector of keys. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CKeys::Clear( void ) { if ( ! m_klKeys.empty() ) { KeyList::iterator _itCurrent = m_klKeys.begin(); KeyList::iterator _itLast = m_klKeys.end(); for ( ; _itCurrent != _itLast; _itCurrent++ ) { delete (*_itCurrent); } // for: m_klKeys.erase( m_klKeys.begin(), _itLast ); } // if: } //*** CKeys::Clear() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::FindItem // // Description: // Find the passed in key in the vector and return its index. // // Arguments: // pwsKey [IN] - The node to find. // pnIndex [OUT] - Catches the node's index. // // Return Value: // // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::FindItem( IN LPWSTR pwsKey, OUT ULONG * pnIndex ) { //ASSERT( pwsKey != NULL ); //ASSERT( pnIndex != NULL ); HRESULT _hr = E_POINTER; if ( ( pwsKey != NULL ) && ( pnIndex != NULL ) ) { _hr = E_INVALIDARG; if ( ! m_klKeys.empty() ) { CComBSTR * _pKey = NULL; KeyList::iterator _itCurrent = m_klKeys.begin(); KeyList::iterator _itLast = m_klKeys.end(); ULONG _iIndex; for ( _iIndex = 0; _itCurrent != _itLast; _itCurrent++, _iIndex++ ) { _pKey = *_itCurrent; if ( _pKey && ( lstrcmpi( pwsKey, (*_pKey) ) == 0 ) ) { *pnIndex = _iIndex; _hr = S_OK; break; } // if: match! } // for: each item in the vector } // if: the vector is not empty } // if: args not NULL return _hr; } //*** CKeys::FindItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::HrGetIndex // // Description: // Convert the passed in 1 based index into a 0 based index. // // Arguments: // varIndex [IN] - holds the 1 based index. // pnIndex [OUT] - catches the 0 based index. // // Return Value: // S_OK if successful, E_POINTER, or E_INVALIDARG if out of range. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::HrGetIndex( IN VARIANT varIndex, OUT ULONG * pnIndex ) { //ASSERT( pnIndex != NULL ); HRESULT _hr = E_POINTER; if ( pnIndex != NULL ) { ULONG _nIndex = 0; CComVariant _var; *pnIndex = 0; _hr = _var.Attach( &varIndex ); if ( SUCCEEDED( _hr ) ) { // Check to see if the index is a number. _hr = _var.ChangeType( VT_I4 ); if ( SUCCEEDED( _hr ) ) { _nIndex = _var.lVal; _nIndex--; // Adjust index to be 0 relative instead of 1 relative } // if: the variant is a number else { // Check to see if the index is a string _hr = _var.ChangeType( VT_BSTR ); if ( SUCCEEDED( _hr ) ) { _hr = FindItem( _var.bstrVal, &_nIndex ); } // if: the variant is a string } // else: if ( SUCCEEDED( _hr ) ) { if ( _nIndex < m_klKeys.size() ) { *pnIndex = _nIndex; } // if: in range else { _hr = E_INVALIDARG; } // else: out of range } // if: we found an index value _var.Detach( &varIndex ); } // if: we attched to the variant } // if: args not NULL return _hr; } //*** CKeys::HrGetIndex() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::HrGetItem // // Description: // Get the key at the passed in index. // // Arguments: // varIndex [IN] - Contains the index of the requested key. // ppKey [OUT] - Catches the key. // // Return Value: // S_OK if successful, E_POINTER, or E_INVALIDARG if out of range. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::HrGetItem( IN VARIANT varIndex, OUT BSTR * ppKey ) { //ASSERT( ppKey != NULL ); HRESULT _hr = E_POINTER; if ( ppKey != NULL ) { ULONG _nIndex = 0; _hr = HrGetIndex( varIndex, &_nIndex ); if ( SUCCEEDED( _hr ) ) { *ppKey = m_klKeys[ _nIndex ]->Copy(); _hr = S_OK; } } return _hr; } //*** CKeys::HrGetItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::HrRemoveAt // // Description: // Remove the object from the vector at the passed in position. // // Arguments: // pos [IN] - the position of the object to remove. // // Return Value: // S_OK if successful, or E_INVALIDARG if the position is out of range. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::HrRemoveAt( size_t pos ) { KeyList::iterator _itCurrent = m_klKeys.begin(); KeyList::const_iterator _itLast = m_klKeys.end(); HRESULT _hr = E_INVALIDARG; size_t _iIndex; for ( _iIndex = 0; ( _iIndex < pos ) && ( _itCurrent != _itLast ); _iIndex++, _itCurrent++ ) { } // for: if ( _itCurrent != _itLast ) { m_klKeys.erase( _itCurrent ); _hr = S_OK; } return _hr; } //*** CKeys::HrRemoveAt() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::HrFindItem // // Description: // Find the passed in key in the collection. // // Arguments: // bstrKey [IN] - The key to find. // pnIndex [OUT] - Catches the index. // // Return Value: // S_OK if found, or E_INVALIDARG if not. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::HrFindItem( IN BSTR bstrKey, OUT ULONG * pnIndex ) { HRESULT _hr = E_INVALIDARG; if ( ! m_klKeys.empty() ) { KeyList::iterator _itCurrent = m_klKeys.begin(); KeyList::iterator _itLast = m_klKeys.end(); ULONG _iIndex; for ( _iIndex = 0; _itCurrent != _itLast; _itCurrent++, _iIndex++ ) { if ( lstrcmp( *(*_itCurrent), bstrKey ) == 0 ) { *pnIndex = _iIndex; _hr = S_OK; break; } } } // if: return _hr; } //*** CKeys::HrFindItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::HrGetCount // // Description: // Get the count of objects in the collection. // // Arguments: // plCount [OUT] - Catches the count. // // Return Value: // S_OK if successful or E_POINTER. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::HrGetCount( OUT long * plCount ) { //ASSERT( plCount != NULL ); HRESULT _hr = E_POINTER; if ( plCount != NULL ) { *plCount = m_klKeys.size(); _hr = S_OK; } return _hr; } //*** CKeys::HrGetCount() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::HrAddItem // // Description: // Create a new key and add it to the collection. // // Arguments: // bstrKey [IN] - Registry key to add to the collection. // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::HrAddItem( IN BSTR bstrKey ) { //ASSERT( bstrKey != NULL ); HRESULT _hr = E_POINTER; if ( bstrKey != NULL ) { ULONG _nIndex; _hr = HrFindItem( bstrKey, &_nIndex ); if ( FAILED( _hr ) ) { CComBSTR * pbstr = NULL; pbstr = new CComBSTR( bstrKey ); if ( pbstr != NULL ) { m_klKeys.insert( m_klKeys.end(), pbstr ); _hr = S_OK; } // if: else { _hr = E_OUTOFMEMORY; } // else: } else { _hr = E_INVALIDARG; } // else: } return _hr; } //*** CKeys::HrAddItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CKeys::HrRemoveItem // // Description: // Remove the key at the passed in index. // // Arguments: // varIndex [IN] - contains the index to remove. // // Return Value: // S_OK if successful, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CKeys::HrRemoveItem( IN VARIANT varIndex ) { HRESULT _hr = S_OK; ULONG _nIndex = 0; _hr = HrGetIndex( varIndex, &_nIndex ); if ( SUCCEEDED( _hr ) ) { delete m_klKeys[ _nIndex ]; HrRemoveAt( _nIndex ); } return _hr; } //*** CKeys::HrRemoveItem() //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CResourceKeys class ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CResourceKeys::HrRefresh // // Description: // Load the collection from the cluster database. // // Arguments: // dwControlCode [IN] - Control code // // Return Value: // S_OK if successful, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResourceKeys::HrRefresh( IN DWORD dwControlCode ) { HRESULT _hr = S_FALSE; PWSTR _psz = NULL; DWORD _cbPsz = 512; DWORD _cbRequired = 0; DWORD _sc = ERROR_SUCCESS; _psz = (PWSTR) ::LocalAlloc( LMEM_ZEROINIT, _cbPsz ); if ( _psz != NULL ) { _sc = ::ClusterResourceControl( m_hResource, NULL, dwControlCode, NULL, 0, _psz, _cbPsz, &_cbRequired ); if ( _sc == ERROR_MORE_DATA ) { ::LocalFree( _psz ); _psz = NULL; _cbPsz = _cbRequired; _psz = (PWSTR) ::LocalAlloc( LMEM_ZEROINIT, _cbPsz ); if ( _psz != NULL ) { _sc = ::ClusterResourceControl( m_hResource, NULL, dwControlCode, NULL, 0, _psz, _cbPsz, &_cbRequired ); _hr = HRESULT_FROM_WIN32( _sc ); } // if: alloc OK else { _sc = GetLastError(); _hr = HRESULT_FROM_WIN32( _sc ); } // else: alloc failed } // if: error was no more item, re-alloc and try again. else { _hr = HRESULT_FROM_WIN32( _sc ); } // else: error was not no more items -- could be no error if ( SUCCEEDED( _hr ) ) { CComBSTR * _pbstr = NULL; Clear(); while( *_psz != L'\0' ) { _pbstr = new CComBSTR( _psz ); if ( _pbstr != NULL ) { m_klKeys.insert( m_klKeys.end(), _pbstr ); _psz += lstrlenW( _psz ) + 1; _pbstr = NULL; } // if: else { _hr = E_OUTOFMEMORY; break; } // else: } // while: not EOS } // if: keys were retrieved ok ::LocalFree( _psz ); } // if: alloc ok else { _sc = GetLastError(); _hr = HRESULT_FROM_WIN32( _sc ); } // else: alloc failed return _hr; } //*** CResourceKeys::HrRefresh() ///////////////////////////////////////////////////////////////////////////// //++ // // CResourceKeys::HrAddItem // // Description: // Create a new key and add it to the collection. // // Arguments: // bstrKey [IN] - Registry key to add to the collection. // dwControlCode [IN] - Control code // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResourceKeys::HrAddItem( IN BSTR bstrKey, IN DWORD dwControlCode ) { //ASSERT( bstrKey != NULL ); HRESULT _hr = E_POINTER; if ( bstrKey != NULL ) { DWORD _sc = ERROR_SUCCESS; _sc = ::ClusterResourceControl( m_hResource, NULL, dwControlCode, bstrKey, ( lstrlenW( bstrKey) + 1) * sizeof( WCHAR ), NULL, 0, NULL ); _hr = HRESULT_FROM_WIN32( _sc ); if ( SUCCEEDED( _hr ) ) { _hr = CKeys::HrAddItem( bstrKey ); } // if: } // if: return _hr; } //*** CResourceKeys::HrAddItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CResourceKeys::HrRemoveItem // // Description: // Remove the key at the passed in index. // // Arguments: // varIndex [IN] - contains the index to remove. // dwControlCode [IN] - Control code // // Return Value: // S_OK if successful, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResourceKeys::HrRemoveItem( IN VARIANT varIndex, IN DWORD dwControlCode ) { HRESULT _hr = S_OK; ULONG _nIndex = 0; _hr = HrGetIndex( varIndex, &_nIndex ); if ( SUCCEEDED( _hr ) ) { DWORD _sc = ERROR_SUCCESS; CComBSTR * _pbstr = NULL; _pbstr = m_klKeys[ _nIndex ]; _sc = ::ClusterResourceControl( m_hResource, NULL, dwControlCode, (BSTR) (*_pbstr), ( _pbstr->Length() + 1 ) * sizeof( WCHAR ), NULL, 0, NULL ); _hr = HRESULT_FROM_WIN32( _sc ); if ( SUCCEEDED( _hr ) ) { _hr = CKeys::HrRemoveItem( varIndex ); } } return _hr; } //*** CResourceKeys::HrRemoveItem() //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CClusResourceRegistryKeys class ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceRegistryKeys::CClusResourceRegistryKeys // // Description: // Constructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CClusResourceRegistryKeys::CClusResourceRegistryKeys( void ) { m_hResource = NULL; m_piids = (const IID *) iidCClusRegistryKeys; m_piidsSize = ARRAYSIZE( iidCClusRegistryKeys ); } //*** CClusResourceRegistryKeys::CClusResourceRegistryKeys() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceRegistryKeys::Create // // Description: // Finish creating the object by doing things that cannot be done in // a light weight constructor. // // Arguments: // hResource [IN] - Resource this collection belongs to. // // Return Value: // S_OK if successful. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CClusResourceRegistryKeys::Create( IN HRESOURCE hResource ) { m_hResource = hResource; return S_OK; } //*** CClusResourceRegistryKeys::Create() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceRegistryKeys::get_Count // // Description: // Get the count of objects in the collection. // // Arguments: // plCount [OUT] - Catches the count. // // Return Value: // S_OK if successful or E_POINTER. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceRegistryKeys::get_Count( OUT long * plCount ) { return CKeys::HrGetCount( plCount ); } //*** CClusResourceRegistryKeys::get_Count() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceRegistryKeys::get_Item // // Description: // Get the item (key) at the passed in index. // // Arguments: // varIndex [IN] - Contains the index requested. // ppbstrRegistryKey [OUT] - Catches the key. // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceRegistryKeys::get_Item( IN VARIANT varIndex, OUT BSTR * ppbstrRegistryKey ) { return HrGetItem( varIndex, ppbstrRegistryKey ); } //*** CClusResourceRegistryKeys::get_Item() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceRegistryKeys::get__NewEnum // // Description: // Create and return a new enumeration for this collection. // // Arguments: // ppunk [OUT] - Catches the new enumeration. // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceRegistryKeys::get__NewEnum( IUnknown ** ppunk ) { return ::HrNewCComBSTREnum< KeyList >( ppunk, m_klKeys ); } //*** CClusResourceRegistryKeys::get__NewEnum() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceRegistryKeys::AddItem // // Description: // Create a new item (key) and add it to the collection. // // Arguments: // bstrRegistryKey [IN] - Registry key to add to the collection. // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceRegistryKeys::AddItem( IN BSTR bstrRegistryKey ) { return HrAddItem( bstrRegistryKey, CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT ); } //*** CClusResourceRegistryKeys::AddItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceRegistryKeys::RemoveItem // // Description: // Remove the item (key) at the passed in index. // // Arguments: // varIndex [IN] - contains the index to remove. // // Return Value: // S_OK if successful, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceRegistryKeys::RemoveItem( IN VARIANT varIndex ) { return HrRemoveItem( varIndex, CLUSCTL_RESOURCE_DELETE_REGISTRY_CHECKPOINT ); } //*** CClusResourceRegistryKeys::RemoveItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceRegistryKeys::Refresh // // Description: // Load the collection from the cluster database. // // Arguments: // None. // // Return Value: // S_OK if successful, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceRegistryKeys::Refresh( void ) { return HrRefresh( CLUSCTL_RESOURCE_GET_REGISTRY_CHECKPOINTS ); } //*** CClusResourceRegistryKeys::Refresh() //*************************************************************************// #if CLUSAPI_VERSION >= 0x0500 ///////////////////////////////////////////////////////////////////////////// // CClusResourceCryptoKeys class ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceCryptoKeys::CClusResourceCryptoKeys // // Description: // Constructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CClusResourceCryptoKeys::CClusResourceCryptoKeys( void ) { m_hResource = NULL; m_piids = (const IID *) iidCClusCryptoKeys; m_piidsSize = ARRAYSIZE( iidCClusCryptoKeys ); } //*** CClusResourceCryptoKeys::CClusResourceCryptoKeys() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceCryptoKeys::Create // // Description: // Finish creating the object by doing things that cannot be done in // a light weight constructor. // // Arguments: // hResource [IN] - Resource this collection belongs to. // // Return Value: // S_OK if successful. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CClusResourceCryptoKeys::Create( IN HRESOURCE hResource ) { m_hResource = hResource; return S_OK; } //*** CClusResourceCryptoKeys::Create() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceCryptoKeys::get_Count // // Description: // Get the count of objects in the collection. // // Arguments: // plCount [OUT] - Catches the count. // // Return Value: // S_OK if successful or E_POINTER. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceCryptoKeys::get_Count( OUT long * plCount ) { return CKeys::HrGetCount( plCount ); } //*** CClusResourceCryptoKeys::get_Count() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceCryptoKeys::get_Item // // Description: // Get the item (key) at the passed in index. // // Arguments: // varIndex [IN] - Contains the index requested. // ppbstrRegistryKey [OUT] - Catches the key. // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceCryptoKeys::get_Item( IN VARIANT varIndex, OUT BSTR * ppbstrRegistryKey ) { return HrGetItem( varIndex, ppbstrRegistryKey ); } //*** CClusResourceCryptoKeys::get_Item() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceCryptoKeys::get__NewEnum // // Description: // Create and return a new enumeration for this collection. // // Arguments: // ppunk [OUT] - Catches the new enumeration. // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceCryptoKeys::get__NewEnum( IUnknown ** ppunk ) { return ::HrNewCComBSTREnum< KeyList >( ppunk, m_klKeys ); } //*** CClusResourceCryptoKeys::get__NewEnum() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceCryptoKeys::AddItem // // Description: // Create a new item (key) and add it to the collection. // // Arguments: // bstrRegistryKey [IN] - Registry key to add to the collection. // // Return Value: // S_OK if successful, E_POINTER, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceCryptoKeys::AddItem( IN BSTR bstrRegistryKey ) { return HrAddItem( bstrRegistryKey, CLUSCTL_RESOURCE_ADD_CRYPTO_CHECKPOINT ); } //*** CClusResourceCryptoKeys::AddItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceCryptoKeys::RemoveItem // // Description: // Remove the item (key) at the passed in index. // // Arguments: // varIndex [IN] - contains the index to remove. // // Return Value: // S_OK if successful, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceCryptoKeys::RemoveItem( IN VARIANT varIndex ) { return HrRemoveItem( varIndex, CLUSCTL_RESOURCE_DELETE_CRYPTO_CHECKPOINT ); } //*** CClusResourceCryptoKeys::RemoveItem() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusResourceCryptoKeys::Refresh // // Description: // Load the collection from the cluster database. // // Arguments: // None. // // Return Value: // S_OK if successful, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP CClusResourceCryptoKeys::Refresh( void ) { return HrRefresh( CLUSCTL_RESOURCE_GET_CRYPTO_CHECKPOINTS ); } //*** CClusResourceCryptoKeys::Refresh() #endif // CLUSAPI_VERSION >= 0x0500 //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CResTypeKeys class ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeKeys::HrRefresh // // Description: // Load the collection from the cluster database. // // Arguments: // dwControlCode [IN] - Control code // // Return Value: // S_OK if successful, or other HRESULT error. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResTypeKeys::HrRefresh( IN DWORD dwControlCode ) { HRESULT _hr = S_FALSE; PWSTR _psz = NULL; DWORD _cbPsz = 512; DWORD _cbRequired = 0; DWORD _sc = ERROR_SUCCESS; HCLUSTER hCluster = NULL; _hr = m_pClusRefObject->get_Handle( (ULONG_PTR *) &hCluster ); if ( SUCCEEDED( _hr ) ) { _psz = (PWSTR) ::LocalAlloc( LMEM_ZEROINIT, _cbPsz ); if ( _psz != NULL ) { _sc = ::ClusterResourceTypeControl( hCluster, m_bstrResourceTypeName, NULL, dwControlCode, NULL, 0, _psz, _cbPsz, &_cbRequired ); if ( _sc == ERROR_MORE_DATA ) { ::LocalFree( _psz ); _psz = NULL; _cbPsz = _cbRequired; _psz = (PWSTR) ::LocalAlloc( LMEM_ZEROINIT, _cbPsz ); if ( _psz != NULL ) { _sc = ::ClusterResourceTypeControl( hCluster, m_bstrResourceTypeName, NULL, dwControlCode, NULL, 0, _psz, _cbPsz, &_cbRequired ); _hr = HRESULT_FROM_WIN32( _sc ); } // if: alloc OK else { _sc = GetLastError(); _hr = HRESULT_FROM_WIN32( _sc ); } // else: alloc failed } // if: error was no more item, re-alloc and try again. else { _hr = HRESULT_FROM_WIN32( _sc ); } // else: error was not no more items -- could be no error if ( SUCCEEDED( _hr ) ) { CComBSTR * _pbstr = NULL; Clear(); while( *_psz != L'\0' ) { _pbstr = new CComBSTR( _psz ); if ( _pbstr != NULL ) { m_klKeys.insert( m_klKeys.end(), _pbstr ); _psz += lstrlenW( _psz ) + 1; _pbstr = NULL; } // if: else { _hr = E_OUTOFMEMORY; break; } // else: } // while: not EOS } // if: keys were retrieved ok } // if: alloc ok else { _sc = GetLastError(); _hr = HRESULT_FROM_WIN32( _sc ); } // else: alloc failed } // if: we got a cluster handle return _hr; } //*** CResTypeKeys::HrRefresh()