s4-torture: add netr_LogonGetDomainInfo NDR(64) tests
[samba.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";
8
9 #include "idl_types.h"
10
11 cpp_quote("#define netr_DeltaEnum8Bit netr_DeltaEnum")
12 cpp_quote("#define netr_SamDatabaseID8Bit netr_SamDatabaseID")
13
14 cpp_quote("#define ENC_CRC32 KERB_ENCTYPE_DES_CBC_CRC")
15 cpp_quote("#define ENC_RSA_MD5 KERB_ENCTYPE_DES_CBC_MD5")
16 cpp_quote("#define ENC_RC4_HMAC_MD5 KERB_ENCTYPE_RC4_HMAC_MD5")
17 cpp_quote("#define ENC_HMAC_SHA1_96_AES128 KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96")
18 cpp_quote("#define ENC_HMAC_SHA1_96_AES256 KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96")
19
20 [
21   uuid("12345678-1234-abcd-ef00-01234567cffb"),
22   version(1.0),
23   endpoint("ncacn_np:[\\pipe\\netlogon]","ncacn_ip_tcp:","ncalrpc:"),
24   helper("../librpc/ndr/ndr_netlogon.h"),
25   ms_union,
26   pointer_default(unique)
27 ]
28
29 interface netlogon
30 {
31         typedef bitmap samr_AcctFlags samr_AcctFlags;
32         typedef bitmap security_GroupAttrs security_GroupAttrs;
33         typedef enum netr_DeltaEnum8Bit netr_DeltaEnum8Bit;
34         typedef enum netr_SamDatabaseID8Bit netr_SamDatabaseID8Bit;
35
36         /*****************/
37         /* Function 0x00 */
38
39         typedef struct {
40                 [string,charset(UTF16)] uint16 *account_name;
41                 uint32 priv;
42                 uint32 auth_flags;
43                 uint32 logon_count;
44                 uint32 bad_pw_count;
45                 time_t last_logon;
46                 time_t last_logoff;
47                 time_t logoff_time;
48                 time_t kickoff_time;
49                 uint32 password_age;
50                 time_t pw_can_change;
51                 time_t pw_must_change;
52                 [string,charset(UTF16)] uint16 *computer;
53                 [string,charset(UTF16)] uint16 *domain;
54                 [string,charset(UTF16)] uint16 *script_path;
55                 uint32 unknown;
56         } netr_UasInfo;
57
58         WERROR netr_LogonUasLogon(
59                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
60                 [in]   [string,charset(UTF16)] uint16 *account_name,
61                 [in]   [string,charset(UTF16)] uint16 *workstation,
62                 [out,ref]  netr_UasInfo **info
63                 );
64
65
66         /*****************/
67         /* Function 0x01 */
68
69         typedef struct {
70                 uint32 duration;
71                 uint16 logon_count;
72         } netr_UasLogoffInfo;
73
74         WERROR netr_LogonUasLogoff(
75                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
76                 [in] [string,charset(UTF16)] uint16 *account_name,
77                 [in] [string,charset(UTF16)] uint16 *workstation,
78                 [out,ref] netr_UasLogoffInfo *info
79                 );
80
81
82         /*****************/
83         /* Function 0x02 */
84
85         /* in netr_AcctLockStr size seems to be be 24, and rrenard thinks 
86            that the structure of the bindata looks like this:
87
88                 dlong  lockout_duration;
89                 udlong reset_count;
90                 uint32 bad_attempt_lockout;
91                 uint32 dummy;   
92
93            but it doesn't look as though this structure is reflected at the
94            NDR level. Maybe it is left to the application to decode the bindata array.
95         */
96         typedef [public] struct {
97                 dlong lockout_duration;
98                 udlong reset_count;
99                 uint32 bad_attempt_lockout;
100                 uint32 dummy;
101         } netr_AcctLockStr;
102
103         /* - MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT
104          *   sets the NETLOGON_SERVER_TRUST_ACCOUNT user_flag
105          * - MSV1_0_UPDATE_LOGON_STATISTICS
106          *   sets the logon time on network logon
107          * - MSV1_0_RETURN_USER_PARAMETERS
108          *   sets the user parameters in the driveletter
109          * - MSV1_0_RETURN_PROFILE_PATH
110          *   returns the profilepath in the driveletter and
111          *   sets LOGON_PROFILE_PATH_RETURNED user_flag
112          */
113
114         typedef [public,bitmap32bit] bitmap {
115                 MSV1_0_CLEARTEXT_PASSWORD_ALLOWED       = 0x00000002,
116                 MSV1_0_UPDATE_LOGON_STATISTICS          = 0x00000004,
117                 MSV1_0_RETURN_USER_PARAMETERS           = 0x00000008,
118                 MSV1_0_DONT_TRY_GUEST_ACCOUNT           = 0x00000010,
119                 MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT       = 0x00000020,
120                 MSV1_0_RETURN_PASSWORD_EXPIRY           = 0x00000040,
121                 MSV1_0_USE_CLIENT_CHALLENGE             = 0x00000080,
122                 MSV1_0_TRY_GUEST_ACCOUNT_ONLY           = 0x00000100,
123                 MSV1_0_RETURN_PROFILE_PATH              = 0x00000200,
124                 MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY        = 0x00000400,
125                 MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT  = 0x00000800,
126                 MSV1_0_DISABLE_PERSONAL_FALLBACK        = 0x00001000,
127                 MSV1_0_ALLOW_FORCE_GUEST                = 0x00002000,
128                 MSV1_0_CLEARTEXT_PASSWORD_SUPPLIED      = 0x00004000,
129                 MSV1_0_USE_DOMAIN_FOR_ROUTING_ONLY      = 0x00008000,
130                 MSV1_0_ALLOW_MSVCHAPV2                  = 0x00010000,
131                 MSV1_0_S4U2SELF                         = 0x00020000,
132                 MSV1_0_CHECK_LOGONHOURS_FOR_S4U         = 0x00040000,
133                 MSV1_0_SUBAUTHENTICATION_DLL_EX         = 0x00100000
134         } netr_LogonParameterControl;
135
136         /* Summary of the of the Query and Response from Microsoft on
137          * the usage of logon_id in netr_IdendityInfo
138          *
139          * [REG:119013019612095] [MS-NRPC]: NETLOGON_LOGON_IDENTITY_INFO: Does
140          * the Reserved field have LogonId meaning?
141          *
142          * Questions:
143          *   In NetrLogonSamLogonEx does the Reserved field
144          *   (of NETLOGON_LOGON_IDENTITY_INFO) have LogonId meaning?
145          *
146          *   What is a valid LogonID, and does have any audit usage?
147          *
148          *   Samba is sending a constant "deadbeef" in hex and would like to
149          *   understand any usage of this field.
150          *
151          * Response:
152          *   The NRPC spec is accurate in defining the field as Reserved, and
153          *   without protocol significance. In the header file in our source
154          *   code, it is defined as LogonId and commented as such, but it’s
155          *   effectively not used. This is probably why the API structure has
156          *   that field name. It may have been intended as such but it’s not
157          *    used.
158          *
159          * Samba now sends a random value in this field.
160          */
161         typedef struct {
162                 lsa_String  domain_name;
163                 netr_LogonParameterControl parameter_control; /* see MSV1_0_* */
164                 udlong logon_id;
165                 lsa_String  account_name;
166                 lsa_String  workstation;
167         } netr_IdentityInfo;
168
169         typedef struct {
170                 netr_IdentityInfo identity_info;
171                 samr_Password lmpassword;
172                 samr_Password ntpassword;
173         } netr_PasswordInfo;
174
175         typedef [flag(NDR_PAHEX)] struct {
176                 uint16 length;
177                 [value(length)] uint16 size;
178                 [size_is(length),length_is(length)] uint8 *data;
179         } netr_ChallengeResponse;
180
181         typedef [flag(NDR_PAHEX)] struct {
182                 netr_IdentityInfo identity_info;
183                 uint8 challenge[8];
184                 netr_ChallengeResponse nt;
185                 netr_ChallengeResponse lm;
186         } netr_NetworkInfo;
187
188         typedef [flag(NDR_PAHEX)] struct {
189                 netr_IdentityInfo identity_info;
190                 lsa_String  package_name;
191                 uint32 length;
192                 [size_is(length)] uint8 *data;
193         } netr_GenericInfo;
194
195         typedef [public] enum {
196                 NetlogonInteractiveInformation = 1,
197                 NetlogonNetworkInformation = 2,
198                 NetlogonServiceInformation = 3,
199                 NetlogonGenericInformation = 4,
200                 NetlogonInteractiveTransitiveInformation = 5,
201                 NetlogonNetworkTransitiveInformation = 6,
202                 NetlogonServiceTransitiveInformation = 7
203         } netr_LogonInfoClass;
204
205         typedef [public,switch_type(netr_LogonInfoClass)] union {
206                 [case(NetlogonInteractiveInformation)]           netr_PasswordInfo *password;
207                 [case(NetlogonNetworkInformation)]               netr_NetworkInfo  *network;
208                 [case(NetlogonServiceInformation)]               netr_PasswordInfo *password;
209                 [case(NetlogonGenericInformation)]               netr_GenericInfo  *generic;
210                 [case(NetlogonInteractiveTransitiveInformation)] netr_PasswordInfo *password;
211                 [case(NetlogonNetworkTransitiveInformation)]     netr_NetworkInfo  *network;
212                 [case(NetlogonServiceTransitiveInformation)]     netr_PasswordInfo *password;
213                 [default];
214         } netr_LogonLevel;
215
216         typedef [public,flag(NDR_PAHEX)] struct {
217                 uint8 key[16];
218         } netr_UserSessionKey;
219
220         typedef [public,flag(NDR_PAHEX)] struct {
221                 uint8 key[8];
222         } netr_LMSessionKey;
223
224         /* Flags for user_flags below */
225         typedef [public,bitmap32bit] bitmap {
226                 NETLOGON_GUEST                  = 0x00000001,
227                 NETLOGON_NOENCRYPTION           = 0x00000002,
228                 NETLOGON_CACHED_ACCOUNT         = 0x00000004,
229                 NETLOGON_USED_LM_PASSWORD       = 0x00000008,
230                 NETLOGON_EXTRA_SIDS             = 0x00000020,
231                 NETLOGON_SUBAUTH_SESSION_KEY    = 0x00000040,
232                 NETLOGON_SERVER_TRUST_ACCOUNT   = 0x00000080,
233                 NETLOGON_NTLMV2_ENABLED         = 0x00000100,
234                 NETLOGON_RESOURCE_GROUPS        = 0x00000200,
235                 NETLOGON_PROFILE_PATH_RETURNED  = 0x00000400,
236                 NETLOGON_GRACE_LOGON            = 0x01000000
237         } netr_UserFlags;
238
239         typedef struct {
240                 NTTIME logon_time;
241                 NTTIME logoff_time;
242                 NTTIME kickoff_time;
243                 NTTIME last_password_change;
244                 NTTIME allow_password_change;
245                 NTTIME force_password_change;
246                 lsa_String account_name;
247                 lsa_String full_name;
248                 lsa_String logon_script;
249                 lsa_String profile_path;
250                 lsa_String home_directory;
251                 lsa_String home_drive;
252                 uint16 logon_count;
253                 uint16 bad_password_count;
254                 uint32 rid;
255                 uint32 primary_gid;
256                 samr_RidWithAttributeArray groups;
257                 netr_UserFlags user_flags;
258                 [flag(NDR_SECRET)] netr_UserSessionKey key;
259                 lsa_StringLarge logon_server;
260                 lsa_StringLarge logon_domain;
261                 dom_sid2 *domain_sid;
262                 [flag(NDR_SECRET)] netr_LMSessionKey LMSessKey;
263                 samr_AcctFlags acct_flags;
264                 uint32 sub_auth_status;
265                 NTTIME last_successful_logon;
266                 NTTIME last_failed_logon;
267                 uint32 failed_logon_count;
268                 uint32 reserved;
269         } netr_SamBaseInfo;
270
271         typedef struct {
272                 netr_SamBaseInfo base;
273         } netr_SamInfo2;
274
275         typedef [public] struct {
276                 dom_sid2 *sid;
277                 security_GroupAttrs attributes;
278         } netr_SidAttr;
279
280         typedef [public] struct {
281                 netr_SamBaseInfo base;
282                 uint32 sidcount;
283                 [size_is(sidcount)] netr_SidAttr *sids;
284         } netr_SamInfo3;
285
286         typedef struct {
287                 netr_SamBaseInfo base;
288                 uint32 sidcount;
289                 [size_is(sidcount)] netr_SidAttr *sids;
290                 /*
291                  * On ndr_push:
292                  * Should pointer values be allocated
293                  * of sids[*].sid before the following ones?
294                  *
295                  * That's at least the case for
296                  * PAC_LOGON_INFO.
297                  */
298                 lsa_String dns_domainname;
299                 lsa_String principal_name;
300                 uint32 unknown4[20];
301         } netr_SamInfo6;
302
303         typedef struct {
304                 uint32 pac_size;
305                 [size_is(pac_size)] uint8 *pac;
306                 lsa_String logon_domain;
307                 lsa_String logon_server;
308                 lsa_String principal_name;
309                 uint32 auth_size;
310                 [size_is(auth_size)] uint8 *auth;
311                 netr_UserSessionKey user_session_key;
312                 uint32 expansionroom[10];
313                 lsa_String unknown1;
314                 lsa_String unknown2;
315                 lsa_String unknown3;
316                 lsa_String unknown4;
317         } netr_PacInfo;
318
319         typedef [flag(NDR_PAHEX)] struct {
320                 uint32 length;
321                 [size_is(length)] uint8 *data;
322         } netr_GenericInfo2;
323
324         typedef enum {
325                 NetlogonValidationUasInfo = 1,
326                 NetlogonValidationSamInfo = 2,
327                 NetlogonValidationSamInfo2 = 3,
328                 NetlogonValidationGenericInfo2 = 5,
329                 NetlogonValidationSamInfo4 = 6
330         } netr_ValidationInfoClass;
331
332         typedef [public,switch_type(uint16)] union {
333                 [case(NetlogonValidationSamInfo)] netr_SamInfo2 *sam2;
334                 [case(NetlogonValidationSamInfo2)] netr_SamInfo3 *sam3;
335                 [case(4)] netr_PacInfo  *pac;
336                 [case(NetlogonValidationGenericInfo2)] netr_GenericInfo2  *generic;
337                 [case(NetlogonValidationSamInfo4)] netr_SamInfo6 *sam6;
338                 [default];
339         } netr_Validation;
340
341         typedef [public, flag(NDR_PAHEX)] struct {
342                 uint8 data[8];
343         } netr_Credential;
344
345         typedef [public] struct {
346                 netr_Credential cred;
347                 time_t timestamp;
348         } netr_Authenticator;
349
350         [public] NTSTATUS netr_LogonSamLogon(
351                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
352                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
353                 [in,unique] netr_Authenticator *credential,
354                 [in,out,unique] netr_Authenticator *return_authenticator,
355                 [in] netr_LogonInfoClass logon_level,
356                 [in,ref] [switch_is(logon_level)] netr_LogonLevel *logon,
357                 [in] uint16 validation_level,
358                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
359                 [out,ref] uint8 *authoritative
360                 );
361
362
363         /*****************/
364         /* Function 0x03 */
365
366         NTSTATUS netr_LogonSamLogoff(
367                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
368                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
369                 [in,unique] netr_Authenticator *credential,
370                 [in,out,unique] netr_Authenticator *return_authenticator,
371                 [in] netr_LogonInfoClass logon_level,
372                 [in] [switch_is(logon_level)] netr_LogonLevel logon
373                 );
374         
375
376
377         /*****************/
378         /* Function 0x04 */
379
380         [public] NTSTATUS netr_ServerReqChallenge(
381                 [in,unique,string,charset(UTF16)] uint16 *server_name,
382                 [in,string,charset(UTF16)] uint16 *computer_name,
383                 [in,ref] netr_Credential *credentials,
384                 [out,ref] netr_Credential *return_credentials
385                 );
386
387
388         /*****************/
389         /* Function 0x05 */
390
391         typedef enum netr_SchannelType netr_SchannelType;
392
393         NTSTATUS netr_ServerAuthenticate(
394                 [in,unique,string,charset(UTF16)] uint16 *server_name,
395                 [in,string,charset(UTF16)] uint16 *account_name,
396                 [in] netr_SchannelType secure_channel_type,
397                 [in,string,charset(UTF16)] uint16 *computer_name,
398                 [in,ref] netr_Credential *credentials,
399                 [out,ref] netr_Credential *return_credentials
400                 );
401
402
403         /*****************/
404         /* Function 0x06 */
405
406         NTSTATUS netr_ServerPasswordSet(
407                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
408                 [in]  [string,charset(UTF16)] uint16 *account_name,
409                 [in]  netr_SchannelType secure_channel_type,
410                 [in]  [string,charset(UTF16)] uint16 *computer_name,
411                 [in,ref]  netr_Authenticator *credential,
412                 [out,ref] netr_Authenticator *return_authenticator,
413                 [in,ref] samr_Password *new_password
414                 );
415
416
417         /*****************/
418         /* Function 0x07 */
419
420         typedef enum netr_SamDatabaseID netr_SamDatabaseID;
421
422         typedef struct {
423                 [string,charset(UTF16)] uint16 *account_name;
424                 lsa_String unknown1;
425                 lsa_String unknown2;
426                 lsa_String unknown3;
427                 lsa_String unknown4;
428                 uint32 unknown5;
429                 uint32 unknown6;
430                 uint32 unknown7;
431                 uint32 unknown8;
432         } netr_DELTA_DELETE_USER;
433
434         typedef struct {
435                 uint16 length;
436                 [value(length)] uint16 size;
437                 uint32 flags;
438                 samr_Password pwd;
439         } netr_USER_KEY16;
440
441         typedef struct {
442                 uint16 nt_length;
443                 [value(nt_length)] uint16 nt_size;
444                 uint32 nt_flags;
445                 uint16 lm_length;
446                 [value(lm_length)] uint16 lm_size;
447                 uint32 lm_flags;
448                 uint8 nt_history[nt_length];
449                 uint8 lm_history[lm_length];
450         } netr_PasswordHistory;
451
452         typedef struct {
453                 netr_USER_KEY16 lmpassword;
454                 netr_USER_KEY16 ntpassword;
455                 netr_PasswordHistory history;
456         } netr_USER_KEYS2;
457
458         typedef struct { /* TODO: make this a union! */
459                 netr_USER_KEYS2 keys2;
460         } netr_USER_KEY_UNION;
461
462         typedef [public] struct {
463                 uint32 version;
464                 netr_USER_KEY_UNION keys;
465         } netr_USER_KEYS;
466
467         typedef struct {
468                 boolean8  SensitiveDataFlag;
469                 uint32 DataLength;
470
471                 /* netr_USER_KEYS encrypted with the session key */
472                 [size_is(DataLength)][flag(NDR_PAHEX)] uint8 *SensitiveData;
473         } netr_USER_PRIVATE_INFO;
474
475         typedef struct {
476                 lsa_String account_name;
477                 lsa_String full_name;
478                 uint32 rid;
479                 uint32 primary_gid;
480                 lsa_String home_directory;
481                 lsa_String home_drive;
482                 lsa_String logon_script;
483                 lsa_String description;
484                 lsa_String workstations;
485                 NTTIME last_logon;
486                 NTTIME last_logoff;
487                 samr_LogonHours logon_hours;
488                 uint16 bad_password_count;
489                 uint16 logon_count;
490                 NTTIME last_password_change;
491                 NTTIME acct_expiry;
492                 samr_AcctFlags acct_flags;
493                 samr_Password lmpassword;
494                 samr_Password ntpassword;
495                 boolean8 nt_password_present;
496                 boolean8 lm_password_present;
497                 boolean8 password_expired;
498                 lsa_String comment;
499                 lsa_BinaryString parameters;
500                 uint16 country_code;
501                 uint16 code_page;
502                 netr_USER_PRIVATE_INFO user_private_info;
503                 uint32 SecurityInformation;
504                 sec_desc_buf sdbuf;
505                 lsa_String profile_path;
506                 lsa_String unknown2;
507                 lsa_String unknown3;
508                 lsa_String unknown4;
509                 uint32 unknown5;
510                 uint32 unknown6;
511                 uint32 unknown7;
512                 uint32 unknown8;
513         } netr_DELTA_USER;
514
515         typedef struct {
516                 lsa_String domain_name;
517                 lsa_String oem_information; /* comment */
518                 dlong force_logoff_time;
519                 uint16 min_password_length;
520                 uint16 password_history_length;
521                 /* yes, these are signed. They are in negative 100ns */
522                 dlong  max_password_age;
523                 dlong  min_password_age;
524                 udlong sequence_num;
525                 NTTIME domain_create_time;
526                 uint32 SecurityInformation;
527                 sec_desc_buf sdbuf;
528                 lsa_BinaryString account_lockout;
529                 lsa_String unknown2;
530                 lsa_String unknown3;
531                 lsa_String unknown4;
532                 uint32 logon_to_chgpass;
533                 uint32 unknown6;
534                 uint32 unknown7;
535                 uint32 unknown8;
536         } netr_DELTA_DOMAIN;
537
538         typedef struct {
539                 lsa_String group_name;
540                 uint32 rid;
541                 uint32 attributes;
542                 lsa_String description;
543                 uint32 SecurityInformation;
544                 sec_desc_buf sdbuf;
545                 lsa_String unknown1;
546                 lsa_String unknown2;
547                 lsa_String unknown3;
548                 lsa_String unknown4;
549                 uint32 unknown5;
550                 uint32 unknown6;
551                 uint32 unknown7;
552                 uint32 unknown8;
553         } netr_DELTA_GROUP;
554
555         typedef struct {
556                 lsa_String OldName;
557                 lsa_String NewName;
558                 lsa_String unknown1;
559                 lsa_String unknown2;
560                 lsa_String unknown3;
561                 lsa_String unknown4;
562                 uint32 unknown5;
563                 uint32 unknown6;
564                 uint32 unknown7;
565                 uint32 unknown8;
566         } netr_DELTA_RENAME;
567
568         typedef struct {
569                 [size_is(num_rids)] uint32 *rids;
570                 [size_is(num_rids)] uint32 *attribs;
571                 uint32 num_rids;
572                 uint32 unknown1;
573                 uint32 unknown2;
574                 uint32 unknown3;
575                 uint32 unknown4;
576         } netr_DELTA_GROUP_MEMBER;
577
578         typedef struct {
579                 lsa_String alias_name;
580                 uint32 rid;
581                 uint32 SecurityInformation;
582                 sec_desc_buf sdbuf;
583                 lsa_String description;
584                 lsa_String unknown2;
585                 lsa_String unknown3;
586                 lsa_String unknown4;
587                 uint32 unknown5;
588                 uint32 unknown6;
589                 uint32 unknown7;
590                 uint32 unknown8;
591         } netr_DELTA_ALIAS;
592
593         typedef struct {
594                 lsa_SidArray sids;
595                 uint32 unknown1;
596                 uint32 unknown2;
597                 uint32 unknown3;
598                 uint32 unknown4;
599         } netr_DELTA_ALIAS_MEMBER;
600
601         typedef struct {
602                 uint32 pagedpoollimit;
603                 uint32 nonpagedpoollimit;
604                 uint32 minimumworkingsetsize;
605                 uint32 maximumworkingsetsize;
606                 uint32 pagefilelimit;
607                 NTTIME timelimit;
608         } netr_QUOTA_LIMITS;
609
610         typedef struct {
611                 uint32 maxlogsize;
612                 NTTIME auditretentionperiod;
613                 boolean8 auditingmode;
614                 uint32 maxauditeventcount;
615                 [size_is(maxauditeventcount+1)] uint32 *eventauditoptions;
616                 lsa_String primary_domain_name;
617                 dom_sid2 *sid;
618                 netr_QUOTA_LIMITS quota_limits;
619                 udlong sequence_num;
620                 NTTIME db_create_time;
621                 uint32 SecurityInformation;
622                 sec_desc_buf sdbuf;
623                 lsa_String unknown1;
624                 lsa_String unknown2;
625                 lsa_String unknown3;
626                 lsa_String unknown4;
627                 uint32 unknown5;
628                 uint32 unknown6;
629                 uint32 unknown7;
630                 uint32 unknown8;
631         } netr_DELTA_POLICY;
632
633         typedef struct {
634                 lsa_String domain_name;
635                 uint32 num_controllers;
636                 [size_is(num_controllers)] lsa_String *controller_names;
637                 uint32 SecurityInformation;
638                 sec_desc_buf sdbuf;
639                 lsa_String unknown1;
640                 lsa_String unknown2;
641                 lsa_String unknown3;
642                 lsa_String unknown4;
643                 uint32 posix_offset;
644                 uint32 unknown6;
645                 uint32 unknown7;
646                 uint32 unknown8;
647         } netr_DELTA_TRUSTED_DOMAIN;
648
649         typedef struct {
650                 uint32 privilege_entries;
651                 uint32 privilege_control;
652                 [size_is(privilege_entries)] uint32 *privilege_attrib;
653                 [size_is(privilege_entries)] lsa_String *privilege_name;
654                 netr_QUOTA_LIMITS quotalimits;
655                 uint32 system_flags;
656                 uint32 SecurityInformation;
657                 sec_desc_buf sdbuf;
658                 lsa_String unknown1;
659                 lsa_String unknown2;
660                 lsa_String unknown3;
661                 lsa_String unknown4;
662                 uint32 unknown5;
663                 uint32 unknown6;
664                 uint32 unknown7;
665                 uint32 unknown8;
666         } netr_DELTA_ACCOUNT;
667
668         typedef struct {
669                 uint32 len;
670                 uint32 maxlen;
671                 [size_is(maxlen)][length_is(len)] uint8 *cipher_data;
672         } netr_CIPHER_VALUE;
673
674         typedef struct {
675                 netr_CIPHER_VALUE current_cipher;
676                 NTTIME current_cipher_set_time;
677                 netr_CIPHER_VALUE old_cipher;
678                 NTTIME old_cipher_set_time;
679                 uint32 SecurityInformation;
680                 sec_desc_buf sdbuf;
681                 lsa_String unknown1;
682                 lsa_String unknown2;
683                 lsa_String unknown3;
684                 lsa_String unknown4;
685                 uint32 unknown5;
686                 uint32 unknown6;
687                 uint32 unknown7;
688                 uint32 unknown8;
689         } netr_DELTA_SECRET;
690
691         typedef enum {
692                 NETR_DELTA_DOMAIN           = 1,
693                 NETR_DELTA_GROUP            = 2,
694                 NETR_DELTA_DELETE_GROUP     = 3,
695                 NETR_DELTA_RENAME_GROUP     = 4,
696                 NETR_DELTA_USER             = 5,
697                 NETR_DELTA_DELETE_USER      = 6,
698                 NETR_DELTA_RENAME_USER      = 7,
699                 NETR_DELTA_GROUP_MEMBER     = 8,
700                 NETR_DELTA_ALIAS            = 9,
701                 NETR_DELTA_DELETE_ALIAS     = 10,
702                 NETR_DELTA_RENAME_ALIAS     = 11,
703                 NETR_DELTA_ALIAS_MEMBER     = 12,
704                 NETR_DELTA_POLICY           = 13,
705                 NETR_DELTA_TRUSTED_DOMAIN   = 14,
706                 NETR_DELTA_DELETE_TRUST     = 15,
707                 NETR_DELTA_ACCOUNT          = 16,
708                 NETR_DELTA_DELETE_ACCOUNT   = 17,
709                 NETR_DELTA_SECRET           = 18,
710                 NETR_DELTA_DELETE_SECRET    = 19,
711                 NETR_DELTA_DELETE_GROUP2    = 20,
712                 NETR_DELTA_DELETE_USER2     = 21,
713                 NETR_DELTA_MODIFY_COUNT     = 22
714         } netr_DeltaEnum;
715
716         typedef [switch_type(netr_DeltaEnum)] union {
717                 [case(NETR_DELTA_DOMAIN)]          netr_DELTA_DOMAIN          *domain;
718                 [case(NETR_DELTA_GROUP)]           netr_DELTA_GROUP           *group;
719                 [case(NETR_DELTA_DELETE_GROUP)]    ; /* rid only */
720                 [case(NETR_DELTA_RENAME_GROUP)]    netr_DELTA_RENAME          *rename_group;
721                 [case(NETR_DELTA_USER)]            netr_DELTA_USER            *user;
722                 [case(NETR_DELTA_DELETE_USER)]     ; /* rid only */
723                 [case(NETR_DELTA_RENAME_USER)]     netr_DELTA_RENAME          *rename_user;
724                 [case(NETR_DELTA_GROUP_MEMBER)]    netr_DELTA_GROUP_MEMBER    *group_member;
725                 [case(NETR_DELTA_ALIAS)]           netr_DELTA_ALIAS           *alias;
726                 [case(NETR_DELTA_DELETE_ALIAS)]    ; /* rid only */
727                 [case(NETR_DELTA_RENAME_ALIAS)]    netr_DELTA_RENAME          *rename_alias;
728                 [case(NETR_DELTA_ALIAS_MEMBER)]    netr_DELTA_ALIAS_MEMBER    *alias_member;
729                 [case(NETR_DELTA_POLICY)]          netr_DELTA_POLICY          *policy;
730                 [case(NETR_DELTA_TRUSTED_DOMAIN)]  netr_DELTA_TRUSTED_DOMAIN  *trusted_domain;
731                 [case(NETR_DELTA_DELETE_TRUST)]    ; /* sid only */
732                 [case(NETR_DELTA_ACCOUNT)]         netr_DELTA_ACCOUNT         *account;
733                 [case(NETR_DELTA_DELETE_ACCOUNT)]  ; /* sid only */
734                 [case(NETR_DELTA_SECRET)]          netr_DELTA_SECRET          *secret;
735                 [case(NETR_DELTA_DELETE_SECRET)]   ; /* name only */
736                 [case(NETR_DELTA_DELETE_GROUP2)]   netr_DELTA_DELETE_USER     *delete_group;
737                 [case(NETR_DELTA_DELETE_USER2)]    netr_DELTA_DELETE_USER     *delete_user;
738                 [case(NETR_DELTA_MODIFY_COUNT)]    udlong                     *modified_count;
739                 [default];
740         } netr_DELTA_UNION;
741
742         typedef [switch_type(netr_DeltaEnum)] union {
743                 [case(NETR_DELTA_DOMAIN)]          uint32 rid;
744                 [case(NETR_DELTA_GROUP)]           uint32 rid;
745                 [case(NETR_DELTA_DELETE_GROUP)]    uint32 rid;
746                 [case(NETR_DELTA_RENAME_GROUP)]    uint32 rid;
747                 [case(NETR_DELTA_USER)]            uint32 rid;
748                 [case(NETR_DELTA_DELETE_USER)]     uint32 rid;
749                 [case(NETR_DELTA_RENAME_USER)]     uint32 rid;
750                 [case(NETR_DELTA_GROUP_MEMBER)]    uint32 rid;
751                 [case(NETR_DELTA_ALIAS)]           uint32 rid;
752                 [case(NETR_DELTA_DELETE_ALIAS)]    uint32 rid;
753                 [case(NETR_DELTA_RENAME_ALIAS)]    uint32 rid;
754                 [case(NETR_DELTA_ALIAS_MEMBER)]    uint32 rid;
755                 [case(NETR_DELTA_POLICY)]          dom_sid2 *sid;
756                 [case(NETR_DELTA_TRUSTED_DOMAIN)]  dom_sid2 *sid;
757                 [case(NETR_DELTA_DELETE_TRUST)]    dom_sid2 *sid;
758                 [case(NETR_DELTA_ACCOUNT)]         dom_sid2 *sid;
759                 [case(NETR_DELTA_DELETE_ACCOUNT)]  dom_sid2 *sid;
760                 [case(NETR_DELTA_SECRET)]          [string,charset(UTF16)] uint16 *name;
761                 [case(NETR_DELTA_DELETE_SECRET)]   [string,charset(UTF16)] uint16 *name;
762                 [case(NETR_DELTA_DELETE_GROUP2)]   uint32 rid;
763                 [case(NETR_DELTA_DELETE_USER2)]    uint32 rid;
764                 [case(NETR_DELTA_MODIFY_COUNT)]    ;
765                 [default];
766         } netr_DELTA_ID_UNION;
767
768         typedef struct {
769                 netr_DeltaEnum delta_type;
770                 [switch_is(delta_type)] netr_DELTA_ID_UNION delta_id_union;
771                 [switch_is(delta_type)] netr_DELTA_UNION delta_union;
772         } netr_DELTA_ENUM;
773
774         typedef struct {
775                 uint32 num_deltas;
776                 [size_is(num_deltas)] netr_DELTA_ENUM *delta_enum;
777         } netr_DELTA_ENUM_ARRAY;
778
779         NTSTATUS netr_DatabaseDeltas(
780                 [in]      [string,charset(UTF16)] uint16 *logon_server,
781                 [in]      [string,charset(UTF16)] uint16 *computername,
782                 [in,ref]  netr_Authenticator *credential,
783                 [in,out,ref]  netr_Authenticator *return_authenticator,
784                 [in]      netr_SamDatabaseID database_id,
785                 [in,out,ref]  udlong *sequence_num,
786                 [out,ref]     netr_DELTA_ENUM_ARRAY **delta_enum_array,
787                 [in]      uint32 preferredmaximumlength
788                 );
789
790
791         /*****************/
792         /* Function 0x08 */
793
794         NTSTATUS netr_DatabaseSync(
795                 [in]     [string,charset(UTF16)] uint16 *logon_server,
796                 [in]     [string,charset(UTF16)] uint16 *computername,
797                 [in,ref] netr_Authenticator *credential,
798                 [in,out,ref] netr_Authenticator *return_authenticator,
799                 [in]     netr_SamDatabaseID database_id,
800                 [in,out,ref] uint32 *sync_context,
801                 [out,ref]    netr_DELTA_ENUM_ARRAY **delta_enum_array,
802                 [in]     uint32 preferredmaximumlength
803                 );
804
805
806         /*****************/
807         /* Function 0x09 */
808
809         /* w2k3 returns NT_STATUS_NOT_IMPLEMENTED for this call */
810
811         typedef [flag(NDR_PAHEX)] struct {
812                 uint8 computer_name[16];
813                 uint32 timecreated;
814                 uint32 serial_number;
815         } netr_UAS_INFO_0;
816
817         typedef struct {
818                 [flag(NDR_REMAINING)] DATA_BLOB blob;
819         } netr_AccountBuffer;
820
821         NTSTATUS netr_AccountDeltas(
822                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
823                 [in]     [string,charset(UTF16)] uint16 *computername,
824                 [in]     netr_Authenticator credential,
825                 [in,out,ref] netr_Authenticator *return_authenticator,
826                 [in]     netr_UAS_INFO_0 uas,
827                 [in]     uint32 count,
828                 [in]     uint32 level,
829                 [in]     uint32 buffersize,
830                 [out,ref,subcontext(4)] netr_AccountBuffer *buffer,
831                 [out,ref]    uint32 *count_returned,
832                 [out,ref]    uint32 *total_entries,
833                 [out,ref]    netr_UAS_INFO_0 *recordid
834                 );
835
836
837         /*****************/
838         /* Function 0x0A */
839
840         NTSTATUS netr_AccountSync(
841                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
842                 [in]      [string,charset(UTF16)] uint16 *computername,
843                 [in]      netr_Authenticator credential,
844                 [in,out,ref]  netr_Authenticator *return_authenticator,
845                 [in]      uint32 reference,
846                 [in]      uint32 level,
847                 [in]      uint32 buffersize,
848                 [out,ref,subcontext(4)] netr_AccountBuffer *buffer,
849                 [out,ref]     uint32 *count_returned,
850                 [out,ref]     uint32 *total_entries,
851                 [out,ref]     uint32 *next_reference,
852                 [in,out,ref]  netr_UAS_INFO_0 *recordid
853                 );
854
855
856         /*****************/
857         /* Function 0x0B */
858
859         WERROR netr_GetDcName(
860                 [in]  [string,charset(UTF16)] uint16 *logon_server,
861                 [in,unique] [string,charset(UTF16)] uint16 *domainname,
862                 [out,ref] [string,charset(UTF16)] uint16 **dcname
863                 );
864
865         /*****************/
866         /* Function 0x0C */
867
868         typedef [bitmap32bit] bitmap {
869                 NETLOGON_REPLICATION_NEEDED             = 0x00000001,
870                 NETLOGON_REPLICATION_IN_PROGRESS        = 0x00000002,
871                 NETLOGON_FULL_SYNC_REPLICATION          = 0x00000004,
872                 NETLOGON_REDO_NEEDED                    = 0x00000008,
873                 NETLOGON_HAS_IP                         = 0x00000010,
874                 NETLOGON_HAS_TIMESERV                   = 0x00000020,
875                 NETLOGON_DNS_UPDATE_FAILURE             = 0x00000040,
876                 NETLOGON_VERIFY_STATUS_RETURNED         = 0x00000080
877         } netr_InfoFlags;
878
879         typedef struct {
880                 netr_InfoFlags flags;
881                 WERROR pdc_connection_status;
882         } netr_NETLOGON_INFO_1;
883
884         typedef struct {
885                 netr_InfoFlags flags;
886                 WERROR pdc_connection_status;
887                 [string,charset(UTF16)] uint16 *trusted_dc_name;
888                 WERROR tc_connection_status;
889         } netr_NETLOGON_INFO_2;
890
891         typedef struct {
892                 netr_InfoFlags flags;
893                 uint32 logon_attempts;
894                 uint32 unknown1;
895                 uint32 unknown2;
896                 uint32 unknown3;
897                 uint32 unknown4;
898                 uint32 unknown5;
899         } netr_NETLOGON_INFO_3;
900
901         typedef struct {
902                 [string,charset(UTF16)] uint16 *trusted_dc_name;
903                 [string,charset(UTF16)] uint16 *trusted_domain_name;
904         } netr_NETLOGON_INFO_4;
905
906         typedef [public] union {
907                 [case(1)]  netr_NETLOGON_INFO_1 *info1;
908                 [case(2)]  netr_NETLOGON_INFO_2 *info2;
909                 [case(3)]  netr_NETLOGON_INFO_3 *info3;
910                 [case(4)]  netr_NETLOGON_INFO_4 *info4;
911                 [default] ;
912         } netr_CONTROL_QUERY_INFORMATION;
913
914         /* function_code values */
915         typedef [v1_enum,public] enum {
916                 NETLOGON_CONTROL_QUERY                  = 0x00000001,
917                 NETLOGON_CONTROL_REPLICATE              = 0x00000002,
918                 NETLOGON_CONTROL_SYNCHRONIZE            = 0x00000003,
919                 NETLOGON_CONTROL_PDC_REPLICATE          = 0x00000004,
920                 NETLOGON_CONTROL_REDISCOVER             = 0x00000005,
921                 NETLOGON_CONTROL_TC_QUERY               = 0x00000006,
922                 NETLOGON_CONTROL_TRANSPORT_NOTIFY       = 0x00000007,
923                 NETLOGON_CONTROL_FIND_USER              = 0x00000008,
924                 NETLOGON_CONTROL_CHANGE_PASSWORD        = 0x00000009,
925                 NETLOGON_CONTROL_TC_VERIFY              = 0x0000000A,
926                 NETLOGON_CONTROL_FORCE_DNS_REG          = 0x0000000B,
927                 NETLOGON_CONTROL_QUERY_DNS_REG          = 0x0000000C,
928                 NETLOGON_CONTROL_BACKUP_CHANGE_LOG      = 0x0000FFFC,
929                 NETLOGON_CONTROL_TRUNCATE_LOG           = 0x0000FFFD,
930                 NETLOGON_CONTROL_SET_DBFLAG             = 0x0000FFFE,
931                 NETLOGON_CONTROL_BREAKPOINT             = 0x0000FFFF
932         } netr_LogonControlCode;
933
934         WERROR netr_LogonControl(
935                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
936                 [in]   netr_LogonControlCode function_code,
937                 [in]   uint32 level,
938                 [out,ref,switch_is(level)] netr_CONTROL_QUERY_INFORMATION *query
939                 );
940
941
942         /*****************/
943         /* Function 0x0D */
944
945         WERROR netr_GetAnyDCName(
946                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
947                 [in,unique] [string,charset(UTF16)] uint16 *domainname,
948                 [out,ref] [string,charset(UTF16)] uint16 **dcname
949                 );
950
951
952         /*****************/
953         /* Function 0x0E */
954
955         typedef [public,switch_type(netr_LogonControlCode)] union {
956                 [case(NETLOGON_CONTROL_REDISCOVER)]        [string,charset(UTF16)] uint16 *domain;
957                 [case(NETLOGON_CONTROL_TC_QUERY)]          [string,charset(UTF16)] uint16 *domain;
958                 [case(NETLOGON_CONTROL_TRANSPORT_NOTIFY)]  [string,charset(UTF16)] uint16 *domain;
959                 [case(NETLOGON_CONTROL_CHANGE_PASSWORD)]   [string,charset(UTF16)] uint16 *domain;
960                 [case(NETLOGON_CONTROL_TC_VERIFY)]         [string,charset(UTF16)] uint16 *domain;
961                 [case(NETLOGON_CONTROL_FIND_USER)]         [string,charset(UTF16)] uint16 *user;
962                 [case(NETLOGON_CONTROL_SET_DBFLAG)]        uint32 debug_level;
963                 [default] ;
964         } netr_CONTROL_DATA_INFORMATION;
965
966         WERROR netr_LogonControl2(
967                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
968                 [in]    netr_LogonControlCode function_code,
969                 [in]    uint32 level,
970                 [in,ref][switch_is(function_code)] netr_CONTROL_DATA_INFORMATION  *data,
971                 [out,ref][switch_is(level)]        netr_CONTROL_QUERY_INFORMATION *query
972                 );
973
974
975         /* If NETLOGON_NEG_ARCFOUR flag is not set, then the passwords and LM
976          * session keys are encrypted with DES calls.  (And the user session key
977          * is unencrypted) */
978
979         /*****************/
980         /* Function 0x0F */
981
982         typedef [public,bitmap32bit] bitmap {
983                 NETLOGON_NEG_ACCOUNT_LOCKOUT            = 0x00000001,
984                 NETLOGON_NEG_PERSISTENT_SAMREPL         = 0x00000002,
985                 NETLOGON_NEG_ARCFOUR                    = 0x00000004,
986                 NETLOGON_NEG_PROMOTION_COUNT            = 0x00000008,
987                 NETLOGON_NEG_CHANGELOG_BDC              = 0x00000010,
988                 NETLOGON_NEG_FULL_SYNC_REPL             = 0x00000020,
989                 NETLOGON_NEG_MULTIPLE_SIDS              = 0x00000040,
990                 NETLOGON_NEG_REDO                       = 0x00000080,
991                 NETLOGON_NEG_PASSWORD_CHANGE_REFUSAL    = 0x00000100,
992                 NETLOGON_NEG_SEND_PASSWORD_INFO_PDC     = 0x00000200,
993                 NETLOGON_NEG_GENERIC_PASSTHROUGH        = 0x00000400,
994                 NETLOGON_NEG_CONCURRENT_RPC             = 0x00000800,
995                 NETLOGON_NEG_AVOID_ACCOUNT_DB_REPL      = 0x00001000,
996                 NETLOGON_NEG_AVOID_SECURITYAUTH_DB_REPL = 0x00002000,
997                 NETLOGON_NEG_STRONG_KEYS                = 0x00004000,
998                 NETLOGON_NEG_TRANSITIVE_TRUSTS          = 0x00008000,
999                 NETLOGON_NEG_DNS_DOMAIN_TRUSTS          = 0x00010000,
1000                 NETLOGON_NEG_PASSWORD_SET2              = 0x00020000,
1001                 NETLOGON_NEG_GETDOMAININFO              = 0x00040000,
1002                 NETLOGON_NEG_CROSS_FOREST_TRUSTS        = 0x00080000,
1003                 NETLOGON_NEG_NEUTRALIZE_NT4_EMULATION   = 0x00100000,
1004                 NETLOGON_NEG_RODC_PASSTHROUGH           = 0x00200000,
1005                 NETLOGON_NEG_SUPPORTS_AES_SHA2          = 0x00400000,
1006                 NETLOGON_NEG_SUPPORTS_AES               = 0x01000000,
1007                 NETLOGON_NEG_AUTHENTICATED_RPC_LSASS    = 0x20000000,
1008                 NETLOGON_NEG_AUTHENTICATED_RPC          = 0x40000000
1009         } netr_NegotiateFlags;
1010
1011         const uint32 NETLOGON_NEG_128BIT = NETLOGON_NEG_STRONG_KEYS;
1012         const uint32 NETLOGON_NEG_SCHANNEL = NETLOGON_NEG_AUTHENTICATED_RPC;
1013
1014         NTSTATUS netr_ServerAuthenticate2(
1015                 [in,unique]  [string,charset(UTF16)] uint16 *server_name,
1016                 [in]         [string,charset(UTF16)] uint16 *account_name,
1017                 [in]         netr_SchannelType secure_channel_type,
1018                 [in]         [string,charset(UTF16)] uint16 *computer_name,
1019                 [in,ref]     netr_Credential *credentials,
1020                 [out,ref]    netr_Credential *return_credentials,
1021                 [in,out,ref] netr_NegotiateFlags *negotiate_flags
1022                 );
1023
1024
1025         /*****************/
1026         /* Function 0x10 */
1027
1028         typedef enum {
1029                 SYNCSTATE_NORMAL_STATE             = 0,
1030                 SYNCSTATE_DOMAIN_STATE             = 1,
1031                 SYNCSTATE_GROUP_STATE              = 2,
1032                 SYNCSTATE_UAS_BUILT_IN_GROUP_STATE = 3,
1033                 SYNCSTATE_USER_STATE               = 4,
1034                 SYNCSTATE_GROUP_MEMBER_STATE       = 5,
1035                 SYNCSTATE_ALIAS_STATE              = 6,
1036                 SYNCSTATE_ALIAS_MEMBER_STATE       = 7,
1037                 SYNCSTATE_SAM_DONE_STATE           = 8
1038         } SyncStateEnum;
1039
1040         NTSTATUS netr_DatabaseSync2(
1041                 [in]     [string,charset(UTF16)] uint16 *logon_server,
1042                 [in]     [string,charset(UTF16)] uint16 *computername,
1043                 [in,ref] netr_Authenticator *credential,
1044                 [in,out,ref] netr_Authenticator *return_authenticator,
1045                 [in]     netr_SamDatabaseID database_id,
1046                 [in]     SyncStateEnum restart_state,
1047                 [in,out,ref] uint32 *sync_context,
1048                 [out,ref]    netr_DELTA_ENUM_ARRAY **delta_enum_array,
1049                 [in]     uint32 preferredmaximumlength
1050                 );
1051
1052
1053         /*****************/
1054         /* Function 0x11 */
1055
1056         /* i'm not at all sure how this call works */
1057
1058         typedef [bitmap16bit] bitmap {
1059                 NETR_CHANGELOG_IMMEDIATE_REPL_REQUIRED  = 0x0001,
1060                 NETR_CHANGELOG_CHANGED_PASSWORD         = 0x0002,
1061                 NETR_CHANGELOG_SID_INCLUDED             = 0x0004,
1062                 NETR_CHANGELOG_NAME_INCLUDED            = 0x0008,
1063                 NETR_CHANGELOG_FIRST_PROMOTION_OBJ      = 0x0010
1064         } netr_ChangeLogFlags;
1065
1066         typedef [nodiscriminant] union {
1067                 [case(NETR_CHANGELOG_SID_INCLUDED)] dom_sid object_sid;
1068                 [case(NETR_CHANGELOG_NAME_INCLUDED)] nstring object_name;
1069                 [default];
1070         } netr_ChangeLogObject;
1071
1072         typedef [public,gensize] struct {
1073                 uint32 serial_number1;
1074                 uint32 serial_number2;
1075                 uint32 object_rid;
1076                 netr_ChangeLogFlags flags;
1077                 netr_SamDatabaseID8Bit db_index;
1078                 netr_DeltaEnum8Bit delta_type;
1079                 [switch_is(flags & (NETR_CHANGELOG_SID_INCLUDED|NETR_CHANGELOG_NAME_INCLUDED))] netr_ChangeLogObject object;
1080         } netr_ChangeLogEntry;
1081
1082         NTSTATUS netr_DatabaseRedo(
1083                 [in]     [string,charset(UTF16)] uint16 *logon_server,
1084                 [in]     [string,charset(UTF16)] uint16 *computername,
1085                 [in]     netr_Authenticator *credential,
1086                 [in,out,ref] netr_Authenticator *return_authenticator,
1087                 /*
1088                  * we cannot use subcontext_size() here, as
1089                  * change_log_entry_size is encoded after the subcontext
1090                  */
1091                 [in]     [subcontext(4)/*,subcontext_size(change_log_entry_size)*/]
1092                         netr_ChangeLogEntry change_log_entry,
1093                 [in]     [value(ndr_size_netr_ChangeLogEntry(&change_log_entry,
1094                                 ndr->flags))]
1095                         uint32 change_log_entry_size,
1096                 [out,ref]    netr_DELTA_ENUM_ARRAY **delta_enum_array
1097                 );
1098
1099
1100         /*****************/
1101         /* Function 0x12 */
1102
1103         WERROR netr_LogonControl2Ex(
1104                 [in,unique] [string,charset(UTF16)] uint16 *logon_server,
1105                 [in]   netr_LogonControlCode function_code,
1106                 [in]   uint32 level,
1107                 [in,ref][switch_is(function_code)] netr_CONTROL_DATA_INFORMATION  *data,
1108                 [out,ref][switch_is(level)] netr_CONTROL_QUERY_INFORMATION *query
1109                 );
1110
1111         /*****************/
1112         /* Function 0x13 */
1113         typedef struct {
1114                 uint32 length;
1115                 [size_is(length)] uint8 *data;
1116         } netr_Blob;
1117
1118         NTSTATUS netr_NetrEnumerateTrustedDomains(
1119                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1120                 [out,ref] netr_Blob *trusted_domains_blob
1121                 );
1122
1123         /*****************/
1124         /* Function 0x14 */
1125
1126         /* one unkown bit still: DS_IP_VERSION_AGNOSTIC - gd*/
1127
1128         const int DSGETDC_VALID_FLAGS = (DS_FORCE_REDISCOVERY |
1129                                          DS_DIRECTORY_SERVICE_REQUIRED |
1130                                          DS_DIRECTORY_SERVICE_PREFERRED |
1131                                          DS_GC_SERVER_REQUIRED |
1132                                          DS_PDC_REQUIRED |
1133                                          DS_BACKGROUND_ONLY |
1134                                          DS_IP_REQUIRED |
1135                                          DS_KDC_REQUIRED |
1136                                          DS_TIMESERV_REQUIRED |
1137                                          DS_WRITABLE_REQUIRED |
1138                                          DS_GOOD_TIMESERV_PREFERRED |
1139                                          DS_AVOID_SELF |
1140                                          DS_ONLY_LDAP_NEEDED |
1141                                          DS_IS_FLAT_NAME |
1142                                          DS_IS_DNS_NAME |
1143                                          DS_TRY_NEXTCLOSEST_SITE |
1144                                          DS_DIRECTORY_SERVICE_6_REQUIRED |
1145                                          DS_WEB_SERVICE_REQUIRED |
1146                                          DS_RETURN_FLAT_NAME |
1147                                          DS_RETURN_DNS_NAME);
1148
1149         typedef [bitmap32bit] bitmap {
1150                 DS_FORCE_REDISCOVERY            = 0x00000001,
1151                 DS_DIRECTORY_SERVICE_REQUIRED   = 0x00000010,
1152                 DS_DIRECTORY_SERVICE_PREFERRED  = 0x00000020,
1153                 DS_GC_SERVER_REQUIRED           = 0x00000040,
1154                 DS_PDC_REQUIRED                 = 0x00000080,
1155                 DS_BACKGROUND_ONLY              = 0x00000100,
1156                 DS_IP_REQUIRED                  = 0x00000200,
1157                 DS_KDC_REQUIRED                 = 0x00000400,
1158                 DS_TIMESERV_REQUIRED            = 0x00000800,
1159                 DS_WRITABLE_REQUIRED            = 0x00001000,
1160                 DS_GOOD_TIMESERV_PREFERRED      = 0x00002000,
1161                 DS_AVOID_SELF                   = 0x00004000,
1162                 DS_ONLY_LDAP_NEEDED             = 0x00008000,
1163                 DS_IS_FLAT_NAME                 = 0x00010000,
1164                 DS_IS_DNS_NAME                  = 0x00020000,
1165                 DS_TRY_NEXTCLOSEST_SITE         = 0x00040000,
1166                 DS_DIRECTORY_SERVICE_6_REQUIRED = 0x00080000,
1167                 DS_WEB_SERVICE_REQUIRED         = 0x00100000,
1168                 DS_RETURN_DNS_NAME              = 0x40000000,
1169                 DS_RETURN_FLAT_NAME             = 0x80000000
1170         } netr_DsRGetDCName_flags;
1171
1172         typedef [v1_enum] enum {
1173                 DS_ADDRESS_TYPE_INET            = 1,
1174                 DS_ADDRESS_TYPE_NETBIOS         = 2
1175         } netr_DsRGetDCNameInfo_AddressType;
1176
1177         typedef [bitmap32bit] bitmap {
1178                 DS_SERVER_PDC                    = 0x00000001,
1179                 DS_SERVER_GC                     = 0x00000004,
1180                 DS_SERVER_LDAP                   = 0x00000008,
1181                 DS_SERVER_DS                     = 0x00000010,
1182                 DS_SERVER_KDC                    = 0x00000020,
1183                 DS_SERVER_TIMESERV               = 0x00000040,
1184                 DS_SERVER_CLOSEST                = 0x00000080,
1185                 DS_SERVER_WRITABLE               = 0x00000100,
1186                 DS_SERVER_GOOD_TIMESERV          = 0x00000200,
1187                 DS_SERVER_NDNC                   = 0x00000400,
1188                 DS_SERVER_SELECT_SECRET_DOMAIN_6 = 0x00000800,
1189                 DS_SERVER_FULL_SECRET_DOMAIN_6   = 0x00001000,
1190                 DS_SERVER_WEBSERV                = 0x00002000,
1191                 DS_SERVER_DS_8                   = 0x00004000,
1192                 DS_DNS_CONTROLLER                = 0x20000000,
1193                 DS_DNS_DOMAIN                    = 0x40000000,
1194                 DS_DNS_FOREST_ROOT               = 0x80000000
1195         } netr_DsR_DcFlags;
1196
1197         typedef [public] struct {
1198                 [string,charset(UTF16)] uint16 *dc_unc;
1199                 [string,charset(UTF16)] uint16 *dc_address;
1200                 netr_DsRGetDCNameInfo_AddressType dc_address_type;
1201                 GUID domain_guid;
1202                 [string,charset(UTF16)] uint16 *domain_name;
1203                 [string,charset(UTF16)] uint16 *forest_name;
1204                 netr_DsR_DcFlags dc_flags;
1205                 [string,charset(UTF16)] uint16 *dc_site_name;
1206                 [string,charset(UTF16)] uint16 *client_site_name;
1207         } netr_DsRGetDCNameInfo;
1208
1209         WERROR netr_DsRGetDCName(
1210                 [in,unique] [string,charset(UTF16)] uint16 *server_unc,
1211                 [in,unique] [string,charset(UTF16)] uint16 *domain_name,
1212                 [in,unique] GUID *domain_guid,
1213                 [in,unique] GUID *site_guid,
1214                 [in] netr_DsRGetDCName_flags flags,
1215                 [out,ref] netr_DsRGetDCNameInfo **info
1216                 );
1217
1218         /*****************/
1219         /* Function 0x15 */
1220         typedef [switch_type(uint32)] union {
1221                 [case(1)] netr_NegotiateFlags server_capabilities;
1222         } netr_Capabilities;
1223
1224         NTSTATUS netr_LogonGetCapabilities(
1225                 [in]         [string,charset(UTF16)] uint16 *server_name,
1226                 [in,unique]  [string,charset(UTF16)] uint16 *computer_name,
1227                 [in,ref]     netr_Authenticator *credential,
1228                 [in,out,ref] netr_Authenticator *return_authenticator,
1229                 [in]         uint32 query_level,
1230                 [out,ref,switch_is(query_level)] netr_Capabilities *capabilities
1231                 );
1232
1233         /****************/
1234         /* Function 0x16 */
1235         [todo] WERROR netr_NETRLOGONSETSERVICEBITS();
1236
1237         /****************/
1238         /* Function 0x17 */
1239         WERROR netr_LogonGetTrustRid(
1240                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1241                 [in,unique] [string,charset(UTF16)] uint16 *domain_name,
1242                 [out,ref] uint32 *rid
1243         );
1244
1245         /****************/
1246         /* Function 0x18 */
1247         [todo] WERROR netr_NETRLOGONCOMPUTESERVERDIGEST();
1248
1249         /****************/
1250         /* Function 0x19 */
1251         [todo] WERROR netr_NETRLOGONCOMPUTECLIENTDIGEST();
1252
1253         /****************/
1254         /* Function 0x1a */
1255         [public] NTSTATUS netr_ServerAuthenticate3(
1256                 [in,unique]  [string,charset(UTF16)] uint16 *server_name,
1257                 [in]         [string,charset(UTF16)] uint16 *account_name,
1258                 [in]         netr_SchannelType secure_channel_type,
1259                 [in]         [string,charset(UTF16)] uint16 *computer_name,
1260                 [in,ref]     netr_Credential *credentials,
1261                 [out,ref]    netr_Credential *return_credentials,
1262                 [in,out,ref] netr_NegotiateFlags *negotiate_flags,
1263                 [out,ref]    uint32 *rid
1264                 );
1265
1266         /****************/
1267         /* Function 0x1b */
1268
1269         WERROR netr_DsRGetDCNameEx(
1270                 [in,unique] [string,charset(UTF16)] uint16 *server_unc,
1271                 [in,unique] [string,charset(UTF16)] uint16 *domain_name,
1272                 [in,unique] GUID *domain_guid,
1273                 [in,unique] [string,charset(UTF16)] uint16 *site_name,
1274                 [in] netr_DsRGetDCName_flags flags,
1275                 [out,ref] netr_DsRGetDCNameInfo **info
1276                 );
1277
1278
1279         /****************/
1280         /* Function 0x1c */
1281         WERROR netr_DsRGetSiteName(
1282                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
1283                 [out,ref] [string,charset(UTF16)] uint16 **site
1284                 );
1285
1286         /****************/
1287         /* Function 0x1d */
1288         typedef [public,bitmap32bit] bitmap {
1289                 NETR_TRUST_FLAG_IN_FOREST = 0x00000001,
1290                 NETR_TRUST_FLAG_OUTBOUND  = 0x00000002,
1291                 NETR_TRUST_FLAG_TREEROOT  = 0x00000004,
1292                 NETR_TRUST_FLAG_PRIMARY   = 0x00000008,
1293                 NETR_TRUST_FLAG_NATIVE    = 0x00000010,
1294                 NETR_TRUST_FLAG_INBOUND   = 0x00000020,
1295                 NETR_TRUST_FLAG_MIT_KRB5  = 0x00000080,
1296                 NETR_TRUST_FLAG_AES       = 0x00000100
1297         } netr_TrustFlags;
1298
1299         typedef [bitmap32bit] bitmap {
1300                 NETR_WS_FLAG_HANDLES_INBOUND_TRUSTS = 0x00000001,
1301                 NETR_WS_FLAG_HANDLES_SPN_UPDATE     = 0x00000002
1302         } netr_WorkstationFlags;
1303
1304         typedef [bitmap16bit] bitmap {
1305                 NETR_VER_SUITE_BACKOFFICE               = 0x0004,
1306                 NETR_VER_SUITE_BLADE                    = 0x0400,
1307                 NETR_VER_SUITE_COMPUTE_SERVER           = 0x4000,
1308                 NETR_VER_SUITE_DATACENTER               = 0x0080,
1309                 NETR_VER_SUITE_ENTERPRISE               = 0x0002,
1310                 NETR_VER_SUITE_EMBEDDEDNT               = 0x0040,
1311                 NETR_VER_SUITE_PERSONAL                 = 0x0200,
1312                 NETR_VER_SUITE_SINGLEUSERTS             = 0x0100,
1313                 NETR_VER_SUITE_SMALLBUSINESS            = 0x0001,
1314                 NETR_VER_SUITE_SMALLBUSINESS_RESTRICTED = 0x0020,
1315                 NETR_VER_SUITE_STORAGE_SERVER           = 0x2000,
1316                 NETR_VER_SUITE_TERMINAL                 = 0x0010,
1317                 NETR_VER_SUITE_WH_SERVER                = 0x8000
1318         } netr_SuiteMask;
1319
1320         typedef [bitmap8bit] bitmap {
1321                 NETR_VER_NT_DOMAIN_CONTROLLER   = 0x02,
1322                 NETR_VER_NT_SERVER              = 0x03,
1323                 NETR_VER_NT_WORKSTATION         = 0x01
1324         } netr_ProductType;
1325
1326         typedef struct {
1327                 uint32 policy_size;
1328                 [size_is(policy_size)] uint8 *policy;
1329         } netr_LsaPolicyInformation;
1330
1331         typedef struct {
1332                 [value(284)] uint32 OSVersionInfoSize;
1333                 uint32 MajorVersion;
1334                 uint32 MinorVersion;
1335                 uint32 BuildNumber;
1336                 uint32 PlatformId;
1337                 [subcontext(0),subcontext_size(256)] nstring CSDVersion;
1338                 uint16 ServicePackMajor;
1339                 uint16 ServicePackMinor;
1340                 netr_SuiteMask SuiteMask;
1341                 netr_ProductType ProductType;
1342                 uint8 Reserved;
1343         } netr_OsVersionInfoEx;
1344
1345         typedef struct {
1346                 /* these first 3 values come from the fact windows
1347                    actually encodes this structure as a UNICODE_STRING
1348                    - see MS-NRPC section 2.2.1.3.9 */
1349                 /* 142 * 2 = 284 (length of structure "netr_OsVersionInfoEx") */
1350                 [value(142)] uint3264 length;
1351                 [value(0)] uint3264 dummy;
1352                 [value(142)] uint3264 size;
1353                 [subcontext(0),subcontext_size(size*2)]
1354                 netr_OsVersionInfoEx os;
1355         } netr_OsVersion;
1356
1357         typedef struct {
1358                 /* value is 284 when info != os, otherwise 0 (for length and
1359                    size) */
1360                 [value(os == NULL ? 0 : 284)] uint16 length;
1361                 [value(os == NULL ? 0 : 284)] uint16 size;
1362                 netr_OsVersion *os;
1363         } netr_OsVersionContainer;
1364
1365         typedef struct {
1366                 netr_LsaPolicyInformation lsa_policy;
1367                 [string,charset(UTF16)] uint16 *dns_hostname;
1368                 [string,charset(UTF16)] uint16 *sitename;
1369                 [string,charset(UTF16)] uint16 *dummy1;
1370                 [string,charset(UTF16)] uint16 *dummy2;
1371                 [string,charset(UTF16)] uint16 *dummy3;
1372                 [string,charset(UTF16)] uint16 *dummy4;
1373                 netr_OsVersionContainer os_version;
1374                 lsa_String os_name;
1375                 lsa_String dummy_string3;
1376                 lsa_String dummy_string4;
1377                 netr_WorkstationFlags workstation_flags;
1378                 kerb_EncTypes supported_enc_types;
1379                 uint32 dummy_long3;
1380                 uint32 dummy_long4;
1381         } netr_WorkstationInformation;
1382
1383         typedef union {
1384                 [case(1)] netr_WorkstationInformation *workstation_info;
1385                 [case(2)] netr_WorkstationInformation *lsa_policy_info;
1386         } netr_WorkstationInfo;
1387
1388         typedef struct {
1389                 netr_TrustFlags flags;
1390                 uint32 parent_index;
1391                 lsa_TrustType trust_type;
1392                 lsa_TrustAttributes trust_attributes;
1393         } netr_trust_extension_info;
1394
1395         typedef struct {
1396                 /* these first 3 values come from the fact windows
1397                    actually encodes this structure as a UNICODE_STRING
1398                    - see MS-NRPC section 2.2.1.3.9 */
1399                 [value(8)] uint3264 length;
1400                 [value(0)] uint3264 dummy;
1401                 [value(8)] uint3264 size;
1402                 [subcontext(0),subcontext_size(size*2)]
1403                 netr_trust_extension_info info;
1404         } netr_trust_extension;
1405
1406         typedef struct {
1407                 /* value is 16 when info != NULL, otherwise 0 */
1408                 [value(info == NULL ? 0 : 16)] uint16 length;
1409                 [value(info == NULL ? 0 : 16)] uint16 size;
1410                 netr_trust_extension *info;
1411         } netr_trust_extension_container;
1412
1413         typedef struct {
1414                 lsa_StringLarge domainname;
1415                 lsa_StringLarge dns_domainname;
1416                 lsa_StringLarge dns_forestname;
1417                 GUID domain_guid;
1418                 dom_sid2 *domain_sid;
1419                 netr_trust_extension_container trust_extension;
1420                 lsa_StringLarge dummy_string2;
1421                 lsa_StringLarge dummy_string3;
1422                 lsa_StringLarge dummy_string4;
1423                 uint32 dummy_long1;
1424                 uint32 dummy_long2;
1425                 uint32 dummy_long3;
1426                 uint32 dummy_long4;
1427         } netr_OneDomainInfo;
1428
1429         typedef struct {
1430                 netr_OneDomainInfo primary_domain;
1431                 uint32 trusted_domain_count;
1432                 [size_is(trusted_domain_count)] netr_OneDomainInfo *trusted_domains;
1433                 netr_LsaPolicyInformation lsa_policy;
1434                 lsa_StringLarge dns_hostname;
1435                 lsa_StringLarge dummy_string2;
1436                 lsa_StringLarge dummy_string3;
1437                 lsa_StringLarge dummy_string4;
1438                 netr_WorkstationFlags workstation_flags;
1439                 kerb_EncTypes supported_enc_types;
1440                 uint32 dummy_long3;
1441                 uint32 dummy_long4;
1442         } netr_DomainInformation;
1443
1444         typedef union {
1445                 [case(1)] netr_DomainInformation *domain_info;
1446                 [case(2)] netr_LsaPolicyInformation *lsa_policy_info;
1447         } netr_DomainInfo;
1448         
1449         [public] NTSTATUS netr_LogonGetDomainInfo(
1450                 [in]         [string,charset(UTF16)] uint16 *server_name,
1451                 [in,unique]  [string,charset(UTF16)] uint16 *computer_name,
1452                 [in,ref]     netr_Authenticator *credential,
1453                 [in,out,ref] netr_Authenticator *return_authenticator,
1454                 [in]         uint32 level,
1455                 [in,ref,switch_is(level)] netr_WorkstationInfo *query,
1456                 [out,ref,switch_is(level)] netr_DomainInfo *info
1457                 );
1458
1459         /*****************/
1460         /* Function 0x1e */
1461
1462         /* [MS-NRPC] 2.2.1.3.8 NL_PASSWORD_VERSION */
1463
1464         /* someone's birthday ? */
1465         const int NETLOGON_PASSWORD_VERSION_NUMBER_PRESENT = 0x02231968;
1466
1467         typedef struct {
1468                 uint32 ReservedField;
1469                 uint32 PasswordVersionNumber;
1470                 uint32 PasswordVersionPresent;
1471         } NL_PASSWORD_VERSION;
1472
1473         typedef [flag(NDR_PAHEX)] struct {
1474                 uint8 data[512];
1475                 uint32 length;
1476         } netr_CryptPassword;
1477
1478         NTSTATUS netr_ServerPasswordSet2(
1479                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1480                 [in]  [string,charset(UTF16)] uint16 *account_name,
1481                 [in]  netr_SchannelType secure_channel_type,
1482                 [in]  [string,charset(UTF16)] uint16 *computer_name,
1483                 [in,ref] netr_Authenticator *credential,
1484                 [out,ref] netr_Authenticator *return_authenticator,
1485                 [in,ref] netr_CryptPassword *new_password
1486                 );
1487
1488         /****************/
1489         /* Function 0x1f */
1490         NTSTATUS netr_ServerPasswordGet(
1491                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1492                 [in]  [string,charset(UTF16)] uint16 *account_name,
1493                 [in]  netr_SchannelType secure_channel_type,
1494                 [in]  [string,charset(UTF16)] uint16 *computer_name,
1495                 [in,ref] netr_Authenticator *credential,
1496                 [out,ref] netr_Authenticator *return_authenticator,
1497                 [out,ref] samr_Password *password
1498                 );
1499
1500         typedef [public] enum {
1501                 SendToSamUpdatePassword = 0,
1502                 SendToSamResetBadPasswordCount = 1,
1503                 SendToSamUpdatePasswordForward = 2,
1504                 SendToSamUpdateLastLogonTimestamp = 3,
1505                 SendToSamResetSmartCardPassword = 4
1506         } netr_SendToSamType;
1507
1508         typedef struct {
1509                 GUID guid;
1510         } netr_SendToSamResetBadPasswordCount;
1511
1512         typedef [nodiscriminant, public,switch_type(netr_SendToSamType)] union {
1513                 /* TODO Implement other SendToSam message types
1514                  * [case(SendToSamUpdatePassword)] netr_SendToSamUpdatePassword ...; */
1515                 [case(SendToSamResetBadPasswordCount)] netr_SendToSamResetBadPasswordCount reset_bad_password;
1516                 /*
1517                  * [case(SendToSamUpdatePasswordForward)] netrSendToSamUpdatePasswordForward ...;
1518                  * [case(SendToSamUpdateLastLogonTimestamp)] netrSendToSamUpdateLastLogonTimestamp ...;
1519                  * [case(SendToSamResetSmartCardPassword)]   netrSendToSamResetSmartCardPassword ...;
1520                  */
1521                 [default];
1522         } netr_SendToSamMessage;
1523
1524         typedef [public] struct {
1525                 netr_SendToSamType message_type;
1526                 uint32 message_size;
1527                 [switch_is(message_type), subcontext(0), subcontext_size(message_size)] netr_SendToSamMessage message;
1528         } netr_SendToSamBase;
1529
1530         /****************/
1531         /* Function 0x20 */
1532         NTSTATUS netr_NetrLogonSendToSam(
1533                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1534                 [in]  [string,charset(UTF16)] uint16 *computer_name,
1535                 [in,ref] netr_Authenticator *credential,
1536                 [out,ref] netr_Authenticator *return_authenticator,
1537                 [in,ref]  [size_is(buffer_len)] uint8 *opaque_buffer,
1538                 [in] uint32 buffer_len
1539                 );
1540
1541         /****************/
1542         /* Function 0x21 */
1543         typedef struct {
1544                 uint32 count;
1545                 [size_is(count)] lsa_String *sitename;
1546         } netr_DsRAddressToSitenamesWCtr;
1547
1548         typedef struct {
1549                 [size_is(size)] uint8 *buffer;
1550                 uint32 size;
1551         } netr_DsRAddress;
1552
1553         WERROR netr_DsRAddressToSitenamesW(
1554                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1555                 [in] [range(0,32000)] uint32 count,
1556                 [in] [size_is(count)] [ref] netr_DsRAddress *addresses,
1557                 [out] [ref] netr_DsRAddressToSitenamesWCtr **ctr
1558                 );
1559
1560         /****************/
1561         /* Function 0x22 */
1562         WERROR netr_DsRGetDCNameEx2(
1563                 [in,unique] [string,charset(UTF16)] uint16 *server_unc,
1564                 [in,unique] [string,charset(UTF16)] uint16 *client_account,
1565                 [in] samr_AcctFlags mask,
1566                 [in,unique] [string,charset(UTF16)] uint16 *domain_name,
1567                 [in,unique] GUID *domain_guid,
1568                 [in,unique] [string,charset(UTF16)] uint16 *site_name,
1569                 [in] netr_DsRGetDCName_flags flags,
1570                 [out,ref] netr_DsRGetDCNameInfo **info
1571                 );
1572
1573         /****************/
1574         /* Function 0x23 */
1575         [todo] WERROR netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN();
1576
1577         /****************/
1578         /* Function 0x24 */
1579
1580         typedef struct {
1581                 [string,charset(UTF16)] uint16                  *netbios_name;
1582                 [string,charset(UTF16)] uint16                  *dns_name;
1583                 netr_TrustFlags         trust_flags;
1584                 uint32                  parent_index;
1585                 lsa_TrustType           trust_type;
1586                 lsa_TrustAttributes     trust_attributes;
1587                 dom_sid2                *sid;
1588                 GUID                    guid;
1589         } netr_DomainTrust;
1590
1591         typedef struct {
1592                 uint32 count;
1593                 [size_is(count)] netr_DomainTrust *array;
1594         } netr_DomainTrustList;
1595
1596         WERROR netr_NetrEnumerateTrustedDomainsEx(
1597                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1598                 [out,ref] netr_DomainTrustList *dom_trust_list
1599         );
1600
1601         /****************/
1602         /* Function 0x25 */
1603         typedef struct {
1604                 uint32 count;
1605                 [size_is(count)] lsa_String *sitename;
1606                 [size_is(count)] lsa_String *subnetname;
1607         } netr_DsRAddressToSitenamesExWCtr;
1608
1609         WERROR netr_DsRAddressToSitenamesExW(
1610                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1611                 [in] [range(0,32000)] uint32 count,
1612                 [in] [size_is(count)] [ref] netr_DsRAddress *addresses,
1613                 [out] [ref] netr_DsRAddressToSitenamesExWCtr **ctr
1614                 );
1615
1616         /****************/
1617         /* Function 0x26 */
1618
1619         typedef struct {
1620                 uint32 num_sites;
1621                 [size_is(num_sites)] [unique] lsa_String *sites;
1622         } DcSitesCtr;
1623
1624         WERROR netr_DsrGetDcSiteCoverageW(
1625                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1626                 [out,ref] DcSitesCtr **ctr
1627                 );
1628
1629         /****************/
1630         /* Function 0x27 */
1631         typedef [public,bitmap32bit] bitmap {
1632                 /* Request MUST be passed to the domain controller at the root of the forest. */
1633                 NETLOGON_SAMLOGON_FLAG_PASS_TO_FOREST_ROOT = 0x00000001,
1634                 /* Request MUST be passed to the DC at the end of the first hop over a cross-forest trust. */
1635                 NETLOGON_SAMLOGON_FLAG_PASS_CROSS_FOREST_HOP = 0x00000002,
1636                 /* Request was passed by an RODC to a DC in a different domain. */
1637                 NETLOGON_SAMLOGON_FLAG_RODC_TO_OTHER_DOMAIN = 0x00000004,
1638                 /* Request is an NTLM authentication package request passed by an RODC. */
1639                 NETLOGON_SAMLOGON_FLAG_RODC_NTLM_REQUEST = 0x00000008
1640         } netr_LogonSamLogon_flags;
1641
1642         NTSTATUS netr_LogonSamLogonEx(
1643                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1644                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
1645                 [in]  netr_LogonInfoClass logon_level,
1646                 [in,ref]  [switch_is(logon_level)] netr_LogonLevel *logon,
1647                 [in]  uint16 validation_level,
1648                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
1649                 [out,ref] uint8 *authoritative,
1650                 [in,out,ref] netr_LogonSamLogon_flags *flags
1651                 );
1652
1653         /****************/
1654         /* Function 0x28 */
1655
1656         WERROR netr_DsrEnumerateDomainTrusts(
1657                 [in,unique]          [string,charset(UTF16)] uint16           *server_name,
1658                 [in]                 netr_TrustFlags  trust_flags,
1659                 [out,ref]            netr_DomainTrustList *trusts
1660                 );
1661
1662
1663         /****************/
1664         /* Function 0x29 */
1665         WERROR netr_DsrDeregisterDNSHostRecords(
1666                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1667                 [in,unique] [string,charset(UTF16)] uint16 *domain,
1668                 [in,unique] GUID *domain_guid,
1669                 [in,unique] GUID *dsa_guid,
1670                 [in,ref] [string,charset(UTF16)] uint16 *dns_host
1671                 );
1672
1673         /****************/
1674         /* Function 0x2a */
1675         NTSTATUS netr_ServerTrustPasswordsGet(
1676                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1677                 [in]  [string,charset(UTF16)] uint16 *account_name,
1678                 [in]  netr_SchannelType secure_channel_type,
1679                 [in]  [string,charset(UTF16)] uint16 *computer_name,
1680                 [in,ref] netr_Authenticator *credential,
1681                 [out,ref] netr_Authenticator *return_authenticator,
1682                 [out,ref] samr_Password *new_owf_password,
1683                 [out,ref] samr_Password *old_owf_password
1684         );
1685
1686         /****************/
1687         /* Function 0x2b */
1688
1689         const int DS_GFTI_UPDATE_TDO = 0x1;
1690
1691         WERROR netr_DsRGetForestTrustInformation(
1692                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1693                 [in,unique] [string,charset(UTF16)] uint16 *trusted_domain_name,
1694                 [in] uint32 flags,
1695                 [out,ref] lsa_ForestTrustInformation **forest_trust_info
1696                 );
1697
1698         /****************/
1699         /* Function 0x2c */
1700         NTSTATUS netr_GetForestTrustInformation(
1701                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1702                 [in,ref] [string,charset(UTF16)] uint16 *computer_name,
1703                 [in,ref] netr_Authenticator *credential,
1704                 [out,ref] netr_Authenticator *return_authenticator,
1705                 [in] uint32 flags,
1706                 [out,ref] lsa_ForestTrustInformation **forest_trust_info
1707                 );
1708
1709         /****************/
1710         /* Function 0x2d */
1711
1712         /* this is the ADS varient. I don't yet know what the "flags" are for */
1713         NTSTATUS netr_LogonSamLogonWithFlags(
1714                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1715                 [in,unique] [string,charset(UTF16)] uint16 *computer_name,
1716                 [in,unique] netr_Authenticator *credential,
1717                 [in,out,unique] netr_Authenticator *return_authenticator,
1718                 [in]  netr_LogonInfoClass logon_level,
1719                 [in,ref]  [switch_is(logon_level)] netr_LogonLevel *logon,
1720                 [in]  uint16 validation_level,
1721                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
1722                 [out,ref] uint8 *authoritative,
1723                 [in,out,ref] netr_LogonSamLogon_flags *flags
1724                 );
1725
1726         /****************/
1727         /* Function 0x2e */
1728
1729         typedef struct {
1730                 uint32 count;
1731                 [size_is(count)] uint32 *data;
1732                 uint32 entry_count;
1733                 [size_is(count)] lsa_String *entries;
1734         } netr_TrustInfo;
1735
1736         NTSTATUS netr_ServerGetTrustInfo(
1737                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1738                 [in,ref] [string,charset(UTF16)] uint16 *account_name,
1739                 [in] netr_SchannelType secure_channel_type,
1740                 [in,ref] [string,charset(UTF16)] uint16 *computer_name,
1741                 [in,ref] netr_Authenticator *credential,
1742                 [out,ref] netr_Authenticator *return_authenticator,
1743                 [out,ref] samr_Password *new_owf_password,
1744                 [out,ref] samr_Password *old_owf_password,
1745                 [out,ref] netr_TrustInfo **trust_info
1746                 );
1747
1748         /****************/
1749         /* Function 0x2f */
1750
1751         NTSTATUS netr_Unused47(void);
1752
1753
1754         /****************/
1755         /* Function 0x30 */
1756
1757         typedef enum {
1758                 NlDnsLdapAtSite       = 22,
1759                 NlDnsGcAtSite         = 25,
1760                 NlDnsDsaCname         = 28,
1761                 NlDnsKdcAtSite        = 30,
1762                 NlDnsDcAtSite         = 32,
1763                 NlDnsRfc1510KdcAtSite = 34,
1764                 NlDnsGenericGcAtSite  = 36
1765         } netr_DnsType;
1766
1767         typedef enum {
1768                 NlDnsInfoTypeNone    = 0,
1769                 NlDnsDomainName      = 1,
1770                 NlDnsDomainNameAlias = 2,
1771                 NlDnsForestName      = 3,
1772                 NlDnsForestNameAlias = 4,
1773                 NlDnsNdncDomainName  = 5,
1774                 NlDnsRecordName      = 6
1775         } netr_DnsDomainInfoType;
1776
1777         typedef struct {
1778                 netr_DnsType type;
1779                 [string,charset(UTF16)] uint16 *dns_domain_info;
1780                 netr_DnsDomainInfoType dns_domain_info_type;
1781                 uint32 priority;
1782                 uint32 weight;
1783                 uint32 port;
1784                 boolean32 dns_register;
1785                 uint32 status;
1786         } NL_DNS_NAME_INFO;
1787
1788         typedef [public] struct {
1789                 uint32 count;
1790                 [size_is(count)] NL_DNS_NAME_INFO *names;
1791         } NL_DNS_NAME_INFO_ARRAY;
1792
1793         NTSTATUS netr_DsrUpdateReadOnlyServerDnsRecords(
1794                 [in,unique] [string,charset(UTF16)] uint16 *server_name,
1795                 [in,ref] [string,charset(UTF16)] uint16 *computer_name,
1796                 [in, ref] netr_Authenticator *credential,
1797                 [out,ref]   netr_Authenticator *return_authenticator,
1798                 [in,unique] [string,charset(UTF16)] uint16 *site_name,
1799                 [in] uint32 dns_ttl,
1800                 [in,out,ref] NL_DNS_NAME_INFO_ARRAY *dns_names
1801                 );
1802 }