///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996-1997 Microsoft Corporation // // Module Name: // PropList.cpp // // Abstract: // Implementation of the CClusPropList class. // // Author: // David Potter (davidp) February 24, 1997 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "PropList.h" #include "BarfClus.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Constant Definitions ///////////////////////////////////////////////////////////////////////////// #define BUFFER_GROWTH_FACTOR 256 ///////////////////////////////////////////////////////////////////////////// // CClusPropList class ///////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(CClusPropList, CObject) ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::CClusPropList // // Routine Description: // Default constructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CClusPropList::CClusPropList(IN BOOL bAlwaysAddProp) { m_proplist.pList = NULL; m_propCurrent.pb = NULL; m_cbBufferSize = 0; m_cbDataSize = 0; m_bAlwaysAddProp = bAlwaysAddProp; } //*** CClusPropList::CClusPropList(); ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::~CClusPropList // // Routine Description: // Destructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CClusPropList::~CClusPropList(void) { delete [] m_proplist.pb; } //*** CClusPropList::~CClusPropList(); ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::AddProp // // Routine Description: // Add a string property to a property list if it has changed. // // Arguments: // pwszName [IN] Name of the property. // rstrValue [IN] Value of the property to set in the list. // rstrPrevValue [IN] Previous value of the property. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CClusPropList::AddProp( IN LPCWSTR pwszName, IN const CString & rstrValue, IN const CString & rstrPrevValue ) { PCLUSPROP_PROPERTY_NAME pName; PCLUSPROP_SZ pValue; ASSERT(pwszName != NULL); if (m_bAlwaysAddProp || (rstrValue != rstrPrevValue)) { DWORD cbNameSize; DWORD cbValueSize; // Calculate sizes and make sure we have a property list. cbNameSize = sizeof(CLUSPROP_PROPERTY_NAME) + ALIGN_CLUSPROP((lstrlenW(pwszName) + 1) * sizeof(WCHAR)); cbValueSize = sizeof(CLUSPROP_SZ) + ALIGN_CLUSPROP((rstrValue.GetLength() + 1) * sizeof(WCHAR)) + sizeof(CLUSPROP_SYNTAX); // value list endmark AllocPropList(cbNameSize + cbValueSize); // Set the property name. pName = m_propCurrent.pName; CopyProp(pName, CLUSPROP_TYPE_NAME, pwszName); m_propCurrent.pb += cbNameSize; // Set the property value. pValue = m_propCurrent.pStringValue; CopyProp(pValue, CLUSPROP_TYPE_LIST_VALUE, rstrValue); m_propCurrent.pb += cbValueSize; // Increment the property count and buffer size. m_proplist.pList->nPropertyCount++; m_cbDataSize += cbNameSize + cbValueSize; } // if: the value has changed } //*** CClusPropList::AddProp(CString) ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::AddProp // // Routine Description: // Add a DWORD property to a property list if it has changed. // // Arguments: // pwszName [IN] Name of the property. // dwValue [IN] Value of the property to set in the list. // dwPrevValue [IN] Previous value of the property. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CClusPropList::AddProp( IN LPCWSTR pwszName, IN DWORD dwValue, IN DWORD dwPrevValue ) { PCLUSPROP_PROPERTY_NAME pName; PCLUSPROP_DWORD pValue; ASSERT(pwszName != NULL); if (m_bAlwaysAddProp || (dwValue != dwPrevValue)) { DWORD cbNameSize; DWORD cbValueSize; // Calculate sizes and make sure we have a property list. cbNameSize = sizeof(CLUSPROP_PROPERTY_NAME) + ALIGN_CLUSPROP((lstrlenW(pwszName) + 1) * sizeof(WCHAR)); cbValueSize = sizeof(CLUSPROP_DWORD) + sizeof(CLUSPROP_SYNTAX); // value list endmark AllocPropList(cbNameSize + cbValueSize); // Set the property name. pName = m_propCurrent.pName; CopyProp(pName, CLUSPROP_TYPE_NAME, pwszName); m_propCurrent.pb += cbNameSize; // Set the property value. pValue = m_propCurrent.pDwordValue; CopyProp(pValue, CLUSPROP_TYPE_LIST_VALUE, dwValue); m_propCurrent.pb += cbValueSize; // Increment the property count and buffer size. m_proplist.pList->nPropertyCount++; m_cbDataSize += cbNameSize + cbValueSize; } // if: the value has changed } //*** CClusPropList::AddProp(DWORD) ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::AddProp // // Routine Description: // Add a binary property to a property list if it has changed. // // Arguments: // pwszName [IN] Name of the property. // pbValue [IN] Value of the property to set in the list. // cbValue [IN] Count of bytes in pbValue. // pbPrevValue [IN] Previous value of the property. // cbPrevValue [IN] Count of bytes in pbPrevValue. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CClusPropList::AddProp( IN LPCWSTR pwszName, IN const PBYTE pbValue, IN DWORD cbValue, IN const PBYTE pbPrevValue, IN DWORD cbPrevValue ) { BOOL bChanged = FALSE; PCLUSPROP_PROPERTY_NAME pName; PCLUSPROP_BINARY pValue; ASSERT(pwszName != NULL); ASSERT(((cbValue == 0) && (cbPrevValue == 0)) || (pbValue != pbPrevValue)); // Determine if the buffer has changed. if (m_bAlwaysAddProp || (cbValue != cbPrevValue)) bChanged = TRUE; else if (!((cbValue == 0) && (cbPrevValue == 0))) bChanged = memcmp(pbValue, pbPrevValue, cbValue) == 0; if (bChanged) { DWORD cbNameSize; DWORD cbValueSize; // Calculate sizes and make sure we have a property list. cbNameSize = sizeof(CLUSPROP_PROPERTY_NAME) + ALIGN_CLUSPROP((lstrlenW(pwszName) + 1) * sizeof(WCHAR)); cbValueSize = sizeof(CLUSPROP_BINARY) + ALIGN_CLUSPROP(cbValue) + sizeof(CLUSPROP_SYNTAX); // value list endmark AllocPropList(cbNameSize + cbValueSize); // Set the property name. pName = m_propCurrent.pName; CopyProp(pName, CLUSPROP_TYPE_NAME, pwszName); m_propCurrent.pb += cbNameSize; // Set the property value. pValue = m_propCurrent.pBinaryValue; CopyProp(pValue, CLUSPROP_TYPE_LIST_VALUE, pbValue, cbValue); m_propCurrent.pb += cbValueSize; // Increment the property count and buffer size. m_proplist.pList->nPropertyCount++; m_cbDataSize += cbNameSize + cbValueSize; } // if: the value changed } //*** CClusPropList::AddProp(PBYTE) ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::CopyProp // // Routine Description: // Copy a string property to a property structure. // // Arguments: // pprop [OUT] Property structure to fill. // proptype [IN] Type of string. // pwsz [IN] String to copy. // cbsz [IN] Count of bytes in pwsz string. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CClusPropList::CopyProp( OUT PCLUSPROP_SZ pprop, IN CLUSTER_PROPERTY_TYPE proptype, IN LPCWSTR pwsz, IN DWORD cbsz ) { CLUSPROP_BUFFER_HELPER props; ASSERT(pprop != NULL); ASSERT(pwsz != NULL); pprop->Syntax.wFormat = CLUSPROP_FORMAT_SZ; pprop->Syntax.wType = (WORD) proptype; if (cbsz == 0) cbsz = (lstrlenW(pwsz) + 1) * sizeof(WCHAR); ASSERT(cbsz == (lstrlenW(pwsz) + 1) * sizeof(WCHAR)); pprop->cbLength = cbsz; lstrcpyW(pprop->sz, pwsz); // Set an endmark. props.pStringValue = pprop; props.pb += sizeof(*props.pStringValue) + ALIGN_CLUSPROP(cbsz); props.pSyntax->dw = CLUSPROP_SYNTAX_ENDMARK; } //*** CClusPropList::CopyProp(CString) ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::CopyProp // // Routine Description: // Copy a DWORD property to a property structure. // // Arguments: // pprop [OUT] Property structure to fill. // proptype [IN] Type of DWORD. // dw [IN] DWORD to copy. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CClusPropList::CopyProp( OUT PCLUSPROP_DWORD pprop, IN CLUSTER_PROPERTY_TYPE proptype, IN DWORD dw ) { CLUSPROP_BUFFER_HELPER props; ASSERT(pprop != NULL); pprop->Syntax.wFormat = CLUSPROP_FORMAT_DWORD; pprop->Syntax.wType = (WORD) proptype; pprop->cbLength = sizeof(DWORD); pprop->dw = dw; // Set an endmark. props.pDwordValue = pprop; props.pb += sizeof(*props.pDwordValue); props.pSyntax->dw = CLUSPROP_SYNTAX_ENDMARK; } //*** CClusPropList::CopyProp(DWORD) ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::CopyProp // // Routine Description: // Copy a binary property to a property structure. // // Arguments: // pprop [OUT] Property structure to fill. // proptype [IN] Type of string. // pb [IN] Block to copy. // cbsz [IN] Count of bytes in pb buffer. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CClusPropList::CopyProp( OUT PCLUSPROP_BINARY pprop, IN CLUSTER_PROPERTY_TYPE proptype, IN const PBYTE pb, IN DWORD cb ) { CLUSPROP_BUFFER_HELPER props; ASSERT(pprop != NULL); pprop->Syntax.wFormat = CLUSPROP_FORMAT_BINARY; pprop->Syntax.wType = (WORD) proptype; pprop->cbLength = cb; if (cb > 0) CopyMemory(pprop->rgb, pb, cb); // Set an endmark. props.pBinaryValue = pprop; props.pb += sizeof(*props.pStringValue) + ALIGN_CLUSPROP(cb); props.pSyntax->dw = CLUSPROP_SYNTAX_ENDMARK; } //*** CClusPropList::CopyProp(PBYTE) ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::AllocPropList // // Routine Description: // Allocate a property list buffer that's big enough to hold the next // property. // // Arguments: // cbMinimum [IN] Minimum size of the property list. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions thrown by BYTE::operator new(). // //-- ///////////////////////////////////////////////////////////////////////////// void CClusPropList::AllocPropList( IN DWORD cbMinimum ) { DWORD cbTotal; ASSERT(cbMinimum > 0); // Add the size of the item count and final endmark. cbMinimum += sizeof(DWORD) + sizeof(CLUSPROP_SYNTAX); cbTotal = m_cbDataSize + cbMinimum; if (m_cbBufferSize < cbTotal) { PBYTE pbNewProplist; cbMinimum = max(BUFFER_GROWTH_FACTOR, cbMinimum); cbTotal = m_cbDataSize + cbMinimum; // Allocate and zero a new buffer. pbNewProplist = new BYTE[cbTotal]; ZeroMemory(pbNewProplist, cbTotal); // If there was a previous buffer, copy it and the delete it. if (m_proplist.pb != NULL) { if (m_cbDataSize != 0) CopyMemory(pbNewProplist, m_proplist.pb, m_cbDataSize); delete [] m_proplist.pb; m_propCurrent.pb = pbNewProplist + (m_propCurrent.pb - m_proplist.pb); } // if: there was a previous buffer else m_propCurrent.pb = pbNewProplist + sizeof(DWORD); // move past prop count // Save the new buffer. m_proplist.pb = pbNewProplist; m_cbBufferSize = cbTotal; } // if: buffer isn't big enough } //*** CClusPropList::AllocPropList(PBYTE) ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::DwGetNodeProperties // // Routine Description: // Get properties on a node. // // Arguments: // hNode [IN] Handle for the node to get properties from. // dwControlCode [IN] Control code for the request. // hHostNode [IN] Handle for the node to direct this request to. // Defaults to NULL. // lpInBuffer [IN] Input buffer for the request. Defaults to NULL. // cbInBufferSize [IN] Size of the input buffer. Defaults to 0. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions CClusPropList::AllocPropList(). // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CClusPropList::DwGetNodeProperties( IN HNODE hNode, IN DWORD dwControlCode, IN HNODE hHostNode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize ) { DWORD dwStatus; DWORD cbProps = 256; ASSERT(hNode != NULL); ASSERT((dwControlCode & (CLUSCTL_OBJECT_MASK << CLUSCTL_OBJECT_SHIFT)) == (CLUS_OBJECT_NODE << CLUSCTL_OBJECT_SHIFT)); ASSERT(m_proplist.pb == NULL); ASSERT(m_propCurrent.pb == NULL); ASSERT(m_cbBufferSize == 0); ASSERT(m_cbDataSize == 0); do { // Allocate a default-sized buffer. try { AllocPropList(cbProps); } // try catch (CMemoryException * pme) { pme->Delete(); return ERROR_NOT_ENOUGH_MEMORY; } // catch: CMemoryException // Get properties. dwStatus = ClusterNodeControl( hNode, hHostNode, dwControlCode, lpInBuffer, cbInBufferSize, m_proplist.pb, m_cbBufferSize, &cbProps ); } while (dwStatus == ERROR_MORE_DATA); if (dwStatus != ERROR_SUCCESS) { delete [] m_proplist.pb; m_proplist.pb = NULL; m_propCurrent.pb = NULL; m_cbBufferSize = 0; m_cbDataSize = 0; } // if: error getting private properties. else m_cbDataSize = cbProps; return dwStatus; } //*** CClusPropList::DwGetNodeProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::DwGetGroupProperties // // Routine Description: // Get properties on a group. // // Arguments: // hGroup [IN] Handle for the group to get properties from. // dwControlCode [IN] Control code for the request. // hHostNode [IN] Handle for the node to direct this request to. // Defaults to NULL. // lpInBuffer [IN] Input buffer for the request. Defaults to NULL. // cbInBufferSize [IN] Size of the input buffer. Defaults to 0. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions CClusPropList::AllocPropList(). // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CClusPropList::DwGetGroupProperties( IN HGROUP hGroup, IN DWORD dwControlCode, IN HNODE hHostNode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize ) { DWORD dwStatus; DWORD cbProps = 256; ASSERT(hGroup != NULL); ASSERT((dwControlCode & (CLUSCTL_OBJECT_MASK << CLUSCTL_OBJECT_SHIFT)) == (CLUS_OBJECT_GROUP << CLUSCTL_OBJECT_SHIFT)); ASSERT(m_proplist.pb == NULL); ASSERT(m_propCurrent.pb == NULL); ASSERT(m_cbBufferSize == 0); ASSERT(m_cbDataSize == 0); do { // Allocate a default-sized buffer. try { AllocPropList(cbProps); } // try catch (CMemoryException * pme) { pme->Delete(); return ERROR_NOT_ENOUGH_MEMORY; } // catch: CMemoryException // Get properties. dwStatus = ClusterGroupControl( hGroup, hHostNode, dwControlCode, lpInBuffer, cbInBufferSize, m_proplist.pb, m_cbBufferSize, &cbProps ); } while (dwStatus == ERROR_MORE_DATA); if (dwStatus != ERROR_SUCCESS) { delete [] m_proplist.pb; m_proplist.pb = NULL; m_propCurrent.pb = NULL; m_cbBufferSize = 0; m_cbDataSize = 0; } // if: error getting private properties. else m_cbDataSize = cbProps; return dwStatus; } //*** CClusPropList::DwGetGroupProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::DwGetResourceProperties // // Routine Description: // Get properties on a resource. // // Arguments: // hResource [IN] Handle for the resource to get properties from. // dwControlCode [IN] Control code for the request. // hHostNode [IN] Handle for the node to direct this request to. // Defaults to NULL. // lpInBuffer [IN] Input buffer for the request. Defaults to NULL. // cbInBufferSize [IN] Size of the input buffer. Defaults to 0. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions CClusPropList::AllocPropList(). // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CClusPropList::DwGetResourceProperties( IN HRESOURCE hResource, IN DWORD dwControlCode, IN HNODE hHostNode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize ) { DWORD dwStatus; DWORD cbProps = 256; ASSERT(hResource != NULL); ASSERT((dwControlCode & (CLUSCTL_OBJECT_MASK << CLUSCTL_OBJECT_SHIFT)) == (CLUS_OBJECT_RESOURCE << CLUSCTL_OBJECT_SHIFT)); ASSERT(m_proplist.pb == NULL); ASSERT(m_propCurrent.pb == NULL); ASSERT(m_cbBufferSize == 0); ASSERT(m_cbDataSize == 0); do { // Allocate a default-sized buffer. try { AllocPropList(cbProps); } // try catch (CMemoryException * pme) { pme->Delete(); return ERROR_NOT_ENOUGH_MEMORY; } // catch: CMemoryException // Get properties. dwStatus = ClusterResourceControl( hResource, hHostNode, dwControlCode, lpInBuffer, cbInBufferSize, m_proplist.pb, m_cbBufferSize, &cbProps ); } while (dwStatus == ERROR_MORE_DATA); if (dwStatus != ERROR_SUCCESS) { delete [] m_proplist.pb; m_proplist.pb = NULL; m_propCurrent.pb = NULL; m_cbBufferSize = 0; m_cbDataSize = 0; } // if: error getting private properties. else m_cbDataSize = cbProps; return dwStatus; } //*** CClusPropList::DwGetResourceProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::DwGetResourceTypeProperties // // Routine Description: // Get properties on a resource type. // // Arguments: // hCluster [IN] Handle for the cluster in which the resource // type resides. // pwszResTypeName [IN] Name of the resource type. // dwControlCode [IN] Control code for the request. // hHostNode [IN] Handle for the node to direct this request to. // Defaults to NULL. // lpInBuffer [IN] Input buffer for the request. Defaults to NULL. // cbInBufferSize [IN] Size of the input buffer. Defaults to 0. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions CClusPropList::AllocPropList(). // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CClusPropList::DwGetResourceTypeProperties( IN HCLUSTER hCluster, IN LPCWSTR pwszResTypeName, IN DWORD dwControlCode, IN HNODE hHostNode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize ) { DWORD dwStatus; DWORD cbProps = 256; ASSERT(hCluster != NULL); ASSERT(pwszResTypeName != NULL); ASSERT(*pwszResTypeName != L'\0'); ASSERT((dwControlCode & (CLUSCTL_OBJECT_MASK << CLUSCTL_OBJECT_SHIFT)) == (CLUS_OBJECT_RESOURCE_TYPE << CLUSCTL_OBJECT_SHIFT)); ASSERT(m_proplist.pb == NULL); ASSERT(m_propCurrent.pb == NULL); ASSERT(m_cbBufferSize == 0); ASSERT(m_cbDataSize == 0); do { // Allocate a default-sized buffer. try { AllocPropList(cbProps); } // try catch (CMemoryException * pme) { pme->Delete(); return ERROR_NOT_ENOUGH_MEMORY; } // catch: CMemoryException // Get properties. dwStatus = ClusterResourceTypeControl( hCluster, pwszResTypeName, hHostNode, dwControlCode, lpInBuffer, cbInBufferSize, m_proplist.pb, m_cbBufferSize, &cbProps ); } while (dwStatus == ERROR_MORE_DATA); if (dwStatus != ERROR_SUCCESS) { delete [] m_proplist.pb; m_proplist.pb = NULL; m_propCurrent.pb = NULL; m_cbBufferSize = 0; m_cbDataSize = 0; } // if: error getting private properties. else m_cbDataSize = cbProps; return dwStatus; } //*** CClusPropList::DwGetResourceTypeProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::DwGetNetworkProperties // // Routine Description: // Get properties on a network. // // Arguments: // hNetwork [IN] Handle for the network to get properties from. // dwControlCode [IN] Control code for the request. // hHostNode [IN] Handle for the node to direct this request to. // Defaults to NULL. // lpInBuffer [IN] Input buffer for the request. Defaults to NULL. // cbInBufferSize [IN] Size of the input buffer. Defaults to 0. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions CClusPropList::AllocPropList(). // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CClusPropList::DwGetNetworkProperties( IN HNETWORK hNetwork, IN DWORD dwControlCode, IN HNODE hHostNode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize ) { DWORD dwStatus; DWORD cbProps = 256; ASSERT(hNetwork != NULL); ASSERT((dwControlCode & (CLUSCTL_OBJECT_MASK << CLUSCTL_OBJECT_SHIFT)) == (CLUS_OBJECT_NETWORK << CLUSCTL_OBJECT_SHIFT)); ASSERT(m_proplist.pb == NULL); ASSERT(m_propCurrent.pb == NULL); ASSERT(m_cbBufferSize == 0); ASSERT(m_cbDataSize == 0); do { // Allocate a default-sized buffer. try { AllocPropList(cbProps); } // try catch (CMemoryException * pme) { pme->Delete(); return ERROR_NOT_ENOUGH_MEMORY; } // catch: CMemoryException // Get properties. dwStatus = ClusterNetworkControl( hNetwork, hHostNode, dwControlCode, lpInBuffer, cbInBufferSize, m_proplist.pb, m_cbBufferSize, &cbProps ); } while (dwStatus == ERROR_MORE_DATA); if (dwStatus != ERROR_SUCCESS) { delete [] m_proplist.pb; m_proplist.pb = NULL; m_propCurrent.pb = NULL; m_cbBufferSize = 0; m_cbDataSize = 0; } // if: error getting private properties. else m_cbDataSize = cbProps; return dwStatus; } //*** CClusPropList::DwGetNetworkProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CClusPropList::DwGetNetInterfaceProperties // // Routine Description: // Get properties on a network interface. // // Arguments: // hNetInterface [IN] Handle for the network interface to get properties from. // dwControlCode [IN] Control code for the request. // hHostNode [IN] Handle for the node to direct this request to. // Defaults to NULL. // lpInBuffer [IN] Input buffer for the request. Defaults to NULL. // cbInBufferSize [IN] Size of the input buffer. Defaults to 0. // // Return Value: // None. // // Exceptions Thrown: // Any exceptions CClusPropList::AllocPropList(). // //-- ///////////////////////////////////////////////////////////////////////////// DWORD CClusPropList::DwGetNetInterfaceProperties( IN HNETINTERFACE hNetInterface, IN DWORD dwControlCode, IN HNODE hHostNode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize ) { DWORD dwStatus; DWORD cbProps = 256; ASSERT(hNetInterface != NULL); ASSERT((dwControlCode & (CLUSCTL_OBJECT_MASK << CLUSCTL_OBJECT_SHIFT)) == (CLUS_OBJECT_NETINTERFACE << CLUSCTL_OBJECT_SHIFT)); ASSERT(m_proplist.pb == NULL); ASSERT(m_propCurrent.pb == NULL); ASSERT(m_cbBufferSize == 0); ASSERT(m_cbDataSize == 0); do { // Allocate a default-sized buffer. try { AllocPropList(cbProps); } // try catch (CMemoryException * pme) { pme->Delete(); return ERROR_NOT_ENOUGH_MEMORY; } // catch: CMemoryException // Get properties. dwStatus = ClusterNetInterfaceControl( hNetInterface, hHostNode, dwControlCode, lpInBuffer, cbInBufferSize, m_proplist.pb, m_cbBufferSize, &cbProps ); } while (dwStatus == ERROR_MORE_DATA); if (dwStatus != ERROR_SUCCESS) { delete [] m_proplist.pb; m_proplist.pb = NULL; m_propCurrent.pb = NULL; m_cbBufferSize = 0; m_cbDataSize = 0; } // if: error getting private properties. else m_cbDataSize = cbProps; return dwStatus; } //*** CClusPropList::DwGetNetInterfaceProperties()