Set the "stable" vendor string in VERSION.
[bbaumbach/samba-autobuild/.git] / source / 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 #include "idl_types.h"
8
9 import "lsa.idl", "samr.idl", "security.idl";
10
11
12 [
13   uuid("12345678-1234-abcd-ef00-01234567cffb"),
14   version(1.0),
15   endpoint("ncacn_np:[\\pipe\\netlogon]","ncacn_ip_tcp:","ncalrpc:"),
16   pointer_default(unique),
17   pointer_default_top(unique)
18 ]
19
20 interface netlogon
21 {
22         declare bitmap samr_AcctFlags;
23
24         /*****************/
25         /* Function 0x00 */
26
27         typedef struct {
28                 [string,charset(UTF16)] uint16 *account_name;
29                 uint32 priv;
30                 uint32 auth_flags;
31                 uint32 logon_count;
32                 uint32 bad_pw_count;
33                 time_t last_logon;
34                 time_t last_logoff;
35                 time_t logoff_time;
36                 time_t kickoff_time;
37                 uint32 password_age;
38                 time_t pw_can_change;
39                 time_t pw_must_change;
40                 [string,charset(UTF16)] uint16 *computer;
41                 [string,charset(UTF16)] uint16 *domain;
42                 [string,charset(UTF16)] uint16 *script_path;
43                 uint32 unknown;
44         } netr_UasInfo;
45
46         WERROR netr_LogonUasLogon(
47                 [in]   [string,charset(UTF16)] uint16 *server_name,
48                 [in]   [string,charset(UTF16)] uint16 account_name[],
49                 [in]   [string,charset(UTF16)] uint16 workstation[],
50                 [out]  netr_UasInfo *info
51                 );
52
53
54         /*****************/
55         /* Function 0x01 */
56
57         typedef struct {
58                 uint32 duration;
59                 uint16 logon_count;
60         } netr_UasLogoffInfo;
61
62         WERROR netr_LogonUasLogoff(
63                 [in] [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_UasLogoffInfo *info
67                 );
68
69
70         /*****************/
71         /* Function 0x02 */
72
73         /* in netr_AcctLockStr size seems to be be 24, and rrenard thinks 
74            that the structure of the bindata looks like this:
75
76                 dlong  lockout_duration;
77                 udlong reset_count;
78                 uint32 bad_attempt_lockout;
79                 uint32 dummy;   
80
81            but it doesn't look as though this structure is reflected at the
82            NDR level. Maybe it is left to the application to decode the bindata array.
83         */
84         typedef struct {
85                 uint16 size;
86                 uint16 length;
87                 [size_is(size/2),length_is(length/2)] uint16 *bindata;
88         } netr_AcctLockStr;
89
90         const int MSV1_0_CLEARTEXT_PASSWORD_ALLOWED = 0x002;
91         const int MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT = 0x020;
92         const int MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT = 0x800;
93
94         typedef struct {
95                 lsa_String  domain_name;
96                 uint32      parameter_control; /* see MSV1_0_* */
97                 uint32      logon_id_low;
98                 uint32      logon_id_high;
99                 lsa_String  account_name;
100                 lsa_String  workstation;
101         } netr_IdentityInfo;
102
103         typedef struct {
104                 netr_IdentityInfo identity_info;
105                 samr_Password lmpassword;
106                 samr_Password ntpassword;
107         } netr_PasswordInfo;
108
109         typedef [flag(NDR_PAHEX)] struct {
110                 uint16 length;
111                 [value(length)] uint16 size;
112                 [size_is(length),length_is(length)] uint8 *data;
113         } netr_ChallengeResponse;
114
115         typedef [flag(NDR_PAHEX)] struct {
116                 netr_IdentityInfo identity_info;
117                 uint8 challenge[8];
118                 netr_ChallengeResponse nt;
119                 netr_ChallengeResponse lm;
120         } netr_NetworkInfo;
121
122         typedef [public,switch_type(uint16)] union {
123                 [case(1)] netr_PasswordInfo *password;
124                 [case(2)] netr_NetworkInfo  *network;
125                 [case(3)] netr_PasswordInfo *password;
126                 [case(5)] netr_PasswordInfo *password;
127                 [case(6)] netr_NetworkInfo  *network;
128         } netr_LogonLevel;
129
130         typedef [public] struct {
131                 uint32 rid;
132                 uint32 attributes;
133         } netr_GroupMembership;
134
135         typedef [public,flag(NDR_PAHEX)] struct {
136                 uint8 key[16];
137         } netr_UserSessionKey;
138
139         typedef [public,flag(NDR_PAHEX)] struct {
140                 uint8 key[8];
141         } netr_LMSessionKey;
142
143         /* Flags for user_flags below */
144         typedef [public,bitmap32bit] bitmap {
145                 NETLOGON_GUEST                  = 0x0001,
146                 NETLOGON_NOENCRYPTION           = 0x0002,
147                 NETLOGON_CACHED_ACCOUNT         = 0x0004,
148                 NETLOGON_USED_LM_PASSWORD       = 0x0008,
149                 NETLOGON_EXTRA_SIDS             = 0x0020,
150                 NETLOGON_SUBAUTH_SESSION_KEY    = 0x0040,
151                 NETLOGON_SERVER_TRUST_ACCOUNT   = 0x0080,
152                 NETLOGON_NTLMV2_ENABLED         = 0x0100,
153                 NETLOGON_RESOURCE_GROUPS        = 0x0200,
154                 NETLOGON_PROFILE_PATH_RETURNED  = 0x0400
155         } netr_UserFlags;
156
157         typedef struct {
158                 NTTIME last_logon;
159                 NTTIME last_logoff;
160                 NTTIME acct_expiry;
161                 NTTIME last_password_change;
162                 NTTIME allow_password_change;
163                 NTTIME force_password_change;
164                 lsa_String account_name;
165                 lsa_String full_name;
166                 lsa_String logon_script;
167                 lsa_String profile_path;
168                 lsa_String home_directory;
169                 lsa_String home_drive;
170                 uint16 logon_count;
171                 uint16 bad_password_count;
172                 uint32 rid;
173                 uint32 primary_gid;
174                 samr_RidWithAttributeArray groups;
175                 netr_UserFlags user_flags;
176                 netr_UserSessionKey key;
177                 lsa_StringLarge logon_server;
178                 lsa_StringLarge domain;
179                 dom_sid2 *domain_sid;
180                 netr_LMSessionKey LMSessKey;
181                 samr_AcctFlags acct_flags;
182                 uint32 unknown[7];
183         } netr_SamBaseInfo;
184
185         typedef struct {
186                 netr_SamBaseInfo base;
187         } netr_SamInfo2;
188
189         typedef struct {
190                 dom_sid2 *sid;
191                 uint32 attribute;
192         } netr_SidAttr;
193
194         typedef [public] struct {
195                 netr_SamBaseInfo base;
196                 uint32 sidcount;
197                 [size_is(sidcount)] netr_SidAttr *sids;
198         } netr_SamInfo3;
199
200         typedef struct {
201                 netr_SamBaseInfo base;
202                 uint32 sidcount;
203                 [size_is(sidcount)] netr_SidAttr *sids;
204                 lsa_String forest;
205                 lsa_String principle;
206                 uint32 unknown4[20];
207         } netr_SamInfo6;
208
209         typedef struct {
210                 uint32 pac_size;
211                 [size_is(pac_size)] uint8 *pac;
212                 lsa_String logon_domain;
213                 lsa_String logon_server;
214                 lsa_String principal_name;
215                 uint32 auth_size;
216                 [size_is(auth_size)] uint8 *auth;
217                 netr_UserSessionKey user_session_key;
218                 uint32 expansionroom[10];
219                 lsa_String unknown1;
220                 lsa_String unknown2;
221                 lsa_String unknown3;
222                 lsa_String unknown4;
223         } netr_PacInfo;
224
225         typedef [public,switch_type(uint16)] union {
226                 [case(2)] netr_SamInfo2 *sam2;
227                 [case(3)] netr_SamInfo3 *sam3;
228                 [case(4)] netr_PacInfo  *pac;
229                 [case(5)] netr_PacInfo  *pac;
230                 [case(6)] netr_SamInfo6 *sam6;
231         } netr_Validation;
232
233         typedef [public, flag(NDR_PAHEX)] struct {
234                 uint8 data[8];
235         } netr_Credential;
236
237         typedef [public] struct {
238                 netr_Credential cred;
239                 time_t timestamp;
240         } netr_Authenticator;
241
242         NTSTATUS netr_LogonSamLogon(
243                 [in] [string,charset(UTF16)] uint16 *server_name,
244                 [in] [string,charset(UTF16)] uint16 *computer_name,
245                 [in] netr_Authenticator *credential,
246                 [in][out] netr_Authenticator *return_authenticator,
247                 [in]  uint16 logon_level,
248                 [in]  [switch_is(logon_level)] netr_LogonLevel logon,
249                 [in]  uint16 validation_level,
250                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
251                 [out,ref] uint8 *authoritative
252                 );
253
254
255         /*****************/
256         /* Function 0x03 */
257
258         NTSTATUS netr_LogonSamLogoff(
259                 [in] [string,charset(UTF16)] uint16 *server_name,
260                 [in] [string,charset(UTF16)] uint16 *computer_name,
261                 [in]      netr_Authenticator *credential,
262                 [in][out] netr_Authenticator *return_authenticator,
263                 [in] uint16 logon_level,
264                 [in] [switch_is(logon_level)] netr_LogonLevel logon
265                 );
266         
267
268
269         /*****************/
270         /* Function 0x04 */
271
272         NTSTATUS netr_ServerReqChallenge(
273                 [in,string,charset(UTF16)] uint16 *server_name,
274                 [in,string,charset(UTF16)] uint16 computer_name[],
275                 [in,out,ref] netr_Credential *credentials
276                 );
277
278
279         /*****************/
280         /* Function 0x05 */
281
282         declare enum netr_SchannelType;
283
284         NTSTATUS netr_ServerAuthenticate(
285                 [in,string,charset(UTF16)] uint16 *server_name,
286                 [in,string,charset(UTF16)] uint16 account_name[],
287                 [in]                       netr_SchannelType secure_channel_type,
288                 [in,string,charset(UTF16)] uint16 computer_name[],
289                 [in,out,ref] netr_Credential *credentials
290                 );
291
292
293         /*****************/
294         /* Function 0x06 */
295
296         NTSTATUS netr_ServerPasswordSet(
297                 [in]  [string,charset(UTF16)] uint16 *server_name,
298                 [in]  [string,charset(UTF16)] uint16 account_name[],
299                 [in]  netr_SchannelType secure_channel_type,
300                 [in]  [string,charset(UTF16)] uint16 computer_name[],
301                 [in]  netr_Authenticator credential,
302                 [in]  samr_Password new_password,
303                 [out,ref] netr_Authenticator *return_authenticator
304                 );
305
306
307         /*****************/
308         /* Function 0x07 */
309
310         declare enum netr_SamDatabaseID;
311
312         typedef struct {
313                 [string,charset(UTF16)] uint16 *account_name;
314                 lsa_String unknown1;
315                 lsa_String unknown2;
316                 lsa_String unknown3;
317                 lsa_String unknown4;
318                 uint32 unknown5;
319                 uint32 unknown6;
320                 uint32 unknown7;
321                 uint32 unknown8;
322         } netr_DELTA_DELETE_USER;
323
324         typedef struct {
325                 uint16 length;
326                 [value(length)] uint16 size;
327                 uint32 flags;
328                 samr_Password pwd;
329         } netr_USER_KEY16;
330
331         typedef struct {
332                 uint16 nt_length;
333                 uint16 nt_size;
334                 uint32 nt_flags;
335                 uint16 lm_length;
336                 uint16 lm_size;
337                 uint32 lm_flags;
338                 uint8 nt_history[nt_length];
339                 uint8 lm_history[lm_length];
340         } netr_PasswordHistory;
341
342         typedef struct {
343                 netr_USER_KEY16 lmpassword;
344                 netr_USER_KEY16 ntpassword;
345                 netr_PasswordHistory lmhistory;
346         } netr_USER_KEYS2;
347
348         typedef struct {
349                 netr_USER_KEYS2 keys2;
350         } netr_USER_KEY_UNION;
351
352         typedef [public] struct {
353                 uint32 version;
354                 netr_USER_KEY_UNION keys;
355         } netr_USER_KEYS;
356
357         typedef struct {
358                 boolean8  SensitiveDataFlag;
359                 uint32 DataLength;
360
361                 /* netr_USER_KEYS encrypted with the session key */
362                 [size_is(DataLength)][flag(NDR_PAHEX)] uint8 *SensitiveData;
363         } netr_USER_PRIVATE_INFO;
364
365         typedef struct {
366                 lsa_String account_name;
367                 lsa_String full_name;
368                 uint32 rid;
369                 uint32 primary_gid;
370                 lsa_String home_directory;
371                 lsa_String home_drive;
372                 lsa_String logon_script;
373                 lsa_String description;
374                 lsa_String workstations;
375                 NTTIME last_logon;
376                 NTTIME last_logoff;
377                 samr_LogonHours logon_hours;
378                 uint16 bad_password_count;
379                 uint16 logon_count;
380                 NTTIME last_password_change;
381                 NTTIME acct_expiry;
382                 samr_AcctFlags acct_flags;
383                 samr_Password lmpassword;
384                 samr_Password ntpassword;
385                 boolean8 nt_password_present;
386                 boolean8 lm_password_present;
387                 boolean8 password_expired;
388                 lsa_String comment;
389                 lsa_String parameters;
390                 uint16 country_code;
391                 uint16 code_page;
392                 netr_USER_PRIVATE_INFO user_private_info;
393                 uint32 SecurityInformation;
394                 sec_desc_buf sdbuf;
395                 lsa_String profile_path;
396                 lsa_String unknown2;
397                 lsa_String unknown3;
398                 lsa_String unknown4;
399                 uint32 unknown5;
400                 uint32 unknown6;
401                 uint32 unknown7;
402                 uint32 unknown8;
403         } netr_DELTA_USER;
404
405         typedef struct {
406                 lsa_String domain_name;
407                 lsa_String comment;
408                 dlong force_logoff_time;
409                 uint16 min_password_length;
410                 uint16 password_history_length;
411                 /* yes, these are signed. They are in negative 100ns */
412                 dlong  max_password_age;
413                 dlong  min_password_age;
414                 udlong sequence_num;
415                 NTTIME domain_create_time;
416                 uint32 SecurityInformation;
417                 sec_desc_buf sdbuf;
418                 netr_AcctLockStr account_lockout;
419                 lsa_String unknown2;
420                 lsa_String unknown3;
421                 lsa_String unknown4;
422                 uint32 logon_to_chgpass;
423                 uint32 unknown6;
424                 uint32 unknown7;
425                 uint32 unknown8;
426         } netr_DELTA_DOMAIN;
427
428         typedef struct {
429                 lsa_String group_name;
430                 uint32 rid;
431                 uint32 attributes;
432                 lsa_String description;
433                 uint32 SecurityInformation;
434                 sec_desc_buf sdbuf;
435                 lsa_String unknown1;
436                 lsa_String unknown2;
437                 lsa_String unknown3;
438                 lsa_String unknown4;
439                 uint32 unknown5;
440                 uint32 unknown6;
441                 uint32 unknown7;
442                 uint32 unknown8;
443         } netr_DELTA_GROUP;
444
445         typedef struct {
446                 lsa_String OldName;
447                 lsa_String NewName;
448                 lsa_String unknown1;
449                 lsa_String unknown2;
450                 lsa_String unknown3;
451                 lsa_String unknown4;
452                 uint32 unknown5;
453                 uint32 unknown6;
454                 uint32 unknown7;
455                 uint32 unknown8;
456         } netr_DELTA_RENAME;
457
458         typedef struct {
459                 [size_is(num_rids)] uint32 *rids;
460                 [size_is(num_rids)] uint32 *attribs;
461                 uint32 num_rids;
462                 uint32 unknown1;
463                 uint32 unknown2;
464                 uint32 unknown3;
465                 uint32 unknown4;
466         } netr_DELTA_GROUP_MEMBER;
467
468         typedef struct {
469                 lsa_String alias_name;
470                 uint32 rid;
471                 uint32 SecurityInformation;
472                 sec_desc_buf sdbuf;
473                 lsa_String description;
474                 lsa_String unknown2;
475                 lsa_String unknown3;
476                 lsa_String unknown4;
477                 uint32 unknown5;
478                 uint32 unknown6;
479                 uint32 unknown7;
480                 uint32 unknown8;
481         } netr_DELTA_ALIAS;
482
483         typedef struct {
484                 lsa_SidArray sids;
485                 uint32 unknown1;
486                 uint32 unknown2;
487                 uint32 unknown3;
488                 uint32 unknown4;
489         } netr_DELTA_ALIAS_MEMBER;
490
491         typedef struct {
492                 uint32 pagedpoollimit;
493                 uint32 nonpagedpoollimit;
494                 uint32 minimumworkingsetsize;
495                 uint32 maximumworkingsetsize;
496                 uint32 pagefilelimit;
497                 NTTIME timelimit;
498         } netr_QUOTA_LIMITS;
499
500         typedef struct {
501                 uint32 maxlogsize;
502                 NTTIME auditretentionperiod;
503                 boolean8 auditingmode;
504                 uint32 maxauditeventcount;
505                 [size_is(maxauditeventcount+1)] uint32 *eventauditoptions;
506                 lsa_String primary_domain_name;
507                 dom_sid2 *sid;
508                 netr_QUOTA_LIMITS quota_limits;
509                 udlong sequence_num;
510                 NTTIME db_create_time;
511                 uint32 SecurityInformation;
512                 sec_desc_buf sdbuf;
513                 lsa_String unknown1;
514                 lsa_String unknown2;
515                 lsa_String unknown3;
516                 lsa_String unknown4;
517                 uint32 unknown5;
518                 uint32 unknown6;
519                 uint32 unknown7;
520                 uint32 unknown8;
521         } netr_DELTA_POLICY;
522
523         typedef struct {
524                 lsa_String domain_name;
525                 uint32 num_controllers;
526                 [size_is(num_controllers)] lsa_String *controller_names;
527                 uint32 SecurityInformation;
528                 sec_desc_buf sdbuf;
529                 lsa_String unknown1;
530                 lsa_String unknown2;
531                 lsa_String unknown3;
532                 lsa_String unknown4;
533                 uint32 posix_offset;
534                 uint32 unknown6;
535                 uint32 unknown7;
536                 uint32 unknown8;
537         } netr_DELTA_TRUSTED_DOMAIN;
538
539         typedef struct {
540                 uint16 unknown;
541         } netr_DELTA_DELETE_TRUST;
542
543         typedef struct {
544                 uint32 privilege_entries;
545                 uint32 privilege_control;
546                 [size_is(privilege_entries)] uint32 *privilege_attrib;
547                 [size_is(privilege_entries)] lsa_String *privilege_name;
548                 netr_QUOTA_LIMITS quotalimits;
549                 uint32 system_flags;
550                 uint32 SecurityInformation;
551                 sec_desc_buf sdbuf;
552                 lsa_String unknown1;
553                 lsa_String unknown2;
554                 lsa_String unknown3;
555                 lsa_String unknown4;
556                 uint32 unknown5;
557                 uint32 unknown6;
558                 uint32 unknown7;
559                 uint32 unknown8;
560         } netr_DELTA_ACCOUNT;
561
562         typedef struct {
563                 uint16 unknown;
564         } netr_DELTA_DELETE_ACCOUNT;
565
566         typedef struct {
567                 uint16 unknown;
568         } netr_DELTA_DELETE_SECRET;
569
570         typedef struct {
571                 uint32 len;
572                 uint32 maxlen;
573                 [size_is(maxlen)][length_is(len)] uint8 *cipher_data;
574         } netr_CIPHER_VALUE;
575
576         typedef struct {
577                 netr_CIPHER_VALUE current_cipher;
578                 NTTIME current_cipher_set_time;
579                 netr_CIPHER_VALUE old_cipher;
580                 NTTIME old_cipher_set_time;
581                 uint32 SecurityInformation;
582                 sec_desc_buf sdbuf;
583                 lsa_String unknown1;
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_SECRET;
592
593         typedef enum {
594                 NETR_DELTA_DOMAIN           = 1,
595                 NETR_DELTA_GROUP            = 2,
596                 NETR_DELTA_DELETE_GROUP     = 3,
597                 NETR_DELTA_RENAME_GROUP     = 4,
598                 NETR_DELTA_USER             = 5,
599                 NETR_DELTA_DELETE_USER      = 6,
600                 NETR_DELTA_RENAME_USER      = 7,
601                 NETR_DELTA_GROUP_MEMBER     = 8,
602                 NETR_DELTA_ALIAS            = 9,
603                 NETR_DELTA_DELETE_ALIAS     = 10,
604                 NETR_DELTA_RENAME_ALIAS     = 11,
605                 NETR_DELTA_ALIAS_MEMBER     = 12,
606                 NETR_DELTA_POLICY           = 13,
607                 NETR_DELTA_TRUSTED_DOMAIN   = 14,
608                 NETR_DELTA_DELETE_TRUST     = 15,
609                 NETR_DELTA_ACCOUNT          = 16,
610                 NETR_DELTA_DELETE_ACCOUNT   = 17,
611                 NETR_DELTA_SECRET           = 18,
612                 NETR_DELTA_DELETE_SECRET    = 19,
613                 NETR_DELTA_DELETE_GROUP2    = 20,
614                 NETR_DELTA_DELETE_USER2     = 21,
615                 NETR_DELTA_MODIFY_COUNT     = 22
616         } netr_DeltaEnum;
617
618         typedef [switch_type(netr_DeltaEnum)] union {
619                 [case(NETR_DELTA_DOMAIN)]          netr_DELTA_DOMAIN          *domain;
620                 [case(NETR_DELTA_GROUP)]           netr_DELTA_GROUP           *group;
621                 [case(NETR_DELTA_DELETE_GROUP)]    ; /* rid only */
622                 [case(NETR_DELTA_RENAME_GROUP)]    netr_DELTA_RENAME          *rename_group;
623                 [case(NETR_DELTA_USER)]            netr_DELTA_USER            *user;
624                 [case(NETR_DELTA_DELETE_USER)]     ; /* rid only */
625                 [case(NETR_DELTA_RENAME_USER)]     netr_DELTA_RENAME          *rename_user;
626                 [case(NETR_DELTA_GROUP_MEMBER)]    netr_DELTA_GROUP_MEMBER    *group_member;
627                 [case(NETR_DELTA_ALIAS)]           netr_DELTA_ALIAS           *alias;
628                 [case(NETR_DELTA_DELETE_ALIAS)]    ; /* rid only */
629                 [case(NETR_DELTA_RENAME_ALIAS)]    netr_DELTA_RENAME          *rename_alias;
630                 [case(NETR_DELTA_ALIAS_MEMBER)]    netr_DELTA_ALIAS_MEMBER    *alias_member;
631                 [case(NETR_DELTA_POLICY)]          netr_DELTA_POLICY          *policy;
632                 [case(NETR_DELTA_TRUSTED_DOMAIN)]  netr_DELTA_TRUSTED_DOMAIN   *trusted_domain;
633                 [case(NETR_DELTA_DELETE_TRUST)]    netr_DELTA_DELETE_TRUST     delete_trust;
634                 [case(NETR_DELTA_ACCOUNT)]         netr_DELTA_ACCOUNT         *account;
635                 [case(NETR_DELTA_DELETE_ACCOUNT)]  netr_DELTA_DELETE_ACCOUNT   delete_account;
636                 [case(NETR_DELTA_SECRET)]          netr_DELTA_SECRET          *secret;
637                 [case(NETR_DELTA_DELETE_SECRET)]   netr_DELTA_DELETE_SECRET    delete_secret;
638                 [case(NETR_DELTA_DELETE_GROUP2)]   netr_DELTA_DELETE_USER     *delete_group;
639                 [case(NETR_DELTA_DELETE_USER2)]    netr_DELTA_DELETE_USER     *delete_user;
640                 [case(NETR_DELTA_MODIFY_COUNT)]    udlong                     *modified_count;
641         } netr_DELTA_UNION;
642
643         typedef [switch_type(netr_DeltaEnum)] union {
644                 [case(NETR_DELTA_DOMAIN)]          uint32 rid;
645                 [case(NETR_DELTA_GROUP)]           uint32 rid;
646                 [case(NETR_DELTA_DELETE_GROUP)]    uint32 rid;
647                 [case(NETR_DELTA_RENAME_GROUP)]    uint32 rid;
648                 [case(NETR_DELTA_USER)]            uint32 rid;
649                 [case(NETR_DELTA_DELETE_USER)]     uint32 rid;
650                 [case(NETR_DELTA_RENAME_USER)]     uint32 rid;
651                 [case(NETR_DELTA_GROUP_MEMBER)]    uint32 rid;
652                 [case(NETR_DELTA_ALIAS)]           uint32 rid;
653                 [case(NETR_DELTA_DELETE_ALIAS)]    uint32 rid;
654                 [case(NETR_DELTA_RENAME_ALIAS)]    uint32 rid;
655                 [case(NETR_DELTA_ALIAS_MEMBER)]    uint32 rid;
656                 [case(NETR_DELTA_POLICY)]          dom_sid2 *sid;
657                 [case(NETR_DELTA_TRUSTED_DOMAIN)]  dom_sid2 *sid;
658                 [case(NETR_DELTA_DELETE_TRUST)]    dom_sid2 *sid;
659                 [case(NETR_DELTA_ACCOUNT)]         dom_sid2 *sid;
660                 [case(NETR_DELTA_DELETE_ACCOUNT)]  dom_sid2 *sid;
661                 [case(NETR_DELTA_SECRET)]          [string,charset(UTF16)] uint16 *name;
662                 [case(NETR_DELTA_DELETE_SECRET)]   [string,charset(UTF16)] uint16 *name;
663                 [case(NETR_DELTA_DELETE_GROUP2)]   uint32 rid;
664                 [case(NETR_DELTA_DELETE_USER2)]    uint32 rid;
665                 [case(NETR_DELTA_MODIFY_COUNT)]    ;
666         } netr_DELTA_ID_UNION;
667
668         typedef struct {
669                 netr_DeltaEnum delta_type;
670                 [switch_is(delta_type)] netr_DELTA_ID_UNION delta_id_union;
671                 [switch_is(delta_type)] netr_DELTA_UNION delta_union;
672         } netr_DELTA_ENUM;
673
674         typedef struct {
675                 uint32 num_deltas;
676                 [size_is(num_deltas)] netr_DELTA_ENUM *delta_enum;
677         } netr_DELTA_ENUM_ARRAY;
678
679
680         NTSTATUS netr_DatabaseDeltas(
681                 [in]      [string,charset(UTF16)] uint16 logon_server[],
682                 [in]      [string,charset(UTF16)] uint16 computername[],
683                 [in]      netr_Authenticator credential,
684                 [in,out,ref]  netr_Authenticator *return_authenticator,
685                 [in]      netr_SamDatabaseID database_id,
686                 [in,out,ref]  udlong *sequence_num,
687                 [in]      uint32 preferredmaximumlength,
688                 [out]     netr_DELTA_ENUM_ARRAY *delta_enum_array
689                 );
690
691
692         /*****************/
693         /* Function 0x08 */
694
695         NTSTATUS netr_DatabaseSync(
696                 [in]     [string,charset(UTF16)] uint16 logon_server[],
697                 [in]     [string,charset(UTF16)] uint16 computername[],
698                 [in]     netr_Authenticator credential,
699                 [in,out,ref] netr_Authenticator *return_authenticator,
700                 [in]     netr_SamDatabaseID database_id,
701                 [in,out,ref] uint32 *sync_context,
702                 [in]     uint32 preferredmaximumlength,
703                 [out]    netr_DELTA_ENUM_ARRAY *delta_enum_array
704                 );
705
706
707         /*****************/
708         /* Function 0x09 */
709
710         /* w2k3 returns NT_STATUS_NOT_IMPLEMENTED for this call */
711
712         typedef [flag(NDR_PAHEX)] struct {
713                 uint8 computer_name[16];
714                 uint32 timecreated;
715                 uint32 serial_number;
716         } netr_UAS_INFO_0;
717
718         typedef struct {
719                 [flag(NDR_REMAINING)] DATA_BLOB blob;
720         } netr_AccountBuffer;
721
722         NTSTATUS netr_AccountDeltas(
723                 [in]     [string,charset(UTF16)] uint16 *logon_server,
724                 [in]     [string,charset(UTF16)] uint16 computername[],
725                 [in]     netr_Authenticator credential,
726                 [in,out,ref] netr_Authenticator *return_authenticator,
727                 [in]     netr_UAS_INFO_0 uas,
728                 [in]     uint32 count,
729                 [in]     uint32 level,
730                 [in]     uint32 buffersize,
731                 [out,ref,subcontext(4)] netr_AccountBuffer *buffer,
732                 [out,ref]    uint32 *count_returned,
733                 [out,ref]    uint32 *total_entries,
734                 [out,ref]    netr_UAS_INFO_0 *recordid
735                 );
736
737
738         /*****************/
739         /* Function 0x0A */
740
741         NTSTATUS netr_AccountSync(
742                 [in]      [string,charset(UTF16)] uint16 *logon_server,
743                 [in]      [string,charset(UTF16)] uint16 computername[],
744                 [in]      netr_Authenticator credential,
745                 [in,out,ref]  netr_Authenticator *return_authenticator,
746                 [in]      uint32 reference,
747                 [in]      uint32 level,
748                 [in]      uint32 buffersize,
749                 [out,ref,subcontext(4)] netr_AccountBuffer *buffer,
750                 [out,ref]     uint32 *count_returned,
751                 [out,ref]     uint32 *total_entries,
752                 [out,ref]     uint32 *next_reference,
753                 [in,out,ref]  netr_UAS_INFO_0 *recordid
754                 );
755
756
757         /*****************/
758         /* Function 0x0B */
759
760         NTSTATUS netr_GetDcName(
761                 [in]  [string,charset(UTF16)] uint16 logon_server[],
762                 [in]  [string,charset(UTF16)] uint16 *domainname,
763                 [out,ref] [string,charset(UTF16)] uint16 **dcname
764                 );
765
766         /*****************/
767         /* Function 0x0C */
768
769         typedef struct {
770                 uint32 flags;
771                 uint32 pdc_connection_status;
772         } netr_NETLOGON_INFO_1;
773
774         typedef struct {
775                 uint32 flags;
776                 uint32 pdc_connection_status;
777                 [string,charset(UTF16)] uint16 trusted_dc_name[];
778                 uint32 tc_connection_status;
779         } netr_NETLOGON_INFO_2;
780
781         typedef struct {
782                 uint32 flags;
783                 uint32 logon_attempts;
784                 uint32 unknown1;
785                 uint32 unknown2;
786                 uint32 unknown3;
787                 uint32 unknown4;
788                 uint32 unknown5;
789         } netr_NETLOGON_INFO_3;
790
791         typedef union {
792                 [case(1)]  netr_NETLOGON_INFO_1 *info1;
793                 [case(2)]  netr_NETLOGON_INFO_2 *info2;
794                 [case(3)]  netr_NETLOGON_INFO_3 *info3;
795         } netr_CONTROL_QUERY_INFORMATION;
796
797         /* function_code values */
798         typedef [v1_enum] enum {
799                 NETLOGON_CONTROL_REDISCOVER       = 5,
800                 NETLOGON_CONTROL_TC_QUERY         = 6,
801                 NETLOGON_CONTROL_TRANSPORT_NOTIFY = 7,
802                 NETLOGON_CONTROL_SET_DBFLAG       = 65534
803         } netr_LogonControlCode;
804
805         WERROR netr_LogonControl(
806                 [in]   [string,charset(UTF16)] uint16 *logon_server,
807                 [in]   netr_LogonControlCode function_code,
808                 [in]   uint32 level,
809                 [out,ref,switch_is(level)]  netr_CONTROL_QUERY_INFORMATION *info
810                 );
811
812
813         /*****************/
814         /* Function 0x0D */
815
816         WERROR netr_GetAnyDCName(
817                 [in]  [string,charset(UTF16)] uint16 *logon_server,
818                 [in]  [string,charset(UTF16)] uint16 *domainname,
819                 [out,ref] [string,charset(UTF16)] uint16 **dcname
820                 );
821
822
823         /*****************/
824         /* Function 0x0E */
825
826         typedef union {
827                 [case(NETLOGON_CONTROL_REDISCOVER)]        [string,charset(UTF16)] uint16 *domain;
828                 [case(NETLOGON_CONTROL_TC_QUERY)]          [string,charset(UTF16)] uint16 *domain;
829                 [case(NETLOGON_CONTROL_TRANSPORT_NOTIFY)]  [string,charset(UTF16)] uint16 *domain;
830                 [case(NETLOGON_CONTROL_SET_DBFLAG)]        uint32 debug_level;
831         } netr_CONTROL_DATA_INFORMATION;
832
833         WERROR netr_LogonControl2(
834                 [in]    [string,charset(UTF16)] uint16 *logon_server,
835                 [in]    uint32 function_code,
836                 [in]    uint32 level,
837                 [in][switch_is(function_code)] netr_CONTROL_DATA_INFORMATION  data,
838                 [out,ref][switch_is(level)]        netr_CONTROL_QUERY_INFORMATION *query
839                 );
840
841
842         /* If this flag is not set, then the passwords and LM session keys are
843          * encrypted with DES calls.  (And the user session key is
844          * unencrypted) */ 
845         const int NETLOGON_NEG_ARCFOUR  = 0x00000004;
846         const int NETLOGON_NEG_128BIT   = 0x00004000;
847         const int NETLOGON_NEG_SCHANNEL = 0x40000000;
848
849         /*****************/
850         /* Function 0x0F */
851
852         NTSTATUS netr_ServerAuthenticate2(
853                 [in]         [string,charset(UTF16)] uint16 *server_name,
854                 [in]         [string,charset(UTF16)] uint16 account_name[],
855                 [in]         netr_SchannelType secure_channel_type,
856                 [in]         [string,charset(UTF16)] uint16 computer_name[],
857                 [in,out,ref] netr_Credential *credentials,
858                 [in,out,ref] uint32 *negotiate_flags
859                 );
860
861
862         /*****************/
863         /* Function 0x10 */
864
865         NTSTATUS netr_DatabaseSync2(
866                 [in]     [string,charset(UTF16)] uint16 logon_server[],
867                 [in]     [string,charset(UTF16)] uint16 computername[],
868                 [in]     netr_Authenticator credential,
869                 [in,out,ref] netr_Authenticator *return_authenticator,
870                 [in]     netr_SamDatabaseID database_id,
871                 [in]     uint16 restart_state,
872                 [in,out,ref] uint32 *sync_context,
873                 [in]     uint32 preferredmaximumlength,
874                 [out]    netr_DELTA_ENUM_ARRAY *delta_enum_array
875                 );
876
877
878         /*****************/
879         /* Function 0x11 */
880
881         /* i'm not at all sure how this call works */
882
883         NTSTATUS netr_DatabaseRedo(
884                 [in]     [string,charset(UTF16)] uint16 logon_server[],
885                 [in]     [string,charset(UTF16)] uint16 computername[],
886                 [in]     netr_Authenticator credential,
887                 [in,out,ref] netr_Authenticator *return_authenticator,
888                 [in][size_is(change_log_entry_size)] uint8 *change_log_entry,
889                 [in]     uint32 change_log_entry_size,
890                 [out]    netr_DELTA_ENUM_ARRAY *delta_enum_array
891                 );
892
893
894         /*****************/
895         /* Function 0x12 */
896
897         WERROR netr_LogonControl2Ex(
898                 [in]   [string,charset(UTF16)] uint16 *logon_server,
899                 [in]   uint32 function_code,
900                 [in]   uint32 level,
901                 [in][switch_is(function_code)] netr_CONTROL_DATA_INFORMATION  data,
902                 [out,ref][switch_is(level)]        netr_CONTROL_QUERY_INFORMATION *query
903                 );
904
905         /*****************/
906         /* Function 0x13 */
907         WERROR netr_NETRENUMERATETRUSTEDDOMAINS() ;
908
909         /*****************/
910         /* Function 0x14 */             
911         typedef struct {
912                 [string,charset(UTF16)] uint16 *dc_unc;
913                 [string,charset(UTF16)] uint16 *dc_address;
914                 int32 dc_address_type;
915                 GUID domain_guid;
916                 [string,charset(UTF16)] uint16 *domain_name;
917                 [string,charset(UTF16)] uint16 *forest_name;
918                 uint32 dc_flags;
919                 [string,charset(UTF16)] uint16 *dc_site_name;
920                 [string,charset(UTF16)] uint16 *client_site_name;
921         } netr_DsRGetDCNameInfo;
922
923         WERROR netr_DsRGetDCName(
924                 [in] [string,charset(UTF16)] uint16 *server_unc,
925                 [in] [string,charset(UTF16)] uint16 *domain_name,
926                 [in] GUID *domain_guid,
927                 [in] GUID *site_guid,
928                 [in] uint32 flags,
929                 [out] netr_DsRGetDCNameInfo *info
930                 );
931
932         /*****************/
933         /* Function 0x15 */
934         WERROR netr_NETRLOGONDUMMYROUTINE1();
935
936         /****************/
937         /* Function 0x16 */
938         WERROR netr_NETRLOGONSETSERVICEBITS();
939
940         /****************/
941         /* Function 0x17 */
942         WERROR netr_NETRLOGONGETTRUSTRID();
943
944         /****************/
945         /* Function 0x18 */
946         WERROR netr_NETRLOGONCOMPUTESERVERDIGEST();
947
948         /****************/
949         /* Function 0x19 */
950         WERROR netr_NETRLOGONCOMPUTECLIENTDIGEST();
951
952         /****************/
953         /* Function 0x1a */
954         NTSTATUS netr_ServerAuthenticate3(
955                 [in]         [string,charset(UTF16)] uint16 *server_name,
956                 [in]         [string,charset(UTF16)] uint16 account_name[],
957                 [in]         netr_SchannelType secure_channel_type,
958                 [in]         [string,charset(UTF16)] uint16 computer_name[],
959                 [in,out,ref] netr_Credential *credentials,
960                 [in,out,ref] uint32 *negotiate_flags,
961                 [out,ref]    uint32 *rid
962                 );
963
964         /****************/
965         /* Function 0x1b */
966
967         WERROR netr_DsRGetDCNameEx(
968                 [in] [string,charset(UTF16)] uint16 *server_unc,
969                 [in] [string,charset(UTF16)] uint16 *domain_name,
970                 [in] GUID *domain_guid,
971                 [in] [string,charset(UTF16)] uint16 *site_name,
972                 [in] uint32 flags,
973                 [out] netr_DsRGetDCNameInfo *info
974                 );
975
976         /****************/
977         /* Function 0x1c */
978         WERROR netr_DsRGetSiteName(
979                 [in] [string,charset(UTF16)] uint16 *computer_name,
980                 [out,ref] [string,charset(UTF16)] uint16 **site
981                 );
982
983         /****************/
984         /* Function 0x1d */
985
986         typedef struct {
987                 uint32 length;
988                 [size_is(length)] uint8 *data;
989         } netr_Blob;
990
991         typedef [flag(NDR_PAHEX)] struct {
992                 uint16 length;
993                 uint16 size;
994                 [size_is(size/2),length_is(length/2)] uint16 *data;
995         } netr_BinaryString;
996
997         typedef struct {
998                 netr_Blob blob;
999                 [string,charset(UTF16)] uint16 *workstation_domain;
1000                 [string,charset(UTF16)] uint16 *workstation_site;
1001                 [string,charset(UTF16)] uint16 *unknown1;
1002                 [string,charset(UTF16)] uint16 *unknown2;
1003                 [string,charset(UTF16)] uint16 *unknown3;
1004                 [string,charset(UTF16)] uint16 *unknown4;
1005                 netr_BinaryString blob2;
1006                 lsa_String product;
1007                 lsa_String unknown5;
1008                 lsa_String unknown6;
1009                 uint32 unknown7[4];
1010         } netr_DomainQuery1;
1011
1012         typedef union {
1013                 [case(1)] netr_DomainQuery1 *query1;
1014                 [case(2)] netr_DomainQuery1 *query1;
1015         } netr_DomainQuery;
1016
1017         typedef struct {
1018                 lsa_String domainname;
1019                 lsa_String fulldomainname;
1020                 lsa_String forest;
1021                 GUID        guid;
1022                 dom_sid2    *sid;
1023                 netr_BinaryString unknown1[4];
1024                 uint32      unknown[4];
1025         } netr_DomainTrustInfo;
1026
1027         typedef struct {
1028                 netr_DomainTrustInfo domaininfo;
1029                 uint32 num_trusts;
1030                 [size_is(num_trusts)] netr_DomainTrustInfo *trusts;
1031                 uint32 unknown[14]; /* room for expansion? */
1032         } netr_DomainInfo1;
1033
1034         typedef union {
1035                 [case(1)] netr_DomainInfo1 *info1;
1036                 [case(2)] netr_DomainInfo1 *info1;
1037         } netr_DomainInfo;
1038         
1039         NTSTATUS netr_LogonGetDomainInfo(
1040                 [in]         [string,charset(UTF16)] uint16 server_name[],
1041                 [in]         [string,charset(UTF16)] uint16 *computer_name,
1042                 [in,ref]     netr_Authenticator *credential,
1043                 [in,out,ref] netr_Authenticator *return_authenticator,
1044                 [in]         uint32 level,
1045                 [in,switch_is(level)] netr_DomainQuery query,
1046                 [out,ref,switch_is(level)] netr_DomainInfo *info
1047                 );
1048
1049         typedef [flag(NDR_PAHEX)] struct {
1050                 uint8 data[512];
1051                 uint32 length;
1052         } netr_CryptPassword;
1053
1054         /*****************/
1055         /* Function 0x1e */
1056         NTSTATUS netr_ServerPasswordSet2(
1057                 [in]  [string,charset(UTF16)] uint16 *server_name,
1058                 [in]  [string,charset(UTF16)] uint16 account_name[],
1059                 [in]  netr_SchannelType secure_channel_type,
1060                 [in]  [string,charset(UTF16)] uint16 computer_name[],
1061                 [in]  netr_Authenticator credential,
1062                 [in]  netr_CryptPassword new_password,
1063                 [out,ref] netr_Authenticator *return_authenticator
1064                 );
1065
1066         /****************/
1067         /* Function 0x1f */
1068         WERROR netr_NETRSERVERPASSWORDGET();
1069
1070         /****************/
1071         /* Function 0x20 */
1072         WERROR netr_NETRLOGONSENDTOSAM();
1073
1074         /****************/
1075         /* Function 0x21 */
1076         WERROR netr_DSRADDRESSTOSITENAMESW();
1077
1078         /****************/
1079         /* Function 0x22 */
1080         WERROR netr_DsRGetDCNameEx2(
1081                 [in] [string,charset(UTF16)] uint16 *server_unc,
1082                 [in] [string,charset(UTF16)] uint16 *client_account,
1083                 [in] uint32 mask,
1084                 [in] [string,charset(UTF16)] uint16 *domain_name,
1085                 [in] GUID *domain_guid,
1086                 [in] [string,charset(UTF16)] uint16 *site_name,
1087                 [in] uint32 flags,
1088                 [out] netr_DsRGetDCNameInfo *info
1089                 );
1090
1091         /****************/
1092         /* Function 0x23 */
1093         WERROR netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN();
1094
1095         /****************/
1096         /* Function 0x24 */
1097         WERROR netr_NETRENUMERATETRUSTEDDOMAINSEX();
1098
1099         /****************/
1100         /* Function 0x25 */
1101         WERROR netr_DSRADDRESSTOSITENAMESEXW();
1102
1103         /****************/
1104         /* Function 0x26 */
1105         WERROR netr_DSRGETDCSITECOVERAGEW();
1106
1107         /****************/
1108         /* Function 0x27 */
1109         NTSTATUS netr_LogonSamLogonEx(
1110                 [in] [string,charset(UTF16)] uint16 *server_name,
1111                 [in] [string,charset(UTF16)] uint16 *computer_name,
1112                 [in]  uint16 logon_level,
1113                 [in]  [switch_is(logon_level)] netr_LogonLevel logon,
1114                 [in]  uint16 validation_level,
1115                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
1116                 [out,ref] uint8 *authoritative,
1117                 [in,out,ref] uint32 *flags
1118                 );
1119
1120         /****************/
1121         /* Function 0x28 */
1122
1123         typedef [bitmap32bit] bitmap {
1124                 NETR_TRUST_FLAG_IN_FOREST = 0x00000001,
1125                 NETR_TRUST_FLAG_OUTBOUND  = 0x00000002,
1126                 NETR_TRUST_FLAG_TREEROOT  = 0x00000004,
1127                 NETR_TRUST_FLAG_PRIMARY   = 0x00000008,
1128                 NETR_TRUST_FLAG_NATIVE    = 0x00000010,
1129                 NETR_TRUST_FLAG_INBOUND   = 0x00000020
1130         } netr_TrustFlags;
1131
1132         typedef [v1_enum] enum {
1133                 NETR_TRUST_TYPE_DOWNLEVEL       = 1,
1134                 NETR_TRUST_TYPE_UPLEVEL         = 2,
1135                 NETR_TRUST_TYPE_MIT             = 3,
1136                 NETR_TRUST_TYPE_DCE             = 4
1137         } netr_TrustType;
1138
1139         typedef [bitmap32bit] bitmap {
1140                 NETR_TRUST_ATTRIBUTE_NON_TRANSITIVE     = 0x00000001,
1141                 NETR_TRUST_ATTRIBUTE_UPLEVEL_ONLY       = 0x00000002,
1142                 NETR_TRUST_ATTRIBUTE_QUARANTINED_DOMAIN = 0x00000004,
1143                 NETR_TRUST_ATTRIBUTE_FOREST_TRANSITIVE  = 0x00000008,
1144                 NETR_TRUST_ATTRIBUTE_CROSS_ORGANIZATION = 0x00000010,
1145                 NETR_TRUST_ATTRIBUTE_WITHIN_FOREST      = 0x00000020,
1146                 NETR_TRUST_ATTRIBUTE_TREAT_AS_EXTERNAL  = 0x00000040
1147         } netr_TrustAttributes;
1148
1149         typedef struct {
1150                 [string,charset(UTF16)] uint16                  *netbios_name;
1151                 [string,charset(UTF16)] uint16                  *dns_name;
1152                 netr_TrustFlags         trust_flags;
1153                 uint32                  parent_index;
1154                 netr_TrustType          trust_type;
1155                 netr_TrustAttributes    trust_attributes;
1156                 dom_sid2                *sid;
1157                 GUID                    guid;
1158         } netr_DomainTrust;
1159
1160         WERROR netr_DsrEnumerateDomainTrusts(
1161                 [in]                 [string,charset(UTF16)] uint16           *server_name,
1162                 [in]                 netr_TrustFlags  trust_flags,
1163                 [out,ref]                uint32           *count,
1164                 [out,ref,size_is(count)] netr_DomainTrust **trusts
1165                 );
1166
1167
1168         /****************/
1169         /* Function 0x29 */
1170         WERROR netr_DSRDEREGISTERDNSHOSTRECORDS();
1171
1172         /****************/
1173         /* Function 0x2a */
1174         WERROR netr_NETRSERVERTRUSTPASSWORDSGET();
1175
1176         /****************/
1177         /* Function 0x2b */
1178         WERROR netr_DSRGETFORESTTRUSTINFORMATION();
1179
1180         /****************/
1181         /* Function 0x2c */
1182         WERROR netr_NETRGETFORESTTRUSTINFORMATION();
1183
1184         /****************/
1185         /* Function 0x2d */
1186
1187         /* this is the ADS varient. I don't yet know what the "flags" are for */
1188         NTSTATUS netr_LogonSamLogonWithFlags(
1189                 [in] [string,charset(UTF16)] uint16 *server_name,
1190                 [in] [string,charset(UTF16)] uint16 *computer_name,
1191                 [in] netr_Authenticator *credential,
1192                 [in][out] netr_Authenticator *return_authenticator,
1193                 [in]  uint16 logon_level,
1194                 [in]  [switch_is(logon_level)] netr_LogonLevel logon,
1195                 [in]  uint16 validation_level,
1196                 [out,ref] [switch_is(validation_level)] netr_Validation *validation,
1197                 [out,ref] uint8 *authoritative,
1198                 [in,out,ref] uint32 *flags
1199                 );
1200
1201         /****************/
1202         /* Function 0x2e */
1203         WERROR netr_NETRSERVERGETTRUSTINFO();
1204 }