r5998: I was wrong with the highwater mark...
[bbaumbach/samba-autobuild/.git] / source4 / 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   depends(security)
11
12 interface drsuapi
13 {
14         /*****************/
15         /* Function 0x00 */
16         typedef [bitmap32bit] bitmap {
17                 DRSUAPI_SUPPORTED_EXTENSION_BASE                        = 0x00000001,
18                 DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATION           = 0x00000002,
19                 DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPI                   = 0x00000004,
20                 DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2                  = 0x00000008,
21                 DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESS             = 0x00000010,
22                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1                   = 0x00000020,
23                 DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION    = 0x00000040,
24                 DRSUAPI_SUPPORTED_EXTENSION_00000080                    = 0x00000080,
25                 DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE                 = 0x00000100,
26                 DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2                 = 0x00000200,
27                 DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION    = 0x00000400,
28                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2                   = 0x00000800,
29                 DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD= 0x00001000,
30                 DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BIND                 = 0x00002000,
31                 DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFO               = 0x00004000,
32                 DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTION           = 0x00008000,
33                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01                  = 0x00010000,
34                 DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIP       = 0x00020000,
35                 DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY             = 0x00040000,
36                 DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3                  = 0x00080000,
37                 DRSUAPI_SUPPORTED_EXTENSION_00100000                    = 0x00100000,
38                 DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2            = 0x00200000,
39                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6                = 0x00400000,
40                 DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCS               = 0x00800000,
41                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8                = 0x01000000,
42                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5              = 0x02000000,
43                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6              = 0x04000000,
44                 /*
45                  * the following 3 have the same value
46                  * repadmin.exe /bind says that
47                  */
48                 DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3            = 0x08000000,
49                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7              = 0x08000000,
50                 DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT               = 0x08000000,
51                 DRSUAPI_SUPPORTED_EXTENSION_XPRESS_COMPRESS             = 0x10000000,
52                 DRSUAPI_SUPPORTED_EXTENSION_20000000                    = 0x20000000,
53                 DRSUAPI_SUPPORTED_EXTENSION_40000000                    = 0x40000000,
54                 DRSUAPI_SUPPORTED_EXTENSION_80000000                    = 0x80000000
55         } drsuapi_SupportedExtensions;
56
57         /* this is used by w2k */
58         typedef struct {
59                 drsuapi_SupportedExtensions supported_extensions;
60                 GUID site_guid;
61                 uint32 u1;
62         } drsuapi_DsBindInfo24;
63
64         /* this is used by w2k3 */
65         typedef struct {
66                 drsuapi_SupportedExtensions supported_extensions;
67                 GUID site_guid;
68                 uint32 u1;
69                 uint32 repl_epoch;
70         } drsuapi_DsBindInfo28;
71
72         typedef struct {
73                 [flag(NDR_REMAINING)] DATA_BLOB info;
74         } drsuapi_DsBindInfoFallBack;
75
76         typedef [nodiscriminant] union {
77                 [case(24)][subcontext(4)] drsuapi_DsBindInfo24 info24;
78                 [case(28)][subcontext(4)] drsuapi_DsBindInfo28 info28;
79                 [default][subcontext(4)] drsuapi_DsBindInfoFallBack FallBack;
80         } drsuapi_DsBindInfo;
81
82         /* the drsuapi_DsBindInfoCtr was this before
83          * typedef [flag(NDR_PAHEX)] struct {
84          *      [range(1,10000)] uint32 length;
85          *      [size_is(length)] uint8 data[];
86          * } drsuapi_DsBindInfo;
87          *
88          * but we don't want the caller to manually decode this blob,
89          * so we're doing it here
90          */
91
92         typedef struct {
93                 [range(1,10000)] uint32 length;
94                 [switch_is(length)] drsuapi_DsBindInfo info;
95         } drsuapi_DsBindInfoCtr;
96
97         /* this is a magic guid you need to pass to DsBind to make drsuapi_DsWriteAccountSpn() work
98          * 
99          * maybe the bind_guid could also be the invocation_id see drsuapi_DsReplicaConnection04
100          */
101         const string DRSUAPI_DS_BIND_GUID = "e24d201a-4fd6-11d1-a3da-0000f875ae0d";
102
103         WERROR drsuapi_DsBind(
104                 [in]        GUID *bind_guid,
105                 [in,out]    drsuapi_DsBindInfoCtr *bind_info,
106                 [out,ref]   policy_handle *bind_handle
107                 );
108
109         /*****************/
110         /* Function 0x01 */
111         WERROR drsuapi_DsUnbind(
112                 [in,out,ref] policy_handle *bind_handle
113                 );
114
115         /*****************/
116         /* Function 0x02 */
117         typedef [gensize] struct {
118                 [value(ndr_size_drsuapi_DsReplicaObjectIdentifier(r, ndr->flags)-4)] uint32 __ndr_size;
119                 [value(ndr_length_dom_sid(&r->sid))]  uint32 __ndr_size_sid;
120                 GUID guid;
121                 [subcontext_size(28),subcontext(0)] dom_sid sid;
122                 [flag(STR_SIZE4|STR_CHARLEN|STR_CONFORMANT)] string dn;
123         } drsuapi_DsReplicaObjectIdentifier;
124
125         typedef [public] bitmap {
126                 DRSUAPI_DS_REPLICA_SYNC_ASYNCHRONOUS_OPERATION  = 0x00000001,
127                 DRSUAPI_DS_REPLICA_SYNC_WRITEABLE               = 0x00000002,
128                 DRSUAPI_DS_REPLICA_SYNC_PERIODIC                = 0x00000004,
129                 DRSUAPI_DS_REPLICA_SYNC_INTERSITE_MESSAGING     = 0x00000008,
130                 DRSUAPI_DS_REPLICA_SYNC_ALL_SOURCES             = 0x00000010,
131                 DRSUAPI_DS_REPLICA_SYNC_FULL                    = 0x00000020,
132                 DRSUAPI_DS_REPLICA_SYNC_URGENT                  = 0x00000040,
133                 DRSUAPI_DS_REPLICA_SYNC_NO_DISCARD              = 0x00000080,
134                 DRSUAPI_DS_REPLICA_SYNC_FORCE                   = 0x00000100,
135                 DRSUAPI_DS_REPLICA_SYNC_ADD_REFERENCE           = 0x00000200,
136                 DRSUAPI_DS_REPLICA_SYNC_NEVER_COMPLETED         = 0x00000400,
137                 DRSUAPI_DS_REPLICA_SYNC_TWO_WAY                 = 0x00000800,
138                 DRSUAPI_DS_REPLICA_SYNC_NEVER_NOTIFY            = 0x00001000,
139                 DRSUAPI_DS_REPLICA_SYNC_INITIAL                 = 0x00002000,
140                 DRSUAPI_DS_REPLICA_SYNC_USE_COMPRESSION         = 0x00004000,
141                 DRSUAPI_DS_REPLICA_SYNC_ABANDONED               = 0x00008000,
142                 DRSUAPI_DS_REPLICA_SYNC_INITIAL_IN_PROGRESS     = 0x00010000,
143                 DRSUAPI_DS_REPLICA_SYNC_PARTIAL_ATTRIBUTE_SET   = 0x00020000,
144                 DRSUAPI_DS_REPLICA_SYNC_REQUEUE                 = 0x00040000,
145                 DRSUAPI_DS_REPLICA_SYNC_NOTIFICATION            = 0x00080000,
146                 DRSUAPI_DS_REPLICA_SYNC_ASYNCHRONOUS_REPLICA    = 0x00100000,
147                 DRSUAPI_DS_REPLICA_SYNC_CRITICAL                = 0x00200000,
148                 DRSUAPI_DS_REPLICA_SYNC_FULL_IN_PROGRESS        = 0x00400000,
149                 DRSUAPI_DS_REPLICA_SYNC_PREEMPTED               = 0x00800000
150         } drsuapi_DsReplicaSyncOptions;
151
152         typedef struct {
153                 drsuapi_DsReplicaObjectIdentifier *naming_context;
154                 GUID guid1;
155                 astring *string1;
156                 drsuapi_DsReplicaSyncOptions options;
157         } drsuapi_DsReplicaSyncRequest1;
158
159         typedef [switch_type(int32)] union {
160                 [case(1)] drsuapi_DsReplicaSyncRequest1 req1;
161         } drsuapi_DsReplicaSyncRequest;
162
163         WERROR drsuapi_DsReplicaSync(
164                 [in,ref] policy_handle *bind_handle,
165                 [in] int32 level,
166                 [in,switch_is(level)] drsuapi_DsReplicaSyncRequest req
167                 );
168
169         /*****************/
170         /* Function 0x03 */
171         typedef [public] struct {
172                 hyper tmp_highest_usn; /* updated after each object update */
173                 hyper reserved_usn;
174                 hyper highest_usn; /* updated after a full replication cycle */
175         } drsuapi_DsReplicaHighWaterMark;
176
177         typedef [public] struct {
178                 GUID source_dsa_invocation_id; /* the 'invocationId' field of the CN=NTDS Settings object */
179                 hyper highest_usn;  /* updated after a full replication cycle */
180         } drsuapi_DsReplicaCoursor;
181
182         typedef struct {
183                 uint32 u1;
184                 uint32 u2;
185                 [range(0,0x100000)] uint32 count;
186                 uint32 u3;
187                 [size_is(count)] drsuapi_DsReplicaCoursor coursors[];
188         } drsuapi_DsReplicaCoursor05Ctr;
189
190         typedef [public] bitmap {
191                 DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE                          = 0x00000010,
192                 DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP                    = 0x00000020,
193                 DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS                 = 0x00000040,
194                 DRSUAPI_DS_REPLICA_NEIGHBOUR_USE_ASYNC_INTERSIDE_TRANSPORT      = 0x00000080,
195                 DRSUAPI_DS_REPLICA_NEIGHBOUR_TWO_WAY_SYNC                       = 0x00000200,
196                 DRSUAPI_DS_REPLICA_NEIGHBOUR_RETURN_OBJECT_PARENTS              = 0x00000800,
197                 DRSUAPI_DS_REPLICA_NEIGHBOUR_FULL_IN_PROGRESS                   = 0x00010000,
198                 DRSUAPI_DS_REPLICA_NEIGHBOUR_FULL_NEXT_PACKET                   = 0x00020000,
199                 DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED                       = 0x00200000,
200                 DRSUAPI_DS_REPLICA_NEIGHBOUR_PREEMPTED                          = 0x01000000,
201                 DRSUAPI_DS_REPLICA_NEIGHBOUR_IGNORE_CHANGE_NOTIFICATIONS        = 0x04000000,
202                 DRSUAPI_DS_REPLICA_NEIGHBOUR_DISABLE_SCHEDULED_SYNC             = 0x08000000,
203                 DRSUAPI_DS_REPLICA_NEIGHBOUR_COMPRESS_CHANGES                   = 0x10000000,
204                 DRSUAPI_DS_REPLICA_NEIGHBOUR_NO_CHANGE_NOTIFICATIONS            = 0x20000000,
205                 DRSUAPI_DS_REPLICA_NEIGHBOUR_PARTIAL_ATTRIBUTE_SET              = 0x40000000
206         } drsuapi_DsReplicaNeighbourFlags;
207
208         typedef struct {
209                 GUID destination_dsa_guid;
210                 GUID source_dsa_guid;
211                 [ref] drsuapi_DsReplicaObjectIdentifier *naming_context;
212                 drsuapi_DsReplicaHighWaterMark highwatermark;
213                 drsuapi_DsReplicaCoursor05Ctr *uptodateness_vector;
214                 drsuapi_DsReplicaNeighbourFlags replica_flags;
215                 uint32 unknown2;
216                 uint32 unknown3;
217                 uint32 unknown4;
218                 hyper h1;
219         } drsuapi_DsGetNCChangesRequest5;
220
221         typedef [flag(NDR_PAHEX)] struct {
222                 [range(0,10000)] uint32 length;
223                 [size_is(length)] uint8 *byte_array[];
224         } drsuapi_DsGetNCChangesRequest_Ctr14;
225
226         typedef struct {
227                 uint32 unknown1;
228                 drsuapi_DsGetNCChangesRequest_Ctr14 data;
229         } drsuapi_DsGetNCChangesRequest_Ctr13;
230
231         typedef struct {
232                 [range(0,0x100000)] uint32 count;
233                 [size_is(count)] drsuapi_DsGetNCChangesRequest_Ctr13 *array[];
234         } drsuapi_DsGetNCChangesRequest_Ctr12;
235
236         typedef struct {
237                 GUID destination_dsa_guid;
238                 GUID source_dsa_guid;
239                 [ref] drsuapi_DsReplicaObjectIdentifier *naming_context;
240                 drsuapi_DsReplicaHighWaterMark highwatermark;
241                 drsuapi_DsReplicaCoursor05Ctr *uptodateness_vector;
242                 drsuapi_DsReplicaNeighbourFlags replica_flags;
243                 uint32 unknown2;
244                 uint32 unknown3;
245                 uint32 unknown4;
246                 hyper h1;
247                 uint32 unique_ptr1;
248                 uint32 unique_ptr2;
249                 drsuapi_DsGetNCChangesRequest_Ctr12 ctr12;
250         } drsuapi_DsGetNCChangesRequest8;
251
252         typedef [switch_type(int32)] union {
253                 [case(5)] drsuapi_DsGetNCChangesRequest5 req5;
254                 [case(8)] drsuapi_DsGetNCChangesRequest8 req8;
255         } drsuapi_DsGetNCChangesRequest;
256
257         typedef [public] struct {
258                 GUID source_dsa_invocation_id; /* the 'invocationId' field of the CN=NTDS Settings object */
259                 hyper highest_usn;  /* updated after a full replication cycle */
260                 NTTIME last_sync_success;
261         } drsuapi_DsReplicaCoursor2;
262
263         typedef struct {
264                 uint32 u1;
265                 uint32 u2;
266                 [range(0,0x100000)] uint32 count;
267                 uint32 u3;
268                 [size_is(count)] drsuapi_DsReplicaCoursor2 coursors[];
269         } drsuapi_DsReplicaCoursor2Ctr2;
270
271         typedef [v1_enum] enum {
272                 DRSUAPI_OBJECTCLASS_top         = 0x0
273         } drsuapi_DsObjectClassId;
274
275         typedef [v1_enum,public] enum {
276                 DRSUAPI_ATTRIBUTE_objectClass           = 0x00000000,
277                 DRSUAPI_ATTRIBUTE_description           = 0x0000000d,
278                 DRSUAPI_ATTRIBUTE_invocationId          = 0x00020073,
279                 DRSUAPI_ATTRIBUTE_ntSecurityDescriptor  = 0x00020119,
280                 DRSUAPI_ATTRIBUTE_objectSid             = 0x00090092,
281                 DRSUAPI_ATTRIBUTE_objectCategory        = 0x0009030e
282         } drsuapi_DsAttributeId;
283
284         /* Generic DATA_BLOB values */
285         typedef struct {
286                 [range(0,10485760)] uint32 length;
287                 DATA_BLOB *data;
288         } drsuapi_DsAttributeValueDataBlob;
289
290         typedef struct {
291                 [range(0,10485760)] uint32 num_values;
292                 [size_is(num_values)] drsuapi_DsAttributeValueDataBlob *values[];
293         } drsuapi_DsAttributeValueCtrDataBlob;
294
295         /* objectClass values */
296         typedef struct {
297                 [range(0,10485760)] uint32 length;
298                 [subcontext(4)] drsuapi_DsObjectClassId *objectClassId;
299         } drsuapi_DsAttributeValueObjectClassId;
300
301         typedef struct {
302                 [range(0,10485760)] uint32 num_values;
303                 [size_is(num_values)] drsuapi_DsAttributeValueObjectClassId *values[];
304         } drsuapi_DsAttributeValueCtrObjectClassId;
305
306         /* uint32 values */
307         typedef struct {
308                 [range(0,10485760)] uint32 length;
309                 [subcontext(4)] uint32 *value;
310         } drsuapi_DsAttributeValueUINT32;
311
312         typedef struct {
313                 [range(0,10485760)] uint32 num_values;
314                 [size_is(num_values)] drsuapi_DsAttributeValueUINT32 *values[];
315         } drsuapi_DsAttributeValueCtrUINT32;
316
317         /* UnicodeString values */
318         typedef struct {
319                 [range(0,10485760)] uint32 length;
320                 [subcontext(4)] nstring *string;
321         } drsuapi_DsAttributeValueUnicodeString;
322
323         typedef struct {
324                 [range(0,10485760)] uint32 num_values;
325                 [size_is(num_values)] drsuapi_DsAttributeValueUnicodeString *values[];
326         } drsuapi_DsAttributeValueCtrUnicodeString;
327
328         /* DN String values */
329         typedef [gensize] struct {
330                 [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->flags)-4)] uint32 __ndr_size;
331                 [value(ndr_length_dom_sid(&r->sid))]  uint32 __ndr_size_sid;
332                 GUID guid;
333                 [subcontext_size(28),subcontext(0)] dom_sid sid;
334                 [flag(STR_SIZE4|STR_CHARLEN)] string dn;
335         } drsuapi_DsReplicaObjectIdentifier3;
336
337         typedef  struct {
338                 [range(0,10485760)] uint32 length;
339                 [subcontext(4)] drsuapi_DsReplicaObjectIdentifier3 *object;
340         } drsuapi_DsAttributeValueDNString;
341
342         typedef struct {
343                 [range(0,10485760)] uint32 num_values;
344                 [size_is(num_values)] drsuapi_DsAttributeValueDNString *values[];
345         } drsuapi_DsAttributeValueCtrDNString;
346
347         /* GUID values */
348         typedef struct {
349                 [range(0,10485760)] uint32 length;
350                 [subcontext(4)] GUID *guid;
351         } drsuapi_DsAttributeValueGUID;
352
353         typedef struct {
354                 [range(0,10485760)] uint32 num_values;
355                 [size_is(num_values)] drsuapi_DsAttributeValueGUID *values[];
356         } drsuapi_DsAttributeValueCtrGUID;
357
358         /* SID values */
359         typedef struct {
360                 [range(0,10485760)] uint32 length;
361                 [subcontext(4)] dom_sid *sid;
362         } drsuapi_DsAttributeValueSID;
363
364         typedef struct {
365                 [range(0,10485760)] uint32 num_values;
366                 [size_is(num_values)] drsuapi_DsAttributeValueSID *values[];
367         } drsuapi_DsAttributeValueCtrSID;
368
369         /* SecurityDescriptor values */
370         typedef struct {
371                 [range(0,10485760)] uint32 length;
372                 [subcontext(4)] security_descriptor *sd;
373         } drsuapi_DsAttributeValueSecurityDescriptor;
374
375         typedef struct {
376                 [range(0,10485760)] uint32 num_values;
377                 [size_is(num_values)] drsuapi_DsAttributeValueSecurityDescriptor *values[];
378         } drsuapi_DsAttributeValueCtrSecurityDescriptor;
379
380         /* NTTIME_1sec values */
381         typedef struct {
382                 [range(0,10485760)] uint32 length;
383                 [subcontext(4)] NTTIME_1sec *time;
384         } drsuapi_DsAttributeValueNTTIME_1sec;
385
386         typedef struct {
387                 [range(0,10485760)] uint32 num_values;
388                 [size_is(num_values)] drsuapi_DsAttributeValueNTTIME_1sec *values[];
389         } drsuapi_DsAttributeValueCtrNTTIME_1sec;
390
391         typedef [nodiscriminant] union {
392                 [case(DRSUAPI_ATTRIBUTE_objectClass)] drsuapi_DsAttributeValueCtrObjectClassId object_class_id;
393
394                 /* UINT32 */
395                 [case(0x00020001)] drsuapi_DsAttributeValueCtrUINT32 uint32;
396                 [case(0x0002004c)] drsuapi_DsAttributeValueCtrUINT32 uint32;
397                 [case(0x000200a9)] drsuapi_DsAttributeValueCtrUINT32 uint32;
398                 [case(0x00090177)] drsuapi_DsAttributeValueCtrUINT32 uint32;
399                 [case(0x000905b3)] drsuapi_DsAttributeValueCtrUINT32 uint32;
400
401                 /* GUID */
402                 [case(DRSUAPI_ATTRIBUTE_invocationId)] drsuapi_DsAttributeValueCtrGUID guid;
403
404                 /* SID */
405                 [case(DRSUAPI_ATTRIBUTE_objectSid)] drsuapi_DsAttributeValueCtrSID sid;
406
407                 /* SecurityDescriptor */
408                 [case(DRSUAPI_ATTRIBUTE_ntSecurityDescriptor)] drsuapi_DsAttributeValueCtrSecurityDescriptor security_descriptor;
409
410                 /* UnicodeString */
411                 [case(DRSUAPI_ATTRIBUTE_description)]           drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
412                 [case(0x00090001)]                              drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
413                 [case(0x000900dd)]                              drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
414                 [case(0x0009037b)]                              drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
415
416                 /* DN String */
417                 [case(DRSUAPI_ATTRIBUTE_objectCategory)]        drsuapi_DsAttributeValueCtrDNString dn_string;
418                 [case(0x0002000e)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
419                 [case(0x00020024)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
420                 [case(0x00090171)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
421                 [case(0x0009071c)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
422                 [case(0x0009072c)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
423                 [case(0x0009026a)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
424                 [case(0x00090203)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
425
426                 /* NTTIME_1sec */
427                 [case(0x00020002)] drsuapi_DsAttributeValueCtrNTTIME_1sec nttime_1sec;
428
429                 /* the default is the DATA_BLOB */
430                 [default] drsuapi_DsAttributeValueCtrDataBlob data_blob;
431         } drsuapi_DsReplicaAttributeValueCtr;
432
433         typedef [flag(NDR_PAHEX)] struct {
434                 drsuapi_DsAttributeId attid;
435                 [switch_is(attid)] drsuapi_DsReplicaAttributeValueCtr value_ctr;
436         } drsuapi_DsReplicaAttribute;
437
438         typedef struct {
439                 [range(0,1048576)] uint32 num_attributes;
440                 [size_is(num_attributes)]  drsuapi_DsReplicaAttribute *attributes[];
441         } drsuapi_DsReplicaAttributeCtr;
442
443         typedef [public] struct {
444                 drsuapi_DsReplicaObjectIdentifier *identifier;
445                 uint32 unknown1;
446                 drsuapi_DsReplicaAttributeCtr attribute_ctr;
447         } drsuapi_DsReplicaObject;
448
449         typedef struct {
450                 uint32 version;
451                 NTTIME_1sec orginating_time;
452                 GUID orginating_invocation_id;
453                 hyper orginating_usn;
454         } drsuapi_DsReplicaMetaData;
455
456         typedef [public] struct {
457                 [range(0,1048576)] uint32 count;
458                 [size_is(count)] drsuapi_DsReplicaMetaData meta_data[];
459         } drsuapi_DsReplicaMetaDataCtr;
460
461         typedef [noprint] struct {
462                 drsuapi_DsReplicaObjectListItemEx *next_object;
463                 drsuapi_DsReplicaObject object;
464                 uint32 unknown1;
465                 GUID *parent_object_guid;
466                 drsuapi_DsReplicaMetaDataCtr *meta_data_ctr;
467         } drsuapi_DsReplicaObjectListItemEx;
468
469         typedef [gensize] struct {
470                 GUID guid1;
471                 GUID guid2;
472                 drsuapi_DsReplicaObjectIdentifier *naming_context;
473                 drsuapi_DsReplicaHighWaterMark old_highwatermark;
474                 drsuapi_DsReplicaHighWaterMark new_highwatermark;
475                 drsuapi_DsReplicaCoursor05Ctr *uptodateness_vector;
476                 drsuapi_DsGetNCChangesRequest_Ctr12 ctr12;
477                 uint32 unknown1;
478                 uint32 object_count;
479                 /* this +55 is sometimes +56, so I don't know where this comes from... --metze */
480                 [value(ndr_size_drsuapi_DsGetNCChangesCtr1(r,ndr->flags)+55)] uint32 __ndr_size;
481                 drsuapi_DsReplicaObjectListItemEx *first_object;
482                 uint32 unknown4;
483         } drsuapi_DsGetNCChangesCtr1;
484
485         typedef struct {
486                 uint32 unknown1;/* decompressed_length ? */
487                 uint32 compressed_length;
488                 DATA_BLOB *compressed;
489         } drsuapi_DsGetNCChangesCompressedInfo;
490
491         typedef struct {
492                 drsuapi_DsGetNCChangesCompressedInfo info;
493         } drsuapi_DsGetNCChangesCtr2;
494
495         typedef struct {
496                 GUID guid1;
497                 GUID guid2;
498                 drsuapi_DsReplicaObjectIdentifier *naming_context;
499                 drsuapi_DsReplicaHighWaterMark old_highwatermark;
500                 drsuapi_DsReplicaHighWaterMark new_highwatermark;
501                 drsuapi_DsReplicaCoursor05Ctr *uptodateness_vector;
502                 drsuapi_DsGetNCChangesRequest_Ctr12 ctr12;
503                 uint32 unknown1;
504                 uint32 unknown2;
505                 uint32 unknown3;
506                 drsuapi_DsReplicaObjectListItemEx *first_object;
507                 uint32 unknown4;
508                 uint32 unknown5;
509                 uint32 unknown6;
510                 uint32 len1;
511                 uint32 array_ptr1;
512                 uint32 unknown7;
513         } drsuapi_DsGetNCChangesCtr6;
514
515         typedef struct {
516                 uint32 unknown1;
517                 uint16 unknown2; /* enum */
518                 drsuapi_DsGetNCChangesCompressedInfo info;
519         } drsuapi_DsGetNCChangesCtr7;
520
521         typedef [switch_type(int32)] union {
522                 [case(1)] drsuapi_DsGetNCChangesCtr1 ctr1;
523                 [case(2)] drsuapi_DsGetNCChangesCtr2 ctr2;
524                 [case(6)] drsuapi_DsGetNCChangesCtr6 ctr6;
525                 [case(7)] drsuapi_DsGetNCChangesCtr7 ctr7;
526         } drsuapi_DsGetNCChangesCtr;
527
528         WERROR drsuapi_DsGetNCChanges(
529                 [in,ref] policy_handle *bind_handle,
530                 [in,out] int32 level,
531                 [in,switch_is(level)] drsuapi_DsGetNCChangesRequest req,
532                 [out,switch_is(level)] drsuapi_DsGetNCChangesCtr ctr
533                 );
534
535         /*****************/
536         /* Function 0x04 */
537         typedef bitmap {
538                 DRSUAPI_DS_REPLICA_UPDATE_ASYNCHRONOUS_OPERATION        = 0x00000001,
539                 DRSUAPI_DS_REPLICA_UPDATE_WRITEABLE                     = 0x00000002,
540                 DRSUAPI_DS_REPLICA_UPDATE_ADD_REFERENCE                 = 0x00000004,
541                 DRSUAPI_DS_REPLICA_UPDATE_DELETE_REFERENCE              = 0x00000008,
542                 DRSUAPI_DS_REPLICA_UPDATE_0x00000010                    = 0x00000010
543         } drsuapi_DsReplicaUpdateRefsOptions;
544
545         typedef struct {
546                 [ref] drsuapi_DsReplicaObjectIdentifier *naming_context;
547                 [ref] ascstr *dest_dsa_dns_name;
548                 GUID dest_dsa_guid;
549                 drsuapi_DsReplicaUpdateRefsOptions options;
550         } drsuapi_DsReplicaUpdateRefsRequest1;
551
552         typedef [switch_type(int32)] union {
553                 [case(1)] drsuapi_DsReplicaUpdateRefsRequest1 req1;
554         } drsuapi_DsReplicaUpdateRefsRequest;
555
556         WERROR drsuapi_DsReplicaUpdateRefs(
557                 [in,ref] policy_handle *bind_handle,
558                 [in] int32 level,
559                 [in,switch_is(level)] drsuapi_DsReplicaUpdateRefsRequest req
560                 );
561
562         /*****************/
563         /* Function 0x05 */
564         typedef bitmap {
565                 DRSUAPI_DS_REPLICA_ADD_ASYNCHRONOUS_OPERATION   = 0x00000001,
566                 DRSUAPI_DS_REPLICA_ADD_WRITEABLE                = 0x00000002
567                 /* TODO ... */
568         } drsuapi_DsReplicaAddOptions;
569
570         WERROR DRSUAPI_REPLICA_ADD();
571
572         /*****************/
573         /* Function 0x06 */
574         typedef bitmap {
575                 DRSUAPI_DS_REPLICA_DELETE_ASYNCHRONOUS_OPERATION        = 0x00000001,
576                 DRSUAPI_DS_REPLICA_DELETE_WRITEABLE                     = 0x00000002
577                 /* TODO ... */
578         } drsuapi_DsReplicaDeleteOptions;
579
580         WERROR DRSUAPI_REPLICA_DEL();
581
582         /*****************/
583         /* Function 0x07 */
584         typedef bitmap {
585                 DRSUAPI_DS_REPLICA_MODIFY_ASYNCHRONOUS_OPERATION        = 0x00000001,
586                 DRSUAPI_DS_REPLICA_MODIFY_WRITEABLE                     = 0x00000002
587         } drsuapi_DsReplicaModifyOptions;
588
589         WERROR DRSUAPI_REPLICA_MODIFY();
590
591         /*****************/
592         /* Function 0x08 */
593         WERROR DRSUAPI_VERIFY_NAMES();
594
595         /*****************/
596         /* Function 0x09 */
597         WERROR DRSUAPI_GET_MEMBERSHIPS();
598
599         /*****************/
600         /* Function 0x0a */
601         WERROR DRSUAPI_INTER_DOMAIN_MOVE();
602
603         /*****************/
604         /* Function 0x0b */
605         WERROR DRSUAPI_GET_NT4_CHANGELOG();
606
607         /*****************/
608         /* Function 0x0c */
609         typedef [v1_enum] enum {
610                 DRSUAPI_DS_NAME_STATUS_OK                       = 0,
611                 DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR            = 1,
612                 DRSUAPI_DS_NAME_STATUS_NOT_FOUND                = 2,
613                 DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE               = 3,
614                 DRSUAPI_DS_NAME_STATUS_NO_MAPPING               = 4,
615                 DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY              = 5,
616                 DRSUAPI_DS_NAME_STATUS_NO_SYNTACTICAL_MAPPING   = 6,
617                 DRSUAPI_DS_NAME_STATUS_TRUST_REFERRAL           = 7
618         } drsuapi_DsNameStatus;
619
620         typedef [v1_enum] enum {
621                 DRSUAPI_DS_NAME_FLAG_NO_FLAGS                   = 0x0,
622                 DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY           = 0x1,
623                 DRSUAPI_DS_NAME_FLAG_EVAL_AT_DC                 = 0x2,
624                 DRSUAPI_DS_NAME_FLAG_GCVERIFY                   = 0x4,
625                 DRSUAPI_DS_NAME_FLAG_TRUST_REFERRAL             = 0x8
626         } drsuapi_DsNameFlags;
627
628         typedef [v1_enum] enum {
629                 DRSUAPI_DS_NAME_FORMAT_UKNOWN                   = 0,
630                 DRSUAPI_DS_NAME_FORMAT_FQDN_1779                = 1,
631                 DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT              = 2,
632                 DRSUAPI_DS_NAME_FORMAT_DISPLAY                  = 3,
633                 DRSUAPI_DS_NAME_FORMAT_GUID                     = 6,
634                 DRSUAPI_DS_NAME_FORMAT_CANONICAL                = 7,
635                 DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL           = 8,
636                 DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX             = 9,
637                 DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL        = 10,
638                 DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY       = 11,
639                 DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN               = 12
640         } drsuapi_DsNameFormat;
641
642         typedef struct {
643                 unistr *str;
644         } drsuapi_DsNameString;
645
646         typedef struct {
647                 uint32 unknown1; /* 0x000004e4 */
648                 uint32 unknown2; /* 0x00000407 */
649                 drsuapi_DsNameFlags format_flags;
650                 drsuapi_DsNameFormat format_offered;
651                 drsuapi_DsNameFormat format_desired;
652                 [range(1,10000)] uint32 count;
653                 [size_is(count)] drsuapi_DsNameString *names[];
654         } drsuapi_DsNameRequest1;
655
656         typedef [switch_type(int32)] union {
657                 [case(1)] drsuapi_DsNameRequest1 req1;
658         } drsuapi_DsNameRequest;
659
660         typedef struct {
661                 drsuapi_DsNameStatus status;
662                 unistr *dns_domain_name;
663                 unistr *result_name;
664         } drsuapi_DsNameInfo1;
665
666         typedef struct {
667                 uint32 count;
668                 [size_is(count)] drsuapi_DsNameInfo1 *array[];
669         } drsuapi_DsNameCtr1;
670
671         typedef [switch_type(int32)] union {
672                 [case(1)] drsuapi_DsNameCtr1 *ctr1;
673         } drsuapi_DsNameCtr;
674
675         WERROR drsuapi_DsCrackNames(
676                 [in,ref] policy_handle *bind_handle,
677                 [in, out] int32 level,
678                 [in,switch_is(level)] drsuapi_DsNameRequest req,
679                 [out,switch_is(level)] drsuapi_DsNameCtr ctr
680                 );
681
682         /*****************/
683         /* Function 0x0d */
684         typedef [v1_enum] enum {
685                 DRSUAPI_DS_SPN_OPERATION_ADD    = 0,
686                 DRSUAPI_DS_SPN_OPERATION_REPLACE= 1,
687                 DRSUAPI_DS_SPN_OPERATION_DELETE = 2
688         } drsuapi_DsSpnOperation;
689
690         typedef struct {
691                 drsuapi_DsSpnOperation operation;
692                 uint32 unknown1;
693                 unistr *object_dn;
694                 [range(0,10000)] uint32 count;
695                 [size_is(count)] drsuapi_DsNameString *spn_names[];
696         } drsuapi_DsWriteAccountSpnRequest1;
697
698         typedef [switch_type(int32)] union {
699                 [case(1)] drsuapi_DsWriteAccountSpnRequest1 req1;
700         } drsuapi_DsWriteAccountSpnRequest;
701
702         typedef struct {
703                 WERROR status;
704         } drsuapi_DsWriteAccountSpnResult1;
705
706         typedef [switch_type(int32)] union {
707                 [case(1)] drsuapi_DsWriteAccountSpnResult1 res1;
708         } drsuapi_DsWriteAccountSpnResult;
709
710         WERROR drsuapi_DsWriteAccountSpn(
711                 [in,ref] policy_handle *bind_handle,
712                 [in, out] int32 level,
713                 [in,switch_is(level)] drsuapi_DsWriteAccountSpnRequest req,
714                 [out,switch_is(level)] drsuapi_DsWriteAccountSpnResult res
715                 );
716
717         /*****************/
718         /* Function 0x0e */
719         WERROR DRSUAPI_REMOVE_DS_SERVER();
720
721         /*****************/
722         /* Function 0x0f */
723         WERROR DRSUAPI_REMOVE_DS_DOMAIN();
724
725         /*****************/
726         /* Function 0x10 */
727         typedef struct {
728                 unistr *domain_name; /* netbios or dns */
729                 int32 level; /* specifies the switch level for the request */
730         } drsuapi_DsGetDCInfoRequest1;
731
732         typedef [switch_type(int32)] union {
733                 [case(1)] drsuapi_DsGetDCInfoRequest1 req1;
734         } drsuapi_DsGetDCInfoRequest;
735
736         typedef struct {
737                 unistr *netbios_name;
738                 unistr *dns_name;
739                 unistr *site_name;
740                 unistr *computer_dn;
741                 unistr *server_dn;
742                 uint32 is_pdc;
743                 uint32 is_enabled;
744         } drsuapi_DsGetDCInfo1;
745
746         typedef struct {
747                 [range(0,10000)] uint32 count;
748                 [size_is(count)] drsuapi_DsGetDCInfo1 *array[];
749         } drsuapi_DsGetDCInfoCtr1;
750
751         typedef struct {
752                 unistr *netbios_name;
753                 unistr *dns_name;
754                 unistr *site_name;
755                 unistr *site_dn;
756                 unistr *computer_dn;
757                 unistr *server_dn;
758                 unistr *ntds_dn;
759                 uint32 is_pdc;
760                 uint32 is_enabled;
761                 uint32 is_gc;
762                 GUID site_guid;
763                 GUID computer_guid;
764                 GUID server_guid;
765                 GUID ntds_guid;
766         } drsuapi_DsGetDCInfo2;
767
768         typedef struct {
769                 [range(0,10000)] uint32 count;
770                 [size_is(count)] drsuapi_DsGetDCInfo2 *array[];
771         } drsuapi_DsGetDCInfoCtr2;
772
773         typedef struct {
774                 uint32 unknown1;
775                 uint32 unknown2;
776                 uint32 unknown3;
777                 uint32 unknown4;
778                 uint32 unknown5;
779                 uint32 unknown6;
780                 unistr *server_nt4_account;
781         } drsuapi_DsGetDCInfo01;
782
783         typedef struct {
784                 [range(0,10000)] uint32 count;
785                 [size_is(count)] drsuapi_DsGetDCInfo01 *array[];
786         } drsuapi_DsGetDCInfoCtr01;
787
788         typedef [v1_enum] enum {
789                 DRSUAPI_DC_INFO_CTR_1  = 1,
790                 DRSUAPI_DC_INFO_CTR_2  = 2,
791                 DRSUAPI_DC_INFO_CTR_01 = -1
792         } drsuapi_DsGetDCInfoCtrLevels;
793
794         typedef [switch_type(int32)] union {
795                 [case(DRSUAPI_DC_INFO_CTR_1)]  drsuapi_DsGetDCInfoCtr1  ctr1;
796                 [case(DRSUAPI_DC_INFO_CTR_2)]  drsuapi_DsGetDCInfoCtr2  ctr2;
797                 [case(DRSUAPI_DC_INFO_CTR_01)] drsuapi_DsGetDCInfoCtr01 ctr01;
798         } drsuapi_DsGetDCInfoCtr;
799
800         WERROR drsuapi_DsGetDomainControllerInfo(
801                 [in,ref] policy_handle *bind_handle,
802                 [in, out] int32 level,
803                 [in,switch_is(level)] drsuapi_DsGetDCInfoRequest req,
804                 [out,switch_is(level)] drsuapi_DsGetDCInfoCtr ctr
805                 );
806
807         /*****************/
808         /* Function 0x11 */
809         typedef [noprint] struct {
810                 drsuapi_DsReplicaObjectListItem *next_object;
811                 drsuapi_DsReplicaObject object;
812         } drsuapi_DsReplicaObjectListItem;
813
814         typedef struct {
815                 drsuapi_DsReplicaObjectListItem first_object;
816         } drsuapi_DsAddEntryRequest2;
817
818         typedef [switch_type(int32)] union {
819                 [case(2)] drsuapi_DsAddEntryRequest2 req2;
820         } drsuapi_DsAddEntryRequest;
821
822         typedef struct {
823                 uint32 unknown1;
824                 uint32 unknown2;
825                 uint32 unknown3;
826         } drsuapi_DsAddEntryCtr3Info1;
827
828         typedef [switch_type(uint32)] union {
829                 [case(1)] drsuapi_DsAddEntryCtr3Info1 info1;
830         } drsuapi_DsAddEntryCtr3Info;
831
832         typedef struct {
833                 GUID guid;
834                 [subcontext_size(28),subcontext(0)] dom_sid sid;
835         } drsuapi_DsReplicaObjectIdentifier2;
836
837         typedef struct {
838                 drsuapi_DsReplicaObjectIdentifier *id;
839                 uint32 level;
840                 [switch_is(level)] drsuapi_DsAddEntryCtr3Info *info;
841                 [range(0,10000)] uint32 count;
842                 [size_is(count)] drsuapi_DsReplicaObjectIdentifier2 *objects[];
843         } drsuapi_DsAddEntryCtr3;
844
845         typedef [switch_type(int32)] union {
846                 [case(3)] drsuapi_DsAddEntryCtr3 ctr3;
847         } drsuapi_DsAddEntryCtr;
848
849         WERROR drsuapi_DsAddEntry(
850                 [in,ref] policy_handle *bind_handle,
851                 [in,out] int32 level,
852                 [in,switch_is(level)] drsuapi_DsAddEntryRequest req,
853                 [out,switch_is(level)] drsuapi_DsAddEntryCtr ctr
854                 );
855
856         /*****************/
857         /* Function 0x12 */
858         WERROR DRSUAPI_EXECUTE_KCC();
859
860         /*****************/
861         /* Function 0x13 */
862         typedef [v1_enum] enum {
863                 DRSUAPI_DS_REPLICA_GET_INFO                             = 1,
864                 DRSUAPI_DS_REPLICA_GET_INFO2                            = 2
865         } drsuapi_DsReplicaGetInfoLevel;
866
867         typedef [v1_enum] enum {
868                 DRSUAPI_DS_REPLICA_INFO_NEIGHBORS                       = 0,
869                 DRSUAPI_DS_REPLICA_INFO_CURSORS                         = 1,
870                 DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA                    = 2,
871                 DRSUAPI_DS_REPLICA_INFO_KCC_DSA_CONNECT_FAILURES        = 3,
872                 DRSUAPI_DS_REPLICA_INFO_KCC_DSA_LINK_FAILURES           = 4,
873                 DRSUAPI_DS_REPLICA_INFO_PENDING_OPS                     = 5,
874                 DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA        = 6,
875                 DRSUAPI_DS_REPLICA_INFO_CURSORS2                        = 7,
876                 DRSUAPI_DS_REPLICA_INFO_CURSORS3                        = 8,
877                 DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA2                   = 9,
878                 DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA2       = 10,
879                 DRSUAPI_DS_REPLICA_INFO_NEIGHBORS02                     = -2,
880                 DRSUAPI_DS_REPLICA_INFO_CONNECTIONS04                   = -4,
881                 DRSUAPI_DS_REPLICA_INFO_CURSURS05                       = -5,
882                 DRSUAPI_DS_REPLICA_INFO_06                              = -6
883         } drsuapi_DsReplicaInfoType;
884
885         typedef struct {
886                 drsuapi_DsReplicaInfoType info_type;
887                 unistr *object_dn;
888                 GUID guid1;
889         } drsuapi_DsReplicaGetInfoRequest1;
890
891         typedef struct {
892                 drsuapi_DsReplicaInfoType info_type;
893                 unistr *object_dn;
894                 GUID guid1;
895                 uint32 unknown1;
896                 unistr *string1;
897                 unistr *string2;
898                 uint32 unknown2;
899         } drsuapi_DsReplicaGetInfoRequest2;
900
901         typedef [switch_type(drsuapi_DsReplicaGetInfoLevel)] union {
902                 [case(DRSUAPI_DS_REPLICA_GET_INFO)] drsuapi_DsReplicaGetInfoRequest1 req1;
903                 [case(DRSUAPI_DS_REPLICA_GET_INFO2)] drsuapi_DsReplicaGetInfoRequest2 req2;
904         } drsuapi_DsReplicaGetInfoRequest;
905
906         typedef struct {
907                 unistr *naming_context_dn;
908                 unistr *source_dsa_obj_dn;
909                 unistr *source_dsa_address;
910                 unistr *transport_obj_dn;
911                 drsuapi_DsReplicaNeighbourFlags replica_flags;
912                 uint32 reserved;
913                 GUID naming_context_obj_guid;
914                 GUID source_dsa_obj_guid;
915                 GUID source_dsa_invocation_id;
916                 GUID transport_obj_guid;
917                 hyper tmp_highest_usn;
918                 hyper highest_usn;
919                 NTTIME last_success;
920                 NTTIME last_attempt;
921                 WERROR result_last_attempt;
922                 uint32 consecutive_sync_failures;
923         } drsuapi_DsReplicaNeighbour;
924
925         typedef struct {
926                 uint32 count;
927                 uint32 reserved;
928                 [size_is(count)] drsuapi_DsReplicaNeighbour array[];
929         } drsuapi_DsReplicaNeighbourCtr;
930
931         typedef struct {
932                 uint32 count;
933                 uint32 reserved;
934                 [size_is(count)] drsuapi_DsReplicaCoursor array[];
935         } drsuapi_DsReplicaCoursorCtr;
936
937         typedef struct {
938                 unistr *attribute_name;
939                 uint32 version;
940                 NTTIME originating_last_changed;
941                 GUID originating_dsa_invocation_id;
942                 hyper originating_usn;
943                 hyper local_usn;
944         } drsuapi_DsReplicaObjMetaData;
945
946         typedef struct {
947                 uint32 count;
948                 uint32 reserved;
949                 [size_is(count)] drsuapi_DsReplicaObjMetaData array[];
950         } drsuapi_DsReplicaObjMetaDataCtr;
951
952         typedef struct {
953                 unistr *dsa_obj_dn;
954                 GUID dsa_obj_guid;
955                 NTTIME first_failure;
956                 uint32 num_failures;
957                 WERROR last_result;
958         } drsuapi_DsReplicaKccDsaFailure;
959
960         typedef struct {
961                 uint32 count;
962                 uint32 reserved;
963                 [size_is(count)] drsuapi_DsReplicaKccDsaFailure array[];
964         } drsuapi_DsReplicaKccDsaFailuresCtr;
965
966         typedef enum {
967                 DRSUAPI_DS_REPLICA_OP_TYPE_SYNC         = 0,
968                 DRSUAPI_DS_REPLICA_OP_TYPE_ADD          = 1,
969                 DRSUAPI_DS_REPLICA_OP_TYPE_DELETE       = 2,
970                 DRSUAPI_DS_REPLICA_OP_TYPE_MODIFY       = 3,
971                 DRSUAPI_DS_REPLICA_OP_TYPE_UPDATE_REFS  = 4
972         } drsuapi_DsReplicaOpType;
973
974         typedef [switch_type(drsuapi_DsReplicaOpType)] union {
975                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_SYNC)]         drsuapi_DsReplicaSyncOptions sync;
976                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_ADD)]          drsuapi_DsReplicaAddOptions add;
977                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_DELETE)]       drsuapi_DsReplicaDeleteOptions delete;
978                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_MODIFY)]       drsuapi_DsReplicaModifyOptions modify;
979                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_UPDATE_REFS)]  drsuapi_DsReplicaUpdateRefsOptions update_refs;
980                 [default] uint32 unknown;
981         } drsuapi_DsRplicaOpOptions;
982
983         typedef struct {
984                 NTTIME operation_start;
985                 uint32 serial_num; /* unique till reboot */
986                 uint32 priority;
987                 drsuapi_DsReplicaOpType operation_type;
988                 [switch_is(operation_type)] drsuapi_DsRplicaOpOptions options;
989                 unistr *nc_dn;
990                 unistr *remote_dsa_obj_dn;
991                 unistr *remote_dsa_address;
992                 GUID nc_obj_guid;
993                 GUID remote_dsa_obj_guid;
994         } drsuapi_DsReplicaOp;
995
996         typedef struct {
997                 NTTIME time;
998                 uint32 count;
999                 [size_is(count)] drsuapi_DsReplicaOp array[];
1000         } drsuapi_DsReplicaOpCtr;
1001
1002         typedef struct {
1003                 unistr *attribute_name;
1004                 unistr *object_dn;
1005                 uint32 value_length;
1006                 [size_is(value_length)] uint8 *value[];
1007                 NTTIME deleted;
1008                 NTTIME created;
1009                 uint32 version;
1010                 NTTIME originating_last_changed;
1011                 GUID originating_dsa_invocation_id;
1012                 hyper originating_usn;
1013                 hyper local_usn;
1014         } drsuapi_DsReplicaAttrValMetaData;
1015
1016         typedef struct {
1017                 uint32 count;
1018                 int32 enumeration_context;
1019                 [size_is(count)] drsuapi_DsReplicaAttrValMetaData array[];
1020         } drsuapi_DsReplicaAttrValMetaDataCtr;
1021
1022         typedef struct {
1023                 uint32 count;
1024                 int32 enumeration_context;
1025                 [size_is(count)] drsuapi_DsReplicaCoursor2 array[];
1026         } drsuapi_DsReplicaCoursor2Ctr;
1027
1028         typedef struct {
1029                 GUID source_dsa_invocation_id;
1030                 hyper highest_usn;
1031                 NTTIME last_sync_success;
1032                 unistr *source_dsa_obj_dn;
1033         } drsuapi_DsReplicaCoursor3;
1034
1035         typedef struct {
1036                 uint32 count;
1037                 int32 enumeration_context;
1038                 [size_is(count)] drsuapi_DsReplicaCoursor3 array[];
1039         } drsuapi_DsReplicaCoursor3Ctr;
1040
1041         typedef struct {
1042                 unistr *attribute_name;
1043                 uint32 version;
1044                 NTTIME originating_last_changed;
1045                 GUID originating_dsa_invocation_id;
1046                 hyper originating_usn;
1047                 hyper local_usn;
1048                 unistr *originating_dsa_obj_dn;
1049         } drsuapi_DsReplicaObjMetaData2;
1050
1051         typedef struct {
1052                 uint32 count;
1053                 int32 enumeration_context;
1054                 [size_is(count)] drsuapi_DsReplicaObjMetaData2 array[];
1055         } drsuapi_DsReplicaObjMetaData2Ctr;
1056
1057         typedef struct {
1058                 unistr *attribute_name;
1059                 unistr *object_dn;
1060                 uint32 value_length;
1061                 [size_is(value_length)] uint8 *value[];
1062                 NTTIME deleted;
1063                 NTTIME created;
1064                 uint32 version;
1065                 NTTIME originating_last_changed;
1066                 GUID originating_dsa_invocation_id;
1067                 hyper originating_usn;
1068                 hyper local_usn;
1069                 unistr *originating_dsa_obj_dn;
1070         } drsuapi_DsReplicaAttrValMetaData2;
1071
1072         typedef struct {
1073                 uint32 count;
1074                 int32 enumeration_context;
1075                 [size_is(count)] drsuapi_DsReplicaAttrValMetaData2 array[];
1076         } drsuapi_DsReplicaAttrValMetaData2Ctr;
1077
1078         typedef struct {
1079                 hyper u1; /* session number? */
1080                 uint32 u2;
1081                 uint32 u3;
1082                 GUID bind_guid;
1083                 NTTIME_1sec bind_time;
1084                 uint32 u4; /* flags? */
1085                 uint32 u5;
1086         } drsuapi_DsReplicaConnection04;
1087
1088         typedef struct {
1089                 [range(0,10000)] uint32 count;
1090                 uint32 reserved;
1091                 [size_is(count)] drsuapi_DsReplicaConnection04 array[];
1092         } drsuapi_DsReplicaConnection04Ctr;
1093
1094         typedef struct {
1095                 unistr *str1;
1096                 uint32 u1;
1097                 uint32 u2;
1098                 uint32 u3;
1099                 uint32 u4;
1100                 uint32 u5;
1101                 hyper u6;
1102                 uint32 u7;
1103         } drsuapi_DsReplica06;
1104
1105         typedef struct {
1106                 [range(0,256)] uint32 count;
1107                 uint32 reserved;
1108                 [size_is(count)] drsuapi_DsReplica06 array[];
1109         } drsuapi_DsReplica06Ctr;
1110
1111         typedef [switch_type(drsuapi_DsReplicaInfoType)] union {
1112                 [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS)] drsuapi_DsReplicaNeighbourCtr *neighbours;
1113                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS)] drsuapi_DsReplicaCoursorCtr *coursors;
1114                 [case(DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA)] drsuapi_DsReplicaObjMetaDataCtr *objmetadata;
1115                 [case(DRSUAPI_DS_REPLICA_INFO_KCC_DSA_CONNECT_FAILURES)] drsuapi_DsReplicaKccDsaFailuresCtr *connectfailures;
1116                 [case(DRSUAPI_DS_REPLICA_INFO_KCC_DSA_LINK_FAILURES)] drsuapi_DsReplicaKccDsaFailuresCtr *linkfailures;
1117                 [case(DRSUAPI_DS_REPLICA_INFO_PENDING_OPS)] drsuapi_DsReplicaOpCtr *pendingops;
1118                 [case(DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA)] drsuapi_DsReplicaAttrValMetaDataCtr *attrvalmetadata;
1119                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS2)] drsuapi_DsReplicaCoursor2Ctr *coursors2;
1120                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS3)] drsuapi_DsReplicaCoursor3Ctr *coursors3;
1121                 [case(DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA2)] drsuapi_DsReplicaObjMetaData2Ctr *objmetadata2;
1122                 [case(DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA2)] drsuapi_DsReplicaAttrValMetaData2Ctr *attrvalmetadata2;
1123                 [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS02)] drsuapi_DsReplicaNeighbourCtr *neighbours02;
1124                 [case(DRSUAPI_DS_REPLICA_INFO_CONNECTIONS04)] drsuapi_DsReplicaConnection04Ctr *connections04;
1125                 [case(DRSUAPI_DS_REPLICA_INFO_CURSURS05)] drsuapi_DsReplicaCoursor05Ctr *coursors05;
1126                 [case(DRSUAPI_DS_REPLICA_INFO_06)] drsuapi_DsReplica06Ctr *i06;
1127         } drsuapi_DsReplicaInfo;
1128
1129         WERROR drsuapi_DsReplicaGetInfo(
1130                 [in,ref] policy_handle *bind_handle,
1131                 [in] drsuapi_DsReplicaGetInfoLevel level,
1132                 [in,switch_is(level)] drsuapi_DsReplicaGetInfoRequest req,
1133                 [out] drsuapi_DsReplicaInfoType info_type,
1134                 [out,switch_is(info_type)] drsuapi_DsReplicaInfo info
1135                 );
1136
1137         /*****************/
1138         /* Function 0x14 */
1139         WERROR DRSUAPI_ADD_SID_HISTORY();
1140
1141         /*****************/
1142         /* Function 0x15 */
1143         WERROR DRSUAPI_GET_MEMBERSHIPS2();
1144
1145         /*****************/
1146         /* Function 0x16 */
1147         WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS();
1148
1149         /*****************/
1150         /* Function 0x17 */
1151         WERROR DRSUAPI_GET_OBJECT_EXISTENCE();
1152
1153         /*****************/
1154         /* Function 0x18 */
1155         WERROR DRSUAPI_QUERY_SITES_BY_COST();
1156 }