409 lines
7.8 KiB
C
409 lines
7.8 KiB
C
|
/*++
|
|||
|
|
|||
|
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
|
|||
|
|