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

  1. /*++
  2. Copyright (c) 1996-1999 Microsoft Corporation
  3. Module Name:
  4. nmp.h
  5. Abstract:
  6. Private interface definitions for the Node Manager component.
  7. Author:
  8. Mike Massa (mikemas) 12-Mar-1996
  9. Revision History:
  10. --*/
  11. #ifndef _NMP_INCLUDED
  12. #define _NMP_INCLUDED
  13. #define UNICODE 1
  14. #include "service.h"
  15. #include <winsock2.h>
  16. #include <clnetcfg.h>
  17. #include <bitset.h>
  18. #include <madcapcl.h>
  19. #include <time.h>
  20. #include <ntlsa.h>
  21. #include <ntmsv1_0.h>
  22. #include <wincrypt.h>
  23. //
  24. // Constants
  25. //
  26. #define LOG_CURRENT_MODULE LOG_MODULE_NM
  27. #define NM_JOIN_TIMEOUT 60000 // 60 seconds
  28. #define NM_MM_JOIN_TIMEOUT 3000 // 3 seconds
  29. #define NM_CLOCK_PERIOD 300 // 300 milliseconds
  30. #define NM_SEND_HB_RATE 4
  31. #define NM_RECV_HB_RATE 3 // Changed 2=>3 to prolong min_stage_1 ticks from 8 to 12
  32. #define MulticastKeyLen 16 // 128 bits
  33. #define NMP_ENCRYPT_ALGORITHM CALG_RC2 // RC2 block encryption algorithm.
  34. #define NMP_KEY_LENGTH 0x00800000 // Key length: 128 bits.
  35. #define NMP_SALT_BUFFER_LEN 16 // 16 bytes. Length of salt for encryption
  36. // of password transferred on wire
  37. #define NMP_MAC_DATA_LENGTH_EXPECTED 16 // 16 bytes
  38. //
  39. // Common Object Flags
  40. //
  41. #define NM_FLAG_OM_INSERTED 0x10000000
  42. #define NM_FLAG_DELETE_PENDING 0x80000000
  43. //
  44. // Miscellaneous Macros
  45. //
  46. #define NM_WCSLEN(_string) ((lstrlenW(_string) + 1) * sizeof(WCHAR))
  47. //
  48. // Common Object Management Macros
  49. //
  50. #define NM_OM_INSERTED(obj) ((obj)->Flags & NM_FLAG_OM_INSERTED)
  51. #define NM_DELETE_PENDING(obj) ((obj)->Flags & NM_FLAG_DELETE_PENDING)
  52. #define NM_FREE_OBJECT_FIELD(_object, _field) \
  53. if ( (_object)->_field != NULL ) \
  54. LocalFree( (_object)->_field )
  55. #define NM_MIDL_FREE_OBJECT_FIELD(_object, _field) \
  56. if ( (_object)->_field != NULL ) { \
  57. MIDL_user_free( (_object)->_field ); \
  58. (_object)->_field = NULL; \
  59. }
  60. //
  61. // State of the NM component
  62. //
  63. // Note that the order is important. See NmpEnterApi().
  64. //
  65. typedef enum {
  66. NmStateOffline = 0,
  67. NmStateOfflinePending = 1,
  68. NmStateOnlinePending = 2,
  69. NmStateOnline = 3,
  70. } NM_STATE, *PNM_STATE;
  71. //
  72. // Node definitions
  73. //
  74. typedef struct {
  75. DWORD Status;
  76. DWORD LocalOnly;
  77. } NM_NODE_CREATE_CONTEXT, *PNM_NODE_CREATE_CONTEXT;
  78. typedef struct _NM_NODE {
  79. LIST_ENTRY Linkage;
  80. DWORD NodeId;
  81. CLUSTER_NODE_STATE State;
  82. CLUSTER_NODE_STATE ExtendedState;
  83. DWORD Flags;
  84. DWORD InterfaceCount;
  85. LIST_ENTRY InterfaceList;
  86. DWORD HighestVersion;
  87. DWORD LowestVersion;
  88. RPC_BINDING_HANDLE ReportRpcBinding; // for net connectivity reports
  89. RPC_BINDING_HANDLE IsolateRpcBinding; // for net failure isolation
  90. SUITE_TYPE ProductSuite;
  91. DWORD DefaultRpcBindingGeneration;
  92. HANDLE MmNodeStateDownEvent; // A manual reset event to track MM Node UP/Down
  93. } NM_NODE;
  94. #define NM_NODE_SIG 'edon'
  95. typedef struct _NM_NODE_AUX_INFO{
  96. DWORD dwSize;
  97. DWORD dwVer;
  98. SUITE_TYPE ProductSuite;
  99. }NM_NODE_AUX_INFO, *PNM_NODE_AUX_INFO;
  100. typedef struct {
  101. LPCWSTR NodeId;
  102. HLOCALXSACTION Xaction;
  103. DWORD Status;
  104. } NM_EVICTION_CONTEXT, *PNM_EVICTION_CONTEXT;
  105. #define NM_NODE_UP(node) \
  106. ( ( (node)->State == ClusterNodeUp ) || \
  107. ( (node)->State == ClusterNodePaused ) )
  108. //
  109. // Network definitions
  110. //
  111. typedef struct _NM_STATE_WORK_ENTRY {
  112. NM_STATE_ENTRY State;
  113. DWORD ReachableCount;
  114. } NM_STATE_WORK_ENTRY, *PNM_STATE_WORK_ENTRY;
  115. typedef PNM_STATE_WORK_ENTRY PNM_STATE_WORK_VECTOR;
  116. typedef PNM_STATE_ENTRY PNM_CONNECTIVITY_MATRIX;
  117. #define NM_SIZEOF_CONNECTIVITY_MATRIX(_VectorSize) \
  118. (sizeof(NM_STATE_ENTRY) * _VectorSize *_VectorSize)
  119. #define NM_NEXT_CONNECTIVITY_MATRIX_ROW(_CurrentRowPtr, _VectorSize) \
  120. (_CurrentRowPtr + (_VectorSize * sizeof(NM_STATE_ENTRY)))
  121. #define NM_GET_CONNECTIVITY_MATRIX_ROW(_MatrixPtr, _RowNumber, _VectorSize) \
  122. (_MatrixPtr + (_RowNumber * (_VectorSize * sizeof(NM_STATE_ENTRY))))
  123. #define NM_GET_CONNECTIVITY_MATRIX_ENTRY( \
  124. _MatrixPtr, \
  125. _RowNumber, \
  126. _ColNumber, \
  127. _VectorSize \
  128. ) \
  129. ( _MatrixPtr + \
  130. (_RowNumber * (_VectorSize * sizeof(NM_STATE_ENTRY))) + \
  131. (_ColNumber * sizeof(NM_STATE_ENTRY)) \
  132. )
  133. //
  134. // Multicast configuration types.
  135. // - Manual: administrator configured address
  136. // - Madcap: lease obtained from MADCAP server
  137. // - Auto: address chosen after no MADCAP server detected
  138. //
  139. typedef enum {
  140. NmMcastConfigManual = 0,
  141. NmMcastConfigMadcap,
  142. NmMcastConfigAuto
  143. } NM_MCAST_CONFIG, *PNM_MCAST_CONFIG;
  144. typedef struct _NM_NETWORK {
  145. LIST_ENTRY Linkage;
  146. CL_NETWORK_ID ShortId;
  147. CLUSTER_NETWORK_STATE State;
  148. DWORD Flags;
  149. CLUSTER_NETWORK_ROLE Role;
  150. DWORD Priority;
  151. LPWSTR Transport;
  152. LPWSTR Address;
  153. LPWSTR AddressMask;
  154. LPWSTR Description;
  155. LPWSTR MulticastAddress;
  156. NM_MCAST_CONFIG ConfigType;
  157. PVOID EncryptedMulticastKey; // Encrypted by DP API
  158. DWORD EncryptedMulticastKeyLength; // Encrypted by DP API
  159. time_t MulticastLeaseObtained;
  160. time_t MulticastLeaseExpires;
  161. MCAST_CLIENT_UID MulticastLeaseRequestId;
  162. LPWSTR MulticastLeaseServer;
  163. DWORD MulticastKeyExpires;
  164. DWORD InterfaceCount;
  165. PNM_INTERFACE LocalInterface;
  166. PNM_CONNECTIVITY_VECTOR ConnectivityVector;
  167. PNM_CONNECTIVITY_MATRIX ConnectivityMatrix;
  168. PNM_STATE_WORK_VECTOR StateWorkVector;
  169. DWORD ConnectivityReportTimer;
  170. DWORD StateRecalcTimer;
  171. DWORD FailureIsolationTimer;
  172. DWORD RegistrationRetryTimer;
  173. DWORD RegistrationRetryTimeout;
  174. DWORD NameChangePendingTimer;
  175. DWORD McastAddressRenewTimer;
  176. DWORD McastAddressReleaseRetryTimer;
  177. DWORD McastAddressReconfigureRetryTimer;
  178. DWORD McastAddressRefreshRetryTimer;
  179. DWORD McastKeyRegenerateTimer;
  180. DWORD ConnectivityReportRetryCount;
  181. CLRTL_WORK_ITEM WorkItem;
  182. CLRTL_WORK_ITEM MadcapWorkItem;
  183. LIST_ENTRY McastAddressReleaseList;
  184. LIST_ENTRY InterfaceList;
  185. LIST_ENTRY InternalLinkage;
  186. } NM_NETWORK;
  187. #define NM_NETWORK_SIG 'ten'
  188. //
  189. // State flags
  190. //
  191. #define NM_FLAG_NET_WORKER_RUNNING 0x00000001
  192. #define NM_FLAG_NET_REGISTERED 0x00000002
  193. #define NM_FLAG_NET_MULTICAST_ENABLED 0x00000004
  194. #define NM_FLAG_NET_MADCAP_WORKER_RUNNING 0x00000008
  195. #define NM_FLAG_NET_REFRESH_MCAST_RUNNING 0x00000010
  196. #define NM_FLAG_NET_REFRESH_MCAST_ABORTING 0x00000020
  197. #define NM_FLAG_NET_NAME_CHANGE_PENDING 0x00000040
  198. //
  199. // Work Flags
  200. //
  201. #define NM_FLAG_NET_REPORT_LOCAL_IF_UP 0x00000100
  202. #define NM_FLAG_NET_REPORT_CONNECTIVITY 0x00000200
  203. #define NM_FLAG_NET_RECALC_STATE 0x00000400
  204. #define NM_FLAG_NET_ISOLATE_FAILURE 0x00000800
  205. #define NM_FLAG_NET_NEED_TO_REGISTER 0x00002000
  206. #define NM_FLAG_NET_REPORT_LOCAL_IF_FAILED 0x00004000
  207. #define NM_FLAG_NET_RENEW_MCAST_ADDRESS 0x00008000
  208. #define NM_FLAG_NET_RELEASE_MCAST_ADDRESS 0x00010000
  209. #define NM_FLAG_NET_RECONFIGURE_MCAST 0x00020000
  210. #define NM_FLAG_NET_REFRESH_MCAST 0x00040000
  211. #define NM_FLAG_NET_REGENERATE_MCAST_KEY 0x00080000
  212. #define NM_NET_WORK_FLAGS \
  213. (NM_FLAG_NET_ISOLATE_FAILURE | \
  214. NM_FLAG_NET_RECALC_STATE | \
  215. NM_FLAG_NET_NEED_TO_REGISTER | \
  216. NM_FLAG_NET_REFRESH_MCAST)
  217. #define NM_NET_IF_WORK_FLAGS \
  218. (NM_FLAG_NET_REPORT_LOCAL_IF_UP | \
  219. NM_FLAG_NET_REPORT_LOCAL_IF_FAILED)
  220. #define NM_NET_MADCAP_WORK_FLAGS \
  221. (NM_FLAG_NET_RENEW_MCAST_ADDRESS | \
  222. NM_FLAG_NET_RELEASE_MCAST_ADDRESS | \
  223. NM_FLAG_NET_RECONFIGURE_MCAST | \
  224. NM_FLAG_NET_REGENERATE_MCAST_KEY)
  225. #define NmpIsNetworkRegistered(_network) \
  226. ((_network)->Flags & NM_FLAG_NET_REGISTERED)
  227. #define NmpIsNetworkForInternalUse(_network) \
  228. ((_network)->Role & ClusterNetworkRoleInternalUse)
  229. #define NmpIsNetworkForClientAccess(_network) \
  230. ((_network)->Role & ClusterNetworkRoleClientAccess)
  231. #define NmpIsNetworkForInternalAndClientUse(_network) \
  232. ((_network)->Role == ClusterNetworkRoleInternalAndClient)
  233. #define NmpIsNetworkDisabledForUse(_network) \
  234. ((_network)->Role == ClusterNetworkRoleNone)
  235. #define NmpIsNetworkEnabledForUse(_network) \
  236. ((_network)->Role != ClusterNetworkRoleNone)
  237. #define NmpIsNetworkMulticastEnabled(_network) \
  238. ((_network)->Flags & NM_FLAG_NET_MULTICAST_ENABLED)
  239. #define NmpIsNetworkNameChangePending(_network) \
  240. ((_network)->Flags & NM_FLAG_NET_NAME_CHANGE_PENDING)
  241. //
  242. // Network deferred-work timers.
  243. //
  244. // The timer fires every 300ms. One heartbeat (HB) period is 1200ms.
  245. //
  246. // An interface is declared unreachable by ClusNet after two missed HBs.
  247. // On average, an interface will fail in the middle of a ClusNet HB period.
  248. // So, the avg time for ClusNet to detect and report an interface failure
  249. // is 600 + 2400 = 3000ms. The worst case is 1200 + 2400 = 3600ms.
  250. // The best case is 2400ms.
  251. //
  252. // If there are >2 nodes active on a network, it is desirable to
  253. // aggregate interface failure reports when an entire network fails;
  254. // however, we do not know how long it took for ClusNet to make the first
  255. // report. Thus, we assume that the first interface failure was detected
  256. // in the avg time and wait the for the worst case time before reporting.
  257. //
  258. // In the 2 node case, there is no aggregation to be performed so we report
  259. // failures immediately. We always report InterfaceUp and InterfaceFailed
  260. // events immediately. We also report immediately after a NodeDown event.
  261. //
  262. // State recalculation should be performed only after all nodes have reported
  263. // their connectivity changes after a failure. There is spread of 1200ms
  264. // between the best and worst case reporting times. Arbitrary scheduling and
  265. // communication delays can widen the spread even more in the worst case.
  266. // The best we can do is make a good guess. Once in a while, we will
  267. // recalculate too soon. This isn't a disaster since the state calculation
  268. // algorithm will abort if it has partial information. Further, we wait an
  269. // additional period before trying to isolate any connectivity failures that
  270. // were detected. We do this in order to avoid inducing unnecessary
  271. // cluster resource failures.
  272. //
  273. // Note that since we invalidate the connectivity vectors for dead nodes
  274. // after regroup, we only need to delay long enough for each of the nodes
  275. // to process the node down event and fire off a connectivity report.
  276. //
  277. #define NM_NET_CONNECTIVITY_REPORT_TIMEOUT 600 // 3600 - 3000
  278. #define NM_NET_STATE_RECALC_TIMEOUT 2400 // 3600 - 2400 + 1200
  279. #define NM_NET_STATE_RECALC_TIMEOUT_AFTER_REGROUP 900
  280. #define NM_NET_STATE_FAILURE_ISOLATION_TIMEOUT 3600
  281. #define NM_NET_STATE_FAILURE_ISOLATION_POLL 60000 // Change Default to 1 min after testing
  282. #define NM_NET_STATE_INTERFACE_FAILURE_TIMEOUT 3600
  283. #define NM_NET_NAME_CHANGE_PENDING_TIMEOUT 15 * 60 * 1000 // 15 minutes
  284. #define NM_NET_MULTICAST_KEY_REGEN_TIMEOUT (12 * 60 * 60 * 1000) // 12 hours
  285. #define NM_NET_MULTICAST_KEY_REGEN_TIMEOUT_WINDOW ( 4 * 60 * 60 * 1000) // 4 hours
  286. #define NM_NET_MULTICAST_RECONFIGURE_TIMEOUT (10 * 60 * 1000) // 10 minutes
  287. #define NmpIsNetworkWorkerRunning(_network) \
  288. ((_network)->Flags & NM_FLAG_NET_WORKER_RUNNING)
  289. #define NmpIsNetworkMadcapWorkerRunning(_network) \
  290. ((_network)->Flags & NM_FLAG_NET_MADCAP_WORKER_RUNNING)
  291. #define NM_CONNECTIVITY_REPORT_RETRY_LIMIT 20 // 10 seconds
  292. #define NM_NET_MIN_REGISTRATION_RETRY_TIMEOUT 500 // half a second
  293. #define NM_NET_MAX_REGISTRATION_RETRY_TIMEOUT (10*60*1000) // 10 minutes
  294. //
  295. // Network interface definitions
  296. //
  297. typedef struct _NM_INTERFACE {
  298. LIST_ENTRY Linkage;
  299. DWORD NetIndex;
  300. DWORD Flags;
  301. CLUSTER_NETINTERFACE_STATE State;
  302. PNM_NODE Node;
  303. PNM_NETWORK Network;
  304. LPWSTR AdapterName;
  305. LPWSTR AdapterId;
  306. LPWSTR Address;
  307. ULONG BinaryAddress;
  308. LPWSTR ClusnetEndpoint;
  309. LPWSTR Description;
  310. LIST_ENTRY NetworkLinkage;
  311. LIST_ENTRY NodeLinkage;
  312. } NM_INTERFACE;
  313. #define NM_INTERFACE_SIG ' fi'
  314. #define NM_FLAG_IF_REGISTERED 0x00000002
  315. #define NmpIsInterfaceRegistered(_interface) \
  316. ((_interface)->Flags & NM_FLAG_IF_REGISTERED)
  317. //
  318. // This structure is used to hook changes in the node leadership.
  319. //
  320. typedef struct _NM_LEADER_CHANGE_WAIT_ENTRY {
  321. LIST_ENTRY Linkage;
  322. HANDLE LeaderChangeEvent;
  323. } NM_LEADER_CHANGE_WAIT_ENTRY, *PNM_LEADER_CHANGE_WAIT_ENTRY;
  324. //
  325. // This structure is used for asynchronous network connectivity reports.
  326. //
  327. typedef struct _NM_CONNECTIVITY_REPORT_CONTEXT {
  328. NM_LEADER_CHANGE_WAIT_ENTRY LeaderChangeWaitEntry;
  329. HANDLE ConnectivityReportEvent;
  330. } NM_CONNECTIVITY_REPORT_CONTEXT, *PNM_CONNECTIVITY_REPORT_CONTEXT;
  331. // the fixup callback record stored by nm on behalf of other components to perform
  332. //form or join fixups.
  333. typedef struct _NM_FIXUP_CB_RECORD{
  334. NM_FIXUP_NOTIFYCB pfnFixupNotifyCb;
  335. DWORD dwFixupMask;
  336. }NM_FIXUP_CB_RECORD,*PNM_FIXUP_CB_RECORD;
  337. //the fixup callback functions for updating in-memory structure after
  338. //updatinbg the registry
  339. typedef DWORD (WINAPI *NM_POST_FIXUP_CB)(VOID);
  340. // fixup callback record used to pass argumnets to NmUpdatePerformFixups2
  341. // update type handler
  342. typedef struct _NM_FIXUP_CB_RECORD2{
  343. NM_FIXUP_NOTIFYCB pfnFixupNotifyCb; // pointer to fn that builds up the fixup property list
  344. DWORD dwFixupMask;
  345. PRESUTIL_PROPERTY_ITEM pPropertyTable; // Property table for this key
  346. } NM_FIXUP_CB_RECORD2,*PNM_FIXUP_CB_RECORD2;
  347. //
  348. // Global Data
  349. //
  350. extern CRITICAL_SECTION NmpLock;
  351. extern HANDLE NmpMutex;
  352. extern NM_STATE NmpState;
  353. extern DWORD NmpActiveThreadCount;
  354. extern HANDLE NmpShutdownEvent;
  355. extern LIST_ENTRY NmpNodeList;
  356. extern PNM_NODE * NmpIdArray;
  357. extern BOOLEAN NmpNodeCleanupOk;
  358. extern LIST_ENTRY NmpNetworkList;
  359. extern LIST_ENTRY NmpInternalNetworkList;
  360. extern LIST_ENTRY NmpDeletedNetworkList;
  361. extern DWORD NmpNetworkCount;
  362. extern DWORD NmpInternalNetworkCount;
  363. extern DWORD NmpClientNetworkCount;
  364. extern LIST_ENTRY NmpInterfaceList;
  365. extern LIST_ENTRY NmpDeletedInterfaceList;
  366. extern RESUTIL_PROPERTY_ITEM NmpNetworkProperties[];
  367. extern RESUTIL_PROPERTY_ITEM NmpInterfaceProperties[];
  368. extern CL_NODE_ID NmpJoinerNodeId;
  369. extern CL_NODE_ID NmpSponsorNodeId;
  370. extern DWORD NmpJoinTimer;
  371. extern BOOLEAN NmpJoinAbortPending;
  372. extern DWORD NmpJoinSequence;
  373. extern BOOLEAN NmpJoinerUp;
  374. extern BOOLEAN NmpJoinBeginInProgress;
  375. extern BOOLEAN NmpJoinerOutOfSynch;
  376. extern WCHAR NmpInvalidJoinerIdString[];
  377. extern WCHAR NmpUnknownString[];
  378. extern LPWSTR NmpClusnetEndpoint;
  379. extern NM_STATE NmpState;
  380. extern CL_NODE_ID NmpLeaderNodeId;
  381. extern BITSET NmpUpNodeSet;
  382. extern WCHAR NmpNullString[];
  383. extern CLUSTER_NETWORK_ROLE NmpDefaultNetworkRole;
  384. extern BOOL NmpCleanupIfJoinAborted;
  385. extern DWORD NmpAddNodeId;
  386. extern LIST_ENTRY NmpLeaderChangeWaitList;
  387. extern LIST_ENTRY * NmpIntraClusterRpcArr;
  388. extern CRITICAL_SECTION NmpRPCLock;
  389. extern BOOL NmpLastNodeEvicted;
  390. extern DWORD NmpNodeCount;
  391. extern BOOLEAN NmpIsNT5NodeInCluster;
  392. extern LPWSTR NmpClusterInstanceId;
  393. extern BOOLEAN NmpGumUpdateHandlerRegistered;
  394. #if DBG
  395. extern DWORD NmpRpcTimer;
  396. #endif //DBG
  397. //
  398. // Synchronization macros
  399. //
  400. #define NmpAcquireLock() EnterCriticalSection(&NmpLock)
  401. #define NmpReleaseLock() LeaveCriticalSection(&NmpLock)
  402. #define NmpAcquireMutex() \
  403. { \
  404. DWORD _status = WaitForSingleObject(NmpMutex, INFINITE); \
  405. CL_ASSERT(_status == WAIT_OBJECT_0); \
  406. } \
  407. #define NmpReleaseMutex() ReleaseMutex(NmpMutex);
  408. //
  409. // Node Intracluster RPC record/cancellation routines.
  410. // Useful to terminate outstanding RPCs to failed nodes.
  411. //
  412. #define NM_RPC_TIMEOUT 45000 // 45 secs
  413. typedef struct _NM_INTRACLUSTER_RPC_THREAD {
  414. LIST_ENTRY Linkage;
  415. BOOLEAN Cancelled;
  416. HANDLE Thread;
  417. DWORD ThreadId;
  418. }NM_INTRACLUSTER_RPC_THREAD, *PNM_INTRACLUSTER_RPC_THREAD;
  419. #define NmpAcquireRPCLock() EnterCriticalSection(&NmpRPCLock);
  420. #define NmpReleaseRPCLock() LeaveCriticalSection(&NmpRPCLock);
  421. VOID
  422. NmpTerminateRpcsToNode(
  423. DWORD NodeId
  424. );
  425. VOID
  426. NmpRpcTimerTick(
  427. DWORD MsTickInterval
  428. );
  429. //
  430. // IsolationPollTimerValue read routine
  431. //
  432. DWORD
  433. NmpGetIsolationPollTimerValue(
  434. VOID
  435. );
  436. //
  437. // Miscellaneous Routines
  438. //
  439. BOOLEAN
  440. NmpLockedEnterApi(
  441. NM_STATE RequiredState
  442. );
  443. BOOLEAN
  444. NmpEnterApi(
  445. NM_STATE RequiredState
  446. );
  447. VOID
  448. NmpLeaveApi(
  449. VOID
  450. );
  451. VOID
  452. NmpLockedLeaveApi(
  453. VOID
  454. );
  455. LPWSTR
  456. NmpLoadString(
  457. IN UINT StringId
  458. );
  459. VOID
  460. NmpDbgPrint(
  461. IN ULONG LogLevel,
  462. IN PCHAR FormatString,
  463. ...
  464. );
  465. DWORD
  466. NmpCleanseRegistry(
  467. IN LPCWSTR NodeId,
  468. IN HLOCALXSACTION Xaction
  469. );
  470. DWORD
  471. NmpQueryString(
  472. IN HDMKEY Key,
  473. IN LPCWSTR ValueName,
  474. IN DWORD ValueType,
  475. IN LPWSTR *StringBuffer,
  476. IN OUT LPDWORD StringBufferSize,
  477. OUT LPDWORD StringSize
  478. );
  479. BOOL
  480. NmpCleanseResTypeCallback(
  481. IN PNM_EVICTION_CONTEXT Context,
  482. IN PVOID Context2,
  483. IN PFM_RESTYPE pResType,
  484. IN LPCWSTR pszResTypeName
  485. );
  486. BOOL
  487. NmpCleanseResourceCallback(
  488. IN PNM_EVICTION_CONTEXT Context,
  489. IN PVOID Context2,
  490. IN PFM_RESOURCE Resource,
  491. IN LPCWSTR ResourceName
  492. );
  493. BOOL
  494. NmpCleanseGroupCallback(
  495. IN PNM_EVICTION_CONTEXT Context,
  496. IN PVOID Context2,
  497. IN PFM_GROUP Group,
  498. IN LPCWSTR GroupName
  499. );
  500. VOID
  501. NmpIssueClusterPropertyChangeEvent(
  502. VOID
  503. );
  504. DWORD
  505. NmpMarshallObjectInfo(
  506. IN const PRESUTIL_PROPERTY_ITEM PropertyTable,
  507. IN PVOID ObjectInfo,
  508. OUT PVOID * PropertyList,
  509. OUT LPDWORD PropertyListSize
  510. );
  511. BOOLEAN
  512. NmpVerifyNodeConnectivity(
  513. PNM_NODE Node1,
  514. PNM_NODE Node2,
  515. PNM_NETWORK ExcludedNetwork
  516. );
  517. BOOLEAN
  518. NmpVerifyConnectivity(
  519. PNM_NETWORK ExcludedNetwork
  520. );
  521. BOOLEAN
  522. NmpVerifyJoinerConnectivity(
  523. IN PNM_NODE JoiningNode,
  524. OUT PNM_NODE * UnreachableNode
  525. );
  526. DWORD
  527. NmpCreateClusterInstanceId(
  528. VOID
  529. );
  530. DWORD
  531. NmpSetLsaProcessOptions(
  532. IN ULONG ProcessOptions
  533. );
  534. DWORD
  535. NmpGetMulticastKeyFromNMLeader(
  536. IN DWORD LeaderNodeId,
  537. IN LPWSTR NodeIdString,
  538. IN LPWSTR NetworkId,
  539. IN PNM_NETWORK_MULTICASTKEY * MulticastKey
  540. );
  541. DWORD
  542. NmpCreateRandomNumber(OUT PVOID * RandonNumber,
  543. IN DWORD RandonNumberSize
  544. );
  545. //
  546. // Node Management Routines
  547. //
  548. DWORD
  549. NmpInitNodes(
  550. VOID
  551. );
  552. VOID
  553. NmpCleanupNodes(
  554. VOID
  555. );
  556. DWORD
  557. NmpGetNodeDefinition(
  558. IN OUT PNM_NODE_INFO2 NodeInfo
  559. );
  560. DWORD
  561. NmpEnumNodeDefinitions(
  562. PNM_NODE_ENUM2 * NodeEnum
  563. );
  564. DWORD
  565. NmpCreateNodeObjects(
  566. IN PNM_NODE_ENUM2 NodeEnum2
  567. );
  568. DWORD NmpRefreshNodeObjects(
  569. );
  570. DWORD
  571. NmpCreateLocalNodeObject(
  572. IN PNM_NODE_INFO2 NodeInfo2
  573. );
  574. PNM_NODE
  575. NmpCreateNodeObject(
  576. IN PNM_NODE_INFO2 NodeInfo
  577. );
  578. DWORD
  579. NmpGetNodeObjectInfo(
  580. IN PNM_NODE Node,
  581. IN OUT PNM_NODE_INFO2 NodeInfo
  582. );
  583. VOID
  584. NmpDeleteNodeObject(
  585. IN PNM_NODE Node,
  586. IN BOOLEAN IssueEvent
  587. );
  588. BOOL
  589. NmpDestroyNodeObject(
  590. PNM_NODE Node
  591. );
  592. DWORD
  593. NmpEnumNodeObjects(
  594. PNM_NODE_ENUM2 * NodeEnum
  595. );
  596. VOID
  597. NmpNodeFailureHandler(
  598. CL_NODE_ID NodeId,
  599. LPVOID NodeFailureContext
  600. );
  601. DWORD
  602. NmpSetNodeInterfacePriority(
  603. IN PNM_NODE Node,
  604. IN DWORD Priority,
  605. IN PNM_INTERFACE TargetInterface OPTIONAL,
  606. IN DWORD TargetInterfacePriority OPTIONAL
  607. );
  608. DWORD
  609. NmpEnumNodeObjects(
  610. PNM_NODE_ENUM2 * NodeEnum2
  611. );
  612. DWORD
  613. NmpAddNode(
  614. IN LPCWSTR NewNodeName,
  615. IN DWORD NewNodeHighestVersion,
  616. IN DWORD NewNodeLowestVersion,
  617. IN DWORD NewNodeProductSuite,
  618. IN DWORD RegistryNodeLimit
  619. );
  620. BOOLEAN
  621. NmpIsAddNodeAllowed(
  622. IN DWORD NewNodeProductSuite,
  623. IN DWORD RegistryNodeLimit,
  624. OUT LPDWORD EffectiveNodeLimit OPTIONAL
  625. );
  626. VOID
  627. NmpAdviseNodeFailure(
  628. IN PNM_NODE Node,
  629. IN DWORD ErrorCode
  630. );
  631. //
  632. // PnP Management Routines
  633. //
  634. DWORD
  635. NmpInitializePnp(
  636. VOID
  637. );
  638. VOID
  639. NmpShutdownPnp(
  640. VOID
  641. );
  642. VOID
  643. NmpCleanupPnp(
  644. VOID
  645. );
  646. VOID
  647. NmpWatchForPnpEvents(
  648. VOID
  649. );
  650. DWORD
  651. NmpEnablePnpEvents(
  652. VOID
  653. );
  654. DWORD
  655. NmpPostPnpNotification(
  656. BOOLEAN IsPnpLockHeld
  657. );
  658. DWORD
  659. NmpConfigureNetworks(
  660. IN RPC_BINDING_HANDLE JoinSponsorBinding,
  661. IN LPWSTR LocalNodeId,
  662. IN LPWSTR LocalNodeName,
  663. IN PNM_NETWORK_ENUM * NetworkEnum,
  664. IN PNM_INTERFACE_ENUM2 * InterfaceEnum,
  665. IN LPWSTR DefaultEndpoint,
  666. IN OUT LPDWORD MatchedNetworkCount,
  667. IN OUT LPDWORD NewNetworkCount,
  668. IN BOOL RenameConnectoids
  669. );
  670. //
  671. // Network Management Routines
  672. //
  673. DWORD
  674. NmpInitializeNetworks(
  675. VOID
  676. );
  677. VOID
  678. NmpCleanupNetworks(
  679. VOID
  680. );
  681. DWORD
  682. NmpSetNetworkRole(
  683. PNM_NETWORK Network,
  684. CLUSTER_NETWORK_ROLE NewRole,
  685. HLOCALXSACTION Xaction,
  686. HDMKEY NetworkKey
  687. );
  688. DWORD
  689. NmpCreateNetwork(
  690. IN RPC_BINDING_HANDLE JoinSponsorBinding,
  691. IN PNM_NETWORK_INFO NetworkInfo,
  692. IN PNM_INTERFACE_INFO2 InterfaceInfo
  693. );
  694. DWORD
  695. NmpGlobalCreateNetwork(
  696. IN PNM_NETWORK_INFO NetworkInfo,
  697. IN PNM_INTERFACE_INFO2 InterfaceInfo
  698. );
  699. DWORD
  700. NmpCreateNetworkDefinition(
  701. IN PNM_NETWORK_INFO NetworkInfo,
  702. IN HLOCALXSACTION Xaction
  703. );
  704. DWORD
  705. NmpSetNetworkNameDefinition(
  706. IN PNM_NETWORK_INFO NetworkInfo,
  707. IN HLOCALXSACTION Xaction
  708. );
  709. DWORD
  710. NmpGetNetworkDefinition(
  711. IN LPWSTR NetworkId,
  712. OUT PNM_NETWORK_INFO NetworkInfo
  713. );
  714. DWORD
  715. NmpEnumNetworkDefinitions(
  716. OUT PNM_NETWORK_ENUM * NetworkEnum
  717. );
  718. DWORD
  719. NmpCreateNetworkObjects(
  720. IN PNM_NETWORK_ENUM NetworkEnum
  721. );
  722. PNM_NETWORK
  723. NmpCreateNetworkObject(
  724. IN PNM_NETWORK_INFO NetworkInfo
  725. );
  726. DWORD
  727. NmpGetNetworkObjectInfo(
  728. IN PNM_NETWORK Network,
  729. OUT PNM_NETWORK_INFO NetworkInfo
  730. );
  731. VOID
  732. NmpDeleteNetworkObject(
  733. IN PNM_NETWORK Network,
  734. IN BOOLEAN IssueEvent
  735. );
  736. BOOL
  737. NmpDestroyNetworkObject(
  738. PNM_NETWORK Network
  739. );
  740. DWORD
  741. NmpEnumNetworkObjects(
  742. OUT PNM_NETWORK_ENUM * NetworkEnum
  743. );
  744. DWORD
  745. NmpRegisterNetwork(
  746. IN PNM_NETWORK Network,
  747. IN BOOLEAN RetryOnFailure
  748. );
  749. VOID
  750. NmpDeregisterNetwork(
  751. IN PNM_NETWORK Network
  752. );
  753. VOID
  754. NmpInsertInternalNetwork(
  755. PNM_NETWORK Network
  756. );
  757. DWORD
  758. NmpValidateNetworkRoleChange(
  759. PNM_NETWORK Network,
  760. CLUSTER_NETWORK_ROLE NewRole
  761. );
  762. DWORD
  763. NmpNetworkValidateCommonProperties(
  764. IN PNM_NETWORK Network,
  765. IN PVOID InBuffer,
  766. IN DWORD InBufferSize,
  767. OUT PNM_NETWORK_INFO NetworkInfo OPTIONAL
  768. );
  769. DWORD
  770. NmpSetNetworkName(
  771. IN PNM_NETWORK_INFO NetworkInfo
  772. );
  773. DWORD
  774. NmpGlobalSetNetworkName(
  775. IN PNM_NETWORK_INFO NetworkInfo
  776. );
  777. VOID
  778. NmpRecomputeNT5NetworkAndInterfaceStates(
  779. VOID
  780. );
  781. BOOLEAN
  782. NmpComputeNetworkAndInterfaceStates(
  783. PNM_NETWORK Network,
  784. BOOLEAN IsolateFailure,
  785. CLUSTER_NETWORK_STATE * NewNetworkState
  786. );
  787. VOID
  788. NmpStartNetworkConnectivityReportTimer(
  789. PNM_NETWORK Network
  790. );
  791. VOID
  792. NmpStartNetworkStateRecalcTimer(
  793. PNM_NETWORK Network,
  794. DWORD Timeout
  795. );
  796. VOID
  797. NmpStartNetworkFailureIsolationTimer(
  798. PNM_NETWORK Network,
  799. DWORD Timeout
  800. );
  801. VOID
  802. NmpStartNetworkRegistrationRetryTimer(
  803. PNM_NETWORK Network
  804. );
  805. VOID
  806. NmpStartNetworkNameChangePendingTimer(
  807. IN PNM_NETWORK Network,
  808. IN DWORD Timeout
  809. );
  810. VOID
  811. NmpScheduleNetworkConnectivityReport(
  812. PNM_NETWORK Network
  813. );
  814. VOID
  815. NmpScheduleNetworkStateRecalc(
  816. PNM_NETWORK Network
  817. );
  818. VOID
  819. NmpScheduleNetworkRegistration(
  820. PNM_NETWORK Network
  821. );
  822. DWORD
  823. NmpScheduleConnectivityReportWorker(
  824. VOID
  825. );
  826. DWORD
  827. NmpScheduleNetworkWorker(
  828. PNM_NETWORK Network
  829. );
  830. VOID
  831. NmpConnectivityReportWorker(
  832. IN PCLRTL_WORK_ITEM WorkItem,
  833. IN DWORD Status,
  834. IN DWORD BytesTransferred,
  835. IN ULONG_PTR IoContext
  836. );
  837. VOID
  838. NmpNetworkWorker(
  839. IN PCLRTL_WORK_ITEM WorkItem,
  840. IN DWORD Status,
  841. IN DWORD BytesTransferred,
  842. IN ULONG_PTR IoContext
  843. );
  844. VOID
  845. NmpNetworkTimerTick(
  846. IN DWORD MsTickInterval
  847. );
  848. VOID
  849. NmpSetNetworkAndInterfaceStates(
  850. IN PNM_NETWORK Network,
  851. IN CLUSTER_NETWORK_STATE NewNetworkState,
  852. IN PNM_STATE_ENTRY InterfaceStateVector,
  853. IN DWORD VectorSize
  854. );
  855. VOID
  856. NmpUpdateNetworkConnectivityForDownNode(
  857. PNM_NODE Node
  858. );
  859. DWORD
  860. NmpEnumNetworkObjectStates(
  861. OUT PNM_NETWORK_STATE_ENUM * NetworkStateEnum
  862. );
  863. DWORD NmpGetNetworkMulticastKey(
  864. IN LPWSTR NetworkId,
  865. OUT PNM_NETWORK_MULTICASTKEY * NetworkMulticastKey
  866. );
  867. VOID
  868. NmpFreeNetworkStateEnum(
  869. PNM_NETWORK_STATE_ENUM NetworkStateEnum
  870. );
  871. DWORD
  872. NmpReportNetworkConnectivity(
  873. IN PNM_NETWORK Network
  874. );
  875. DWORD
  876. NmpGlobalSetNetworkAndInterfaceStates(
  877. PNM_NETWORK Network,
  878. CLUSTER_NETWORK_STATE NewNetworkState
  879. );
  880. VOID
  881. NmpReferenceNetwork(
  882. PNM_NETWORK Network
  883. );
  884. VOID
  885. NmpDereferenceNetwork(
  886. PNM_NETWORK Network
  887. );
  888. PNM_NETWORK
  889. NmpReferenceNetworkByAddress(
  890. LPWSTR NetworkAddress,
  891. LPWSTR NetworkMask
  892. );
  893. PNM_NETWORK
  894. NmpReferenceNetworkByRemoteAddress(
  895. LPWSTR RemoteAddress
  896. );
  897. DWORD
  898. NmpEnumInternalNetworks(
  899. OUT LPDWORD NetworkCount,
  900. OUT PNM_NETWORK * NetworkList[]
  901. );
  902. DWORD
  903. NmpSetNetworkPriorityOrder(
  904. IN DWORD NetworkCount,
  905. IN PNM_NETWORK * NetworkList,
  906. IN HLOCALXSACTION Xaction
  907. );
  908. DWORD
  909. NmpGetNetworkInterfaceFailureTimerValue(
  910. IN LPCWSTR NetworkId
  911. );
  912. BOOLEAN
  913. NmpCheckForNetwork(
  914. VOID
  915. );
  916. //
  917. // Network Multicast Management Routines
  918. //
  919. typedef enum {
  920. NmStartMulticastForm = 0,
  921. NmStartMulticastJoin,
  922. NmStartMulticastDynamic
  923. } NM_START_MULTICAST_MODE, *PNM_START_MULTICAST_MODE;
  924. VOID
  925. NmpMulticastInitialize(
  926. VOID
  927. );
  928. DWORD
  929. NmpMulticastCleanup(
  930. VOID
  931. );
  932. DWORD
  933. NmpStartMulticast(
  934. IN OPTIONAL PNM_NETWORK Network,
  935. IN NM_START_MULTICAST_MODE Mode
  936. );
  937. DWORD
  938. NmpStopMulticast(
  939. IN OPTIONAL PNM_NETWORK Network
  940. );
  941. VOID
  942. NmpMulticastProcessClusterVersionChange(
  943. VOID
  944. );
  945. DWORD
  946. NmpMulticastValidatePrivateProperties(
  947. IN PNM_NETWORK Network,
  948. IN HDMKEY RegistryKey,
  949. IN PVOID InBuffer,
  950. IN DWORD InBufferSize
  951. );
  952. VOID
  953. NmpScheduleMulticastAddressRenewal(
  954. PNM_NETWORK Network
  955. );
  956. VOID
  957. NmpScheduleMulticastAddressRelease(
  958. PNM_NETWORK Network
  959. );
  960. VOID
  961. NmpScheduleMulticastRefresh(
  962. IN PNM_NETWORK Network
  963. );
  964. VOID
  965. NmpScheduleMulticastKeyRegeneration(
  966. PNM_NETWORK Network
  967. );
  968. DWORD
  969. NmpRefreshMulticastConfiguration(
  970. IN PNM_NETWORK Network
  971. );
  972. VOID
  973. NmpFreeMulticastAddressReleaseList(
  974. IN PNM_NETWORK Network
  975. );
  976. DWORD
  977. NmpMulticastManualConfigChange(
  978. IN PNM_NETWORK Network,
  979. IN HDMKEY NetworkKey,
  980. IN HDMKEY NetworkParametersKey,
  981. IN PVOID InBuffer,
  982. IN DWORD InBufferSize,
  983. OUT BOOLEAN * SetProperties
  984. );
  985. DWORD
  986. NmpUpdateSetNetworkMulticastConfiguration(
  987. IN BOOL SourceNode,
  988. IN LPWSTR NetworkId,
  989. IN PVOID UpdateBuffer,
  990. IN PVOID PropBuffer,
  991. IN LPDWORD PropBufferSize
  992. );
  993. //
  994. // Interface Management Routines
  995. //
  996. DWORD
  997. NmpInitializeInterfaces(
  998. VOID
  999. );
  1000. VOID
  1001. NmpCleanupInterfaces(
  1002. VOID
  1003. );
  1004. DWORD
  1005. NmpCreateInterface(
  1006. IN RPC_BINDING_HANDLE JoinSponsorBinding,
  1007. IN PNM_INTERFACE_INFO2 InterfaceInfo
  1008. );
  1009. DWORD
  1010. NmpGlobalCreateInterface(
  1011. IN PNM_INTERFACE_INFO2 InterfaceInfo
  1012. );
  1013. DWORD
  1014. NmpSetInterfaceInfo(
  1015. IN RPC_BINDING_HANDLE JoinSponsorBinding,
  1016. IN PNM_INTERFACE_INFO2 InterfaceInfo
  1017. );
  1018. DWORD
  1019. NmpLocalSetInterfaceInfo(
  1020. IN PNM_INTERFACE Interface,
  1021. IN PNM_INTERFACE_INFO2 InterfaceInfo,
  1022. IN HLOCALXSACTION Xaction
  1023. );
  1024. DWORD
  1025. NmpGlobalSetInterfaceInfo(
  1026. IN PNM_INTERFACE_INFO2 InterfaceInfo
  1027. );
  1028. DWORD
  1029. NmpDeleteInterface(
  1030. IN RPC_BINDING_HANDLE JoinSponsorBinding,
  1031. IN LPWSTR InterfaceId,
  1032. IN LPWSTR NetworkId,
  1033. IN OUT PBOOLEAN NetworkDeleted
  1034. );
  1035. DWORD
  1036. NmpGlobalDeleteInterface(
  1037. IN LPWSTR InterfaceId,
  1038. IN OUT PBOOLEAN NetworkDeleted
  1039. );
  1040. DWORD
  1041. NmpInterfaceValidateCommonProperties(
  1042. IN PNM_INTERFACE Interface,
  1043. IN PVOID InBuffer,
  1044. IN DWORD InBufferSize,
  1045. OUT PNM_INTERFACE_INFO2 InterfaceInfo OPTIONAL
  1046. );
  1047. DWORD
  1048. NmpCreateInterfaceDefinition(
  1049. IN PNM_INTERFACE_INFO2 InterfaceInfo,
  1050. IN HLOCALXSACTION Xaction
  1051. );
  1052. DWORD
  1053. NmpGetInterfaceDefinition(
  1054. IN LPWSTR InterfaceId,
  1055. OUT PNM_INTERFACE_INFO2 InterfaceInfo
  1056. );
  1057. DWORD
  1058. NmpSetInterfaceDefinition(
  1059. IN PNM_INTERFACE_INFO2 InterfaceInfo,
  1060. IN HLOCALXSACTION Xaction
  1061. );
  1062. DWORD
  1063. NmpEnumInterfaceDefinitions(
  1064. OUT PNM_INTERFACE_ENUM2 * InterfaceEnum
  1065. );
  1066. DWORD
  1067. NmpCreateInterfaceObjects(
  1068. IN PNM_INTERFACE_ENUM2 InterfaceEnum
  1069. );
  1070. PNM_INTERFACE
  1071. NmpCreateInterfaceObject(
  1072. IN PNM_INTERFACE_INFO2 InterfaceInfo,
  1073. IN BOOLEAN RetryOnFailure
  1074. );
  1075. DWORD
  1076. NmpGetInterfaceObjectInfo1(
  1077. IN PNM_INTERFACE Interface,
  1078. IN OUT PNM_INTERFACE_INFO InterfaceInfo1
  1079. );
  1080. DWORD
  1081. NmpGetInterfaceObjectInfo(
  1082. IN PNM_INTERFACE Interface,
  1083. IN OUT PNM_INTERFACE_INFO2 InterfaceInfo
  1084. );
  1085. VOID
  1086. NmpDeleteInterfaceObject(
  1087. IN PNM_INTERFACE Interface,
  1088. IN BOOLEAN IssueEvent
  1089. );
  1090. BOOL
  1091. NmpDestroyInterfaceObject(
  1092. PNM_INTERFACE Interface
  1093. );
  1094. DWORD
  1095. NmpEnumInterfaceObjects1(
  1096. OUT PNM_INTERFACE_ENUM * InterfaceEnum1
  1097. );
  1098. DWORD
  1099. NmpEnumInterfaceObjects(
  1100. OUT PNM_INTERFACE_ENUM2 * InterfaceEnum
  1101. );
  1102. DWORD
  1103. NmpRegisterInterface(
  1104. IN PNM_INTERFACE Interface,
  1105. IN BOOLEAN RetryOnFailure
  1106. );
  1107. VOID
  1108. NmpDeregisterInterface(
  1109. IN PNM_INTERFACE Interface
  1110. );
  1111. DWORD
  1112. NmpPrepareToCreateInterface(
  1113. IN PNM_INTERFACE_INFO2 InterfaceInfo,
  1114. OUT PNM_NETWORK * Network,
  1115. OUT PNM_NODE * Node
  1116. );
  1117. PNM_INTERFACE
  1118. NmpGetInterfaceForNodeAndNetworkById(
  1119. IN CL_NODE_ID NodeId,
  1120. IN CL_NETWORK_ID NetworkId
  1121. );
  1122. VOID
  1123. NmpFreeInterfaceStateEnum(
  1124. PNM_INTERFACE_STATE_ENUM InterfaceStateEnum
  1125. );
  1126. DWORD
  1127. NmpEnumInterfaceObjectStates(
  1128. OUT PNM_INTERFACE_STATE_ENUM * InterfaceStateEnum
  1129. );
  1130. VOID
  1131. NmpProcessLocalInterfaceStateEvent(
  1132. IN PNM_INTERFACE Interface,
  1133. IN CLUSTER_NETINTERFACE_STATE NewState
  1134. );
  1135. DWORD
  1136. NmpReportInterfaceConnectivity(
  1137. IN RPC_BINDING_HANDLE RpcBinding,
  1138. IN LPWSTR InterfaceId,
  1139. IN PNM_CONNECTIVITY_VECTOR ConnectivityVector,
  1140. IN LPWSTR NetworkId
  1141. );
  1142. VOID
  1143. NmpProcessInterfaceConnectivityReport(
  1144. IN PNM_INTERFACE SourceInterface,
  1145. IN PNM_CONNECTIVITY_VECTOR ConnectivityVector
  1146. );
  1147. DWORD
  1148. NmpInterfaceCheckThread(
  1149. LPDWORD Context
  1150. );
  1151. VOID
  1152. NmpReportLocalInterfaceStateEvent(
  1153. IN CL_NODE_ID NodeId,
  1154. IN CL_NETWORK_ID NetworkId,
  1155. IN DWORD NewState
  1156. );
  1157. DWORD
  1158. NmpConvertPropertyListToInterfaceInfo(
  1159. IN PVOID InterfacePropertyList,
  1160. IN DWORD InterfacePropertyListSize,
  1161. PNM_INTERFACE_INFO2 InterfaceInfo
  1162. );
  1163. VOID
  1164. NmpSetInterfaceConnectivityData(
  1165. PNM_NETWORK Network,
  1166. DWORD InterfaceNetIndex,
  1167. CLUSTER_NETINTERFACE_STATE State
  1168. );
  1169. DWORD
  1170. NmpTestInterfaceConnectivity(
  1171. PNM_INTERFACE Interface1,
  1172. PBOOLEAN Interface1HasConnectivity,
  1173. PNM_INTERFACE Interface2,
  1174. PBOOLEAN Interfacet2HasConnectivity
  1175. );
  1176. DWORD
  1177. NmpBuildInterfaceOnlineAddressEnum(
  1178. PNM_INTERFACE Interface,
  1179. PNM_ADDRESS_ENUM * OnlineAddressEnum
  1180. );
  1181. DWORD
  1182. NmpBuildInterfacePingAddressEnum(
  1183. PNM_INTERFACE Interface,
  1184. PNM_ADDRESS_ENUM OnlineAddressEnum,
  1185. PNM_ADDRESS_ENUM * PingAddressEnum
  1186. );
  1187. BOOLEAN
  1188. NmpVerifyLocalInterfaceConnected(
  1189. IN PNM_INTERFACE Interface
  1190. );
  1191. //
  1192. // Membership Management Routines
  1193. //
  1194. DWORD
  1195. NmpMembershipInit(
  1196. VOID
  1197. );
  1198. VOID
  1199. NmpMembershipShutdown(
  1200. VOID
  1201. );
  1202. VOID
  1203. NmpMarkNodeUp(
  1204. CL_NODE_ID NodeId
  1205. );
  1206. VOID
  1207. NmpNodeUpEventHandler(
  1208. IN PNM_NODE Node
  1209. );
  1210. VOID
  1211. NmpNodeDownEventHandler(
  1212. IN PNM_NODE Node
  1213. );
  1214. DWORD
  1215. NmpMultiNodeDownEventHandler(
  1216. IN BITSET DownedNodeSet
  1217. );
  1218. DWORD
  1219. NmpNodeChange(
  1220. DWORD NodeId,
  1221. NODESTATUS newstatus
  1222. );
  1223. BOOL
  1224. NmpCheckQuorumEventHandler(
  1225. VOID
  1226. );
  1227. VOID
  1228. NmpHoldIoEventHandler(
  1229. VOID
  1230. );
  1231. VOID
  1232. NmpResumeIoEventHandler(
  1233. VOID
  1234. );
  1235. VOID
  1236. NmpHaltEventHandler(
  1237. IN DWORD HaltCode
  1238. );
  1239. VOID
  1240. NmpJoinAbort(
  1241. DWORD AbortStatus,
  1242. PNM_NODE JoinerNode
  1243. );
  1244. //
  1245. // Routines for joining nodes to a cluster
  1246. //
  1247. DWORD
  1248. NmpCreateJoinerRpcBindings(
  1249. IN PNM_NODE JoinerNode,
  1250. IN PNM_INTERFACE JoinerInterface
  1251. );
  1252. //
  1253. // Gum update message types.
  1254. //
  1255. // The first entries in this list are auto-marshalled through Gum...Ex.
  1256. // Any updates that are not auto-marshalled must come after NmUpdateMaxAuto
  1257. //
  1258. typedef enum {
  1259. NmUpdateCreateNode = 0,
  1260. NmUpdatePauseNode,
  1261. NmUpdateResumeNode,
  1262. NmUpdateEvictNode,
  1263. NmUpdateCreateNetwork,
  1264. NmUpdateSetNetworkName,
  1265. NmUpdateSetNetworkPriorityOrder,
  1266. NmUpdateSetNetworkCommonProperties,
  1267. NmUpdateCreateInterface,
  1268. NmUpdateSetInterfaceInfo,
  1269. NmUpdateSetInterfaceCommonProperties,
  1270. NmUpdateDeleteInterface,
  1271. NmUpdateJoinBegin,
  1272. NmUpdateJoinAbort,
  1273. //
  1274. // Version 2 (NT 5.0) extensions that are understood by
  1275. // NT4 SP4 4.
  1276. //
  1277. NmUpdateJoinBegin2,
  1278. NmUpdateSetNetworkAndInterfaceStates,
  1279. NmUpdatePerformFixups,
  1280. NmUpdatePerformFixups2,
  1281. //
  1282. // Version 2 (NT 5.0) extensions that are not understood
  1283. // by NT4 SP4. These may not be issued in a mixed NT4/NT5 cluster.
  1284. //
  1285. NmUpdateAddNode,
  1286. NmUpdateExtendedNodeState,
  1287. //
  1288. // NT 5.1 extensions that are not understood by NT5 and
  1289. // earlier. NT5 nodes will ignore these updates without
  1290. // error.
  1291. //
  1292. NmUpdateSetNetworkMulticastConfiguration,
  1293. NmUpdateSetServiceAccountPassword,
  1294. //
  1295. // Max handled automatically by GUM
  1296. //
  1297. NmUpdateMaxAuto = 0x10000,
  1298. NmUpdateJoinComplete,
  1299. NmUpdateMaximum
  1300. } NM_GUM_MESSAGE_TYPES;
  1301. #pragma warning( disable: 4200 )
  1302. typedef struct _NM_JOIN_UPDATE {
  1303. DWORD JoinSequence;
  1304. DWORD IsPaused;
  1305. WCHAR NodeId[0];
  1306. } NM_JOIN_UPDATE, *PNM_JOIN_UPDATE;
  1307. #pragma warning( default: 4200 )
  1308. DWORD
  1309. NmpGumUpdateHandler(
  1310. IN DWORD Context,
  1311. IN BOOL SourceNode,
  1312. IN DWORD BufferLength,
  1313. IN PVOID Buffer
  1314. );
  1315. DWORD
  1316. NmpUpdateAddNode(
  1317. IN BOOL SourceNode,
  1318. IN LPDWORD NewNodeId,
  1319. IN LPCWSTR NewNodeName,
  1320. IN LPDWORD NewNodeHighestVersion,
  1321. IN LPDWORD NewNodeLowestVersion,
  1322. IN LPDWORD NewNodeProductSuite
  1323. );
  1324. DWORD
  1325. NmpUpdateCreateNode(
  1326. IN BOOL SourceNode,
  1327. IN LPDWORD NodeId
  1328. );
  1329. DWORD
  1330. NmpUpdatePauseNode(
  1331. IN BOOL SourceNode,
  1332. IN LPWSTR NodeName
  1333. );
  1334. DWORD
  1335. NmpUpdateResumeNode(
  1336. IN BOOL SourceNode,
  1337. IN LPWSTR NodeName
  1338. );
  1339. DWORD
  1340. NmpUpdateEvictNode(
  1341. IN BOOL SourceNode,
  1342. IN LPWSTR NodeName
  1343. );
  1344. DWORD
  1345. NmpUpdateSetServiceAccountPassword(
  1346. IN BOOL SourceNode,
  1347. IN LPWSTR DomainName,
  1348. IN LPWSTR AccountName,
  1349. IN LPBYTE NewPassword,
  1350. IN LPDWORD NewPasswordLen,
  1351. IN LPBYTE SaltBuf,
  1352. IN LPDWORD SaltBufLen,
  1353. IN LPBYTE MACData,
  1354. IN LPDWORD MACDataLen
  1355. );
  1356. DWORD
  1357. NmpUpdateCreateNetwork(
  1358. IN BOOL IsSourceNode,
  1359. IN PVOID NetworkPropertyList,
  1360. IN LPDWORD NetworkPropertyListSize,
  1361. IN PVOID InterfacePropertyList,
  1362. IN LPDWORD InterfacePropertyListSize
  1363. );
  1364. DWORD
  1365. NmpUpdateSetNetworkName(
  1366. IN BOOL IsSourceNode,
  1367. IN LPWSTR NetworkId,
  1368. IN LPWSTR Name
  1369. );
  1370. DWORD
  1371. NmpUpdateSetNetworkPriorityOrder(
  1372. IN BOOL IsSourceNode,
  1373. IN LPCWSTR NetworkIdList
  1374. );
  1375. DWORD
  1376. NmpUpdateSetNetworkCommonProperties(
  1377. IN BOOL IsSourceNode,
  1378. IN LPWSTR NetworkId,
  1379. IN UCHAR * PropertyList,
  1380. IN LPDWORD PropertyListLength
  1381. );
  1382. DWORD
  1383. NmpUpdateCreateInterface(
  1384. IN BOOL IsSourceNode,
  1385. IN PVOID InterfacePropertyList,
  1386. IN LPDWORD InterfacePropertyListSize
  1387. );
  1388. DWORD
  1389. NmpUpdateSetInterfaceInfo(
  1390. IN BOOL SourceNode,
  1391. IN PVOID InterfacePropertyList,
  1392. IN LPDWORD InterfacePropertyListSize
  1393. );
  1394. DWORD
  1395. NmpUpdateSetInterfaceCommonProperties(
  1396. IN BOOL IsSourceNode,
  1397. IN LPWSTR InterfaceId,
  1398. IN UCHAR * PropertyList,
  1399. IN LPDWORD PropertyListLength
  1400. );
  1401. DWORD
  1402. NmpUpdateDeleteInterface(
  1403. IN BOOL IsSourceNode,
  1404. IN LPWSTR InterfaceId
  1405. );
  1406. DWORD
  1407. NmpUpdateJoinBegin(
  1408. IN BOOL SourceNode,
  1409. IN LPWSTR JoinerNodeId,
  1410. IN LPWSTR JoinerNodeName,
  1411. IN LPWSTR SponsorNodeId
  1412. );
  1413. DWORD
  1414. NmpUpdateJoinComplete(
  1415. IN PNM_JOIN_UPDATE JoinUpdate
  1416. );
  1417. DWORD
  1418. NmpUpdateJoinAbort(
  1419. IN BOOL SourceNode,
  1420. IN LPDWORD JoinSequence,
  1421. IN LPWSTR JoinerNodeId
  1422. );
  1423. DWORD
  1424. NmpUpdateJoinBegin2(
  1425. IN BOOL SourceNode,
  1426. IN LPWSTR JoinerNodeId,
  1427. IN LPWSTR JoinerNodeName,
  1428. IN LPWSTR SponsorNodeId,
  1429. IN LPDWORD JoinerHighestVersion,
  1430. IN LPDWORD JoinerLowestVersion
  1431. );
  1432. DWORD
  1433. NmpUpdateSetNetworkAndInterfaceStates(
  1434. IN BOOL IsSourceNode,
  1435. IN LPWSTR NetworkId,
  1436. IN CLUSTER_NETWORK_STATE * NewNetworkState,
  1437. IN PNM_STATE_ENTRY InterfaceStateVector,
  1438. IN LPDWORD InterfaceStateVectorSize
  1439. );
  1440. DWORD
  1441. NmpDoInterfacePing(
  1442. IN PNM_INTERFACE Interface,
  1443. IN PNM_ADDRESS_ENUM PingAddressEnum,
  1444. OUT BOOLEAN * PingSucceeded
  1445. );
  1446. //versioning functions
  1447. VOID
  1448. NmpResetClusterVersion(
  1449. BOOL ProcessChanges
  1450. );
  1451. DWORD NmpValidateNodeVersion(
  1452. IN LPCWSTR NodeId,
  1453. IN DWORD dwHighestVersion,
  1454. IN DWORD dwLowestVersion
  1455. );
  1456. DWORD NmpFormFixupNodeVersion(
  1457. IN LPCWSTR NodeId,
  1458. IN DWORD dwHighestVersion,
  1459. IN DWORD dwLowestVersion
  1460. );
  1461. DWORD NmpJoinFixupNodeVersion(
  1462. IN HLOCALXSACTION hXsaction,
  1463. IN LPCWSTR NodeId,
  1464. IN DWORD dwHighestVersion,
  1465. IN DWORD dwLowestVersion
  1466. );
  1467. DWORD NmpIsNodeVersionAllowed(
  1468. IN DWORD dwExcludeNodeId,
  1469. IN DWORD NodeHighestVersion,
  1470. IN DWORD NodeLowestVersion,
  1471. IN BOOL bJoin
  1472. );
  1473. DWORD NmpCalcClusterVersion(
  1474. IN DWORD dwExcludeNodeId,
  1475. OUT LPDWORD pdwClusterHighestVersion,
  1476. OUT LPDWORD pdwClusterLowestVersion
  1477. );
  1478. DWORD NmpUpdatePerformFixups(
  1479. IN BOOL IsSourceNode,
  1480. IN PVOID PropertyList,
  1481. IN LPDWORD PropertyListSize
  1482. );
  1483. DWORD NmpUpdatePerformFixups2(
  1484. IN BOOL IsSourceNode,
  1485. IN PVOID PropertyList,
  1486. IN LPDWORD PropertyListSize,
  1487. IN LPDWORD lpdwFixupNum,
  1488. IN PVOID lpKeyName,
  1489. IN PVOID pPropertyBuffer
  1490. );
  1491. DWORD NmpUpdateExtendedNodeState(
  1492. IN BOOL SourceNode,
  1493. IN LPWSTR NodeId,
  1494. IN CLUSTER_NODE_STATE* ExtendedState
  1495. );
  1496. VOID
  1497. NmpProcessClusterVersionChange(
  1498. VOID
  1499. );
  1500. VOID
  1501. NmpResetClusterNodeLimit(
  1502. );
  1503. // Fixup routine for updating the node version info, used by nmperformfixups
  1504. DWORD
  1505. NmpBuildVersionInfo(
  1506. IN DWORD dwFixUpType,
  1507. OUT PVOID * ppPropertyList,
  1508. OUT LPDWORD pdwPropertyListSize,
  1509. OUT LPWSTR * lpszKeyName
  1510. );
  1511. //
  1512. // connectoid advise sink functions
  1513. //
  1514. HRESULT
  1515. NmpInitializeConnectoidAdviseSink(
  1516. VOID
  1517. );
  1518. //
  1519. // Routines that must be supplied by users of the ClNet package.
  1520. //
  1521. VOID
  1522. ClNetPrint(
  1523. IN ULONG LogLevel,
  1524. IN PCHAR FormatString,
  1525. ...
  1526. );
  1527. VOID
  1528. ClNetLogEvent(
  1529. IN DWORD LogLevel,
  1530. IN DWORD MessageId
  1531. );
  1532. VOID
  1533. ClNetLogEvent1(
  1534. IN DWORD LogLevel,
  1535. IN DWORD MessageId,
  1536. IN LPCWSTR Arg1
  1537. );
  1538. VOID
  1539. ClNetLogEvent2(
  1540. IN DWORD LogLevel,
  1541. IN DWORD MessageId,
  1542. IN LPCWSTR Arg1,
  1543. IN LPCWSTR Arg2
  1544. );
  1545. VOID
  1546. ClNetLogEvent3(
  1547. IN DWORD LogLevel,
  1548. IN DWORD MessageId,
  1549. IN LPCWSTR Arg1,
  1550. IN LPCWSTR Arg2,
  1551. IN LPCWSTR Arg3
  1552. );
  1553. //
  1554. // Shared key management routines.
  1555. //
  1556. DWORD
  1557. NmpGetClusterKey(
  1558. OUT PVOID KeyBuffer,
  1559. IN OUT DWORD * KeyBufferLength
  1560. );
  1561. DWORD
  1562. NmpRederiveClusterKey(
  1563. VOID
  1564. );
  1565. VOID
  1566. NmpFreeClusterKey(
  1567. VOID
  1568. );
  1569. DWORD
  1570. NmpDeriveSessionKey(
  1571. IN HCRYPTPROV CryptProv,
  1572. IN ALG_ID EncryptionAlgoId,
  1573. IN DWORD Flags,
  1574. IN BYTE *SaltBuffer,
  1575. IN DWORD SaltBufferLen,
  1576. OUT HCRYPTKEY *CryptKey
  1577. );
  1578. #ifdef MULTICAST_DEBUG
  1579. DWORD
  1580. NmpDbgPrintData(LPCWSTR InfoStr,
  1581. PVOID Data,
  1582. DWORD DataLen
  1583. );
  1584. #endif
  1585. DWORD
  1586. NmpCreateCSPHandle(
  1587. OUT HCRYPTPROV *CryptProvider
  1588. );
  1589. DWORD
  1590. NmpProtectData(
  1591. IN PVOID Data,
  1592. IN DWORD DataLength,
  1593. OUT PVOID *EncryptedData,
  1594. OUT DWORD *EncryptedDataLength
  1595. );
  1596. DWORD
  1597. NmpUnprotectData(
  1598. IN PVOID EncryptedData,
  1599. IN DWORD EncryptedDataLength,
  1600. OUT PVOID * Data,
  1601. OUT DWORD * DataLength
  1602. );
  1603. DWORD
  1604. NmpEncryptDataAndCreateMAC(
  1605. IN HCRYPTPROV CryptProv,
  1606. IN ALG_ID EncryptionAlgoId,
  1607. IN DWORD Flags,
  1608. IN PBYTE Data,
  1609. IN DWORD DataLength,
  1610. IN PVOID EncryptionKey,
  1611. IN DWORD EncryptionKeyLength,
  1612. IN BOOL CreateSalt,
  1613. OUT PBYTE *Salt,
  1614. IN DWORD SaltLength,
  1615. OUT PBYTE *EncryptedData,
  1616. OUT DWORD *EncryptedDataLength,
  1617. OUT PBYTE *MAC,
  1618. IN OUT DWORD *MACLength
  1619. );
  1620. DWORD
  1621. NmpVerifyMACAndDecryptData(
  1622. IN HCRYPTPROV CryptProv,
  1623. IN ALG_ID EcnryptionAlgoId,
  1624. IN DWORD Flags,
  1625. IN PBYTE MAC,
  1626. IN DWORD MACLength,
  1627. IN DWORD MACExpectedSize,
  1628. IN PBYTE EncryptedData,
  1629. IN DWORD EncryptedDataLength,
  1630. IN PVOID EncryptionKey,
  1631. IN DWORD EncryptionKeyLength,
  1632. IN PBYTE Salt,
  1633. IN DWORD SaltLength,
  1634. OUT PBYTE *DecryptedData,
  1635. OUT DWORD *DecryptedDataLength
  1636. );
  1637. DWORD
  1638. NmpDeriveClusterKey(
  1639. IN PVOID MixingBytes,
  1640. IN DWORD MixingBytesSize,
  1641. OUT PVOID * Key,
  1642. OUT DWORD * KeyLength
  1643. );
  1644. void
  1645. NmpFreeNetworkMulticastKey(
  1646. PNM_NETWORK_MULTICASTKEY networkMulticastKey
  1647. );
  1648. VOID
  1649. NmpScheduleMulticastReconfiguration(
  1650. IN PNM_NETWORK Network
  1651. );
  1652. #endif // _NMP_INCLUDED