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