r17438: extend the comment
[samba.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,misc,samr),
11   keepref
12
13 interface drsuapi
14 {
15         declare bitmap samr_GroupAttrs;
16
17         /*****************/
18         /* Function 0x00 */
19         typedef [bitmap32bit] bitmap {
20                 DRSUAPI_SUPPORTED_EXTENSION_BASE                        = 0x00000001,
21                 DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATION           = 0x00000002,
22                 DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPI                   = 0x00000004,
23                 DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2                  = 0x00000008,
24                 DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESS             = 0x00000010,
25                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1                   = 0x00000020,
26                 DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION    = 0x00000040,
27                 DRSUAPI_SUPPORTED_EXTENSION_00000080                    = 0x00000080,
28                 DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE                 = 0x00000100,
29                 DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2                 = 0x00000200,
30                 DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION    = 0x00000400,
31                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2                   = 0x00000800,
32                 DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD= 0x00001000,
33                 DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BIND                 = 0x00002000,
34                 DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFO               = 0x00004000,
35                 DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTION           = 0x00008000,
36                 DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01                  = 0x00010000,
37                 DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIP       = 0x00020000,
38                 DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY             = 0x00040000,
39                 DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3                  = 0x00080000,
40                 DRSUAPI_SUPPORTED_EXTENSION_00100000                    = 0x00100000,
41                 DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2            = 0x00200000,
42                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6                = 0x00400000,
43                 DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCS               = 0x00800000,
44                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8                = 0x01000000,
45                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5              = 0x02000000,
46                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6              = 0x04000000,
47                 /*
48                  * the following 3 have the same value
49                  * repadmin.exe /bind says that
50                  */
51                 DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3            = 0x08000000,
52                 DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7              = 0x08000000,
53                 DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT               = 0x08000000,
54                 DRSUAPI_SUPPORTED_EXTENSION_XPRESS_COMPRESS             = 0x10000000,
55                 DRSUAPI_SUPPORTED_EXTENSION_20000000                    = 0x20000000,
56                 DRSUAPI_SUPPORTED_EXTENSION_40000000                    = 0x40000000,
57                 DRSUAPI_SUPPORTED_EXTENSION_80000000                    = 0x80000000
58         } drsuapi_SupportedExtensions;
59
60         /* this is used by w2k */
61         typedef struct {
62                 drsuapi_SupportedExtensions supported_extensions;
63                 GUID site_guid;
64                 uint32 u1;
65         } drsuapi_DsBindInfo24;
66
67         /* this is used by w2k3 */
68         typedef struct {
69                 drsuapi_SupportedExtensions supported_extensions;
70                 GUID site_guid;
71                 uint32 u1;
72                 uint32 repl_epoch;
73         } drsuapi_DsBindInfo28;
74
75         typedef struct {
76                 [flag(NDR_REMAINING)] DATA_BLOB info;
77         } drsuapi_DsBindInfoFallBack;
78
79         typedef [nodiscriminant] union {
80                 [case(24)][subcontext(4)] drsuapi_DsBindInfo24 info24;
81                 [case(28)][subcontext(4)] drsuapi_DsBindInfo28 info28;
82                 [default][subcontext(4)] drsuapi_DsBindInfoFallBack FallBack;
83         } drsuapi_DsBindInfo;
84
85         /* the drsuapi_DsBindInfoCtr was this before
86          * typedef [flag(NDR_PAHEX)] struct {
87          *      [range(1,10000)] uint32 length;
88          *      [size_is(length)] uint8 data[];
89          * } drsuapi_DsBindInfo;
90          *
91          * but we don't want the caller to manually decode this blob,
92          * so we're doing it here
93          */
94
95         typedef struct {
96                 [range(1,10000)] uint32 length;
97                 [switch_is(length)] drsuapi_DsBindInfo info;
98         } drsuapi_DsBindInfoCtr;
99
100         /* this is a magic guid you need to pass to DsBind to make drsuapi_DsWriteAccountSpn() work
101          * 
102          * maybe the bind_guid could also be the invocation_id see drsuapi_DsReplicaConnection04
103          */
104         const char *DRSUAPI_DS_BIND_GUID = "e24d201a-4fd6-11d1-a3da-0000f875ae0d";
105         /* 
106          * this magic guid are needed to fetch the whole tree with drsuapi_DsGetNCChanges()
107          * as administrator and this values are also used in the destination_dsa_guid field
108          * of drsuapi_DsGetNCChangesReq5/8 and the source_dsa_guid is zero.
109          */
110         const char *DRSUAPI_DS_BIND_GUID_W2K    = "6abec3d1-3054-41c8-a362-5a0c5b7d5d71";
111         const char *DRSUAPI_DS_BIND_GUID_W2K3   = "6afab99c-6e26-464a-975f-f58f105218bc";
112
113         WERROR drsuapi_DsBind(
114                 [in,unique]         GUID *bind_guid,
115                 [in,out,unique]    drsuapi_DsBindInfoCtr *bind_info,
116                 [out]   policy_handle *bind_handle
117                 );
118
119         /*****************/
120         /* Function 0x01 */
121         WERROR drsuapi_DsUnbind(
122                 [in,out] policy_handle *bind_handle
123                 );
124
125         /*****************/
126         /* Function 0x02 */
127         typedef [public,gensize] struct {
128                 [value(ndr_size_drsuapi_DsReplicaObjectIdentifier(r, ndr->flags)-4)] uint32 __ndr_size;
129                 [value(ndr_size_dom_sid(&r->sid, ndr->flags))]  uint32 __ndr_size_sid;
130                 GUID guid;
131                 dom_sid28 sid;
132                 [flag(STR_SIZE4|STR_CHARLEN|STR_CONFORMANT)] string dn;
133         } drsuapi_DsReplicaObjectIdentifier;
134
135         typedef [public] bitmap {
136                 DRSUAPI_DS_REPLICA_SYNC_ASYNCHRONOUS_OPERATION  = 0x00000001,
137                 DRSUAPI_DS_REPLICA_SYNC_WRITEABLE               = 0x00000002,
138                 DRSUAPI_DS_REPLICA_SYNC_PERIODIC                = 0x00000004,
139                 DRSUAPI_DS_REPLICA_SYNC_INTERSITE_MESSAGING     = 0x00000008,
140                 DRSUAPI_DS_REPLICA_SYNC_ALL_SOURCES             = 0x00000010,
141                 DRSUAPI_DS_REPLICA_SYNC_FULL                    = 0x00000020,
142                 DRSUAPI_DS_REPLICA_SYNC_URGENT                  = 0x00000040,
143                 DRSUAPI_DS_REPLICA_SYNC_NO_DISCARD              = 0x00000080,
144                 DRSUAPI_DS_REPLICA_SYNC_FORCE                   = 0x00000100,
145                 DRSUAPI_DS_REPLICA_SYNC_ADD_REFERENCE           = 0x00000200,
146                 DRSUAPI_DS_REPLICA_SYNC_NEVER_COMPLETED         = 0x00000400,
147                 DRSUAPI_DS_REPLICA_SYNC_TWO_WAY                 = 0x00000800,
148                 DRSUAPI_DS_REPLICA_SYNC_NEVER_NOTIFY            = 0x00001000,
149                 DRSUAPI_DS_REPLICA_SYNC_INITIAL                 = 0x00002000,
150                 DRSUAPI_DS_REPLICA_SYNC_USE_COMPRESSION         = 0x00004000,
151                 DRSUAPI_DS_REPLICA_SYNC_ABANDONED               = 0x00008000,
152                 DRSUAPI_DS_REPLICA_SYNC_INITIAL_IN_PROGRESS     = 0x00010000,
153                 DRSUAPI_DS_REPLICA_SYNC_PARTIAL_ATTRIBUTE_SET   = 0x00020000,
154                 DRSUAPI_DS_REPLICA_SYNC_REQUEUE                 = 0x00040000,
155                 DRSUAPI_DS_REPLICA_SYNC_NOTIFICATION            = 0x00080000,
156                 DRSUAPI_DS_REPLICA_SYNC_ASYNCHRONOUS_REPLICA    = 0x00100000,
157                 DRSUAPI_DS_REPLICA_SYNC_CRITICAL                = 0x00200000,
158                 DRSUAPI_DS_REPLICA_SYNC_FULL_IN_PROGRESS        = 0x00400000,
159                 DRSUAPI_DS_REPLICA_SYNC_PREEMPTED               = 0x00800000
160         } drsuapi_DsReplicaSyncOptions;
161
162         typedef struct {
163                 drsuapi_DsReplicaObjectIdentifier *naming_context;
164                 GUID guid1;
165                 astring *string1;
166                 drsuapi_DsReplicaSyncOptions options;
167         } drsuapi_DsReplicaSyncRequest1;
168
169         typedef [switch_type(int32)] union {
170                 [case(1)] drsuapi_DsReplicaSyncRequest1 req1;
171         } drsuapi_DsReplicaSyncRequest;
172
173         WERROR drsuapi_DsReplicaSync(
174                 [in] policy_handle *bind_handle,
175                 [in] int32 level,
176                 [in,switch_is(level)] drsuapi_DsReplicaSyncRequest req
177                 );
178
179         /*****************/
180         /* Function 0x03 */
181         typedef [public] struct {
182                 hyper tmp_highest_usn; /* updated after each object update */
183                 hyper reserved_usn;
184                 hyper highest_usn; /* updated after a full replication cycle */
185         } drsuapi_DsReplicaHighWaterMark;
186
187         typedef [public] struct {
188                 GUID source_dsa_invocation_id; /* the 'invocationId' field of the CN=NTDS Settings object */
189                 hyper highest_usn;  /* updated after a full replication cycle */
190         } drsuapi_DsReplicaCoursor;
191
192         typedef struct {
193                 uint32 u1;
194                 uint32 u2;
195                 [range(0,0x100000)] uint32 count;
196                 uint32 u3;
197                 [size_is(count)] drsuapi_DsReplicaCoursor coursors[];
198         } drsuapi_DsReplicaCoursorCtrEx;
199
200         typedef [public] bitmap {
201                 /* the _WRITEABLE flag seems to indicate a replication with all attributes,
202                  * and I'm currently always on error when it's set, but w2k and w2k3 uses it
203                  * in the dc join
204                  * --metze
205                  */
206                 DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE                          = 0x00000010,
207                 DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP                    = 0x00000020,
208                 DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS                 = 0x00000040,
209                 DRSUAPI_DS_REPLICA_NEIGHBOUR_USE_ASYNC_INTERSIDE_TRANSPORT      = 0x00000080,
210                 DRSUAPI_DS_REPLICA_NEIGHBOUR_TWO_WAY_SYNC                       = 0x00000200,
211                 DRSUAPI_DS_REPLICA_NEIGHBOUR_RETURN_OBJECT_PARENTS              = 0x00000800,
212                 DRSUAPI_DS_REPLICA_NEIGHBOUR_FULL_IN_PROGRESS                   = 0x00010000,
213                 DRSUAPI_DS_REPLICA_NEIGHBOUR_FULL_NEXT_PACKET                   = 0x00020000,
214                 DRSUAPI_DS_REPLICA_NEIGHBOUR_NEVER_SYNCED                       = 0x00200000,
215                 DRSUAPI_DS_REPLICA_NEIGHBOUR_PREEMPTED                          = 0x01000000,
216                 DRSUAPI_DS_REPLICA_NEIGHBOUR_IGNORE_CHANGE_NOTIFICATIONS        = 0x04000000,
217                 DRSUAPI_DS_REPLICA_NEIGHBOUR_DISABLE_SCHEDULED_SYNC             = 0x08000000,
218                 /* 
219                  * the following NOTE applies to DsGetNCChangesRequest5:
220                  *  - the data is only compressed when 10 or more objects are replicated
221                  *  - but there could also be a size limit of 35 KBytes or something like that
222                  *  - the reply is DsGetNCChangesCtr2
223                  *  - maybe the same applies to DsGetNCChangesRequest8...
224                  *
225                  *  --metze
226                  */
227                 DRSUAPI_DS_REPLICA_NEIGHBOUR_COMPRESS_CHANGES                   = 0x10000000,
228                 DRSUAPI_DS_REPLICA_NEIGHBOUR_NO_CHANGE_NOTIFICATIONS            = 0x20000000,
229                 DRSUAPI_DS_REPLICA_NEIGHBOUR_PARTIAL_ATTRIBUTE_SET              = 0x40000000
230         } drsuapi_DsReplicaNeighbourFlags;
231
232         typedef struct {
233                 GUID destination_dsa_guid;
234                 GUID source_dsa_guid;
235                 [ref] drsuapi_DsReplicaObjectIdentifier *naming_context;
236                 drsuapi_DsReplicaHighWaterMark highwatermark;
237                 drsuapi_DsReplicaCoursorCtrEx *uptodateness_vector;
238                 drsuapi_DsReplicaNeighbourFlags replica_flags;
239                 uint32 unknown2;
240                 uint32 unknown3;
241                 uint32 unknown4;
242                 hyper h1;
243         } drsuapi_DsGetNCChangesRequest5;
244
245         typedef [flag(NDR_PAHEX)] struct {
246                 [range(0,10000)] uint32 length;
247                 [size_is(length)] uint8 *byte_array;
248         } drsuapi_DsGetNCChangesRequest_Ctr14;
249
250         typedef struct {
251                 uint32 unknown1;
252                 drsuapi_DsGetNCChangesRequest_Ctr14 data;
253         } drsuapi_DsGetNCChangesRequest_Ctr13;
254
255         typedef struct {
256                 [range(0,0x100000)] uint32 count;
257                 [size_is(count)] drsuapi_DsGetNCChangesRequest_Ctr13 *array;
258         } drsuapi_DsGetNCChangesRequest_Ctr12;
259
260         typedef struct {
261                 GUID destination_dsa_guid;
262                 GUID source_dsa_guid;
263                 [ref] drsuapi_DsReplicaObjectIdentifier *naming_context;
264                 drsuapi_DsReplicaHighWaterMark highwatermark;
265                 drsuapi_DsReplicaCoursorCtrEx *uptodateness_vector;
266                 drsuapi_DsReplicaNeighbourFlags replica_flags;
267                 uint32 unknown2;
268                 uint32 unknown3;
269                 uint32 unknown4;
270                 hyper h1;
271                 uint32 unique_ptr1;
272                 uint32 unique_ptr2;
273                 drsuapi_DsGetNCChangesRequest_Ctr12 ctr12;
274         } drsuapi_DsGetNCChangesRequest8;
275
276         typedef [switch_type(int32)] union {
277                 [case(5)] drsuapi_DsGetNCChangesRequest5 req5;
278                 [case(8)] drsuapi_DsGetNCChangesRequest8 req8;
279         } drsuapi_DsGetNCChangesRequest;
280
281         typedef [public] struct {
282                 GUID source_dsa_invocation_id; /* the 'invocationId' field of the CN=NTDS Settings object */
283                 hyper highest_usn;  /* updated after a full replication cycle */
284                 NTTIME last_sync_success;
285         } drsuapi_DsReplicaCoursor2;
286
287         typedef struct {
288                 uint32 u1;
289                 uint32 u2;
290                 [range(0,0x100000)] uint32 count;
291                 uint32 u3;
292                 [size_is(count)] drsuapi_DsReplicaCoursor2 coursors[];
293         } drsuapi_DsReplicaCoursor2CtrEx;
294
295         /*
296          * In DRSUAPI the objectClasses and attributes
297          * are identified by uint32 values, but in the schema
298          * they are identified by the governsID (objectClasses)
299          * and attributeID (attributes)
300          *
301          * the following table shows the mapping used between the two representations
302          * e.g. - objectClass 'nTDSDSA' has governsID: 1.2.840.113556.1.5.7000.47
303          *        and a UINT32-ID of '0x0017002F'.
304          *      - so the OID 1.2.840.113556.1.5.7000.47 is splitted into a
305          *        OID-prefix: 1.2.840.113556.1.5.7000
306          *        and a value: 47 => 0x2F
307          *      - the mapping table gives a UINT32-prefix: 0x00170000
308          *      - and the UINT32-ID is 0x0017002F = 0x00170000 | 0x2F
309          *
310          * OID-prefix                   => UINT32-Id prefix
311          *
312          * 2.5.4.*                      => 0x00000000 (standard attributes RFC2256 core.schema)
313          * 2.5.6.*                      => 0x00010000 (standard object classes RFC2256 core.schema)
314          * 1.2.840.113556.1.2.*         => 0x00020000
315          * 1.2.840.113556.1.3.*         => 0x00030000
316          * 1.2.840.113556.1.4.*         => 0x00090000
317          * 1.2.840.113556.1.5.*         => 0x000A0000
318          * 2.16.840.1.113730.3.*        => 0x00140000
319          * 0.9.2342.19200300.100.1.*    => 0x00150000
320          * 2.16.840.1.113730.3.1.*      => 0x00160000
321          * 1.2.840.113556.1.5.7000.*    => 0x00170000
322          * 2.5.20.*                     => 0x001A0000
323          * 2.16.840.1.113730.3.2.*      => 0x001C0000
324          * 1.3.6.1.4.1.250.1.*          => 0x001D0000
325          * 0.9.2342.19200300.100.4.*    => 0x001F0000
326          *
327          * 1.2.840.113549.1.9.*         (unstructuredAddress,unstructuredName)
328          * 1.3.6.1.4.1.1466.101.119.2   (dynamicObject)
329          * 1.3.6.1.4.1.1466.101.119.3   (entryTTL)
330          * 2.5.18.*                     (createTimeStamp,modifyTimeStamp, SubSchema)            
331          * 2.5.21.*                     (attrs for SubSchema)
332          *
333          * Here's a list of used 'attributeSyntax' OID's
334          *
335          * 2.5.5.1      => Object(DS-DN) string
336          *                 struct drsuapi_DsObjectIdentifier3
337          *
338          * 2.5.5.2      => OID-string
339          *              => mayContain, mustContain... also have this syntax but have string values
340          *
341          * 2.5.5.4      => String(Teletex) case-insensitive string with teletex charset
342          *
343          * 2.5.5.5      => String(IA5) case-sensitive string
344          *
345          * 2.5.5.6      => String(Numeric)
346          *              => eg. internationalISDNNumber
347          *
348          * 2.5.5.7      => Object(DN-Binary) B:<byte count>:<bytes>:<object DN>
349          *              => e.g. wellKnownObjects
350          *
351          * 2.5.5.8      => BOOL
352          *
353          * 2.5.5.9      => int32
354          *
355          * 2.5.5.10     => DATA_BLOB
356          *              => struct GUID
357          *
358          * 2.5.5.11     => LDAP timestring
359          *              => NTTIME_1sec
360          *
361          * 2.5.5.12     => String(Unicode) case-insensitive string
362          *              => 'standard strings'
363          *
364          * 2.5.5.13     => Object(Presentation-Address) string
365          *              => used in objectClass applicationEntity
366          *
367          * 2.5.5.14     => Object(DN-String) S:<char count>:<string>:<object DN>
368          *              => not used
369          *
370          * 2.5.5.15     => ntSecurityDescriptor
371          *
372          * 2.5.5.16     => int64
373          *
374          * 2.5.5.17     => dom_sid
375          */
376
377         typedef [flag(NDR_PAHEX),v1_enum] enum {
378                 DRSUAPI_OBJECTCLASS_top                 = 0x00010000
379         } drsuapi_DsObjectClassId;
380
381         typedef [flag(NDR_PAHEX),v1_enum,public] enum {
382                 DRSUAPI_ATTRIBUTE_objectClass                   = 0x00000000,
383                 DRSUAPI_ATTRIBUTE_description                   = 0x0000000d,
384                 DRSUAPI_ATTRIBUTE_member                        = 0x0000001f,
385                 DRSUAPI_ATTRIBUTE_hasMasterNCs                  = 0x0002000e,
386                 DRSUAPI_ATTRIBUTE_invocationId                  = 0x00020073,
387                 DRSUAPI_ATTRIBUTE_dMDLocation                   = 0x00020024,
388                 DRSUAPI_ATTRIBUTE_ntSecurityDescriptor          = 0x00020119,
389                 DRSUAPI_ATTRIBUTE_objectSid                     = 0x00090092,
390                 DRSUAPI_ATTRIBUTE_dBCSPwd                       = 0x00090037,/* lmPwdHash */
391                 DRSUAPI_ATTRIBUTE_unicodePwd                    = 0x0009005a,/* ntPwdHash */
392                 DRSUAPI_ATTRIBUTE_ntPwdHistory                  = 0x0009005e,
393                 DRSUAPI_ATTRIBUTE_lmPwdHistory                  = 0x000900a0,
394                 DRSUAPI_ATTRIBUTE_supplementalCredentials       = 0x0009007d,
395                 DRSUAPI_ATTRIBUTE_systemFlags                   = 0x00090177,
396                 DRSUAPI_ATTRIBUTE_serverReference               = 0x00090203,
397                 DRSUAPI_ATTRIBUTE_objectCategory                = 0x0009030e,
398                 DRSUAPI_ATTRIBUTE_msDS_Behavior_Version         = 0x000905b3,
399                 DRSUAPI_ATTRIBUTE_msDS_KeyVersionNumber         = 0x000906f6,           
400                 DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs             = 0x0009071c,
401                 DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs             = 0x0009072c
402         } drsuapi_DsAttributeId;
403
404         /* Generic DATA_BLOB values */
405         typedef struct {
406                 [range(0,10485760)] uint32 length;
407                 DATA_BLOB *data;
408         } drsuapi_DsAttributeValueDataBlob;
409
410         typedef struct {
411                 [range(0,10485760)] uint32 num_values;
412                 [size_is(num_values)] drsuapi_DsAttributeValueDataBlob *values;
413         } drsuapi_DsAttributeValueCtrDataBlob;
414
415         /* objectClass values */
416         typedef struct {
417                 [range(0,10485760),value(4)] uint32 __ndr_size;
418                 [subcontext(4)] drsuapi_DsObjectClassId *objectClassId;
419         } drsuapi_DsAttributeValueObjectClassId;
420
421         typedef struct {
422                 [range(0,10485760)] uint32 num_values;
423                 [size_is(num_values)] drsuapi_DsAttributeValueObjectClassId *values;
424         } drsuapi_DsAttributeValueCtrObjectClassId;
425
426         /* uint32 values */
427         typedef struct {
428                 [range(0,10485760),value(4)] uint32 __ndr_size;
429                 [subcontext(4)] uint32 *value;
430         } drsuapi_DsAttributeValueUINT32;
431
432         typedef struct {
433                 [range(0,10485760)] uint32 num_values;
434                 [size_is(num_values)] drsuapi_DsAttributeValueUINT32 *values;
435         } drsuapi_DsAttributeValueCtrUINT32;
436
437         /* UnicodeString values */
438         typedef struct {
439                 [range(0,10485760)] uint32 length;
440                 [subcontext(4)] nstring *string;
441         } drsuapi_DsAttributeValueUnicodeString;
442
443         typedef struct {
444                 [range(0,10485760)] uint32 num_values;
445                 [size_is(num_values)] drsuapi_DsAttributeValueUnicodeString *values;
446         } drsuapi_DsAttributeValueCtrUnicodeString;
447
448         /* DN String values */
449         typedef [public,gensize] struct {
450                 [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->flags))] uint32 __ndr_size;
451                 [value(ndr_size_dom_sid(&r->sid,ndr->flags))]  uint32 __ndr_size_sid;
452                 GUID guid;
453                 dom_sid28 sid;
454                 [flag(STR_SIZE4|STR_CHARLEN)] string dn;
455         } drsuapi_DsReplicaObjectIdentifier3;
456
457         typedef struct {
458                 [range(0,10485760),value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(object, ndr->flags))] uint32 __ndr_size;
459                 [subcontext(4),subcontext_size(__ndr_size)] drsuapi_DsReplicaObjectIdentifier3 *object;
460         } drsuapi_DsAttributeValueDNString;
461
462         typedef struct {
463                 [range(0,10485760)] uint32 num_values;
464                 [size_is(num_values)] drsuapi_DsAttributeValueDNString *values;
465         } drsuapi_DsAttributeValueCtrDNString;
466
467         /* GUID values */
468         typedef struct {
469                 [range(0,10485760),value(ndr_size_GUID(guid, ndr->flags))] uint32 __ndr_size;
470                 [subcontext(4)] GUID *guid;
471         } drsuapi_DsAttributeValueGUID;
472
473         typedef struct {
474                 [range(0,10485760)] uint32 num_values;
475                 [size_is(num_values)] drsuapi_DsAttributeValueGUID *values;
476         } drsuapi_DsAttributeValueCtrGUID;
477
478         /* SID values */
479         typedef struct {
480                 [range(0,10485760),value(ndr_size_dom_sid(sid,ndr->flags))] uint32 __ndr_size;
481                 [subcontext(4)] dom_sid *sid;
482         } drsuapi_DsAttributeValueSID;
483
484         typedef struct {
485                 [range(0,10485760)] uint32 num_values;
486                 [size_is(num_values)] drsuapi_DsAttributeValueSID *values;
487         } drsuapi_DsAttributeValueCtrSID;
488
489         /* SecurityDescriptor values */
490         typedef struct {
491                 [range(0,10485760),value(ndr_size_security_descriptor(sd,ndr->flags))] uint32 __ndr_size;
492                 [subcontext(4)] security_descriptor *sd;
493         } drsuapi_DsAttributeValueSecurityDescriptor;
494
495         typedef struct {
496                 [range(0,10485760)] uint32 num_values;
497                 [size_is(num_values)] drsuapi_DsAttributeValueSecurityDescriptor *values;
498         } drsuapi_DsAttributeValueCtrSecurityDescriptor;
499
500         /* NTTIME_1sec values */
501         typedef struct {
502                 [range(0,10485760),value(8)] uint32 __ndr_size;
503                 [subcontext(4)] NTTIME_1sec *time;
504         } drsuapi_DsAttributeValueNTTIME_1sec;
505
506         typedef struct {
507                 [range(0,10485760)] uint32 num_values;
508                 [size_is(num_values)] drsuapi_DsAttributeValueNTTIME_1sec *values;
509         } drsuapi_DsAttributeValueCtrNTTIME_1sec;
510
511         typedef [nodiscriminant] union {
512                 [case(DRSUAPI_ATTRIBUTE_objectClass)] drsuapi_DsAttributeValueCtrObjectClassId object_class_id;
513
514                 /* UINT32 */
515                 [case(0x00020001)] drsuapi_DsAttributeValueCtrUINT32 uint32;
516                 [case(0x0002004c)] drsuapi_DsAttributeValueCtrUINT32 uint32;
517                 [case(0x000200a9)] drsuapi_DsAttributeValueCtrUINT32 uint32;
518                 [case(0x00090177)] drsuapi_DsAttributeValueCtrUINT32 uint32;
519                 [case(0x000905b3)] drsuapi_DsAttributeValueCtrUINT32 uint32;
520
521                 /* GUID */
522                 [case(DRSUAPI_ATTRIBUTE_invocationId)] drsuapi_DsAttributeValueCtrGUID guid;
523
524                 /* SID */
525                 [case(DRSUAPI_ATTRIBUTE_objectSid)] drsuapi_DsAttributeValueCtrSID sid;
526
527                 /* SecurityDescriptor */
528                 [case(DRSUAPI_ATTRIBUTE_ntSecurityDescriptor)] drsuapi_DsAttributeValueCtrSecurityDescriptor security_descriptor;
529
530                 /* UnicodeString */
531                 [case(DRSUAPI_ATTRIBUTE_description)]           drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
532                 [case(0x00090001)]                              drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
533                 [case(0x000900dd)]                              drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
534                 [case(0x0009037b)]                              drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
535
536                 /* DN String */
537                 [case(DRSUAPI_ATTRIBUTE_member)]                drsuapi_DsAttributeValueCtrDNString dn_string;
538                 [case(DRSUAPI_ATTRIBUTE_objectCategory)]        drsuapi_DsAttributeValueCtrDNString dn_string;
539                 [case(0x0002000e)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
540                 [case(0x00020024)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
541                 [case(0x00090171)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
542                 [case(0x0009071c)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
543                 [case(0x0009072c)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
544                 [case(0x0009026a)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
545                 [case(0x00090203)]                              drsuapi_DsAttributeValueCtrDNString dn_string;
546
547                 /* NTTIME_1sec */
548                 [case(0x00020002)] drsuapi_DsAttributeValueCtrNTTIME_1sec nttime_1sec;
549
550                 /* the default is the DATA_BLOB */
551                 [default] drsuapi_DsAttributeValueCtrDataBlob data_blob;
552         } drsuapi_DsReplicaAttributeValueCtr;
553
554         typedef struct {
555                 drsuapi_DsAttributeId attid;
556                 [switch_is(attid)] drsuapi_DsReplicaAttributeValueCtr value_ctr;
557         } drsuapi_DsReplicaAttribute;
558
559         typedef struct {
560                 [range(0,1048576)] uint32 num_attributes;
561                 [size_is(num_attributes)]  drsuapi_DsReplicaAttribute *attributes;
562         } drsuapi_DsReplicaAttributeCtr;
563
564         typedef [public] struct {
565                 drsuapi_DsReplicaObjectIdentifier *identifier;
566                 uint32 unknown1;
567                 drsuapi_DsReplicaAttributeCtr attribute_ctr;
568         } drsuapi_DsReplicaObject;
569
570         typedef struct {
571                 uint32 version;
572                 NTTIME_1sec orginating_time;
573                 GUID orginating_invocation_id;
574                 hyper orginating_usn;
575         } drsuapi_DsReplicaMetaData;
576
577         typedef [public] struct {
578                 [range(0,1048576)] uint32 count;
579                 [size_is(count)] drsuapi_DsReplicaMetaData meta_data[];
580         } drsuapi_DsReplicaMetaDataCtr;
581
582         typedef [public,noprint] struct {
583                 drsuapi_DsReplicaObjectListItemEx *next_object;
584                 drsuapi_DsReplicaObject object;
585                 uint32 unknown1;
586                 GUID *parent_object_guid;
587                 drsuapi_DsReplicaMetaDataCtr *meta_data_ctr;
588         } drsuapi_DsReplicaObjectListItemEx;
589
590         typedef [public,gensize] struct {
591                 GUID guid1;
592                 GUID guid2;
593                 drsuapi_DsReplicaObjectIdentifier *naming_context;
594                 drsuapi_DsReplicaHighWaterMark old_highwatermark;
595                 drsuapi_DsReplicaHighWaterMark new_highwatermark;
596                 drsuapi_DsReplicaCoursorCtrEx *uptodateness_vector;
597                 drsuapi_DsGetNCChangesRequest_Ctr12 ctr12;
598                 uint32 unknown1;
599                 uint32 object_count;
600                 /* this +55 is sometimes +56, so I don't know where this comes from... --metze */
601                 [value(ndr_size_drsuapi_DsGetNCChangesCtr1(r,ndr->flags)+55)] uint32 __ndr_size;
602                 drsuapi_DsReplicaObjectListItemEx *first_object;
603                 uint32 unknown4;
604         } drsuapi_DsGetNCChangesCtr1;
605
606         typedef struct {
607                 drsuapi_DsReplicaObjectIdentifier *dn;
608                 drsuapi_DsAttributeId attid;
609                 /* this dn_string, depends on the attid, maybe could be another
610                  * attribute syntax
611                  */
612                 drsuapi_DsAttributeValueDNString dn_string;
613                 uint32 u1;
614                 NTTIME_1sec time1;
615                 drsuapi_DsReplicaMetaData meta_data;
616         } drsuapi_DsReplicaLinkedAttribute;
617
618         typedef struct {
619                 GUID guid1;
620                 GUID guid2;
621                 drsuapi_DsReplicaObjectIdentifier *naming_context;
622                 drsuapi_DsReplicaHighWaterMark old_highwatermark;
623                 drsuapi_DsReplicaHighWaterMark new_highwatermark;
624                 drsuapi_DsReplicaCoursor2CtrEx *uptodateness_vector;
625                 drsuapi_DsGetNCChangesRequest_Ctr12 ctr12;
626                 uint32 unknown1;
627                 uint32 unknown2;
628                 uint32 unknown3;
629                 drsuapi_DsReplicaObjectListItemEx *first_object;
630                 uint32 unknown4;
631                 uint32 unknown5;
632                 uint32 unknown6;
633                 [range(0,1048576)] uint32 linked_attributes_count;
634                 [size_is(linked_attributes_count)] drsuapi_DsReplicaLinkedAttribute *linked_attributes;
635                 uint32 unknown7;
636         } drsuapi_DsGetNCChangesCtr6;
637
638         typedef struct {
639                 uint32 decompressed_length;
640                 uint32 compressed_length;
641                 [subcontext(4),subcontext_size(r->compressed_length),
642                  compression(NDR_COMPRESSION_MSZIP,compressed_length,decompressed_length)]
643                  drsuapi_DsGetNCChangesCtr1 *ctr1;
644         } drsuapi_DsGetNCChangesMSZIPCtr1;
645
646         typedef struct {
647                 uint32 decompressed_length;
648                 uint32 compressed_length;
649                 [subcontext(4),subcontext_size(r->compressed_length),
650                  compression(NDR_COMPRESSION_MSZIP,compressed_length,decompressed_length)]
651                  drsuapi_DsGetNCChangesCtr6 *ctr6;
652         } drsuapi_DsGetNCChangesMSZIPCtr6;
653
654         typedef struct {
655                 uint32 decompressed_length;
656                 uint32 compressed_length;
657                 [subcontext(4),subcontext_size(r->compressed_length),
658                  compression(NDR_COMPRESSION_XPRESS,compressed_length,decompressed_length),
659                  flag(NDR_REMAINING)] DATA_BLOB *decompressed;
660         } drsuapi_DsGetNCChangesXPRESSCtr1;
661
662         typedef struct {
663                 uint32 decompressed_length;
664                 uint32 compressed_length;
665                 [subcontext(4),subcontext_size(r->compressed_length),
666                  compression(NDR_COMPRESSION_XPRESS,compressed_length,decompressed_length),
667                  flag(NDR_REMAINING)] DATA_BLOB *decompressed;
668         } drsuapi_DsGetNCChangesXPRESSCtr6;
669
670         typedef [enum16bit] enum {
671                 DRSUAPI_COMPRESSION_TYPE_MSZIP  = 2,
672                 DRSUAPI_COMPRESSION_TYPE_XPRESS = 3
673         } drsuapi_DsGetNCChangesCompressionType;
674
675         typedef [nodiscriminant,flag(NDR_PAHEX)] union {
676                 [case(1|(DRSUAPI_COMPRESSION_TYPE_MSZIP<<16))]  drsuapi_DsGetNCChangesMSZIPCtr1 mszip1;
677                 [case(6|(DRSUAPI_COMPRESSION_TYPE_MSZIP<<16))]  drsuapi_DsGetNCChangesMSZIPCtr6 mszip6;
678                 [case(1|(DRSUAPI_COMPRESSION_TYPE_XPRESS<<16))] drsuapi_DsGetNCChangesXPRESSCtr1 xpress1;
679                 [case(6|(DRSUAPI_COMPRESSION_TYPE_XPRESS<<16))] drsuapi_DsGetNCChangesXPRESSCtr6 xpress6;
680         } drsuapi_DsGetNCChangesCompressedCtr;
681
682         typedef struct {
683                 /* 
684                  * this is a bit ugly, as the compression depends on the flags
685                  * in the DsBind(), but only w2k uses DsGetNCChangesReq5
686                  * and will get DsGetNCChangesCtr2 replies, and w2k only knowns
687                  * about MSZIP and level 1 replies
688                  */
689                 [switch_is(1|(DRSUAPI_COMPRESSION_TYPE_MSZIP<<16))] drsuapi_DsGetNCChangesCompressedCtr ctr;
690         } drsuapi_DsGetNCChangesCtr2;
691
692         typedef struct {
693                 [range(0,6)] int32 level;
694                 [range(2,3)] drsuapi_DsGetNCChangesCompressionType type;
695                 [switch_is(level | (type<<16))] drsuapi_DsGetNCChangesCompressedCtr ctr;
696         } drsuapi_DsGetNCChangesCtr7;
697
698         typedef [switch_type(int32)] union {
699                 [case(1)] drsuapi_DsGetNCChangesCtr1 ctr1;
700                 [case(2)] drsuapi_DsGetNCChangesCtr2 ctr2;
701                 [case(6)] drsuapi_DsGetNCChangesCtr6 ctr6;
702                 [case(7)] drsuapi_DsGetNCChangesCtr7 ctr7;
703         } drsuapi_DsGetNCChangesCtr;
704
705         WERROR drsuapi_DsGetNCChanges(
706                 [in] policy_handle *bind_handle,
707                 [in,out] int32 level,
708                 [in,switch_is(level)] drsuapi_DsGetNCChangesRequest req,
709                 [out,switch_is(level)] drsuapi_DsGetNCChangesCtr ctr
710                 );
711
712         /*****************/
713         /* Function 0x04 */
714         typedef bitmap {
715                 DRSUAPI_DS_REPLICA_UPDATE_ASYNCHRONOUS_OPERATION        = 0x00000001,
716                 DRSUAPI_DS_REPLICA_UPDATE_WRITEABLE                     = 0x00000002,
717                 DRSUAPI_DS_REPLICA_UPDATE_ADD_REFERENCE                 = 0x00000004,
718                 DRSUAPI_DS_REPLICA_UPDATE_DELETE_REFERENCE              = 0x00000008,
719                 DRSUAPI_DS_REPLICA_UPDATE_0x00000010                    = 0x00000010
720         } drsuapi_DsReplicaUpdateRefsOptions;
721
722         typedef struct {
723                 [ref] drsuapi_DsReplicaObjectIdentifier *naming_context;
724                 [ref,charset(DOS),string] uint8 *dest_dsa_dns_name;
725                 GUID dest_dsa_guid;
726                 drsuapi_DsReplicaUpdateRefsOptions options;
727         } drsuapi_DsReplicaUpdateRefsRequest1;
728
729         typedef [switch_type(int32)] union {
730                 [case(1)] drsuapi_DsReplicaUpdateRefsRequest1 req1;
731         } drsuapi_DsReplicaUpdateRefsRequest;
732
733         WERROR drsuapi_DsReplicaUpdateRefs(
734                 [in] policy_handle *bind_handle,
735                 [in] int32 level,
736                 [in,switch_is(level)] drsuapi_DsReplicaUpdateRefsRequest req
737                 );
738
739         /*****************/
740         /* Function 0x05 */
741         typedef bitmap {
742                 DRSUAPI_DS_REPLICA_ADD_ASYNCHRONOUS_OPERATION   = 0x00000001,
743                 DRSUAPI_DS_REPLICA_ADD_WRITEABLE                = 0x00000002
744                 /* TODO ... */
745         } drsuapi_DsReplicaAddOptions;
746
747         WERROR DRSUAPI_REPLICA_ADD();
748
749         /*****************/
750         /* Function 0x06 */
751         typedef bitmap {
752                 DRSUAPI_DS_REPLICA_DELETE_ASYNCHRONOUS_OPERATION        = 0x00000001,
753                 DRSUAPI_DS_REPLICA_DELETE_WRITEABLE                     = 0x00000002
754                 /* TODO ... */
755         } drsuapi_DsReplicaDeleteOptions;
756
757         WERROR DRSUAPI_REPLICA_DEL();
758
759         /*****************/
760         /* Function 0x07 */
761         typedef bitmap {
762                 DRSUAPI_DS_REPLICA_MODIFY_ASYNCHRONOUS_OPERATION        = 0x00000001,
763                 DRSUAPI_DS_REPLICA_MODIFY_WRITEABLE                     = 0x00000002
764         } drsuapi_DsReplicaModifyOptions;
765
766         WERROR DRSUAPI_REPLICA_MODIFY();
767
768         /*****************/
769         /* Function 0x08 */
770         WERROR DRSUAPI_VERIFY_NAMES();
771
772         /*****************/
773         /* Function 0x09 */
774
775         /* how are type 4 and 7 different from 2 and 3 ? */
776         typedef [v1_enum] enum {
777                 DRSUAPI_DS_MEMBERSHIP_TYPE_UNIVERSAL_AND_DOMAIN_GROUPS = 1,
778                 DRSUAPI_DS_MEMBERSHIP_TYPE_DOMAIN_LOCAL_GROUPS  = 2,
779                 DRSUAPI_DS_MEMBERSHIP_TYPE_DOMAIN_GROUPS        = 3,
780                 DRSUAPI_DS_MEMBERSHIP_TYPE_DOMAIN_LOCAL_GROUPS2 = 4,
781                 DRSUAPI_DS_MEMBERSHIP_TYPE_UNIVERSAL_GROUPS     = 5,
782                 DRSUAPI_DS_MEMBERSHIP_TYPE_GROUPMEMBERS         = 6,
783                 DRSUAPI_DS_MEMBERSHIP_TYPE_DOMAIN_GROUPS2       = 7
784         } drsuapi_DsMembershipType;
785
786         typedef struct {
787                 NTSTATUS status;
788                 [range(0,10000)] uint32 num_memberships;
789                 [range(0,10000)] uint32 num_sids;
790                 [size_is(num_memberships)] drsuapi_DsReplicaObjectIdentifier **info_array;
791                 [size_is(num_memberships)] samr_GroupAttrs *group_attrs;
792                 [size_is(num_sids)] dom_sid28 **sids;
793         } drsuapi_DsGetMembershipsCtr1;
794
795         typedef [switch_type(int32)] union {
796                 [case(1)] drsuapi_DsGetMembershipsCtr1 ctr1;
797         } drsuapi_DsGetMembershipsCtr;
798
799         const int DRSUAPI_DS_MEMBERSHIP_FLAG_GROUP_ATTR = 0x1;
800
801         typedef struct {
802                 [range(1,10000)] uint32 count;
803                 [size_is(count)] drsuapi_DsReplicaObjectIdentifier **info_array;
804                 uint32 flags;
805                 drsuapi_DsMembershipType type;
806                 drsuapi_DsReplicaObjectIdentifier *domain;
807         } drsuapi_DsGetMembershipsRequest1;
808
809         typedef [switch_type(int32)] union {
810                 [case(1)] drsuapi_DsGetMembershipsRequest1 req1;
811         } drsuapi_DsGetMembershipsRequest;
812
813         WERROR drsuapi_DsGetMemberships(
814                 [in] policy_handle *bind_handle,
815                 [in,out] int32 level,
816                 [in] [switch_is(level)] drsuapi_DsGetMembershipsRequest req,
817                 [out] [switch_is(level)] drsuapi_DsGetMembershipsCtr ctr
818                 );
819
820         /*****************/
821         /* Function 0x0a */
822         WERROR DRSUAPI_INTER_DOMAIN_MOVE();
823
824         /*****************/
825         /* Function 0x0b */
826         WERROR DRSUAPI_GET_NT4_CHANGELOG();
827
828         /*****************/
829         /* Function 0x0c */
830         typedef [v1_enum] enum {
831                 DRSUAPI_DS_NAME_STATUS_OK                       = 0,
832                 DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR            = 1,
833                 DRSUAPI_DS_NAME_STATUS_NOT_FOUND                = 2,
834                 DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE               = 3,
835                 DRSUAPI_DS_NAME_STATUS_NO_MAPPING               = 4,
836                 DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY              = 5,
837                 DRSUAPI_DS_NAME_STATUS_NO_SYNTACTICAL_MAPPING   = 6,
838                 DRSUAPI_DS_NAME_STATUS_TRUST_REFERRAL           = 7
839         } drsuapi_DsNameStatus;
840
841         typedef [v1_enum] enum {
842                 DRSUAPI_DS_NAME_FLAG_NO_FLAGS                   = 0x0,
843                 DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY           = 0x1,
844                 DRSUAPI_DS_NAME_FLAG_EVAL_AT_DC                 = 0x2,
845                 DRSUAPI_DS_NAME_FLAG_GCVERIFY                   = 0x4,
846                 DRSUAPI_DS_NAME_FLAG_TRUST_REFERRAL             = 0x8
847         } drsuapi_DsNameFlags;
848
849         typedef [v1_enum] enum {
850                 DRSUAPI_DS_NAME_FORMAT_UKNOWN                   = 0,
851                 DRSUAPI_DS_NAME_FORMAT_FQDN_1779                = 1,
852                 DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT              = 2,
853                 DRSUAPI_DS_NAME_FORMAT_DISPLAY                  = 3,
854                 DRSUAPI_DS_NAME_FORMAT_GUID                     = 6,
855                 DRSUAPI_DS_NAME_FORMAT_CANONICAL                = 7,
856                 DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL           = 8,
857                 DRSUAPI_DS_NAME_FORMAT_CANONICAL_EX             = 9,
858                 DRSUAPI_DS_NAME_FORMAT_SERVICE_PRINCIPAL        = 10,
859                 DRSUAPI_DS_NAME_FORMAT_SID_OR_SID_HISTORY       = 11,
860                 DRSUAPI_DS_NAME_FORMAT_DNS_DOMAIN               = 12
861         } drsuapi_DsNameFormat;
862
863         typedef struct {
864                 [string,charset(UTF16)] uint16 *str;
865         } drsuapi_DsNameString;
866
867         typedef struct {
868                 uint32 unknown1; /* 0x000004e4 */
869                 uint32 unknown2; /* 0x00000407 */
870                 drsuapi_DsNameFlags format_flags;
871                 drsuapi_DsNameFormat format_offered;
872                 drsuapi_DsNameFormat format_desired;
873                 [range(1,10000)] uint32 count;
874                 [size_is(count)] drsuapi_DsNameString *names;
875         } drsuapi_DsNameRequest1;
876
877         typedef [switch_type(int32)] union {
878                 [case(1)] drsuapi_DsNameRequest1 req1;
879         } drsuapi_DsNameRequest;
880
881         typedef struct {
882                 drsuapi_DsNameStatus status;
883                 [charset(UTF16),string] uint16 *dns_domain_name;
884                 [charset(UTF16),string] uint16 *result_name;
885         } drsuapi_DsNameInfo1;
886
887         typedef struct {
888                 uint32 count;
889                 [size_is(count)] drsuapi_DsNameInfo1 *array;
890         } drsuapi_DsNameCtr1;
891
892         typedef [switch_type(int32)] union {
893                 [case(1)] drsuapi_DsNameCtr1 *ctr1;
894         } drsuapi_DsNameCtr;
895
896         WERROR drsuapi_DsCrackNames(
897                 [in] policy_handle *bind_handle,
898                 [in, out] int32 level,
899                 [in,switch_is(level)] drsuapi_DsNameRequest req,
900                 [out,switch_is(level)] drsuapi_DsNameCtr ctr
901                 );
902
903         /*****************/
904         /* Function 0x0d */
905         typedef [v1_enum] enum {
906                 DRSUAPI_DS_SPN_OPERATION_ADD    = 0,
907                 DRSUAPI_DS_SPN_OPERATION_REPLACE= 1,
908                 DRSUAPI_DS_SPN_OPERATION_DELETE = 2
909         } drsuapi_DsSpnOperation;
910
911         typedef struct {
912                 drsuapi_DsSpnOperation operation;
913                 uint32 unknown1;
914                 [charset(UTF16),string] uint16 *object_dn;
915                 [range(0,10000)] uint32 count;
916                 [size_is(count)] drsuapi_DsNameString *spn_names;
917         } drsuapi_DsWriteAccountSpnRequest1;
918
919         typedef [switch_type(int32)] union {
920                 [case(1)] drsuapi_DsWriteAccountSpnRequest1 req1;
921         } drsuapi_DsWriteAccountSpnRequest;
922
923         typedef struct {
924                 WERROR status;
925         } drsuapi_DsWriteAccountSpnResult1;
926
927         typedef [switch_type(int32)] union {
928                 [case(1)] drsuapi_DsWriteAccountSpnResult1 res1;
929         } drsuapi_DsWriteAccountSpnResult;
930
931         WERROR drsuapi_DsWriteAccountSpn(
932                 [in] policy_handle *bind_handle,
933                 [in,out] int32 level,
934                 [in,switch_is(level)] drsuapi_DsWriteAccountSpnRequest req,
935                 [out,switch_is(level)] drsuapi_DsWriteAccountSpnResult res
936                 );
937
938         /*****************/
939         /* Function 0x0e */
940         WERROR DRSUAPI_REMOVE_DS_SERVER();
941
942         /*****************/
943         /* Function 0x0f */
944         WERROR DRSUAPI_REMOVE_DS_DOMAIN();
945
946         /*****************/
947         /* Function 0x10 */
948         typedef struct {
949                 [charset(UTF16),string] uint16 *domain_name; /* netbios or dns */
950                 int32 level; /* specifies the switch level for the request */
951         } drsuapi_DsGetDCInfoRequest1;
952
953         typedef [switch_type(int32)] union {
954                 [case(1)] drsuapi_DsGetDCInfoRequest1 req1;
955         } drsuapi_DsGetDCInfoRequest;
956
957         typedef struct {
958                 [charset(UTF16),string] uint16 *netbios_name;
959                 [charset(UTF16),string] uint16 *dns_name;
960                 [charset(UTF16),string] uint16 *site_name;
961                 [charset(UTF16),string] uint16 *computer_dn;
962                 [charset(UTF16),string] uint16 *server_dn;
963                 uint32 is_pdc;
964                 uint32 is_enabled;
965         } drsuapi_DsGetDCInfo1;
966
967         typedef struct {
968                 [range(0,10000)] uint32 count;
969                 [size_is(count)] drsuapi_DsGetDCInfo1 *array;
970         } drsuapi_DsGetDCInfoCtr1;
971
972         typedef struct {
973                 [charset(UTF16),string] uint16 *netbios_name;
974                 [charset(UTF16),string] uint16 *dns_name;
975                 [charset(UTF16),string] uint16 *site_name;
976                 [charset(UTF16),string] uint16 *site_dn;
977                 [charset(UTF16),string] uint16 *computer_dn;
978                 [charset(UTF16),string] uint16 *server_dn;
979                 [charset(UTF16),string] uint16 *ntds_dn;
980                 uint32 is_pdc;
981                 uint32 is_enabled;
982                 uint32 is_gc;
983                 GUID site_guid;
984                 GUID computer_guid;
985                 GUID server_guid;
986                 GUID ntds_guid;
987         } drsuapi_DsGetDCInfo2;
988
989         typedef struct {
990                 [range(0,10000)] uint32 count;
991                 [size_is(count)] drsuapi_DsGetDCInfo2 *array;
992         } drsuapi_DsGetDCInfoCtr2;
993
994         typedef struct {
995                 uint32 unknown1;
996                 uint32 unknown2;
997                 uint32 unknown3;
998                 uint32 unknown4;
999                 uint32 unknown5;
1000                 uint32 unknown6;
1001                 [charset(UTF16),string] uint16 *server_nt4_account;
1002         } drsuapi_DsGetDCInfo01;
1003
1004         typedef struct {
1005                 [range(0,10000)] uint32 count;
1006                 [size_is(count)] drsuapi_DsGetDCInfo01 *array;
1007         } drsuapi_DsGetDCInfoCtr01;
1008
1009         typedef [v1_enum] enum {
1010                 DRSUAPI_DC_INFO_CTR_1  = 1,
1011                 DRSUAPI_DC_INFO_CTR_2  = 2,
1012                 DRSUAPI_DC_INFO_CTR_01 = -1
1013         } drsuapi_DsGetDCInfoCtrLevels;
1014
1015         typedef [switch_type(int32)] union {
1016                 [case(DRSUAPI_DC_INFO_CTR_1)]  drsuapi_DsGetDCInfoCtr1  ctr1;
1017                 [case(DRSUAPI_DC_INFO_CTR_2)]  drsuapi_DsGetDCInfoCtr2  ctr2;
1018                 [case(DRSUAPI_DC_INFO_CTR_01)] drsuapi_DsGetDCInfoCtr01 ctr01;
1019         } drsuapi_DsGetDCInfoCtr;
1020
1021         WERROR drsuapi_DsGetDomainControllerInfo(
1022                 [in] policy_handle *bind_handle,
1023                 [in, out] int32 level,
1024                 [in,switch_is(level)] drsuapi_DsGetDCInfoRequest req,
1025                 [out,switch_is(level)] drsuapi_DsGetDCInfoCtr ctr
1026                 );
1027
1028         /*****************/
1029         /* Function 0x11 */
1030         typedef [public,noprint] struct {
1031                 drsuapi_DsReplicaObjectListItem *next_object;
1032                 drsuapi_DsReplicaObject object;
1033         } drsuapi_DsReplicaObjectListItem;
1034
1035         /*
1036          * please note the the current idl
1037          * for DsAddEntry does only parse 
1038          * what I saw between 2 w2k3 boxes
1039          * in my dssync experiments I got some other replies
1040          * so all I want to say is that this is very incomplete yet...
1041          * --metze
1042          */
1043         typedef struct {
1044                 drsuapi_DsReplicaObjectListItem first_object;
1045         } drsuapi_DsAddEntryRequest2;
1046
1047         typedef [switch_type(int32)] union {
1048                 [case(2)] drsuapi_DsAddEntryRequest2 req2;
1049         } drsuapi_DsAddEntryRequest;
1050
1051         typedef struct {
1052                 uint32 unknown1;
1053                 WERROR status;
1054                 uint32 unknown2;
1055                 uint16 unknown3;
1056         } drsuapi_DsAddEntryErrorInfoX;
1057
1058         typedef struct {
1059                 [range(0,10485760)] uint32 size;
1060                 [size_is(size)] uint8 *data;
1061         } drsuapi_DsAddEntryExtraErrorBuffer;
1062
1063         typedef struct {
1064                 drsuapi_DsAddEntryErrorInfoX error;
1065                 drsuapi_DsAttributeId attid;
1066                 uint32 unknown2;
1067                 drsuapi_DsAddEntryExtraErrorBuffer buffer;
1068         } drsuapi_DsAddEntryExtraError1;
1069
1070         typedef /*[noprint]*/ struct {
1071                 drsuapi_DsAddEntryErrorListItem1 *next;
1072                 drsuapi_DsAddEntryExtraError1 error;
1073         } drsuapi_DsAddEntryErrorListItem1;
1074
1075         typedef struct {
1076                 drsuapi_DsReplicaObjectIdentifier *id;
1077                 WERROR status;
1078                 drsuapi_DsAddEntryErrorListItem1 first;
1079         } drsuapi_DsAddEntryErrorInfo1;
1080
1081         typedef [switch_type(uint32)] union {
1082                 [case(1)] drsuapi_DsAddEntryErrorInfo1 error1;
1083 /*              [case(2)] drsuapi_DsAddEntryErrorInfo2 error2;
1084                 [case(3)] drsuapi_DsAddEntryErrorInfo3 error3;
1085 */              [case(4)] drsuapi_DsAddEntryErrorInfoX error4;
1086                 [case(5)] drsuapi_DsAddEntryErrorInfoX error5;
1087                 [case(6)] drsuapi_DsAddEntryErrorInfoX error6;
1088                 [case(7)] drsuapi_DsAddEntryErrorInfoX error7;
1089         } drsuapi_DsAddEntryErrorInfo;
1090
1091         typedef struct {
1092                 WERROR status;
1093                 uint32 level;
1094                 [switch_is(level)] drsuapi_DsAddEntryErrorInfo *info;
1095         } drsuapi_DsAddEntryError1;
1096
1097         typedef [switch_type(uint32)] union {
1098                 [case(1)] drsuapi_DsAddEntryError1 info1;
1099         } drsuapi_DsAddEntryError;
1100
1101         typedef struct {
1102                 GUID guid;
1103                 dom_sid28 sid;
1104         } drsuapi_DsReplicaObjectIdentifier2;
1105
1106         typedef struct {
1107                 drsuapi_DsReplicaObjectIdentifier *id;
1108                 uint32 unknown1;
1109                 drsuapi_DsAddEntryErrorInfoX error;
1110                 [range(0,10000)] uint32 count;
1111                 [size_is(count)] drsuapi_DsReplicaObjectIdentifier2 *objects;
1112         } drsuapi_DsAddEntryCtr2;
1113
1114         typedef struct {
1115                 drsuapi_DsReplicaObjectIdentifier *id;
1116                 uint32 level;
1117                 [switch_is(level)] drsuapi_DsAddEntryError *error;
1118                 [range(0,10000)] uint32 count;
1119                 [size_is(count)] drsuapi_DsReplicaObjectIdentifier2 *objects;
1120         } drsuapi_DsAddEntryCtr3;
1121
1122         typedef [switch_type(int32)] union {
1123                 [case(2)] drsuapi_DsAddEntryCtr2 ctr2;
1124                 [case(3)] drsuapi_DsAddEntryCtr3 ctr3;
1125         } drsuapi_DsAddEntryCtr;
1126
1127         WERROR drsuapi_DsAddEntry(
1128                 [in] policy_handle *bind_handle,
1129                 [in,out] int32 level,
1130                 [in,switch_is(level)] drsuapi_DsAddEntryRequest req,
1131                 [out,switch_is(level)] drsuapi_DsAddEntryCtr ctr
1132                 );
1133
1134         /*****************/
1135         /* Function 0x12 */
1136         WERROR DRSUAPI_EXECUTE_KCC();
1137
1138         /*****************/
1139         /* Function 0x13 */
1140         typedef [v1_enum] enum {
1141                 DRSUAPI_DS_REPLICA_GET_INFO                             = 1,
1142                 DRSUAPI_DS_REPLICA_GET_INFO2                            = 2
1143         } drsuapi_DsReplicaGetInfoLevel;
1144
1145         typedef [v1_enum] enum {
1146                 DRSUAPI_DS_REPLICA_INFO_NEIGHBORS                       = 0,
1147                 DRSUAPI_DS_REPLICA_INFO_CURSORS                         = 1,
1148                 DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA                    = 2,
1149                 DRSUAPI_DS_REPLICA_INFO_KCC_DSA_CONNECT_FAILURES        = 3,
1150                 DRSUAPI_DS_REPLICA_INFO_KCC_DSA_LINK_FAILURES           = 4,
1151                 DRSUAPI_DS_REPLICA_INFO_PENDING_OPS                     = 5,
1152                 DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA        = 6,
1153                 DRSUAPI_DS_REPLICA_INFO_CURSORS2                        = 7,
1154                 DRSUAPI_DS_REPLICA_INFO_CURSORS3                        = 8,
1155                 DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA2                   = 9,
1156                 DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA2       = 10,
1157                 DRSUAPI_DS_REPLICA_INFO_NEIGHBORS02                     = -2,
1158                 DRSUAPI_DS_REPLICA_INFO_CONNECTIONS04                   = -4,
1159                 DRSUAPI_DS_REPLICA_INFO_CURSURS05                       = -5,
1160                 DRSUAPI_DS_REPLICA_INFO_06                              = -6
1161         } drsuapi_DsReplicaInfoType;
1162
1163         typedef struct {
1164                 drsuapi_DsReplicaInfoType info_type;
1165                 [charset(UTF16),string] uint16 *object_dn;
1166                 GUID guid1;
1167         } drsuapi_DsReplicaGetInfoRequest1;
1168
1169         typedef struct {
1170                 drsuapi_DsReplicaInfoType info_type;
1171                 [charset(UTF16),string] uint16 *object_dn;
1172                 GUID guid1;
1173                 uint32 unknown1;
1174                 [charset(UTF16),string] uint16 *string1;
1175                 [charset(UTF16),string] uint16 *string2;
1176                 uint32 unknown2;
1177         } drsuapi_DsReplicaGetInfoRequest2;
1178
1179         typedef [switch_type(drsuapi_DsReplicaGetInfoLevel)] union {
1180                 [case(DRSUAPI_DS_REPLICA_GET_INFO)] drsuapi_DsReplicaGetInfoRequest1 req1;
1181                 [case(DRSUAPI_DS_REPLICA_GET_INFO2)] drsuapi_DsReplicaGetInfoRequest2 req2;
1182         } drsuapi_DsReplicaGetInfoRequest;
1183
1184         typedef struct {
1185                 [charset(UTF16),string] uint16 *naming_context_dn;
1186                 [charset(UTF16),string] uint16 *source_dsa_obj_dn;
1187                 [charset(UTF16),string] uint16 *source_dsa_address;
1188                 [charset(UTF16),string] uint16 *transport_obj_dn;
1189                 drsuapi_DsReplicaNeighbourFlags replica_flags;
1190                 uint32 reserved;
1191                 GUID naming_context_obj_guid;
1192                 GUID source_dsa_obj_guid;
1193                 GUID source_dsa_invocation_id;
1194                 GUID transport_obj_guid;
1195                 hyper tmp_highest_usn;
1196                 hyper highest_usn;
1197                 NTTIME last_success;
1198                 NTTIME last_attempt;
1199                 WERROR result_last_attempt;
1200                 uint32 consecutive_sync_failures;
1201         } drsuapi_DsReplicaNeighbour;
1202
1203         typedef struct {
1204                 uint32 count;
1205                 uint32 reserved;
1206                 [size_is(count)] drsuapi_DsReplicaNeighbour array[];
1207         } drsuapi_DsReplicaNeighbourCtr;
1208
1209         typedef struct {
1210                 uint32 count;
1211                 uint32 reserved;
1212                 [size_is(count)] drsuapi_DsReplicaCoursor array[];
1213         } drsuapi_DsReplicaCoursorCtr;
1214
1215         typedef struct {
1216                 [charset(UTF16),string] uint16 *attribute_name;
1217                 uint32 version;
1218                 NTTIME originating_last_changed;
1219                 GUID originating_dsa_invocation_id;
1220                 hyper originating_usn;
1221                 hyper local_usn;
1222         } drsuapi_DsReplicaObjMetaData;
1223
1224         typedef struct {
1225                 uint32 count;
1226                 uint32 reserved;
1227                 [size_is(count)] drsuapi_DsReplicaObjMetaData array[];
1228         } drsuapi_DsReplicaObjMetaDataCtr;
1229
1230         typedef struct {
1231                 [charset(UTF16),string] uint16 *dsa_obj_dn;
1232                 GUID dsa_obj_guid;
1233                 NTTIME first_failure;
1234                 uint32 num_failures;
1235                 WERROR last_result;
1236         } drsuapi_DsReplicaKccDsaFailure;
1237
1238         typedef struct {
1239                 uint32 count;
1240                 uint32 reserved;
1241                 [size_is(count)] drsuapi_DsReplicaKccDsaFailure array[];
1242         } drsuapi_DsReplicaKccDsaFailuresCtr;
1243
1244         typedef enum {
1245                 DRSUAPI_DS_REPLICA_OP_TYPE_SYNC         = 0,
1246                 DRSUAPI_DS_REPLICA_OP_TYPE_ADD          = 1,
1247                 DRSUAPI_DS_REPLICA_OP_TYPE_DELETE       = 2,
1248                 DRSUAPI_DS_REPLICA_OP_TYPE_MODIFY       = 3,
1249                 DRSUAPI_DS_REPLICA_OP_TYPE_UPDATE_REFS  = 4
1250         } drsuapi_DsReplicaOpType;
1251
1252         typedef [switch_type(drsuapi_DsReplicaOpType)] union {
1253                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_SYNC)]         drsuapi_DsReplicaSyncOptions sync;
1254                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_ADD)]          drsuapi_DsReplicaAddOptions add;
1255                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_DELETE)]       drsuapi_DsReplicaDeleteOptions delete;
1256                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_MODIFY)]       drsuapi_DsReplicaModifyOptions modify;
1257                 [case(DRSUAPI_DS_REPLICA_OP_TYPE_UPDATE_REFS)]  drsuapi_DsReplicaUpdateRefsOptions update_refs;
1258                 [default] uint32 unknown;
1259         } drsuapi_DsRplicaOpOptions;
1260
1261         typedef struct {
1262                 NTTIME operation_start;
1263                 uint32 serial_num; /* unique till reboot */
1264                 uint32 priority;
1265                 drsuapi_DsReplicaOpType operation_type;
1266                 [switch_is(operation_type)] drsuapi_DsRplicaOpOptions options;
1267                 [charset(UTF16),string] uint16 *nc_dn;
1268                 [charset(UTF16),string] uint16 *remote_dsa_obj_dn;
1269                 [charset(UTF16),string] uint16 *remote_dsa_address;
1270                 GUID nc_obj_guid;
1271                 GUID remote_dsa_obj_guid;
1272         } drsuapi_DsReplicaOp;
1273
1274         typedef struct {
1275                 NTTIME time;
1276                 uint32 count;
1277                 [size_is(count)] drsuapi_DsReplicaOp array[];
1278         } drsuapi_DsReplicaOpCtr;
1279
1280         typedef struct {
1281                 [charset(UTF16),string] uint16 *attribute_name;
1282                 [charset(UTF16),string] uint16 *object_dn;
1283                 uint32 value_length;
1284                 [size_is(value_length)] uint8 *value;
1285                 NTTIME deleted;
1286                 NTTIME created;
1287                 uint32 version;
1288                 NTTIME originating_last_changed;
1289                 GUID originating_dsa_invocation_id;
1290                 hyper originating_usn;
1291                 hyper local_usn;
1292         } drsuapi_DsReplicaAttrValMetaData;
1293
1294         typedef struct {
1295                 uint32 count;
1296                 int32 enumeration_context;
1297                 [size_is(count)] drsuapi_DsReplicaAttrValMetaData array[];
1298         } drsuapi_DsReplicaAttrValMetaDataCtr;
1299
1300         typedef struct {
1301                 uint32 count;
1302                 int32 enumeration_context;
1303                 [size_is(count)] drsuapi_DsReplicaCoursor2 array[];
1304         } drsuapi_DsReplicaCoursor2Ctr;
1305
1306         typedef struct {
1307                 GUID source_dsa_invocation_id;
1308                 hyper highest_usn;
1309                 NTTIME last_sync_success;
1310                 [charset(UTF16),string] uint16 *source_dsa_obj_dn;
1311         } drsuapi_DsReplicaCoursor3;
1312
1313         typedef struct {
1314                 uint32 count;
1315                 int32 enumeration_context;
1316                 [size_is(count)] drsuapi_DsReplicaCoursor3 array[];
1317         } drsuapi_DsReplicaCoursor3Ctr;
1318
1319         typedef struct {
1320                 [charset(UTF16),string] uint16 *attribute_name;
1321                 uint32 version;
1322                 NTTIME originating_last_changed;
1323                 GUID originating_dsa_invocation_id;
1324                 hyper originating_usn;
1325                 hyper local_usn;
1326                 [charset(UTF16),string] uint16 *originating_dsa_obj_dn;
1327         } drsuapi_DsReplicaObjMetaData2;
1328
1329         typedef struct {
1330                 uint32 count;
1331                 int32 enumeration_context;
1332                 [size_is(count)] drsuapi_DsReplicaObjMetaData2 array[];
1333         } drsuapi_DsReplicaObjMetaData2Ctr;
1334
1335         typedef struct {
1336                 [charset(UTF16),string] uint16 *attribute_name;
1337                 [charset(UTF16),string] uint16 *object_dn;
1338                 uint32 value_length;
1339                 [size_is(value_length)] uint8 *value;
1340                 NTTIME deleted;
1341                 NTTIME created;
1342                 uint32 version;
1343                 NTTIME originating_last_changed;
1344                 GUID originating_dsa_invocation_id;
1345                 hyper originating_usn;
1346                 hyper local_usn;
1347                 [charset(UTF16),string] uint16 *originating_dsa_obj_dn;
1348         } drsuapi_DsReplicaAttrValMetaData2;
1349
1350         typedef struct {
1351                 uint32 count;
1352                 int32 enumeration_context;
1353                 [size_is(count)] drsuapi_DsReplicaAttrValMetaData2 array[];
1354         } drsuapi_DsReplicaAttrValMetaData2Ctr;
1355
1356         typedef struct {
1357                 hyper u1; /* session number? */
1358                 uint32 u2;
1359                 uint32 u3;
1360                 GUID bind_guid;
1361                 NTTIME_1sec bind_time;
1362                 uint32 u4; /* flags? */
1363                 uint32 u5;
1364         } drsuapi_DsReplicaConnection04;
1365
1366         typedef struct {
1367                 [range(0,10000)] uint32 count;
1368                 uint32 reserved;
1369                 [size_is(count)] drsuapi_DsReplicaConnection04 array[];
1370         } drsuapi_DsReplicaConnection04Ctr;
1371
1372         typedef struct {
1373                 [charset(UTF16),string] uint16 *str1;
1374                 uint32 u1;
1375                 uint32 u2;
1376                 uint32 u3;
1377                 uint32 u4;
1378                 uint32 u5;
1379                 hyper u6;
1380                 uint32 u7;
1381         } drsuapi_DsReplica06;
1382
1383         typedef struct {
1384                 [range(0,256)] uint32 count;
1385                 uint32 reserved;
1386                 [size_is(count)] drsuapi_DsReplica06 array[];
1387         } drsuapi_DsReplica06Ctr;
1388
1389         typedef [switch_type(drsuapi_DsReplicaInfoType)] union {
1390                 [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS)] drsuapi_DsReplicaNeighbourCtr *neighbours;
1391                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS)] drsuapi_DsReplicaCoursorCtr *coursors;
1392                 [case(DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA)] drsuapi_DsReplicaObjMetaDataCtr *objmetadata;
1393                 [case(DRSUAPI_DS_REPLICA_INFO_KCC_DSA_CONNECT_FAILURES)] drsuapi_DsReplicaKccDsaFailuresCtr *connectfailures;
1394                 [case(DRSUAPI_DS_REPLICA_INFO_KCC_DSA_LINK_FAILURES)] drsuapi_DsReplicaKccDsaFailuresCtr *linkfailures;
1395                 [case(DRSUAPI_DS_REPLICA_INFO_PENDING_OPS)] drsuapi_DsReplicaOpCtr *pendingops;
1396                 [case(DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA)] drsuapi_DsReplicaAttrValMetaDataCtr *attrvalmetadata;
1397                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS2)] drsuapi_DsReplicaCoursor2Ctr *coursors2;
1398                 [case(DRSUAPI_DS_REPLICA_INFO_CURSORS3)] drsuapi_DsReplicaCoursor3Ctr *coursors3;
1399                 [case(DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA2)] drsuapi_DsReplicaObjMetaData2Ctr *objmetadata2;
1400                 [case(DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA2)] drsuapi_DsReplicaAttrValMetaData2Ctr *attrvalmetadata2;
1401                 [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS02)] drsuapi_DsReplicaNeighbourCtr *neighbours02;
1402                 [case(DRSUAPI_DS_REPLICA_INFO_CONNECTIONS04)] drsuapi_DsReplicaConnection04Ctr *connections04;
1403                 [case(DRSUAPI_DS_REPLICA_INFO_CURSURS05)] drsuapi_DsReplicaCoursorCtrEx *coursors05;
1404                 [case(DRSUAPI_DS_REPLICA_INFO_06)] drsuapi_DsReplica06Ctr *i06;
1405         } drsuapi_DsReplicaInfo;
1406
1407         WERROR drsuapi_DsReplicaGetInfo(
1408                 [in] policy_handle *bind_handle,
1409                 [in] drsuapi_DsReplicaGetInfoLevel level,
1410                 [in,switch_is(level)] drsuapi_DsReplicaGetInfoRequest req,
1411                 [out] drsuapi_DsReplicaInfoType info_type,
1412                 [out,switch_is(info_type)] drsuapi_DsReplicaInfo info
1413                 );
1414
1415         /*****************/
1416         /* Function 0x14 */
1417         WERROR DRSUAPI_ADD_SID_HISTORY();
1418
1419         /*****************/
1420         /* Function 0x15 */
1421
1422         typedef struct {
1423                 [range(0,10000)] uint32 num_entries;
1424                 [size_is(num_entries)] drsuapi_DsGetMembershipsCtr1 **ctrl_array;
1425         } drsuapi_DsGetMemberships2Ctr1;
1426
1427         typedef [switch_type(int32)] union {
1428                 [case(1)] drsuapi_DsGetMembershipsCtr1 ctr1;
1429         } drsuapi_DsGetMemberships2Ctr;
1430
1431         typedef struct {
1432                 [range(1,10000)] uint32 num_req;
1433                 [size_is(num_req)] drsuapi_DsGetMembershipsRequest1 **req_array;
1434         } drsuapi_DsGetMemberships2Request1;
1435
1436         typedef [switch_type(int32)] union {
1437                 [case(1)] drsuapi_DsGetMemberships2Request1 req1;
1438         } drsuapi_DsGetMemberships2Request;
1439
1440         WERROR drsuapi_DsGetMemberships2(
1441                 [in] policy_handle *bind_handle,
1442                 [in,out] int32 level,
1443                 [in] [switch_is(level)] drsuapi_DsGetMemberships2Request req,
1444                 [out] [switch_is(level)] drsuapi_DsGetMemberships2Ctr ctr
1445                 );
1446
1447
1448         /*****************/
1449         /* Function 0x16 */
1450         WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS();
1451
1452         /*****************/
1453         /* Function 0x17 */
1454         WERROR DRSUAPI_GET_OBJECT_EXISTENCE();
1455
1456         /*****************/
1457         /* Function 0x18 */
1458         WERROR DRSUAPI_QUERY_SITES_BY_COST();
1459 }