r5742: - add torture test and idl for DsReplicaUpdateRefs()
[samba.git] / source / librpc / idl / drsuapi.idl
1 #include "idl_types.h"
2
3
4   uuid("e3514235-4b06-11d1-ab04-00c04fc2dcd2"),
5   version(4.0),
6   endpoint("ncacn_np:[\\pipe\\lsass]","ncacn_np:[\\pipe\\protected_storage]", "ncacn_ip_tcp:", "ncalrpc:"),
7   authservice("ldap"),
8   helpstring("Active Directory Replication"),
9   pointer_default(unique)
10
11 interface drsuapi
12 {
13         /*****************/
14         /* Function 0x00 */
15         typedef [bitmap32bit] bitmap {
16                 DRSUAPI_SUPPORTED_EXTENSION_BASE                        = 0x00000001,
17                 DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATION           = 0x00000002,
18                 DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPI                   = 0x00000004,
19                 DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2                  = 0x00000008,
20                 DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESS             = 0x00000010,
21                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1                   = 0x00000020,
22                 DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION    = 0x00000040,
23                 DRSUAPI_SUPPORTED_EXTENSION_00000080                    = 0x00000080,
24                 DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE                 = 0x00000100,
25                 DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2                 = 0x00000200,
26                 DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION    = 0x00000400,
27                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2                   = 0x00000800,
28                 DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD= 0x00001000,
29                 DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BIND                 = 0x00002000,
30                 DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFO               = 0x00004000,
31                 DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTION           = 0x00008000,
32                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01                  = 0x00010000,
33                 DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIP       = 0x00020000,
34                 DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY             = 0x00040000,
35                 DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3                  = 0x00080000,
36                 DRSUAPI_SUPPORTED_EXTENSION_00100000                    = 0x00100000,
37                 DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2            = 0x00200000,
38                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6                = 0x00400000,
39                 DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCS               = 0x00800000,
40                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8                = 0x01000000,
41                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5              = 0x02000000,
42                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6              = 0x04000000,
43                 /*
44                  * the following 3 have the same value
45                  * repadmin.exe /bind says that
46                  */
47                 DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3            = 0x08000000,
48                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7              = 0x08000000,
49                 DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT               = 0x08000000,
50                 DRSUAPI_SUPPORTED_EXTENSION_XPRESS_COMPRESS             = 0x10000000,
51                 DRSUAPI_SUPPORTED_EXTENSION_20000000                    = 0x20000000,
52                 DRSUAPI_SUPPORTED_EXTENSION_40000000                    = 0x40000000,
53                 DRSUAPI_SUPPORTED_EXTENSION_80000000                    = 0x80000000
54         } drsuapi_SupportedExtensions;
55
56         /* this is used by w2k */
57         typedef struct {
58                 drsuapi_SupportedExtensions supported_extensions;
59                 GUID site_guid;
60                 uint32 u1;
61         } drsuapi_DsBindInfo24;
62
63         /* this is used by w2k3 */
64         typedef struct {
65                 drsuapi_SupportedExtensions supported_extensions;
66                 GUID site_guid;
67                 uint32 u1;
68                 uint32 repl_epoch;
69         } drsuapi_DsBindInfo28;
70
71         typedef struct {
72                 [flag(NDR_REMAINING)] DATA_BLOB info;
73         } drsuapi_DsBindInfoFallBack;
74
75         typedef [nodiscriminant] union {
76                 [case(24)][subcontext(4)] drsuapi_DsBindInfo24 info24;
77                 [case(28)][subcontext(4)] drsuapi_DsBindInfo28 info28;
78                 [default][subcontext(4)] drsuapi_DsBindInfoFallBack FallBack;
79         } drsuapi_DsBindInfo;
80
81         /* the drsuapi_DsBindInfoCtr was this before
82          * typedef [flag(NDR_PAHEX)] struct {
83          *      [range(1,10000)] uint32 length;
84          *      [size_is(length)] uint8 data[];
85          * } drsuapi_DsBindInfo;
86          *
87          * but we don't want the caller to manually decode this blob,
88          * so we're doing it here
89          */
90
91         typedef struct {
92                 [range(1,10000)] uint32 length;
93                 [switch_is(length)] drsuapi_DsBindInfo info;
94         } drsuapi_DsBindInfoCtr;
95
96         /* this is a magic guid you need to pass to DsBind to make drsuapi_DsWriteAccountSpn() work
97          * 
98          * maybe the bind_guid could also be the invocation_id see drsuapi_DsReplicaConnection04
99          */
100         const string DRSUAPI_DS_BIND_GUID = "e24d201a-4fd6-11d1-a3da-0000f875ae0d";
101
102         WERROR drsuapi_DsBind(
103                 [in]        GUID *bind_guid,
104                 [in,out]    drsuapi_DsBindInfoCtr *bind_info,
105                 [out,ref]   policy_handle *bind_handle
106                 );
107
108         /*****************/
109         /* Function 0x01 */
110         WERROR drsuapi_DsUnbind(
111                 [in,out,ref] policy_handle *bind_handle
112                 );
113
114         /*****************/
115         /* Function 0x02 */
116         typedef [gensize,flag(NDR_PAHEX)] struct {
117                 [value(ndr_size_drsuapi_DsReplicaSyncRequest1Info(r, ndr->flags)-4)] uint32 __ndr_size;
118                 uint32 unknown1;
119                 GUID guid1;
120                 uint8 byte_array[28];
121                 [flag(STR_SIZE4|STR_CHARLEN|STR_CONFORMANT)] string nc_dn;
122         } drsuapi_DsReplicaSyncRequest1Info;
123
124         typedef bitmap {
125                 DRSUAPI_DS_REPLICA_SYNC_ASYNCHRONOUS_OPERATION  = 0x00000001,
126                 DRSUAPI_DS_REPLICA_SYNC_WRITEABLE               = 0x00000002,
127                 DRSUAPI_DS_REPLICA_SYNC_PERIODIC                = 0x00000004,
128                 DRSUAPI_DS_REPLICA_SYNC_INTERSITE_MESSAGING     = 0x00000008,
129                 DRSUAPI_DS_REPLICA_SYNC_ALL_SOURCES             = 0x00000010,
130                 DRSUAPI_DS_REPLICA_SYNC_FULL                    = 0x00000020,
131                 DRSUAPI_DS_REPLICA_SYNC_URGENT                  = 0x00000040,
132                 DRSUAPI_DS_REPLICA_SYNC_NO_DISCARD              = 0x00000080,
133                 DRSUAPI_DS_REPLICA_SYNC_FORCE                   = 0x00000100,
134                 DRSUAPI_DS_REPLICA_SYNC_ADD_REFERENCE           = 0x00000200,
135                 DRSUAPI_DS_REPLICA_SYNC_NEVER_COMPLETED         = 0x00000400,
136                 DRSUAPI_DS_REPLICA_SYNC_TWO_WAY                 = 0x00000800,
137                 DRSUAPI_DS_REPLICA_SYNC_NEVER_NOTIFY            = 0x00001000,
138                 DRSUAPI_DS_REPLICA_SYNC_INITIAL                 = 0x00002000,
139                 DRSUAPI_DS_REPLICA_SYNC_USE_COMPRESSION         = 0x00004000,
140                 DRSUAPI_DS_REPLICA_SYNC_ABANDONED               = 0x00008000,
141                 DRSUAPI_DS_REPLICA_SYNC_INITIAL_IN_PROGRESS     = 0x00010000,
142                 DRSUAPI_DS_REPLICA_SYNC_PARTIAL_ATTRIBUTE_SET   = 0x00020000,
143                 DRSUAPI_DS_REPLICA_SYNC_REQUEUE                 = 0x00040000,
144                 DRSUAPI_DS_REPLICA_SYNC_NOTIFICATION            = 0x00080000,
145                 DRSUAPI_DS_REPLICA_SYNC_ASYNCHRONOUS_REPLICA    = 0x00100000,
146                 DRSUAPI_DS_REPLICA_SYNC_CRITICAL                = 0x00200000,
147                 DRSUAPI_DS_REPLICA_SYNC_FULL_IN_PROGRESS        = 0x00400000,
148                 DRSUAPI_DS_REPLICA_SYNC_PREEMPTED               = 0x00800000
149         } drsuapi_DsReplicaSyncOptions;
150
151         typedef struct {
152                 drsuapi_DsReplicaSyncRequest1Info *info;
153                 GUID guid1;
154                 astring *string1;
155                 drsuapi_DsReplicaSyncOptions options;
156         } drsuapi_DsReplicaSyncRequest1;
157
158         typedef [switch_type(int32)] union {
159                 [case(1)] drsuapi_DsReplicaSyncRequest1 req1;
160         } drsuapi_DsReplicaSyncRequest;
161
162         WERROR drsuapi_DsReplicaSync(
163                 [in,ref] policy_handle *bind_handle,
164                 [in] int32 level,
165                 [in,switch_is(level)] drsuapi_DsReplicaSyncRequest req
166                 );
167
168         /*****************/
169         /* Function 0x03 */
170         typedef struct {
171                 hyper usn1;
172                 hyper usn2;
173                 hyper usn3;
174         } drsuapi_DsGetNCChangesUsnTriple;
175
176         typedef struct {
177                 GUID guid1;
178                 GUID guid2;
179                 uint32 unknown1[20];
180                 drsuapi_DsReplicaSyncRequest1Info sync_req_info1;
181                 drsuapi_DsGetNCChangesUsnTriple usn;
182         } drsuapi_DsGetNCChangesRequest8;
183
184         typedef [switch_type(int32)] union {
185                 [case(8)] drsuapi_DsGetNCChangesRequest8 req8;
186         } drsuapi_DsGetNCChangesRequest;
187
188         typedef struct {
189         } drsuapi_DsGetNCChangesCtr7;
190
191         typedef [switch_type(int32)] union {
192                 [case(7)] drsuapi_DsGetNCChangesCtr7 ctr7;
193         } drsuapi_DsGetNCChangesCtr;
194
195         WERROR drsuapi_DsGetNCChanges(
196                 [in,ref] policy_handle *bind_handle,
197                 [in,out] int32 level,
198                 [in,switch_is(level)] drsuapi_DsGetNCChangesRequest req,
199                 [out,switch_is(level)] drsuapi_DsGetNCChangesCtr ctr
200                 );
201
202         /*****************/
203         /* Function 0x04 */
204         typedef bitmap {
205                 DRSUAPI_DS_REPLICA_UPDATE_ASYNCHRONOUS_OPERATION        = 0x00000001,
206                 DRSUAPI_DS_REPLICA_UPDATE_WRITEABLE                     = 0x00000002,
207                 DRSUAPI_DS_REPLICA_UPDATE_ADD_REFERENCE                 = 0x00000004,
208                 DRSUAPI_DS_REPLICA_UPDATE_DELETE_REFERENCE              = 0x00000008,
209                 DRSUAPI_DS_REPLICA_UPDATE_0x00000010                    = 0x00000010
210         } drsuapi_DsReplicaUpdateRefsOptions;
211
212         typedef struct {
213                 uint32 unknown1;
214                 uint32 unknown2;
215                 GUID dest_dsa_guid;
216                 drsuapi_DsReplicaUpdateRefsOptions options;
217                 drsuapi_DsReplicaSyncRequest1Info sync_req_info1;
218                 ascstr dest_dsa_dns_name;
219         } drsuapi_DsReplicaUpdateRefsRequest1;
220
221         typedef [switch_type(int32)] union {
222                 [case(1)] drsuapi_DsReplicaUpdateRefsRequest1 req1;
223         } drsuapi_DsReplicaUpdateRefsRequest;
224
225         WERROR drsuapi_DsReplicaUpdateRefs(
226                 [in,ref] policy_handle *bind_handle,
227                 [in] int32 level,
228                 [in,switch_is(level)] drsuapi_DsReplicaUpdateRefsRequest req
229                 );
230
231         /*****************/
232         /* Function 0x05 */
233         typedef bitmap {
234                 DRSUAPI_DS_REPLICA_ADD_ASYNCHRONOUS_OPERATION   = 0x00000001,
235                 DRSUAPI_DS_REPLICA_ADD_WRITEABLE                = 0x00000002
236                 /* TODO ... */
237         } drsuapi_DsReplicaAddOptions;
238
239         WERROR DRSUAPI_REPLICA_ADD();
240
241         /*****************/
242         /* Function 0x06 */
243         typedef bitmap {
244                 DRSUAPI_DS_REPLICA_DELETE_ASYNCHRONOUS_OPERATION        = 0x00000001,
245                 DRSUAPI_DS_REPLICA_DELETE_WRITEABLE                     = 0x00000002
246                 /* TODO ... */
247         } drsuapi_DsReplicaDeleteOptions;
248
249         WERROR DRSUAPI_REPLICA_DEL();
250
251         /*****************/
252         /* Function 0x07 */
253         typedef bitmap {
254                 DRSUAPI_DS_REPLICA_MODIFY_ASYNCHRONOUS_OPERATION        = 0x00000001,
255                 DRSUAPI_DS_REPLICA_MODIFY_WRITEABLE                     = 0x00000002
256         } drsuapi_DsReplicaModifyOptions;
257
258         WERROR DRSUAPI_REPLICA_MODIFY();
259
260         /*****************/
261         /* Function 0x08 */
262         WERROR DRSUAPI_VERIFY_NAMES();
263
264         /*****************/
265         /* Function 0x09 */
266         WERROR DRSUAPI_GET_MEMBERSHIPS();
267
268         /*****************/
269         /* Function 0x0a */
270         WERROR DRSUAPI_INTER_DOMAIN_MOVE();
271
272         /*****************/
273         /* Function 0x0b */
274         WERROR DRSUAPI_GET_NT4_CHANGELOG();
275
276         /*****************/
277         /* Function 0x0c */
278         typedef [v1_enum] enum {
279                 DRSUAPI_DS_NAME_STATUS_OK                       = 0,
280                 DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR            = 1,
281                 DRSUAPI_DS_NAME_STATUS_NOT_FOUND                = 2,
282                 DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE               = 3,
283                 DRSUAPI_DS_NAME_STATUS_NO_MAPPING               = 4,
284                 DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY              = 5,
285                 DRSUAPI_DS_NAME_STATUS_NO_SYNTACTICAL_MAPPING   = 6,
286                 DRSUAPI_DS_NAME_STATUS_TRUST_REFERRAL           = 7
287         } drsuapi_DsNameStatus;
288
289         typedef [v1_enum] enum {
290                 DRSUAPI_DS_NAME_FLAG_NO_FLAGS                   = 0x0,
291                 DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY           = 0x1,
292                 DRSUAPI_DS_NAME_FLAG_EVAL_AT_DC                 = 0x2,
293                 DRSUAPI_DS_NAME_FLAG_GCVERIFY                   = 0x4,
294                 DRSUAPI_DS_NAME_FLAG_TRUST_REFERRAL             = 0x8
295         } drsuapi_DsNameFlags;
296
297         typedef [v1_enum] enum {
298                 DRSUAPI_DS_NAME_FORMAT_UKNOWN                   = 0,
299                 DRSUAPI_DS_NAME_FORMAT_FQDN_1779                = 1,
300                 DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT              = 2,
301                 DRSUAPI_DS_NAME_FORMAT_DISPLAY                  = 3,
302                 DRSUAPI_DS_NAME_FORMAT_GUID                     = 6,
303                 DRSUAPI_DS_NAME_FORMAT_CANONICAL                = 7,
304                 DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL           = 8,
305                 DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX             = 9,
306                 DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL        = 10,
307                 DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY       = 11,
308                 DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN               = 12
309         } drsuapi_DsNameFormat;
310
311         typedef struct {
312                 unistr *str;
313         } drsuapi_DsNameString;
314
315         typedef struct {
316                 uint32 unknown1; /* 0x000004e4 */
317                 uint32 unknown2; /* 0x00000407 */
318                 drsuapi_DsNameFlags format_flags;
319                 drsuapi_DsNameFormat format_offered;
320                 drsuapi_DsNameFormat format_desired;
321                 [range(1,10000)] uint32 count;
322                 [size_is(count)] drsuapi_DsNameString *names[];
323         } drsuapi_DsNameRequest1;
324
325         typedef [switch_type(int32)] union {
326                 [case(1)] drsuapi_DsNameRequest1 req1;
327         } drsuapi_DsNameRequest;
328
329         typedef struct {
330                 drsuapi_DsNameStatus status;
331                 unistr *dns_domain_name;
332                 unistr *result_name;
333         } drsuapi_DsNameInfo1;
334
335         typedef struct {
336                 uint32 count;
337                 [size_is(count)] drsuapi_DsNameInfo1 *array[];
338         } drsuapi_DsNameCtr1;
339
340         typedef [switch_type(int32)] union {
341                 [case(1)] drsuapi_DsNameCtr1 *ctr1;
342         } drsuapi_DsNameCtr;
343
344         WERROR drsuapi_DsCrackNames(
345                 [in,ref] policy_handle *bind_handle,
346                 [in, out] int32 level,
347                 [in,switch_is(level)] drsuapi_DsNameRequest req,
348                 [out,switch_is(level)] drsuapi_DsNameCtr ctr
349                 );
350
351         /*****************/
352         /* Function 0x0d */
353         typedef [v1_enum] enum {
354                 DRSUAPI_DS_SPN_OPERATION_ADD    = 0,
355                 DRSUAPI_DS_SPN_OPERATION_REPLACE= 1,
356                 DRSUAPI_DS_SPN_OPERATION_DELETE = 2
357         } drsuapi_DsSpnOperation;
358
359         typedef struct {
360                 drsuapi_DsSpnOperation operation;
361                 uint32 unknown1;
362                 unistr *object_dn;
363                 [range(0,10000)] uint32 count;
364                 [size_is(count)] drsuapi_DsNameString *spn_names[];
365         } drsuapi_DsWriteAccountSpnRequest1;
366
367         typedef [switch_type(int32)] union {
368                 [case(1)] drsuapi_DsWriteAccountSpnRequest1 req1;
369         } drsuapi_DsWriteAccountSpnRequest;
370
371         typedef struct {
372                 WERROR status;
373         } drsuapi_DsWriteAccountSpnResult1;
374
375         typedef [switch_type(int32)] union {
376                 [case(1)] drsuapi_DsWriteAccountSpnResult1 res1;
377         } drsuapi_DsWriteAccountSpnResult;
378
379         WERROR drsuapi_DsWriteAccountSpn(
380                 [in,ref] policy_handle *bind_handle,
381                 [in, out] int32 level,
382                 [in,switch_is(level)] drsuapi_DsWriteAccountSpnRequest req,
383                 [out,switch_is(level)] drsuapi_DsWriteAccountSpnResult res
384                 );
385
386         /*****************/
387         /* Function 0x0e */
388         WERROR DRSUAPI_REMOVE_DS_SERVER();
389
390         /*****************/
391         /* Function 0x0f */
392         WERROR DRSUAPI_REMOVE_DS_DOMAIN();
393
394         /*****************/
395         /* Function 0x10 */
396         typedef struct {
397                 unistr *domain_name; /* netbios or dns */
398                 int32 level; /* specifies the switch level for the request */
399         } drsuapi_DsGetDCInfoRequest1;
400
401         typedef [switch_type(int32)] union {
402                 [case(1)] drsuapi_DsGetDCInfoRequest1 req1;
403         } drsuapi_DsGetDCInfoRequest;
404
405         typedef struct {
406                 unistr *netbios_name;
407                 unistr *dns_name;
408                 unistr *site_name;
409                 unistr *computer_dn;
410                 unistr *server_dn;
411                 uint32 is_pdc;
412                 uint32 is_enabled;
413         } drsuapi_DsGetDCInfo1;
414
415         typedef struct {
416                 [range(0,10000)] uint32 count;
417                 [size_is(count)] drsuapi_DsGetDCInfo1 *array[];
418         } drsuapi_DsGetDCInfoCtr1;
419
420         typedef struct {
421                 unistr *netbios_name;
422                 unistr *dns_name;
423                 unistr *site_name;
424                 unistr *site_dn;
425                 unistr *computer_dn;
426                 unistr *server_dn;
427                 unistr *ntds_dn;
428                 uint32 is_pdc;
429                 uint32 is_enabled;
430                 uint32 is_gc;
431                 GUID site_guid;
432                 GUID computer_guid;
433                 GUID server_guid;
434                 GUID ntds_guid;
435         } drsuapi_DsGetDCInfo2;
436
437         typedef struct {
438                 [range(0,10000)] uint32 count;
439                 [size_is(count)] drsuapi_DsGetDCInfo2 *array[];
440         } drsuapi_DsGetDCInfoCtr2;
441
442         typedef struct {
443                 uint32 unknown1;
444                 uint32 unknown2;
445                 uint32 unknown3;
446                 uint32 unknown4;
447                 uint32 unknown5;
448                 uint32 unknown6;
449                 unistr *server_nt4_account;
450         } drsuapi_DsGetDCInfo01;
451
452         typedef struct {
453                 [range(0,10000)] uint32 count;
454                 [size_is(count)] drsuapi_DsGetDCInfo01 *array[];
455         } drsuapi_DsGetDCInfoCtr01;
456
457         typedef [switch_type(int32)] union {
458                 [case(1)] drsuapi_DsGetDCInfoCtr1 ctr1;
459                 [case(2)] drsuapi_DsGetDCInfoCtr2 ctr2;
460                 [case(-1)] drsuapi_DsGetDCInfoCtr01 ctr01;
461         } drsuapi_DsGetDCInfoCtr;
462
463         WERROR drsuapi_DsGetDomainControllerInfo(
464                 [in,ref] policy_handle *bind_handle,
465                 [in, out] int32 level,
466                 [in,switch_is(level)] drsuapi_DsGetDCInfoRequest req,
467                 [out,switch_is(level)] drsuapi_DsGetDCInfoCtr ctr
468                 );
469
470         /*****************/
471         /* Function 0x11 */
472         WERROR drsuapi_DsAddEntry();
473
474         /*****************/
475         /* Function 0x12 */
476         WERROR DRSUAPI_EXECUTE_KCC();
477
478         /*****************/
479         /* Function 0x13 */
480         typedef [v1_enum] enum {
481                 DRSUAPI_DS_REPLICA_GET_INFO                             = 1,
482                 DRSUAPI_DS_REPLICA_GET_INFO2                            = 2
483         } drsuapi_DsReplicaGetInfoLevel;
484
485         typedef [v1_enum] enum {
486                 DRSUAPI_DS_REPLICA_INFO_NEIGHBORS                       = 0,
487                 DRSUAPI_DS_REPLICA_INFO_CURSORS                         = 1,
488                 DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA                    = 2,
489                 DRSUAPI_DS_REPLICA_INFO_KCC_DSA_CONNECT_FAILURES        = 3,
490                 DRSUAPI_DS_REPLICA_INFO_KCC_DSA_LINK_FAILURES           = 4,
491                 DRSUAPI_DS_REPLICA_INFO_PENDING_OPS                     = 5,
492                 DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA        = 6,
493                 DRSUAPI_DS_REPLICA_INFO_CURSORS2                        = 7,
494                 DRSUAPI_DS_REPLICA_INFO_CURSORS3                        = 8,
495                 DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA2                   = 9,
496                 DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA2       = 10,
497                 DRSUAPI_DS_REPLICA_INFO_NEIGHBORS02                     = -2,
498                 DRSUAPI_DS_REPLICA_INFO_CONNECTIONS04                   = -4,
499                 DRSUAPI_DS_REPLICA_INFO_CURSURS05                       = -5,
500                 DRSUAPI_DS_REPLICA_INFO_06                              = -6
501         } drsuapi_DsReplicaInfoType;
502
503         typedef struct {
504                 drsuapi_DsReplicaInfoType info_type;
505                 unistr *object_dn;
506                 GUID guid1;
507         } drsuapi_DsReplicaGetInfoRequest1;
508
509         typedef struct {
510                 drsuapi_DsReplicaInfoType info_type;
511                 unistr *object_dn;
512                 GUID guid1;
513                 uint32 unknown1;
514                 unistr *string1;
515                 unistr *string2;
516                 uint32 unknown2;
517         } drsuapi_DsReplicaGetInfoRequest2;
518
519         typedef [switch_type(drsuapi_DsReplicaGetInfoLevel)] union {
520                 [case(DRSUAPI_DS_REPLICA_GET_INFO)] drsuapi_DsReplicaGetInfoRequest1 req1;
521                 [case(DRSUAPI_DS_REPLICA_GET_INFO2)] drsuapi_DsReplicaGetInfoRequest2 req2;
522         } drsuapi_DsReplicaGetInfoRequest;
523
524         typedef struct {
525                 unistr *naming_context_dn;
526                 unistr *source_dsa_obj_dn;
527                 unistr *source_dsa_address;
528                 unistr *transport_obj_dn;
529                 uint32 replica_flags;
530                 uint32 reserved;
531                 GUID naming_context_obj_guid;
532                 GUID source_dsa_obj_guid;
533                 GUID source_dsa_invocation_id;
534                 GUID transport_obj_guid;
535                 hyper tmp_highest_usn;
536                 hyper highest_usn;
537                 NTTIME last_success;
538                 NTTIME last_attempt;
539                 WERROR result_last_attempt;
540                 uint32 consecutive_sync_failures;
541         } drsuapi_DsReplicaNeighbour;
542
543         typedef struct {
544                 uint32 count;
545                 uint32 reserved;
546                 [size_is(count)] drsuapi_DsReplicaNeighbour array[];
547         } drsuapi_DsReplicaNeighbourCtr;
548
549         typedef struct {
550                 GUID source_dsa_invocation_id;
551                 hyper highest_usn;
552         } drsuapi_DsReplicaCoursor;
553
554         typedef struct {
555                 uint32 count;
556                 uint32 reserved;
557                 [size_is(count)] drsuapi_DsReplicaCoursor array[];
558         } drsuapi_DsReplicaCoursorCtr;
559
560         typedef struct {
561                 unistr *attribute_name;
562                 uint32 version;
563                 NTTIME originating_last_changed;
564                 GUID originating_dsa_invocation_id;
565                 hyper originating_usn;
566                 hyper local_usn;
567         } drsuapi_DsReplicaObjMetaData;
568
569         typedef struct {
570                 uint32 count;
571                 uint32 reserved;
572                 [size_is(count)] drsuapi_DsReplicaObjMetaData array[];
573         } drsuapi_DsReplicaObjMetaDataCtr;
574
575         typedef struct {
576                 unistr *dsa_obj_dn;
577                 GUID dsa_obj_guid;
578                 NTTIME first_failure;
579                 uint32 num_failures;
580                 WERROR last_result;
581         } drsuapi_DsReplicaKccDsaFailure;
582
583         typedef struct {
584                 uint32 count;
585                 uint32 reserved;
586                 [size_is(count)] drsuapi_DsReplicaKccDsaFailure array[];
587         } drsuapi_DsReplicaKccDsaFailuresCtr;
588
589         typedef enum {
590                 DRSUAPI_DS_REPLICA_OP_TYPE_SYNC         = 0,
591                 DRSUAPI_DS_REPLICA_OP_TYPE_ADD          = 1,
592                 DRSUAPI_DS_REPLICA_OP_TYPE_DELETE       = 2,
593                 DRSUAPI_DS_REPLICA_OP_TYPE_MODIFY       = 3,
594                 DRSUAPI_DS_REPLICA_OP_TYPE_UPDATE_REFS  = 4
595         } drsuapi_DsReplicaOpType;
596
597         typedef [switch_type(drsuapi_DsReplicaOpType)] union {
598                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_SYNC)]         drsuapi_DsReplicaSyncOptions sync;
599                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_ADD)]          drsuapi_DsReplicaAddOptions add;
600                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_DELETE)]       drsuapi_DsReplicaDeleteOptions delete;
601                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_MODIFY)]       drsuapi_DsReplicaModifyOptions modify;
602                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_UPDATE_REFS)]  drsuapi_DsReplicaUpdateRefsOptions update_refs;
603                 [default] uint32 unknown;
604         } drsuapi_DsRplicaOpOptions;
605
606         typedef struct {
607                 NTTIME operation_start;
608                 uint32 serial_num; /* unique till reboot */
609                 uint32 priority;
610                 drsuapi_DsReplicaOpType operation_type;
611                 [switch_is(operation_type)] drsuapi_DsRplicaOpOptions options;
612                 unistr *nc_dn;
613                 unistr *remote_dsa_obj_dn;
614                 unistr *remote_dsa_address;
615                 GUID nc_obj_guid;
616                 GUID remote_dsa_obj_guid;
617         } drsuapi_DsReplicaOp;
618
619         typedef struct {
620                 NTTIME time;
621                 uint32 count;
622                 [size_is(count)] drsuapi_DsReplicaOp array[];
623         } drsuapi_DsReplicaOpCtr;
624
625         typedef struct {
626                 unistr *attribute_name;
627                 unistr *object_dn;
628                 uint32 value_length;
629                 [size_is(value_length)] uint8 *value[];
630                 NTTIME deleted;
631                 NTTIME created;
632                 uint32 version;
633                 NTTIME originating_last_changed;
634                 GUID originating_dsa_invocation_id;
635                 hyper originating_usn;
636                 hyper local_usn;
637         } drsuapi_DsReplicaAttrValMetaData;
638
639         typedef struct {
640                 uint32 count;
641                 int32 enumeration_context;
642                 [size_is(count)] drsuapi_DsReplicaAttrValMetaData array[];
643         } drsuapi_DsReplicaAttrValMetaDataCtr;
644
645         typedef struct {
646                 GUID source_dsa_invocation_id;
647                 hyper highest_usn;
648                 NTTIME last_sync_success;
649         } drsuapi_DsReplicaCoursor2;
650
651         typedef struct {
652                 uint32 count;
653                 int32 enumeration_context;
654                 [size_is(count)] drsuapi_DsReplicaCoursor2 array[];
655         } drsuapi_DsReplicaCoursor2Ctr;
656
657         typedef struct {
658                 GUID source_dsa_invocation_id;
659                 hyper highest_usn;
660                 NTTIME last_sync_success;
661                 unistr *source_dsa_obj_dn;
662         } drsuapi_DsReplicaCoursor3;
663
664         typedef struct {
665                 uint32 count;
666                 int32 enumeration_context;
667                 [size_is(count)] drsuapi_DsReplicaCoursor3 array[];
668         } drsuapi_DsReplicaCoursor3Ctr;
669
670         typedef struct {
671                 unistr *attribute_name;
672                 uint32 version;
673                 NTTIME originating_last_changed;
674                 GUID originating_dsa_invocation_id;
675                 hyper originating_usn;
676                 hyper local_usn;
677                 unistr *originating_dsa_obj_dn;
678         } drsuapi_DsReplicaObjMetaData2;
679
680         typedef struct {
681                 uint32 count;
682                 int32 enumeration_context;
683                 [size_is(count)] drsuapi_DsReplicaObjMetaData2 array[];
684         } drsuapi_DsReplicaObjMetaData2Ctr;
685
686         typedef struct {
687                 unistr *attribute_name;
688                 unistr *object_dn;
689                 uint32 value_length;
690                 [size_is(value_length)] uint8 *value[];
691                 NTTIME deleted;
692                 NTTIME created;
693                 uint32 version;
694                 NTTIME originating_last_changed;
695                 GUID originating_dsa_invocation_id;
696                 hyper originating_usn;
697                 hyper local_usn;
698                 unistr *originating_dsa_obj_dn;
699         } drsuapi_DsReplicaAttrValMetaData2;
700
701         typedef struct {
702                 uint32 count;
703                 int32 enumeration_context;
704                 [size_is(count)] drsuapi_DsReplicaAttrValMetaData2 array[];
705         } drsuapi_DsReplicaAttrValMetaData2Ctr;
706
707         typedef struct {
708                 hyper u1; /* session number? */
709                 uint32 u2;
710                 uint32 u3;
711                 GUID bind_guid;
712                 NTTIME_1sec bind_time;
713                 uint32 u4; /* flags? */
714                 uint32 u5;
715         } drsuapi_DsReplicaConnection04;
716
717         typedef struct {
718                 [range(0,10000)] uint32 count;
719                 uint32 reserved;
720                 [size_is(count)] drsuapi_DsReplicaConnection04 array[];
721         } drsuapi_DsReplicaConnection04Ctr;
722
723         typedef struct {
724                 uint32 u1;
725                 uint32 u2;
726                 [range(0,0x100000)] uint32 count;
727                 uint32 u3;
728                 [size_is(count)] drsuapi_DsReplicaCoursor array[];
729         } drsuapi_DsReplicaCoursor05Ctr;
730
731         typedef struct {
732                 unistr *str1;
733                 uint32 u1;
734                 uint32 u2;
735                 uint32 u3;
736                 uint32 u4;
737                 uint32 u5;
738                 hyper u6;
739                 uint32 u7;
740         } drsuapi_DsReplica06;
741
742         typedef struct {
743                 [range(0,256)] uint32 count;
744                 uint32 reserved;
745                 [size_is(count)] drsuapi_DsReplica06 array[];
746         } drsuapi_DsReplica06Ctr;
747
748         typedef [switch_type(drsuapi_DsReplicaInfoType)] union {
749                 [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS)] drsuapi_DsReplicaNeighbourCtr *neighbours;
750                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS)] drsuapi_DsReplicaCoursorCtr *coursors;
751                 [case(DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA)] drsuapi_DsReplicaObjMetaDataCtr *objmetadata;
752                 [case(DRSUAPI_DS_REPLICA_INFO_KCC_DSA_CONNECT_FAILURES)] drsuapi_DsReplicaKccDsaFailuresCtr *connectfailures;
753                 [case(DRSUAPI_DS_REPLICA_INFO_KCC_DSA_LINK_FAILURES)] drsuapi_DsReplicaKccDsaFailuresCtr *linkfailures;
754                 [case(DRSUAPI_DS_REPLICA_INFO_PENDING_OPS)] drsuapi_DsReplicaOpCtr *pendingops;
755                 [case(DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA)] drsuapi_DsReplicaAttrValMetaDataCtr *attrvalmetadata;
756                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS2)] drsuapi_DsReplicaCoursor2Ctr *coursors2;
757                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS3)] drsuapi_DsReplicaCoursor3Ctr *coursors3;
758                 [case(DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA2)] drsuapi_DsReplicaObjMetaData2Ctr *objmetadata2;
759                 [case(DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA2)] drsuapi_DsReplicaAttrValMetaData2Ctr *attrvalmetadata2;
760                 [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS02)] drsuapi_DsReplicaNeighbourCtr *neighbours02;
761                 [case(DRSUAPI_DS_REPLICA_INFO_CONNECTIONS04)] drsuapi_DsReplicaConnection04Ctr *connections04;
762                 [case(DRSUAPI_DS_REPLICA_INFO_CURSURS05)] drsuapi_DsReplicaCoursor05Ctr *coursors05;
763                 [case(DRSUAPI_DS_REPLICA_INFO_06)] drsuapi_DsReplica06Ctr *i06;
764         } drsuapi_DsReplicaInfo;
765
766         WERROR drsuapi_DsReplicaGetInfo(
767                 [in,ref] policy_handle *bind_handle,
768                 [in] drsuapi_DsReplicaGetInfoLevel level,
769                 [in,switch_is(level)] drsuapi_DsReplicaGetInfoRequest req,
770                 [out] drsuapi_DsReplicaInfoType info_type,
771                 [out,switch_is(info_type)] drsuapi_DsReplicaInfo info
772                 );
773
774         /*****************/
775         /* Function 0x14 */
776         WERROR DRSUAPI_ADD_SID_HISTORY();
777
778         /*****************/
779         /* Function 0x15 */
780         WERROR DRSUAPI_GET_MEMBERSHIPS2();
781
782         /*****************/
783         /* Function 0x16 */
784         WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS();
785
786         /*****************/
787         /* Function 0x17 */
788         WERROR DRSUAPI_GET_OBJECT_EXISTENCE();
789
790         /*****************/
791         /* Function 0x18 */
792         WERROR DRSUAPI_QUERY_SITES_BY_COST();
793 }