|
|
#ifndef _DMP_H
#define _DMP_H
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
dmp.h
Abstract:
Private header file for the Config Database Manager (DM) component of the NT Cluster Service
Author:
John Vert (jvert) 24-Apr-1996
Revision History:
--*/ #define UNICODE 1
#include "nt.h"
#include "ntrtl.h"
#include "nturtl.h"
#include "service.h"
#define LOG_CURRENT_MODULE LOG_MODULE_DM
#define DM_SEPARATE_HIVE 1
// For now is hKey is NULL, we assume that it was deleted while this handle was open
#define ISKEYDELETED(pDmKey) \
(!((pDmKey != NULL) && (pDmKey->hKey)))
#define AMIOWNEROFQUORES(pQuoResource) \
(NmGetNodeId(NmLocalNode) == NmGetNodeId(pQuoResource->Group->OwnerNode))
//
// DMKEY Structure.
//
typedef struct _DMKEY { LIST_ENTRY ListEntry; LIST_ENTRY NotifyList; HKEY hKey; DWORD GrantedAccess; WCHAR Name[0]; } DMKEY, *PDMKEY;
//
// Update handler definition
//
DWORD DmpUpdateHandler( IN DWORD Context, IN BOOL SourceNode, IN DWORD BufferLength, IN PVOID Buffer );
// JAF: Moved DM_UPDATE_TYPE into dm.h because receive.c needs access to it and doesn't
// have service\dm in its include path.
//
// Key creation update structure.
//
typedef struct _DM_CREATE_KEY_UPDATE { LPDWORD lpDisposition; // only valid on issuing node
HKEY *phKey; // only valid on issuing node
DWORD samDesired; DWORD dwOptions; BOOL SecurityPresent; } DM_CREATE_KEY_UPDATE, *PDM_CREATE_KEY_UPDATE;
//
// Key deletion update structure.
//
typedef struct _DM_DELETE_KEY_UPDATE { LPDWORD lpStatus; // only valid on issuing node
WCHAR Name[0]; } DM_DELETE_KEY_UPDATE, *PDM_DELETE_KEY_UPDATE;
//
// Value set update structure.
//
typedef struct _DM_SET_VALUE_UPDATE { LPDWORD lpStatus; // only valid on issuing node
DWORD NameOffset; DWORD DataOffset; DWORD DataLength; DWORD Type; WCHAR KeyName[0]; } DM_SET_VALUE_UPDATE, *PDM_SET_VALUE_UPDATE;
//
// Value delete update structure.
//
typedef struct _DM_DELETE_VALUE_UPDATE { LPDWORD lpStatus; // only valid on issuing node
DWORD NameOffset; WCHAR KeyName[0]; } DM_DELETE_VALUE_UPDATE, *PDM_DELETE_VALUE_UPDATE;
// the record structure for quorum logging
typedef struct _DM_LOGSCAN_CONTEXT{ DWORD dwSequence; LSN StartLsn; DWORD dwLastSequence; }DM_LOGSCAN_CONTEXT, *PDM_LOGSCAN_CONTEXT; //
// Data local to the DM module.
//
extern HKEY DmpRoot; extern HKEY DmpRootCopy; extern LIST_ENTRY KeyList; extern CRITICAL_SECTION KeyLock; extern BOOL gbDmpShutdownUpdates;
//disk space requirements
//1M, is lower than this, gracefully shutdown
#define DISKSPACE_LOW_WATERMARK (1 * 1024 * 1000)
//2M, if lower then send alert
#define DISKSPACE_HIGH_WATERMARK (5 * 1024 * 1000)
//minimum required to start the cluster service
#define DISKSPACE_INIT_MINREQUIRED DISKSPACE_HIGH_WATERMARK
#define DISKSPACE_MANAGE_INTERVAL (5 * 60 * 1000) //5 minute..log management functions are performed
#define DEFAULT_CHECKPOINT_INTERVAL (4 ) // in hours
typedef struct _LOCALXSACTION{ DWORD dwSig; DWORD dwSequence; HXSACTION hLogXsaction; //the log transaction
LIST_ENTRY PendingNotifyListHead; //the pending notifications to be issued on commit
}LOCALXSACTION, *PLOCALXSACTION;
typedef struct _DM_PENDING_NOTIFY{ LIST_ENTRY ListEntry; LPWSTR pszKeyName; DWORD dwFilter; }DM_PENDING_NOTIFY, *PDM_PENDING_NOTIFY;
#define LOCALXSAC_SIG 'CAXL'
#define GETLOCALXSACTION(pLocalXsaction, hLocalXsaction) \
(pLocalXsaction) = (PLOCALXSACTION)(hLocalXsaction); \ CL_ASSERT((pLocalXsaction)->dwSig == LOCALXSAC_SIG)
//quorum log tombstone
#define MAXSIZE_RESOURCEID 128
typedef struct _QUO_TOMBSTONE{ WCHAR szOldQuoResId[MAXSIZE_RESOURCEID]; WCHAR szOldQuoLogPath[MAX_PATH]; }QUO_TOMBSTONE, *PQUO_TOMBSTONE;
//
// Function prototypes local to the DM
//
DWORD DmpOpenKeys( IN REGSAM samDesired );
DWORD DmpGetRegistrySequence( VOID );
DWORD DmpSyncDatabase( IN RPC_BINDING_HANDLE RpcBinding, IN OPTIONAL LPCWSTR Directory );
VOID DmpUpdateSequence( VOID );
VOID DmpInvalidateKeys( VOID );
VOID DmpReopenKeys( VOID );
//
// Notification interface
//
BOOL DmpInitNotify( VOID );
VOID DmpRundownNotify( IN PDMKEY Key );
VOID DmpReportNotify( IN LPCWSTR KeyName, IN DWORD Filter );
//for delivering notifications when a transaction is committed
VOID DmpReportPendingNotifications( IN PLOCALXSACTION pLocalXsaction, IN BOOL bCommit );
DWORD DmpAddToPendingNotifications( IN PLOCALXSACTION pLocalXsaction, IN LPCWSTR pszName, IN DWORD dwFilter );
//
// Update handlers
//
DWORD DmpUpdateCreateKey( IN BOOL SourceNode, IN PDM_CREATE_KEY_UPDATE CreateUpdate, IN LPCWSTR KeyName, IN OPTIONAL LPVOID lpSecurityDescriptor );
DWORD DmpUpdateDeleteKey( IN BOOL SourceNode, IN PDM_DELETE_KEY_UPDATE Update );
DWORD DmpUpdateSetValue( IN BOOL SourceNode, IN PDM_SET_VALUE_UPDATE Update );
DWORD DmpUpdateDeleteValue( IN BOOL SourceNode, IN PDM_DELETE_VALUE_UPDATE Update );
DWORD DmpUpdateSetSecurity( IN BOOL SourceNode, IN PSECURITY_INFORMATION pSecurityInformation, IN LPCWSTR KeyName, IN PSECURITY_DESCRIPTOR lpSecurityDescriptor, IN LPDWORD pGrantedAccess );
//
// For Quorum Logging
//
DWORD DmpChkQuoTombStone(void);
DWORD DmpApplyChanges(void);
DWORD DmpCheckDiskSpace(void);
//diskmanage functions
void WINAPI DmpDiskManage( IN HANDLE hTimer, IN PVOID pContext );
void WINAPI DmpCheckpointTimerCb( IN HANDLE hTimer, IN PVOID pContext );
DWORD DmWriteToQuorumLog( IN DWORD dwGumDispatch, IN DWORD dwSequence, IN DWORD dwType, IN PVOID pData, IN DWORD dwSize );
BOOL DmpLogApplyChangesCb( IN PVOID pContext, IN LSN Lsn, IN RMID Resource, IN RMTYPE ResourceType, IN TRID Transaction, IN TRTYPE TransactionType, IN const PVOID pLogData, IN DWORD DataLength );
BOOL WINAPI DmpApplyTransactionCb( IN PVOID pContext, IN LSN Lsn, IN RMID Resource, IN RMTYPE ResourceType, IN TRID TransactionId, IN const PVOID pLogData, IN DWORD dwDataLength );
DWORD DmpLogFindStartLsn( IN HLOG hQuoLog, OUT LSN *pStartScanLsn, IN OUT LPDWORD pdwSequence);
BOOL WINAPI DmpLogFindStartLsnCb( IN PVOID pContext, IN LSN Lsn, IN RMID Resource, IN RMTYPE ResourceType, IN TRID Transaction, IN TRTYPE TransactionType, IN const PVOID pLogData, IN DWORD DataLength);
DWORD WINAPI DmpGetSnapShotCb( IN LPCWSTR lpszPathName, IN PVOID pContext, OUT LPWSTR szChkPtFile, OUT LPDWORD pdwChkPtSequence);
DWORD DmpHookQuorumNotify(void);
DWORD DmpUnhookQuorumNotify(void);
void DmpQuoObjNotifyCb( IN PVOID pContext, IN PVOID pObject, IN DWORD dwNotification);
DWORD DmpHookEventHandler();
BOOL DmpNodeObjEnumCb( IN BOOL *pbAreAllNodesUp, IN PVOID pContext2, IN PVOID pNode, IN LPCWSTR szName);
DWORD WINAPI DmpEventHandler( IN CLUSTER_EVENT Event, IN PVOID pContext );
DWORD DmpLoadHive( IN LPCWSTR Path );
DWORD DmpUnloadHive( );
DWORD DmpRestoreClusterDatabase( IN LPCWSTR lpszQuoLogPathName );
DWORD DmpLogCheckpointAndBackup( IN HLOG hLogFile, IN LPWSTR lpszPathName);
DWORD DmpGetCheckpointInterval( OUT LPDWORD pdwCheckpointInterval);
DWORD DmpHandleNodeDownEvent( IN LPVOID NotUsed );
//
// registry flusher thread interface.
//
DWORD DmpStartFlusher( VOID );
VOID DmpShutdownFlusher( VOID );
VOID DmpRestartFlusher( VOID );
DWORD DmpSetDwordInClusterServer( LPCWSTR lpszValueName, DWORD dwValue );
DWORD DmpGetDwordFromClusterServer( IN LPCWSTR lpszValueName, OUT LPDWORD pdwValue, IN DWORD dwDefaultValue ); DWORD DmpSafeDatabaseCopy( IN LPCWSTR FileName, IN LPCWSTR Path, IN LPCWSTR BkpPath, IN BOOL bDeleteSrcFile );
#endif //ifndef _DMP_H
|