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