1/*
2   Unix SMB/CIFS implementation.
3   SMB parameters and setup
4   Copyright (C) Andrew Tridgell              1992-2000
5   Copyright (C) Luke Kenneth Casson Leighton 1996-2000
6   Copyright (C) Paul Ashton                  1997-2000
7   Copyright (C) Jean Fran�ois Micouleau      1998-2001
8   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002
9
10
11   This program is free software; you can redistribute it and/or modify
12   it under the terms of the GNU General Public License as published by
13   the Free Software Foundation; either version 2 of the License, or
14   (at your option) any later version.
15
16   This program is distributed in the hope that it will be useful,
17   but WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   GNU General Public License for more details.
20
21   You should have received a copy of the GNU General Public License
22   along with this program; if not, write to the Free Software
23   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24*/
25
26#ifndef _RPC_SAMR_H /* _RPC_SAMR_H */
27#define _RPC_SAMR_H
28
29#include "rpc_misc.h"
30
31/*******************************************************************
32 the following information comes from a QuickView on samsrv.dll,
33 and gives an idea of exactly what is needed:
34
35x SamrAddMemberToAlias
36x SamrAddMemberToGroup
37SamrAddMultipleMembersToAlias
38x SamrChangePasswordUser
39x SamrCloseHandle
40x SamrConnect
41x SamrCreateAliasInDomain
42x SamrCreateGroupInDomain
43x SamrCreateUserInDomain
44? SamrDeleteAlias
45SamrDeleteGroup
46x SamrDeleteUser
47x SamrEnumerateAliasesInDomain
48SamrEnumerateDomainsInSamServer
49x SamrEnumerateGroupsInDomain
50x SamrEnumerateUsersInDomain
51SamrGetUserDomainPasswordInformation
52SamrLookupDomainInSamServer
53? SamrLookupIdsInDomain
54x SamrLookupNamesInDomain
55x SamrOpenAlias
56x SamrOpenDomain
57x SamrOpenGroup
58x SamrOpenUser
59x SamrQueryDisplayInformation
60x SamrQueryInformationAlias
61SamrQueryInformationDomain
62? SamrQueryInformationUser
63x SamrQuerySecurityObject
64SamrRemoveMemberFromAlias
65SamrRemoveMemberFromForiegnDomain
66SamrRemoveMemberFromGroup
67SamrRemoveMultipleMembersFromAlias
68x SamrSetInformationAlias
69SamrSetInformationDomain
70x SamrSetInformationGroup
71x SamrSetInformationUser
72SamrSetMemberAttributesOfGroup
73SamrSetSecurityObject
74SamrShutdownSamServer
75SamrTestPrivateFunctionsDomain
76SamrTestPrivateFunctionsUser
77
78********************************************************************/
79
80#define SAMR_CONNECT_ANON      0x00
81#define SAMR_CLOSE_HND         0x01
82#define SAMR_SET_SEC_OBJECT    0x02
83#define SAMR_QUERY_SEC_OBJECT  0x03
84
85#define SAMR_UNKNOWN_4         0x04 /* profile info? */
86#define SAMR_LOOKUP_DOMAIN     0x05
87#define SAMR_ENUM_DOMAINS      0x06
88#define SAMR_OPEN_DOMAIN       0x07
89#define SAMR_QUERY_DOMAIN_INFO 0x08
90#define SAMR_SET_DOMAIN_INFO   0x09
91
92#define SAMR_CREATE_DOM_GROUP  0x0a
93#define SAMR_ENUM_DOM_GROUPS   0x0b
94#define SAMR_ENUM_DOM_USERS    0x0d
95#define SAMR_CREATE_DOM_ALIAS  0x0e
96#define SAMR_ENUM_DOM_ALIASES  0x0f
97#define SAMR_QUERY_USERALIASES 0x10
98
99#define SAMR_LOOKUP_NAMES      0x11
100#define SAMR_LOOKUP_RIDS       0x12
101
102#define SAMR_OPEN_GROUP        0x13
103#define SAMR_QUERY_GROUPINFO   0x14
104#define SAMR_SET_GROUPINFO     0x15
105#define SAMR_ADD_GROUPMEM      0x16
106#define SAMR_DELETE_DOM_GROUP  0x17
107#define SAMR_DEL_GROUPMEM      0x18
108#define SAMR_QUERY_GROUPMEM    0x19
109#define SAMR_UNKNOWN_1A        0x1a
110
111#define SAMR_OPEN_ALIAS        0x1b
112#define SAMR_QUERY_ALIASINFO   0x1c
113#define SAMR_SET_ALIASINFO     0x1d
114#define SAMR_DELETE_DOM_ALIAS  0x1e
115#define SAMR_ADD_ALIASMEM      0x1f
116#define SAMR_DEL_ALIASMEM      0x20
117#define SAMR_QUERY_ALIASMEM    0x21
118
119#define SAMR_OPEN_USER         0x22
120#define SAMR_DELETE_DOM_USER   0x23
121#define SAMR_QUERY_USERINFO    0x24
122#define SAMR_SET_USERINFO2     0x25
123#define SAMR_QUERY_USERGROUPS  0x27
124
125#define SAMR_QUERY_DISPINFO    0x28
126#define SAMR_UNKNOWN_29        0x29
127#define SAMR_UNKNOWN_2a        0x2a
128#define SAMR_UNKNOWN_2b        0x2b
129#define SAMR_GET_USRDOM_PWINFO 0x2c
130#define SAMR_REMOVE_SID_FOREIGN_DOMAIN        0x2d
131#define SAMR_UNKNOWN_2E        0x2e /* looks like an alias for SAMR_QUERY_DOMAIN_INFO */
132#define SAMR_UNKNOWN_2f        0x2f
133#define SAMR_QUERY_DISPINFO3   0x30 /* Alias for SAMR_QUERY_DISPINFO
134				       with info level 3 */
135#define SAMR_UNKNOWN_31        0x31
136#define SAMR_CREATE_USER       0x32
137#define SAMR_QUERY_DISPINFO4   0x33 /* Alias for SAMR_QUERY_DISPINFO
138				       with info level 4 */
139#define SAMR_ADDMULTI_ALIASMEM 0x34
140
141#define SAMR_UNKNOWN_35        0x35
142#define SAMR_UNKNOWN_36        0x36
143#define SAMR_CHGPASSWD_USER    0x37
144#define SAMR_GET_DOM_PWINFO    0x38
145#define SAMR_CONNECT           0x39
146#define SAMR_SET_USERINFO      0x3A
147#define SAMR_CONNECT4          0x3E
148
149typedef struct logon_hours_info
150{
151	uint32 max_len; /* normally 1260 bytes */
152	uint32 offset;
153	uint32 len; /* normally 21 bytes */
154	uint8 hours[32];
155
156} LOGON_HRS;
157
158/* SAM_USER_INFO_23 */
159typedef struct sam_user_info_23
160{
161	/* TIMES MAY NOT IN RIGHT ORDER!!!! */
162	NTTIME logon_time;            /* logon time */
163	NTTIME logoff_time;           /* logoff time */
164	NTTIME kickoff_time;          /* kickoff time */
165	NTTIME pass_last_set_time;    /* password last set time */
166	NTTIME pass_can_change_time;  /* password can change time */
167	NTTIME pass_must_change_time; /* password must change time */
168
169	UNIHDR hdr_user_name;    /* NULL - user name unicode string header */
170	UNIHDR hdr_full_name;    /* user's full name unicode string header */
171	UNIHDR hdr_home_dir;     /* home directory unicode string header */
172	UNIHDR hdr_dir_drive;    /* home drive unicode string header */
173	UNIHDR hdr_logon_script; /* logon script unicode string header */
174	UNIHDR hdr_profile_path; /* profile path unicode string header */
175	UNIHDR hdr_acct_desc  ;  /* user description */
176	UNIHDR hdr_workstations; /* comma-separated workstations user can log in from */
177	UNIHDR hdr_unknown_str ; /* don't know what this is, yet. */
178	UNIHDR hdr_munged_dial ; /* munged path name and dial-back tel number */
179
180	uint8 lm_pwd[16];    /* lm user passwords */
181	uint8 nt_pwd[16];    /* nt user passwords */
182
183	uint32 user_rid;      /* Primary User ID */
184	uint32 group_rid;     /* Primary Group ID */
185
186	uint32 acb_info; /* account info (ACB_xxxx bit-mask) */
187
188	uint32 fields_present; /* 0x09f8 27fa */
189
190	uint16 logon_divs; /* 0x0000 00a8 which is 168 which is num hrs in a week */
191	/* uint8 pad[2] */
192	uint32 ptr_logon_hrs; /* pointer to logon hours */
193
194	/* Was unknown_5. */
195	uint16 bad_password_count;
196	uint16 logon_count;
197
198	uint8 padding1[6];
199
200	uint8 passmustchange; /* 0x00 must change = 0x01 */
201
202	uint8 padding2;
203
204	uint8 pass[516];
205
206	UNISTR2 uni_user_name;    /* NULL - username unicode string */
207	UNISTR2 uni_full_name;    /* user's full name unicode string */
208	UNISTR2 uni_home_dir;     /* home directory unicode string */
209	UNISTR2 uni_dir_drive;    /* home directory drive unicode string */
210	UNISTR2 uni_logon_script; /* logon script unicode string */
211	UNISTR2 uni_profile_path; /* profile path unicode string */
212	UNISTR2 uni_acct_desc  ;  /* user description unicode string */
213	UNISTR2 uni_workstations; /* login from workstations unicode string */
214	UNISTR2 uni_unknown_str ; /* don't know what this is, yet. */
215	UNISTR2 uni_munged_dial ; /* munged path name and dial-back tel no */
216
217	LOGON_HRS logon_hrs;
218
219} SAM_USER_INFO_23;
220
221/* SAM_USER_INFO_24 */
222typedef struct sam_user_info_24
223{
224	uint8 pass[516];
225	uint16 pw_len;
226} SAM_USER_INFO_24;
227
228/*
229 * NB. This structure is *definately* incorrect. It's my best guess
230 * currently for W2K SP2. The password field is encrypted in a different
231 * way than normal... And there are definately other problems. JRA.
232 */
233
234/* SAM_USER_INFO_25 */
235typedef struct sam_user_info_25
236{
237	/* TIMES MAY NOT IN RIGHT ORDER!!!! */
238	NTTIME logon_time;            /* logon time */
239	NTTIME logoff_time;           /* logoff time */
240	NTTIME kickoff_time;          /* kickoff time */
241	NTTIME pass_last_set_time;    /* password last set time */
242	NTTIME pass_can_change_time;  /* password can change time */
243	NTTIME pass_must_change_time; /* password must change time */
244
245	UNIHDR hdr_user_name;    /* NULL - user name unicode string header */
246	UNIHDR hdr_full_name;    /* user's full name unicode string header */
247	UNIHDR hdr_home_dir;     /* home directory unicode string header */
248	UNIHDR hdr_dir_drive;    /* home drive unicode string header */
249	UNIHDR hdr_logon_script; /* logon script unicode string header */
250	UNIHDR hdr_profile_path; /* profile path unicode string header */
251	UNIHDR hdr_acct_desc  ;  /* user description */
252	UNIHDR hdr_workstations; /* comma-separated workstations user can log in from */
253	UNIHDR hdr_unknown_str ; /* don't know what this is, yet. */
254	UNIHDR hdr_munged_dial ; /* munged path name and dial-back tel number */
255
256	uint8 lm_pwd[16];    /* lm user passwords */
257	uint8 nt_pwd[16];    /* nt user passwords */
258
259	uint32 user_rid;      /* Primary User ID */
260	uint32 group_rid;     /* Primary Group ID */
261
262	uint32 acb_info; /* account info (ACB_xxxx bit-mask) */
263
264	uint32 unknown_6[6];
265
266	uint8 pass[532];
267
268	UNISTR2 uni_user_name;    /* NULL - username unicode string */
269	UNISTR2 uni_full_name;    /* user's full name unicode string */
270	UNISTR2 uni_home_dir;     /* home directory unicode string */
271	UNISTR2 uni_dir_drive;    /* home directory drive unicode string */
272	UNISTR2 uni_logon_script; /* logon script unicode string */
273	UNISTR2 uni_profile_path; /* profile path unicode string */
274	UNISTR2 uni_acct_desc  ;  /* user description unicode string */
275	UNISTR2 uni_workstations; /* login from workstations unicode string */
276	UNISTR2 uni_unknown_str ; /* don't know what this is, yet. */
277	UNISTR2 uni_munged_dial ; /* munged path name and dial-back tel no */
278} SAM_USER_INFO_25;
279
280
281/* SAM_USER_INFO_21 */
282typedef struct sam_user_info_21
283{
284	NTTIME logon_time;            /* logon time */
285	NTTIME logoff_time;           /* logoff time */
286	NTTIME kickoff_time;          /* kickoff time */
287	NTTIME pass_last_set_time;    /* password last set time */
288	NTTIME pass_can_change_time;  /* password can change time */
289	NTTIME pass_must_change_time; /* password must change time */
290
291	UNIHDR hdr_user_name;    /* username unicode string header */
292	UNIHDR hdr_full_name;    /* user's full name unicode string header */
293	UNIHDR hdr_home_dir;     /* home directory unicode string header */
294	UNIHDR hdr_dir_drive;    /* home drive unicode string header */
295	UNIHDR hdr_logon_script; /* logon script unicode string header */
296	UNIHDR hdr_profile_path; /* profile path unicode string header */
297	UNIHDR hdr_acct_desc  ;  /* user description */
298	UNIHDR hdr_workstations; /* comma-separated workstations user can log in from */
299	UNIHDR hdr_unknown_str ; /* don't know what this is, yet. */
300	UNIHDR hdr_munged_dial ; /* munged path name and dial-back tel number */
301
302	uint8 lm_pwd[16];    /* lm user passwords */
303	uint8 nt_pwd[16];    /* nt user passwords */
304
305	uint32 user_rid;      /* Primary User ID */
306	uint32 group_rid;     /* Primary Group ID */
307
308	uint32 acb_info; /* account info (ACB_xxxx bit-mask) */
309
310	/* Was unknown_3 */
311	uint32 fields_present; /* 0x00ff ffff */
312
313	uint16 logon_divs; /* 0x0000 00a8 which is 168 which is num hrs in a week */
314	/* uint8 pad[2] */
315	uint32 ptr_logon_hrs; /* unknown pointer */
316
317	/* Was unknown_5. */
318	uint16 bad_password_count;
319	uint16 logon_count;
320
321	uint8 padding1[6];
322
323	uint8 passmustchange; /* 0x00 must change = 0x01 */
324
325	uint8 padding2;
326
327	UNISTR2 uni_user_name;    /* username unicode string */
328	UNISTR2 uni_full_name;    /* user's full name unicode string */
329	UNISTR2 uni_home_dir;     /* home directory unicode string */
330	UNISTR2 uni_dir_drive;    /* home directory drive unicode string */
331	UNISTR2 uni_logon_script; /* logon script unicode string */
332	UNISTR2 uni_profile_path; /* profile path unicode string */
333	UNISTR2 uni_acct_desc  ;  /* user description unicode string */
334	UNISTR2 uni_workstations; /* login from workstations unicode string */
335	UNISTR2 uni_unknown_str ; /* don't know what this is, yet. */
336	UNISTR2 uni_munged_dial ; /* munged path name and dial-back tel number */
337
338	LOGON_HRS logon_hrs;
339
340} SAM_USER_INFO_21;
341
342#define PASS_MUST_CHANGE_AT_NEXT_LOGON	0x01
343#define PASS_DONT_CHANGE_AT_NEXT_LOGON	0x00
344
345/* SAM_USER_INFO_20 */
346typedef struct sam_user_info_20
347{
348	UNIHDR hdr_munged_dial ; /* munged path name and dial-back tel number */
349
350	UNISTR2 uni_munged_dial ; /* munged path name and dial-back tel number */
351
352} SAM_USER_INFO_20;
353
354/* SAM_USER_INFO_12 */
355typedef struct sam_user_info_12
356{
357	uint8 lm_pwd[16];    /* lm user passwords */
358	uint8 nt_pwd[16];    /* nt user passwords */
359
360	uint8 lm_pwd_active;
361	uint8 nt_pwd_active;
362
363} SAM_USER_INFO_12;
364
365/* SAM_USER_INFO_11 */
366typedef struct sam_user_info_11
367{
368	uint8  padding_0[16];  /* 0 - padding 16 bytes */
369	NTTIME expiry;         /* expiry time or something? */
370	uint8  padding_1[24];  /* 0 - padding 24 bytes */
371
372	UNIHDR hdr_mach_acct;  /* unicode header for machine account */
373	uint32 padding_2;      /* 0 - padding 4 bytes */
374
375	uint32 ptr_1;          /* pointer */
376	uint8  padding_3[32];  /* 0 - padding 32 bytes */
377	uint32 padding_4;      /* 0 - padding 4 bytes */
378
379	uint32 ptr_2;          /* pointer */
380	uint32 padding_5;      /* 0 - padding 4 bytes */
381
382	uint32 ptr_3;          /* pointer */
383	uint8  padding_6[32];  /* 0 - padding 32 bytes */
384
385	uint32 rid_user;       /* user RID */
386	uint32 rid_group;      /* group RID */
387
388	uint16 acct_ctrl;      /* 0080 - ACB_XXXX */
389	uint16 unknown_3;      /* 16 bit padding */
390
391	uint16 unknown_4;      /* 0x003f      - 16 bit unknown */
392	uint16 unknown_5;      /* 0x003c      - 16 bit unknown */
393
394	uint8  padding_7[16];  /* 0 - padding 16 bytes */
395	uint32 padding_8;      /* 0 - padding 4 bytes */
396
397	UNISTR2 uni_mach_acct; /* unicode string for machine account */
398
399	uint8  padding_9[48];  /* 0 - padding 48 bytes */
400
401} SAM_USER_INFO_11;
402
403
404/* SAM_USER_INFO_10 */
405typedef struct sam_user_info_10
406{
407	uint32 acb_info;
408
409} SAM_USER_INFO_10;
410
411/* SAM_USER_INFO_7 */
412typedef struct sam_user_info_7
413{
414	UNIHDR hdr_name;  /* unicode header for name */
415	UNISTR2 uni_name; /* unicode string for name */
416
417} SAM_USER_INFO_7;
418
419
420/* SAMR_Q_CLOSE_HND - probably a policy handle close */
421typedef struct q_samr_close_hnd_info
422{
423    POLICY_HND pol;          /* policy handle */
424
425} SAMR_Q_CLOSE_HND;
426
427
428/* SAMR_R_CLOSE_HND - probably a policy handle close */
429typedef struct r_samr_close_hnd_info
430{
431	POLICY_HND pol;       /* policy handle */
432	NTSTATUS status;         /* return status */
433
434} SAMR_R_CLOSE_HND;
435
436
437/****************************************************************************
438SAMR_Q_GET_USRDOM_PWINFO - a "set user info" occurs just after this
439*****************************************************************************/
440
441/* SAMR_Q_GET_USRDOM_PWINFO */
442typedef struct q_samr_usrdom_pwinfo_info
443{
444	POLICY_HND user_pol;          /* policy handle */
445
446} SAMR_Q_GET_USRDOM_PWINFO;
447
448
449/****************************************************************************
450SAMR_R_GET_USRDOM_PWINFO - a "set user info" occurs just after this
451*****************************************************************************/
452
453/* SAMR_R_GET_USRDOM_PWINFO */
454typedef struct r_samr_usrdom_pwinfo_info
455{
456	uint16 unknown_0; /* 0000 */
457	uint16 unknown_1; /* 0x0016 or 0x0015 */
458	uint32 unknown_2; /* 0x0000 0000 */
459	NTSTATUS status;
460
461} SAMR_R_GET_USRDOM_PWINFO;
462
463/****************************************************************************
464SAMR_Q_SET_SEC_OBJ - info level 4.
465*****************************************************************************/
466
467/* SAMR_Q_SET_SEC_OBJ - */
468typedef struct q_samr_set_sec_obj_info
469{
470	POLICY_HND pol;          /* policy handle */
471	uint32 sec_info;         /* xxxx_SECURITY_INFORMATION 0x0000 0004 */
472	SEC_DESC_BUF *buf;
473
474} SAMR_Q_SET_SEC_OBJ;
475
476/* SAMR_R_SET_SEC_OBJ - */
477typedef struct r_samr_set_sec_obj_info
478{
479	NTSTATUS status;         /* return status */
480
481} SAMR_R_SET_SEC_OBJ;
482
483
484/****************************************************************************
485SAMR_Q_QUERY_SEC_OBJ - info level 4.  returns SIDs.
486*****************************************************************************/
487
488/* SAMR_Q_QUERY_SEC_OBJ - probably get domain info... */
489typedef struct q_samr_query_sec_obj_info
490{
491	POLICY_HND user_pol;          /* policy handle */
492	uint32 sec_info;     /* xxxx_SECURITY_INFORMATION 0x0000 0004 */
493
494} SAMR_Q_QUERY_SEC_OBJ;
495
496/* SAMR_R_QUERY_SEC_OBJ - probably an open */
497typedef struct r_samr_query_sec_obj_info
498{
499	uint32 ptr;
500	SEC_DESC_BUF *buf;
501
502	NTSTATUS status;         /* return status */
503
504} SAMR_R_QUERY_SEC_OBJ;
505
506
507/****************************************************************************
508SAMR_Q_QUERY_DOMAIN_INFO - probably a query on domain group info.
509*****************************************************************************/
510
511/* SAMR_Q_QUERY_DOMAIN_INFO - */
512typedef struct q_samr_query_domain_info
513{
514	POLICY_HND domain_pol;   /* policy handle */
515	uint16 switch_value;     /* 0x0002, 0x0001 */
516
517} SAMR_Q_QUERY_DOMAIN_INFO;
518
519typedef struct sam_unknown_info_3_info
520{
521	NTTIME logout;
522	/* 0x8000 0000 */ /* DON'T forcibly disconnect remote users from server when logon hours expire*/
523
524	/* 0x0000 0000 */ /* forcibly disconnect remote users from server when logon hours expire*/
525
526} SAM_UNK_INFO_3;
527
528typedef struct sam_unknown_info_6_info
529{
530	uint32 unknown_0; /* 0x0000 0000 */
531
532	uint32 ptr_0;     /* pointer to unknown structure */
533	uint8  padding[12]; /* 12 bytes zeros */
534
535} SAM_UNK_INFO_6;
536
537typedef struct sam_unknown_info_7_info
538{
539	uint16 server_role;
540
541} SAM_UNK_INFO_7;
542
543typedef struct sam_unknown_info_8_info
544{
545	UINT64_S seq_num;
546	NTTIME domain_create_time;
547
548} SAM_UNK_INFO_8;
549
550typedef struct sam_unknown_info_12_inf
551{
552	NTTIME duration;
553	NTTIME reset_count;
554	uint16 bad_attempt_lockout;
555
556} SAM_UNK_INFO_12;
557
558typedef struct sam_unknown_info_5_inf
559{
560	UNIHDR hdr_server; /* server name unicode header */
561	UNISTR2 uni_server; /* server name unicode string */
562
563} SAM_UNK_INFO_5;
564
565typedef struct sam_unknown_info_2_inf
566{
567	NTTIME logout; /* whether users are forcibly disconnected when logon hours expire */
568	UNIHDR hdr_comment; /* comment according to samba4 idl */
569	UNIHDR hdr_domain; /* domain name unicode header */
570	UNIHDR hdr_server; /* server name unicode header */
571
572	/* put all the data in here, at the moment, including what the above
573	   pointer is referring to
574	 */
575
576	UINT64_S seq_num;
577
578	uint32 unknown_4; /* 0x0000 0001 */
579	uint32 server_role;
580	uint32 unknown_6; /* 0x0000 0001 */
581	uint32 num_domain_usrs; /* number of users in domain */
582	uint32 num_domain_grps; /* number of domain groups in domain */
583	uint32 num_local_grps; /* number of local groups in domain */
584
585	uint8 padding[12]; /* 12 bytes zeros */
586
587	UNISTR2 uni_comment; /* comment unicode string */
588	UNISTR2 uni_domain; /* domain name unicode string */
589	UNISTR2 uni_server; /* server name unicode string */
590
591} SAM_UNK_INFO_2;
592
593typedef struct sam_unknown_info_1_inf
594{
595	uint16 min_length_password;
596	uint16 password_history;
597	uint32 flag;
598	NTTIME expire;
599	NTTIME min_passwordage;
600
601} SAM_UNK_INFO_1;
602
603
604typedef struct sam_unknown_ctr_info
605{
606	union
607	{
608		SAM_UNK_INFO_1 inf1;
609		SAM_UNK_INFO_2 inf2;
610		SAM_UNK_INFO_3 inf3;
611		SAM_UNK_INFO_5 inf5;
612		SAM_UNK_INFO_6 inf6;
613		SAM_UNK_INFO_7 inf7;
614		SAM_UNK_INFO_8 inf8;
615		SAM_UNK_INFO_12 inf12;
616
617	} info;
618
619} SAM_UNK_CTR;
620
621
622/* SAMR_R_QUERY_DOMAIN_INFO - */
623typedef struct r_samr_query_domain_info
624{
625	uint32 ptr_0;
626	uint16 switch_value; /* same as in query */
627
628	SAM_UNK_CTR *ctr;
629
630	NTSTATUS status;         /* return status */
631
632} SAMR_R_QUERY_DOMAIN_INFO;
633
634
635/* SAMR_Q_LOOKUP_DOMAIN - obtain SID for a local domain */
636typedef struct q_samr_lookup_domain_info
637{
638	POLICY_HND connect_pol;
639
640	UNIHDR  hdr_domain;
641	UNISTR2 uni_domain;
642
643} SAMR_Q_LOOKUP_DOMAIN;
644
645
646/* SAMR_R_LOOKUP_DOMAIN */
647typedef struct r_samr_lookup_domain_info
648{
649	uint32   ptr_sid;
650	DOM_SID2 dom_sid;
651
652	NTSTATUS status;
653
654} SAMR_R_LOOKUP_DOMAIN;
655
656
657/****************************************************************************
658SAMR_Q_OPEN_DOMAIN - unknown_0 values seen associated with SIDs:
659
6600x0000 03f1 and a specific   domain sid - S-1-5-21-44c01ca6-797e5c3d-33f83fd0
6610x0000 0200 and a specific   domain sid - S-1-5-21-44c01ca6-797e5c3d-33f83fd0
662*****************************************************************************/
663
664/* SAMR_Q_OPEN_DOMAIN */
665typedef struct q_samr_open_domain_info
666{
667	POLICY_HND pol;   /* policy handle */
668	uint32 flags;               /* 0x2000 0000; 0x0000 0211; 0x0000 0280; 0x0000 0200 - flags? */
669	DOM_SID2 dom_sid;         /* domain SID */
670
671} SAMR_Q_OPEN_DOMAIN;
672
673
674/* SAMR_R_OPEN_DOMAIN - probably an open */
675typedef struct r_samr_open_domain_info
676{
677	POLICY_HND domain_pol; /* policy handle associated with the SID */
678	NTSTATUS status;         /* return status */
679
680} SAMR_R_OPEN_DOMAIN;
681
682#define MAX_SAM_ENTRIES_W2K 0x400
683#define MAX_SAM_ENTRIES_W95 50
684/* The following should be the greater of the preceeding two. */
685#define MAX_SAM_ENTRIES MAX_SAM_ENTRIES_W2K
686
687typedef struct samr_entry_info
688{
689	uint32 rid;
690	UNIHDR hdr_name;
691
692} SAM_ENTRY;
693
694
695/* SAMR_Q_ENUM_DOMAINS - SAM rids and names */
696typedef struct q_samr_enum_domains_info
697{
698	POLICY_HND pol;     /* policy handle */
699
700	uint32 start_idx;   /* enumeration handle */
701	uint32 max_size;    /* 0x0000 ffff */
702
703} SAMR_Q_ENUM_DOMAINS;
704
705/* SAMR_R_ENUM_DOMAINS - SAM rids and Domain names */
706typedef struct r_samr_enum_domains_info
707{
708	uint32 next_idx;     /* next starting index required for enum */
709	uint32 ptr_entries1;
710
711	uint32 num_entries2;
712	uint32 ptr_entries2;
713
714	uint32 num_entries3;
715
716	SAM_ENTRY *sam;
717	UNISTR2 *uni_dom_name;
718
719	uint32 num_entries4;
720
721	NTSTATUS status;
722
723} SAMR_R_ENUM_DOMAINS;
724
725/* SAMR_Q_ENUM_DOM_USERS - SAM rids and names */
726typedef struct q_samr_enum_dom_users_info
727{
728	POLICY_HND pol;          /* policy handle */
729
730	uint32 start_idx;   /* number of values (0 indicates unlimited?) */
731	uint16 acb_mask;          /* 0x0000 indicates all */
732	uint16 unknown_1;         /* 0x0000 */
733
734	uint32 max_size;              /* 0x0000 ffff */
735
736} SAMR_Q_ENUM_DOM_USERS;
737
738
739/* SAMR_R_ENUM_DOM_USERS - SAM rids and names */
740typedef struct r_samr_enum_dom_users_info
741{
742	uint32 next_idx;     /* next starting index required for enum */
743	uint32 ptr_entries1;
744
745	uint32 num_entries2;
746	uint32 ptr_entries2;
747
748	uint32 num_entries3;
749
750	SAM_ENTRY *sam;
751	UNISTR2 *uni_acct_name;
752
753	uint32 num_entries4;
754
755	NTSTATUS status;
756
757} SAMR_R_ENUM_DOM_USERS;
758
759
760/* SAMR_Q_ENUM_DOM_GROUPS - SAM rids and names */
761typedef struct q_samr_enum_dom_groups_info
762{
763	POLICY_HND pol;          /* policy handle */
764
765	/* this is possibly an enumeration context handle... */
766	uint32 start_idx;         /* 0x0000 0000 */
767
768	uint32 max_size;              /* 0x0000 ffff */
769
770} SAMR_Q_ENUM_DOM_GROUPS;
771
772
773/* SAMR_R_ENUM_DOM_GROUPS - SAM rids and names */
774typedef struct r_samr_enum_dom_groups_info
775{
776	uint32 next_idx;
777	uint32 ptr_entries1;
778
779	uint32 num_entries2;
780	uint32 ptr_entries2;
781
782	uint32 num_entries3;
783
784	SAM_ENTRY *sam;
785	UNISTR2 *uni_grp_name;
786
787	uint32 num_entries4;
788
789	NTSTATUS status;
790
791} SAMR_R_ENUM_DOM_GROUPS;
792
793
794/* SAMR_Q_ENUM_DOM_ALIASES - SAM rids and names */
795typedef struct q_samr_enum_dom_aliases_info
796{
797	POLICY_HND pol;          /* policy handle */
798
799	/* this is possibly an enumeration context handle... */
800	uint32 start_idx;         /* 0x0000 0000 */
801
802	uint32 max_size;              /* 0x0000 ffff */
803
804} SAMR_Q_ENUM_DOM_ALIASES;
805
806
807/* SAMR_R_ENUM_DOM_ALIASES - SAM rids and names */
808typedef struct r_samr_enum_dom_aliases_info
809{
810	uint32 next_idx;
811	uint32 ptr_entries1;
812
813	uint32 num_entries2;
814	uint32 ptr_entries2;
815
816	uint32 num_entries3;
817
818	SAM_ENTRY *sam;
819	UNISTR2 *uni_grp_name;
820
821	uint32 num_entries4;
822
823	NTSTATUS status;
824
825} SAMR_R_ENUM_DOM_ALIASES;
826
827
828/* -- Level 1 Display Info - User Information -- */
829
830typedef struct samr_entry_info1
831{
832	uint32 user_idx;
833
834	uint32 rid_user;
835	uint16 acb_info;
836
837	UNIHDR hdr_acct_name;
838	UNIHDR hdr_user_name;
839	UNIHDR hdr_user_desc;
840
841} SAM_ENTRY1;
842
843typedef struct samr_str_entry_info1
844{
845	UNISTR2 uni_acct_name;
846	UNISTR2 uni_full_name;
847	UNISTR2 uni_acct_desc;
848
849} SAM_STR1;
850
851typedef struct sam_entry_info_1
852{
853	SAM_ENTRY1 *sam;
854	SAM_STR1   *str;
855
856} SAM_DISPINFO_1;
857
858
859/* -- Level 2 Display Info - Trust Account Information -- */
860
861typedef struct samr_entry_info2
862{
863	uint32 user_idx;
864
865	uint32 rid_user;
866	uint16 acb_info;
867
868	UNIHDR hdr_srv_name;
869	UNIHDR hdr_srv_desc;
870
871} SAM_ENTRY2;
872
873typedef struct samr_str_entry_info2
874{
875	UNISTR2 uni_srv_name;
876	UNISTR2 uni_srv_desc;
877
878} SAM_STR2;
879
880typedef struct sam_entry_info_2
881{
882	SAM_ENTRY2 *sam;
883	SAM_STR2   *str;
884
885} SAM_DISPINFO_2;
886
887
888/* -- Level 3 Display Info - Domain Group Information -- */
889
890typedef struct samr_entry_info3
891{
892	uint32 grp_idx;
893
894	uint32 rid_grp;
895	uint32 attr;     /* SE_GROUP_xxx, usually 7 */
896
897	UNIHDR hdr_grp_name;
898	UNIHDR hdr_grp_desc;
899
900} SAM_ENTRY3;
901
902typedef struct samr_str_entry_info3
903{
904	UNISTR2 uni_grp_name;
905	UNISTR2 uni_grp_desc;
906
907} SAM_STR3;
908
909typedef struct sam_entry_info_3
910{
911	SAM_ENTRY3 *sam;
912	SAM_STR3   *str;
913
914} SAM_DISPINFO_3;
915
916
917/* -- Level 4 Display Info - User List (ASCII) -- */
918
919typedef struct samr_entry_info4
920{
921	uint32 user_idx;
922	STRHDR hdr_acct_name;
923
924} SAM_ENTRY4;
925
926typedef struct samr_str_entry_info4
927{
928	STRING2 acct_name;
929
930} SAM_STR4;
931
932typedef struct sam_entry_info_4
933{
934	SAM_ENTRY4 *sam;
935	SAM_STR4   *str;
936
937} SAM_DISPINFO_4;
938
939
940/* -- Level 5 Display Info - Group List (ASCII) -- */
941
942typedef struct samr_entry_info5
943{
944	uint32 grp_idx;
945	STRHDR hdr_grp_name;
946
947} SAM_ENTRY5;
948
949typedef struct samr_str_entry_info5
950{
951	STRING2 grp_name;
952
953} SAM_STR5;
954
955typedef struct sam_entry_info_5
956{
957	SAM_ENTRY5 *sam;
958	SAM_STR5   *str;
959
960} SAM_DISPINFO_5;
961
962
963typedef struct sam_dispinfo_ctr_info
964{
965	union
966	{
967		SAM_DISPINFO_1 *info1; /* users/names/descriptions */
968		SAM_DISPINFO_2 *info2; /* trust accounts */
969		SAM_DISPINFO_3 *info3; /* domain groups/descriptions */
970		SAM_DISPINFO_4 *info4; /* user list (ASCII) - used by Win95 */
971		SAM_DISPINFO_5 *info5; /* group list (ASCII) */
972		void       *info; /* allows assignment without typecasting, */
973
974	} sam;
975
976} SAM_DISPINFO_CTR;
977
978
979/* SAMR_Q_QUERY_DISPINFO - SAM rids, names and descriptions */
980typedef struct q_samr_query_disp_info
981{
982	POLICY_HND domain_pol;
983
984	uint16 switch_level;    /* see SAM_DISPINFO_CTR above */
985	/* align */
986
987	uint32 start_idx;       /* start enumeration index */
988	uint32 max_entries;     /* maximum number of entries to return */
989	uint32 max_size;        /* recommended data size; if exceeded server
990				   should return STATUS_MORE_ENTRIES */
991
992} SAMR_Q_QUERY_DISPINFO;
993
994
995/* SAMR_R_QUERY_DISPINFO  */
996typedef struct r_samr_query_dispinfo_info
997{
998	uint32 total_size;     /* total data size for all matching entries
999				  (0 = uncalculated) */
1000	uint32 data_size;      /* actual data size returned = size of SAM_ENTRY
1001				  structures + total length of strings */
1002
1003	uint16 switch_level;   /* see SAM_DISPINFO_CTR above */
1004	/* align */
1005
1006	uint32 num_entries;    /* number of entries returned */
1007	uint32 ptr_entries;
1008	uint32 num_entries2;
1009
1010	SAM_DISPINFO_CTR *ctr;
1011
1012	NTSTATUS status;
1013
1014} SAMR_R_QUERY_DISPINFO;
1015
1016
1017/* SAMR_Q_DELETE_DOM_GROUP - delete domain group */
1018typedef struct q_samr_delete_dom_group_info
1019{
1020    POLICY_HND group_pol;          /* policy handle */
1021
1022} SAMR_Q_DELETE_DOM_GROUP;
1023
1024
1025/* SAMR_R_DELETE_DOM_GROUP - delete domain group */
1026typedef struct r_samr_delete_dom_group_info
1027{
1028	POLICY_HND pol;       /* policy handle */
1029	NTSTATUS status;        /* return status */
1030
1031} SAMR_R_DELETE_DOM_GROUP;
1032
1033
1034/* SAMR_Q_CREATE_DOM_GROUP - SAM create group */
1035typedef struct q_samr_create_dom_group_info
1036{
1037	POLICY_HND pol;        /* policy handle */
1038
1039	UNIHDR hdr_acct_desc;
1040	UNISTR2 uni_acct_desc;
1041
1042	uint32 access_mask;
1043
1044} SAMR_Q_CREATE_DOM_GROUP;
1045
1046/* SAMR_R_CREATE_DOM_GROUP - SAM create group */
1047typedef struct r_samr_create_dom_group_info
1048{
1049	POLICY_HND pol;        /* policy handle */
1050
1051	uint32 rid;
1052	NTSTATUS status;
1053
1054} SAMR_R_CREATE_DOM_GROUP;
1055
1056/* SAMR_Q_QUERY_GROUPINFO - SAM Group Info */
1057typedef struct q_samr_query_group_info
1058{
1059	POLICY_HND pol;        /* policy handle */
1060
1061	uint16 switch_level;    /* 0x0001 seen */
1062
1063} SAMR_Q_QUERY_GROUPINFO;
1064
1065typedef struct samr_group_info1
1066{
1067	UNIHDR hdr_acct_name;
1068
1069	uint32 unknown_1; /* 0x0000 0003 - number of group members? */
1070	uint32 num_members; /* 0x0000 0001 - number of group members? */
1071
1072	UNIHDR hdr_acct_desc;
1073
1074	UNISTR2 uni_acct_name;
1075	UNISTR2 uni_acct_desc;
1076
1077} GROUP_INFO1;
1078
1079typedef struct samr_group_info2
1080{
1081	uint16 level;
1082	UNIHDR hdr_acct_name;
1083	UNISTR2 uni_acct_name;
1084
1085} GROUP_INFO2;
1086
1087typedef struct samr_group_info3
1088{
1089	uint32 unknown_1; /* 0x0000 0003 - number of group members? */
1090
1091} GROUP_INFO3;
1092
1093typedef struct samr_group_info4
1094{
1095	uint16 level;
1096	UNIHDR hdr_acct_desc;
1097	UNISTR2 uni_acct_desc;
1098
1099} GROUP_INFO4;
1100
1101/* GROUP_INFO_CTR */
1102typedef struct group_info_ctr
1103{
1104	uint16 switch_value1;
1105
1106	union
1107 	{
1108		GROUP_INFO1 info1;
1109		GROUP_INFO2 info2;
1110		GROUP_INFO3 info3;
1111		GROUP_INFO4 info4;
1112
1113	} group;
1114
1115} GROUP_INFO_CTR;
1116
1117/* SAMR_R_QUERY_GROUPINFO - SAM Group Info */
1118typedef struct r_samr_query_groupinfo_info
1119{
1120	uint32 ptr;
1121	GROUP_INFO_CTR *ctr;
1122
1123	NTSTATUS status;
1124
1125} SAMR_R_QUERY_GROUPINFO;
1126
1127
1128/* SAMR_Q_SET_GROUPINFO - SAM Group Info */
1129typedef struct q_samr_set_group_info
1130{
1131	POLICY_HND pol;        /* policy handle */
1132	GROUP_INFO_CTR *ctr;
1133
1134} SAMR_Q_SET_GROUPINFO;
1135
1136/* SAMR_R_SET_GROUPINFO - SAM Group Info */
1137typedef struct r_samr_set_group_info
1138{
1139	NTSTATUS status;
1140
1141} SAMR_R_SET_GROUPINFO;
1142
1143
1144/* SAMR_Q_DELETE_DOM_ALIAS - delete domain alias */
1145typedef struct q_samr_delete_dom_alias_info
1146{
1147    POLICY_HND alias_pol;          /* policy handle */
1148
1149} SAMR_Q_DELETE_DOM_ALIAS;
1150
1151
1152/* SAMR_R_DELETE_DOM_ALIAS - delete domain alias */
1153typedef struct r_samr_delete_dom_alias_info
1154{
1155	POLICY_HND pol;       /* policy handle */
1156	NTSTATUS status;        /* return status */
1157
1158} SAMR_R_DELETE_DOM_ALIAS;
1159
1160
1161/* SAMR_Q_CREATE_DOM_ALIAS - SAM create alias */
1162typedef struct q_samr_create_dom_alias_info
1163{
1164	POLICY_HND dom_pol;        /* policy handle */
1165
1166	UNIHDR hdr_acct_desc;
1167	UNISTR2 uni_acct_desc;
1168
1169	uint32 access_mask;    /* 0x001f000f */
1170
1171} SAMR_Q_CREATE_DOM_ALIAS;
1172
1173/* SAMR_R_CREATE_DOM_ALIAS - SAM create alias */
1174typedef struct r_samr_create_dom_alias_info
1175{
1176	POLICY_HND alias_pol;        /* policy handle */
1177
1178	uint32 rid;
1179	NTSTATUS status;
1180
1181} SAMR_R_CREATE_DOM_ALIAS;
1182
1183/* SAMR_Q_QUERY_ALIASINFO - SAM Alias Info */
1184typedef struct q_samr_query_alias_info
1185{
1186	POLICY_HND pol;        /* policy handle */
1187
1188	uint16 switch_level;    /* 0x0003 seen */
1189
1190} SAMR_Q_QUERY_ALIASINFO;
1191
1192typedef struct samr_alias_info1
1193{
1194	UNIHDR hdr_acct_name;
1195	UNIHDR hdr_acct_desc;
1196	uint32 num_member;
1197	UNISTR2 uni_acct_name;
1198	UNISTR2 uni_acct_desc;
1199
1200} ALIAS_INFO1;
1201
1202typedef struct samr_alias_info3
1203{
1204	UNIHDR hdr_acct_desc;
1205	UNISTR2 uni_acct_desc;
1206
1207} ALIAS_INFO3;
1208
1209/* ALIAS_INFO_CTR */
1210typedef struct alias_info_ctr
1211{
1212	uint16 switch_value1;
1213	uint16 switch_value2;
1214
1215	union
1216 	{
1217		ALIAS_INFO1 info1;
1218		ALIAS_INFO3 info3;
1219
1220	} alias;
1221
1222} ALIAS_INFO_CTR;
1223
1224/* SAMR_R_QUERY_ALIASINFO - SAM alias info */
1225typedef struct r_samr_query_aliasinfo_info
1226{
1227	uint32 ptr;
1228	ALIAS_INFO_CTR ctr;
1229
1230	NTSTATUS status;
1231
1232} SAMR_R_QUERY_ALIASINFO;
1233
1234
1235/* SAMR_Q_SET_ALIASINFO - SAM Alias Info */
1236typedef struct q_samr_set_alias_info
1237{
1238	POLICY_HND alias_pol;        /* policy handle */
1239	ALIAS_INFO_CTR ctr;
1240
1241} SAMR_Q_SET_ALIASINFO;
1242
1243/* SAMR_R_SET_ALIASINFO - SAM alias info */
1244typedef struct r_samr_set_aliasinfo_info
1245{
1246	NTSTATUS status;
1247
1248} SAMR_R_SET_ALIASINFO;
1249
1250
1251/* SAMR_Q_QUERY_USERGROUPS - */
1252typedef struct q_samr_query_usergroup_info
1253{
1254	POLICY_HND pol;          /* policy handle associated with unknown id */
1255
1256} SAMR_Q_QUERY_USERGROUPS;
1257
1258/* SAMR_R_QUERY_USERGROUPS - probably a get sam info */
1259typedef struct r_samr_query_usergroup_info
1260{
1261	uint32 ptr_0;            /* pointer */
1262	uint32 num_entries;      /* number of RID groups */
1263	uint32 ptr_1;            /* pointer */
1264	uint32 num_entries2;     /* number of RID groups */
1265
1266	DOM_GID *gid; /* group info */
1267
1268	NTSTATUS status;         /* return status */
1269
1270} SAMR_R_QUERY_USERGROUPS;
1271
1272/* SAM_USERINFO_CTR - sam user info */
1273typedef struct sam_userinfo_ctr_info
1274{
1275	uint16 switch_value;
1276
1277	union
1278	{
1279		SAM_USER_INFO_7  *id7;  /* auth-level 0x07 */
1280		SAM_USER_INFO_10 *id10; /* auth-level 0x10 */
1281		SAM_USER_INFO_11 *id11; /* auth-level 0x11 */
1282		SAM_USER_INFO_12 *id12; /* auth-level 0x12 */
1283		SAM_USER_INFO_20 *id20; /* auth-level 20 */
1284		SAM_USER_INFO_21 *id21; /* auth-level 21 */
1285		SAM_USER_INFO_23 *id23; /* auth-level 0x17 */
1286		SAM_USER_INFO_24 *id24; /* auth-level 0x18 */
1287		SAM_USER_INFO_25 *id25; /* auth-level 0x19 */
1288		void* id; /* to make typecasting easy */
1289
1290	} info;
1291
1292} SAM_USERINFO_CTR;
1293
1294
1295/* SAMR_Q_SET_USERINFO2 - set sam info */
1296typedef struct q_samr_set_user_info2
1297{
1298	POLICY_HND pol;          /* policy handle associated with user */
1299	uint16 switch_value;      /* 0x0010 */
1300
1301	SAM_USERINFO_CTR *ctr;
1302
1303} SAMR_Q_SET_USERINFO2;
1304
1305/* SAMR_R_SET_USERINFO2 - set sam info */
1306typedef struct r_samr_set_user_info2
1307{
1308	NTSTATUS status;         /* return status */
1309
1310} SAMR_R_SET_USERINFO2;
1311
1312/* SAMR_Q_SET_USERINFO - set sam info */
1313typedef struct q_samr_set_user_info
1314{
1315	POLICY_HND pol;          /* policy handle associated with user */
1316	uint16 switch_value;
1317	SAM_USERINFO_CTR *ctr;
1318
1319} SAMR_Q_SET_USERINFO;
1320
1321/* SAMR_R_SET_USERINFO - set sam info */
1322typedef struct r_samr_set_user_info
1323{
1324	NTSTATUS status;         /* return status */
1325
1326} SAMR_R_SET_USERINFO;
1327
1328
1329/* SAMR_Q_QUERY_USERINFO - probably a get sam info */
1330typedef struct q_samr_query_user_info
1331{
1332	POLICY_HND pol;          /* policy handle associated with unknown id */
1333	uint16 switch_value;         /* 0x0015, 0x0011 or 0x0010 - 16 bit unknown */
1334
1335} SAMR_Q_QUERY_USERINFO;
1336
1337/* SAMR_R_QUERY_USERINFO - probably a get sam info */
1338typedef struct r_samr_query_user_info
1339{
1340	uint32 ptr;            /* pointer */
1341	SAM_USERINFO_CTR *ctr;
1342
1343	NTSTATUS status;         /* return status */
1344
1345} SAMR_R_QUERY_USERINFO;
1346
1347
1348/****************************************************************************
1349SAMR_Q_QUERY_USERALIASES - do a conversion from name to RID.
1350
1351the policy handle allocated by an "samr open secret" call is associated
1352with a SID.  this policy handle is what is queried here, *not* the SID
1353itself.  the response to the lookup rids is relative to this SID.
1354*****************************************************************************/
1355/* SAMR_Q_QUERY_USERALIASES */
1356typedef struct q_samr_query_useraliases_info
1357{
1358	POLICY_HND pol;       /* policy handle */
1359
1360	uint32 num_sids1;      /* number of rids being looked up */
1361	uint32 ptr;            /* buffer pointer */
1362	uint32 num_sids2;      /* number of rids being looked up */
1363
1364	uint32   *ptr_sid; /* pointers to sids to be looked up */
1365	DOM_SID2 *sid    ; /* sids to be looked up. */
1366
1367} SAMR_Q_QUERY_USERALIASES;
1368
1369
1370/* SAMR_R_QUERY_USERALIASES */
1371typedef struct r_samr_query_useraliases_info
1372{
1373	uint32 num_entries;
1374	uint32 ptr; /* undocumented buffer pointer */
1375
1376	uint32 num_entries2;
1377	uint32 *rid; /* domain RIDs being looked up */
1378
1379	NTSTATUS status; /* return code */
1380
1381} SAMR_R_QUERY_USERALIASES;
1382
1383
1384/****************************************************************************
1385SAMR_Q_LOOKUP_NAMES - do a conversion from Names to RIDs+types.
1386*****************************************************************************/
1387/* SAMR_Q_LOOKUP_NAMES */
1388typedef struct q_samr_lookup_names_info
1389{
1390	POLICY_HND pol;       /* policy handle */
1391
1392	uint32 num_names1;      /* number of names being looked up */
1393	uint32 flags;           /* 0x0000 03e8 - unknown */
1394	uint32 ptr;            /* 0x0000 0000 - 32 bit unknown */
1395	uint32 num_names2;      /* number of names being looked up */
1396
1397	UNIHDR  *hdr_name; /* unicode account name header */
1398	UNISTR2 *uni_name; /* unicode account name string */
1399
1400} SAMR_Q_LOOKUP_NAMES;
1401
1402
1403/* SAMR_R_LOOKUP_NAMES */
1404typedef struct r_samr_lookup_names_info
1405{
1406	uint32 num_rids1;      /* number of aliases being looked up */
1407	uint32 ptr_rids;       /* pointer to aliases */
1408	uint32 num_rids2;      /* number of aliases being looked up */
1409
1410	uint32 *rids; /* rids */
1411
1412	uint32 num_types1;      /* number of users in aliases being looked up */
1413	uint32 ptr_types;       /* pointer to users in aliases */
1414	uint32 num_types2;      /* number of users in aliases being looked up */
1415
1416	uint32 *types; /* SID_ENUM type */
1417
1418	NTSTATUS status; /* return code */
1419
1420} SAMR_R_LOOKUP_NAMES;
1421
1422
1423/****************************************************************************
1424SAMR_Q_LOOKUP_RIDS - do a conversion from RID groups to something.
1425
1426called to resolve domain RID groups.
1427*****************************************************************************/
1428/* SAMR_Q_LOOKUP_RIDS */
1429typedef struct q_samr_lookup_rids_info
1430{
1431	POLICY_HND pol;       /* policy handle */
1432
1433	uint32 num_rids1;      /* number of rids being looked up */
1434	uint32 flags;          /* 0x0000 03e8 - unknown */
1435	uint32 ptr;            /* 0x0000 0000 - 32 bit unknown */
1436	uint32 num_rids2;      /* number of rids being looked up */
1437
1438	uint32 *rid; /* domain RIDs being looked up */
1439
1440} SAMR_Q_LOOKUP_RIDS;
1441
1442
1443/****************************************************************************
1444SAMR_R_LOOKUP_RIDS - do a conversion from group RID to names
1445
1446*****************************************************************************/
1447/* SAMR_R_LOOKUP_RIDS */
1448typedef struct r_samr_lookup_rids_info
1449{
1450	uint32 num_names1;      /* number of aliases being looked up */
1451	uint32 ptr_names;       /* pointer to aliases */
1452	uint32 num_names2;      /* number of aliases being looked up */
1453
1454	UNIHDR  *hdr_name; /* unicode account name header */
1455	UNISTR2 *uni_name; /* unicode account name string */
1456
1457	uint32 num_types1;      /* number of users in aliases being looked up */
1458	uint32 ptr_types;       /* pointer to users in aliases */
1459	uint32 num_types2;      /* number of users in aliases being looked up */
1460
1461	uint32 *type; /* SID_ENUM type */
1462
1463	NTSTATUS status;
1464
1465} SAMR_R_LOOKUP_RIDS;
1466
1467
1468/* SAMR_Q_OPEN_USER - probably an open */
1469typedef struct q_samr_open_user_info
1470{
1471	POLICY_HND domain_pol;       /* policy handle */
1472	uint32 access_mask;     /* 32 bit unknown - 0x02011b */
1473	uint32 user_rid;      /* user RID */
1474
1475} SAMR_Q_OPEN_USER;
1476
1477
1478/* SAMR_R_OPEN_USER - probably an open */
1479typedef struct r_samr_open_user_info
1480{
1481	POLICY_HND user_pol;       /* policy handle associated with unknown id */
1482	NTSTATUS status;         /* return status */
1483
1484} SAMR_R_OPEN_USER;
1485
1486
1487/* SAMR_Q_CREATE_USER - probably a create */
1488typedef struct q_samr_create_user_info
1489{
1490	POLICY_HND domain_pol;       /* policy handle */
1491
1492	UNIHDR  hdr_name;       /* unicode account name header */
1493	UNISTR2 uni_name;       /* unicode account name */
1494
1495	uint32 acb_info;      /* account control info */
1496	uint32 access_mask;     /* 0xe005 00b0 */
1497
1498} SAMR_Q_CREATE_USER;
1499
1500
1501/* SAMR_R_CREATE_USER - probably a create */
1502typedef struct r_samr_create_user_info
1503{
1504	POLICY_HND user_pol;       /* policy handle associated with user */
1505
1506	uint32 access_granted;
1507	uint32 user_rid;      /* user RID */
1508	NTSTATUS status;         /* return status */
1509
1510} SAMR_R_CREATE_USER;
1511
1512
1513/* SAMR_Q_DELETE_DOM_USER - delete domain user */
1514typedef struct q_samr_delete_dom_user_info
1515{
1516    POLICY_HND user_pol;          /* policy handle */
1517
1518} SAMR_Q_DELETE_DOM_USER;
1519
1520
1521/* SAMR_R_DELETE_DOM_USER - delete domain user */
1522typedef struct r_samr_delete_dom_user_info
1523{
1524	POLICY_HND pol;       /* policy handle */
1525	NTSTATUS status;        /* return status */
1526
1527} SAMR_R_DELETE_DOM_USER;
1528
1529
1530/* SAMR_Q_QUERY_GROUPMEM - query group members */
1531typedef struct q_samr_query_groupmem_info
1532{
1533	POLICY_HND group_pol;        /* policy handle */
1534
1535} SAMR_Q_QUERY_GROUPMEM;
1536
1537
1538/* SAMR_R_QUERY_GROUPMEM - query group members */
1539typedef struct r_samr_query_groupmem_info
1540{
1541	uint32 ptr;
1542	uint32 num_entries;
1543
1544	uint32 ptr_rids;
1545	uint32 ptr_attrs;
1546
1547	uint32 num_rids;
1548	uint32 *rid;
1549
1550	uint32 num_attrs;
1551	uint32 *attr;
1552
1553	NTSTATUS status;
1554
1555} SAMR_R_QUERY_GROUPMEM;
1556
1557
1558/* SAMR_Q_DEL_GROUPMEM - probably an del group member */
1559typedef struct q_samr_del_group_mem_info
1560{
1561	POLICY_HND pol;       /* policy handle */
1562	uint32 rid;         /* rid */
1563
1564} SAMR_Q_DEL_GROUPMEM;
1565
1566
1567/* SAMR_R_DEL_GROUPMEM - probably an del group member */
1568typedef struct r_samr_del_group_mem_info
1569{
1570	NTSTATUS status;         /* return status */
1571
1572} SAMR_R_DEL_GROUPMEM;
1573
1574
1575/* SAMR_Q_ADD_GROUPMEM - probably an add group member */
1576typedef struct q_samr_add_group_mem_info
1577{
1578	POLICY_HND pol;       /* policy handle */
1579
1580	uint32 rid;         /* rid */
1581	uint32 unknown;     /* 0x0000 0005 */
1582
1583} SAMR_Q_ADD_GROUPMEM;
1584
1585
1586/* SAMR_R_ADD_GROUPMEM - probably an add group member */
1587typedef struct r_samr_add_group_mem_info
1588{
1589	NTSTATUS status;         /* return status */
1590
1591} SAMR_R_ADD_GROUPMEM;
1592
1593
1594/* SAMR_Q_OPEN_GROUP - probably an open */
1595typedef struct q_samr_open_group_info
1596{
1597	POLICY_HND domain_pol;       /* policy handle */
1598	uint32 access_mask;         /* 0x0000 0001, 0x0000 0003, 0x0000 001f */
1599	uint32 rid_group;        /* rid */
1600
1601} SAMR_Q_OPEN_GROUP;
1602
1603
1604/* SAMR_R_OPEN_GROUP - probably an open */
1605typedef struct r_samr_open_group_info
1606{
1607	POLICY_HND pol;       /* policy handle */
1608	NTSTATUS status;         /* return status */
1609
1610} SAMR_R_OPEN_GROUP;
1611
1612
1613/* SAMR_Q_QUERY_ALIASMEM - query alias members */
1614typedef struct q_samr_query_aliasmem_info
1615{
1616	POLICY_HND alias_pol;        /* policy handle */
1617
1618} SAMR_Q_QUERY_ALIASMEM;
1619
1620
1621/* SAMR_R_QUERY_ALIASMEM - query alias members */
1622typedef struct r_samr_query_aliasmem_info
1623{
1624	uint32 num_sids;
1625	uint32 ptr;
1626	uint32 num_sids1;
1627
1628	DOM_SID2 *sid;
1629
1630	NTSTATUS status;
1631
1632} SAMR_R_QUERY_ALIASMEM;
1633
1634
1635/* SAMR_Q_ADD_ALIASMEM - add alias member */
1636typedef struct q_samr_add_alias_mem_info
1637{
1638	POLICY_HND alias_pol;       /* policy handle */
1639
1640	DOM_SID2 sid; /* member sid to be added to the alias */
1641
1642} SAMR_Q_ADD_ALIASMEM;
1643
1644
1645/* SAMR_R_ADD_ALIASMEM - add alias member */
1646typedef struct r_samr_add_alias_mem_info
1647{
1648	NTSTATUS status;         /* return status */
1649
1650} SAMR_R_ADD_ALIASMEM;
1651
1652
1653/* SAMR_Q_DEL_ALIASMEM - add an add alias member */
1654typedef struct q_samr_del_alias_mem_info
1655{
1656	POLICY_HND alias_pol;       /* policy handle */
1657
1658	DOM_SID2 sid; /* member sid to be added to alias */
1659
1660} SAMR_Q_DEL_ALIASMEM;
1661
1662
1663/* SAMR_R_DEL_ALIASMEM - delete alias member */
1664typedef struct r_samr_del_alias_mem_info
1665{
1666	NTSTATUS status;         /* return status */
1667
1668} SAMR_R_DEL_ALIASMEM;
1669
1670
1671
1672/* SAMR_Q_OPEN_ALIAS - probably an open */
1673typedef struct q_samr_open_alias_info
1674{
1675	POLICY_HND dom_pol;
1676
1677	uint32 access_mask;
1678	uint32 rid_alias;
1679
1680} SAMR_Q_OPEN_ALIAS;
1681
1682
1683/* SAMR_R_OPEN_ALIAS - probably an open */
1684typedef struct r_samr_open_alias_info
1685{
1686	POLICY_HND pol;       /* policy handle */
1687	NTSTATUS status;         /* return status */
1688
1689} SAMR_R_OPEN_ALIAS;
1690
1691
1692/* SAMR_Q_CONNECT_ANON - probably an open */
1693typedef struct q_samr_connect_anon_info
1694{
1695	uint32 ptr;                  /* ptr? */
1696	uint16 unknown_0;            /* 0x005c */
1697	uint16 unknown_1;            /* 0x0001 */
1698	uint32 access_mask;
1699
1700} SAMR_Q_CONNECT_ANON;
1701
1702/* SAMR_R_CONNECT_ANON - probably an open */
1703typedef struct r_samr_connect_anon_info
1704{
1705	POLICY_HND connect_pol;       /* policy handle */
1706	NTSTATUS status;         /* return status */
1707
1708} SAMR_R_CONNECT_ANON;
1709
1710/* SAMR_Q_CONNECT - probably an open */
1711typedef struct q_samr_connect_info
1712{
1713	uint32 ptr_srv_name;         /* pointer (to server name?) */
1714	UNISTR2 uni_srv_name;        /* unicode server name starting with '\\' */
1715
1716	uint32 access_mask;
1717
1718} SAMR_Q_CONNECT;
1719
1720
1721/* SAMR_R_CONNECT - probably an open */
1722typedef struct r_samr_connect_info
1723{
1724    POLICY_HND connect_pol;       /* policy handle */
1725	NTSTATUS status;         /* return status */
1726
1727} SAMR_R_CONNECT;
1728
1729/* SAMR_Q_CONNECT4 */
1730typedef struct q_samr_connect4_info
1731{
1732	uint32 ptr_srv_name; /* pointer to server name */
1733	UNISTR2 uni_srv_name;
1734
1735	uint32 unk_0; /* possible server name type, 1 for IP num, 2 for name */
1736	uint32 access_mask;
1737} SAMR_Q_CONNECT4;
1738
1739/* SAMR_R_CONNECT4 - same format as connect */
1740typedef struct r_samr_connect_info SAMR_R_CONNECT4;
1741
1742/* SAMR_Q_GET_DOM_PWINFO */
1743typedef struct q_samr_get_dom_pwinfo
1744{
1745	uint32 ptr;
1746	UNIHDR  hdr_srv_name;
1747	UNISTR2 uni_srv_name;
1748
1749} SAMR_Q_GET_DOM_PWINFO;
1750
1751/* SAMR_R_GET_DOM_PWINFO */
1752typedef struct r_samr_get_dom_pwinfo
1753{
1754	/*
1755	 * See Samba4 IDL
1756	 */
1757	uint16 unk_0;
1758	uint32 unk_1;
1759	NTSTATUS status;
1760
1761} SAMR_R_GET_DOM_PWINFO;
1762
1763/* SAMR_ENC_PASSWD */
1764typedef struct enc_passwd_info
1765{
1766	uint32 ptr;
1767	uint8 pass[516];
1768
1769} SAMR_ENC_PASSWD;
1770
1771/* SAMR_ENC_HASH */
1772typedef struct enc_hash_info
1773{
1774	uint32 ptr;
1775	uint8 hash[16];
1776
1777} SAMR_ENC_HASH;
1778
1779/* SAMR_Q_CHGPASSWD_USER */
1780typedef struct q_samr_chgpasswd_user_info
1781{
1782	uint32 ptr_0;
1783
1784	UNIHDR hdr_dest_host; /* server name unicode header */
1785	UNISTR2 uni_dest_host; /* server name unicode string */
1786
1787	UNIHDR hdr_user_name;    /* username unicode string header */
1788	UNISTR2 uni_user_name;    /* username unicode string */
1789
1790	SAMR_ENC_PASSWD nt_newpass;
1791	SAMR_ENC_HASH nt_oldhash;
1792
1793	uint32 unknown; /* 0x0000 0001 */
1794
1795	SAMR_ENC_PASSWD lm_newpass;
1796	SAMR_ENC_HASH lm_oldhash;
1797
1798} SAMR_Q_CHGPASSWD_USER;
1799
1800/* SAMR_R_CHGPASSWD_USER */
1801typedef struct r_samr_chgpasswd_user_info
1802{
1803	NTSTATUS status; /* 0 == OK, C000006A (NT_STATUS_WRONG_PASSWORD) */
1804
1805} SAMR_R_CHGPASSWD_USER;
1806
1807
1808/* SAMR_Q_REMOVE_SID_FOREIGN_DOMAIN */
1809typedef struct q_samr_remove_sid_foreign_domain_info
1810{
1811	POLICY_HND dom_pol;   /* policy handle */
1812	DOM_SID2 sid;         /* SID */
1813
1814} SAMR_Q_REMOVE_SID_FOREIGN_DOMAIN;
1815
1816
1817/* SAMR_R_REMOVE_SID_FOREIGN_DOMAIN */
1818typedef struct r_samr_remove_sid_foreign_domain_info
1819{
1820	NTSTATUS status;         /* return status */
1821
1822} SAMR_R_REMOVE_SID_FOREIGN_DOMAIN;
1823
1824
1825
1826/* these are from the old rpc_samr.h - they are needed while the merge
1827   is still going on */
1828#define MAX_SAM_SIDS 15
1829
1830/* DOM_SID3 - security id */
1831typedef struct sid_info_3
1832{
1833        uint16 len; /* length, bytes, including length of len :-) */
1834        /* uint8  pad[2]; */
1835
1836        DOM_SID sid;
1837
1838} DOM_SID3;
1839
1840/* SAMR_Q_UNKNOWN_2E */
1841typedef struct q_samr_unknown_2e_info
1842{
1843	POLICY_HND domain_pol;   /* policy handle */
1844	uint16 switch_value;
1845
1846} SAMR_Q_UNKNOWN_2E;
1847
1848/* SAMR_R_UNKNOWN_2E */
1849typedef struct r_samr_unknown_2e_info
1850{
1851	uint32 ptr_0;
1852	uint16 switch_value;
1853	SAM_UNK_CTR *ctr;
1854	NTSTATUS status;         /* return status */
1855
1856} SAMR_R_UNKNOWN_2E;
1857
1858/* SAMR_Q_SET_DOMAIN_INFO */
1859typedef struct q_samr_set_domain_info
1860{
1861	POLICY_HND domain_pol;   /* policy handle */
1862	uint16 switch_value0;
1863	uint16 switch_value;
1864	SAM_UNK_CTR *ctr;
1865
1866} SAMR_Q_SET_DOMAIN_INFO;
1867
1868/* SAMR_R_SET_DOMAIN_INFO */
1869typedef struct r_samr_set_domain_info
1870{
1871	NTSTATUS status;         /* return status */
1872
1873} SAMR_R_SET_DOMAIN_INFO;
1874
1875#endif /* _RPC_SAMR_H */
1876