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