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.
615 lines
14 KiB
615 lines
14 KiB
#ifndef _UTILS_H
|
|
#define _UTILS_H
|
|
//
|
|
// Copyright (c) Microsoft. All Rights Reserved
|
|
//
|
|
// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF Microsoft.
|
|
// The copyright notice above does not evidence any
|
|
// actual or intended publication of such source code.
|
|
//
|
|
// OneLiner : common include file.
|
|
// DevUnit : wlbstest
|
|
// Author : Murtaza Hakim
|
|
//
|
|
// Description:
|
|
// -----------
|
|
|
|
// History:
|
|
// --------
|
|
//
|
|
//
|
|
// Revised by : mhakim
|
|
// Date : 02-12-01
|
|
// Reason : added password to clusterproperties.
|
|
|
|
#include <vector>
|
|
|
|
|
|
using namespace std;
|
|
|
|
struct ClusterProperties
|
|
{
|
|
// default constructor
|
|
ClusterProperties();
|
|
|
|
// Equality operator
|
|
bool
|
|
operator==( const ClusterProperties& objToCompare );
|
|
|
|
// inequality operator
|
|
bool
|
|
operator!=( const ClusterProperties& objToCompare );
|
|
|
|
bool HaveClusterPropertiesChanged( const ClusterProperties& objToCompare,
|
|
bool *pbOnlyClusterNameChanged,
|
|
bool *pbClusterIpChanged);
|
|
|
|
_bstr_t cIP; // Primary IP address.
|
|
|
|
_bstr_t cSubnetMask; // Subnet mask.
|
|
|
|
_bstr_t cFullInternetName; // Full Internet name.
|
|
|
|
_bstr_t cNetworkAddress; // Network address.
|
|
|
|
bool multicastSupportEnabled; // Multicast support.
|
|
|
|
bool remoteControlEnabled; // Remote control.
|
|
|
|
// Edited (mhakim 12-02-01)
|
|
// password may be required to be set.
|
|
// but note that it cannot be got from an existing cluster.
|
|
|
|
_bstr_t password; // Remote control password.
|
|
|
|
// for whistler
|
|
|
|
bool igmpSupportEnabled; // igmp support
|
|
|
|
bool clusterIPToMulticastIP; // indicates whether to use cluster ip or user provided ip.
|
|
|
|
_bstr_t multicastIPAddress; // user provided multicast ip.
|
|
|
|
long igmpJoinInterval; // user provided multicast ip.
|
|
};
|
|
|
|
struct HostProperties
|
|
{
|
|
// default constructor
|
|
HostProperties();
|
|
|
|
// Equality operator
|
|
bool
|
|
operator==( const HostProperties& objToCompare );
|
|
|
|
// inequality operator
|
|
bool
|
|
operator!=( const HostProperties& objToCompare );
|
|
|
|
_bstr_t hIP; // Dedicated IP Address.
|
|
_bstr_t hSubnetMask; // Subnet mask.
|
|
|
|
long hID; // Priority(Unique host ID).
|
|
|
|
bool initialClusterStateActive; // Initial Cluster State.
|
|
|
|
_bstr_t machineName; // machine name.
|
|
};
|
|
|
|
class Common
|
|
{
|
|
public:
|
|
enum
|
|
{
|
|
BUF_SIZE = 1000,
|
|
ALL_PORTS = 0xffffffff,
|
|
ALL_HOSTS = 100,
|
|
THIS_HOST = 0,
|
|
};
|
|
};
|
|
|
|
class CommonUtils
|
|
{
|
|
|
|
public:
|
|
// converts the CIPAddressCtrl embedded ip into
|
|
// dotted decimal string representation.
|
|
static
|
|
_bstr_t
|
|
getCIPAddressCtrlString( CIPAddressCtrl& ip );
|
|
|
|
// fills the CIPAddressCtrl with the dotted decimal
|
|
// string representation.
|
|
static
|
|
void
|
|
fillCIPAddressCtrlString( CIPAddressCtrl& ip,
|
|
const _bstr_t& ipAdddress );
|
|
|
|
static
|
|
void
|
|
getVectorFromSafeArray( SAFEARRAY*& stringArray,
|
|
vector<_bstr_t>& strings );
|
|
|
|
static
|
|
void
|
|
getSafeArrayFromVector( const vector<_bstr_t>& strings,
|
|
SAFEARRAY*& stringArray
|
|
);
|
|
|
|
|
|
private:
|
|
enum
|
|
{
|
|
BUF_SIZE = 1000,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// typedefs for _com_ptr_t
|
|
|
|
_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));
|
|
|
|
|
|
#define NLBMGR_USERNAME (const BSTR) NULL
|
|
#define NLBMGR_PASSWORD (const BSTR) NULL
|
|
|
|
void
|
|
GetErrorCodeText(WBEMSTATUS wStat , _bstr_t& errText );
|
|
|
|
// Class Definition
|
|
class MIPAddress
|
|
{
|
|
public:
|
|
|
|
enum IPClass
|
|
{
|
|
classA,
|
|
classB,
|
|
classC,
|
|
classD,
|
|
classE
|
|
};
|
|
|
|
// Description
|
|
// -----------
|
|
// Checks if the ip address supplied is valid.
|
|
//
|
|
// IP address needs to be in dotted decimal
|
|
// for eg. 192.31.56.2, 128.1.1.1, 1.1.1.1 etc.
|
|
// ip addresses in the form 192.31 are not allowed.
|
|
// There must be exactly four parts.
|
|
//
|
|
//
|
|
// Parameters
|
|
// ----------
|
|
// ipAddrToCheck in : ipAddr to check in dotted dec notation.
|
|
//
|
|
// Returns
|
|
// -------
|
|
// true if valid else false.
|
|
|
|
static
|
|
bool
|
|
checkIfValid(const _bstr_t& ipAddrToCheck );
|
|
|
|
// Description
|
|
// -----------
|
|
// Gets the default subnet mask for ip address. The ip address
|
|
// needs to be valid for operation to be successful.
|
|
//
|
|
// IP address needs to be in dotted decimal
|
|
// for eg. 192.31.56.2, 128.1.1.1, 1.1.1.1 etc.
|
|
// ip addresses in the form 192.31 are not allowed.
|
|
// There must be exactly four parts.
|
|
//
|
|
// Parameters
|
|
// ----------
|
|
// ipAddress IN : ip address for which default subnet required.
|
|
// subnetMask OUT : default subnet mask for ip.
|
|
//
|
|
// Returns
|
|
// -------
|
|
// true if able to find default subnet or false if ipAddress was
|
|
// invalid.
|
|
|
|
static
|
|
bool
|
|
getDefaultSubnetMask( const _bstr_t& ipAddr,
|
|
_bstr_t& subnetMask );
|
|
|
|
// Description
|
|
// -----------
|
|
// Gets the class to which this ip address belongs.
|
|
// class A: 1 - 126
|
|
// class B: 128 - 191
|
|
// class C: 192 - 223
|
|
// class D: 224 - 239
|
|
// class D: 240 - 247
|
|
//
|
|
// IP address needs to be in dotted decimal
|
|
// for eg. 192.31.56.2, 128.1.1.1, 1.1.1.1 etc.
|
|
// ip addresses in the form 192.31 are not allowed.
|
|
// There must be exactly four parts.
|
|
//
|
|
// Parameters
|
|
// ----------
|
|
// ipAddress IN : ip address for which class is to be found.
|
|
// ipClass OUT : class to which ip belongs.
|
|
//
|
|
// Returns
|
|
// -------
|
|
// true if able to find class or false if not able to find.
|
|
//
|
|
|
|
static
|
|
bool
|
|
getIPClass( const _bstr_t& ipAddr,
|
|
IPClass& ipClass );
|
|
|
|
static
|
|
bool
|
|
isValidIPAddressSubnetMaskPair( const _bstr_t& ipAddress,
|
|
const _bstr_t& subnetMask );
|
|
|
|
static
|
|
bool
|
|
isContiguousSubnetMask( const _bstr_t& subnetMask );
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
//------------------------------------------------------
|
|
// Ensure Type Safety
|
|
//------------------------------------------------------
|
|
typedef class MIPAddress MIPAddress;
|
|
|
|
class MUsingCom
|
|
{
|
|
public:
|
|
|
|
enum MUsingCom_Error
|
|
{
|
|
MUsingCom_SUCCESS = 0,
|
|
|
|
COM_FAILURE = 1,
|
|
};
|
|
|
|
|
|
// constructor
|
|
MUsingCom( DWORD type = COINIT_DISABLE_OLE1DDE | COINIT_MULTITHREADED );
|
|
|
|
// destructor
|
|
~MUsingCom();
|
|
|
|
//
|
|
MUsingCom_Error
|
|
getStatus();
|
|
|
|
private:
|
|
MUsingCom_Error status;
|
|
};
|
|
|
|
|
|
class ResourceString
|
|
{
|
|
|
|
public:
|
|
|
|
static
|
|
ResourceString*
|
|
Instance();
|
|
|
|
static
|
|
const _bstr_t&
|
|
GetIDString( UINT id );
|
|
|
|
protected:
|
|
|
|
private:
|
|
static map< UINT, _bstr_t> resourceStrings;
|
|
|
|
static ResourceString* _instance;
|
|
|
|
};
|
|
|
|
// helper functions
|
|
const _bstr_t&
|
|
GETRESOURCEIDSTRING( UINT id );
|
|
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
|
|
//
|
|
//------------------------------------------------------
|
|
//
|
|
//------------------------------------------------------
|
|
// External References
|
|
//------------------------------------------------------
|
|
//
|
|
//------------------------------------------------------
|
|
// Constant Definitions
|
|
//
|
|
//------------------------------------------------------
|
|
class WTokens
|
|
{
|
|
public:
|
|
//
|
|
//
|
|
// data
|
|
// none
|
|
//
|
|
// constructor
|
|
//------------------------------------------------------
|
|
// Description
|
|
// -----------
|
|
// constructor
|
|
//
|
|
// Returns
|
|
// -------
|
|
// none.
|
|
//
|
|
//------------------------------------------------------
|
|
WTokens(
|
|
wstring strToken, // IN: Wstring to tokenize.
|
|
wstring strDelimit ); // IN: Delimiter.
|
|
//
|
|
//------------------------------------------------------
|
|
// Description
|
|
// -----------
|
|
// Default constructor
|
|
//
|
|
// Returns
|
|
// -------
|
|
// none.
|
|
//
|
|
//------------------------------------------------------
|
|
WTokens();
|
|
//
|
|
// destructor
|
|
//------------------------------------------------------
|
|
// Description
|
|
// -----------
|
|
// destructor
|
|
//
|
|
// Returns
|
|
// -------
|
|
// none.
|
|
//------------------------------------------------------
|
|
~WTokens();
|
|
//
|
|
// member functions
|
|
//------------------------------------------------------
|
|
// Description
|
|
// -----------
|
|
//
|
|
// Returns
|
|
// -------
|
|
// The tokens.
|
|
//------------------------------------------------------
|
|
vector<wstring>
|
|
tokenize();
|
|
//
|
|
//------------------------------------------------------
|
|
// Description
|
|
// -----------
|
|
// constructor
|
|
//
|
|
// Returns
|
|
// -------
|
|
// none.
|
|
//
|
|
//------------------------------------------------------
|
|
void
|
|
init(
|
|
wstring strToken, // IN: Wstring to tokenize.
|
|
wstring strDelimit ); // IN: Delimiter.
|
|
//
|
|
protected:
|
|
// Data
|
|
// none
|
|
//
|
|
// Constructors
|
|
// none
|
|
//
|
|
// Destructor
|
|
// none
|
|
//
|
|
// Member Functions
|
|
// none
|
|
//
|
|
private:
|
|
//
|
|
/// Data
|
|
wstring _strToken;
|
|
wstring _strDelimit;
|
|
//
|
|
/// Constructors
|
|
/// none
|
|
//
|
|
/// Destructor
|
|
/// none
|
|
//
|
|
/// Member Functions
|
|
/// none
|
|
//
|
|
};
|
|
|
|
HKEY
|
|
NlbMgrRegCreateKey(
|
|
LPCWSTR szSubKey // Optional
|
|
);
|
|
|
|
UINT
|
|
NlbMgrRegReadUINT(
|
|
HKEY hKey,
|
|
LPCWSTR szName,
|
|
UINT Default
|
|
);
|
|
|
|
VOID
|
|
NlbMgrRegWriteUINT(
|
|
HKEY hKey,
|
|
LPCWSTR szName,
|
|
UINT Value
|
|
);
|
|
|
|
void
|
|
GetTimeAndDate(_bstr_t &bstrTime, _bstr_t &bstrDate);
|
|
|
|
//
|
|
//------------------------------------------------------
|
|
// Inline Functions
|
|
//------------------------------------------------------
|
|
//
|
|
//------------------------------------------------------
|
|
// Ensure Type Safety
|
|
//------------------------------------------------------
|
|
typedef class WTokens WTokens;
|
|
|
|
|
|
//
|
|
// Used for maintaining a log on the stack.
|
|
// Usage is NOT thread-safe -- each instance must be used
|
|
// by a single thread.
|
|
//
|
|
class CLocalLogger
|
|
{
|
|
public:
|
|
|
|
CLocalLogger(VOID)
|
|
: m_pszLog (NULL), m_LogSize(0), m_CurrentOffset(0)
|
|
{
|
|
m_Empty[0] = 0; // The empty string.
|
|
}
|
|
|
|
~CLocalLogger()
|
|
{
|
|
delete[] m_pszLog;
|
|
m_pszLog=NULL;
|
|
}
|
|
|
|
VOID
|
|
LogString(
|
|
LPCWSTR szStr
|
|
);
|
|
|
|
|
|
VOID
|
|
Log(
|
|
IN UINT ResourceID,
|
|
...
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
ExtractLog(OUT LPCWSTR &pLog, UINT &Size)
|
|
//
|
|
// pLog -- set to pointer to internal buffer if there is stuff in the
|
|
// log, otherwise NULL.
|
|
//
|
|
// Size -- in chars; includes ending NULL
|
|
//
|
|
{
|
|
if (m_CurrentOffset != 0)
|
|
{
|
|
pLog = m_pszLog;
|
|
Size = m_CurrentOffset+1; // + 1 for ending NULL.
|
|
}
|
|
else
|
|
{
|
|
pLog = NULL;
|
|
Size = 0;
|
|
}
|
|
}
|
|
|
|
LPCWSTR
|
|
GetStringSafe(void)
|
|
{
|
|
LPCWSTR szLog = NULL;
|
|
UINT Size;
|
|
ExtractLog(REF szLog, REF Size);
|
|
if (szLog == NULL)
|
|
{
|
|
//
|
|
// Replace NULL by a pointer to an empty string.
|
|
//
|
|
szLog = m_Empty;
|
|
}
|
|
|
|
return szLog;
|
|
}
|
|
|
|
private:
|
|
|
|
WCHAR *m_pszLog;
|
|
UINT m_LogSize; // Current size of the log.
|
|
UINT m_CurrentOffset; // Characters left in the log.
|
|
WCHAR m_Empty[1]; // The empty string.
|
|
};
|
|
|
|
NLBERROR
|
|
AnalyzeNlbConfiguration(
|
|
IN const NLB_EXTENDED_CLUSTER_CONFIGURATION &Cfg,
|
|
IN OUT CLocalLogger &logErrors
|
|
);
|
|
//
|
|
// logErrors - a log of config errors
|
|
//
|
|
|
|
NLBERROR
|
|
AnalyzeNlbConfigurationPair(
|
|
IN const NLB_EXTENDED_CLUSTER_CONFIGURATION &Cfg,
|
|
IN const NLB_EXTENDED_CLUSTER_CONFIGURATION &OtherCfg,
|
|
IN BOOL fOtherIsCluster,
|
|
IN BOOL fCheckOtherForConsistancy,
|
|
OUT BOOL &fConnectivityChange,
|
|
IN OUT CLocalLogger &logErrors,
|
|
IN OUT CLocalLogger &logDifferences
|
|
);
|
|
//
|
|
// logErrors - a log of config errors
|
|
// logDifferences - a log of differences between
|
|
// Cfg and UpOtherCfg.
|
|
// fCheckOtherForConsistancy -- if true, we will check Cfg
|
|
// against pOtherCfg. If fOtherIsCluster, we expect
|
|
// cluster wide properties to match, else we expect
|
|
// cluster-wide properties to match as well as host-specific
|
|
// properteis to not conflict.
|
|
//
|
|
|
|
//
|
|
// Processes the windows and afx msg loops.
|
|
//
|
|
|
|
void
|
|
ProcessMsgQueue(void);
|
|
|
|
|
|
//
|
|
// Max length in chars, and including ending NULL, for an encrypted
|
|
// password.
|
|
//
|
|
#define MAX_ENCRYPTED_PASSWORD_LENGTH \
|
|
(2*sizeof(WCHAR)*(CREDUI_MAX_PASSWORD_LENGTH+1))
|
|
|
|
BOOL
|
|
PromptForEncryptedCreds(
|
|
IN HWND hWnd,
|
|
IN LPCWSTR szCaptionText,
|
|
IN LPCWSTR szMessageText,
|
|
IN OUT LPWSTR szUserName,
|
|
IN UINT cchUserName,
|
|
IN OUT LPWSTR szPassword, // encrypted password
|
|
IN UINT cchPassword // size of szPassword
|
|
);
|
|
|
|
#endif // _UTILS_H
|