r364: finally worked out the ancient samr_ChangePasswordUser() interface
[jelmer/samba4-debian.git] / source / librpc / idl / samr.idl
1 #include "idl_types.h"
2
3 /*
4   samr interface definition
5 */
6
7 /*
8   Thanks to Todd Sabin for some information from his samr.idl in acltools
9 */
10
11 [ uuid(12345778-1234-abcd-ef00-0123456789ac),
12   version(1.0),
13   pointer_default(unique)
14 ] interface samr
15 {
16         /******************/
17         /* Function: 0x00 */
18         NTSTATUS samr_Connect (
19                 /* notice the lack of [string] */
20                 [in]       uint16 *system_name,
21                 [in]       uint32 access_mask,
22                 [out,ref]  policy_handle *handle
23                 );
24
25
26         /******************/
27         /* Function: 0x01 */
28         NTSTATUS samr_Close (
29                 [in,out,ref]  policy_handle *handle
30                 );
31
32         /******************/
33         /* Function: 0x02 */
34
35         typedef struct {
36                 [value(ndr_size_security_descriptor(r->sd))] uint32 sd_size;
37                 [subcontext(4)] security_descriptor *sd;
38         } samr_SdBuf;
39
40         NTSTATUS samr_SetSecurity (
41                 [in,ref]          policy_handle *handle,
42                 [in]              uint32 sec_info,
43                 [in,ref]          samr_SdBuf *sdbuf
44                 );
45
46         /******************/
47         /* Function: 0x03 */
48
49         NTSTATUS samr_QuerySecurity (
50                 [in,ref]          policy_handle *handle,
51                 [in]              uint32 sec_info,
52                 [out]             samr_SdBuf *sdbuf
53                 );
54
55         /******************/
56         /* Function: 0x04 */
57
58         /*
59           shutdown the SAM - once you call this the SAM will be dead
60         */
61         NTSTATUS samr_Shutdown (
62                 [in,ref]   policy_handle *handle
63                 );
64
65         /******************/
66         /* Function: 0x05 */
67         typedef struct {
68                 [value(2*strlen_m(r->name))] uint16 name_len;
69                 [value(r->name_len)] uint16 name_size;
70                 unistr_noterm *name;
71         } samr_Name;    
72
73         NTSTATUS samr_LookupDomain (
74                 [in,ref]  policy_handle *handle,                
75                 [in,ref]  samr_Name *domain,
76                 [out]     dom_sid2 *sid
77                 );
78
79
80         /******************/
81         /* Function: 0x06 */
82
83         typedef struct {
84                 uint32 idx;
85                 samr_Name name;
86         } samr_SamEntry;
87
88         typedef struct {
89                 uint32 count;
90                 [size_is(count)] samr_SamEntry *entries;
91         } samr_SamArray;
92
93         NTSTATUS samr_EnumDomains (
94                 [in,ref]      policy_handle *handle,
95                 [in,out,ref]  uint32 *resume_handle,
96                 [in]          uint32 buf_size,
97                 [out]         samr_SamArray *sam,
98                 [out]         uint32 num_entries
99                 );
100
101
102         /************************/
103         /* Function    0x07     */
104         NTSTATUS samr_OpenDomain(
105                 [in,ref]      policy_handle *handle,
106                 [in]          uint32 access_mask,
107                 [in,ref]      dom_sid2 *sid,
108                 [out,ref]     policy_handle *domain_handle
109                 );
110
111         /************************/
112         /* Function    0x08     */
113
114         typedef struct {
115                 uint16 min_length_password;
116                 uint16 password_history;
117                 uint32 flag;
118                 NTTIME expire;
119                 NTTIME min_passwordage;
120         } samr_DomInfo1;
121
122         typedef struct {
123                 ULONG8 force_logoff_time;
124                 samr_Name comment;
125                 samr_Name domain;  /* domain name */
126                 samr_Name primary; /* PDC name if this is a BDC */
127                 HYPER_T sequence_num;
128                 uint32 unknown2;
129                 uint32 role;
130                 uint32 unknown3;
131                 uint32 num_users;
132                 uint32 num_groups;
133                 uint32 num_aliases;
134         } samr_DomInfo2;
135
136         typedef struct {
137                 ULONG8 force_logoff_time;
138         } samr_DomInfo3;
139
140         typedef struct {
141                 /* I'm not entirely sure this is a comment. win2003
142                    allows it to be set, and it seems harmless (like a
143                    comment) but I haven't seen it show up anywhere */
144                 samr_Name comment;
145         } samr_DomInfo4;
146
147         typedef struct {
148                 samr_Name domain;
149         } samr_DomInfo5;
150
151         typedef struct {
152                 samr_Name primary;
153         } samr_DomInfo6;
154
155         typedef struct {
156                 uint32 role;
157         } samr_DomInfo7;
158
159         typedef struct {
160                 HYPER_T sequence_num;
161                 NTTIME last_xxx_time;
162         } samr_DomInfo8;
163
164         typedef struct {
165                 uint32 unknown; /* w2k3 returns 1 */
166         } samr_DomInfo9;
167
168         typedef struct {
169                 ULONG8 force_logoff_time;
170                 samr_Name comment;
171                 samr_Name domain;
172                 samr_Name primary;
173                 HYPER_T sequence_num;
174                 uint32 unknown2;  /* w2k3 returns 1 */
175                 uint32 role;
176                 uint32 unknown3;  /* w2k3 returns 1 */
177                 uint32 num_users;
178                 uint32 num_groups;
179                 uint32 num_aliases;
180                 HYPER_T lockout_duration;
181                 HYPER_T lockout_window;
182                 uint16 lockout_threshold;
183         } samr_DomInfo11;
184
185         typedef struct {
186                 HYPER_T lockout_duration;
187                 HYPER_T lockout_window;
188                 uint16 lockout_threshold;
189         } samr_DomInfo12;
190
191         typedef struct {
192                 HYPER_T sequence_num;
193                 NTTIME last_xxx_time;
194                 uint32 unknown1;
195                 uint32 unknown2;
196         } samr_DomInfo13;
197
198         typedef union {
199                 [case(1)] samr_DomInfo1 info1;
200                 [case(2)] samr_DomInfo2 info2;
201                 [case(3)] samr_DomInfo3 info3;
202                 [case(4)] samr_DomInfo4 info4;
203                 [case(5)] samr_DomInfo5 info5;
204                 [case(6)] samr_DomInfo6 info6;
205                 [case(7)] samr_DomInfo7 info7;
206                 [case(8)] samr_DomInfo8 info8;
207                 [case(9)] samr_DomInfo9 info9;
208                 [case(11)] samr_DomInfo11 info11;
209                 [case(12)] samr_DomInfo12 info12;
210                 [case(13)] samr_DomInfo13 info13;
211         } samr_DomainInfo;
212
213         NTSTATUS samr_QueryDomainInfo(
214                 [in,ref]      policy_handle *handle,
215                 [in]          uint16 level,
216                 [out,switch_is(level)] samr_DomainInfo *info
217                 );
218
219         /************************/
220         /* Function    0x09     */
221         /*
222           only levels 1, 3, 4, 6, 7, 9, 12 are valid for this 
223           call in w2k3
224         */
225         NTSTATUS samr_SetDomainInfo(
226                 [in,ref]      policy_handle *handle,
227                 [in]          uint16 level,
228                 [in,switch_is(level),ref] samr_DomainInfo *info
229                 );
230
231
232         /************************/
233         /* Function    0x0a     */
234         NTSTATUS samr_CreateDomainGroup(
235                 [in,ref]      policy_handle *handle,
236                 [in,ref]      samr_Name *name,
237                 [in]          uint32 access_mask,
238                 [out,ref]     policy_handle *group_handle,
239                 [out,ref]     uint32 *rid
240                 );
241                 
242
243         /************************/
244         /* Function    0x0b     */
245         NTSTATUS samr_EnumDomainGroups(
246                 [in,ref]      policy_handle *handle,
247                 [in,out,ref]  uint32 *resume_handle,
248                 [in]          uint32 max_size,
249                 [out]         samr_SamArray *sam,
250                 [out]         uint32 num_entries
251                 );
252
253         /************************/
254         /* Function    0x0c     */
255         NTSTATUS samr_CreateUser(
256                 [in,ref]      policy_handle *handle,
257                 [in,ref]      samr_Name *username,
258                 [in]          uint32 access_mask,
259                 [out,ref]     policy_handle *acct_handle,
260                 [out,ref]     uint32 *rid
261                 );
262
263         /************************/
264         /* Function    0x0d     */
265         NTSTATUS samr_EnumDomainUsers(
266                 [in,ref]      policy_handle *handle,
267                 [in,out,ref]  uint32 *resume_handle,
268                 [in]          uint32 acct_flags,
269                 [in]          uint32 max_size,
270                 [out]         samr_SamArray *sam,
271                 [out]         uint32 num_entries
272                 );
273
274         /************************/
275         /* Function    0x0e     */
276         NTSTATUS samr_CreateDomAlias(
277                 [in,ref]      policy_handle *handle,
278                 [in,ref]      samr_Name     *aliasname,
279                 [in]          uint32         access_mask,
280                 [out,ref]     policy_handle *acct_handle,
281                 [out,ref]     uint32        *rid
282                 );
283
284         /************************/
285         /* Function    0x0f     */
286         NTSTATUS samr_EnumDomainAliases(
287                 [in,ref]      policy_handle *handle,
288                 [in,out,ref]  uint32 *resume_handle,
289                 [in]          uint32 max_size,
290                 [out]         samr_SamArray *sam,
291                 [out]         uint32 num_entries
292                 );
293
294         /************************/
295         /* Function    0x10     */
296
297         typedef struct {
298                 uint32 count;
299                 [size_is(count)] uint32 *ids;
300         } samr_Ids;
301
302         NTSTATUS samr_GetAliasMembership(
303                 [in,ref]      policy_handle *handle,
304                 [in,ref]      lsa_SidArray  *sids,
305                 [out]         samr_Ids *rids
306                 );
307
308         /************************/
309         /* Function    0x11     */
310
311         NTSTATUS samr_LookupNames(
312                 [in,ref]      policy_handle *handle,
313                 [in]          uint32 num_names,
314                 [in,ref,size_is(1000),length_is(num_names)] samr_Name *names,
315                 [out]         samr_Ids rids,
316                 [out]         samr_Ids types
317                 );
318
319
320         /************************/
321         /* Function    0x12     */
322
323         typedef struct {
324                 uint32 count;
325                 [size_is(count)] samr_Name *names;
326         } samr_Names;
327
328         NTSTATUS samr_LookupRids(
329                 [in,ref]      policy_handle *handle,
330                 [in]          uint32 num_rids,
331                 [in,ref,size_is(1000),length_is(num_rids)] uint32 *rids,
332                 [out]         samr_Names names,
333                 [out]         samr_Ids types
334                 );
335
336         /************************/
337         /* Function    0x13     */
338         NTSTATUS samr_OpenGroup(
339                 [in,ref]      policy_handle *handle,
340                 [in]          uint32 access_mask,
341                 [in]          uint32 rid,
342                 [out,ref]     policy_handle *acct_handle
343                 );
344
345
346         /************************/
347         /* Function    0x14     */
348
349         typedef struct {
350                 samr_Name name;
351                 uint32 unknown;
352                 uint32 num_members;
353                 samr_Name description;
354         } samr_GroupInfoAll;
355
356         typedef struct {
357                 uint32 unknown;
358         } samr_GroupInfoX;
359
360         typedef struct {
361                 samr_Name description;
362         } samr_GroupInfoDesciption;
363
364         typedef enum {
365                 GroupInfoAll = 1,
366                 GroupInfoName,
367                 GroupInfoX,
368                 GroupInfoDescription
369         } GroupInfo;
370
371         typedef union {
372                 [case(GroupInfoAll)]         samr_GroupInfoAll    all;
373                 [case(GroupInfoName)]        samr_Name            name;
374                 [case(GroupInfoX)]           samr_GroupInfoX      unknown;
375                 [case(GroupInfoDescription)] samr_Name            description;
376         } samr_GroupInfo;
377
378         NTSTATUS samr_QueryGroupInfo(
379                 [in,ref]                  policy_handle *handle,
380                 [in]                      uint16 level,
381                 [out,switch_is(level)]    samr_GroupInfo *info
382                 );
383
384         /************************/
385         /* Function    0x15     */
386         NTSTATUS samr_SetGroupInfo(
387                 [in,ref]                  policy_handle *handle,
388                 [in]                      uint16 level,
389                 [in,switch_is(level),ref] samr_GroupInfo *info
390                 );
391
392         /************************/
393         /* Function    0x16     */
394         NTSTATUS samr_AddGroupMember(
395                 [in,ref]                  policy_handle *handle,
396                 [in]                      uint32 rid,
397                 [in]                      uint32 flags
398                 );
399
400         /************************/
401         /* Function    0x17     */
402         NTSTATUS samr_DeleteDomainGroup(
403                 [in,out,ref]   policy_handle *handle
404                 );
405
406         /************************/
407         /* Function    0x18     */
408         NTSTATUS samr_DeleteGroupMember(
409                 [in,ref]                  policy_handle *handle,
410                 [in]                      uint32 rid
411                 );
412
413
414         /************************/
415         /* Function    0x19     */
416         /*
417           this isn't really valid IDL, but it does work. I suspect
418           I need to do some more pidl work to get this really right
419         */
420         typedef struct {
421                 uint32 count;
422                 uint32 v[count];
423         } samr_intArray;
424
425         typedef struct {
426                 samr_intArray *rids;
427                 samr_intArray *unknown7;
428         } samr_ridArray;
429
430         NTSTATUS samr_QueryGroupMember(
431                 [in,ref]  policy_handle *handle,
432                 [out]     uint32 *count,
433                 [out]     samr_ridArray rids
434                 );
435
436
437         /************************/
438         /* Function    0x1a     */
439
440         /*
441           win2003 seems to accept any data at all for the two integers
442           below, and doesn't seem to do anything with them that I can
443           see. Weird. I really expected the first integer to be a rid
444           and the second to be the attributes for that rid member.
445         */
446         NTSTATUS samr_SetMemberAttributesOfGroup(
447                 [in,ref]  policy_handle *handle,
448                 [in]      uint32 unknown1,
449                 [in]      uint32 unknown2
450                 );
451
452
453         /************************/
454         /* Function    0x1b     */
455         NTSTATUS samr_OpenAlias (
456                 [in,ref]      policy_handle *handle,
457                 [in]          uint32 access_mask,
458                 [in]          uint32 rid,
459                 [out,ref]     policy_handle *acct_handle
460                 );
461
462
463         /************************/
464         /* Function    0x1c     */
465
466         typedef struct {
467                 samr_Name name;
468                 uint32 num_members;
469                 samr_Name description;
470         } samr_AliasInfoAll;
471
472         typedef union {
473                 [case(1)] samr_AliasInfoAll all;
474                 [case(2)] samr_Name name;
475                 [case(3)] samr_Name description;
476         } samr_AliasInfo;
477
478         NTSTATUS samr_QueryAliasInfo(
479                 [in,ref]                  policy_handle *handle,
480                 [in]                      uint16 level,
481                 [out,switch_is(level)]    samr_AliasInfo *info
482                 );
483
484         /************************/
485         /* Function    0x1d     */
486         NTSTATUS samr_SetAliasInfo(
487                 [in,ref]                  policy_handle  *handle,
488                 [in]                      uint16          level,
489                 [in,switch_is(level)]     samr_AliasInfo  info
490                 );
491
492         /************************/
493         /* Function    0x1e     */
494         NTSTATUS samr_DeleteDomAlias(
495                 [in,out,ref]  policy_handle *handle
496                 );
497
498         /************************/
499         /* Function    0x1f     */
500         NTSTATUS samr_AddAliasMember(
501                 [in,ref]  policy_handle *handle,
502                 [in,ref]  dom_sid2      *sid
503                 );
504
505         /************************/
506         /* Function    0x20     */
507         NTSTATUS samr_DeleteAliasMember(
508                 [in,ref] policy_handle *handle,
509                 [in,ref] dom_sid2      *sid
510                 );
511
512         /************************/
513         /* Function    0x21     */
514         NTSTATUS samr_GetMembersInAlias(
515                 [in,ref]   policy_handle *handle,
516                 [out,ref]  lsa_SidArray    *sids
517                 );
518
519         /************************/
520         /* Function    0x22     */
521         NTSTATUS samr_OpenUser(
522                 [in,ref]      policy_handle *handle,
523                 [in]          uint32 access_mask,
524                 [in]          uint32 rid,
525                 [out,ref]     policy_handle *acct_handle
526                 );
527
528         /************************/
529         /* Function    0x23     */
530         NTSTATUS samr_DeleteUser(
531                 [in,out,ref]   policy_handle *handle
532                 );
533
534         /************************/
535         /* Function    0x24     */
536         typedef struct {
537                 samr_Name username;
538                 samr_Name full_name;
539                 uint32 primary_gid;
540                 samr_Name description;
541                 samr_Name comment;
542         } samr_UserInfo1;
543
544         typedef struct {
545                 samr_Name comment;
546                 samr_Name unknown; /* settable, but doesn't stick. probably obsolete */
547                 uint16 country_code;
548                 uint16 code_page;
549         } samr_UserInfo2;
550
551         typedef struct {
552                 samr_Name username;
553                 samr_Name full_name;
554                 uint32 Rid;
555                 uint32 primary_gid;
556                 samr_Name home_directory;
557                 samr_Name home_drive;
558                 samr_Name logon_script;
559                 samr_Name profile;
560                 samr_Name workstations;
561                 NTTIME last_logon;
562                 NTTIME last_logoff;
563                 NTTIME last_pwd_change;
564                 NTTIME allow_pwd_change;
565                 NTTIME force_pwd_change;
566                 samr_LogonHours logon_hours;
567                 uint16 bad_pwd_count;
568                 uint16 num_logons;
569                 uint32 acct_flags;
570         } samr_UserInfo3;
571
572         typedef struct {
573                 samr_LogonHours logon_hours;
574         } samr_UserInfo4;
575
576         typedef struct {
577                 samr_Name username;
578                 samr_Name full_name;
579                 uint32 rid;
580                 uint32 primary_gid;
581                 samr_Name home_directory;
582                 samr_Name home_drive;
583                 samr_Name logon_script;
584                 samr_Name profile;
585                 samr_Name description;
586                 samr_Name workstations;
587                 NTTIME last_logon;
588                 NTTIME last_logoff;
589                 samr_LogonHours logon_hours;
590                 uint16 bad_pwd_count;
591                 uint16 num_logons;
592                 NTTIME last_pwd_change;
593                 NTTIME acct_expiry;
594                 uint32 acct_flags;
595         } samr_UserInfo5;
596
597         typedef struct {
598                 samr_Name username;
599                 samr_Name full_name;
600         } samr_UserInfo6;
601
602         typedef struct {
603                 samr_Name username;
604         } samr_UserInfo7;
605
606         typedef struct {
607                 samr_Name full_name;
608         } samr_UserInfo8;
609
610         typedef struct {
611                 uint32 primary_gid;
612         } samr_UserInfo9;
613
614         typedef struct {
615                 samr_Name home_dir;
616                 samr_Name home_drive;
617         } samr_UserInfo10;
618
619         typedef struct {
620                 samr_Name logon_script;
621         } samr_UserInfo11;
622
623         typedef struct {
624                 samr_Name profile;
625         } samr_UserInfo12;
626
627         typedef struct {
628                 samr_Name description;
629         } samr_UserInfo13;
630
631         typedef struct {
632                 samr_Name workstations;
633         } samr_UserInfo14;
634
635         typedef struct {
636                 uint32 acct_flags;
637         } samr_UserInfo16;
638         
639         typedef struct {
640                 NTTIME acct_expiry;
641         } samr_UserInfo17;
642
643         typedef struct {
644                 samr_Name callback;
645         } samr_UserInfo20;
646
647         typedef struct {
648                 NTTIME last_logon;
649                 NTTIME last_logoff;
650                 NTTIME last_pwd_change;
651                 NTTIME acct_expiry;
652                 NTTIME allow_pwd_change;
653                 NTTIME force_pwd_change;
654                 samr_Name username;
655                 samr_Name full_name;
656                 samr_Name home_dir;
657                 samr_Name home_drive;
658                 samr_Name logon_script;
659                 samr_Name profile;
660                 samr_Name description;
661                 samr_Name workstations;
662                 samr_Name comment;
663                 samr_Name callback;
664                 samr_Name unknown1;
665                 samr_Name unknown2;
666                 samr_Name unknown3;
667                 uint32 buf_count;
668                 [size_is(buf_count)] uint8 *buffer;
669                 uint32 rid;
670                 uint32 primary_gid;
671                 uint32 acct_flags;
672                 uint32 fields_present;
673                 samr_LogonHours logon_hours;
674                 uint16 bad_pwd_count;
675                 uint16 num_logons;
676                 uint16 country_code;
677                 uint16 code_page;
678                 uint8  nt_pwd_set;
679                 uint8  lm_pwd_set;
680                 uint8  expired_flag;
681                 uint8  unknown4;
682         } samr_UserInfo21;
683
684         typedef [flag(NDR_PAHEX)] struct {
685                 uint8 data[516];
686         } samr_CryptPassword;
687
688         typedef struct {
689                 samr_CryptPassword password;
690                 uint16 pw_len;
691         } samr_UserInfo24;
692
693         typedef union {
694                 [case(1)] samr_UserInfo1 info1;
695                 [case(2)] samr_UserInfo2 info2;
696                 [case(3)] samr_UserInfo3 info3;
697                 [case(4)] samr_UserInfo4 info4;
698                 [case(5)] samr_UserInfo5 info5;
699                 [case(6)] samr_UserInfo6 info6;
700                 [case(7)] samr_UserInfo7 info7;
701                 [case(8)] samr_UserInfo8 info8;
702                 [case(9)] samr_UserInfo9 info9;
703                 [case(10)] samr_UserInfo10 info10;
704                 [case(11)] samr_UserInfo11 info11;
705                 [case(12)] samr_UserInfo12 info12;
706                 [case(13)] samr_UserInfo13 info13;
707                 [case(14)] samr_UserInfo14 info14;
708                 [case(16)] samr_UserInfo16 info16;
709                 [case(17)] samr_UserInfo17 info17;
710                 [case(20)] samr_UserInfo20 info20;
711                 [case(21)] samr_UserInfo21 info21;
712                 [case(24)] samr_UserInfo24 info24;
713         } samr_UserInfo;
714
715         NTSTATUS samr_QueryUserInfo(
716                 [in,ref]                  policy_handle *handle,
717                 [in]                      uint16 level,
718                 [out,switch_is(level)]    samr_UserInfo *info
719                 );
720
721
722         /************************/
723         /* Function    0x25     */
724         NTSTATUS samr_SetUserInfo(
725                 [in,ref]                   policy_handle *handle,
726                 [in]                       uint16 level,
727                 [in,ref,switch_is(level)]  samr_UserInfo *info
728                 );
729
730         /************************/
731         /* Function    0x26     */
732         
733         typedef [flag(NDR_PAHEX)] struct {
734                 uint8 hash[16];
735         } samr_Hash;
736
737         /*
738           this is a password change interface that doesn't give
739           the server the plaintext password. Depricated.
740         */
741         NTSTATUS samr_ChangePasswordUser(
742                 [in,ref]    policy_handle *handle,
743                 [in]        bool8 lm_present,
744                 [in]        samr_Hash *old_lm_crypted,
745                 [in]        samr_Hash *new_lm_crypted,
746                 [in]        bool8 nt_present,
747                 [in]        samr_Hash *old_nt_crypted,
748                 [in]        samr_Hash *new_nt_crypted,
749                 [in]        bool8 cross1_present,
750                 [in]        samr_Hash *nt_cross,
751                 [in]        bool8 cross2_present,
752                 [in]        samr_Hash *lm_cross
753                 );
754
755         /************************/
756         /* Function    0x27     */
757
758         typedef struct {
759                 uint32 rid;
760                 uint32 type;
761         } samr_RidType;
762
763         typedef struct {
764                 uint32     count;
765                 [size_is(count)] samr_RidType *rid;
766         } samr_RidArray;
767
768         NTSTATUS samr_GetGroupsForUser(
769                 [in,ref]   policy_handle *handle,
770                 [out]      samr_RidArray  *rids
771                 );
772
773         /************************/
774         /* Function    0x28     */
775
776         typedef struct {
777                 uint32    idx;
778                 uint32    rid;
779                 uint32    acct_flags;
780                 samr_Name account_name;
781                 samr_Name full_name;
782                 samr_Name description;
783         } samr_DispEntryGeneral;
784
785         typedef struct {
786                 uint32 count;
787                 [size_is(count)] samr_DispEntryGeneral *entries;
788         } samr_DispInfoGeneral;
789
790         typedef struct {
791                 uint32    idx;
792                 uint32    rid;
793                 uint32    acct_flags;
794                 samr_Name account_name;
795                 samr_Name description;
796         } samr_DispEntryFull;
797
798         typedef struct {
799                 uint32 count;
800                 [size_is(count)] samr_DispEntryFull *entries;
801         } samr_DispInfoFull;
802
803         typedef struct {
804                 [value(strlen_m(r->name))] uint16 name_len;
805                 [value(strlen_m(r->name))] uint16 name_size;
806                 ascstr_noterm *name;
807         } samr_AsciiName;       
808
809         typedef struct {
810                 uint32    idx;
811                 samr_AsciiName account_name;
812         } samr_DispEntryAscii;
813
814         typedef struct {
815                 uint32 count;
816                 [size_is(count)] samr_DispEntryAscii *entries;
817         } samr_DispInfoAscii;
818
819         typedef union {
820                 [case(1)] samr_DispInfoGeneral info1;/* users */
821                 [case(2)] samr_DispInfoFull info2; /* trust accounts? */
822                 [case(3)] samr_DispInfoFull info3; /* groups */
823                 [case(4)] samr_DispInfoAscii info4; /* users */
824                 [case(5)] samr_DispInfoAscii info5; /* groups */
825         } samr_DispInfo;
826
827         NTSTATUS samr_QueryDisplayInfo(
828                 [in,ref]    policy_handle *handle,
829                 [in]        uint16 level,
830                 [in]        uint32 start_idx,
831                 [in]        uint32 max_entries,
832                 [in]        uint32 buf_size,
833                 [out]       uint32 total_size,
834                 [out]       uint32 returned_size,
835                 [out,switch_is(level)] samr_DispInfo info
836                 );
837
838
839         /************************/
840         /* Function    0x29     */
841
842         /*
843           this seems to be an alphabetic search function. The returned index
844           is the index for samr_QueryDisplayInfo needed to get names occurring
845           after the specified name. The supplied name does not need to exist
846           in the database (for example you can supply just a first letter for 
847           searching starting at that letter)
848
849           The level corresponds to the samr_QueryDisplayInfo level
850         */
851         NTSTATUS samr_GetDisplayEnumerationIndex(
852                 [in,ref]    policy_handle *handle,
853                 [in]        uint16 level,
854                 [in]        samr_Name name,
855                 [out]       uint32 idx
856                 );
857
858
859
860         /************************/
861         /* Function    0x2a     */
862
863         /*
864           w2k3 returns NT_STATUS_NOT_IMPLEMENTED for this
865         */
866         NTSTATUS samr_TestPrivateFunctionsDomain(
867                 [in,ref]    policy_handle *handle
868                 );
869
870
871         /************************/
872         /* Function    0x2b     */
873
874         /*
875           w2k3 returns NT_STATUS_NOT_IMPLEMENTED for this
876         */
877         NTSTATUS samr_TestPrivateFunctionsUser(
878                 [in,ref]    policy_handle *handle
879                 );
880
881
882         /************************/
883         /* Function    0x2c     */
884
885         /* password properties flags */
886         const uint32 DOMAIN_PASSWORD_COMPLEX         = 0x00000001;
887         const uint32 DOMAIN_PASSWORD_NO_ANON_CHANGE  = 0x00000002;
888         const uint32 DOMAIN_PASSWORD_NO_CLEAR_CHANGE = 0x00000004;
889         const uint32 DOMAIN_PASSWORD_STORE_CLEARTEXT = 0x00000010;
890         const uint32 DOMAIN_REFUSE_PASSWORD_CHANGE   = 0x00000020;
891
892         typedef struct {
893                 uint16 min_pwd_len;
894                 uint32 password_properties;
895         } samr_PwInfo;
896
897         NTSTATUS samr_GetUserPwInfo(
898                 [in,ref]    policy_handle *handle,
899                 [out]       samr_PwInfo info
900                 );
901
902         /************************/
903         /* Function    0x2d     */
904         NTSTATUS samr_RemoveMemberFromForeignDomain(
905                 [in,ref]    policy_handle *handle,
906                 [in,ref]    dom_sid2 *sid
907                 );
908
909         /************************/
910         /* Function    0x2e     */
911
912         /*
913           how is this different from QueryDomainInfo ??
914         */
915         NTSTATUS samr_QueryDomainInfo2(
916                 [in,ref]      policy_handle *handle,
917                 [in]          uint16 level,
918                 [out,switch_is(level)] samr_DomainInfo *info
919                 );
920
921         /************************/
922         /* Function    0x2f     */
923
924         /*
925           how is this different from QueryUserInfo ??
926         */
927         NTSTATUS samr_QueryUserInfo2(
928                 [in,ref]                  policy_handle *handle,
929                 [in]                      uint16 level,
930                 [out,switch_is(level)]    samr_UserInfo *info
931                 );
932
933         /************************/
934         /* Function    0x30     */
935
936         /*
937           how is this different from QueryDisplayInfo??
938         */
939         NTSTATUS samr_QueryDisplayInfo2(
940                 [in,ref]    policy_handle *handle,
941                 [in]        uint16 level,
942                 [in]        uint32 start_idx,
943                 [in]        uint32 max_entries,
944                 [in]        uint32 buf_size,
945                 [out]       uint32 total_size,
946                 [out]       uint32 returned_size,
947                 [out,switch_is(level)] samr_DispInfo info
948                 );
949
950         /************************/
951         /* Function    0x31     */
952
953         /*
954           how is this different from GetDisplayEnumerationIndex ??
955         */
956         NTSTATUS samr_GetDisplayEnumerationIndex2(
957                 [in,ref]    policy_handle *handle,
958                 [in]        uint16 level,
959                 [in]        samr_Name name,
960                 [out]       uint32 idx
961                 );
962
963
964         /************************/
965         /* Function    0x32     */
966         NTSTATUS samr_CreateUser2(
967         /************************/
968                 [in,ref]      policy_handle *handle,
969                 [in,ref]      samr_Name *username,
970                 [in]          uint32 acct_flags,
971                 [in]          uint32 access_mask,
972                 [out,ref]     policy_handle *acct_handle,
973                 [out,ref]     uint32 *access_granted,
974                 [out,ref]     uint32 *rid
975                 );
976
977
978         /************************/
979         /* Function    0x33     */
980
981         /*
982           another duplicate. There must be a reason ....
983         */
984         NTSTATUS samr_QueryDisplayInfo3(
985                 [in,ref]    policy_handle *handle,
986                 [in]        uint16 level,
987                 [in]        uint32 start_idx,
988                 [in]        uint32 max_entries,
989                 [in]        uint32 buf_size,
990                 [out]       uint32 total_size,
991                 [out]       uint32 returned_size,
992                 [out,switch_is(level)] samr_DispInfo info
993                 );
994
995         /************************/
996         /* Function    0x34     */
997         NTSTATUS samr_AddMultipleMembersToAlias(
998                 [in,ref]    policy_handle *handle,
999                 [in,ref]    lsa_SidArray *sids
1000                 );
1001
1002         /************************/
1003         /* Function    0x35     */
1004         NTSTATUS samr_RemoveMultipleMembersFromAlias(
1005                 [in,ref]    policy_handle *handle,
1006                 [in,ref]    lsa_SidArray *sids
1007                 );
1008
1009         /************************/
1010         /* Function    0x36     */
1011
1012         NTSTATUS samr_OemChangePasswordUser2(
1013                 [in]              samr_AsciiName *server,
1014                 [in,ref]          samr_AsciiName *account,
1015                 [in]              samr_CryptPassword *password,
1016                 [in]              samr_Hash *hash
1017                 );
1018
1019         /************************/
1020         /* Function    0x37     */
1021         NTSTATUS samr_ChangePasswordUser2(
1022                 [in]              samr_Name *server,
1023                 [in,ref]          samr_Name *account,
1024                 [in]              samr_CryptPassword *nt_password,
1025                 [in]              samr_Hash *nt_verifier,
1026                 [in]              bool8 lm_change,
1027                 [in]              samr_CryptPassword *lm_password,
1028                 [in]              samr_Hash *lm_verifier
1029                 );
1030
1031         /************************/
1032         /* Function    0x38     */
1033         NTSTATUS samr_GetDomPwInfo(
1034                 [in]        samr_Name *name,
1035                 [out]       samr_PwInfo info
1036                 );
1037
1038         /************************/
1039         /* Function    0x39     */
1040         NTSTATUS samr_Connect2(
1041                 [in] unistr *system_name,
1042                 [in] uint32 access_mask,
1043                 [out,ref]  policy_handle *handle
1044                 );
1045
1046         /************************/
1047         /* Function    0x3a     */
1048         /*
1049           seems to be an exact alias for samr_SetUserInfo() 
1050         */
1051         NTSTATUS samr_SetUserInfo2(
1052                 [in,ref]                   policy_handle *handle,
1053                 [in]                       uint16 level,
1054                 [in,ref,switch_is(level)]  samr_UserInfo *info
1055                 );
1056
1057         /************************/
1058         /* Function    0x3b     */
1059         /*
1060           this one is mysterious. I have a few guesses, but nothing working yet
1061         */
1062         NTSTATUS samr_SetBootKeyInformation(
1063                 [in,ref]   policy_handle *handle,
1064                 [in]       uint32 unknown1,
1065                 [in]       uint32 unknown2,
1066                 [in]       uint32 unknown3
1067                 );
1068
1069         /************************/
1070         /* Function    0x3c     */
1071         NTSTATUS samr_GetBootKeyInformation(
1072                 [in,ref]   policy_handle *handle,
1073                 [out]      uint32 unknown
1074                 );
1075
1076         /************************/
1077         /* Function    0x3d     */
1078         NTSTATUS samr_Connect3(
1079                 [in] unistr *system_name,
1080                 [in] uint32 unknown,
1081                 [in] uint32 access_mask,
1082                 [out,ref]  policy_handle *handle
1083                 );
1084
1085         /************************/
1086         /* Function    0x3e     */
1087         NTSTATUS samr_Connect4(
1088                 [in] unistr *system_name,
1089                 [in] uint32 unknown,
1090                 [in] uint32 access_mask,
1091                 [out,ref]  policy_handle *handle
1092                 );
1093
1094         /************************/
1095         /* Function    0x3f     */
1096         NTSTATUS samr_ChangePasswordUser3(
1097                 [in]              samr_Name *server,
1098                 [in,ref]          samr_Name *account,
1099                 [in]              samr_CryptPassword *nt_password,
1100                 [in]              samr_Hash *nt_verifier,
1101                 [in]              bool8 lm_change,
1102                 [in]              samr_CryptPassword *lm_password,
1103                 [in]              samr_Hash *lm_verifier,
1104                 [in]              samr_CryptPassword *password3,
1105                 [out]             uint32 unknown1,
1106                 [out]             uint32 unknown2
1107                 );
1108
1109         /************************/
1110         /* Function    0x40      */
1111         NTSTATUS samr_Connect5(
1112                 [in]       unistr        *system_name,
1113                 [in]       uint32         access_mask,
1114                 [in]       uint32         unknown0,
1115                 [in]       uint32         unknown1,
1116                 [in]       uint32         unknown2,
1117                 [in]       uint32         unknown3,
1118                 [out]      uint32         unknown4,
1119                 [out]      uint32         unknown5,
1120                 [out]      uint32         unknown6,
1121                 [out]      uint32         unknown7,
1122                 [out,ref]  policy_handle *handle
1123                 );
1124
1125         /************************/
1126         /* Function    0x41     */
1127         NTSTATUS samr_RidToSid(
1128                 [in,ref]    policy_handle *handle,
1129                 [in]        uint32        rid,
1130                 [out]       dom_sid2      *sid
1131                 );
1132
1133
1134         /************************/
1135         /* Function    0x42     */
1136
1137         /*
1138           this should set the DSRM password for the server, which is used
1139           when booting into Directory Services Recovery Mode on a DC. Win2003
1140           gives me NT_STATUS_NOT_SUPPORTED
1141         */
1142
1143         NTSTATUS samr_SetDsrmPassword(
1144                 [in]       samr_Name *name,
1145                 [in]       uint32 unknown,
1146                 [in]       samr_Hash *hash
1147                 );
1148
1149
1150         /************************/
1151         /* Function    0x43     */
1152         /*
1153           I haven't been able to work out the format of this one yet.
1154           Seems to start with a switch level for a union?
1155         */
1156         NTSTATUS samr_ValidatePassword();
1157 }