2190 lines
49 KiB
C
2190 lines
49 KiB
C
|
/*++
|
|||
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
frs.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
This header handles information global to the ntrepl\frs modules
|
|||
|
|
|||
|
Author:
|
|||
|
Billy Fuller (billyf) - 20-Mar-1997
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _FRSH_
|
|||
|
#define _FRSH_
|
|||
|
|
|||
|
|
|||
|
#include <schedule.h>
|
|||
|
#include <debug.h>
|
|||
|
#include <frsrpc.h>
|
|||
|
#include <frsapi.h>
|
|||
|
#include <frsalloc.h>
|
|||
|
#include <winldap.h>
|
|||
|
#include <dsgetdc.h>
|
|||
|
#include <mmsystem.h>
|
|||
|
#include <global.h>
|
|||
|
#include <winsvc.h>
|
|||
|
|
|||
|
#include <ntfrsres.h>
|
|||
|
|
|||
|
#include <eventlog.h>
|
|||
|
#include <resource.h>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Types for the common comm subsystem
|
|||
|
//
|
|||
|
typedef enum _COMMAND_SERVER_ID {
|
|||
|
CS_NONE = 0,
|
|||
|
CS_RS,
|
|||
|
|
|||
|
CS_MAX
|
|||
|
} COMMAND_SERVER_ID, *PCOMMAND_SERVER_ID;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// GLOBALS
|
|||
|
//
|
|||
|
#define NTFRS_MAJOR (0)
|
|||
|
#define NTFRS_MINOR (0)
|
|||
|
|
|||
|
extern ULONG NtFrsMajor;
|
|||
|
extern ULONG NtFrsMinor;
|
|||
|
extern PCHAR NtFrsModule;
|
|||
|
extern PCHAR NtFrsDate;
|
|||
|
extern PCHAR NtFrsTime;
|
|||
|
|
|||
|
//
|
|||
|
// Staging File Version Levels
|
|||
|
//
|
|||
|
#define NTFRS_STAGE_MAJOR (0)
|
|||
|
#define NTFRS_STAGE_MINOR_0 (0)
|
|||
|
#define NTFRS_STAGE_MINOR_1 (1) // ChangeOrder Record extension added to stage file.
|
|||
|
#define NTFRS_STAGE_MINOR_2 (2) // Compression Guid added to stage file.
|
|||
|
|
|||
|
extern ULONG NtFrsStageMajor;
|
|||
|
extern ULONG NtFrsStageMinor;
|
|||
|
|
|||
|
//
|
|||
|
// Communication packet version levels.
|
|||
|
//
|
|||
|
#define NTFRS_COMM_MINOR_0 (0)
|
|||
|
#define NTFRS_COMM_MINOR_1 (1) // MD5
|
|||
|
#define NTFRS_COMM_MINOR_2 (2) // Trigger schedule
|
|||
|
#define NTFRS_COMM_MINOR_3 (3) // ChangeOrder Record Extension.
|
|||
|
//
|
|||
|
// The following minor rev forces the Replica Number fields in the change order
|
|||
|
// to be a ULONG (v.s. ULONG_PTR) for 32 - 64 bit interop. Add hack to always
|
|||
|
// ship the 4 ptrs in the CO as 32 bits of zeros for 32 bit compat (see schema.h).
|
|||
|
//
|
|||
|
// Also the change order extension supports a var len comm element v.s. fixed
|
|||
|
// size as in rev_3. When sending the CO Externsion to rev 3 servers you can
|
|||
|
// only send the COMM_CO_EXT_WIN2K element with the MD5 checksum. For Rev 4
|
|||
|
// servers and above you can send COMM_CO_EXTENSION_2 data elements.
|
|||
|
//
|
|||
|
// Added COMM_COMPRESSION_GUID as part of Join request.
|
|||
|
//
|
|||
|
#define NTFRS_COMM_MINOR_4 (4) // ChangeOrder Record Extension. COMM_CO_EXTENSION_2
|
|||
|
|
|||
|
extern ULONG NtFrsCommMinor;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// SCHEDULE
|
|||
|
// Defines for both an byte-per-hour and a nibble-per-hour
|
|||
|
//
|
|||
|
#ifdef SCHEDULE_NIBBLE_PER_HOUR
|
|||
|
//
|
|||
|
// Each hour in a schedule is 4 bits (rounded up).
|
|||
|
//
|
|||
|
#define SCHEDULE_DATA_BYTES ((SCHEDULE_DATA_ENTRIES + 1) / 2)
|
|||
|
//
|
|||
|
// Each hour in a schedule is 8 bits (byte).
|
|||
|
//
|
|||
|
#else SCHEDULE_NIBBLE_PER_HOUR
|
|||
|
#define SCHEDULE_DATA_BYTES SCHEDULE_DATA_ENTRIES
|
|||
|
#endif SCHEDULE_NIBBLE_PER_HOUR
|
|||
|
|
|||
|
//
|
|||
|
// Defines for checking Service state transitions.
|
|||
|
// Used in FrsSetServiceStatus()
|
|||
|
//
|
|||
|
#define FRS_SVC_TRANSITION_TABLE_SIZE 5
|
|||
|
#define FRS_SVC_TRANSITION_LEGAL 0
|
|||
|
#define FRS_SVC_TRANSITION_NOOP 1
|
|||
|
#define FRS_SVC_TRANSITION_ILLEGAL 2
|
|||
|
|
|||
|
//
|
|||
|
// FRS MEMORY MANAGEMENT
|
|||
|
//
|
|||
|
VOID
|
|||
|
FrsInitializeMemAlloc(
|
|||
|
VOID
|
|||
|
);
|
|||
|
VOID
|
|||
|
FrsUnInitializeMemAlloc(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// DS
|
|||
|
//
|
|||
|
//
|
|||
|
// Some useful DS search constants
|
|||
|
//
|
|||
|
#define CONFIG_NAMING_CONTEXT L"cn=configuration"
|
|||
|
|
|||
|
#define CLASS_ANY L"(objectClass=*)"
|
|||
|
#define CLASS_CXTION L"(objectClass=nTDSConnection)"
|
|||
|
#define CLASS_MEMBER L"(objectClass=nTFRSMember)"
|
|||
|
#define CLASS_REPLICA_SET L"(objectClass=nTFRSReplicaSet)"
|
|||
|
#define CLASS_NTFRS_SETTINGS L"(objectClass=nTFRSSettings)"
|
|||
|
#define CLASS_NTDS_SETTINGS L"(objectClass=nTDSSettings)"
|
|||
|
#define CLASS_SUBSCRIBER L"(objectClass=nTFRSSubscriber)"
|
|||
|
#define CLASS_SUBSCRIPTIONS L"(objectClass=nTFRSSubscriptions)"
|
|||
|
#define CLASS_NTDS_DSA L"(objectClass=nTDSDSA)"
|
|||
|
#define CLASS_COMPUTER L"(objectClass=computer)"
|
|||
|
#define CLASS_USER L"(objectClass=user)"
|
|||
|
#define CLASS_SERVER L"(objectClass=server)"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#define CATEGORY_ANY L"(objectCategory=*)"
|
|||
|
#define CATEGORY_CXTION L"(objectCategory=nTDSConnection)"
|
|||
|
#define CATEGORY_MEMBER L"(objectCategory=nTFRSMember)"
|
|||
|
#define CATEGORY_REPLICA_SET L"(objectCategory=nTFRSReplicaSet)"
|
|||
|
#define CATEGORY_NTFRS_SETTINGS L"(objectCategory=nTFRSSettings)"
|
|||
|
#define CATEGORY_NTDS_SETTINGS L"(objectCategory=nTDSSettings)"
|
|||
|
#define CATEGORY_SUBSCRIBER L"(objectCategory=nTFRSSubscriber)"
|
|||
|
#define CATEGORY_SUBSCRIPTIONS L"(objectCategory=nTFRSSubscriptions)"
|
|||
|
#define CATEGORY_NTDS_DSA L"(objectCategory=nTDSDSA)"
|
|||
|
#define CATEGORY_COMPUTER L"(objectCategory=computer)"
|
|||
|
#define CATEGORY_USER L"(objectCategory=user)"
|
|||
|
#define CATEGORY_SERVER L"(objectCategory=server)"
|
|||
|
|
|||
|
//
|
|||
|
// Codes for the various Config Node to Object Type mappings
|
|||
|
// Note: Update string array DsConfigTypeName[] when this changes.
|
|||
|
//
|
|||
|
#define CONFIG_TYPE_UNDEFINED (0)
|
|||
|
#define CONFIG_TYPE_IN_CXTION (1)
|
|||
|
#define CONFIG_TYPE_MEMBER (2)
|
|||
|
#define CONFIG_TYPE_REPLICA_SET (3)
|
|||
|
#define CONFIG_TYPE_NTFRS_SETTINGS (4)
|
|||
|
#define CONFIG_TYPE_NTDS_SETTINGS (5)
|
|||
|
#define CONFIG_TYPE_SUBSCRIBER (6)
|
|||
|
#define CONFIG_TYPE_SUBSCRIPTIONS (7)
|
|||
|
#define CONFIG_TYPE_NTDS_DSA (8)
|
|||
|
#define CONFIG_TYPE_COMPUTER (9)
|
|||
|
#define CONFIG_TYPE_USER (10)
|
|||
|
#define CONFIG_TYPE_SERVER (11)
|
|||
|
#define CONFIG_TYPE_SERVICES_ROOT (12)
|
|||
|
#define CONFIG_TYPE_OUT_CXTION (13)
|
|||
|
|
|||
|
|
|||
|
#define ATTR_DIRECTORY_FILTER L"frsDirectoryFilter"
|
|||
|
#define ATTR_FILE_FILTER L"frsFileFilter"
|
|||
|
#define ATTR_NEW_SET_GUID L"frsReplicaSetGUID"
|
|||
|
#define ATTR_OLD_SET_GUID L"replicaSetGUID"
|
|||
|
#define ATTR_CLASS L"objectClass"
|
|||
|
#define ATTR_DN L"distinguishedName"
|
|||
|
#define ATTR_OBJECT_GUID L"objectGUID"
|
|||
|
#define ATTR_SCHEDULE L"schedule"
|
|||
|
#define ATTR_NEW_VERSION_GUID L"frsVersionGuid"
|
|||
|
#define ATTR_OLD_VERSION_GUID L"replicaVersionGuid"
|
|||
|
#define ATTR_REPLICA_SET L"nTFRSReplicaSet"
|
|||
|
#define ATTR_NTFRS_SETTINGS L"nTFRSSettings"
|
|||
|
#define ATTR_SERVER L"server"
|
|||
|
#define ATTR_MEMBER L"nTFRSMember"
|
|||
|
#define ATTR_REPLICA_ROOT L"frsRootPath"
|
|||
|
#define ATTR_REPLICA_STAGE L"frsStagingPath"
|
|||
|
#define ATTR_FROM_SERVER L"fromServer"
|
|||
|
#define ATTR_PRIMARY_MEMBER L"frsPrimaryMember"
|
|||
|
#define ATTR_SCHEDULE L"schedule"
|
|||
|
#define ATTR_USN_CHANGED L"uSNChanged"
|
|||
|
#define ATTR_NAMING_CONTEXTS L"namingContexts"
|
|||
|
#define ATTR_DEFAULT_NAMING_CONTEXT L"defaultNamingContext"
|
|||
|
#define ATTR_COMPUTER_REF L"frsComputerReference"
|
|||
|
#define ATTR_COMPUTER_REF_BL L"frsComputerReferenceBL"
|
|||
|
#define ATTR_SERVER_REF L"ServerReference"
|
|||
|
#define ATTR_SERVER_REF_BL L"ServerReferenceBL"
|
|||
|
#define ATTR_MEMBER_REF L"frsMemberReference"
|
|||
|
#define ATTR_MEMBER_REF_BL L"frsMemberReferenceBL"
|
|||
|
#define ATTR_WORKING L"frsWorkingPath"
|
|||
|
#define ATTR_SET_TYPE L"frsReplicaSetType"
|
|||
|
#define ATTR_SUBSCRIPTIONS L"nTFRSSubscriptions"
|
|||
|
#define ATTR_SUBSCRIBER L"nTFRSSubscriber"
|
|||
|
#define ATTR_CN L"cn"
|
|||
|
#define ATTR_EXTENSIONS L"frsExtensions"
|
|||
|
#define ATTR_SAM L"sAMAccountName"
|
|||
|
#define ATTR_CXTION L"nTDSConnection"
|
|||
|
#define ATTR_ENABLED_CXTION L"enabledConnection"
|
|||
|
#define ATTR_OPTIONS L"options"
|
|||
|
#define ATTR_TRANSPORT_TYPE L"transportType"
|
|||
|
#define ATTR_USER_ACCOUNT_CONTROL L"userAccountControl"
|
|||
|
#define ATTR_DNS_HOST_NAME L"dNSHostName"
|
|||
|
#define ATTR_SERVICE_PRINCIPAL_NAME L"servicePrincipalName"
|
|||
|
#define ATTR_TRUE L"TRUE"
|
|||
|
#define ATTR_FALSE L"FALSE"
|
|||
|
|
|||
|
#define CN_ROOT L""
|
|||
|
#define CN_SYSVOLS L"Microsoft System Volumes"
|
|||
|
#define CN_ENTERPRISE_SYSVOL NTFRSAPI_REPLICA_SET_TYPE_ENTERPRISE
|
|||
|
#define CN_SERVERS L"Servers"
|
|||
|
#define CN_NTDS_SETTINGS L"ntds settings"
|
|||
|
#define CN_SUBSCRIPTIONS L"NTFRS Subscriptions"
|
|||
|
#define CN_COMPUTERS L"Computers"
|
|||
|
#define CN_DOMAIN_CONTROLLERS L"Domain Controllers"
|
|||
|
#define CN_SERVICES L"Services"
|
|||
|
#define CN_SITES L"Sites"
|
|||
|
#define CN_SYSTEM L"System"
|
|||
|
#define CN_NTFRS_SETTINGS L"File Replication Service"
|
|||
|
#define CN_DOMAIN_SYSVOL L"Domain System Volume (SYSVOL share)"
|
|||
|
|
|||
|
//
|
|||
|
// Some useful ldap macroes
|
|||
|
//
|
|||
|
#define LDAP_FREE_MSG(x) {if (x) {ldap_msgfree(x); (x) = NULL;}}
|
|||
|
#define LDAP_FREE_VALUES(x) {if (x) {ldap_value_free(x); (x) = NULL;}}
|
|||
|
#define LDAP_FREE_BER_VALUES(x) {if (x) {ldap_value_free_len(x); (x) = NULL;}}
|
|||
|
|
|||
|
//
|
|||
|
// DS Poller
|
|||
|
//
|
|||
|
VOID
|
|||
|
FrsDsInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsDsSetDsPollingInterval(
|
|||
|
IN ULONG UseShortInterval,
|
|||
|
IN DWORD LongInterval,
|
|||
|
IN DWORD ShortInterval
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsDsGetDsPollingInterval(
|
|||
|
OUT ULONG *Interval,
|
|||
|
OUT ULONG *LongInterval,
|
|||
|
OUT ULONG *ShortInterval
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsDsStartDemotion(
|
|||
|
IN PWCHAR ReplicaSetName
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsDsCommitDemotion(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Default File and Directory filter lists.
|
|||
|
//
|
|||
|
// The compiled in default is only used if no value is supplied in
|
|||
|
// EITHER the DS or the Registry.
|
|||
|
// The table below shows how the final filter is formed.
|
|||
|
//
|
|||
|
// value Value
|
|||
|
// supplied supplied Resulting filter string Used
|
|||
|
// in DS in Registry
|
|||
|
// No No DEFAULT_xxx_FILTER_LIST
|
|||
|
// No Yes Value from registry
|
|||
|
// Yes No Value from DS
|
|||
|
// Yes Yes Value from DS + Value from registry
|
|||
|
//
|
|||
|
//
|
|||
|
#define FRS_DS_COMPOSE_FILTER_LIST(_DsFilterList, _RegFilterList, _DefaultFilterList) \
|
|||
|
\
|
|||
|
(((_DsFilterList) != NULL) ? \
|
|||
|
( ((_RegFilterList) != NULL) ? \
|
|||
|
FrsWcsCat3((_DsFilterList), L",", (_RegFilterList)) : \
|
|||
|
FrsWcsDup((_DsFilterList)) \
|
|||
|
) : \
|
|||
|
( ((_RegFilterList) != NULL) ? \
|
|||
|
FrsWcsDup((_RegFilterList)) : \
|
|||
|
FrsWcsDup((_DefaultFilterList)) \
|
|||
|
) \
|
|||
|
)
|
|||
|
|
|||
|
//
|
|||
|
// Add a new message to the ds polling summary.
|
|||
|
//
|
|||
|
#define FRS_DS_ADD_TO_POLL_SUMMARY(_DsPollSummaryBuf, _NewMessage, _NewMessageLen) \
|
|||
|
\
|
|||
|
if ((DsPollSummaryBufLen + _NewMessageLen) > DsPollSummaryMaxBufLen ) { \
|
|||
|
PWCHAR _TempDsPollSummaryBuf = NULL; \
|
|||
|
_TempDsPollSummaryBuf = FrsAlloc(DsPollSummaryMaxBufLen + 2 * 1000); \
|
|||
|
DsPollSummaryMaxBufLen += (2 * 1000); \
|
|||
|
CopyMemory(_TempDsPollSummaryBuf, DsPollSummaryBuf, DsPollSummaryBufLen); \
|
|||
|
FrsFree(DsPollSummaryBuf); \
|
|||
|
DsPollSummaryBuf = _TempDsPollSummaryBuf; \
|
|||
|
} \
|
|||
|
\
|
|||
|
CopyMemory(&DsPollSummaryBuf[DsPollSummaryBufLen/2], _NewMessage, _NewMessageLen);\
|
|||
|
DsPollSummaryBufLen += _NewMessageLen;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// FRS Dummy event logging routines
|
|||
|
//
|
|||
|
extern VOID LogFrsException(FRS_ERROR_CODE, ULONG_PTR, PWCHAR);
|
|||
|
extern VOID LogException(DWORD, PWCHAR);
|
|||
|
|
|||
|
//
|
|||
|
// FRS Exception Handling
|
|||
|
//
|
|||
|
extern VOID FrsRaiseException(FRS_ERROR_CODE, ULONG_PTR);
|
|||
|
extern DWORD FrsException(EXCEPTION_POINTERS *);
|
|||
|
extern DWORD FrsExceptionLastCode(VOID);
|
|||
|
extern ULONG_PTR FrsExceptionLastInfo(VOID);
|
|||
|
extern VOID FrsExceptionQuiet(BOOL);
|
|||
|
extern PVOID MallocException(DWORD);
|
|||
|
|
|||
|
//
|
|||
|
// FRS Events
|
|||
|
//
|
|||
|
extern HANDLE ShutDownEvent; // shutdown the service
|
|||
|
extern HANDLE DataBaseEvent; // database is up and running
|
|||
|
extern HANDLE JournalEvent; // journal is up and running
|
|||
|
extern HANDLE ChgOrdEvent; // Change order accept is up and running
|
|||
|
extern HANDLE ReplicaEvent; // replica is up and running
|
|||
|
extern HANDLE CommEvent; // communication is up and running
|
|||
|
extern HANDLE DsPollEvent; // used to poll the ds
|
|||
|
extern HANDLE DsShutDownComplete; // ds polling thread has shut down
|
|||
|
|
|||
|
//
|
|||
|
// FRS Global flags
|
|||
|
//
|
|||
|
extern BOOL EventLogIsRunning; // is the event log service up and running?
|
|||
|
extern BOOL RpcssIsRunning; // is the rpc endpoint service up and running?
|
|||
|
|
|||
|
//
|
|||
|
// Main Initialization
|
|||
|
//
|
|||
|
VOID
|
|||
|
MainInit(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Outbound Log Processor
|
|||
|
//
|
|||
|
VOID
|
|||
|
OutLogInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ShutDownOutLog(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Vv Join
|
|||
|
//
|
|||
|
VOID
|
|||
|
SubmitVvJoin(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCXTION Cxtion,
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
SubmitVvJoinSync(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCXTION Cxtion,
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS RPC
|
|||
|
//
|
|||
|
//
|
|||
|
// The protocols sequences we think we know how to support
|
|||
|
// XXX these constants should be in a win header file!
|
|||
|
//
|
|||
|
#define PROTSEQ_TCP_IP L"ncacn_ip_tcp"
|
|||
|
#define PROTSEQ_NAMED_PIPE L"ncacn_np"
|
|||
|
|
|||
|
//
|
|||
|
// All computer names passed to RpcStringBindingCompose() using PROTSEQ_TCP_IP
|
|||
|
// need to have the leading two back slashes removed or the call fails with
|
|||
|
// RPC_S_SERVER_UNAVAILABLE.
|
|||
|
//
|
|||
|
#define FRS_TRIM_LEADING_2SLASH(_Name_) \
|
|||
|
if (((_Name_) != NULL) && \
|
|||
|
(wcslen(_Name_) > 1) && \
|
|||
|
((_Name_)[0] == L'\\' ) && \
|
|||
|
((_Name_)[1] == L'\\')) { \
|
|||
|
(_Name_) += 2; \
|
|||
|
}
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsRpcBindToServer(
|
|||
|
IN PGNAME Name,
|
|||
|
IN PWCHAR PrincName,
|
|||
|
IN ULONG AuthLevel,
|
|||
|
OUT handle_t *Handle
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
FrsRpcInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsRpcUnInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsRpcUnBindFromServer(
|
|||
|
handle_t *Handle
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// FRS threads
|
|||
|
//
|
|||
|
#if DBG
|
|||
|
DWORD
|
|||
|
FrsTest(
|
|||
|
PVOID
|
|||
|
);
|
|||
|
#endif DBG
|
|||
|
|
|||
|
//
|
|||
|
// FRS Thread Management Support
|
|||
|
//
|
|||
|
VOID
|
|||
|
ThSupSubmitThreadExitCleanup(
|
|||
|
PFRS_THREAD
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ThSupInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
ThSupExitThreadGroup(
|
|||
|
DWORD (*)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ThSupExitSingleThread(
|
|||
|
PFRS_THREAD
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
ThSupWaitThread(
|
|||
|
PFRS_THREAD FrsThread,
|
|||
|
DWORD Millisec
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
ThSupGetThreadData(
|
|||
|
PFRS_THREAD
|
|||
|
);
|
|||
|
|
|||
|
PFRS_THREAD
|
|||
|
ThSupGetThread(
|
|||
|
DWORD (*)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ThSupReleaseRef(
|
|||
|
PFRS_THREAD
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
ThSupCreateThread(
|
|||
|
PWCHAR Name,
|
|||
|
PVOID Param,
|
|||
|
DWORD (*Main)(PVOID),
|
|||
|
DWORD (*Exit)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
ThSupExitThreadNOP(
|
|||
|
PVOID
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
ThSupExitWithTombstone(
|
|||
|
PVOID
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// shutdown functions called by ShutDown()
|
|||
|
//
|
|||
|
extern VOID ShutDownRpc(VOID); // Cleanup after StartRpc thread
|
|||
|
|
|||
|
//
|
|||
|
// Globals
|
|||
|
//
|
|||
|
extern WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 2]; // A useful piece of info
|
|||
|
extern PWCHAR ComputerDnsName; // A useful piece of info
|
|||
|
|
|||
|
//
|
|||
|
// Service functions
|
|||
|
//
|
|||
|
DWORD
|
|||
|
FrsGetServiceState(
|
|||
|
PWCHAR,
|
|||
|
PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
FrsWaitService(
|
|||
|
PWCHAR,
|
|||
|
PWCHAR,
|
|||
|
INT,
|
|||
|
INT
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
FrsIsServiceRunning(
|
|||
|
PWCHAR,
|
|||
|
PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsSetServiceStatus(
|
|||
|
IN DWORD Status,
|
|||
|
IN DWORD CheckPoint,
|
|||
|
IN DWORD Hint,
|
|||
|
IN DWORD ExitCode
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS Version Vector
|
|||
|
//
|
|||
|
|
|||
|
#define LOCK_GEN_TABLE(_vv_) \
|
|||
|
GTabLockTable(_vv_); \
|
|||
|
DPRINT1(5, "LOCK_GEN_TABLE: "#_vv_":%08x\n", _vv_);
|
|||
|
|
|||
|
#define UNLOCK_GEN_TABLE(_vv_) \
|
|||
|
DPRINT1(5, "UNLOCK_GEN_TABLE: "#_vv_":%08x\n", _vv_); \
|
|||
|
GTabUnLockTable(_vv_);
|
|||
|
|
|||
|
PGEN_TABLE
|
|||
|
VVDupOutbound(
|
|||
|
IN PGEN_TABLE VV
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
VVReserveRetireSlot(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCHANGE_ORDER_ENTRY Coe
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
VVRetireChangeOrder(
|
|||
|
IN PTHREAD_CTX ThreadCtx,
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCHANGE_ORDER_ENTRY ChangeOrder,
|
|||
|
IN ULONG CleanUpFlags
|
|||
|
);
|
|||
|
|
|||
|
PCHANGE_ORDER_ENTRY
|
|||
|
VVReferenceRetireSlot(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCHANGE_ORDER_COMMAND CoCmd
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
VVUpdate(
|
|||
|
IN PGEN_TABLE VV,
|
|||
|
IN ULONGLONG Vsn,
|
|||
|
IN GUID *Guid
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
VVInsertOutbound(
|
|||
|
IN PGEN_TABLE VV,
|
|||
|
IN PGVSN GVsn
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
VVUpdateOutbound(
|
|||
|
IN PGEN_TABLE VV,
|
|||
|
IN PGVSN GVsn
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
VVHasVsnNoLock(
|
|||
|
IN PGEN_TABLE VV,
|
|||
|
IN GUID *OriginatorGuid,
|
|||
|
IN ULONGLONG Vsn
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
VVHasOriginatorNoLock(
|
|||
|
IN PGEN_TABLE VV,
|
|||
|
IN GUID *OriginatorGuid
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
VVHasVsn(
|
|||
|
IN PGEN_TABLE VV,
|
|||
|
IN PCHANGE_ORDER_COMMAND Coc
|
|||
|
);
|
|||
|
|
|||
|
PGVSN
|
|||
|
VVGetGVsn(
|
|||
|
IN PGEN_TABLE VV,
|
|||
|
IN GUID *Guid
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
VVFreeOutbound(
|
|||
|
IN PGEN_TABLE VV
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
VVFree(
|
|||
|
IN PGEN_TABLE VV
|
|||
|
);
|
|||
|
|
|||
|
#if DBG
|
|||
|
#define VV_PRINT(_Severity_, _Header_, _VV_) \
|
|||
|
DPRINT1(_Severity_, "++ VV_PRINT :%08x\n", _VV_); \
|
|||
|
VVPrint(_Severity_, _Header_, _VV_, FALSE)
|
|||
|
#define VV_PRINT_OUTBOUND(_Severity_, _Header_, _VV_) \
|
|||
|
DPRINT1(_Severity_, "++ VV_PRINT_OUTBOUND :%08x\n", _VV_); \
|
|||
|
VVPrint(_Severity_, _Header_, _VV_, TRUE)
|
|||
|
VOID
|
|||
|
VVPrint(
|
|||
|
IN ULONG Severity,
|
|||
|
IN PWCHAR Header,
|
|||
|
IN PGEN_TABLE VV,
|
|||
|
IN BOOL IsOutbound
|
|||
|
);
|
|||
|
|
|||
|
#else DBG
|
|||
|
|
|||
|
#define VV_PRINT(_Severity_, _Header_, _VV_)
|
|||
|
#define VV_PRINT_OUTBOUND(_Severity_, _Header_, _VV_)
|
|||
|
|
|||
|
#endif DBG
|
|||
|
|
|||
|
//
|
|||
|
// FRS Generic Table Routines
|
|||
|
//
|
|||
|
PGEN_TABLE
|
|||
|
GTabAllocTable(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
PGEN_TABLE
|
|||
|
GTabAllocNumberTable(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
PGEN_TABLE
|
|||
|
GTabAllocStringTable(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
PGEN_TABLE
|
|||
|
GTabAllocStringAndBoolTable(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabEmptyTableNoLock(
|
|||
|
IN PGEN_TABLE GTable,
|
|||
|
IN PVOID (*CallerFree)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabEmptyTable(
|
|||
|
IN PGEN_TABLE GTable,
|
|||
|
IN PVOID (*CallerFree)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
GTabFreeTable(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID (*)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
GTabLookup(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID,
|
|||
|
PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
GTabIsEntryPresent(
|
|||
|
IN PGEN_TABLE GTable,
|
|||
|
IN GUID *Key1,
|
|||
|
IN PWCHAR Key2
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
GTabLookupTableString(
|
|||
|
IN PGEN_TABLE GTable,
|
|||
|
IN PWCHAR Key1,
|
|||
|
IN PWCHAR Key2
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
GTabLookupNoLock(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID,
|
|||
|
PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
PGEN_ENTRY
|
|||
|
GTabLookupEntryNoLock(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID,
|
|||
|
PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
PGEN_ENTRY
|
|||
|
GTabNextEntryNoLock(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
GTabNextDatumNoLock(
|
|||
|
IN PGEN_TABLE GTable,
|
|||
|
IN PVOID *Key
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
GTabNextDatum(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
GTabNumberInTable(
|
|||
|
PGEN_TABLE
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabLockTable(
|
|||
|
PGEN_TABLE
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabUnLockTable(
|
|||
|
PGEN_TABLE
|
|||
|
);
|
|||
|
|
|||
|
PVOID
|
|||
|
GTabInsertUniqueEntry(
|
|||
|
IN PGEN_TABLE GTable,
|
|||
|
IN PVOID NewData,
|
|||
|
IN PVOID Key1,
|
|||
|
IN PVOID Key2
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabInsertEntry(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID,
|
|||
|
PVOID,
|
|||
|
PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabInsertEntryNoLock(
|
|||
|
IN PGEN_TABLE GTable,
|
|||
|
IN PVOID NewData,
|
|||
|
IN PVOID Key1,
|
|||
|
IN PWCHAR Key2
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabDelete(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID,
|
|||
|
PWCHAR,
|
|||
|
PVOID (*)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabDeleteNoLock(
|
|||
|
PGEN_TABLE,
|
|||
|
PVOID,
|
|||
|
PWCHAR,
|
|||
|
PVOID (*)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
GTabPrintTable(
|
|||
|
PGEN_TABLE
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// GNAME
|
|||
|
//
|
|||
|
PVOID
|
|||
|
FrsFreeGName(
|
|||
|
PVOID
|
|||
|
);
|
|||
|
|
|||
|
PGNAME
|
|||
|
FrsBuildGName(
|
|||
|
GUID *,
|
|||
|
PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
PGVSN
|
|||
|
FrsBuildGVsn(
|
|||
|
GUID *,
|
|||
|
ULONGLONG
|
|||
|
);
|
|||
|
|
|||
|
PGNAME
|
|||
|
FrsCopyGName(
|
|||
|
GUID *,
|
|||
|
PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
PGNAME
|
|||
|
FrsDupGName(
|
|||
|
PGNAME
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsPrintGName(
|
|||
|
PGNAME
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsPrintGuid(
|
|||
|
GUID *
|
|||
|
);
|
|||
|
|
|||
|
GUID *
|
|||
|
FrsDupGuid(
|
|||
|
GUID *
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS REPLICA COMMAND SERVER
|
|||
|
//
|
|||
|
|
|||
|
#define FRS_CO_COMM_PROGRESS(_sev, _cmd, _sn, _partner, _text) \
|
|||
|
DPRINT7(_sev, ":: CoG %08x, CxtG %08x, Sn %5d, vsn %08x %08x, FN: %-15ws, [%s], %ws\n", \
|
|||
|
(_cmd)->ChangeOrderGuid.Data1, \
|
|||
|
(_cmd)->CxtionGuid.Data1, \
|
|||
|
(_sn), \
|
|||
|
PRINTQUAD((_cmd)->FrsVsn), \
|
|||
|
(_cmd)->FileName, \
|
|||
|
(_text), \
|
|||
|
(_partner));
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#define FRS_CO_FILE_PROGRESS(_F_, _V_, _M_) \
|
|||
|
DPRINT3(0, ":V: %-11ws (%08x): %s\n", _F_, (ULONG)(_V_), _M_);
|
|||
|
|
|||
|
#define FRS_CO_FILE_PROGRESS_WSTATUS(_F_, _V_, _M_, _W_) \
|
|||
|
DPRINT4(0, ":V: %-11ws (%08x): %s (%d)\n", _F_, (ULONG)(_V_), _M_, _W_);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
RcsInitializeReplicaCmdServer(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsFrsUnInitializeReplicaCmdServer(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsShutDownReplicaCmdServer(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
PREPLICA
|
|||
|
RcsFindReplicaByNumber(
|
|||
|
IN ULONG ReplicaNumber
|
|||
|
);
|
|||
|
|
|||
|
PREPLICA
|
|||
|
RcsFindReplicaByGuid(
|
|||
|
IN GUID *Guid
|
|||
|
);
|
|||
|
|
|||
|
PREPLICA
|
|||
|
RcsFindReplicaById(
|
|||
|
IN ULONG Id
|
|||
|
);
|
|||
|
|
|||
|
PREPLICA
|
|||
|
RcsFindSysVolByName(
|
|||
|
IN PWCHAR ReplicaSetName
|
|||
|
);
|
|||
|
|
|||
|
PREPLICA
|
|||
|
RcsFindSysVolByType(
|
|||
|
IN DWORD ReplicaSetType
|
|||
|
);
|
|||
|
|
|||
|
PREPLICA
|
|||
|
RcsFindNextReplica(
|
|||
|
IN PVOID *Key
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsSubmitReplicaCxtion(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCXTION Cxtion,
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
RcsSubmitReplicaSync(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PREPLICA NewReplica, OPTIONAL
|
|||
|
IN PCXTION VolatileCxtion, OPTIONAL
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsSubmitReplica(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PREPLICA NewReplica, OPTIONAL
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
RcsCreateReplicaSetMember(
|
|||
|
IN PREPLICA Replica
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsMergeReplicaFromDs(
|
|||
|
IN PREPLICA Replica
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsBeginMergeWithDs(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsEndMergeWithDs(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
RcsSubmitCommPktWithErrorToRcs(
|
|||
|
IN PCOMM_PACKET CommPkt
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsSubmitTransferToRcs(
|
|||
|
IN PCOMMAND_PACKET Cmd,
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsCmdPktCompletionRoutine(
|
|||
|
IN PCOMMAND_PACKET Cmd,
|
|||
|
IN PVOID Arg
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsSubmitRemoteCoInstallRetry(
|
|||
|
IN PCHANGE_ORDER_ENTRY Coe
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsSubmitRemoteCoAccepted(
|
|||
|
IN PCHANGE_ORDER_ENTRY Coe
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsSubmitLocalCoAccepted(
|
|||
|
IN PCHANGE_ORDER_ENTRY Coe
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
RcsInboundCommitOk(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCHANGE_ORDER_ENTRY Coe
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
RcsSendCoToOneOutbound(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCXTION Cxtion,
|
|||
|
IN PCHANGE_ORDER_COMMAND Coc
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS COMMAND SERVER
|
|||
|
//
|
|||
|
VOID
|
|||
|
FrsSubmitCommandServer(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
PCOMMAND_PACKET
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
FrsSubmitCommandServerAndWait(
|
|||
|
IN PCOMMAND_SERVER Cs,
|
|||
|
IN PCOMMAND_PACKET Cmd,
|
|||
|
IN ULONG Timeout
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsKickCommandServer(
|
|||
|
PCOMMAND_SERVER
|
|||
|
);
|
|||
|
|
|||
|
PCOMMAND_PACKET
|
|||
|
FrsGetCommandServer(
|
|||
|
PCOMMAND_SERVER
|
|||
|
);
|
|||
|
|
|||
|
PCOMMAND_PACKET
|
|||
|
FrsGetCommandServerIdled(
|
|||
|
IN PCOMMAND_SERVER,
|
|||
|
OUT PFRS_QUEUE *
|
|||
|
);
|
|||
|
|
|||
|
PCOMMAND_PACKET
|
|||
|
FrsGetCommandServerTimeout(
|
|||
|
IN PCOMMAND_SERVER,
|
|||
|
IN ULONG,
|
|||
|
OUT PBOOL
|
|||
|
);
|
|||
|
|
|||
|
PCOMMAND_PACKET
|
|||
|
FrsGetCommandServerTimeoutIdled(
|
|||
|
IN PCOMMAND_SERVER,
|
|||
|
IN ULONG,
|
|||
|
OUT PFRS_QUEUE *,
|
|||
|
OUT PBOOL
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsWaitForCommandServer(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
DWORD
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsExitCommandServer(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
PFRS_THREAD
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsRunDownCommandServer(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
PFRS_QUEUE
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsCancelCommandServer(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
PFRS_QUEUE
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsInitializeCommandServer(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
DWORD,
|
|||
|
PWCHAR,
|
|||
|
DWORD (*)(PVOID)
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsDeleteCommandServer(
|
|||
|
PCOMMAND_SERVER
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS STAGING FILE GENERATOR SERVER
|
|||
|
//
|
|||
|
VOID
|
|||
|
ShutDownStageCs(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsStageCsInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsStageCsUnInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsStageCsSubmitTransfer(
|
|||
|
IN PCOMMAND_PACKET,
|
|||
|
IN USHORT
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
StageDeleteFile(
|
|||
|
IN PCHANGE_ORDER_COMMAND Coc,
|
|||
|
IN BOOL Acquire
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
StageAcquire(
|
|||
|
IN GUID *ChangeOrderGuid,
|
|||
|
IN PWCHAR Name,
|
|||
|
IN ULONGLONG FileSize,
|
|||
|
IN OUT PULONG Flags,
|
|||
|
OUT GUID *CompressionFormatUsed
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
StageRelease(
|
|||
|
IN GUID *ChangeOrderGuid,
|
|||
|
IN PWCHAR Name,
|
|||
|
IN ULONG Flags,
|
|||
|
IN PULONGLONG SizeOfFileGenerated,
|
|||
|
OUT GUID *CompressionFormatUsed
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
StageReleaseNotRecovered(
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
StageReleaseAll(
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
FrsDoesCoAlterNameSpace(
|
|||
|
IN PCHANGE_ORDER_COMMAND Coc
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
FrsDoesCoNeedStage(
|
|||
|
IN PCHANGE_ORDER_COMMAND Coc
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsVerifyVolume(
|
|||
|
IN PWCHAR Name,
|
|||
|
IN PWCHAR SetName,
|
|||
|
IN ULONG Flags
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsDoesDirectoryExist(
|
|||
|
IN PWCHAR Name,
|
|||
|
OUT PDWORD pAttributes
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsCheckForNoReparsePoint(
|
|||
|
IN PWCHAR Name
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsDoesFileExist(
|
|||
|
IN PWCHAR Name
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsCreateDirectory(
|
|||
|
IN PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
StuCreateFile(
|
|||
|
IN PWCHAR,
|
|||
|
OUT PHANDLE
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsDeleteFile(
|
|||
|
IN PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
StuWriteFile(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
IN PVOID,
|
|||
|
IN DWORD
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
StuReadFile(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
IN PVOID,
|
|||
|
IN DWORD,
|
|||
|
IN PULONG
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
StuReadBlockFile(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
IN PVOID,
|
|||
|
IN DWORD
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsSetCompression(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
IN USHORT
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsGetCompression(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
IN PUSHORT
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsSetFilePointer(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
IN ULONG,
|
|||
|
IN ULONG
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsSetFileTime(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
IN FILETIME *,
|
|||
|
IN FILETIME *,
|
|||
|
IN FILETIME *
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsSetEndOfFile(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
FrsGetFileInfoByHandle(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
OUT PFILE_NETWORK_OPEN_INFORMATION
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsFlushFile(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
StuOpenFile(
|
|||
|
IN PWCHAR,
|
|||
|
IN DWORD,
|
|||
|
OUT PHANDLE
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsSetFileAttributes(
|
|||
|
IN PWCHAR,
|
|||
|
IN HANDLE,
|
|||
|
IN ULONG
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
FrsCreateStageName(
|
|||
|
IN GUID *,
|
|||
|
OUT PWCHAR *
|
|||
|
);
|
|||
|
|
|||
|
PWCHAR
|
|||
|
StuCreStgPath(
|
|||
|
IN PWCHAR,
|
|||
|
IN GUID *,
|
|||
|
IN PWCHAR
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
StuInstallRename(
|
|||
|
IN PCHANGE_ORDER_ENTRY,
|
|||
|
IN BOOL,
|
|||
|
IN BOOL
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
StuInstallStage(
|
|||
|
IN PCHANGE_ORDER_ENTRY
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS STAGING FILE FETCHER SERVER
|
|||
|
//
|
|||
|
VOID
|
|||
|
ShutDownFetchCs(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsFetchCsInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsFetchCsSubmitTransfer(
|
|||
|
PCOMMAND_PACKET,
|
|||
|
USHORT
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS STAGING FILE INSTALLER SERVER
|
|||
|
//
|
|||
|
VOID
|
|||
|
ShutDownInstallCs(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsInstallCsInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsInstallCsSubmitTransfer(
|
|||
|
PCOMMAND_PACKET,
|
|||
|
USHORT
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS INITIAL SYNC COOMMAND SERVER
|
|||
|
//
|
|||
|
VOID
|
|||
|
ShutDownInitSyncCs(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
InitSyncCsInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
InitSyncCsSubmitTransfer(
|
|||
|
PCOMMAND_PACKET,
|
|||
|
USHORT
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
InitSyncSubmitToInitSyncCs(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS DELAYED SERVER
|
|||
|
//
|
|||
|
VOID
|
|||
|
FrsDelCsSubmitSubmit(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
PCOMMAND_PACKET,
|
|||
|
ULONG
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsDelQueueSubmit(
|
|||
|
IN PCOMMAND_PACKET DelCmd,
|
|||
|
IN ULONG Timeout
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsDelCsSubmitUnIdled(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
PFRS_QUEUE,
|
|||
|
ULONG
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsDelCsSubmitKick(
|
|||
|
PCOMMAND_SERVER,
|
|||
|
PFRS_QUEUE,
|
|||
|
ULONG
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ShutDownDelCs(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsDelCsInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS COMM SUBSYSTEM
|
|||
|
//
|
|||
|
BOOL
|
|||
|
CommCheckPkt(
|
|||
|
PCOMM_PACKET
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
CommDumpCommPkt(
|
|||
|
PCOMM_PACKET,
|
|||
|
DWORD
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// FRS utilities
|
|||
|
//
|
|||
|
DWORD
|
|||
|
FrsForceOpenId(
|
|||
|
OUT PHANDLE Handle,
|
|||
|
OUT OVERLAPPED *OpLock,
|
|||
|
IN PVOLUME_MONITOR_ENTRY pVme,
|
|||
|
IN PVOID Id,
|
|||
|
IN DWORD IdLen,
|
|||
|
IN ACCESS_MASK DesiredAccess,
|
|||
|
IN ULONG CreateOptions,
|
|||
|
IN ULONG ShareMode,
|
|||
|
IN ULONG CreateDispostion
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsRenameByHandle(
|
|||
|
IN PWCHAR Name,
|
|||
|
IN ULONG NameLen,
|
|||
|
IN HANDLE Handle,
|
|||
|
IN HANDLE TargetHandle,
|
|||
|
IN BOOL ReplicaIfExists
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsDeleteByHandle(
|
|||
|
IN PWCHAR Name,
|
|||
|
IN HANDLE Handle
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsCheckObjectId(
|
|||
|
IN PWCHAR Name,
|
|||
|
IN HANDLE Handle,
|
|||
|
IN GUID *Guid
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsOpenBaseNameForInstall(
|
|||
|
IN PCHANGE_ORDER_ENTRY Coe,
|
|||
|
OUT HANDLE *Handle
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
FrsGetObjectId(
|
|||
|
IN HANDLE Handle,
|
|||
|
OUT PFILE_OBJECTID_BUFFER ObjectIdBuffer
|
|||
|
);
|
|||
|
|
|||
|
#define GENERIC_PREFIX L"NTFRS_"
|
|||
|
#define STAGE_FINAL_PREFIX GENERIC_PREFIX
|
|||
|
#define STAGE_FINAL_COMPRESSED_PREFIX L"NTFRS_CMP_"
|
|||
|
#define PRE_INSTALL_PREFIX GENERIC_PREFIX
|
|||
|
#define STAGE_GENERATE_PREFIX L"NTFRS_G_"
|
|||
|
#define STAGE_GENERATE_COMPRESSED_PREFIX L"NTFRS_G_CMP_"
|
|||
|
|
|||
|
PWCHAR
|
|||
|
FrsCreateGuidName(
|
|||
|
IN GUID *Guid,
|
|||
|
IN PWCHAR Prefix
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// MISC
|
|||
|
//
|
|||
|
VOID
|
|||
|
FrsDsSwapPtrs(
|
|||
|
PVOID *,
|
|||
|
PVOID *
|
|||
|
);
|
|||
|
#if DBG
|
|||
|
#define INITIALIZE_HARD_WIRED() FrsDsInitializeHardWired()
|
|||
|
VOID
|
|||
|
FrsDsInitializeHardWired(
|
|||
|
VOID
|
|||
|
);
|
|||
|
#else DBG
|
|||
|
#define INITIALIZE_HARD_WIRED()
|
|||
|
#endif DBG
|
|||
|
|
|||
|
//
|
|||
|
// Outbound Log Processor
|
|||
|
//
|
|||
|
ULONG
|
|||
|
OutLogSubmit(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN PCXTION Cxtion,
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Database
|
|||
|
//
|
|||
|
JET_ERR
|
|||
|
DbsUpdateTable(
|
|||
|
IN PTABLE_CTX TableCtx
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
DbsPackSchedule(
|
|||
|
IN PSCHEDULE Schedule,
|
|||
|
IN ULONG Fieldx,
|
|||
|
IN PTABLE_CTX TableCtx
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
DbsPackStrW(
|
|||
|
IN PWCHAR StrW,
|
|||
|
IN ULONG Fieldx,
|
|||
|
IN PTABLE_CTX TableCtx
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
DbsUnPackStrW(
|
|||
|
OUT PWCHAR *StrW,
|
|||
|
IN ULONG Fieldx,
|
|||
|
IN PTABLE_CTX TableCtx
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// The subsystem commands below apply to an entire subsystem, e.g. the
|
|||
|
// journal. Some of the commands may not apply to a subsystem.
|
|||
|
// The service level commands are the means to tell a subsystem that you
|
|||
|
// want the subsystem to provide/perform a given service. For example
|
|||
|
// a PREPARE_SERVICE command sent to the Journal subsystem tells the
|
|||
|
// journal to initialize journalling for a specified replica set. Multiple
|
|||
|
// prepare service commands are sent when the FRS first starts up. They are
|
|||
|
// then followed by a START_SUBSYSTEM command. This way the journal knows
|
|||
|
// to start processing the USN journal on a gvien volume at the lowest
|
|||
|
// CommitUsn point for ANY replica set hosted by the volume.
|
|||
|
//
|
|||
|
// Some commands may not be implemented by all subsystems. For example
|
|||
|
// the PAUSE_SERVICE command is not provided for a single replica set
|
|||
|
// as long as the FRS is running because we have to continuously monitor
|
|||
|
// the journal so as not to lose data. Some subsystems may not have any
|
|||
|
// service level commands.
|
|||
|
//
|
|||
|
|
|||
|
#define CMD_COMMAND_ERROR 0x00
|
|||
|
|
|||
|
#define CMD_INIT_SUBSYSTEM 0x01
|
|||
|
#define CMD_START_SUBSYSTEM 0x02
|
|||
|
#define CMD_STOP_SUBSYSTEM 0x03
|
|||
|
#define CMD_PAUSE_SUBSYSTEM 0x04
|
|||
|
#define CMD_QUERY_INFO_SUBSYSTEM 0x05
|
|||
|
#define CMD_SET_CONFIG_SUBSYSTEM 0x06
|
|||
|
#define CMD_QUERY_CONFIG_SUBSYSTEM 0x07
|
|||
|
#define CMD_CANCEL_COMMAND_SUBSYSTEM 0x08
|
|||
|
#define CMD_READ_SUBSYSTEM 0x09
|
|||
|
#define CMD_WRITE_SUBSYSTEM 0x0A
|
|||
|
|
|||
|
#define CMD_PREPARE_SERVICE1 0x21
|
|||
|
#define CMD_PREPARE_SERVICE2 0x22
|
|||
|
#define CMD_START_SERVICE 0x23
|
|||
|
#define CMD_STOP_SERVICE 0x24
|
|||
|
#define CMD_PAUSE_SERVICE 0x25
|
|||
|
#define CMD_QUERY_INFO_SERVICE 0x26
|
|||
|
#define CMD_SET_CONFIG_SERVICE 0x27
|
|||
|
#define CMD_QUERY_CONFIG_SERVICE 0x28
|
|||
|
#define CMD_CANCEL_COMMAND_SERVICE 0x29
|
|||
|
#define CMD_READ_SERVICE 0x2A
|
|||
|
#define CMD_WRITE_SERVICE 0x2B
|
|||
|
#define CMD_RESYNC_SERVICE 0x2C
|
|||
|
#define CMD_VERIFY_SERVICE 0x2D
|
|||
|
|
|||
|
extern FRS_QUEUE JournalProcessQueue;
|
|||
|
extern FRS_QUEUE DBServiceProcessQueue;
|
|||
|
|
|||
|
//
|
|||
|
// Service UNIQUE Commands start at 0x100 for each service.
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the Journal service. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
#define CMD_JOURNAL_PAUSED 0x101
|
|||
|
#define CMD_JOURNAL_INIT_ONE_RS 0x102
|
|||
|
#define CMD_JOURNAL_DELETE_DIR_FILTER_ENTRY 0x103
|
|||
|
#define CMD_JOURNAL_CLEAN_WRITE_FILTER 0x104
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the Database service. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
#define CMD_CLOSE_TABLE 0x101
|
|||
|
#define CMD_UPDATE_RECORD_FIELDS 0x102
|
|||
|
#define CMD_UPDATE_TABLE_RECORD 0x103
|
|||
|
#define CMD_INSERT_TABLE_RECORD 0x104
|
|||
|
#define CMD_READ_TABLE_RECORD 0x105
|
|||
|
#define CMD_CREATE_REPLICA_SET_MEMBER 0x106
|
|||
|
#define CMD_OPEN_REPLICA_SET_MEMBER 0x107
|
|||
|
#define CMD_CLOSE_REPLICA_SET_MEMBER 0x108
|
|||
|
#define CMD_LOAD_REPLICA_FILE_TREE 0x109
|
|||
|
#define CMD_DELETE_REPLICA_SET_MEMBER 0x10A
|
|||
|
#define CMD_DELETE_TABLE_RECORD 0x10B
|
|||
|
#define CMD_CREATE_START_NEW_MEMBER 0x10C
|
|||
|
#define CMD_LOAD_ONE_REPLICA_FILE_TREE 0x10D
|
|||
|
#define CMD_STOP_REPLICATION_SINGLE_REPLICA 0x10E
|
|||
|
#define CMD_DBS_RETIRE_INBOUND_CO 0x10F
|
|||
|
#define CMD_DBS_RETRY_INBOUND_CO 0x110
|
|||
|
#define CMD_DBS_RETIRE_REJECTED_CO 0x111
|
|||
|
#define CMD_UPDATE_REPLICA_SET_MEMBER 0x112
|
|||
|
#define CMD_DBS_REPLICA_SAVE_MARK 0x113
|
|||
|
#define CMD_DBS_INJECT_OUTBOUND_CO 0x114
|
|||
|
#define CMD_DBS_REPLICA_SERVICE_STATE_SAVE 0x115
|
|||
|
|
|||
|
//
|
|||
|
// Given a ptr to a DB_SERVICE_REQUEST return the ptr to the data record.
|
|||
|
//
|
|||
|
#define DBS_GET_RECORD_ADDRESS(_DbsRequest) \
|
|||
|
((_DbsRequest)->TableCtx->pDataRecord)
|
|||
|
|
|||
|
#define DBS_GET_TABLECTX(_DbsRequest) \
|
|||
|
((_DbsRequest)->TableCtx)
|
|||
|
|
|||
|
#define DBS_FREE_TABLECTX(_DbsRequest) \
|
|||
|
DbsFreeTableCtx((_DbsRequest)->TableCtx, COMMAND_PACKET_TYPE); \
|
|||
|
(_DbsRequest)->TableCtx = FrsFree((_DbsRequest)->TableCtx);
|
|||
|
|
|||
|
//
|
|||
|
// The following access macros assume that the field buffers used for the record
|
|||
|
// read and write operations are the same. That is that both the Jet Set and
|
|||
|
// Ret structs point to the same buffer. They each take a table ctx parameter
|
|||
|
// and a record field ID code (defined as an ENUM in schema.h).
|
|||
|
//
|
|||
|
|
|||
|
// Get the field's receive buffer length.
|
|||
|
|
|||
|
#define DBS_GET_FIELD_SIZE(_TableCtx, _Field) \
|
|||
|
((_TableCtx)->pJetRetCol[_Field].cbActual)
|
|||
|
|
|||
|
// Get the field's maximum buffer length.
|
|||
|
|
|||
|
#define DBS_GET_FIELD_SIZE_MAX( _TableCtx, _Field) \
|
|||
|
((_TableCtx)->pJetRetCol[_Field].cbData)
|
|||
|
|
|||
|
// Get the address of the field's buffer.
|
|||
|
|
|||
|
#define DBS_GET_FIELD_ADDRESS( _TableCtx, _Field) \
|
|||
|
((_TableCtx)->pJetRetCol[_Field].pvData)
|
|||
|
|
|||
|
//
|
|||
|
// Set the size of the data in the field buffer.
|
|||
|
// Warning - Don't do this on fixed size fields.
|
|||
|
//
|
|||
|
#define DBS_SET_FIELD_SIZE(_TableCtx, _Field, _NewSize) \
|
|||
|
(_TableCtx)->pJetRetCol[_Field].cbActual = _NewSize; \
|
|||
|
(_TableCtx)->pJetSetCol[_Field].cbData = _NewSize;
|
|||
|
|
|||
|
//
|
|||
|
// Set the maximum size of the field buffer.
|
|||
|
// Warning - Don't do this on fixed size fields.
|
|||
|
// Warning - ONLY USE IF YOU KNOW WHAT YOU'RE DOING OTHERWISE USE DBS_REALLOC_FIELD
|
|||
|
//
|
|||
|
#define DBS_SET_FIELD_SIZE_MAX(_TableCtx, _Field, _NewSize) \
|
|||
|
(_TableCtx)->pJetRetCol[_Field].cbData = _NewSize;
|
|||
|
|
|||
|
// Set the address of the field's buffer. It doesn't update the ptr in base record.
|
|||
|
// Warning - Don't do this on fixed size fields.
|
|||
|
// Warning - ONLY USE IF YOU KNOW WHAT YOU'RE DOING OTHERWISE USE DBS_REALLOC_FIELD
|
|||
|
|
|||
|
#define DBS_SET_FIELD_ADDRESS( _TableCtx, _Field, _NewAddr) \
|
|||
|
(_TableCtx)->pJetRetCol[_Field].pvData = _NewAddr; \
|
|||
|
(_TableCtx)->pJetSetCol[_Field].pvData = _NewAddr;
|
|||
|
|
|||
|
//
|
|||
|
// Reallocate the buffer size for a variable length binary field.
|
|||
|
// Set _NewSize to zero to delete the buffer.
|
|||
|
// Set _KeepData to TRUE if you want to copy the data from the old buffer to the new.
|
|||
|
// This function also updates the buffer pointer in the base record.
|
|||
|
//
|
|||
|
#define DBS_REALLOC_FIELD(_TableCtx, _FieldIndex, _NewSize, _KeepData) \
|
|||
|
DbsTranslateJetError(DbsReallocateFieldBuffer(_TableCtx, \
|
|||
|
_FieldIndex, \
|
|||
|
_NewSize, \
|
|||
|
_KeepData), TRUE)
|
|||
|
|
|||
|
#define DBS_ACCESS_BYKEY 0
|
|||
|
#define DBS_ACCESS_FIRST 1
|
|||
|
#define DBS_ACCESS_LAST 2
|
|||
|
#define DBS_ACCESS_NEXT 3
|
|||
|
|
|||
|
#define DBS_ACCESS_MASK (0xF)
|
|||
|
|
|||
|
//
|
|||
|
// If set the close the table after completing the operation.
|
|||
|
//
|
|||
|
#define DBS_ACCESS_CLOSE (0x80000000)
|
|||
|
//
|
|||
|
// If set then free the table context struct and the data record struct
|
|||
|
// after completing the operation. Useful on record inserts and the table
|
|||
|
// close command. (CMD_CLOSE_TABLE)
|
|||
|
//
|
|||
|
#define DBS_ACCESS_FREE_TABLECTX (0x40000000)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the Outbound Log subsystem. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
#define CMD_OUTLOG_WORK_CO 0x100
|
|||
|
#define CMD_OUTLOG_ADD_REPLICA 0x101
|
|||
|
#define CMD_OUTLOG_REMOVE_REPLICA 0x102
|
|||
|
#define CMD_OUTLOG_INIT_PARTNER 0x103
|
|||
|
#define CMD_OUTLOG_ADD_NEW_PARTNER 0x104
|
|||
|
#define CMD_OUTLOG_DEACTIVATE_PARTNER 0x105
|
|||
|
#define CMD_OUTLOG_ACTIVATE_PARTNER 0x106
|
|||
|
#define CMD_OUTLOG_CLOSE_PARTNER 0x107
|
|||
|
#define CMD_OUTLOG_REMOVE_PARTNER 0x108
|
|||
|
#define CMD_OUTLOG_RETIRE_CO 0x109
|
|||
|
#define CMD_OUTLOG_UPDATE_PARTNER 0x10A
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the test subsystem. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
#define CMD_NOP 0x100
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the replica command server *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
//
|
|||
|
//
|
|||
|
#define CMD_UNKNOWN 0x100
|
|||
|
#define CMD_START 0x108
|
|||
|
#define CMD_DELETE 0x110
|
|||
|
#define CMD_DELETE_RETRY 0x112
|
|||
|
#define CMD_DELETE_NOW 0x114
|
|||
|
#define CMD_START_REPLICAS 0x118
|
|||
|
#define CMD_CHECK_SCHEDULES 0x119
|
|||
|
|
|||
|
#define CMD_JOIN_CXTION 0x120
|
|||
|
#define CMD_NEED_JOIN 0x121
|
|||
|
#define CMD_START_JOIN 0x122
|
|||
|
#define CMD_JOINED 0x128
|
|||
|
#define CMD_JOINING 0x130
|
|||
|
#define CMD_JOINING_AFTER_FLUSH 0x131
|
|||
|
#define CMD_VVJOIN_START 0x132
|
|||
|
#define CMD_VVJOIN_SUCCESS 0x134
|
|||
|
#define CMD_VVJOIN_DONE 0x136
|
|||
|
#define CMD_VVJOIN_DONE_UNJOIN 0x138
|
|||
|
#define CMD_UNJOIN 0x140
|
|||
|
#define CMD_UNJOIN_REMOTE 0x148
|
|||
|
#define CMD_CHECK_PROMOTION 0x150
|
|||
|
#define CMD_HUNG_CXTION 0x160
|
|||
|
|
|||
|
#define CMD_LOCAL_CO_ACCEPTED 0x200
|
|||
|
#define CMD_CREATE_STAGE 0x210
|
|||
|
#define CMD_CREATE_EXISTING 0x212
|
|||
|
#define CMD_CHECK_OID 0x214
|
|||
|
#define CMD_REMOTE_CO 0x218
|
|||
|
#define CMD_REMOTE_CO_ACCEPTED 0x220
|
|||
|
#define CMD_SEND_STAGE 0x228
|
|||
|
#define CMD_SENDING_STAGE 0x230
|
|||
|
#define CMD_RECEIVING_STAGE 0x238
|
|||
|
#define CMD_RECEIVED_STAGE 0x240
|
|||
|
#define CMD_CREATED_EXISTING 0x242
|
|||
|
#define CMD_RETRY_STAGE 0x243
|
|||
|
#define CMD_RETRY_FETCH 0x244
|
|||
|
#define CMD_SEND_RETRY_FETCH 0x245
|
|||
|
#define CMD_ABORT_FETCH 0x246
|
|||
|
#define CMD_SEND_ABORT_FETCH 0x247
|
|||
|
#define CMD_INSTALL_STAGE 0x248
|
|||
|
#define CMD_REMOTE_CO_DONE 0x250
|
|||
|
|
|||
|
|
|||
|
/*****************************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the init sync controller command server *
|
|||
|
* *
|
|||
|
*****************************************************************/
|
|||
|
// sequence break
|
|||
|
//
|
|||
|
//
|
|||
|
#define CMD_INITSYNC_START_SYNC 0x100
|
|||
|
#define CMD_INITSYNC_JOIN_NEXT 0x101
|
|||
|
#define CMD_INITSYNC_START_JOIN 0x102
|
|||
|
#define CMD_INITSYNC_VVJOIN_DONE 0x103
|
|||
|
#define CMD_INITSYNC_KEEP_ALIVE 0x104
|
|||
|
#define CMD_INITSYNC_CHECK_PROGRESS 0x105
|
|||
|
#define CMD_INITSYNC_UNJOIN 0x106
|
|||
|
#define CMD_INITSYNC_JOINED 0x107
|
|||
|
#define CMD_INITSYNC_COMM_TIMEOUT 0x108
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the Delayed command server. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
//
|
|||
|
#define CMD_DELAYED_SUBMIT 0x100
|
|||
|
#define CMD_DELAYED_UNIDLED 0x101
|
|||
|
#define CMD_DELAYED_KICK 0x102
|
|||
|
#define CMD_DELAYED_QUEUE_SUBMIT 0x103
|
|||
|
#define CMD_DELAYED_COMPLETE 0x104
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the DS command server. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
//
|
|||
|
#define CMD_POLL_DS 0x100
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the thread command server. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
//
|
|||
|
#define CMD_WAIT 0x100
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the Send command server. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
//
|
|||
|
#define CMD_SND_COMM_PACKET 0x100
|
|||
|
#define CMD_SND_CMD 0x110
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the Receive command server. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
//
|
|||
|
#define CMD_RECEIVE 0x100
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Commands specific to the staging area command server. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
// sequence break
|
|||
|
//
|
|||
|
#define CMD_ALLOC_STAGING 0x100
|
|||
|
#define CMD_FREE_STAGING 0x101
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/***********************************************************
|
|||
|
* *
|
|||
|
* Completion routine types for use in command packets. *
|
|||
|
* *
|
|||
|
***********************************************************/
|
|||
|
//
|
|||
|
//
|
|||
|
#define COMPLETION_INVOKE_ON_CANCEL 0x20
|
|||
|
#define COMPLETION_INVOKE_ON_SUCCESS 0x40
|
|||
|
#define COMPLETION_INVOKE_ON_ERROR 0x80
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
VOID
|
|||
|
FrsSetCompletionRoutine(
|
|||
|
IN PCOMMAND_PACKET CmdPkt,
|
|||
|
IN PCOMMAND_PACKET_COMPLETION_ROUTINE CompletionRoutine,
|
|||
|
IN PVOID Context,
|
|||
|
IN BOOLEAN InvokeOnSuccess,
|
|||
|
IN BOOLEAN InvokeOnError,
|
|||
|
IN BOOLEAN InvokeOnCancel
|
|||
|
)
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine is invoked to set the address of a completion routine which
|
|||
|
is to be invoked when a command packet has been completed by a
|
|||
|
subsystem.
|
|||
|
|
|||
|
If the completion routine and the completion queue are both null then
|
|||
|
the packet is freed at completion.
|
|||
|
|
|||
|
If both are specified the completion routine is called first and on
|
|||
|
return the packet is placed on the CompletionQueue. The Completion
|
|||
|
routine can of course modify the CompletionQueue.
|
|||
|
|
|||
|
If a Completion Routine is provided then the packet is never freed
|
|||
|
by the command packet completion dispatchet. This is the responsibility
|
|||
|
of the completion routine.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
CmdPkt - Pointer to the Command Packet itself.
|
|||
|
|
|||
|
CompletionRoutine - Address of the completion routine that is to be
|
|||
|
invoked once the command packet is completed.
|
|||
|
|
|||
|
Context - Specifies a context parameter to be passed to the completion
|
|||
|
routine.
|
|||
|
|
|||
|
InvokeOnSuccess - Specifies that the completion routine is invoked when the
|
|||
|
operation is successfully completed.
|
|||
|
|
|||
|
InvokeOnError - Specifies that the completion routine is invoked when the
|
|||
|
operation completes with an error status.
|
|||
|
|
|||
|
InvokeOnCancel - Specifies that the completion routine is invoked when the
|
|||
|
operation is being canceled.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#define FrsSetCompletionRoutine(_CmdPkt, _CompletionRoutine, _CompletionArg) { \
|
|||
|
(_CmdPkt)->CompletionRoutine = (_CompletionRoutine); \
|
|||
|
(_CmdPkt)->CompletionArg = (_CompletionArg); \
|
|||
|
}
|
|||
|
|
|||
|
#define FrsSetCommandErrorStatus(_CmdPkt, _Status ) \
|
|||
|
(_CmdPkt)->FrsErrorStatus = (_Status)
|
|||
|
|
|||
|
#define FrsSetCommand( _CmdPkt, _Queue, _Command, _Flags) { \
|
|||
|
(_CmdPkt)->TargetQueue = (_Queue); \
|
|||
|
(_CmdPkt)->Command = (USHORT) (_Command); \
|
|||
|
(_CmdPkt)->Flags = (UCHAR) (_Flags); \
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Mark this command request as synchronous.
|
|||
|
//
|
|||
|
#define FrsSetCommandSynchronous( _CmdPkt) \
|
|||
|
(_CmdPkt)->Flags |= CMD_PKT_FLAGS_SYNC;
|
|||
|
|
|||
|
//
|
|||
|
// The following are special queues for handling commands.
|
|||
|
//
|
|||
|
VOID
|
|||
|
FrsSubmitCommand(
|
|||
|
IN PCOMMAND_PACKET CmdPkt,
|
|||
|
IN BOOL Headwise
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
FrsSubmitCommandAndWait(
|
|||
|
IN PCOMMAND_PACKET Cmd,
|
|||
|
IN BOOL Headwise,
|
|||
|
IN ULONG Timeout
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsUnSubmitCommand(
|
|||
|
IN PCOMMAND_PACKET CmdPkt
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsCompleteCommand(
|
|||
|
IN PCOMMAND_PACKET CmdPkt,
|
|||
|
IN DWORD ErrorStatus
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsCommandScheduler(
|
|||
|
PFRS_QUEUE Queue
|
|||
|
);
|
|||
|
|
|||
|
PCOMMAND_PACKET
|
|||
|
FrsAllocCommand(
|
|||
|
IN PFRS_QUEUE TargetQueue,
|
|||
|
IN USHORT Command
|
|||
|
);
|
|||
|
|
|||
|
PCOMMAND_PACKET
|
|||
|
FrsAllocCommandEx(
|
|||
|
IN PFRS_QUEUE TargetQueue,
|
|||
|
IN USHORT Command,
|
|||
|
IN ULONG Size
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsFreeCommand(
|
|||
|
IN PCOMMAND_PACKET Cmd,
|
|||
|
IN PVOID Arg
|
|||
|
);
|
|||
|
|
|||
|
PCOMMAND_PACKET
|
|||
|
FrsGetCommand(
|
|||
|
IN PFRS_QUEUE Queue,
|
|||
|
IN DWORD MilliSeconds
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
FrsRunDownCommand(
|
|||
|
IN PFRS_QUEUE Queue
|
|||
|
);
|
|||
|
|
|||
|
extern FRS_QUEUE FrsScheduleQueue;
|
|||
|
|
|||
|
//
|
|||
|
// Some Journal related functions.
|
|||
|
//
|
|||
|
ULONG
|
|||
|
JrnlMonitorInit(
|
|||
|
PFRS_QUEUE ReplicaListHead,
|
|||
|
ULONG Phase
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
JrnlPauseVolume(
|
|||
|
IN PVOLUME_MONITOR_ENTRY pVme,
|
|||
|
IN DWORD MilliSeconds
|
|||
|
);
|
|||
|
|
|||
|
ULONG
|
|||
|
JrnlUnPauseVolume(
|
|||
|
IN PVOLUME_MONITOR_ENTRY pVme,
|
|||
|
IN PJBUFFER Jbuff,
|
|||
|
IN BOOL HaveLock
|
|||
|
);
|
|||
|
|
|||
|
BOOL
|
|||
|
JrnlSetReplicaState(
|
|||
|
IN PREPLICA Replica,
|
|||
|
IN ULONG NewState
|
|||
|
);
|
|||
|
|
|||
|
#if DBG
|
|||
|
#define DUMP_USN_RECORD2(_Severity, _UsnRecord, _ReplicaNum, _LocCmd) \
|
|||
|
DumpUsnRecord(_Severity, _UsnRecord, _ReplicaNum, _LocCmd, DEBSUB, __LINE__)
|
|||
|
|
|||
|
#define DUMP_USN_RECORD(_Severity, _UsnRecord) \
|
|||
|
DumpUsnRecord(_Severity, _UsnRecord, 0, CO_LOCATION_NUM_CMD, DEBSUB, __LINE__)
|
|||
|
|
|||
|
VOID
|
|||
|
DumpUsnRecord(
|
|||
|
IN ULONG Severity,
|
|||
|
IN PUSN_RECORD UsnRecord,
|
|||
|
IN ULONG ReplicaNumber,
|
|||
|
IN ULONG LocationCmd,
|
|||
|
IN PCHAR Debsub,
|
|||
|
IN ULONG uLineNo
|
|||
|
);
|
|||
|
|
|||
|
#else DBG
|
|||
|
#define DUMP_USN_RECORD(_Severity, _UsnRecord)
|
|||
|
#endif DBG
|
|||
|
|
|||
|
ULONG
|
|||
|
ChgOrdInsertRemoteCo(
|
|||
|
IN PCOMMAND_PACKET Cmd,
|
|||
|
IN PCXTION Cxtion
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
ChgOrdHammerObjectId(
|
|||
|
IN PWCHAR Name,
|
|||
|
IN PVOID Id,
|
|||
|
IN DWORD IdLen,
|
|||
|
IN PVOLUME_MONITOR_ENTRY pVme,
|
|||
|
IN BOOL CallerSupplied,
|
|||
|
OUT USN *Usn,
|
|||
|
IN OUT PFILE_OBJECTID_BUFFER FileObjID,
|
|||
|
IN OUT BOOL *ExistingOid
|
|||
|
);
|
|||
|
|
|||
|
DWORD
|
|||
|
ChgOrdSkipBasicInfoChange(
|
|||
|
IN PCHANGE_ORDER_ENTRY Coe,
|
|||
|
IN PBOOL SkipCo
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
JrnlCleanupVme(
|
|||
|
IN PVOLUME_MONITOR_ENTRY pVme
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Waitable timer list
|
|||
|
//
|
|||
|
DWORD
|
|||
|
WaitSubmit(
|
|||
|
IN PCOMMAND_PACKET Cmd,
|
|||
|
IN DWORD Timeout,
|
|||
|
IN USHORT TimeoutCommand
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
WaitUnsubmit(
|
|||
|
IN PCOMMAND_PACKET Cmd
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
WaitInitialize(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
ShutDownWait(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
#endif // _FRSH_
|