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.
 
 
 
 
 
 

2004 lines
46 KiB

/*++
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
nmp.h
Abstract:
Private interface definitions for the Node Manager component.
Author:
Mike Massa (mikemas) 12-Mar-1996
Revision History:
--*/
#ifndef _NMP_INCLUDED
#define _NMP_INCLUDED
#define UNICODE 1
#include "service.h"
#include <winsock2.h>
#include <clnetcfg.h>
#include <bitset.h>
#include <madcapcl.h>
#include <time.h>
#include <ntlsa.h>
#include <ntmsv1_0.h>
#include <wincrypt.h>
//
// Constants
//
#define LOG_CURRENT_MODULE LOG_MODULE_NM
#define NM_JOIN_TIMEOUT 60000 // 60 seconds
#define NM_MM_JOIN_TIMEOUT 3000 // 3 seconds
#define NM_CLOCK_PERIOD 300 // 300 milliseconds
#define NM_SEND_HB_RATE 4
#define NM_RECV_HB_RATE 3 // Changed 2=>3 to prolong min_stage_1 ticks from 8 to 12
#define MulticastKeyLen 16 // 128 bits
#define NMP_ENCRYPT_ALGORITHM CALG_RC2 // RC2 block encryption algorithm.
#define NMP_KEY_LENGTH 0x00800000 // Key length: 128 bits.
#define NMP_SALT_BUFFER_LEN 16 // 16 bytes. Length of salt for encryption
// of password transferred on wire
#define NMP_MAC_DATA_LENGTH_EXPECTED 16 // 16 bytes
//
// Common Object Flags
//
#define NM_FLAG_OM_INSERTED 0x10000000
#define NM_FLAG_DELETE_PENDING 0x80000000
//
// Miscellaneous Macros
//
#define NM_WCSLEN(_string) ((lstrlenW(_string) + 1) * sizeof(WCHAR))
//
// Common Object Management Macros
//
#define NM_OM_INSERTED(obj) ((obj)->Flags & NM_FLAG_OM_INSERTED)
#define NM_DELETE_PENDING(obj) ((obj)->Flags & NM_FLAG_DELETE_PENDING)
#define NM_FREE_OBJECT_FIELD(_object, _field) \
if ( (_object)->_field != NULL ) \
LocalFree( (_object)->_field )
#define NM_MIDL_FREE_OBJECT_FIELD(_object, _field) \
if ( (_object)->_field != NULL ) { \
MIDL_user_free( (_object)->_field ); \
(_object)->_field = NULL; \
}
//
// State of the NM component
//
// Note that the order is important. See NmpEnterApi().
//
typedef enum {
NmStateOffline = 0,
NmStateOfflinePending = 1,
NmStateOnlinePending = 2,
NmStateOnline = 3,
} NM_STATE, *PNM_STATE;
//
// Node definitions
//
typedef struct {
DWORD Status;
DWORD LocalOnly;
} NM_NODE_CREATE_CONTEXT, *PNM_NODE_CREATE_CONTEXT;
typedef struct _NM_NODE {
LIST_ENTRY Linkage;
DWORD NodeId;
CLUSTER_NODE_STATE State;
CLUSTER_NODE_STATE ExtendedState;
DWORD Flags;
DWORD InterfaceCount;
LIST_ENTRY InterfaceList;
DWORD HighestVersion;
DWORD LowestVersion;
RPC_BINDING_HANDLE ReportRpcBinding; // for net connectivity reports
RPC_BINDING_HANDLE IsolateRpcBinding; // for net failure isolation
SUITE_TYPE ProductSuite;
DWORD DefaultRpcBindingGeneration;
HANDLE MmNodeStateDownEvent; // A manual reset event to track MM Node UP/Down
} NM_NODE;
#define NM_NODE_SIG 'edon'
typedef struct _NM_NODE_AUX_INFO{
DWORD dwSize;
DWORD dwVer;
SUITE_TYPE ProductSuite;
}NM_NODE_AUX_INFO, *PNM_NODE_AUX_INFO;
typedef struct {
LPCWSTR NodeId;
HLOCALXSACTION Xaction;
DWORD Status;
} NM_EVICTION_CONTEXT, *PNM_EVICTION_CONTEXT;
#define NM_NODE_UP(node) \
( ( (node)->State == ClusterNodeUp ) || \
( (node)->State == ClusterNodePaused ) )
//
// Network definitions
//
typedef struct _NM_STATE_WORK_ENTRY {
NM_STATE_ENTRY State;
DWORD ReachableCount;
} NM_STATE_WORK_ENTRY, *PNM_STATE_WORK_ENTRY;
typedef PNM_STATE_WORK_ENTRY PNM_STATE_WORK_VECTOR;
typedef PNM_STATE_ENTRY PNM_CONNECTIVITY_MATRIX;
#define NM_SIZEOF_CONNECTIVITY_MATRIX(_VectorSize) \
(sizeof(NM_STATE_ENTRY) * _VectorSize *_VectorSize)
#define NM_NEXT_CONNECTIVITY_MATRIX_ROW(_CurrentRowPtr, _VectorSize) \
(_CurrentRowPtr + (_VectorSize * sizeof(NM_STATE_ENTRY)))
#define NM_GET_CONNECTIVITY_MATRIX_ROW(_MatrixPtr, _RowNumber, _VectorSize) \
(_MatrixPtr + (_RowNumber * (_VectorSize * sizeof(NM_STATE_ENTRY))))
#define NM_GET_CONNECTIVITY_MATRIX_ENTRY( \
_MatrixPtr, \
_RowNumber, \
_ColNumber, \
_VectorSize \
) \
( _MatrixPtr + \
(_RowNumber * (_VectorSize * sizeof(NM_STATE_ENTRY))) + \
(_ColNumber * sizeof(NM_STATE_ENTRY)) \
)
//
// Multicast configuration types.
// - Manual: administrator configured address
// - Madcap: lease obtained from MADCAP server
// - Auto: address chosen after no MADCAP server detected
//
typedef enum {
NmMcastConfigManual = 0,
NmMcastConfigMadcap,
NmMcastConfigAuto
} NM_MCAST_CONFIG, *PNM_MCAST_CONFIG;
typedef struct _NM_NETWORK {
LIST_ENTRY Linkage;
CL_NETWORK_ID ShortId;
CLUSTER_NETWORK_STATE State;
DWORD Flags;
CLUSTER_NETWORK_ROLE Role;
DWORD Priority;
LPWSTR Transport;
LPWSTR Address;
LPWSTR AddressMask;
LPWSTR Description;
LPWSTR MulticastAddress;
NM_MCAST_CONFIG ConfigType;
PVOID EncryptedMulticastKey; // Encrypted by DP API
DWORD EncryptedMulticastKeyLength; // Encrypted by DP API
time_t MulticastLeaseObtained;
time_t MulticastLeaseExpires;
MCAST_CLIENT_UID MulticastLeaseRequestId;
LPWSTR MulticastLeaseServer;
DWORD MulticastKeyExpires;
DWORD InterfaceCount;
PNM_INTERFACE LocalInterface;
PNM_CONNECTIVITY_VECTOR ConnectivityVector;
PNM_CONNECTIVITY_MATRIX ConnectivityMatrix;
PNM_STATE_WORK_VECTOR StateWorkVector;
DWORD ConnectivityReportTimer;
DWORD StateRecalcTimer;
DWORD FailureIsolationTimer;
DWORD RegistrationRetryTimer;
DWORD RegistrationRetryTimeout;
DWORD NameChangePendingTimer;
DWORD McastAddressRenewTimer;
DWORD McastAddressReleaseRetryTimer;
DWORD McastAddressReconfigureRetryTimer;
DWORD McastAddressRefreshRetryTimer;
DWORD McastKeyRegenerateTimer;
DWORD ConnectivityReportRetryCount;
CLRTL_WORK_ITEM WorkItem;
CLRTL_WORK_ITEM MadcapWorkItem;
LIST_ENTRY McastAddressReleaseList;
LIST_ENTRY InterfaceList;
LIST_ENTRY InternalLinkage;
} NM_NETWORK;
#define NM_NETWORK_SIG 'ten'
//
// State flags
//
#define NM_FLAG_NET_WORKER_RUNNING 0x00000001
#define NM_FLAG_NET_REGISTERED 0x00000002
#define NM_FLAG_NET_MULTICAST_ENABLED 0x00000004
#define NM_FLAG_NET_MADCAP_WORKER_RUNNING 0x00000008
#define NM_FLAG_NET_REFRESH_MCAST_RUNNING 0x00000010
#define NM_FLAG_NET_REFRESH_MCAST_ABORTING 0x00000020
#define NM_FLAG_NET_NAME_CHANGE_PENDING 0x00000040
//
// Work Flags
//
#define NM_FLAG_NET_REPORT_LOCAL_IF_UP 0x00000100
#define NM_FLAG_NET_REPORT_CONNECTIVITY 0x00000200
#define NM_FLAG_NET_RECALC_STATE 0x00000400
#define NM_FLAG_NET_ISOLATE_FAILURE 0x00000800
#define NM_FLAG_NET_NEED_TO_REGISTER 0x00002000
#define NM_FLAG_NET_REPORT_LOCAL_IF_FAILED 0x00004000
#define NM_FLAG_NET_RENEW_MCAST_ADDRESS 0x00008000
#define NM_FLAG_NET_RELEASE_MCAST_ADDRESS 0x00010000
#define NM_FLAG_NET_RECONFIGURE_MCAST 0x00020000
#define NM_FLAG_NET_REFRESH_MCAST 0x00040000
#define NM_FLAG_NET_REGENERATE_MCAST_KEY 0x00080000
#define NM_NET_WORK_FLAGS \
(NM_FLAG_NET_ISOLATE_FAILURE | \
NM_FLAG_NET_RECALC_STATE | \
NM_FLAG_NET_NEED_TO_REGISTER | \
NM_FLAG_NET_REFRESH_MCAST)
#define NM_NET_IF_WORK_FLAGS \
(NM_FLAG_NET_REPORT_LOCAL_IF_UP | \
NM_FLAG_NET_REPORT_LOCAL_IF_FAILED)
#define NM_NET_MADCAP_WORK_FLAGS \
(NM_FLAG_NET_RENEW_MCAST_ADDRESS | \
NM_FLAG_NET_RELEASE_MCAST_ADDRESS | \
NM_FLAG_NET_RECONFIGURE_MCAST | \
NM_FLAG_NET_REGENERATE_MCAST_KEY)
#define NmpIsNetworkRegistered(_network) \
((_network)->Flags & NM_FLAG_NET_REGISTERED)
#define NmpIsNetworkForInternalUse(_network) \
((_network)->Role & ClusterNetworkRoleInternalUse)
#define NmpIsNetworkForClientAccess(_network) \
((_network)->Role & ClusterNetworkRoleClientAccess)
#define NmpIsNetworkForInternalAndClientUse(_network) \
((_network)->Role == ClusterNetworkRoleInternalAndClient)
#define NmpIsNetworkDisabledForUse(_network) \
((_network)->Role == ClusterNetworkRoleNone)
#define NmpIsNetworkEnabledForUse(_network) \
((_network)->Role != ClusterNetworkRoleNone)
#define NmpIsNetworkMulticastEnabled(_network) \
((_network)->Flags & NM_FLAG_NET_MULTICAST_ENABLED)
#define NmpIsNetworkNameChangePending(_network) \
((_network)->Flags & NM_FLAG_NET_NAME_CHANGE_PENDING)
//
// Network deferred-work timers.
//
// The timer fires every 300ms. One heartbeat (HB) period is 1200ms.
//
// An interface is declared unreachable by ClusNet after two missed HBs.
// On average, an interface will fail in the middle of a ClusNet HB period.
// So, the avg time for ClusNet to detect and report an interface failure
// is 600 + 2400 = 3000ms. The worst case is 1200 + 2400 = 3600ms.
// The best case is 2400ms.
//
// If there are >2 nodes active on a network, it is desirable to
// aggregate interface failure reports when an entire network fails;
// however, we do not know how long it took for ClusNet to make the first
// report. Thus, we assume that the first interface failure was detected
// in the avg time and wait the for the worst case time before reporting.
//
// In the 2 node case, there is no aggregation to be performed so we report
// failures immediately. We always report InterfaceUp and InterfaceFailed
// events immediately. We also report immediately after a NodeDown event.
//
// State recalculation should be performed only after all nodes have reported
// their connectivity changes after a failure. There is spread of 1200ms
// between the best and worst case reporting times. Arbitrary scheduling and
// communication delays can widen the spread even more in the worst case.
// The best we can do is make a good guess. Once in a while, we will
// recalculate too soon. This isn't a disaster since the state calculation
// algorithm will abort if it has partial information. Further, we wait an
// additional period before trying to isolate any connectivity failures that
// were detected. We do this in order to avoid inducing unnecessary
// cluster resource failures.
//
// Note that since we invalidate the connectivity vectors for dead nodes
// after regroup, we only need to delay long enough for each of the nodes
// to process the node down event and fire off a connectivity report.
//
#define NM_NET_CONNECTIVITY_REPORT_TIMEOUT 600 // 3600 - 3000
#define NM_NET_STATE_RECALC_TIMEOUT 2400 // 3600 - 2400 + 1200
#define NM_NET_STATE_RECALC_TIMEOUT_AFTER_REGROUP 900
#define NM_NET_STATE_FAILURE_ISOLATION_TIMEOUT 3600
#define NM_NET_STATE_FAILURE_ISOLATION_POLL 60000 // Change Default to 1 min after testing
#define NM_NET_STATE_INTERFACE_FAILURE_TIMEOUT 3600
#define NM_NET_NAME_CHANGE_PENDING_TIMEOUT 15 * 60 * 1000 // 15 minutes
#define NM_NET_MULTICAST_KEY_REGEN_TIMEOUT (12 * 60 * 60 * 1000) // 12 hours
#define NM_NET_MULTICAST_KEY_REGEN_TIMEOUT_WINDOW ( 4 * 60 * 60 * 1000) // 4 hours
#define NM_NET_MULTICAST_RECONFIGURE_TIMEOUT (10 * 60 * 1000) // 10 minutes
#define NmpIsNetworkWorkerRunning(_network) \
((_network)->Flags & NM_FLAG_NET_WORKER_RUNNING)
#define NmpIsNetworkMadcapWorkerRunning(_network) \
((_network)->Flags & NM_FLAG_NET_MADCAP_WORKER_RUNNING)
#define NM_CONNECTIVITY_REPORT_RETRY_LIMIT 20 // 10 seconds
#define NM_NET_MIN_REGISTRATION_RETRY_TIMEOUT 500 // half a second
#define NM_NET_MAX_REGISTRATION_RETRY_TIMEOUT (10*60*1000) // 10 minutes
//
// Network interface definitions
//
typedef struct _NM_INTERFACE {
LIST_ENTRY Linkage;
DWORD NetIndex;
DWORD Flags;
CLUSTER_NETINTERFACE_STATE State;
PNM_NODE Node;
PNM_NETWORK Network;
LPWSTR AdapterName;
LPWSTR AdapterId;
LPWSTR Address;
ULONG BinaryAddress;
LPWSTR ClusnetEndpoint;
LPWSTR Description;
LIST_ENTRY NetworkLinkage;
LIST_ENTRY NodeLinkage;
} NM_INTERFACE;
#define NM_INTERFACE_SIG ' fi'
#define NM_FLAG_IF_REGISTERED 0x00000002
#define NmpIsInterfaceRegistered(_interface) \
((_interface)->Flags & NM_FLAG_IF_REGISTERED)
//
// This structure is used to hook changes in the node leadership.
//
typedef struct _NM_LEADER_CHANGE_WAIT_ENTRY {
LIST_ENTRY Linkage;
HANDLE LeaderChangeEvent;
} NM_LEADER_CHANGE_WAIT_ENTRY, *PNM_LEADER_CHANGE_WAIT_ENTRY;
//
// This structure is used for asynchronous network connectivity reports.
//
typedef struct _NM_CONNECTIVITY_REPORT_CONTEXT {
NM_LEADER_CHANGE_WAIT_ENTRY LeaderChangeWaitEntry;
HANDLE ConnectivityReportEvent;
} NM_CONNECTIVITY_REPORT_CONTEXT, *PNM_CONNECTIVITY_REPORT_CONTEXT;
// the fixup callback record stored by nm on behalf of other components to perform
//form or join fixups.
typedef struct _NM_FIXUP_CB_RECORD{
NM_FIXUP_NOTIFYCB pfnFixupNotifyCb;
DWORD dwFixupMask;
}NM_FIXUP_CB_RECORD,*PNM_FIXUP_CB_RECORD;
//the fixup callback functions for updating in-memory structure after
//updatinbg the registry
typedef DWORD (WINAPI *NM_POST_FIXUP_CB)(VOID);
// fixup callback record used to pass argumnets to NmUpdatePerformFixups2
// update type handler
typedef struct _NM_FIXUP_CB_RECORD2{
NM_FIXUP_NOTIFYCB pfnFixupNotifyCb; // pointer to fn that builds up the fixup property list
DWORD dwFixupMask;
PRESUTIL_PROPERTY_ITEM pPropertyTable; // Property table for this key
} NM_FIXUP_CB_RECORD2,*PNM_FIXUP_CB_RECORD2;
//
// Global Data
//
extern CRITICAL_SECTION NmpLock;
extern HANDLE NmpMutex;
extern NM_STATE NmpState;
extern DWORD NmpActiveThreadCount;
extern HANDLE NmpShutdownEvent;
extern LIST_ENTRY NmpNodeList;
extern PNM_NODE * NmpIdArray;
extern BOOLEAN NmpNodeCleanupOk;
extern LIST_ENTRY NmpNetworkList;
extern LIST_ENTRY NmpInternalNetworkList;
extern LIST_ENTRY NmpDeletedNetworkList;
extern DWORD NmpNetworkCount;
extern DWORD NmpInternalNetworkCount;
extern DWORD NmpClientNetworkCount;
extern LIST_ENTRY NmpInterfaceList;
extern LIST_ENTRY NmpDeletedInterfaceList;
extern RESUTIL_PROPERTY_ITEM NmpNetworkProperties[];
extern RESUTIL_PROPERTY_ITEM NmpInterfaceProperties[];
extern CL_NODE_ID NmpJoinerNodeId;
extern CL_NODE_ID NmpSponsorNodeId;
extern DWORD NmpJoinTimer;
extern BOOLEAN NmpJoinAbortPending;
extern DWORD NmpJoinSequence;
extern BOOLEAN NmpJoinerUp;
extern BOOLEAN NmpJoinBeginInProgress;
extern BOOLEAN NmpJoinerOutOfSynch;
extern WCHAR NmpInvalidJoinerIdString[];
extern WCHAR NmpUnknownString[];
extern LPWSTR NmpClusnetEndpoint;
extern NM_STATE NmpState;
extern CL_NODE_ID NmpLeaderNodeId;
extern BITSET NmpUpNodeSet;
extern WCHAR NmpNullString[];
extern CLUSTER_NETWORK_ROLE NmpDefaultNetworkRole;
extern BOOL NmpCleanupIfJoinAborted;
extern DWORD NmpAddNodeId;
extern LIST_ENTRY NmpLeaderChangeWaitList;
extern LIST_ENTRY * NmpIntraClusterRpcArr;
extern CRITICAL_SECTION NmpRPCLock;
extern BOOL NmpLastNodeEvicted;
extern DWORD NmpNodeCount;
extern BOOLEAN NmpIsNT5NodeInCluster;
extern LPWSTR NmpClusterInstanceId;
extern BOOLEAN NmpGumUpdateHandlerRegistered;
#if DBG
extern DWORD NmpRpcTimer;
#endif //DBG
//
// Synchronization macros
//
#define NmpAcquireLock() EnterCriticalSection(&NmpLock)
#define NmpReleaseLock() LeaveCriticalSection(&NmpLock)
#define NmpAcquireMutex() \
{ \
DWORD _status = WaitForSingleObject(NmpMutex, INFINITE); \
CL_ASSERT(_status == WAIT_OBJECT_0); \
} \
#define NmpReleaseMutex() ReleaseMutex(NmpMutex);
//
// Node Intracluster RPC record/cancellation routines.
// Useful to terminate outstanding RPCs to failed nodes.
//
#define NM_RPC_TIMEOUT 45000 // 45 secs
typedef struct _NM_INTRACLUSTER_RPC_THREAD {
LIST_ENTRY Linkage;
BOOLEAN Cancelled;
HANDLE Thread;
DWORD ThreadId;
}NM_INTRACLUSTER_RPC_THREAD, *PNM_INTRACLUSTER_RPC_THREAD;
#define NmpAcquireRPCLock() EnterCriticalSection(&NmpRPCLock);
#define NmpReleaseRPCLock() LeaveCriticalSection(&NmpRPCLock);
VOID
NmpTerminateRpcsToNode(
DWORD NodeId
);
VOID
NmpRpcTimerTick(
DWORD MsTickInterval
);
//
// IsolationPollTimerValue read routine
//
DWORD
NmpGetIsolationPollTimerValue(
VOID
);
//
// Miscellaneous Routines
//
BOOLEAN
NmpLockedEnterApi(
NM_STATE RequiredState
);
BOOLEAN
NmpEnterApi(
NM_STATE RequiredState
);
VOID
NmpLeaveApi(
VOID
);
VOID
NmpLockedLeaveApi(
VOID
);
LPWSTR
NmpLoadString(
IN UINT StringId
);
VOID
NmpDbgPrint(
IN ULONG LogLevel,
IN PCHAR FormatString,
...
);
DWORD
NmpCleanseRegistry(
IN LPCWSTR NodeId,
IN HLOCALXSACTION Xaction
);
DWORD
NmpQueryString(
IN HDMKEY Key,
IN LPCWSTR ValueName,
IN DWORD ValueType,
IN LPWSTR *StringBuffer,
IN OUT LPDWORD StringBufferSize,
OUT LPDWORD StringSize
);
BOOL
NmpCleanseResTypeCallback(
IN PNM_EVICTION_CONTEXT Context,
IN PVOID Context2,
IN PFM_RESTYPE pResType,
IN LPCWSTR pszResTypeName
);
BOOL
NmpCleanseResourceCallback(
IN PNM_EVICTION_CONTEXT Context,
IN PVOID Context2,
IN PFM_RESOURCE Resource,
IN LPCWSTR ResourceName
);
BOOL
NmpCleanseGroupCallback(
IN PNM_EVICTION_CONTEXT Context,
IN PVOID Context2,
IN PFM_GROUP Group,
IN LPCWSTR GroupName
);
VOID
NmpIssueClusterPropertyChangeEvent(
VOID
);
DWORD
NmpMarshallObjectInfo(
IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
IN PVOID ObjectInfo,
OUT PVOID * PropertyList,
OUT LPDWORD PropertyListSize
);
BOOLEAN
NmpVerifyNodeConnectivity(
PNM_NODE Node1,
PNM_NODE Node2,
PNM_NETWORK ExcludedNetwork
);
BOOLEAN
NmpVerifyConnectivity(
PNM_NETWORK ExcludedNetwork
);
BOOLEAN
NmpVerifyJoinerConnectivity(
IN PNM_NODE JoiningNode,
OUT PNM_NODE * UnreachableNode
);
DWORD
NmpCreateClusterInstanceId(
VOID
);
DWORD
NmpSetLsaProcessOptions(
IN ULONG ProcessOptions
);
DWORD
NmpGetMulticastKeyFromNMLeader(
IN DWORD LeaderNodeId,
IN LPWSTR NodeIdString,
IN LPWSTR NetworkId,
IN PNM_NETWORK_MULTICASTKEY * MulticastKey
);
DWORD
NmpCreateRandomNumber(OUT PVOID * RandonNumber,
IN DWORD RandonNumberSize
);
//
// Node Management Routines
//
DWORD
NmpInitNodes(
VOID
);
VOID
NmpCleanupNodes(
VOID
);
DWORD
NmpGetNodeDefinition(
IN OUT PNM_NODE_INFO2 NodeInfo
);
DWORD
NmpEnumNodeDefinitions(
PNM_NODE_ENUM2 * NodeEnum
);
DWORD
NmpCreateNodeObjects(
IN PNM_NODE_ENUM2 NodeEnum2
);
DWORD NmpRefreshNodeObjects(
);
DWORD
NmpCreateLocalNodeObject(
IN PNM_NODE_INFO2 NodeInfo2
);
PNM_NODE
NmpCreateNodeObject(
IN PNM_NODE_INFO2 NodeInfo
);
DWORD
NmpGetNodeObjectInfo(
IN PNM_NODE Node,
IN OUT PNM_NODE_INFO2 NodeInfo
);
VOID
NmpDeleteNodeObject(
IN PNM_NODE Node,
IN BOOLEAN IssueEvent
);
BOOL
NmpDestroyNodeObject(
PNM_NODE Node
);
DWORD
NmpEnumNodeObjects(
PNM_NODE_ENUM2 * NodeEnum
);
VOID
NmpNodeFailureHandler(
CL_NODE_ID NodeId,
LPVOID NodeFailureContext
);
DWORD
NmpSetNodeInterfacePriority(
IN PNM_NODE Node,
IN DWORD Priority,
IN PNM_INTERFACE TargetInterface OPTIONAL,
IN DWORD TargetInterfacePriority OPTIONAL
);
DWORD
NmpEnumNodeObjects(
PNM_NODE_ENUM2 * NodeEnum2
);
DWORD
NmpAddNode(
IN LPCWSTR NewNodeName,
IN DWORD NewNodeHighestVersion,
IN DWORD NewNodeLowestVersion,
IN DWORD NewNodeProductSuite,
IN DWORD RegistryNodeLimit
);
BOOLEAN
NmpIsAddNodeAllowed(
IN DWORD NewNodeProductSuite,
IN DWORD RegistryNodeLimit,
OUT LPDWORD EffectiveNodeLimit OPTIONAL
);
VOID
NmpAdviseNodeFailure(
IN PNM_NODE Node,
IN DWORD ErrorCode
);
//
// PnP Management Routines
//
DWORD
NmpInitializePnp(
VOID
);
VOID
NmpShutdownPnp(
VOID
);
VOID
NmpCleanupPnp(
VOID
);
VOID
NmpWatchForPnpEvents(
VOID
);
DWORD
NmpEnablePnpEvents(
VOID
);
DWORD
NmpPostPnpNotification(
BOOLEAN IsPnpLockHeld
);
DWORD
NmpConfigureNetworks(
IN RPC_BINDING_HANDLE JoinSponsorBinding,
IN LPWSTR LocalNodeId,
IN LPWSTR LocalNodeName,
IN PNM_NETWORK_ENUM * NetworkEnum,
IN PNM_INTERFACE_ENUM2 * InterfaceEnum,
IN LPWSTR DefaultEndpoint,
IN OUT LPDWORD MatchedNetworkCount,
IN OUT LPDWORD NewNetworkCount,
IN BOOL RenameConnectoids
);
//
// Network Management Routines
//
DWORD
NmpInitializeNetworks(
VOID
);
VOID
NmpCleanupNetworks(
VOID
);
DWORD
NmpSetNetworkRole(
PNM_NETWORK Network,
CLUSTER_NETWORK_ROLE NewRole,
HLOCALXSACTION Xaction,
HDMKEY NetworkKey
);
DWORD
NmpCreateNetwork(
IN RPC_BINDING_HANDLE JoinSponsorBinding,
IN PNM_NETWORK_INFO NetworkInfo,
IN PNM_INTERFACE_INFO2 InterfaceInfo
);
DWORD
NmpGlobalCreateNetwork(
IN PNM_NETWORK_INFO NetworkInfo,
IN PNM_INTERFACE_INFO2 InterfaceInfo
);
DWORD
NmpCreateNetworkDefinition(
IN PNM_NETWORK_INFO NetworkInfo,
IN HLOCALXSACTION Xaction
);
DWORD
NmpSetNetworkNameDefinition(
IN PNM_NETWORK_INFO NetworkInfo,
IN HLOCALXSACTION Xaction
);
DWORD
NmpGetNetworkDefinition(
IN LPWSTR NetworkId,
OUT PNM_NETWORK_INFO NetworkInfo
);
DWORD
NmpEnumNetworkDefinitions(
OUT PNM_NETWORK_ENUM * NetworkEnum
);
DWORD
NmpCreateNetworkObjects(
IN PNM_NETWORK_ENUM NetworkEnum
);
PNM_NETWORK
NmpCreateNetworkObject(
IN PNM_NETWORK_INFO NetworkInfo
);
DWORD
NmpGetNetworkObjectInfo(
IN PNM_NETWORK Network,
OUT PNM_NETWORK_INFO NetworkInfo
);
VOID
NmpDeleteNetworkObject(
IN PNM_NETWORK Network,
IN BOOLEAN IssueEvent
);
BOOL
NmpDestroyNetworkObject(
PNM_NETWORK Network
);
DWORD
NmpEnumNetworkObjects(
OUT PNM_NETWORK_ENUM * NetworkEnum
);
DWORD
NmpRegisterNetwork(
IN PNM_NETWORK Network,
IN BOOLEAN RetryOnFailure
);
VOID
NmpDeregisterNetwork(
IN PNM_NETWORK Network
);
VOID
NmpInsertInternalNetwork(
PNM_NETWORK Network
);
DWORD
NmpValidateNetworkRoleChange(
PNM_NETWORK Network,
CLUSTER_NETWORK_ROLE NewRole
);
DWORD
NmpNetworkValidateCommonProperties(
IN PNM_NETWORK Network,
IN PVOID InBuffer,
IN DWORD InBufferSize,
OUT PNM_NETWORK_INFO NetworkInfo OPTIONAL
);
DWORD
NmpSetNetworkName(
IN PNM_NETWORK_INFO NetworkInfo
);
DWORD
NmpGlobalSetNetworkName(
IN PNM_NETWORK_INFO NetworkInfo
);
VOID
NmpRecomputeNT5NetworkAndInterfaceStates(
VOID
);
BOOLEAN
NmpComputeNetworkAndInterfaceStates(
PNM_NETWORK Network,
BOOLEAN IsolateFailure,
CLUSTER_NETWORK_STATE * NewNetworkState
);
VOID
NmpStartNetworkConnectivityReportTimer(
PNM_NETWORK Network
);
VOID
NmpStartNetworkStateRecalcTimer(
PNM_NETWORK Network,
DWORD Timeout
);
VOID
NmpStartNetworkFailureIsolationTimer(
PNM_NETWORK Network,
DWORD Timeout
);
VOID
NmpStartNetworkRegistrationRetryTimer(
PNM_NETWORK Network
);
VOID
NmpStartNetworkNameChangePendingTimer(
IN PNM_NETWORK Network,
IN DWORD Timeout
);
VOID
NmpScheduleNetworkConnectivityReport(
PNM_NETWORK Network
);
VOID
NmpScheduleNetworkStateRecalc(
PNM_NETWORK Network
);
VOID
NmpScheduleNetworkRegistration(
PNM_NETWORK Network
);
DWORD
NmpScheduleConnectivityReportWorker(
VOID
);
DWORD
NmpScheduleNetworkWorker(
PNM_NETWORK Network
);
VOID
NmpConnectivityReportWorker(
IN PCLRTL_WORK_ITEM WorkItem,
IN DWORD Status,
IN DWORD BytesTransferred,
IN ULONG_PTR IoContext
);
VOID
NmpNetworkWorker(
IN PCLRTL_WORK_ITEM WorkItem,
IN DWORD Status,
IN DWORD BytesTransferred,
IN ULONG_PTR IoContext
);
VOID
NmpNetworkTimerTick(
IN DWORD MsTickInterval
);
VOID
NmpSetNetworkAndInterfaceStates(
IN PNM_NETWORK Network,
IN CLUSTER_NETWORK_STATE NewNetworkState,
IN PNM_STATE_ENTRY InterfaceStateVector,
IN DWORD VectorSize
);
VOID
NmpUpdateNetworkConnectivityForDownNode(
PNM_NODE Node
);
DWORD
NmpEnumNetworkObjectStates(
OUT PNM_NETWORK_STATE_ENUM * NetworkStateEnum
);
DWORD NmpGetNetworkMulticastKey(
IN LPWSTR NetworkId,
OUT PNM_NETWORK_MULTICASTKEY * NetworkMulticastKey
);
VOID
NmpFreeNetworkStateEnum(
PNM_NETWORK_STATE_ENUM NetworkStateEnum
);
DWORD
NmpReportNetworkConnectivity(
IN PNM_NETWORK Network
);
DWORD
NmpGlobalSetNetworkAndInterfaceStates(
PNM_NETWORK Network,
CLUSTER_NETWORK_STATE NewNetworkState
);
VOID
NmpReferenceNetwork(
PNM_NETWORK Network
);
VOID
NmpDereferenceNetwork(
PNM_NETWORK Network
);
PNM_NETWORK
NmpReferenceNetworkByAddress(
LPWSTR NetworkAddress,
LPWSTR NetworkMask
);
PNM_NETWORK
NmpReferenceNetworkByRemoteAddress(
LPWSTR RemoteAddress
);
DWORD
NmpEnumInternalNetworks(
OUT LPDWORD NetworkCount,
OUT PNM_NETWORK * NetworkList[]
);
DWORD
NmpSetNetworkPriorityOrder(
IN DWORD NetworkCount,
IN PNM_NETWORK * NetworkList,
IN HLOCALXSACTION Xaction
);
DWORD
NmpGetNetworkInterfaceFailureTimerValue(
IN LPCWSTR NetworkId
);
BOOLEAN
NmpCheckForNetwork(
VOID
);
//
// Network Multicast Management Routines
//
typedef enum {
NmStartMulticastForm = 0,
NmStartMulticastJoin,
NmStartMulticastDynamic
} NM_START_MULTICAST_MODE, *PNM_START_MULTICAST_MODE;
VOID
NmpMulticastInitialize(
VOID
);
DWORD
NmpMulticastCleanup(
VOID
);
DWORD
NmpStartMulticast(
IN OPTIONAL PNM_NETWORK Network,
IN NM_START_MULTICAST_MODE Mode
);
DWORD
NmpStopMulticast(
IN OPTIONAL PNM_NETWORK Network
);
VOID
NmpMulticastProcessClusterVersionChange(
VOID
);
DWORD
NmpMulticastValidatePrivateProperties(
IN PNM_NETWORK Network,
IN HDMKEY RegistryKey,
IN PVOID InBuffer,
IN DWORD InBufferSize
);
VOID
NmpScheduleMulticastAddressRenewal(
PNM_NETWORK Network
);
VOID
NmpScheduleMulticastAddressRelease(
PNM_NETWORK Network
);
VOID
NmpScheduleMulticastRefresh(
IN PNM_NETWORK Network
);
VOID
NmpScheduleMulticastKeyRegeneration(
PNM_NETWORK Network
);
DWORD
NmpRefreshMulticastConfiguration(
IN PNM_NETWORK Network
);
VOID
NmpFreeMulticastAddressReleaseList(
IN PNM_NETWORK Network
);
DWORD
NmpMulticastManualConfigChange(
IN PNM_NETWORK Network,
IN HDMKEY NetworkKey,
IN HDMKEY NetworkParametersKey,
IN PVOID InBuffer,
IN DWORD InBufferSize,
OUT BOOLEAN * SetProperties
);
DWORD
NmpUpdateSetNetworkMulticastConfiguration(
IN BOOL SourceNode,
IN LPWSTR NetworkId,
IN PVOID UpdateBuffer,
IN PVOID PropBuffer,
IN LPDWORD PropBufferSize
);
//
// Interface Management Routines
//
DWORD
NmpInitializeInterfaces(
VOID
);
VOID
NmpCleanupInterfaces(
VOID
);
DWORD
NmpCreateInterface(
IN RPC_BINDING_HANDLE JoinSponsorBinding,
IN PNM_INTERFACE_INFO2 InterfaceInfo
);
DWORD
NmpGlobalCreateInterface(
IN PNM_INTERFACE_INFO2 InterfaceInfo
);
DWORD
NmpSetInterfaceInfo(
IN RPC_BINDING_HANDLE JoinSponsorBinding,
IN PNM_INTERFACE_INFO2 InterfaceInfo
);
DWORD
NmpLocalSetInterfaceInfo(
IN PNM_INTERFACE Interface,
IN PNM_INTERFACE_INFO2 InterfaceInfo,
IN HLOCALXSACTION Xaction
);
DWORD
NmpGlobalSetInterfaceInfo(
IN PNM_INTERFACE_INFO2 InterfaceInfo
);
DWORD
NmpDeleteInterface(
IN RPC_BINDING_HANDLE JoinSponsorBinding,
IN LPWSTR InterfaceId,
IN LPWSTR NetworkId,
IN OUT PBOOLEAN NetworkDeleted
);
DWORD
NmpGlobalDeleteInterface(
IN LPWSTR InterfaceId,
IN OUT PBOOLEAN NetworkDeleted
);
DWORD
NmpInterfaceValidateCommonProperties(
IN PNM_INTERFACE Interface,
IN PVOID InBuffer,
IN DWORD InBufferSize,
OUT PNM_INTERFACE_INFO2 InterfaceInfo OPTIONAL
);
DWORD
NmpCreateInterfaceDefinition(
IN PNM_INTERFACE_INFO2 InterfaceInfo,
IN HLOCALXSACTION Xaction
);
DWORD
NmpGetInterfaceDefinition(
IN LPWSTR InterfaceId,
OUT PNM_INTERFACE_INFO2 InterfaceInfo
);
DWORD
NmpSetInterfaceDefinition(
IN PNM_INTERFACE_INFO2 InterfaceInfo,
IN HLOCALXSACTION Xaction
);
DWORD
NmpEnumInterfaceDefinitions(
OUT PNM_INTERFACE_ENUM2 * InterfaceEnum
);
DWORD
NmpCreateInterfaceObjects(
IN PNM_INTERFACE_ENUM2 InterfaceEnum
);
PNM_INTERFACE
NmpCreateInterfaceObject(
IN PNM_INTERFACE_INFO2 InterfaceInfo,
IN BOOLEAN RetryOnFailure
);
DWORD
NmpGetInterfaceObjectInfo1(
IN PNM_INTERFACE Interface,
IN OUT PNM_INTERFACE_INFO InterfaceInfo1
);
DWORD
NmpGetInterfaceObjectInfo(
IN PNM_INTERFACE Interface,
IN OUT PNM_INTERFACE_INFO2 InterfaceInfo
);
VOID
NmpDeleteInterfaceObject(
IN PNM_INTERFACE Interface,
IN BOOLEAN IssueEvent
);
BOOL
NmpDestroyInterfaceObject(
PNM_INTERFACE Interface
);
DWORD
NmpEnumInterfaceObjects1(
OUT PNM_INTERFACE_ENUM * InterfaceEnum1
);
DWORD
NmpEnumInterfaceObjects(
OUT PNM_INTERFACE_ENUM2 * InterfaceEnum
);
DWORD
NmpRegisterInterface(
IN PNM_INTERFACE Interface,
IN BOOLEAN RetryOnFailure
);
VOID
NmpDeregisterInterface(
IN PNM_INTERFACE Interface
);
DWORD
NmpPrepareToCreateInterface(
IN PNM_INTERFACE_INFO2 InterfaceInfo,
OUT PNM_NETWORK * Network,
OUT PNM_NODE * Node
);
PNM_INTERFACE
NmpGetInterfaceForNodeAndNetworkById(
IN CL_NODE_ID NodeId,
IN CL_NETWORK_ID NetworkId
);
VOID
NmpFreeInterfaceStateEnum(
PNM_INTERFACE_STATE_ENUM InterfaceStateEnum
);
DWORD
NmpEnumInterfaceObjectStates(
OUT PNM_INTERFACE_STATE_ENUM * InterfaceStateEnum
);
VOID
NmpProcessLocalInterfaceStateEvent(
IN PNM_INTERFACE Interface,
IN CLUSTER_NETINTERFACE_STATE NewState
);
DWORD
NmpReportInterfaceConnectivity(
IN RPC_BINDING_HANDLE RpcBinding,
IN LPWSTR InterfaceId,
IN PNM_CONNECTIVITY_VECTOR ConnectivityVector,
IN LPWSTR NetworkId
);
VOID
NmpProcessInterfaceConnectivityReport(
IN PNM_INTERFACE SourceInterface,
IN PNM_CONNECTIVITY_VECTOR ConnectivityVector
);
DWORD
NmpInterfaceCheckThread(
LPDWORD Context
);
VOID
NmpReportLocalInterfaceStateEvent(
IN CL_NODE_ID NodeId,
IN CL_NETWORK_ID NetworkId,
IN DWORD NewState
);
DWORD
NmpConvertPropertyListToInterfaceInfo(
IN PVOID InterfacePropertyList,
IN DWORD InterfacePropertyListSize,
PNM_INTERFACE_INFO2 InterfaceInfo
);
VOID
NmpSetInterfaceConnectivityData(
PNM_NETWORK Network,
DWORD InterfaceNetIndex,
CLUSTER_NETINTERFACE_STATE State
);
DWORD
NmpTestInterfaceConnectivity(
PNM_INTERFACE Interface1,
PBOOLEAN Interface1HasConnectivity,
PNM_INTERFACE Interface2,
PBOOLEAN Interfacet2HasConnectivity
);
DWORD
NmpBuildInterfaceOnlineAddressEnum(
PNM_INTERFACE Interface,
PNM_ADDRESS_ENUM * OnlineAddressEnum
);
DWORD
NmpBuildInterfacePingAddressEnum(
PNM_INTERFACE Interface,
PNM_ADDRESS_ENUM OnlineAddressEnum,
PNM_ADDRESS_ENUM * PingAddressEnum
);
BOOLEAN
NmpVerifyLocalInterfaceConnected(
IN PNM_INTERFACE Interface
);
//
// Membership Management Routines
//
DWORD
NmpMembershipInit(
VOID
);
VOID
NmpMembershipShutdown(
VOID
);
VOID
NmpMarkNodeUp(
CL_NODE_ID NodeId
);
VOID
NmpNodeUpEventHandler(
IN PNM_NODE Node
);
VOID
NmpNodeDownEventHandler(
IN PNM_NODE Node
);
DWORD
NmpMultiNodeDownEventHandler(
IN BITSET DownedNodeSet
);
DWORD
NmpNodeChange(
DWORD NodeId,
NODESTATUS newstatus
);
BOOL
NmpCheckQuorumEventHandler(
VOID
);
VOID
NmpHoldIoEventHandler(
VOID
);
VOID
NmpResumeIoEventHandler(
VOID
);
VOID
NmpHaltEventHandler(
IN DWORD HaltCode
);
VOID
NmpJoinAbort(
DWORD AbortStatus,
PNM_NODE JoinerNode
);
//
// Routines for joining nodes to a cluster
//
DWORD
NmpCreateJoinerRpcBindings(
IN PNM_NODE JoinerNode,
IN PNM_INTERFACE JoinerInterface
);
//
// Gum update message types.
//
// The first entries in this list are auto-marshalled through Gum...Ex.
// Any updates that are not auto-marshalled must come after NmUpdateMaxAuto
//
typedef enum {
NmUpdateCreateNode = 0,
NmUpdatePauseNode,
NmUpdateResumeNode,
NmUpdateEvictNode,
NmUpdateCreateNetwork,
NmUpdateSetNetworkName,
NmUpdateSetNetworkPriorityOrder,
NmUpdateSetNetworkCommonProperties,
NmUpdateCreateInterface,
NmUpdateSetInterfaceInfo,
NmUpdateSetInterfaceCommonProperties,
NmUpdateDeleteInterface,
NmUpdateJoinBegin,
NmUpdateJoinAbort,
//
// Version 2 (NT 5.0) extensions that are understood by
// NT4 SP4 4.
//
NmUpdateJoinBegin2,
NmUpdateSetNetworkAndInterfaceStates,
NmUpdatePerformFixups,
NmUpdatePerformFixups2,
//
// Version 2 (NT 5.0) extensions that are not understood
// by NT4 SP4. These may not be issued in a mixed NT4/NT5 cluster.
//
NmUpdateAddNode,
NmUpdateExtendedNodeState,
//
// NT 5.1 extensions that are not understood by NT5 and
// earlier. NT5 nodes will ignore these updates without
// error.
//
NmUpdateSetNetworkMulticastConfiguration,
NmUpdateSetServiceAccountPassword,
//
// Max handled automatically by GUM
//
NmUpdateMaxAuto = 0x10000,
NmUpdateJoinComplete,
NmUpdateMaximum
} NM_GUM_MESSAGE_TYPES;
#pragma warning( disable: 4200 )
typedef struct _NM_JOIN_UPDATE {
DWORD JoinSequence;
DWORD IsPaused;
WCHAR NodeId[0];
} NM_JOIN_UPDATE, *PNM_JOIN_UPDATE;
#pragma warning( default: 4200 )
DWORD
NmpGumUpdateHandler(
IN DWORD Context,
IN BOOL SourceNode,
IN DWORD BufferLength,
IN PVOID Buffer
);
DWORD
NmpUpdateAddNode(
IN BOOL SourceNode,
IN LPDWORD NewNodeId,
IN LPCWSTR NewNodeName,
IN LPDWORD NewNodeHighestVersion,
IN LPDWORD NewNodeLowestVersion,
IN LPDWORD NewNodeProductSuite
);
DWORD
NmpUpdateCreateNode(
IN BOOL SourceNode,
IN LPDWORD NodeId
);
DWORD
NmpUpdatePauseNode(
IN BOOL SourceNode,
IN LPWSTR NodeName
);
DWORD
NmpUpdateResumeNode(
IN BOOL SourceNode,
IN LPWSTR NodeName
);
DWORD
NmpUpdateEvictNode(
IN BOOL SourceNode,
IN LPWSTR NodeName
);
DWORD
NmpUpdateSetServiceAccountPassword(
IN BOOL SourceNode,
IN LPWSTR DomainName,
IN LPWSTR AccountName,
IN LPBYTE NewPassword,
IN LPDWORD NewPasswordLen,
IN LPBYTE SaltBuf,
IN LPDWORD SaltBufLen,
IN LPBYTE MACData,
IN LPDWORD MACDataLen
);
DWORD
NmpUpdateCreateNetwork(
IN BOOL IsSourceNode,
IN PVOID NetworkPropertyList,
IN LPDWORD NetworkPropertyListSize,
IN PVOID InterfacePropertyList,
IN LPDWORD InterfacePropertyListSize
);
DWORD
NmpUpdateSetNetworkName(
IN BOOL IsSourceNode,
IN LPWSTR NetworkId,
IN LPWSTR Name
);
DWORD
NmpUpdateSetNetworkPriorityOrder(
IN BOOL IsSourceNode,
IN LPCWSTR NetworkIdList
);
DWORD
NmpUpdateSetNetworkCommonProperties(
IN BOOL IsSourceNode,
IN LPWSTR NetworkId,
IN UCHAR * PropertyList,
IN LPDWORD PropertyListLength
);
DWORD
NmpUpdateCreateInterface(
IN BOOL IsSourceNode,
IN PVOID InterfacePropertyList,
IN LPDWORD InterfacePropertyListSize
);
DWORD
NmpUpdateSetInterfaceInfo(
IN BOOL SourceNode,
IN PVOID InterfacePropertyList,
IN LPDWORD InterfacePropertyListSize
);
DWORD
NmpUpdateSetInterfaceCommonProperties(
IN BOOL IsSourceNode,
IN LPWSTR InterfaceId,
IN UCHAR * PropertyList,
IN LPDWORD PropertyListLength
);
DWORD
NmpUpdateDeleteInterface(
IN BOOL IsSourceNode,
IN LPWSTR InterfaceId
);
DWORD
NmpUpdateJoinBegin(
IN BOOL SourceNode,
IN LPWSTR JoinerNodeId,
IN LPWSTR JoinerNodeName,
IN LPWSTR SponsorNodeId
);
DWORD
NmpUpdateJoinComplete(
IN PNM_JOIN_UPDATE JoinUpdate
);
DWORD
NmpUpdateJoinAbort(
IN BOOL SourceNode,
IN LPDWORD JoinSequence,
IN LPWSTR JoinerNodeId
);
DWORD
NmpUpdateJoinBegin2(
IN BOOL SourceNode,
IN LPWSTR JoinerNodeId,
IN LPWSTR JoinerNodeName,
IN LPWSTR SponsorNodeId,
IN LPDWORD JoinerHighestVersion,
IN LPDWORD JoinerLowestVersion
);
DWORD
NmpUpdateSetNetworkAndInterfaceStates(
IN BOOL IsSourceNode,
IN LPWSTR NetworkId,
IN CLUSTER_NETWORK_STATE * NewNetworkState,
IN PNM_STATE_ENTRY InterfaceStateVector,
IN LPDWORD InterfaceStateVectorSize
);
DWORD
NmpDoInterfacePing(
IN PNM_INTERFACE Interface,
IN PNM_ADDRESS_ENUM PingAddressEnum,
OUT BOOLEAN * PingSucceeded
);
//versioning functions
VOID
NmpResetClusterVersion(
BOOL ProcessChanges
);
DWORD NmpValidateNodeVersion(
IN LPCWSTR NodeId,
IN DWORD dwHighestVersion,
IN DWORD dwLowestVersion
);
DWORD NmpFormFixupNodeVersion(
IN LPCWSTR NodeId,
IN DWORD dwHighestVersion,
IN DWORD dwLowestVersion
);
DWORD NmpJoinFixupNodeVersion(
IN HLOCALXSACTION hXsaction,
IN LPCWSTR NodeId,
IN DWORD dwHighestVersion,
IN DWORD dwLowestVersion
);
DWORD NmpIsNodeVersionAllowed(
IN DWORD dwExcludeNodeId,
IN DWORD NodeHighestVersion,
IN DWORD NodeLowestVersion,
IN BOOL bJoin
);
DWORD NmpCalcClusterVersion(
IN DWORD dwExcludeNodeId,
OUT LPDWORD pdwClusterHighestVersion,
OUT LPDWORD pdwClusterLowestVersion
);
DWORD NmpUpdatePerformFixups(
IN BOOL IsSourceNode,
IN PVOID PropertyList,
IN LPDWORD PropertyListSize
);
DWORD NmpUpdatePerformFixups2(
IN BOOL IsSourceNode,
IN PVOID PropertyList,
IN LPDWORD PropertyListSize,
IN LPDWORD lpdwFixupNum,
IN PVOID lpKeyName,
IN PVOID pPropertyBuffer
);
DWORD NmpUpdateExtendedNodeState(
IN BOOL SourceNode,
IN LPWSTR NodeId,
IN CLUSTER_NODE_STATE* ExtendedState
);
VOID
NmpProcessClusterVersionChange(
VOID
);
VOID
NmpResetClusterNodeLimit(
);
// Fixup routine for updating the node version info, used by nmperformfixups
DWORD
NmpBuildVersionInfo(
IN DWORD dwFixUpType,
OUT PVOID * ppPropertyList,
OUT LPDWORD pdwPropertyListSize,
OUT LPWSTR * lpszKeyName
);
//
// connectoid advise sink functions
//
HRESULT
NmpInitializeConnectoidAdviseSink(
VOID
);
//
// Routines that must be supplied by users of the ClNet package.
//
VOID
ClNetPrint(
IN ULONG LogLevel,
IN PCHAR FormatString,
...
);
VOID
ClNetLogEvent(
IN DWORD LogLevel,
IN DWORD MessageId
);
VOID
ClNetLogEvent1(
IN DWORD LogLevel,
IN DWORD MessageId,
IN LPCWSTR Arg1
);
VOID
ClNetLogEvent2(
IN DWORD LogLevel,
IN DWORD MessageId,
IN LPCWSTR Arg1,
IN LPCWSTR Arg2
);
VOID
ClNetLogEvent3(
IN DWORD LogLevel,
IN DWORD MessageId,
IN LPCWSTR Arg1,
IN LPCWSTR Arg2,
IN LPCWSTR Arg3
);
//
// Shared key management routines.
//
DWORD
NmpGetClusterKey(
OUT PVOID KeyBuffer,
IN OUT DWORD * KeyBufferLength
);
DWORD
NmpRederiveClusterKey(
VOID
);
VOID
NmpFreeClusterKey(
VOID
);
DWORD
NmpDeriveSessionKey(
IN HCRYPTPROV CryptProv,
IN ALG_ID EncryptionAlgoId,
IN DWORD Flags,
IN BYTE *SaltBuffer,
IN DWORD SaltBufferLen,
OUT HCRYPTKEY *CryptKey
);
#ifdef MULTICAST_DEBUG
DWORD
NmpDbgPrintData(LPCWSTR InfoStr,
PVOID Data,
DWORD DataLen
);
#endif
DWORD
NmpCreateCSPHandle(
OUT HCRYPTPROV *CryptProvider
);
DWORD
NmpProtectData(
IN PVOID Data,
IN DWORD DataLength,
OUT PVOID *EncryptedData,
OUT DWORD *EncryptedDataLength
);
DWORD
NmpUnprotectData(
IN PVOID EncryptedData,
IN DWORD EncryptedDataLength,
OUT PVOID * Data,
OUT DWORD * DataLength
);
DWORD
NmpEncryptDataAndCreateMAC(
IN HCRYPTPROV CryptProv,
IN ALG_ID EncryptionAlgoId,
IN DWORD Flags,
IN PBYTE Data,
IN DWORD DataLength,
IN PVOID EncryptionKey,
IN DWORD EncryptionKeyLength,
IN BOOL CreateSalt,
OUT PBYTE *Salt,
IN DWORD SaltLength,
OUT PBYTE *EncryptedData,
OUT DWORD *EncryptedDataLength,
OUT PBYTE *MAC,
IN OUT DWORD *MACLength
);
DWORD
NmpVerifyMACAndDecryptData(
IN HCRYPTPROV CryptProv,
IN ALG_ID EcnryptionAlgoId,
IN DWORD Flags,
IN PBYTE MAC,
IN DWORD MACLength,
IN DWORD MACExpectedSize,
IN PBYTE EncryptedData,
IN DWORD EncryptedDataLength,
IN PVOID EncryptionKey,
IN DWORD EncryptionKeyLength,
IN PBYTE Salt,
IN DWORD SaltLength,
OUT PBYTE *DecryptedData,
OUT DWORD *DecryptedDataLength
);
DWORD
NmpDeriveClusterKey(
IN PVOID MixingBytes,
IN DWORD MixingBytesSize,
OUT PVOID * Key,
OUT DWORD * KeyLength
);
void
NmpFreeNetworkMulticastKey(
PNM_NETWORK_MULTICASTKEY networkMulticastKey
);
VOID
NmpScheduleMulticastReconfiguration(
IN PNM_NETWORK Network
);
#endif // _NMP_INCLUDED