220 lines
5.8 KiB
C
220 lines
5.8 KiB
C
|
/*++
|
||
|
Copyright (c) 1997-1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
global.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Global flags and parameters for the NT File Replication Service.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
David Orbits (davidor) - 4-Mar-1997
|
||
|
|
||
|
Revision History:
|
||
|
--*/
|
||
|
|
||
|
//
|
||
|
// Limit the amount of staging area used (in Kilobytes). This is
|
||
|
// a soft limit, the actual usage may be higher.
|
||
|
//
|
||
|
extern DWORD StagingLimitInKb;
|
||
|
|
||
|
//
|
||
|
// Default staging limit in kb to be assigned to a new staging area.
|
||
|
//
|
||
|
extern DWORD DefaultStagingLimitInKb;
|
||
|
|
||
|
//
|
||
|
// Running as service or as exe
|
||
|
//
|
||
|
extern BOOL RunningAsAService;
|
||
|
|
||
|
//
|
||
|
// Running with or without the DS
|
||
|
//
|
||
|
extern BOOL NoDs;
|
||
|
|
||
|
#if DBG
|
||
|
//
|
||
|
// Allow multiple servers on one machine
|
||
|
//
|
||
|
extern PWCHAR ServerName;
|
||
|
extern PWCHAR IniFileName;
|
||
|
extern GUID *ServerGuid;
|
||
|
#endif DBG
|
||
|
|
||
|
//
|
||
|
// Working directory
|
||
|
//
|
||
|
extern PWCHAR WorkingPath;
|
||
|
|
||
|
//
|
||
|
// Server Principle Name
|
||
|
//
|
||
|
extern PWCHAR ServerPrincName;
|
||
|
|
||
|
//
|
||
|
// Running as a server in a domain
|
||
|
//
|
||
|
extern BOOL IsAMember;
|
||
|
|
||
|
//
|
||
|
// Running as a DC
|
||
|
//
|
||
|
extern BOOL IsADc;
|
||
|
extern BOOL IsAPrimaryDc;
|
||
|
|
||
|
//
|
||
|
// Handle to the DC.
|
||
|
//
|
||
|
extern HANDLE DsHandle;
|
||
|
|
||
|
//
|
||
|
// The NtFrs Service is shutting down. Set TRUE when the ShutDownEvent is set.
|
||
|
//
|
||
|
extern BOOL FrsIsShuttingDown;
|
||
|
|
||
|
//
|
||
|
// Set TRUE if the shutdown request came from Service Control Manager rather
|
||
|
// than from an internally triggered shutdown. e.g. insufficient resources.
|
||
|
//
|
||
|
extern BOOL FrsScmRequestedShutdown;
|
||
|
|
||
|
//
|
||
|
// Global set to TRUE when FRS asserts.
|
||
|
//
|
||
|
extern BOOL FrsIsAsserting;
|
||
|
|
||
|
//
|
||
|
// Location of Jet Database (UNICODE and ASCII)
|
||
|
//
|
||
|
extern PWCHAR JetPath;
|
||
|
extern PWCHAR JetFile;
|
||
|
extern PWCHAR JetSys;
|
||
|
extern PWCHAR JetTemp;
|
||
|
extern PWCHAR JetLog;
|
||
|
|
||
|
extern PCHAR JetPathA;
|
||
|
extern PCHAR JetFileA;
|
||
|
extern PCHAR JetSysA;
|
||
|
extern PCHAR JetTempA;
|
||
|
extern PCHAR JetLogA;
|
||
|
|
||
|
extern PWCHAR ServiceLongName;
|
||
|
|
||
|
//
|
||
|
// Shared between the journal, database, and replica command servers
|
||
|
//
|
||
|
extern FRS_QUEUE ReplicaListHead;
|
||
|
extern FRS_QUEUE ReplicaFaultListHead;
|
||
|
extern BOOL DBSEmptyDatabase;
|
||
|
extern COMMAND_SERVER DBServiceCmdServer;
|
||
|
extern COMMAND_SERVER ReplicaCmdServer;
|
||
|
extern COMMAND_SERVER InitSyncCs;
|
||
|
|
||
|
|
||
|
|
||
|
#define bugbug(_text_)
|
||
|
#define bugmor(_text_)
|
||
|
|
||
|
//
|
||
|
// The Change Order Lock table is used to synchronize access to change orders.
|
||
|
// The lock index is based on a hash of the change order FileGuid. This ensures
|
||
|
// that when a duplicate change order (from another inbound partner) is trying
|
||
|
// to issue we will interlock against the retire operation on the same change
|
||
|
// order with the same Guid. The FileGuid is used because checks are also needed
|
||
|
// against other change orders on the same file and to check for conflicting
|
||
|
// activity on the parent change order.
|
||
|
//
|
||
|
// The lock array reduces contention and it also avoids the allocating and
|
||
|
// freeing the crit sec resource if it lived in the change order itself
|
||
|
// (which doesn't work anyway because of the race between issue check and
|
||
|
// retire of duplicate change orders).
|
||
|
// *** The array size must be pwr of 2.
|
||
|
//
|
||
|
#define NUMBER_CHANGE_ORDER_LOCKS 16
|
||
|
CRITICAL_SECTION ChangeOrderLockTable[NUMBER_CHANGE_ORDER_LOCKS];
|
||
|
|
||
|
// FidHashValue = (HighPart >> 12) + LowPart + (HighPart << (32-12));
|
||
|
|
||
|
#define HASH_FID(_pUL_, _TABLE_SIZE_) \
|
||
|
(( (_pUL_[1] >> 12) + _pUL_[0] + (_pUL_[1] << (32-12))) & ((_TABLE_SIZE_)-1))
|
||
|
|
||
|
#define HASH_GUID(_pUL_, _TABLE_SIZE_) \
|
||
|
((_pUL_[0] ^ _pUL_[1] ^ _pUL_[2] ^ _pUL_[3]) & ((_TABLE_SIZE_)-1))
|
||
|
|
||
|
//#define ChgOrdAcquireLockGuid(_coe_) { \
|
||
|
// PULONG pUL = (PULONG) &((_coe_)->Cmd.FileGuid); \
|
||
|
// EnterCriticalSection( \
|
||
|
// &ChangeOrderLockTable[HASH_GUID(pUL, NUMBER_CHANGE_ORDER_LOCKS)] ); \
|
||
|
//}
|
||
|
//
|
||
|
//#define ChgOrdReleaseLockGuid(_coe_) { \
|
||
|
// PULONG pUL = (PULONG) &((_coe_)->Cmd.FileGuid); \
|
||
|
// LeaveCriticalSection( \
|
||
|
// &ChangeOrderLockTable[HASH_GUID(pUL, NUMBER_CHANGE_ORDER_LOCKS)] ); \
|
||
|
//}
|
||
|
|
||
|
|
||
|
#define UNDEFINED_LOCK_SLOT (0xFFFFFFFF)
|
||
|
|
||
|
#define ChgOrdGuidLock(_pGuid_) \
|
||
|
HASH_GUID(((PULONG)(_pGuid_)), NUMBER_CHANGE_ORDER_LOCKS)
|
||
|
|
||
|
//
|
||
|
// Get/Release the change order lock based on the lock slot.
|
||
|
//
|
||
|
#define ChgOrdAcquireLock(_slot_) \
|
||
|
FRS_ASSERT((_slot_) != UNDEFINED_LOCK_SLOT); \
|
||
|
EnterCriticalSection(&ChangeOrderLockTable[(_slot_)])
|
||
|
|
||
|
#define ChgOrdReleaseLock(_slot_) \
|
||
|
FRS_ASSERT((_slot_) != UNDEFINED_LOCK_SLOT); \
|
||
|
LeaveCriticalSection(&ChangeOrderLockTable[(_slot_)])
|
||
|
|
||
|
|
||
|
//
|
||
|
// Get/Release the change order lock based on the File Guid
|
||
|
//
|
||
|
#define ChgOrdAcquireLockGuid(_coe_) { \
|
||
|
ULONG __Slot = ChgOrdGuidLock( &((_coe_)->Cmd.FileGuid)); \
|
||
|
ChgOrdAcquireLock(__Slot); \
|
||
|
}
|
||
|
|
||
|
#define ChgOrdReleaseLockGuid(_coe_) { \
|
||
|
ULONG __Slot = ChgOrdGuidLock( &((_coe_)->Cmd.FileGuid)); \
|
||
|
ChgOrdReleaseLock(__Slot); \
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Process Handle
|
||
|
//
|
||
|
extern HANDLE ProcessHandle;
|
||
|
|
||
|
//
|
||
|
// if TRUE then preserve existing file GUIDs whenever possible.
|
||
|
//
|
||
|
extern BOOL PreserveFileOID;
|
||
|
|
||
|
#define QUADZERO ((ULONGLONG)0)
|
||
|
|
||
|
//
|
||
|
// Some Time Conversions.
|
||
|
//
|
||
|
#define CONVERT_FILETIME_TO_MINUTES ((ULONGLONG)60L * 1000L * 1000L * 10L)
|
||
|
#define CONVERT_FILETIME_TO_DAYS ((ULONGLONG)24L * 60L * 60L * 1000L * 1000L * 10L)
|
||
|
#define ONEDAY ((ULONGLONG)1L * 24L * 60L * 60L * 1000L * 1000L * 10L)
|
||
|
|
||
|
|
||
|
|
||
|
#define WSTR_EQ(_a_, _b_) (_wcsicmp(_a_, _b_) == 0)
|
||
|
#define WSTR_NE(_a_, _b_) (_wcsicmp(_a_, _b_) != 0)
|
||
|
|
||
|
#define ASTR_EQ(_a_, _b_) (_stricmp(_a_, _b_) == 0)
|
||
|
#define ASTR_NE(_a_, _b_) (_stricmp(_a_, _b_) != 0)
|
||
|
|