netlogon: add 8bit varients of netr_SamDatabaseID8Bit and netr_DeltaEnum.
[ira/wip.git] / librpc / idl / netlogon.idl
1 /*
2   netlogon interface
3   much of this was derived from the ethereal sources - thanks to everyone 
4   who contributed!
5 */
6
7 import "misc.idl", "lsa.idl", "samr.idl", "security.idl", "nbt.idl";
8
9 #include "idl_types.h"
10
11 cpp_quote("#define netr_DeltaEnum8Bit netr_DeltaEnum")
12
13 [
14   uuid("12345678-1234-abcd-ef00-01234567cffb"),
15   version(1.0),
16   endpoint("ncacn_np:[\\pipe\\netlogon]","ncacn_ip_tcp:","ncalrpc:"),
17   helper("../librpc/ndr/ndr_netlogon.h"),
18   pointer_default(unique)
19 ]
20
21 interface netlogon
22 {
23         typedef bitmap samr_AcctFlags samr_AcctFlags;
24         typedef bitmap samr_GroupAttrs samr_GroupAttrs;
25         typedef enum netr_DeltaEnum8Bit netr_DeltaEnum8Bit;
26
27         /*****************/
28         /* Function 0x00 */
29
30         typedef struct {
31                 [string,charset(UTF16)] uint16 *account_name;
32                 uint32 priv;
33                 uint32 auth_flags;
34                 uint32 logon_count;
35                 uint32 bad_pw_count;
36                 time_t last_logon;
37                 time_t last_logoff;
38                 time_t logoff_time;
39                 time_t kickoff_time;
40                 uint32 password_age;
41                 time_t pw_can_change;
42                 time_t pw_must_change;
43                 [string,charset(UTF16)] uint16 *computer;
44                 [string,charset(UTF16)] uint16 *domain;
45                 [string,charset(UTF16)] uint16 *script_path;
46                 uint32 unknown;
47         } netr_UasInfo;
48
49         WERROR netr_LogonUasLogon(
50                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
51                 [in]   [string,charset(UTF16)] uint16 account_name[],
52                 [in]   [string,charset(UTF16)] uint16 workstation[],
53                 [out,ref]  netr_UasInfo **info
54                 );
55
56
57         /*****************/
58         /* Function 0x01 */
59
60         typedef struct {
61                 uint32 duration;
62                 uint16 logon_count;
63         } netr_UasLogoffInfo;
64
65         WERROR netr_LogonUasLogoff(
66                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
67                 [in] [string,charset(UTF16)] uint16 account_name[],
68                 [in] [string,charset(UTF16)] uint16 workstation[],
69                 [out,ref] netr_UasLogoffInfo *info
70                 );
71
72
73         /*****************/
74         /* Function 0x02 */
75
76         /* in netr_AcctLockStr size seems to be be 24, and rrenard thinks 
77            that the structure of the bindata looks like this:
78
79                 dlong  lockout_duration;
80                 udlong reset_count;
81                 uint32 bad_attempt_lockout;
82                 uint32 dummy;   
83
84            but it doesn't look as though this structure is reflected at the
85            NDR level. Maybe it is left to the application to decode the bindata array.
86         */
87         typedef [public] struct {
88                 dlong lockout_duration;
89                 udlong reset_count;
90                 uint32 bad_attempt_lockout;
91                 uint32 dummy;
92         } netr_AcctLockStr;
93
94         /* - MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT
95          *   sets the NETLOGON_SERVER_TRUST_ACCOUNT user_flag
96          * - MSV1_0_UPDATE_LOGON_STATISTICS
97          *   sets the logon time on network logon
98          * - MSV1_0_RETURN_USER_PARAMETERS
99          *   sets the user parameters in the driveletter
100          * - MSV1_0_RETURN_PROFILE_PATH
101          *   returns the profilepath in the driveletter and
102          *   sets LOGON_PROFILE_PATH_RETURNED user_flag
103          */
104
105         typedef [public,bitmap32bit] bitmap {
106                 MSV1_0_CLEARTEXT_PASSWORD_ALLOWED       = 0x00000002,
107                 MSV1_0_UPDATE_LOGON_STATISTICS          = 0x00000004,
108                 MSV1_0_RETURN_USER_PARAMETERS           = 0x00000008,
109                 MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT       = 0x00000020,
110                 MSV1_0_RETURN_PROFILE_PATH              = 0x00000200,
111                 MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT  = 0x00000800
112         } netr_LogonParameterControl;
113
114         typedef struct {
115                 lsa_String  domain_name;
116                 netr_LogonParameterControl parameter_control; /* see MSV1_0_* */
117                 uint32      logon_id_low;
118                 uint32      logon_id_high;
119                 lsa_String  account_name;
120                 lsa_String  workstation;
121         } netr_IdentityInfo;
122
123         typedef struct {
124                 netr_IdentityInfo identity_info;
125                 samr_Password lmpassword;
126                 samr_Password ntpassword;
127         } netr_PasswordInfo;
128
129         typedef [flag(NDR_PAHEX)] struct {
130                 uint16 length;
131                 [value(length)] uint16 size;
132                 [size_is(length),length_is(length)] uint8 *data;
133         } netr_ChallengeResponse;
134
135         typedef [flag(NDR_PAHEX)] struct {
136                 netr_IdentityInfo identity_info;
137                 uint8 challenge[8];
138                 netr_ChallengeResponse nt;
139                 netr_ChallengeResponse lm;
140         } netr_NetworkInfo;
141
142         typedef [flag(NDR_PAHEX)] struct {
143                 netr_IdentityInfo identity_info;
144                 lsa_String  package_name;
145                 uint32 length;
146                 [size_is(length)] uint8 *data;
147         } netr_GenericInfo;
148
149         typedef enum {
150                 NetlogonInteractiveInformation = 1,
151                 NetlogonNetworkInformation = 2,
152                 NetlogonServiceInformation = 3,
153                 NetlogonGenericInformation = 4,
154                 NetlogonInteractiveTransitiveInformation = 5,
155                 NetlogonNetworkTransitiveInformation = 6,
156                 NetlogonServiceTransitiveInformation = 7
157         } netr_LogonInfoClass;
158
159         typedef [public,switch_type(netr_LogonInfoClass)] union {
160                 [case(NetlogonInteractiveInformation)]           netr_PasswordInfo *password;
161                 [case(NetlogonNetworkInformation)]               netr_NetworkInfo  *network;
162                 [case(NetlogonServiceInformation)]               netr_PasswordInfo *password;
163                 [case(NetlogonGenericInformation)]               netr_GenericInfo  *generic;
164                 [case(NetlogonInteractiveTransitiveInformation)] netr_PasswordInfo *password;
165                 [case(NetlogonNetworkTransitiveInformation)]     netr_NetworkInfo  *network;
166                 [case(NetlogonServiceTransitiveInformation)]     netr_PasswordInfo *password;
167         } netr_LogonLevel;
168
169         typedef [public,flag(NDR_PAHEX)] struct {
170                 uint8 key[16];
171         } netr_UserSessionKey;
172
173         typedef [public,flag(NDR_PAHEX)] struct {
174                 uint8 key[8];
175         } netr_LMSessionKey;
176
177         /* Flags for user_flags below */
178         typedef [public,bitmap32bit] bitmap {
179                 NETLOGON_GUEST                  = 0x00000001,
180                 NETLOGON_NOENCRYPTION           = 0x00000002,
181                 NETLOGON_CACHED_ACCOUNT         = 0x00000004,
182                 NETLOGON_USED_LM_PASSWORD       = 0x00000008,
183                 NETLOGON_EXTRA_SIDS             = 0x00000020,
184                 NETLOGON_SUBAUTH_SESSION_KEY    = 0x00000040,
185                 NETLOGON_SERVER_TRUST_ACCOUNT   = 0x00000080,
186                 NETLOGON_NTLMV2_ENABLED         = 0x00000100,
187                 NETLOGON_RESOURCE_GROUPS        = 0x00000200,
188                 NETLOGON_PROFILE_PATH_RETURNED  = 0x00000400,
189                 NETLOGON_GRACE_LOGON            = 0x01000000
190         } netr_UserFlags;
191
192         typedef struct {
193                 NTTIME last_logon;
194                 NTTIME last_logoff;
195                 NTTIME acct_expiry;
196                 NTTIME last_password_change;
197                 NTTIME allow_password_change;
198                 NTTIME force_password_change;
199                 lsa_String account_name;
200                 lsa_String full_name;
201                 lsa_String logon_script;
202                 lsa_String profile_path;
203                 lsa_String home_directory;
204                 lsa_String home_drive;
205                 uint16 logon_count;
206                 uint16 bad_password_count;
207                 uint32 rid;
208                 uint32 primary_gid;
209                 samr_RidWithAttributeArray groups;
210                 netr_UserFlags user_flags;
211                 netr_UserSessionKey key;
212                 lsa_StringLarge logon_server;
213                 lsa_StringLarge domain;
214                 dom_sid2 *domain_sid;
215                 netr_LMSessionKey LMSessKey;
216                 samr_AcctFlags acct_flags;
217                 uint32 unknown[7];
218         } netr_SamBaseInfo;
219
220         typedef struct {
221                 netr_SamBaseInfo base;
222         } netr_SamInfo2;
223
224         typedef struct {
225                 dom_sid2 *sid;
226                 samr_GroupAttrs attributes;
227         } netr_SidAttr;
228
229         typedef [public] struct {
230                 netr_SamBaseInfo base;
231                 uint32 sidcount;
232                 [size_is(sidcount)] netr_SidAttr *sids;
233         } netr_SamInfo3;
234
235         typedef struct {
236                 netr_SamBaseInfo base;
237                 uint32 sidcount;
238                 [size_is(sidcount)] netr_SidAttr *sids;
239                 lsa_String forest;
240                 lsa_String principle;
241                 uint32 unknown4[20];
242         } netr_SamInfo6;
243
244         typedef struct {
245                 uint32 pac_size;
246                 [size_is(pac_size)] uint8 *pac;
247                 lsa_String logon_domain;
248                 lsa_String logon_server;
249                 lsa_String principal_name;
250                 uint32 auth_size;
251                 [size_is(auth_size)] uint8 *auth;
252                 netr_UserSessionKey user_session_key;
253                 uint32 expansionroom[10];
254                 lsa_String unknown1;
255                 lsa_String unknown2;
256                 lsa_String unknown3;
257                 lsa_String unknown4;
258         } netr_PacInfo;
259
260         typedef [flag(NDR_PAHEX)] struct {
261                 uint32 length;
262                 [size_is(length)] uint8 *data;
263         } netr_GenericInfo2;
264
265         typedef enum {
266                 NetlogonValidationUasInfo = 1,
267                 NetlogonValidationSamInfo = 2,
268                 NetlogonValidationSamInfo2 = 3,
269                 NetlogonValidationGenericInfo2 = 5,
270                 NetlogonValidationSamInfo4 = 6
271         } netr_ValidationInfoClass;
272
273         typedef [public,switch_type(uint16)] union {
274                 [case(NetlogonValidationSamInfo)] netr_SamInfo2 *sam2;
275                 [case(NetlogonValidationSamInfo2)] netr_SamInfo3 *sam3;
276                 [case(4)] netr_PacInfo  *pac;
277                 [case(NetlogonValidationGenericInfo2)] netr_GenericInfo2  *generic;
278                 [case(NetlogonValidationSamInfo4)] netr_SamInfo6 *sam6;
279         } netr_Validation;
280
281         typedef [public, flag(NDR_PAHEX)] struct {
282                 uint8 data[8];
283         } netr_Credential;
284
285         typedef [public] struct {
286                 netr_Credential cred;
287                 time_t timestamp;
288         } netr_Authenticator;
289
290         NTSTATUS netr_LogonSamLogon(
291                 [in,unique] [string,charset(UTF16)] uint16         *server_name,
292                 [in,unique] [string,charset(UTF16)] uint16         *computer_name,
293                 [in,unique] netr_Authenticator                     *credential,
294                 [in,out,unique] netr_Authenticator                 *return_authenticator,
295                 [in]  netr_LogonInfoClass                           logon_level,
296                 [in,ref]  [switch_is(logon_level)] netr_LogonLevel *logon,
297                 [in]  uint16                                        validation_level,
298                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
299                 [out,ref] uint8                                    *authoritative
300                 );
301
302
303         /*****************/
304         /* Function 0x03 */
305
306         NTSTATUS netr_LogonSamLogoff(
307                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
308                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
309                 [in,unique] netr_Authenticator *credential,
310                 [in,out,unique] netr_Authenticator *return_authenticator,
311                 [in] netr_LogonInfoClass logon_level,
312                 [in] [switch_is(logon_level)] netr_LogonLevel logon
313                 );
314         
315
316
317         /*****************/
318         /* Function 0x04 */
319
320         [public] NTSTATUS netr_ServerReqChallenge(
321                 [in,unique,string,charset(UTF16)] uint16 *server_name,
322                 [in,string,charset(UTF16)] uint16 computer_name[],
323                 [in,ref] netr_Credential *credentials,
324                 [out,ref] netr_Credential *return_credentials
325                 );
326
327
328         /*****************/
329         /* Function 0x05 */
330
331         typedef enum netr_SchannelType netr_SchannelType;
332
333         NTSTATUS netr_ServerAuthenticate(
334                 [in,unique,string,charset(UTF16)] uint16 *server_name,
335                 [in,string,charset(UTF16)] uint16 account_name[],
336                 [in]                       netr_SchannelType secure_channel_type,
337                 [in,string,charset(UTF16)] uint16 computer_name[],
338                 [in,ref] netr_Credential *credentials,
339                 [out,ref] netr_Credential *return_credentials
340                 );
341
342
343         /*****************/
344         /* Function 0x06 */
345
346         NTSTATUS netr_ServerPasswordSet(
347                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
348                 [in]  [string,charset(UTF16)] uint16 account_name[],
349                 [in]  netr_SchannelType secure_channel_type,
350                 [in]  [string,charset(UTF16)] uint16 computer_name[],
351                 [in,ref]  netr_Authenticator *credential,
352                 [out,ref] netr_Authenticator *return_authenticator,
353                 [in,ref] samr_Password *new_password
354                 );
355
356
357         /*****************/
358         /* Function 0x07 */
359
360         typedef enum netr_SamDatabaseID netr_SamDatabaseID;
361
362         typedef struct {
363                 [string,charset(UTF16)] uint16 *account_name;
364                 lsa_String unknown1;
365                 lsa_String unknown2;
366                 lsa_String unknown3;
367                 lsa_String unknown4;
368                 uint32 unknown5;
369                 uint32 unknown6;
370                 uint32 unknown7;
371                 uint32 unknown8;
372         } netr_DELTA_DELETE_USER;
373
374         typedef struct {
375                 uint16 length;
376                 [value(length)] uint16 size;
377                 uint32 flags;
378                 samr_Password pwd;
379         } netr_USER_KEY16;
380
381         typedef struct {
382                 uint16 nt_length;
383                 [value(nt_length)] uint16 nt_size;
384                 uint32 nt_flags;
385                 uint16 lm_length;
386                 [value(lm_length)] uint16 lm_size;
387                 uint32 lm_flags;
388                 uint8 nt_history[nt_length];
389                 uint8 lm_history[lm_length];
390         } netr_PasswordHistory;
391
392         typedef struct {
393                 netr_USER_KEY16 lmpassword;
394                 netr_USER_KEY16 ntpassword;
395                 netr_PasswordHistory history;
396         } netr_USER_KEYS2;
397
398         typedef struct { /* TODO: make this a union! */
399                 netr_USER_KEYS2 keys2;
400         } netr_USER_KEY_UNION;
401
402         typedef [public] struct {
403                 uint32 version;
404                 netr_USER_KEY_UNION keys;
405         } netr_USER_KEYS;
406
407         typedef struct {
408                 boolean8  SensitiveDataFlag;
409                 uint32 DataLength;
410
411                 /* netr_USER_KEYS encrypted with the session key */
412                 [size_is(DataLength)][flag(NDR_PAHEX)] uint8 *SensitiveData;
413         } netr_USER_PRIVATE_INFO;
414
415         typedef struct {
416                 lsa_String account_name;
417                 lsa_String full_name;
418                 uint32 rid;
419                 uint32 primary_gid;
420                 lsa_String home_directory;
421                 lsa_String home_drive;
422                 lsa_String logon_script;
423                 lsa_String description;
424                 lsa_String workstations;
425                 NTTIME last_logon;
426                 NTTIME last_logoff;
427                 samr_LogonHours logon_hours;
428                 uint16 bad_password_count;
429                 uint16 logon_count;
430                 NTTIME last_password_change;
431                 NTTIME acct_expiry;
432                 samr_AcctFlags acct_flags;
433                 samr_Password lmpassword;
434                 samr_Password ntpassword;
435                 boolean8 nt_password_present;
436                 boolean8 lm_password_present;
437                 boolean8 password_expired;
438                 lsa_String comment;
439                 lsa_String parameters;
440                 uint16 country_code;
441                 uint16 code_page;
442                 netr_USER_PRIVATE_INFO user_private_info;
443                 uint32 SecurityInformation;
444                 sec_desc_buf sdbuf;
445                 lsa_String profile_path;
446                 lsa_String unknown2;
447                 lsa_String unknown3;
448                 lsa_String unknown4;
449                 uint32 unknown5;
450                 uint32 unknown6;
451                 uint32 unknown7;
452                 uint32 unknown8;
453         } netr_DELTA_USER;
454
455         typedef struct {
456                 lsa_String domain_name;
457                 lsa_String oem_information; /* comment */
458                 dlong force_logoff_time;
459                 uint16 min_password_length;
460                 uint16 password_history_length;
461                 /* yes, these are signed. They are in negative 100ns */
462                 dlong  max_password_age;
463                 dlong  min_password_age;
464                 udlong sequence_num;
465                 NTTIME domain_create_time;
466                 uint32 SecurityInformation;
467                 sec_desc_buf sdbuf;
468                 lsa_BinaryString account_lockout;
469                 lsa_String unknown2;
470                 lsa_String unknown3;
471                 lsa_String unknown4;
472                 uint32 logon_to_chgpass;
473                 uint32 unknown6;
474                 uint32 unknown7;
475                 uint32 unknown8;
476         } netr_DELTA_DOMAIN;
477
478         typedef struct {
479                 lsa_String group_name;
480                 uint32 rid;
481                 uint32 attributes;
482                 lsa_String description;
483                 uint32 SecurityInformation;
484                 sec_desc_buf sdbuf;
485                 lsa_String unknown1;
486                 lsa_String unknown2;
487                 lsa_String unknown3;
488                 lsa_String unknown4;
489                 uint32 unknown5;
490                 uint32 unknown6;
491                 uint32 unknown7;
492                 uint32 unknown8;
493         } netr_DELTA_GROUP;
494
495         typedef struct {
496                 lsa_String OldName;
497                 lsa_String NewName;
498                 lsa_String unknown1;
499                 lsa_String unknown2;
500                 lsa_String unknown3;
501                 lsa_String unknown4;
502                 uint32 unknown5;
503                 uint32 unknown6;
504                 uint32 unknown7;
505                 uint32 unknown8;
506         } netr_DELTA_RENAME;
507
508         typedef struct {
509                 [size_is(num_rids)] uint32 *rids;
510                 [size_is(num_rids)] uint32 *attribs;
511                 uint32 num_rids;
512                 uint32 unknown1;
513                 uint32 unknown2;
514                 uint32 unknown3;
515                 uint32 unknown4;
516         } netr_DELTA_GROUP_MEMBER;
517
518         typedef struct {
519                 lsa_String alias_name;
520                 uint32 rid;
521                 uint32 SecurityInformation;
522                 sec_desc_buf sdbuf;
523                 lsa_String description;
524                 lsa_String unknown2;
525                 lsa_String unknown3;
526                 lsa_String unknown4;
527                 uint32 unknown5;
528                 uint32 unknown6;
529                 uint32 unknown7;
530                 uint32 unknown8;
531         } netr_DELTA_ALIAS;
532
533         typedef struct {
534                 lsa_SidArray sids;
535                 uint32 unknown1;
536                 uint32 unknown2;
537                 uint32 unknown3;
538                 uint32 unknown4;
539         } netr_DELTA_ALIAS_MEMBER;
540
541         typedef struct {
542                 uint32 pagedpoollimit;
543                 uint32 nonpagedpoollimit;
544                 uint32 minimumworkingsetsize;
545                 uint32 maximumworkingsetsize;
546                 uint32 pagefilelimit;
547                 NTTIME timelimit;
548         } netr_QUOTA_LIMITS;
549
550         typedef struct {
551                 uint32 maxlogsize;
552                 NTTIME auditretentionperiod;
553                 boolean8 auditingmode;
554                 uint32 maxauditeventcount;
555                 [size_is(maxauditeventcount+1)] uint32 *eventauditoptions;
556                 lsa_String primary_domain_name;
557                 dom_sid2 *sid;
558                 netr_QUOTA_LIMITS quota_limits;
559                 udlong sequence_num;
560                 NTTIME db_create_time;
561                 uint32 SecurityInformation;
562                 sec_desc_buf sdbuf;
563                 lsa_String unknown1;
564                 lsa_String unknown2;
565                 lsa_String unknown3;
566                 lsa_String unknown4;
567                 uint32 unknown5;
568                 uint32 unknown6;
569                 uint32 unknown7;
570                 uint32 unknown8;
571         } netr_DELTA_POLICY;
572
573         typedef struct {
574                 lsa_String domain_name;
575                 uint32 num_controllers;
576                 [size_is(num_controllers)] lsa_String *controller_names;
577                 uint32 SecurityInformation;
578                 sec_desc_buf sdbuf;
579                 lsa_String unknown1;
580                 lsa_String unknown2;
581                 lsa_String unknown3;
582                 lsa_String unknown4;
583                 uint32 posix_offset;
584                 uint32 unknown6;
585                 uint32 unknown7;
586                 uint32 unknown8;
587         } netr_DELTA_TRUSTED_DOMAIN;
588
589         typedef struct {
590                 uint16 unknown;
591         } netr_DELTA_DELETE_TRUST;
592
593         typedef struct {
594                 uint32 privilege_entries;
595                 uint32 privilege_control;
596                 [size_is(privilege_entries)] uint32 *privilege_attrib;
597                 [size_is(privilege_entries)] lsa_String *privilege_name;
598                 netr_QUOTA_LIMITS quotalimits;
599                 uint32 system_flags;
600                 uint32 SecurityInformation;
601                 sec_desc_buf sdbuf;
602                 lsa_String unknown1;
603                 lsa_String unknown2;
604                 lsa_String unknown3;
605                 lsa_String unknown4;
606                 uint32 unknown5;
607                 uint32 unknown6;
608                 uint32 unknown7;
609                 uint32 unknown8;
610         } netr_DELTA_ACCOUNT;
611
612         typedef struct {
613                 uint16 unknown;
614         } netr_DELTA_DELETE_ACCOUNT;
615
616         typedef struct {
617                 uint16 unknown;
618         } netr_DELTA_DELETE_SECRET;
619
620         typedef struct {
621                 uint32 len;
622                 uint32 maxlen;
623                 [size_is(maxlen)][length_is(len)] uint8 *cipher_data;
624         } netr_CIPHER_VALUE;
625
626         typedef struct {
627                 netr_CIPHER_VALUE current_cipher;
628                 NTTIME current_cipher_set_time;
629                 netr_CIPHER_VALUE old_cipher;
630                 NTTIME old_cipher_set_time;
631                 uint32 SecurityInformation;
632                 sec_desc_buf sdbuf;
633                 lsa_String unknown1;
634                 lsa_String unknown2;
635                 lsa_String unknown3;
636                 lsa_String unknown4;
637                 uint32 unknown5;
638                 uint32 unknown6;
639                 uint32 unknown7;
640                 uint32 unknown8;
641         } netr_DELTA_SECRET;
642
643         typedef enum {
644                 NETR_DELTA_DOMAIN           = 1,
645                 NETR_DELTA_GROUP            = 2,
646                 NETR_DELTA_DELETE_GROUP     = 3,
647                 NETR_DELTA_RENAME_GROUP     = 4,
648                 NETR_DELTA_USER             = 5,
649                 NETR_DELTA_DELETE_USER      = 6,
650                 NETR_DELTA_RENAME_USER      = 7,
651                 NETR_DELTA_GROUP_MEMBER     = 8,
652                 NETR_DELTA_ALIAS            = 9,
653                 NETR_DELTA_DELETE_ALIAS     = 10,
654                 NETR_DELTA_RENAME_ALIAS     = 11,
655                 NETR_DELTA_ALIAS_MEMBER     = 12,
656                 NETR_DELTA_POLICY           = 13,
657                 NETR_DELTA_TRUSTED_DOMAIN   = 14,
658                 NETR_DELTA_DELETE_TRUST     = 15,
659                 NETR_DELTA_ACCOUNT          = 16,
660                 NETR_DELTA_DELETE_ACCOUNT   = 17,
661                 NETR_DELTA_SECRET           = 18,
662                 NETR_DELTA_DELETE_SECRET    = 19,
663                 NETR_DELTA_DELETE_GROUP2    = 20,
664                 NETR_DELTA_DELETE_USER2     = 21,
665                 NETR_DELTA_MODIFY_COUNT     = 22
666         } netr_DeltaEnum;
667
668         typedef [switch_type(netr_DeltaEnum)] union {
669                 [case(NETR_DELTA_DOMAIN)]          netr_DELTA_DOMAIN          *domain;
670                 [case(NETR_DELTA_GROUP)]           netr_DELTA_GROUP           *group;
671                 [case(NETR_DELTA_DELETE_GROUP)]    ; /* rid only */
672                 [case(NETR_DELTA_RENAME_GROUP)]    netr_DELTA_RENAME          *rename_group;
673                 [case(NETR_DELTA_USER)]            netr_DELTA_USER            *user;
674                 [case(NETR_DELTA_DELETE_USER)]     ; /* rid only */
675                 [case(NETR_DELTA_RENAME_USER)]     netr_DELTA_RENAME          *rename_user;
676                 [case(NETR_DELTA_GROUP_MEMBER)]    netr_DELTA_GROUP_MEMBER    *group_member;
677                 [case(NETR_DELTA_ALIAS)]           netr_DELTA_ALIAS           *alias;
678                 [case(NETR_DELTA_DELETE_ALIAS)]    ; /* rid only */
679                 [case(NETR_DELTA_RENAME_ALIAS)]    netr_DELTA_RENAME          *rename_alias;
680                 [case(NETR_DELTA_ALIAS_MEMBER)]    netr_DELTA_ALIAS_MEMBER    *alias_member;
681                 [case(NETR_DELTA_POLICY)]          netr_DELTA_POLICY          *policy;
682                 [case(NETR_DELTA_TRUSTED_DOMAIN)]  netr_DELTA_TRUSTED_DOMAIN   *trusted_domain;
683                 [case(NETR_DELTA_DELETE_TRUST)]    netr_DELTA_DELETE_TRUST     delete_trust;
684                 [case(NETR_DELTA_ACCOUNT)]         netr_DELTA_ACCOUNT         *account;
685                 [case(NETR_DELTA_DELETE_ACCOUNT)]  netr_DELTA_DELETE_ACCOUNT   delete_account;
686                 [case(NETR_DELTA_SECRET)]          netr_DELTA_SECRET          *secret;
687                 [case(NETR_DELTA_DELETE_SECRET)]   netr_DELTA_DELETE_SECRET    delete_secret;
688                 [case(NETR_DELTA_DELETE_GROUP2)]   netr_DELTA_DELETE_USER     *delete_group;
689                 [case(NETR_DELTA_DELETE_USER2)]    netr_DELTA_DELETE_USER     *delete_user;
690                 [case(NETR_DELTA_MODIFY_COUNT)]    udlong                     *modified_count;
691         } netr_DELTA_UNION;
692
693         typedef [switch_type(netr_DeltaEnum)] union {
694                 [case(NETR_DELTA_DOMAIN)]          uint32 rid;
695                 [case(NETR_DELTA_GROUP)]           uint32 rid;
696                 [case(NETR_DELTA_DELETE_GROUP)]    uint32 rid;
697                 [case(NETR_DELTA_RENAME_GROUP)]    uint32 rid;
698                 [case(NETR_DELTA_USER)]            uint32 rid;
699                 [case(NETR_DELTA_DELETE_USER)]     uint32 rid;
700                 [case(NETR_DELTA_RENAME_USER)]     uint32 rid;
701                 [case(NETR_DELTA_GROUP_MEMBER)]    uint32 rid;
702                 [case(NETR_DELTA_ALIAS)]           uint32 rid;
703                 [case(NETR_DELTA_DELETE_ALIAS)]    uint32 rid;
704                 [case(NETR_DELTA_RENAME_ALIAS)]    uint32 rid;
705                 [case(NETR_DELTA_ALIAS_MEMBER)]    uint32 rid;
706                 [case(NETR_DELTA_POLICY)]          dom_sid2 *sid;
707                 [case(NETR_DELTA_TRUSTED_DOMAIN)]  dom_sid2 *sid;
708                 [case(NETR_DELTA_DELETE_TRUST)]    dom_sid2 *sid;
709                 [case(NETR_DELTA_ACCOUNT)]         dom_sid2 *sid;
710                 [case(NETR_DELTA_DELETE_ACCOUNT)]  dom_sid2 *sid;
711                 [case(NETR_DELTA_SECRET)]          [string,charset(UTF16)] uint16 *name;
712                 [case(NETR_DELTA_DELETE_SECRET)]   [string,charset(UTF16)] uint16 *name;
713                 [case(NETR_DELTA_DELETE_GROUP2)]   uint32 rid;
714                 [case(NETR_DELTA_DELETE_USER2)]    uint32 rid;
715                 [case(NETR_DELTA_MODIFY_COUNT)]    ;
716         } netr_DELTA_ID_UNION;
717
718         typedef struct {
719                 netr_DeltaEnum delta_type;
720                 [switch_is(delta_type)] netr_DELTA_ID_UNION delta_id_union;
721                 [switch_is(delta_type)] netr_DELTA_UNION delta_union;
722         } netr_DELTA_ENUM;
723
724         typedef struct {
725                 uint32 num_deltas;
726                 [size_is(num_deltas)] netr_DELTA_ENUM *delta_enum;
727         } netr_DELTA_ENUM_ARRAY;
728
729
730         NTSTATUS netr_DatabaseDeltas(
731                 [in]      [string,charset(UTF16)] uint16 logon_server[],
732                 [in]      [string,charset(UTF16)] uint16 computername[],
733                 [in,ref]  netr_Authenticator *credential,
734                 [in,out,ref]  netr_Authenticator *return_authenticator,
735                 [in]      netr_SamDatabaseID database_id,
736                 [in,out,ref]  udlong *sequence_num,
737                 [out,ref]     netr_DELTA_ENUM_ARRAY **delta_enum_array,
738                 [in]      uint32 preferredmaximumlength
739                 );
740
741
742         /*****************/
743         /* Function 0x08 */
744
745         NTSTATUS netr_DatabaseSync(
746                 [in]     [string,charset(UTF16)] uint16 logon_server[],
747                 [in]     [string,charset(UTF16)] uint16 computername[],
748                 [in,ref] netr_Authenticator *credential,
749                 [in,out,ref] netr_Authenticator *return_authenticator,
750                 [in]     netr_SamDatabaseID database_id,
751                 [in,out,ref] uint32 *sync_context,
752                 [out,ref]    netr_DELTA_ENUM_ARRAY **delta_enum_array,
753                 [in]     uint32 preferredmaximumlength
754                 );
755
756
757         /*****************/
758         /* Function 0x09 */
759
760         /* w2k3 returns NT_STATUS_NOT_IMPLEMENTED for this call */
761
762         typedef [flag(NDR_PAHEX)] struct {
763                 uint8 computer_name[16];
764                 uint32 timecreated;
765                 uint32 serial_number;
766         } netr_UAS_INFO_0;
767
768         typedef struct {
769                 [flag(NDR_REMAINING)] DATA_BLOB blob;
770         } netr_AccountBuffer;
771
772         NTSTATUS netr_AccountDeltas(
773                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
774                 [in]     [string,charset(UTF16)] uint16 computername[],
775                 [in]     netr_Authenticator credential,
776                 [in,out,ref] netr_Authenticator *return_authenticator,
777                 [in]     netr_UAS_INFO_0 uas,
778                 [in]     uint32 count,
779                 [in]     uint32 level,
780                 [in]     uint32 buffersize,
781                 [out,ref,subcontext(4)] netr_AccountBuffer *buffer,
782                 [out,ref]    uint32 *count_returned,
783                 [out,ref]    uint32 *total_entries,
784                 [out,ref]    netr_UAS_INFO_0 *recordid
785                 );
786
787
788         /*****************/
789         /* Function 0x0A */
790
791         NTSTATUS netr_AccountSync(
792                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
793                 [in]      [string,charset(UTF16)] uint16 computername[],
794                 [in]      netr_Authenticator credential,
795                 [in,out,ref]  netr_Authenticator *return_authenticator,
796                 [in]      uint32 reference,
797                 [in]      uint32 level,
798                 [in]      uint32 buffersize,
799                 [out,ref,subcontext(4)] netr_AccountBuffer *buffer,
800                 [out,ref]     uint32 *count_returned,
801                 [out,ref]     uint32 *total_entries,
802                 [out,ref]     uint32 *next_reference,
803                 [in,out,ref]  netr_UAS_INFO_0 *recordid
804                 );
805
806
807         /*****************/
808         /* Function 0x0B */
809
810         WERROR netr_GetDcName(
811                 [in]  [string,charset(UTF16)] uint16 logon_server[],
812                 [in,unique] [string,charset(UTF16)] uint16 *domainname,
813                 [out,ref] [string,charset(UTF16)] uint16 **dcname
814                 );
815
816         /*****************/
817         /* Function 0x0C */
818
819         typedef [bitmap32bit] bitmap {
820                 NETLOGON_CTRL_REPL_NEEDED       = 0x0001,
821                 NETLOGON_CTRL_REPL_IN_PROGRESS  = 0x0002,
822                 NETLOGON_CTRL_REPL_FULL_SYNC    = 0x0004
823         } netr_InfoFlags;
824
825         typedef struct {
826                 netr_InfoFlags flags;
827                 uint32 pdc_connection_status;
828         } netr_NETLOGON_INFO_1;
829
830         typedef struct {
831                 netr_InfoFlags flags;
832                 uint32 pdc_connection_status;
833                 [string,charset(UTF16)] uint16 *trusted_dc_name;
834                 uint32 tc_connection_status;
835         } netr_NETLOGON_INFO_2;
836
837         typedef struct {
838                 netr_InfoFlags flags;
839                 uint32 logon_attempts;
840                 uint32 unknown1;
841                 uint32 unknown2;
842                 uint32 unknown3;
843                 uint32 unknown4;
844                 uint32 unknown5;
845         } netr_NETLOGON_INFO_3;
846
847         typedef union {
848                 [case(1)]  netr_NETLOGON_INFO_1 *info1;
849                 [case(2)]  netr_NETLOGON_INFO_2 *info2;
850                 [case(3)]  netr_NETLOGON_INFO_3 *info3;
851         } netr_CONTROL_QUERY_INFORMATION;
852
853         /* function_code values */
854         typedef [v1_enum] enum {
855                 NETLOGON_CONTROL_SYNC             = 2,
856                 NETLOGON_CONTROL_REDISCOVER       = 5,
857                 NETLOGON_CONTROL_TC_QUERY         = 6,
858                 NETLOGON_CONTROL_TRANSPORT_NOTIFY = 7,
859                 NETLOGON_CONTROL_SET_DBFLAG       = 65534
860         } netr_LogonControlCode;
861
862         WERROR netr_LogonControl(
863                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
864                 [in]   netr_LogonControlCode function_code,
865                 [in]   uint32 level,
866                 [out,ref,switch_is(level)]  netr_CONTROL_QUERY_INFORMATION *info
867                 );
868
869
870         /*****************/
871         /* Function 0x0D */
872
873         WERROR netr_GetAnyDCName(
874                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
875                 [in,unique] [string,charset(UTF16)] uint16 *domainname,
876                 [out,ref] [string,charset(UTF16)] uint16 **dcname
877                 );
878
879
880         /*****************/
881         /* Function 0x0E */
882
883         typedef union {
884                 [case(NETLOGON_CONTROL_REDISCOVER)]        [string,charset(UTF16)] uint16 *domain;
885                 [case(NETLOGON_CONTROL_TC_QUERY)]          [string,charset(UTF16)] uint16 *domain;
886                 [case(NETLOGON_CONTROL_TRANSPORT_NOTIFY)]  [string,charset(UTF16)] uint16 *domain;
887                 [case(NETLOGON_CONTROL_SET_DBFLAG)]        uint32 debug_level;
888         } netr_CONTROL_DATA_INFORMATION;
889
890         WERROR netr_LogonControl2(
891                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
892                 [in]    netr_LogonControlCode function_code,
893                 [in]    uint32 level,
894                 [in,ref][switch_is(function_code)] netr_CONTROL_DATA_INFORMATION  *data,
895                 [out,ref][switch_is(level)]        netr_CONTROL_QUERY_INFORMATION *query
896                 );
897
898
899         /* If NETLOGON_NEG_ARCFOUR flag is not set, then the passwords and LM
900          * session keys are encrypted with DES calls.  (And the user session key
901          * is unencrypted) */
902
903         /*****************/
904         /* Function 0x0F */
905
906         typedef [bitmap32bit] bitmap {
907                 NETLOGON_NEG_ACCOUNT_LOCKOUT            = 0x00000001,
908                 NETLOGON_NEG_PERSISTENT_SAMREPL         = 0x00000002,
909                 NETLOGON_NEG_ARCFOUR                    = 0x00000004,
910                 NETLOGON_NEG_PROMOTION_COUNT            = 0x00000008,
911                 NETLOGON_NEG_CHANGELOG_BDC              = 0x00000010,
912                 NETLOGON_NEG_FULL_SYNC_REPL             = 0x00000020,
913                 NETLOGON_NEG_MULTIPLE_SIDS              = 0x00000040,
914                 NETLOGON_NEG_REDO                       = 0x00000080,
915                 NETLOGON_NEG_PASSWORD_CHANGE_REFUSAL    = 0x00000100,
916                 NETLOGON_NEG_SEND_PASSWORD_INFO_PDC     = 0x00000200,
917                 NETLOGON_NEG_GENERIC_PASSTHROUGH        = 0x00000400,
918                 NETLOGON_NEG_CONCURRENT_RPC             = 0x00000800,
919                 NETLOGON_NEG_AVOID_ACCOUNT_DB_REPL      = 0x00001000,
920                 NETLOGON_NEG_AVOID_SECURITYAUTH_DB_REPL = 0x00002000,
921                 NETLOGON_NEG_128BIT                     = 0x00004000, /* STRONG_KEYS */
922                 NETLOGON_NEG_TRANSITIVE_TRUSTS          = 0x00008000,
923                 NETLOGON_NEG_DNS_DOMAIN_TRUSTS          = 0x00010000,
924                 NETLOGON_NEG_PASSWORD_SET2              = 0x00020000,
925                 NETLOGON_NEG_GETDOMAININFO              = 0x00040000,
926                 NETLOGON_NEG_CROSS_FOREST_TRUSTS        = 0x00080000,
927                 NETLOGON_NEG_NEUTRALIZE_NT4_EMULATION   = 0x00100000,
928                 NETLOGON_NEG_RODC_PASSTHROUGH           = 0x00200000,
929                 NETLOGON_NEG_AUTHENTICATED_RPC_LSASS    = 0x20000000,
930                 NETLOGON_NEG_SCHANNEL                   = 0x40000000 /* AUTHENTICATED_RPC */
931         } netr_NegotiateFlags;
932
933         NTSTATUS netr_ServerAuthenticate2(
934                 [in,unique]  [string,charset(UTF16)] uint16 *server_name,
935                 [in]         [string,charset(UTF16)] uint16 account_name[],
936                 [in]         netr_SchannelType secure_channel_type,
937                 [in]         [string,charset(UTF16)] uint16 computer_name[],
938                 [in,ref]     netr_Credential *credentials,
939                 [out,ref]    netr_Credential *return_credentials,
940                 [in,out,ref] netr_NegotiateFlags *negotiate_flags
941                 );
942
943
944         /*****************/
945         /* Function 0x10 */
946
947         NTSTATUS netr_DatabaseSync2(
948                 [in]     [string,charset(UTF16)] uint16 logon_server[],
949                 [in]     [string,charset(UTF16)] uint16 computername[],
950                 [in,ref] netr_Authenticator *credential,
951                 [in,out,ref] netr_Authenticator *return_authenticator,
952                 [in]     netr_SamDatabaseID database_id,
953                 [in]     uint16 restart_state,
954                 [in,out,ref] uint32 *sync_context,
955                 [out,ref]    netr_DELTA_ENUM_ARRAY **delta_enum_array,
956                 [in]     uint32 preferredmaximumlength
957                 );
958
959
960         /*****************/
961         /* Function 0x11 */
962
963         /* i'm not at all sure how this call works */
964
965         typedef [bitmap16bit] bitmap {
966                 NETR_CHANGELOG_IMMEDIATE_REPL_REQUIRED  = 0x0001,
967                 NETR_CHANGELOG_CHANGED_PASSWORD         = 0x0002,
968                 NETR_CHANGELOG_SID_INCLUDED             = 0x0004,
969                 NETR_CHANGELOG_NAME_INCLUDED            = 0x0008,
970                 NETR_CHANGELOG_FIRST_PROMOTION_OBJ      = 0x0010
971         } netr_ChangeLogFlags;
972
973         typedef [nodiscriminant] union {
974                 [case(NETR_CHANGELOG_SID_INCLUDED)] dom_sid object_sid;
975                 [case(NETR_CHANGELOG_NAME_INCLUDED)] nstring object_name;
976                 [default];
977         } netr_ChangeLogObject;
978
979         typedef [public,gensize] struct {
980                 uint32 serial_number1;
981                 uint32 serial_number2;
982                 uint32 object_rid;
983                 netr_ChangeLogFlags flags;
984                 uint8 db_index;
985                 uint8 delta_type;
986                 [switch_is(flags & (NETR_CHANGELOG_SID_INCLUDED|NETR_CHANGELOG_NAME_INCLUDED))] netr_ChangeLogObject object;
987         } netr_ChangeLogEntry;
988
989         NTSTATUS netr_DatabaseRedo(
990                 [in]     [string,charset(UTF16)] uint16 logon_server[],
991                 [in]     [string,charset(UTF16)] uint16 computername[],
992                 [in]     netr_Authenticator *credential,
993                 [in,out,ref] netr_Authenticator *return_authenticator,
994                 [in]     [subcontext(4),subcontext_size(change_log_entry_size)] netr_ChangeLogEntry change_log_entry,
995                 [in]     [value(ndr_size_netr_ChangeLogEntry(&change_log_entry, ndr->flags))] uint32 change_log_entry_size,
996                 [out,ref]    netr_DELTA_ENUM_ARRAY **delta_enum_array
997                 );
998
999
1000         /*****************/
1001         /* Function 0x12 */
1002
1003         WERROR netr_LogonControl2Ex(
1004                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
1005                 [in]   uint32 function_code,
1006                 [in]   uint32 level,
1007                 [in][switch_is(function_code)] netr_CONTROL_DATA_INFORMATION  data,
1008                 [out,ref][switch_is(level)]     netr_CONTROL_QUERY_INFORMATION *query
1009                 );
1010
1011         /*****************/
1012         /* Function 0x13 */
1013         typedef struct {
1014                 uint32 length;
1015                 [size_is(length)] uint8 *data;
1016         } netr_Blob;
1017
1018         WERROR netr_NetrEnumerateTrustedDomains(
1019                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1020                 [out,ref] netr_Blob *trusted_domains_blob
1021                 );
1022
1023         /*****************/
1024         /* Function 0x14 */
1025
1026         /* one unkown bit still: DS_IP_VERSION_AGNOSTIC - gd*/
1027
1028         const int DSGETDC_VALID_FLAGS = (DS_FORCE_REDISCOVERY |
1029                                          DS_DIRECTORY_SERVICE_REQUIRED |
1030                                          DS_DIRECTORY_SERVICE_PREFERRED |
1031                                          DS_GC_SERVER_REQUIRED |
1032                                          DS_PDC_REQUIRED |
1033                                          DS_BACKGROUND_ONLY |
1034                                          DS_IP_REQUIRED |
1035                                          DS_KDC_REQUIRED |
1036                                          DS_TIMESERV_REQUIRED |
1037                                          DS_WRITABLE_REQUIRED |
1038                                          DS_GOOD_TIMESERV_PREFERRED |
1039                                          DS_AVOID_SELF |
1040                                          DS_ONLY_LDAP_NEEDED |
1041                                          DS_IS_FLAT_NAME |
1042                                          DS_IS_DNS_NAME |
1043                                          DS_RETURN_FLAT_NAME |
1044                                          DS_RETURN_DNS_NAME);
1045
1046         typedef [bitmap32bit] bitmap {
1047                 DS_FORCE_REDISCOVERY            = 0x00000001,
1048                 DS_DIRECTORY_SERVICE_REQUIRED   = 0x00000010,
1049                 DS_DIRECTORY_SERVICE_PREFERRED  = 0x00000020,
1050                 DS_GC_SERVER_REQUIRED           = 0x00000040,
1051                 DS_PDC_REQUIRED                 = 0x00000080,
1052                 DS_BACKGROUND_ONLY              = 0x00000100,
1053                 DS_IP_REQUIRED                  = 0x00000200,
1054                 DS_KDC_REQUIRED                 = 0x00000400,
1055                 DS_TIMESERV_REQUIRED            = 0x00000800,
1056                 DS_WRITABLE_REQUIRED            = 0x00001000,
1057                 DS_GOOD_TIMESERV_PREFERRED      = 0x00002000,
1058                 DS_AVOID_SELF                   = 0x00004000,
1059                 DS_ONLY_LDAP_NEEDED             = 0x00008000,
1060                 DS_IS_FLAT_NAME                 = 0x00010000,
1061                 DS_IS_DNS_NAME                  = 0x00020000,
1062                 DS_TRY_NEXTCLOSEST_SITE         = 0x00040000,
1063                 DS_DIRECTORY_SERVICE_6_REQUIRED = 0x00080000,
1064                 DS_RETURN_DNS_NAME              = 0x40000000,
1065                 DS_RETURN_FLAT_NAME             = 0x80000000
1066         } netr_DsRGetDCName_flags;
1067
1068         typedef [v1_enum] enum {
1069                 DS_ADDRESS_TYPE_INET            = 1,
1070                 DS_ADDRESS_TYPE_NETBIOS         = 2
1071         } netr_DsRGetDCNameInfo_AddressType;
1072
1073         typedef [bitmap32bit] bitmap {
1074                 DS_SERVER_PDC                    = NBT_SERVER_PDC,
1075                 DS_SERVER_GC                     = NBT_SERVER_GC,
1076                 DS_SERVER_LDAP                   = NBT_SERVER_LDAP,
1077                 DS_SERVER_DS                     = NBT_SERVER_DS,
1078                 DS_SERVER_KDC                    = NBT_SERVER_KDC,
1079                 DS_SERVER_TIMESERV               = NBT_SERVER_TIMESERV,
1080                 DS_SERVER_CLOSEST                = NBT_SERVER_CLOSEST,
1081                 DS_SERVER_WRITABLE               = NBT_SERVER_WRITABLE,
1082                 DS_SERVER_GOOD_TIMESERV          = NBT_SERVER_GOOD_TIMESERV,
1083                 DS_SERVER_NDNC                   = NBT_SERVER_NDNC,
1084                 DS_SERVER_SELECT_SECRET_DOMAIN_6 = NBT_SERVER_SELECT_SECRET_DOMAIN_6,
1085                 DS_SERVER_FULL_SECRET_DOMAIN_6   = NBT_SERVER_FULL_SECRET_DOMAIN_6,
1086                 DS_DNS_CONTROLLER                = 0x20000000,
1087                 DS_DNS_DOMAIN                    = 0x40000000,
1088                 DS_DNS_FOREST                    = 0x80000000
1089         } netr_DsR_DcFlags;
1090
1091         typedef [public] struct {
1092                 [string,charset(UTF16)] uint16 *dc_unc;
1093                 [string,charset(UTF16)] uint16 *dc_address;
1094                 netr_DsRGetDCNameInfo_AddressType dc_address_type;
1095                 GUID domain_guid;
1096                 [string,charset(UTF16)] uint16 *domain_name;
1097                 [string,charset(UTF16)] uint16 *forest_name;
1098                 netr_DsR_DcFlags dc_flags;
1099                 [string,charset(UTF16)] uint16 *dc_site_name;
1100                 [string,charset(UTF16)] uint16 *client_site_name;
1101         } netr_DsRGetDCNameInfo;
1102
1103         WERROR netr_DsRGetDCName(
1104                 [in,unique] [string,charset(UTF16)] uint16 *server_unc,
1105                 [in,unique] [string,charset(UTF16)] uint16 *domain_name,
1106                 [in,unique] GUID *domain_guid,
1107                 [in,unique] GUID *site_guid,
1108                 [in] netr_DsRGetDCName_flags flags,
1109                 [out,ref] netr_DsRGetDCNameInfo **info
1110                 );
1111
1112         /*****************/
1113         /* Function 0x15 */
1114         [todo] WERROR netr_NETRLOGONDUMMYROUTINE1();
1115
1116         /****************/
1117         /* Function 0x16 */
1118         [todo] WERROR netr_NETRLOGONSETSERVICEBITS();
1119
1120         /****************/
1121         /* Function 0x17 */
1122         WERROR netr_LogonGetTrustRid(
1123                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1124                 [in,unique] [string,charset(UTF16)] uint16 *domain_name,
1125                 [out,ref] uint32 *rid
1126         );
1127
1128         /****************/
1129         /* Function 0x18 */
1130         [todo] WERROR netr_NETRLOGONCOMPUTESERVERDIGEST();
1131
1132         /****************/
1133         /* Function 0x19 */
1134         [todo] WERROR netr_NETRLOGONCOMPUTECLIENTDIGEST();
1135
1136         /****************/
1137         /* Function 0x1a */
1138         [public] NTSTATUS netr_ServerAuthenticate3(
1139                 [in,unique]  [string,charset(UTF16)] uint16 *server_name,
1140                 [in]         [string,charset(UTF16)] uint16 account_name[],
1141                 [in]         netr_SchannelType secure_channel_type,
1142                 [in]         [string,charset(UTF16)] uint16 computer_name[],
1143                 [in,ref]     netr_Credential *credentials,
1144                 [out,ref]    netr_Credential *return_credentials,
1145                 [in,out,ref] netr_NegotiateFlags *negotiate_flags,
1146                 [out,ref]    uint32 *rid
1147                 );
1148
1149         /****************/
1150         /* Function 0x1b */
1151
1152         WERROR netr_DsRGetDCNameEx(
1153                 [in,unique] [string,charset(UTF16)] uint16 *server_unc,
1154                 [in,unique] [string,charset(UTF16)] uint16 *domain_name,
1155                 [in,unique] GUID *domain_guid,
1156                 [in,unique] [string,charset(UTF16)] uint16 *site_name,
1157                 [in] netr_DsRGetDCName_flags flags,
1158                 [out,ref] netr_DsRGetDCNameInfo **info
1159                 );
1160
1161
1162         /****************/
1163         /* Function 0x1c */
1164         WERROR netr_DsRGetSiteName(
1165                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
1166                 [out,ref] [string,charset(UTF16)] uint16 **site
1167                 );
1168
1169         /****************/
1170         /* Function 0x1d */
1171         typedef [bitmap32bit] bitmap {
1172                 NETR_TRUST_FLAG_IN_FOREST = 0x00000001,
1173                 NETR_TRUST_FLAG_OUTBOUND  = 0x00000002,
1174                 NETR_TRUST_FLAG_TREEROOT  = 0x00000004,
1175                 NETR_TRUST_FLAG_PRIMARY   = 0x00000008,
1176                 NETR_TRUST_FLAG_NATIVE    = 0x00000010,
1177                 NETR_TRUST_FLAG_INBOUND   = 0x00000020,
1178                 NETR_TRUST_FLAG_MIT_KRB5  = 0x00000080,
1179                 NETR_TRUST_FLAG_AES       = 0x00000100
1180         } netr_TrustFlags;
1181
1182         typedef [flag(NDR_PAHEX)] struct {
1183                 uint16 length;
1184                 uint16 size;
1185                 [size_is(size/2),length_is(length/2)] uint16 *data;
1186         } netr_BinaryString;
1187
1188         typedef struct {
1189                 netr_Blob blob;
1190                 [string,charset(UTF16)] uint16 *workstation_domain;
1191                 [string,charset(UTF16)] uint16 *workstation_site;
1192                 [string,charset(UTF16)] uint16 *unknown1;
1193                 [string,charset(UTF16)] uint16 *unknown2;
1194                 [string,charset(UTF16)] uint16 *unknown3;
1195                 [string,charset(UTF16)] uint16 *unknown4;
1196                 netr_BinaryString blob2;
1197                 lsa_String product;
1198                 lsa_String unknown5;
1199                 lsa_String unknown6;
1200                 uint32 unknown7[4];
1201         } netr_DomainQuery1;
1202
1203         typedef union {
1204                 [case(1)] netr_DomainQuery1 *query1;
1205                 [case(2)] netr_DomainQuery1 *query1;
1206         } netr_DomainQuery;
1207
1208         typedef struct {
1209                 /* these first 3 values come from the fact windows
1210                    actually encodes this structure as a UNICODE_STRING
1211                    - see MS-NRPC section 2.2.1.3.9 */
1212                 [value(8)] uint32 length;
1213                 [value(0)] uint32 dummy;
1214                 [value(8)] uint32 size;
1215                 netr_TrustFlags flags;
1216                 uint32 parent_index;
1217                 uint32 trust_type;
1218                 uint32 trust_attributes;
1219         } netr_trust_extension;
1220
1221         typedef struct {
1222                 uint16 length; /* value is 16 when info != NULL, otherwise 0 */
1223                 [value(length)] uint16 size;   /* value is 16 when info != NULL, otherwise 0 */
1224                 netr_trust_extension *info;
1225         } netr_trust_extension_container;
1226
1227         typedef struct {
1228                 lsa_String domainname;
1229                 lsa_String fulldomainname;
1230                 lsa_String forest;
1231                 GUID        guid;
1232                 dom_sid2    *sid;
1233                 netr_trust_extension_container trust_extension;
1234                 lsa_String dummystring[3];
1235                 uint32     dummy[4];
1236         } netr_DomainTrustInfo;
1237
1238         typedef struct {
1239                 uint32 policy_size;
1240                 [size_is(policy_size)] uint8 *policy;
1241         } netr_LsaPolicyInfo;
1242
1243         typedef [public,bitmap32bit] bitmap {
1244                 NETR_WS_FLAG_HANDLES_INBOUND_TRUSTS = 0x00000001,
1245                 NETR_WS_FLAG_HANDLES_SPN_UPDATE     = 0x00000002
1246         } netr_WorkstationFlags;
1247
1248         typedef struct {
1249                 netr_DomainTrustInfo domaininfo;
1250                 uint32 num_trusts;
1251                 [size_is(num_trusts)] netr_DomainTrustInfo *trusts;
1252                 netr_LsaPolicyInfo lsa_policy;
1253                 lsa_String dns_hostname;
1254                 lsa_String dummystring[3];
1255                 netr_WorkstationFlags workstation_flags;
1256                 uint32 supported_enc_types;
1257                 uint32 dummy[2];
1258         } netr_DomainInfo1;
1259
1260         typedef union {
1261                 [case(1)] netr_DomainInfo1 *info1;
1262                 [case(2)] netr_DomainInfo1 *info2;
1263         } netr_DomainInfo;
1264         
1265         NTSTATUS netr_LogonGetDomainInfo(
1266                 [in]         [string,charset(UTF16)] uint16 server_name[],
1267                 [in,unique]  [string,charset(UTF16)] uint16 *computer_name,
1268                 [in,ref]     netr_Authenticator *credential,
1269                 [in,out,ref] netr_Authenticator *return_authenticator,
1270                 [in]         uint32 level,
1271                 [in,switch_is(level)] netr_DomainQuery query,
1272                 [out,ref,switch_is(level)] netr_DomainInfo *info
1273                 );
1274
1275         typedef [flag(NDR_PAHEX)] struct {
1276                 uint8 data[512];
1277                 uint32 length;
1278         } netr_CryptPassword;
1279
1280         /*****************/
1281         /* Function 0x1e */
1282         NTSTATUS netr_ServerPasswordSet2(
1283                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1284                 [in]  [string,charset(UTF16)] uint16 account_name[],
1285                 [in]  netr_SchannelType secure_channel_type,
1286                 [in]  [string,charset(UTF16)] uint16 computer_name[],
1287                 [in,ref] netr_Authenticator *credential,
1288                 [out,ref] netr_Authenticator *return_authenticator,
1289                 [in,ref] netr_CryptPassword *new_password
1290                 );
1291
1292         /****************/
1293         /* Function 0x1f */
1294         WERROR netr_ServerPasswordGet(
1295                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1296                 [in]  [string,charset(UTF16)] uint16 account_name[],
1297                 [in]  netr_SchannelType secure_channel_type,
1298                 [in]  [string,charset(UTF16)] uint16 computer_name[],
1299                 [in,ref] netr_Authenticator *credential,
1300                 [out,ref] netr_Authenticator *return_authenticator,
1301                 [out,ref] samr_Password *password
1302                 );
1303
1304         /****************/
1305         /* Function 0x20 */
1306         [todo] WERROR netr_NETRLOGONSENDTOSAM();
1307
1308         /****************/
1309         /* Function 0x21 */
1310         typedef struct {
1311                 uint32 count;
1312                 [size_is(count)] lsa_String *sitename;
1313         } netr_DsRAddressToSitenamesWCtr;
1314
1315         typedef struct {
1316                 [size_is(size)] uint8 *buffer;
1317                 uint32 size;
1318         } netr_DsRAddress;
1319
1320         WERROR netr_DsRAddressToSitenamesW(
1321                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1322                 [in] [range(0,32000)] uint32 count,
1323                 [in] [size_is(count)] [ref] netr_DsRAddress *addresses,
1324                 [out] [ref] netr_DsRAddressToSitenamesWCtr **ctr
1325                 );
1326
1327         /****************/
1328         /* Function 0x22 */
1329         WERROR netr_DsRGetDCNameEx2(
1330                 [in,unique] [string,charset(UTF16)] uint16 *server_unc,
1331                 [in,unique] [string,charset(UTF16)] uint16 *client_account,
1332                 [in] samr_AcctFlags mask,
1333                 [in,unique] [string,charset(UTF16)] uint16 *domain_name,
1334                 [in,unique] GUID *domain_guid,
1335                 [in,unique] [string,charset(UTF16)] uint16 *site_name,
1336                 [in] netr_DsRGetDCName_flags flags,
1337                 [out,ref] netr_DsRGetDCNameInfo **info
1338                 );
1339
1340         /****************/
1341         /* Function 0x23 */
1342         [todo] WERROR netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN();
1343
1344         /****************/
1345         /* Function 0x24 */
1346
1347         typedef [v1_enum] enum {
1348                 NETR_TRUST_TYPE_DOWNLEVEL       = 1,
1349                 NETR_TRUST_TYPE_UPLEVEL         = 2,
1350                 NETR_TRUST_TYPE_MIT             = 3,
1351                 NETR_TRUST_TYPE_DCE             = 4
1352         } netr_TrustType;
1353
1354         typedef [bitmap32bit] bitmap {
1355                 NETR_TRUST_ATTRIBUTE_NON_TRANSITIVE     = 0x00000001,
1356                 NETR_TRUST_ATTRIBUTE_UPLEVEL_ONLY       = 0x00000002,
1357                 NETR_TRUST_ATTRIBUTE_QUARANTINED_DOMAIN = 0x00000004,
1358                 NETR_TRUST_ATTRIBUTE_FOREST_TRANSITIVE  = 0x00000008,
1359                 NETR_TRUST_ATTRIBUTE_CROSS_ORGANIZATION = 0x00000010,
1360                 NETR_TRUST_ATTRIBUTE_WITHIN_FOREST      = 0x00000020,
1361                 NETR_TRUST_ATTRIBUTE_TREAT_AS_EXTERNAL  = 0x00000040
1362         } netr_TrustAttributes;
1363
1364         typedef struct {
1365                 [string,charset(UTF16)] uint16                  *netbios_name;
1366                 [string,charset(UTF16)] uint16                  *dns_name;
1367                 netr_TrustFlags         trust_flags;
1368                 uint32                  parent_index;
1369                 netr_TrustType          trust_type;
1370                 netr_TrustAttributes    trust_attributes;
1371                 dom_sid2                *sid;
1372                 GUID                    guid;
1373         } netr_DomainTrust;
1374
1375         typedef struct {
1376                 uint32 count;
1377                 [size_is(count)] netr_DomainTrust *array;
1378         } netr_DomainTrustList;
1379
1380         WERROR netr_NetrEnumerateTrustedDomainsEx(
1381                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1382                 [out,ref] netr_DomainTrustList *dom_trust_list
1383         );
1384
1385         /****************/
1386         /* Function 0x25 */
1387         typedef struct {
1388                 uint32 count;
1389                 [size_is(count)] lsa_String *sitename;
1390                 [size_is(count)] lsa_String *subnetname;
1391         } netr_DsRAddressToSitenamesExWCtr;
1392
1393         WERROR netr_DsRAddressToSitenamesExW(
1394                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1395                 [in] [range(0,32000)] uint32 count,
1396                 [in] [size_is(count)] [ref] netr_DsRAddress *addresses,
1397                 [out] [ref] netr_DsRAddressToSitenamesExWCtr **ctr
1398                 );
1399
1400         /****************/
1401         /* Function 0x26 */
1402
1403         typedef struct {
1404                 uint32 num_sites;
1405                 [size_is(num_sites)] [unique] lsa_String *sites;
1406         } DcSitesCtr;
1407
1408         WERROR netr_DsrGetDcSiteCoverageW(
1409                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1410                 [out,ref] DcSitesCtr **ctr
1411                 );
1412
1413         /****************/
1414         /* Function 0x27 */
1415         NTSTATUS netr_LogonSamLogonEx(
1416                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1417                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
1418                 [in]  netr_LogonInfoClass logon_level,
1419                 [in,ref]  [switch_is(logon_level)] netr_LogonLevel *logon,
1420                 [in]  uint16 validation_level,
1421                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
1422                 [out,ref] uint8 *authoritative,
1423                 [in,out,ref] uint32 *flags
1424                 );
1425
1426         /****************/
1427         /* Function 0x28 */
1428
1429         WERROR netr_DsrEnumerateDomainTrusts(
1430                 [in,unique]          [string,charset(UTF16)] uint16           *server_name,
1431                 [in]                 netr_TrustFlags  trust_flags,
1432                 [out,ref]            netr_DomainTrustList *trusts
1433                 );
1434
1435
1436         /****************/
1437         /* Function 0x29 */
1438         WERROR netr_DsrDeregisterDNSHostRecords(
1439                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1440                 [in,unique] [string,charset(UTF16)] uint16 *domain,
1441                 [in,unique] GUID *domain_guid,
1442                 [in,unique] GUID *dsa_guid,
1443                 [in,ref] [string,charset(UTF16)] uint16 *dns_host
1444                 );
1445
1446         /****************/
1447         /* Function 0x2a */
1448         NTSTATUS netr_ServerTrustPasswordsGet(
1449                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1450                 [in]  [string,charset(UTF16)] uint16 account_name[],
1451                 [in]  netr_SchannelType secure_channel_type,
1452                 [in]  [string,charset(UTF16)] uint16 computer_name[],
1453                 [in,ref] netr_Authenticator *credential,
1454                 [out,ref] netr_Authenticator *return_authenticator,
1455                 [out,ref] samr_Password *password,
1456                 [out,ref] samr_Password *password2
1457         );
1458
1459         /****************/
1460         /* Function 0x2b */
1461
1462         const int DS_GFTI_UPDATE_TDO = 0x1;
1463
1464         WERROR netr_DsRGetForestTrustInformation(
1465                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1466                 [in,unique] [string,charset(UTF16)] uint16 *trusted_domain_name,
1467                 [in] uint32 flags,
1468                 [out,ref] lsa_ForestTrustInformation **forest_trust_info
1469                 );
1470
1471         /****************/
1472         /* Function 0x2c */
1473         WERROR netr_GetForestTrustInformation(
1474                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1475                 [in,ref] [string,charset(UTF16)] uint16 *trusted_domain_name,
1476                 [in,ref] netr_Authenticator *credential,
1477                 [out,ref] netr_Authenticator *return_authenticator,
1478                 [in] uint32 flags,
1479                 [out,ref] lsa_ForestTrustInformation **forest_trust_info
1480                 );
1481
1482         /****************/
1483         /* Function 0x2d */
1484
1485         /* this is the ADS varient. I don't yet know what the "flags" are for */
1486         NTSTATUS netr_LogonSamLogonWithFlags(
1487                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1488                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
1489                 [in,unique] netr_Authenticator *credential,
1490                 [in,out,unique] netr_Authenticator *return_authenticator,
1491                 [in]  netr_LogonInfoClass logon_level,
1492                 [in,ref]  [switch_is(logon_level)] netr_LogonLevel *logon,
1493                 [in]  uint16 validation_level,
1494                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
1495                 [out,ref] uint8 *authoritative,
1496                 [in,out,ref] uint32 *flags
1497                 );
1498
1499         /****************/
1500         /* Function 0x2e */
1501         [todo] WERROR netr_NETRSERVERGETTRUSTINFO();
1502 }