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.
 
 
 
 
 
 

963 lines
23 KiB

//***************************************************************************
//
// CFGUTIL.H
//
// Purpose: NLB configuration-related helper utilities for:
// -- bind/unbind of nlb
// -- wmi client and server helper APIs
// -- utility functions with no side effects like allocate array
// -- wrappers around some wlbsctrl APIs -- it will dynamically
// load wlbsctrl and do the appropriate thing for W2K and XP.
//
// Copyright (c)2001 Microsoft Corporation, All Rights Reserved
//
// History:
//
// 07/23/01 JosephJ Created -- used to live under nlbmgr\provider as
// cfgutils.h (i.e., with ending 's').
// Lib which implements the functionality is in
// nlbmgr\cfgutillib.
//
//***************************************************************************
typedef enum
{
WLBS_START = 0,
WLBS_STOP,
WLBS_DRAIN,
WLBS_SUSPEND,
WLBS_RESUME,
WLBS_PORT_ENABLE,
WLBS_PORT_DISABLE,
WLBS_PORT_DRAIN,
WLBS_QUERY,
WLBS_QUERY_PORT_STATE
} WLBS_OPERATION_CODES;
typedef struct _NLB_IP_ADDRESS_INFO
{
WCHAR IpAddress[WLBS_MAX_CL_IP_ADDR];
WCHAR SubnetMask[WLBS_MAX_CL_NET_MASK];
} NLB_IP_ADDRESS_INFO;
typedef struct _NLB_CLUSTER_MEMBER_INFO
{
UINT HostId;
WCHAR DedicatedIpAddress[WLBS_MAX_CL_IP_ADDR];
WCHAR HostName[CVY_MAX_FQDN+1];
} NLB_CLUSTER_MEMBER_INFO;
WBEMSTATUS
CfgUtilInitialize(BOOL fServer, BOOL fNoPing);
VOID
CfgUtilDeitialize(VOID);
//
// Gets the list of IP addresses and the friendly name for the specified NIC.
//
WBEMSTATUS
CfgUtilGetIpAddressesAndFriendlyName(
IN LPCWSTR szNic,
OUT UINT *pNumIpAddresses,
OUT NLB_IP_ADDRESS_INFO **ppIpInfo, // Free using c++ delete operator.
OUT LPWSTR *pszFriendlyName // Optional, Free using c++ delete
);
//
// Sets the list of statically-bound IP addresses for the NIC.
// if NumIpAddresses is 0, the NIC is configured with a made-up autonet.
// (call CfgUtilSetDHCP to set a DHCP-assigned address).
//
WBEMSTATUS
CfgUtilSetStaticIpAddresses(
IN LPCWSTR szNic,
IN UINT NumIpAddresses,
IN NLB_IP_ADDRESS_INFO *pIpInfo
);
//
// Sets the IP addresses for the NIC to be DHCP-assigned.
//
WBEMSTATUS
CfgUtilSetDHCP(
IN LPCWSTR szNic
);
//
// Determines whether the specified nic is configured with DHCP or not.
//
WBEMSTATUS
CfgUtilGetDHCP(
IN LPCWSTR szNic,
OUT BOOL *pfDHCP
);
//
// Returns an array of pointers to string-version of GUIDS
// that represent the set of alive and healthy NICS that are
// suitable for NLB to bind to -- basically alive ethernet NICs.
//
// Delete ppNics using the delete WCHAR[] operator. Do not
// delete the individual strings.
//
WBEMSTATUS
CfgUtilsGetNlbCompatibleNics(
OUT LPWSTR **ppszNics,
OUT UINT *pNumNics,
OUT UINT *pNumBoundToNlb // Optional
);
//
// Determines whether NLB is bound to the specified NIC.
//
WBEMSTATUS
CfgUtilCheckIfNlbBound(
IN LPCWSTR szNic,
OUT BOOL *pfBound
);
//
// On success, *pfCanLock is set to TRUE IFF the NETCFG write lock
// CAN be locked at this point in time.
// WARNING: this is really just a hint, as immediately after the function
// returns the state may change.
//
WBEMSTATUS
CfgUtilGetNetcfgWriteLockState(
OUT BOOL *pfCanLock,
LPWSTR *pszHeldBy // OPTIONAL, free using delete[].
);
//
// Binds/unbinds NLB to the specified NIC.
//
WBEMSTATUS
CfgUtilChangeNlbBindState(
IN LPCWSTR szNic,
IN BOOL fBind
);
//
// Initializes pParams using default values.
//
VOID
CfgUtilInitializeParams(
OUT WLBS_REG_PARAMS *pParams
);
//
// Converts the specified plain-text password into the hashed version
// and saves it in pParams.
//
DWORD
CfgUtilSetRemotePassword(
IN WLBS_REG_PARAMS *pParams,
IN LPCWSTR szPassword
);
//
// Gets the current NLB configuration for the specified NIC
//
WBEMSTATUS
CfgUtilGetNlbConfig(
IN LPCWSTR szNic,
OUT WLBS_REG_PARAMS *pParams
);
//
// Sets the current NLB configuration for the specified NIC. This
// includes notifying the driver if required.
//
WBEMSTATUS
CfgUtilSetNlbConfig(
IN LPCWSTR szNic,
IN WLBS_REG_PARAMS *pParams,
IN BOOL fJustBound
);
//
// Just writes the current NLB configuration for the specified NIC to the
// registry. MAY BE CALLED WHEN NLB IS UNBOUND.
//
WBEMSTATUS
CfgUtilRegWriteParams(
IN LPCWSTR szNic,
IN WLBS_REG_PARAMS *pParams
);
//
// Recommends whether the update should be performed async or sync
// Returns WBEM_S_FALSE if the update is a no op.
// Returns WBEM_INVALID_PARAMATER if the params are invalid.
//
WBEMSTATUS
CfgUtilsAnalyzeNlbUpdate(
IN const WLBS_REG_PARAMS *pCurrentParams, OPTIONAL
IN WLBS_REG_PARAMS *pNewParams,
OUT BOOL *pfConnectivityChange
);
//
// Verifies that the NIC GUID exists.
//
WBEMSTATUS
CfgUtilsValidateNicGuid(
IN LPCWSTR szGuid
);
//
// Validates a network address
//
WBEMSTATUS
CfgUtilsValidateNetworkAddress(
IN LPCWSTR szAddress, // format: "10.0.0.1[/255.0.0.0]"
OUT PUINT puIpAddress, // in network byte order
OUT PUINT puSubnetMask, // in network byte order (0 if unspecified)
OUT PUINT puDefaultSubnetMask // depends on class: 'a', 'b', 'c', 'd', 'e'
);
WBEMSTATUS
CfgUtilControlCluster(
IN LPCWSTR szNic,
IN WLBS_OPERATION_CODES Opcode,
IN DWORD Vip,
IN DWORD PortNum,
OUT DWORD * pdwHostMap,
OUT DWORD * pdwNlbStatus
);
WBEMSTATUS
CfgUtilGetClusterMembers(
IN LPCWSTR szNic,
OUT DWORD *pNumMembers,
OUT NLB_CLUSTER_MEMBER_INFO **ppMembers // free using delete[]
);
WBEMSTATUS
CfgUtilSafeArrayFromStrings(
IN LPCWSTR *pStrings,
IN UINT NumStrings,
OUT SAFEARRAY **ppSA
);
WBEMSTATUS
CfgUtilStringsFromSafeArray(
IN SAFEARRAY *pSA,
OUT LPWSTR **ppStrings,
OUT UINT *pNumStrings
);
_COM_SMARTPTR_TYPEDEF(IWbemClassObject, __uuidof(IWbemClassObject));
_COM_SMARTPTR_TYPEDEF(IWbemServices, __uuidof(IWbemServices));
_COM_SMARTPTR_TYPEDEF(IWbemLocator, __uuidof(IWbemLocator));
_COM_SMARTPTR_TYPEDEF(IWbemClassObject, __uuidof(IWbemClassObject));
_COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, __uuidof(IEnumWbemClassObject));
_COM_SMARTPTR_TYPEDEF(IWbemCallResult, __uuidof(IWbemCallResult));
_COM_SMARTPTR_TYPEDEF(IWbemStatusCodeText, __uuidof(IWbemStatusCodeText));
WBEMSTATUS
get_string_parameter(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
OUT LPWSTR *ppStringValue
);
WBEMSTATUS
CfgUtilGetWmiObjectInstance(
IN IWbemServicesPtr spWbemServiceIF,
IN LPCWSTR szClassName,
IN LPCWSTR szPropertyName,
IN LPCWSTR szPropertyValue,
OUT IWbemClassObjectPtr &sprefObj // smart pointer
);
WBEMSTATUS
CfgUtilGetWmiRelPath(
IN IWbemClassObjectPtr spObj,
OUT LPWSTR * pszRelPath // free using delete
);
WBEMSTATUS
CfgUtilGetWmiInputInstanceAndRelPath(
IN IWbemServicesPtr spWbemServiceIF,
IN LPCWSTR szClassName,
IN LPCWSTR szPropertyName, // NULL: return Class rel path
IN LPCWSTR szPropertyValue,
IN LPCWSTR szMethodName,
OUT IWbemClassObjectPtr &spWbemInputInstance, // smart pointer
OUT LPWSTR * pszRelPath // free using delete
);
WBEMSTATUS
CfgUtilGetWmiMachineName(
IN IWbemServicesPtr spWbemServiceIF,
OUT LPWSTR * pszMachineName // free using delete
);
WBEMSTATUS
CfgUtilGetWmiStringParam(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
OUT LPWSTR *ppStringValue
);
WBEMSTATUS
CfgUtilSetWmiStringParam(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
IN LPCWSTR szValue
);
WBEMSTATUS
CfgUtilGetWmiStringArrayParam(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
OUT LPWSTR **ppStrings,
OUT UINT *pNumStrings
);
WBEMSTATUS
CfgUtilSetWmiStringArrayParam(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
IN LPCWSTR *ppStrings,
IN UINT NumStrings
);
WBEMSTATUS
CfgUtilGetWmiDWORDParam(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
OUT DWORD *pValue
);
WBEMSTATUS
CfgUtilSetWmiDWORDParam(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
IN DWORD Value
);
WBEMSTATUS
CfgUtilGetWmiBoolParam(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
OUT BOOL *pValue
);
WBEMSTATUS
CfgUtilSetWmiBoolParam(
IN IWbemClassObjectPtr spObj,
IN LPCWSTR szParameterName,
IN BOOL Value
);
WBEMSTATUS
CfgUtilConnectToServer(
IN LPCWSTR szNetworkResource, // \\machinename\root\microsoftnlb \root\...
IN LPCWSTR szUser, // Must be NULL for local server
IN LPCWSTR szPassword, // Must be NULL for local server
IN LPCWSTR szAuthority, // Must be NULL for local server
OUT IWbemServices **ppWbemService // deref when done.
);
LPWSTR *
CfgUtilsAllocateStringArray(
UINT NumStrings,
UINT MaxStringLen // excluding ending NULL
);
#define NLB_MAX_PORT_STRING_SIZE 128 // in WCHARS, including ending NULL
BOOL
CfgUtilsGetPortRuleString(
IN PWLBS_PORT_RULE pPr,
OUT LPWSTR pString // At least NLB_MAX_PORT_STRING_SIZE wchars
);
BOOL
CfgUtilsSetPortRuleString(
IN LPCWSTR pString,
OUT PWLBS_PORT_RULE pPr
);
//
// Gets the port rules, if any, from the specfied nlb params structure
//
WBEMSTATUS
CfgUtilGetPortRules(
IN const WLBS_REG_PARAMS *pParams,
OUT WLBS_PORT_RULE **ppRules, // Free using delete
OUT UINT *pNumRules
);
//
// Sets the specified port rules in the specfied nlb params structure
//
WBEMSTATUS
CfgUtilSetPortRules(
IN WLBS_PORT_RULE *pRules,
IN UINT NumRules,
IN OUT WLBS_REG_PARAMS *pParams
);
//
// Sets the hashed version of the remote control password
//
VOID
CfgUtilSetHashedRemoteControlPassword(
IN OUT WLBS_REG_PARAMS *pParams,
IN DWORD dwHashedPassword
);
//
// Gets the hashed version of the remote control password
//
DWORD
CfgUtilGetHashedRemoteControlPassword(
IN const WLBS_REG_PARAMS *pParams
);
//
// Attempts to resolve the ip address and ping the host.
//
WBEMSTATUS
CfgUtilPing(
IN LPCWSTR szBindString,
IN UINT Timeout, // In milliseconds.
OUT ULONG *pResolvedIpAddress // in network byte order.
);
BOOL
CfgUtilEncryptPassword(
IN LPCWSTR szPassword,
OUT UINT cchEncPwd, // size in chars of szEncPwd, inc space for ending 0
OUT LPWSTR szEncPwd
);
BOOL
CfgUtilDecryptPassword(
IN LPCWSTR szEncPwd,
OUT UINT cchPwd, // size in chars of szPwd, inc space for ending 0
OUT LPWSTR szPwd
);
//
// Returns TRUE if MSCS is installed, false otherwise
//
BOOL
CfgUtilIsMSCSInstalled(VOID);
// Enables SE_LOAD_DRIVER_NAME privilege
BOOL
CfgUtils_Enable_Load_Unload_Driver_Privilege(VOID);
typedef struct _NLB_IP_ADDRESS_INFO NLB_IP_ADDRESS_INFO;
//
// This structure contains all information associated with a particular NIC
// that is relevant to NLB. This includes the IP addresses bound the NIC,
// whether or not NLB is bound to the NIC, and if NLB is bound, all
// the NLB-specific properties.
//
class NLB_EXTENDED_CLUSTER_CONFIGURATION
{
public:
NLB_EXTENDED_CLUSTER_CONFIGURATION(VOID) {ZeroMemory(this, sizeof(*this));}
~NLB_EXTENDED_CLUSTER_CONFIGURATION()
{
Clear();
};
VOID
Clear(VOID)
{
delete pIpAddressInfo;
delete m_szFriendlyName;
delete m_szNewRemoteControlPassword;
ZeroMemory(this, sizeof(*this));
CfgUtilInitializeParams(&NlbParams);
}
VOID
SetDefaultNlbCluster(VOID)
{
CfgUtilInitializeParams(&NlbParams);
fValidNlbCfg = TRUE;
fBound = TRUE;
}
NLBERROR
AnalyzeUpdate(
IN NLB_EXTENDED_CLUSTER_CONFIGURATION *pNewCfg,
OUT BOOL *pfConnectivityChange
);
WBEMSTATUS
Update(
IN const NLB_EXTENDED_CLUSTER_CONFIGURATION *pNewCfg
);
WBEMSTATUS
SetNetworkAddresses(
IN LPCWSTR *pszNetworkAddresses,
IN UINT NumNetworkAddresses
);
WBEMSTATUS
SetNetworkAddressesSafeArray(
IN SAFEARRAY *pSA
);
VOID
SetNetworkAddressesRaw(
IN NLB_IP_ADDRESS_INFO *pNewInfo, // Allocated using new, can be NULL
IN UINT NumNew
)
{
delete pIpAddressInfo;
pIpAddressInfo = pNewInfo;
NumIpAddresses = NumNew;
}
WBEMSTATUS
GetNetworkAddresses(
OUT LPWSTR **ppszNetworkAddresses, // free using delete
OUT UINT *pNumNetworkAddresses
);
WBEMSTATUS
GetNetworkAddressesSafeArray(
OUT SAFEARRAY **ppSA
);
WBEMSTATUS
SetNetworkAddresPairs(
IN LPCWSTR *pszIpAddresses,
IN LPCWSTR *pszSubnetMasks,
IN UINT NumNetworkAddresses
);
WBEMSTATUS
GetNetworkAddressPairs(
OUT LPWSTR **ppszIpAddresses, // free using delete
OUT LPWSTR **ppszIpSubnetMasks, // free using delete
OUT UINT *pNumNetworkAddresses
);
WBEMSTATUS
ModifyNetworkAddress(
IN LPCWSTR szOldNetworkAddress, OPTIONAL
IN LPCWSTR szNewIpAddress, OPTIONAL
IN LPCWSTR szNewSubnetMask OPTIONAL
);
//
// NULL, NULL: clear all network addresses
// NULL, szNew: add
// szOld, NULL: remove
// szOld, szNew: replace (or add, if old doesn't exist)
//
WBEMSTATUS
GetPortRules(
OUT LPWSTR **ppszPortRules,
OUT UINT *pNumPortRules
);
WBEMSTATUS
SetPortRules(
IN LPCWSTR *pszPortRules,
IN UINT NumPortRules
);
WBEMSTATUS
GetPortRulesSafeArray(
OUT SAFEARRAY **ppSA
);
WBEMSTATUS
SetPortRulesSafeArray(
IN SAFEARRAY *pSA
);
UINT GetGeneration(VOID) {return Generation;}
BOOL IsNlbBound(VOID) const {return fBound;}
BOOL IsValidNlbConfig(VOID) const {return fBound && fValidNlbCfg;}
VOID SetNlbBound(BOOL fNlbBound) {fBound = (fNlbBound!=0);}
WBEMSTATUS
GetClusterName(
OUT LPWSTR *pszName
);
VOID
SetClusterName(
IN LPCWSTR szName // NULL ok
);
WBEMSTATUS
GetClusterNetworkAddress(
OUT LPWSTR *pszAddress
);
VOID
SetClusterNetworkAddress(
IN LPCWSTR szAddress // NULL ok
);
WBEMSTATUS
GetDedicatedNetworkAddress(
OUT LPWSTR *pszAddress
);
VOID
SetDedicatedNetworkAddress(
IN LPCWSTR szAddress // NULL ok
);
typedef enum
{
TRAFFIC_MODE_UNICAST,
TRAFFIC_MODE_MULTICAST,
TRAFFIC_MODE_IGMPMULTICAST
} TRAFFIC_MODE;
TRAFFIC_MODE
GetTrafficMode(
VOID
) const;
VOID
SetTrafficMode(
TRAFFIC_MODE Mode
);
UINT
GetHostPriority(
VOID
);
VOID
SetHostPriority(
UINT Priority
);
/* OBSOLETE
typedef enum
{
START_MODE_STARTED,
START_MODE_STOPPED
} START_MODE;
*/
DWORD
GetClusterModeOnStart(
VOID
);
VOID
SetClusterModeOnStart(
DWORD Mode
);
BOOL
GetPersistSuspendOnReboot(
VOID
);
VOID
SetPersistSuspendOnReboot(
BOOL bPersistSuspendOnReboot
);
BOOL
GetRemoteControlEnabled(
VOID
) const;
VOID
SetRemoteControlEnabled(
BOOL fEnabled
);
WBEMSTATUS
GetFriendlyName(
OUT LPWSTR *pszFriendlyName // Free using delete
) const;
WBEMSTATUS
SetFriendlyName(
IN LPCWSTR szFriendlyName // Saves a copy of szFriendlyName
);
LPCWSTR
GetNewRemoteControlPasswordRaw(VOID) const
{
if (NewRemoteControlPasswordSet())
{
return m_szNewRemoteControlPassword;
}
else
{
return NULL;
}
}
BOOL
NewRemoteControlPasswordSet(
VOID
) const
{
return GetRemoteControlEnabled() && m_fSetPassword;
}
WBEMSTATUS
SetNewRemoteControlPassword(
IN LPCWSTR szFriendlyName // Saves a copy of szRemoteControlPassword
);
VOID
SetNewHashedRemoteControlPassword(
DWORD dwHash
)
{
delete m_szNewRemoteControlPassword;
m_szNewRemoteControlPassword = NULL;
m_fSetPassword = TRUE;
m_dwNewHashedRemoteControlPassword = dwHash;
}
VOID
ClearNewRemoteControlPassword(
VOID
)
{
delete m_szNewRemoteControlPassword;
m_szNewRemoteControlPassword = NULL;
m_fSetPassword = FALSE;
m_dwNewHashedRemoteControlPassword = 0;
}
BOOL
GetNewHashedRemoteControlPassword(
DWORD &dwHash
) const
{
BOOL fRet = FALSE;
if (NewRemoteControlPasswordSet())
{
dwHash = m_dwNewHashedRemoteControlPassword;
fRet = TRUE;
}
else
{
dwHash = 0;
}
return fRet;
}
BOOL
IsBlankDedicatedIp(
VOID
) const;
//
// Following fields are public because this class started out as a
// structure. TODO: wrap these with access methods.
//
BOOL fValidNlbCfg; // True iff all the information is valid.
UINT Generation; // Generation ID of this Update.
BOOL fBound; // Whether or not NLB is bound to this NIC.
BOOL fDHCP; // Whether the address is DHCP assigned.
//
// The following three fields are used only when updating the configuration.
// They are all set to false on reading the configuration.
//
BOOL fAddDedicatedIp; // add ded ip (if present)
BOOL fAddClusterIps; // add cluster vips (if bound)
BOOL fCheckForAddressConflicts;
//
// When GETTING configuration info, the following provide the full
// list of statically configured IP addresses on the specified NIC.
//
// When SETTING configuration info, the following can either be zero
// or non-zero. If zero, the set of IP addresses to be added will
// be inferred from other fields (like cluster vip, per-port vips,
// existing IP addresses and the three fields above).
// If non-zero, the exact set of VIPS specified will be used.
//
UINT NumIpAddresses; // Number of IP addresses bound to the NIC
NLB_IP_ADDRESS_INFO *pIpAddressInfo; // The actual IP addresses & masks
WLBS_REG_PARAMS NlbParams; // The WLBS-specific configuration
//
// TODO move all data stuff below here...
//
private:
LPCWSTR m_szFriendlyName; // Friendly name of NIC.
//
// IF nlb is bound AND remote control is enabled,
// AND this field is true, we'll set the password -- either
// m_szNewRemoteControlPassword or (if former is NULL)
// m_dwNewHashedRemoteControlPassword.
//
// Access methods:
// SetNewRemoteControlPassword
// SetNewHashedRemoteControlPassword
// ClearNewRemoteControlPassword
// GetNewRemoteControlPasswordRaw
// GetNewHashedRemoteControlPassword
//
BOOL m_fSetPassword;
LPCWSTR m_szNewRemoteControlPassword;
DWORD m_dwNewHashedRemoteControlPassword;
//
// Enable the following to identify places in code that do a struct
// copy or initialization from struct.
// TODO: clean up the maintenance of the embedded pointers during copy.
//
#if 0
NLB_EXTENDED_CLUSTER_CONFIGURATION(
const NLB_EXTENDED_CLUSTER_CONFIGURATION&
);
NLB_EXTENDED_CLUSTER_CONFIGURATION&
operator = (const NLB_EXTENDED_CLUSTER_CONFIGURATION&);
#endif // 0
};
typedef NLB_EXTENDED_CLUSTER_CONFIGURATION *PNLB_EXTENDED_CLUSTER_CONFIGURATION;
//
// Class for manipulating lists of IP addresses and subnet masks.
// See provider\tests\tprov.cpp for examples of it's use.
//
class NlbIpAddressList
{
public:
NlbIpAddressList(void)
: m_uNum(0), m_uMax(0), m_pIpInfo(NULL)
{
}
~NlbIpAddressList()
{
delete[] m_pIpInfo;
m_pIpInfo = NULL;
m_uNum=0;
m_uMax=0;
}
BOOL
Copy(const NlbIpAddressList &refList);
BOOL
Validate(void); // checks that there are no dups and all valid ip/subnets
BOOL
Set(UINT uNew, const NLB_IP_ADDRESS_INFO *pNewInfo, UINT uExtraCount);
//
// Looks for the specified IP address -- returns an internal pointer
// to the found IP address info, if fount, otherwise NULL.
//
const NLB_IP_ADDRESS_INFO *
Find(
LPCWSTR szIp // IF NULL, returns first address
) const;
VOID
Extract(UINT &uNum, NLB_IP_ADDRESS_INFO * &pNewInfo);
BOOL
Modify(LPCWSTR szOldIp, LPCWSTR szNewIp, LPCWSTR szNewSubnet);
BOOL
Apply(UINT uNew, const NLB_IP_ADDRESS_INFO *pNewInfo);
VOID
Clear(VOID)
{
(VOID) this->Set(0, NULL, 0);
}
UINT
NumAddresses(VOID)
{
return m_uNum;
}
private:
UINT m_uNum; // current count of valid ip addresses
UINT m_uMax; // allocated ip addresses
NLB_IP_ADDRESS_INFO *m_pIpInfo; // allocated array.
//
// Assignment and pass-by-value aren't supported at this time.
// Defining these as private make sure that they can't be called.
//
NlbIpAddressList(const NlbIpAddressList&);
NlbIpAddressList& operator = (const NlbIpAddressList&);
static
BOOL
sfn_validate_info(
const NLB_IP_ADDRESS_INFO &Info,
UINT &uIpAddress
);
};