windows-nt/Source/XPSP1/NT/base/cluster/service/inc/gum.h

409 lines
7.8 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
gum.h
Abstract:
Public data structures and procedure prototypes for the
Global Update Manager (Gum) subcomponent of the NT Cluster Service
Author:
John Vert (jvert) 16-Apr-1996
Revision History:
--*/
#ifndef _GUM_H
#define _GUM_H
//
// Define public structures and types
//
#define PRE_GUM_DISPATCH 1
#define POST_GUM_DISPATCH 2
//marshalling macros
#define GET_ARG(b, x) (PVOID)(*((PULONG)(b) + (x)) + (PUCHAR)(b))
// if you add new modules to GUM, this number needs to get adjusted
#define GUM_UPDATE_JOINSEQUENCE 2
//
// Predefined update types. Add new update types before
// GumUpdateMaximum!
//
typedef enum _GUM_UPDATE_TYPE {
GumUpdateFailoverManager,
GumUpdateRegistry,
GumUpdateMembership,
GumUpdateTesting,
GumUpdateMaximum
} GUM_UPDATE_TYPE;
//
// John Vert (jvert) 4/3/1997
// Update types used by FM. Temporarily here so the EP doesn't need its own
// update type
//
//
// 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 FmUpdateMaxAuto
//
typedef enum {
FmUpdateChangeResourceName = 0,
FmUpdateChangeGroupName,
FmUpdateDeleteResource,
FmUpdateDeleteGroup,
FmUpdateAddDependency,
FmUpdateRemoveDependency,
FmUpdateChangeClusterName,
FmUpdateChangeQuorumResource,
FmUpdateResourceState,
FmUpdateGroupState,
EmUpdateClusWidePostEvent,
FmUpdateGroupNode,
FmUpdatePossibleNodeForResType,
FmUpdateGroupIntendedOwner,
FmUpdateAssignOwnerToGroups,
FmUpdateApproveJoin,
FmUpdateCompleteGroupMove,
FmUpdateCheckAndSetGroupOwner,
FmUpdateUseRandomizedNodeListForGroups,
FmUpdateMaxAuto = 0x10000,
FmUpdateFailureCount,
FmUpdateGroupOwner,
FmUpdateCreateGroup,
FmUpdateCreateResource,
FmUpdateJoin,
FmUpdateAddPossibleNode,
FmUpdateRemovePossibleNode,
FmUpdateCreateResourceType,
FmUpdateDeleteResourceType,
FmUpdateChangeGroup,
FmUpdateMaximum
} FM_GUM_MESSAGE_TYPES;
DWORD
EpUpdateClusWidePostEvent(
IN BOOL SourceNode,
IN PCLUSTER_EVENT pEvent,
IN LPDWORD pdwFlags,
IN PVOID Context1,
IN PVOID Context2
);
//
// Define public interfaces
//
//
// Initialization and shutdown
//
DWORD
WINAPI
GumInitialize(
VOID
);
DWORD
WINAPI
GumOnline(
VOID
);
VOID
WINAPI
GumShutdown(
VOID
);
DWORD
GumCreateRpcBindings(
PNM_NODE Node
);
//
// Routines to send updates
//
DWORD
WINAPI
GumSendUpdate(
IN GUM_UPDATE_TYPE UpdateType,
IN DWORD Context,
IN DWORD BufferLength,
IN PVOID Buffer
);
DWORD
WINAPI
GumPostUpdate(
IN GUM_UPDATE_TYPE UpdateType,
IN DWORD Context,
IN DWORD BufferLength,
IN PVOID Buffer
);
DWORD
GumPostUpdateEx(
IN GUM_UPDATE_TYPE UpdateType,
IN DWORD DispatchIndex,
IN DWORD ArgCount,
...
);
DWORD
GumSendUpdateEx(
IN GUM_UPDATE_TYPE UpdateType,
IN DWORD DispatchIndex,
IN DWORD ArgCount,
...
);
DWORD
WINAPI
GumAttemptUpdate(
IN DWORD Sequence,
IN GUM_UPDATE_TYPE UpdateType,
IN DWORD Context,
IN DWORD BufferLength,
IN PVOID Buffer
);
DWORD
WINAPI
GumGetCurrentSequence(
IN GUM_UPDATE_TYPE UpdateType
);
VOID
WINAPI
GumSetCurrentSequence(
IN GUM_UPDATE_TYPE UpdateType,
DWORD Sequence
);
PVOID GumMarshallArgs(
OUT LPDWORD lpdwBufLength,
IN DWORD dwArgCount,
...);
// logging routine
typedef
DWORD
(WINAPI *PGUM_LOG_ROUTINE) (
IN DWORD dwGumDispatch,
IN DWORD dwSequence,
IN DWORD dwType,
IN PVOID pVoid,
IN DWORD dwDataSize
);
//
// Routines to receive updates
//
typedef
DWORD
(WINAPI *PGUM_UPDATE_ROUTINE) (
IN DWORD Context,
IN BOOL SourceNode,
IN DWORD BufferLength,
IN PVOID Buffer
);
#define GUM_MAX_DISPATCH_ARGS 5
typedef
DWORD
(WINAPI *PGUM_DISPATCH_ROUTINE1) (
IN BOOL SourceNode,
IN PVOID Arg1
);
typedef
DWORD
(WINAPI *PGUM_DISPATCH_ROUTINE2) (
IN BOOL SourceNode,
IN PVOID Arg1,
IN PVOID Arg2
);
typedef
DWORD
(WINAPI *PGUM_DISPATCH_ROUTINE3) (
IN BOOL SourceNode,
IN PVOID Arg1,
IN PVOID Arg2,
IN PVOID Arg3
);
typedef
DWORD
(WINAPI *PGUM_DISPATCH_ROUTINE4) (
IN BOOL SourceNode,
IN PVOID Arg1,
IN PVOID Arg2,
IN PVOID Arg3,
IN PVOID Arg4
);
typedef
DWORD
(WINAPI *PGUM_DISPATCH_ROUTINE5) (
IN BOOL SourceNode,
IN PVOID Arg1,
IN PVOID Arg2,
IN PVOID Arg3,
IN PVOID Arg4,
IN PVOID Arg5
);
typedef struct _GUM_DISPATCH_ENTRY {
DWORD ArgCount;
union {
PGUM_DISPATCH_ROUTINE1 Dispatch1;
PGUM_DISPATCH_ROUTINE2 Dispatch2;
PGUM_DISPATCH_ROUTINE3 Dispatch3;
PGUM_DISPATCH_ROUTINE4 Dispatch4;
PGUM_DISPATCH_ROUTINE5 Dispatch5;
};
} GUM_DISPATCH_ENTRY, *PGUM_DISPATCH_ENTRY;
typedef struct _GUM_VOTE_DECISION_CONTEXT{
GUM_UPDATE_TYPE UpdateType;
DWORD dwContext;
DWORD dwInputBufLength; //input data to make judgement upon
PVOID pInputBuf; //size of the input data
DWORD dwVoteLength;
PVOID pContext;
}GUM_VOTE_DECISION_CONTEXT, *PGUM_VOTE_DECISION_CONTEXT;
//
// Routines to collect and dispatch vote
//
typedef
DWORD
(WINAPI *PGUM_VOTE_DECISION_CB) (
IN PGUM_VOTE_DECISION_CONTEXT pDecisionContext,
IN DWORD dwVoteBufLength,
IN PVOID pVoteBuf,
IN DWORD dwNumVotes,
IN BOOL bDidAllActiveNodesVote,
OUT LPDWORD pdwOutputBufSize,
OUT PVOID *pOutputBuf
);
// routine to vote for a gum update type
typedef
DWORD
(WINAPI *PGUM_VOTE_ROUTINE) (
IN DWORD dwContext,
IN DWORD dwInputBufLength,
IN PVOID pInputBuf,
IN DWORD dwVoteLength,
OUT PVOID pVoteBuf
);
#define GUM_VOTE_VALID 0x00000001
#pragma warning( disable : 4200 ) // nonstandard extension used : zero-sized array in struct/union
typedef struct _GUM_VOTE_ENTRY{
DWORD dwFlags;
DWORD dwNodeId;
DWORD dwNumBytes;
BYTE VoteBuf[];
}GUM_VOTE_ENTRY, *PGUM_VOTE_ENTRY;
#pragma warning( default : 4200 )
#define GETVOTEFROMBUF(pVoteBuf, dwVoteLength, i, pdwNodeId) \
(((((PGUM_VOTE_ENTRY)((PBYTE)pVoteBuf + ((sizeof(GUM_VOTE_ENTRY) + dwVoteLength) * ((i)-1))))->dwFlags) & GUM_VOTE_VALID) ? \
(PVOID)((PBYTE)pVoteBuf + (sizeof(GUM_VOTE_ENTRY) * (i)) + (dwVoteLength * ((i)-1))) : (NULL)), \
(*(pdwNodeId) = ((PGUM_VOTE_ENTRY)((PBYTE)pVoteBuf + ((sizeof(GUM_VOTE_ENTRY) + dwVoteLength) * ((i)-1))))->dwNodeId)
DWORD
GumSendUpdateOnVote(
IN GUM_UPDATE_TYPE UpdateType,
IN DWORD dwContext,
IN DWORD dwInputBufLength,
IN PVOID pInputBuffer,
IN DWORD dwVoteLength,
IN PGUM_VOTE_DECISION_CB pfnGumDecisionCb,
IN PVOID pContext
);
VOID
WINAPI
GumReceiveUpdates(
IN BOOL IsJoining,
IN GUM_UPDATE_TYPE UpdateType,
IN PGUM_UPDATE_ROUTINE UpdateRoutine,
IN PGUM_LOG_ROUTINE LogRoutine,
IN DWORD DispatchCount,
IN OPTIONAL PGUM_DISPATCH_ENTRY DispatchTable,
IN OPTIONAL PGUM_VOTE_ROUTINE VoteRoutine
);
VOID
WINAPI
GumIgnoreUpdates(
IN GUM_UPDATE_TYPE UpdateType,
IN PGUM_UPDATE_ROUTINE UpdateRoutine
);
// Interface for a component to request gum to request NM
// shoot a node down to avoid consistency
VOID
GumCommFailure(
IN GUM_UPDATE_TYPE GumUpdateType,
IN DWORD NodeId,
IN DWORD ErrorCode,
IN BOOL Wait
);
//
// Interfaces for special join updates
//
DWORD
WINAPI
GumBeginJoinUpdate(
IN GUM_UPDATE_TYPE UpdateType,
OUT DWORD *Sequence
);
DWORD
WINAPI
GumEndJoinUpdate(
IN DWORD Sequence,
IN GUM_UPDATE_TYPE UpdateType,
IN DWORD Context,
IN DWORD BufferLength,
IN PVOID Buffer
);
#endif // _GUM_H