6 Appendix A: Full IDL
The Distributed File System: Replication (DFS-R) Protocol contains one interface, whose IDL definition is listed in this section. The IDL definition for this interface imports the "ms-dtyp.idl" file, as specified in [MS-DTYP] section 2.2.5.3.4.3.
-
import "ms-dtyp.idl"; #define FRS_COMMUNICATION_PROTOCOL_VERSION_W2K3R2 0x00050000 #define FRS_COMMUNICATION_PROTOCOL_VERSION_LONGHORN_SERVER 0x00050002 #define FRS_COMMUNICATION_PROTOCOL_WIN8_SERVER 0x00050003 #define FRS_COMMUNICATION_PROTOCOL_WINBLUE_SERVER 0x00050004 #define CONFIG_RDC_VERSION (1) #define CONFIG_RDC_VERSION_COMPATIBLE (1) #define CONFIG_FILEHASH_DATASIZE (20) #define CONFIG_RDC_SIMILARITY_DATASIZE (16) #define CONFIG_RDC_HORIZONSIZE_MIN (128) #define CONFIG_RDC_HORIZONSIZE_MAX (1024*16) #define CONFIG_RDC_HASHWINDOWSIZE_MIN (2) #define CONFIG_RDC_HASHWINDOWSIZE_MAX (96) #define CONFIG_RDC_MAX_LEVELS (8) #define CONFIG_RDC_MAX_NEEDLENGTH (65536) #define CONFIG_TRANSPORT_MAX_BUFFER_SIZE (262144) #define CONFIG_RDC_NEED_QUEUE_SIZE (20) #define TRUE 1 #define FALSE 0 typedef GUID FRS_REPLICA_SET_ID; typedef GUID FRS_CONTENT_SET_ID; typedef GUID FRS_DATABASE_ID; typedef GUID FRS_MEMBER_ID; typedef GUID FRS_CONNECTION_ID; typedef SYSTEMTIME EPOQUE; typedef struct _FRS_VERSION_VECTOR { GUID dbGuid; DWORDLONG low; DWORDLONG high; } FRS_VERSION_VECTOR; typedef struct _FRS_EPOQUE_VECTOR { GUID machine; EPOQUE epoque; } FRS_EPOQUE_VECTOR; typedef struct _FRS_ID_GVSN { GUID uidDbGuid; DWORDLONG uidVersion; GUID gvsnDbGuid; DWORDLONG gvsnVersion; } FRS_ID_GVSN; typedef struct _FRS_UPDATE { long present; long nameConflict; unsigned long attributes; FILETIME fence; FILETIME clock; FILETIME createTime; FRS_CONTENT_SET_ID contentSetId; unsigned char hash[CONFIG_FILEHASH_DATASIZE]; unsigned char rdcSimilarity[CONFIG_RDC_SIMILARITY_DATASIZE]; GUID uidDbGuid; DWORDLONG uidVersion; GUID gvsnDbGuid; DWORDLONG gvsnVersion; GUID parentDbGuid; DWORDLONG parentVersion; [string] WCHAR name[260+1]; long flags; } FRS_UPDATE; typedef struct _FRS_UPDATE_CANCEL_DATA { FRS_UPDATE blockingUpdate; FRS_CONTENT_SET_ID contentSetId; FRS_DATABASE_ID gvsnDatabaseId; FRS_DATABASE_ID uidDatabaseId; FRS_DATABASE_ID parentDatabaseId; DWORDLONG gvsnVersion; DWORDLONG uidVersion; DWORDLONG parentVersion; unsigned long cancelType; long isUidValid; long isParentUidValid; long isBlockerValid; } FRS_UPDATE_CANCEL_DATA; typedef struct _FRS_RDC_SOURCE_NEED { ULONGLONG needOffset; ULONGLONG needSize; } FRS_RDC_SOURCE_NEED; typedef enum { TRANSPORT_SUPPORTS_RDC_SIMILARITY = 1 } TransportFlags; typedef enum { RDC_UNCOMPRESSED = 0, RDC_XPRESS = 1 } RDC_FILE_COMPRESSION_TYPES; typedef enum { RDC_FILTERGENERIC = 0, RDC_FILTERMAX = 1, RDC_FILTERPOINT = 2, RDC_MAXALGORITHM = 3 } RDC_CHUNKER_ALGORITHM; typedef enum { UPDATE_REQUEST_ALL = 0, UPDATE_REQUEST_TOMBSTONES = 1, UPDATE_REQUEST_LIVE = 2 } UPDATE_REQUEST_TYPE; typedef enum { UPDATE_STATUS_DONE = 2, UPDATE_STATUS_MORE = 3 } UPDATE_STATUS; typedef enum { RECORDS_STATUS_DONE = 0, RECORDS_STATUS_MORE = 1 } RECORDS_STATUS; typedef enum { REQUEST_NORMAL_SYNC = 0, REQUEST_SLOW_SYNC = 1, REQUEST_SUBORDINATE_SYNC = 2 } VERSION_REQUEST_TYPE; typedef enum { CHANGE_NOTIFY = 0, CHANGE_ALL = 2 } VERSION_CHANGE_TYPE; typedef enum { SERVER_DEFAULT = 0, STAGING_REQUIRED = 1, RESTAGING_REQUIRED = 2 } FRS_REQUESTED_STAGING_POLICY; typedef struct _FRS_RDC_PARAMETERS_FILTERMAX { [range(CONFIG_RDC_HORIZONSIZE_MIN, CONFIG_RDC_HORIZONSIZE_MAX)] unsigned short horizonSize; [range(CONFIG_RDC_HASHWINDOWSIZE_MIN, CONFIG_RDC_HASHWINDOWSIZE_MAX)] unsigned short windowSize; } FRS_RDC_PARAMETERS_FILTERMAX; typedef struct _FRS_RDC_PARAMETERS_FILTERPOINT { unsigned short minChunkSize; unsigned short maxChunkSize; } FRS_RDC_PARAMETERS_FILTERPOINT; typedef struct _FRS_RDC_PARAMETERS_GENERIC { unsigned short chunkerType; byte chunkerParameters[64]; } FRS_RDC_PARAMETERS_GENERIC; typedef struct { unsigned short rdcChunkerAlgorithm; [switch_is(rdcChunkerAlgorithm)] union { [case(RDC_FILTERGENERIC)] FRS_RDC_PARAMETERS_GENERIC filterGeneric; [case(RDC_FILTERMAX)] FRS_RDC_PARAMETERS_FILTERMAX filterMax; [case(RDC_FILTERPOINT)] FRS_RDC_PARAMETERS_FILTERPOINT filterPoint; } u; } FRS_RDC_PARAMETERS; typedef struct _FRS_RDC_FILEINFO { DWORDLONG onDiskFileSize; DWORDLONG fileSizeEstimate; unsigned short rdcVersion; unsigned short rdcMinimumCompatibleVersion; [range(0, CONFIG_RDC_MAX_LEVELS)] byte rdcSignatureLevels; RDC_FILE_COMPRESSION_TYPES compressionAlgorithm; [size_is(rdcSignatureLevels)] FRS_RDC_PARAMETERS rdcFilterParameters[*]; } FRS_RDC_FILEINFO; typedef struct _FRS_ASYNC_VERSION_VECTOR_RESPONSE { ULONGLONG vvGeneration; unsigned long versionVectorCount; [size_is(versionVectorCount)] FRS_VERSION_VECTOR * versionVector; unsigned long epoqueVectorCount; [size_is(epoqueVectorCount)] FRS_EPOQUE_VECTOR * epoqueVector; } FRS_ASYNC_VERSION_VECTOR_RESPONSE; typedef struct _FRS_ASYNC_RESPONSE_CONTEXT { unsigned long sequenceNumber; DWORD status; FRS_ASYNC_VERSION_VECTOR_RESPONSE result; } FRS_ASYNC_RESPONSE_CONTEXT; #define FRS_UPDATE_FLAG_GHOSTED_HEADER = 0x04; #define FRS_UPDATE_FLAG_DATA = 0x08; #define FRS_UPDATE_FLAG_CLOCK_DECREMENTED = 0x10; typedef pipe byte BYTE_PIPE; [ uuid(897e2e5f-93f3-4376-9c9c-fd2277495c27), version(1.0) ] interface FrsTransport { DWORD CheckConnectivity( [in] FRS_REPLICA_SET_ID replicaSetId, [in] FRS_CONNECTION_ID connectionId ); DWORD EstablishConnection( [in] FRS_REPLICA_SET_ID replicaSetId, [in] FRS_CONNECTION_ID connectionId, [in] DWORD downstreamProtocolVersion, [in] DWORD downstreamFlags, [out] DWORD *upstreamProtocolVersion, [out] DWORD *upstreamFlags ); DWORD EstablishSession( [in] FRS_CONNECTION_ID connectionId, [in] FRS_CONTENT_SET_ID contentSetId ); DWORD RequestUpdates( [in] FRS_CONNECTION_ID connectionId, [in] FRS_CONTENT_SET_ID contentSetId, [in, range(0,256)] DWORD creditsAvailable, [in, range(0,1)] long hashRequested, [in, range(UPDATE_REQUEST_ALL, UPDATE_REQUEST_LIVE)] UPDATE_REQUEST_TYPE updateRequestType, [in] unsigned long versionVectorDiffCount, [in, size_is(versionVectorDiffCount)] FRS_VERSION_VECTOR *versionVectorDiff, [out, size_is(creditsAvailable), length_is(*updateCount)] FRS_UPDATE *frsUpdate, [out] DWORD *updateCount, [out] UPDATE_STATUS *updateStatus, [out] GUID *gvsnDbGuid, [out] DWORDLONG *gvsnVersion ); DWORD RequestVersionVector( [in] DWORD sequenceNumber, [in] FRS_CONNECTION_ID connectionId, [in] FRS_CONTENT_SET_ID contentSetId, [in, range(REQUEST_NORMAL_SYNC,REQUEST_SUBORDINATE_SYNC)] VERSION_REQUEST_TYPE requestType, [in, range(CHANGE_NOTIFY,CHANGE_ALL)] VERSION_CHANGE_TYPE changeType, [in] ULONGLONG vvGeneration ); DWORD AsyncPoll( [in] FRS_CONNECTION_ID connectionId, [out] FRS_ASYNC_RESPONSE_CONTEXT* response ); DWORD RequestRecords( [in] FRS_CONNECTION_ID connectionId, [in] FRS_CONTENT_SET_ID contentSetId, [in] FRS_DATABASE_ID uidDbGuid, [in] DWORDLONG uidVersion, [in, out] DWORD *maxRecords, [out] DWORD *numRecords, [out] DWORD *numBytes, [out, size_is(,*numBytes)] byte **compressedRecords, [out] RECORDS_STATUS *recordsStatus ); DWORD UpdateCancel( [in] FRS_CONNECTION_ID connectionId, [in] FRS_UPDATE_CANCEL_DATA cancelData ); typedef [context_handle] void * PFRS_SERVER_CONTEXT; DWORD RawGetFileData( [in, out] PFRS_SERVER_CONTEXT *serverContext, [out, size_is(bufferSize), length_is(*sizeRead)] byte *dataBuffer, [in, range(0, CONFIG_TRANSPORT_MAX_BUFFER_SIZE)] DWORD bufferSize, [out] DWORD *sizeRead, [out] long *isEndOfFile ); DWORD RdcGetSignatures( [in] PFRS_SERVER_CONTEXT serverContext, [in, range(1, CONFIG_RDC_MAX_LEVELS)] byte level, [in] DWORDLONG offset, [out, size_is(length), length_is(*sizeRead)] byte *buffer, [in, range(1, CONFIG_RDC_MAX_NEEDLENGTH)] DWORD length, [out] DWORD *sizeRead ); DWORD RdcPushSourceNeeds( [in] PFRS_SERVER_CONTEXT serverContext, [in, size_is(needCount)] FRS_RDC_SOURCE_NEED *sourceNeeds, [in, range(0, CONFIG_RDC_NEED_QUEUE_SIZE)] DWORD needCount ); DWORD RdcGetFileData( [in] PFRS_SERVER_CONTEXT serverContext, [out, size_is(bufferSize), length_is(*sizeReturned)] byte *dataBuffer, [in, range(0, CONFIG_TRANSPORT_MAX_BUFFER_SIZE)] DWORD bufferSize, [out] DWORD *sizeReturned ); DWORD RdcClose( [in, out] PFRS_SERVER_CONTEXT *serverContext ); DWORD InitializeFileTransferAsync( [in] FRS_CONNECTION_ID connectionId, [in, out] FRS_UPDATE *frsUpdate, [in, range(0,1)] long rdcDesired, [in,out] FRS_REQUESTED_STAGING_POLICY *stagingPolicy, [out] PFRS_SERVER_CONTEXT *serverContext, [out] FRS_RDC_FILEINFO **rdcFileInfo, [out, size_is(bufferSize), length_is(*sizeRead)] byte *dataBuffer, [in, range(0, CONFIG_TRANSPORT_MAX_BUFFER_SIZE)] DWORD bufferSize, [out] DWORD *sizeRead, [out] long *isEndOfFile ); DWORD Opnum14NotUsedOnWire (void); DWORD RawGetFileDataAsync( [in] PFRS_SERVER_CONTEXT serverContext, [out] BYTE_PIPE* bytePipe ); DWORD RdcGetFileDataAsync( [in] PFRS_SERVER_CONTEXT serverContext, [out] BYTE_PIPE* bytePipe ); DWORD RdcFileDataTransferKeepAlive( [in] PFRS_SERVER_CONTEXT serverContext ); }