2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
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) Elrond 2000,
8 * Copyright (C) Jeremy Allison 2001,
9 * Copyright (C) Jean François Micouleau 1998-2001,
10 * Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002.
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #include "rpc_parse.h"
32 #define DBGC_CLASS DBGC_RPC_PARSE
34 /*******************************************************************
35 inits a SAMR_Q_CLOSE_HND structure.
36 ********************************************************************/
38 void init_samr_q_close_hnd(SAMR_Q_CLOSE_HND * q_c, POLICY_HND *hnd)
40 DEBUG(5, ("init_samr_q_close_hnd\n"));
45 /*******************************************************************
46 reads or writes a structure.
47 ********************************************************************/
49 BOOL samr_io_q_close_hnd(const char *desc, SAMR_Q_CLOSE_HND * q_u,
50 prs_struct *ps, int depth)
55 prs_debug(ps, depth, desc, "samr_io_q_close_hnd");
61 return smb_io_pol_hnd("pol", &q_u->pol, ps, depth);
64 /*******************************************************************
65 reads or writes a structure.
66 ********************************************************************/
68 BOOL samr_io_r_close_hnd(const char *desc, SAMR_R_CLOSE_HND * r_u,
69 prs_struct *ps, int depth)
74 prs_debug(ps, depth, desc, "samr_io_r_close_hnd");
80 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
83 if(!prs_ntstatus("status", ps, depth, &r_u->status))
89 /*******************************************************************
90 inits a SAMR_Q_LOOKUP_DOMAIN structure.
91 ********************************************************************/
93 void init_samr_q_lookup_domain(SAMR_Q_LOOKUP_DOMAIN * q_u,
94 POLICY_HND *pol, char *dom_name)
96 DEBUG(5, ("init_samr_q_lookup_domain\n"));
98 q_u->connect_pol = *pol;
100 init_unistr2(&q_u->uni_domain, dom_name, UNI_FLAGS_NONE);
101 init_uni_hdr(&q_u->hdr_domain, &q_u->uni_domain);
104 /*******************************************************************
105 reads or writes a structure.
106 ********************************************************************/
107 BOOL samr_io_q_lookup_domain(const char *desc, SAMR_Q_LOOKUP_DOMAIN * q_u,
108 prs_struct *ps, int depth)
113 prs_debug(ps, depth, desc, "samr_io_q_lookup_domain");
119 if(!smb_io_pol_hnd("connect_pol", &q_u->connect_pol, ps, depth))
122 if(!smb_io_unihdr("hdr_domain", &q_u->hdr_domain, ps, depth))
125 if(!smb_io_unistr2("uni_domain", &q_u->uni_domain, q_u->hdr_domain.buffer, ps, depth))
131 /*******************************************************************
132 inits a SAMR_R_LOOKUP_DOMAIN structure.
133 ********************************************************************/
135 void init_samr_r_lookup_domain(SAMR_R_LOOKUP_DOMAIN * r_u,
136 DOM_SID *dom_sid, NTSTATUS status)
138 DEBUG(5, ("init_samr_r_lookup_domain\n"));
140 r_u->status = status;
142 if (NT_STATUS_IS_OK(status)) {
144 init_dom_sid2(&r_u->dom_sid, dom_sid);
148 /*******************************************************************
149 reads or writes a structure.
150 ********************************************************************/
152 BOOL samr_io_r_lookup_domain(const char *desc, SAMR_R_LOOKUP_DOMAIN * r_u,
153 prs_struct *ps, int depth)
158 prs_debug(ps, depth, desc, "samr_io_r_lookup_domain");
164 if(!prs_uint32("ptr", ps, depth, &r_u->ptr_sid))
167 if (r_u->ptr_sid != 0) {
168 if(!smb_io_dom_sid2("sid", &r_u->dom_sid, ps, depth))
174 if(!prs_ntstatus("status", ps, depth, &r_u->status))
180 /*******************************************************************
181 reads or writes a structure.
182 ********************************************************************/
184 void init_samr_q_remove_sid_foreign_domain(SAMR_Q_REMOVE_SID_FOREIGN_DOMAIN * q_u, POLICY_HND *dom_pol, DOM_SID *sid)
186 DEBUG(5, ("samr_init_samr_q_remove_sid_foreign_domain\n"));
188 q_u->dom_pol = *dom_pol;
189 init_dom_sid2(&q_u->sid, sid);
192 /*******************************************************************
193 reads or writes a structure.
194 ********************************************************************/
196 BOOL samr_io_q_remove_sid_foreign_domain(const char *desc, SAMR_Q_REMOVE_SID_FOREIGN_DOMAIN * q_u,
197 prs_struct *ps, int depth)
202 prs_debug(ps, depth, desc, "samr_io_q_remove_sid_foreign_domain");
208 if(!smb_io_pol_hnd("domain_pol", &q_u->dom_pol, ps, depth))
211 if(!smb_io_dom_sid2("sid", &q_u->sid, ps, depth))
220 /*******************************************************************
221 reads or writes a structure.
222 ********************************************************************/
224 BOOL samr_io_r_remove_sid_foreign_domain(const char *desc, SAMR_R_REMOVE_SID_FOREIGN_DOMAIN * r_u,
225 prs_struct *ps, int depth)
230 prs_debug(ps, depth, desc, "samr_io_r_remove_sid_foreign_domain");
236 if(!prs_ntstatus("status", ps, depth, &r_u->status))
242 /*******************************************************************
243 reads or writes a structure.
244 ********************************************************************/
246 void init_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN * q_u,
247 POLICY_HND *pol, uint32 flags,
250 DEBUG(5, ("samr_init_samr_q_open_domain\n"));
254 init_dom_sid2(&q_u->dom_sid, sid);
257 /*******************************************************************
258 reads or writes a structure.
259 ********************************************************************/
261 BOOL samr_io_q_open_domain(const char *desc, SAMR_Q_OPEN_DOMAIN * q_u,
262 prs_struct *ps, int depth)
267 prs_debug(ps, depth, desc, "samr_io_q_open_domain");
273 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
276 if(!prs_uint32("flags", ps, depth, &q_u->flags))
279 if(!smb_io_dom_sid2("sid", &q_u->dom_sid, ps, depth))
285 /*******************************************************************
286 reads or writes a structure.
287 ********************************************************************/
289 BOOL samr_io_r_open_domain(const char *desc, SAMR_R_OPEN_DOMAIN * r_u,
290 prs_struct *ps, int depth)
295 prs_debug(ps, depth, desc, "samr_io_r_open_domain");
301 if(!smb_io_pol_hnd("domain_pol", &r_u->domain_pol, ps, depth))
304 if(!prs_ntstatus("status", ps, depth, &r_u->status))
310 /*******************************************************************
311 reads or writes a structure.
312 ********************************************************************/
314 void init_samr_q_get_usrdom_pwinfo(SAMR_Q_GET_USRDOM_PWINFO * q_u,
315 POLICY_HND *user_pol)
317 DEBUG(5, ("samr_init_samr_q_get_usrdom_pwinfo\n"));
319 q_u->user_pol = *user_pol;
322 /*******************************************************************
323 reads or writes a structure.
324 ********************************************************************/
326 BOOL samr_io_q_get_usrdom_pwinfo(const char *desc, SAMR_Q_GET_USRDOM_PWINFO * q_u,
327 prs_struct *ps, int depth)
332 prs_debug(ps, depth, desc, "samr_io_q_get_usrdom_pwinfo");
338 return smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth);
341 /*******************************************************************
343 ********************************************************************/
345 void init_samr_r_get_usrdom_pwinfo(SAMR_R_GET_USRDOM_PWINFO *r_u, NTSTATUS status)
347 DEBUG(5, ("init_samr_r_get_usrdom_pwinfo\n"));
349 r_u->unknown_0 = 0x0000;
353 * r_u->unknown_1 = 0x0015;
356 r_u->unknown_1 = 0x01D1;
357 r_u->unknown_1 = 0x0015;
359 r_u->unknown_2 = 0x00000000;
361 r_u->status = status;
364 /*******************************************************************
365 reads or writes a structure.
366 ********************************************************************/
368 BOOL samr_io_r_get_usrdom_pwinfo(const char *desc, SAMR_R_GET_USRDOM_PWINFO * r_u,
369 prs_struct *ps, int depth)
374 prs_debug(ps, depth, desc, "samr_io_r_get_usrdom_pwinfo");
380 if(!prs_uint16("unknown_0", ps, depth, &r_u->unknown_0))
382 if(!prs_uint16("unknown_1", ps, depth, &r_u->unknown_1))
384 if(!prs_uint32("unknown_2", ps, depth, &r_u->unknown_2))
386 if(!prs_ntstatus("status ", ps, depth, &r_u->status))
393 /*******************************************************************
394 reads or writes a structure.
395 ********************************************************************/
397 BOOL samr_io_q_set_sec_obj(const char *desc, SAMR_Q_SET_SEC_OBJ * q_u,
398 prs_struct *ps, int depth)
403 prs_debug(ps, depth, desc, "samr_io_q_set_sec_obj");
409 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
412 if(!prs_uint32("sec_info", ps, depth, &q_u->sec_info))
415 if(!sec_io_desc_buf("sec_desc", &q_u->buf, ps, depth))
422 /*******************************************************************
423 reads or writes a structure.
424 ********************************************************************/
426 void init_samr_q_query_sec_obj(SAMR_Q_QUERY_SEC_OBJ * q_u,
427 POLICY_HND *user_pol, uint32 sec_info)
429 DEBUG(5, ("samr_init_samr_q_query_sec_obj\n"));
431 q_u->user_pol = *user_pol;
432 q_u->sec_info = sec_info;
436 /*******************************************************************
437 reads or writes a structure.
438 ********************************************************************/
440 BOOL samr_io_q_query_sec_obj(const char *desc, SAMR_Q_QUERY_SEC_OBJ * q_u,
441 prs_struct *ps, int depth)
446 prs_debug(ps, depth, desc, "samr_io_q_query_sec_obj");
452 if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth))
455 if(!prs_uint32("sec_info", ps, depth, &q_u->sec_info))
461 /*******************************************************************
462 reads or writes a structure.
463 ********************************************************************/
465 void init_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO * q_u,
466 POLICY_HND *domain_pol, uint16 switch_value)
468 DEBUG(5, ("samr_init_samr_q_query_dom_info\n"));
470 q_u->domain_pol = *domain_pol;
471 q_u->switch_value = switch_value;
474 /*******************************************************************
475 reads or writes a structure.
476 ********************************************************************/
478 BOOL samr_io_q_query_dom_info(const char *desc, SAMR_Q_QUERY_DOMAIN_INFO * q_u,
479 prs_struct *ps, int depth)
484 prs_debug(ps, depth, desc, "samr_io_q_query_dom_info");
490 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
493 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
500 /*******************************************************************
502 ********************************************************************/
504 void init_unk_info3(SAM_UNK_INFO_3 *u_3, NTTIME nt_logout)
506 u_3->logout.low = nt_logout.low;
507 u_3->logout.high = nt_logout.high;
510 /*******************************************************************
511 reads or writes a structure.
512 ********************************************************************/
514 static BOOL sam_io_unk_info3(const char *desc, SAM_UNK_INFO_3 * u_3,
515 prs_struct *ps, int depth)
520 prs_debug(ps, depth, desc, "sam_io_unk_info3");
523 if(!smb_io_time("logout", &u_3->logout, ps, depth))
529 /*******************************************************************
531 ********************************************************************/
533 void init_unk_info6(SAM_UNK_INFO_6 * u_6)
535 u_6->unknown_0 = 0x00000000;
537 memset(u_6->padding, 0, sizeof(u_6->padding)); /* 12 bytes zeros */
540 /*******************************************************************
541 reads or writes a structure.
542 ********************************************************************/
544 static BOOL sam_io_unk_info6(const char *desc, SAM_UNK_INFO_6 * u_6,
545 prs_struct *ps, int depth)
550 prs_debug(ps, depth, desc, "sam_io_unk_info6");
553 if(!prs_uint32("unknown_0", ps, depth, &u_6->unknown_0)) /* 0x0000 0000 */
555 if(!prs_uint32("ptr_0", ps, depth, &u_6->ptr_0)) /* pointer to unknown structure */
557 if(!prs_uint8s(False, "padding", ps, depth, u_6->padding, sizeof(u_6->padding))) /* 12 bytes zeros */
563 /*******************************************************************
565 ********************************************************************/
567 void init_unk_info7(SAM_UNK_INFO_7 * u_7)
569 u_7->unknown_0 = 0x0003;
572 /*******************************************************************
573 reads or writes a structure.
574 ********************************************************************/
576 static BOOL sam_io_unk_info7(const char *desc, SAM_UNK_INFO_7 * u_7,
577 prs_struct *ps, int depth)
582 prs_debug(ps, depth, desc, "sam_io_unk_info7");
585 if(!prs_uint16("unknown_0", ps, depth, &u_7->unknown_0)) /* 0x0003 */
591 /*******************************************************************
593 ********************************************************************/
595 void init_unk_info12(SAM_UNK_INFO_12 * u_12, NTTIME nt_lock_duration, NTTIME nt_reset_time, uint16 lockout)
597 u_12->duration.low = nt_lock_duration.low;
598 u_12->duration.high = nt_lock_duration.high;
599 u_12->reset_count.low = nt_reset_time.low;
600 u_12->reset_count.high = nt_reset_time.high;
602 u_12->bad_attempt_lockout = lockout;
605 /*******************************************************************
606 reads or writes a structure.
607 ********************************************************************/
609 static BOOL sam_io_unk_info12(const char *desc, SAM_UNK_INFO_12 * u_12,
610 prs_struct *ps, int depth)
615 prs_debug(ps, depth, desc, "sam_io_unk_info12");
618 if(!smb_io_time("duration", &u_12->duration, ps, depth))
620 if(!smb_io_time("reset_count", &u_12->reset_count, ps, depth))
622 if(!prs_uint16("bad_attempt_lockout", ps, depth, &u_12->bad_attempt_lockout))
628 /*******************************************************************
630 ********************************************************************/
632 void init_unk_info5(SAM_UNK_INFO_5 * u_5,const char *server)
634 init_unistr2(&u_5->uni_server, server, UNI_FLAGS_NONE);
635 init_uni_hdr(&u_5->hdr_server, &u_5->uni_server);
638 /*******************************************************************
639 reads or writes a structure.
640 ********************************************************************/
642 static BOOL sam_io_unk_info5(const char *desc, SAM_UNK_INFO_5 * u_5,
643 prs_struct *ps, int depth)
648 prs_debug(ps, depth, desc, "sam_io_unk_info5");
651 if(!smb_io_unihdr("hdr_server", &u_5->hdr_server, ps, depth))
654 if(!smb_io_unistr2("uni_server", &u_5->uni_server, u_5->hdr_server.buffer, ps, depth))
660 /*******************************************************************
662 ********************************************************************/
664 void init_unk_info2(SAM_UNK_INFO_2 * u_2,
665 const char *domain, const char *server,
666 uint32 seq_num, uint32 num_users, uint32 num_groups, uint32 num_alias)
668 u_2->unknown_0 = 0x00000000;
669 u_2->unknown_1 = 0x80000000;
670 u_2->unknown_2 = 0x00000000;
674 u_2->seq_num = seq_num;
675 u_2->unknown_3 = 0x00000000;
677 u_2->unknown_4 = 0x00000001;
678 u_2->unknown_5 = 0x00000003;
679 u_2->unknown_6 = 0x00000001;
680 u_2->num_domain_usrs = num_users;
681 u_2->num_domain_grps = num_groups;
682 u_2->num_local_grps = num_alias;
684 memset(u_2->padding, 0, sizeof(u_2->padding)); /* 12 bytes zeros */
686 init_unistr2(&u_2->uni_domain, domain, UNI_FLAGS_NONE);
687 init_uni_hdr(&u_2->hdr_domain, &u_2->uni_domain);
688 init_unistr2(&u_2->uni_server, server, UNI_FLAGS_NONE);
689 init_uni_hdr(&u_2->hdr_server, &u_2->uni_server);
692 /*******************************************************************
693 reads or writes a structure.
694 ********************************************************************/
696 static BOOL sam_io_unk_info2(const char *desc, SAM_UNK_INFO_2 * u_2,
697 prs_struct *ps, int depth)
702 prs_debug(ps, depth, desc, "sam_io_unk_info2");
705 if(!prs_uint32("unknown_0", ps, depth, &u_2->unknown_0)) /* 0x0000 0000 */
707 if(!prs_uint32("unknown_1", ps, depth, &u_2->unknown_1)) /* 0x8000 0000 */
709 if(!prs_uint32("unknown_2", ps, depth, &u_2->unknown_2)) /* 0x0000 0000 */
712 if(!prs_uint32("ptr_0", ps, depth, &u_2->ptr_0))
714 if(!smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth))
716 if(!smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth))
719 /* put all the data in here, at the moment, including what the above
720 pointer is referring to
723 if(!prs_uint32("seq_num ", ps, depth, &u_2->seq_num)) /* 0x0000 0099 or 0x1000 0000 */
725 if(!prs_uint32("unknown_3 ", ps, depth, &u_2->unknown_3)) /* 0x0000 0000 */
728 if(!prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4)) /* 0x0000 0001 */
730 if(!prs_uint32("unknown_5 ", ps, depth, &u_2->unknown_5)) /* 0x0000 0003 */
732 if(!prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6)) /* 0x0000 0001 */
734 if(!prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs))
736 if(!prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps))
738 if(!prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps))
742 /* this was originally marked as 'padding'. It isn't
743 padding, it is some sort of optional 12 byte
744 structure. When it is present it contains zeros
746 if(!prs_uint8s(False, "unknown", ps, depth, u_2->padding,sizeof(u_2->padding)))
750 if(!smb_io_unistr2("uni_domain", &u_2->uni_domain, u_2->hdr_domain.buffer, ps, depth))
752 if(!smb_io_unistr2("uni_server", &u_2->uni_server, u_2->hdr_server.buffer, ps, depth))
758 /*******************************************************************
760 ********************************************************************/
762 void init_unk_info1(SAM_UNK_INFO_1 *u_1, uint16 min_pass_len, uint16 pass_hist,
763 uint32 flag, NTTIME nt_expire, NTTIME nt_min_age)
765 u_1->min_length_password = min_pass_len;
766 u_1->password_history = pass_hist;
769 /* password never expire */
770 u_1->expire.high = nt_expire.high;
771 u_1->expire.low = nt_expire.low;
773 /* can change the password now */
774 u_1->min_passwordage.high = nt_min_age.high;
775 u_1->min_passwordage.low = nt_min_age.low;
779 /*******************************************************************
780 reads or writes a structure.
781 ********************************************************************/
783 static BOOL sam_io_unk_info1(const char *desc, SAM_UNK_INFO_1 * u_1,
784 prs_struct *ps, int depth)
789 prs_debug(ps, depth, desc, "sam_io_unk_info1");
792 if(!prs_uint16("min_length_password", ps, depth, &u_1->min_length_password))
794 if(!prs_uint16("password_history", ps, depth, &u_1->password_history))
796 if(!prs_uint32("flag", ps, depth, &u_1->flag))
798 if(!smb_io_time("expire", &u_1->expire, ps, depth))
800 if(!smb_io_time("min_passwordage", &u_1->min_passwordage, ps, depth))
806 /*******************************************************************
807 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
808 ********************************************************************/
810 void init_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO * r_u,
811 uint16 switch_value, SAM_UNK_CTR * ctr,
814 DEBUG(5, ("init_samr_r_query_dom_info\n"));
817 r_u->switch_value = 0;
818 r_u->status = status; /* return status */
820 if (NT_STATUS_IS_OK(status)) {
821 r_u->switch_value = switch_value;
827 /*******************************************************************
828 reads or writes a structure.
829 ********************************************************************/
831 BOOL samr_io_r_query_dom_info(const char *desc, SAMR_R_QUERY_DOMAIN_INFO * r_u,
832 prs_struct *ps, int depth)
837 prs_debug(ps, depth, desc, "samr_io_r_query_dom_info");
843 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
846 if (r_u->ptr_0 != 0 && r_u->ctr != NULL) {
847 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
852 switch (r_u->switch_value) {
854 if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth))
858 if(!sam_io_unk_info7("unk_inf7",&r_u->ctr->info.inf7, ps,depth))
862 if(!sam_io_unk_info6("unk_inf6",&r_u->ctr->info.inf6, ps,depth))
866 if(!sam_io_unk_info5("unk_inf5",&r_u->ctr->info.inf5, ps,depth))
870 if(!sam_io_unk_info3("unk_inf3",&r_u->ctr->info.inf3, ps,depth))
874 if(!sam_io_unk_info2("unk_inf2",&r_u->ctr->info.inf2, ps,depth))
878 if(!sam_io_unk_info1("unk_inf1",&r_u->ctr->info.inf1, ps,depth))
882 DEBUG(0, ("samr_io_r_query_dom_info: unknown switch level 0x%x\n",
884 r_u->status = NT_STATUS_INVALID_INFO_CLASS;
892 if(!prs_ntstatus("status", ps, depth, &r_u->status))
898 /*******************************************************************
899 reads or writes a SAMR_R_SET_SEC_OBJ structure.
900 ********************************************************************/
902 BOOL samr_io_r_set_sec_obj(const char *desc, SAMR_R_SET_SEC_OBJ * r_u,
903 prs_struct *ps, int depth)
908 prs_debug(ps, depth, desc, "samr_io_r_set_sec_obj");
914 if(!prs_ntstatus("status", ps, depth, &r_u->status))
920 /*******************************************************************
921 reads or writes a SAMR_R_QUERY_SEC_OBJ structure.
922 ********************************************************************/
924 BOOL samr_io_r_query_sec_obj(const char *desc, SAMR_R_QUERY_SEC_OBJ * r_u,
925 prs_struct *ps, int depth)
930 prs_debug(ps, depth, desc, "samr_io_r_query_sec_obj");
936 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
939 if(!sec_io_desc_buf("sec", &r_u->buf, ps, depth))
943 if(!prs_ntstatus("status", ps, depth, &r_u->status))
949 /*******************************************************************
950 reads or writes a SAM_STR1 structure.
951 ********************************************************************/
953 static BOOL sam_io_sam_str1(const char *desc, SAM_STR1 * sam, uint32 acct_buf,
954 uint32 name_buf, uint32 desc_buf,
955 prs_struct *ps, int depth)
960 prs_debug(ps, depth, desc, "sam_io_sam_str1");
965 if (!smb_io_unistr2("name", &sam->uni_acct_name, acct_buf, ps, depth))
968 if (!smb_io_unistr2("desc", &sam->uni_acct_desc, desc_buf, ps, depth))
971 if (!smb_io_unistr2("full", &sam->uni_full_name, name_buf, ps, depth))
977 /*******************************************************************
978 inits a SAM_ENTRY1 structure.
979 ********************************************************************/
981 static void init_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx,
982 UNISTR2 *sam_name, UNISTR2 *sam_full,
983 UNISTR2 *sam_desc, uint32 rid_user,
986 DEBUG(5, ("init_sam_entry1\n"));
990 sam->user_idx = user_idx;
991 sam->rid_user = rid_user;
992 sam->acb_info = acb_info;
994 init_uni_hdr(&sam->hdr_acct_name, sam_name);
995 init_uni_hdr(&sam->hdr_user_name, sam_full);
996 init_uni_hdr(&sam->hdr_user_desc, sam_desc);
999 /*******************************************************************
1000 reads or writes a SAM_ENTRY1 structure.
1001 ********************************************************************/
1003 static BOOL sam_io_sam_entry1(const char *desc, SAM_ENTRY1 * sam,
1004 prs_struct *ps, int depth)
1009 prs_debug(ps, depth, desc, "sam_io_sam_entry1");
1015 if(!prs_uint32("user_idx ", ps, depth, &sam->user_idx))
1018 if(!prs_uint32("rid_user ", ps, depth, &sam->rid_user))
1020 if(!prs_uint16("acb_info ", ps, depth, &sam->acb_info))
1026 if (!smb_io_unihdr("hdr_acct_name", &sam->hdr_acct_name, ps, depth))
1028 if (!smb_io_unihdr("hdr_user_desc", &sam->hdr_user_desc, ps, depth))
1030 if (!smb_io_unihdr("hdr_user_name", &sam->hdr_user_name, ps, depth))
1036 /*******************************************************************
1037 reads or writes a SAM_STR2 structure.
1038 ********************************************************************/
1040 static BOOL sam_io_sam_str2(const char *desc, SAM_STR2 * sam, uint32 acct_buf,
1041 uint32 desc_buf, prs_struct *ps, int depth)
1046 prs_debug(ps, depth, desc, "sam_io_sam_str2");
1052 if(!smb_io_unistr2("uni_srv_name", &sam->uni_srv_name, acct_buf, ps, depth)) /* account name unicode string */
1054 if(!smb_io_unistr2("uni_srv_desc", &sam->uni_srv_desc, desc_buf, ps, depth)) /* account desc unicode string */
1060 /*******************************************************************
1061 inits a SAM_ENTRY2 structure.
1062 ********************************************************************/
1063 static void init_sam_entry2(SAM_ENTRY2 * sam, uint32 user_idx,
1064 UNISTR2 *sam_name, UNISTR2 *sam_desc,
1065 uint32 rid_user, uint16 acb_info)
1067 DEBUG(5, ("init_sam_entry2\n"));
1069 sam->user_idx = user_idx;
1070 sam->rid_user = rid_user;
1071 sam->acb_info = acb_info;
1073 init_uni_hdr(&sam->hdr_srv_name, sam_name);
1074 init_uni_hdr(&sam->hdr_srv_desc, sam_desc);
1077 /*******************************************************************
1078 reads or writes a SAM_ENTRY2 structure.
1079 ********************************************************************/
1081 static BOOL sam_io_sam_entry2(const char *desc, SAM_ENTRY2 * sam,
1082 prs_struct *ps, int depth)
1087 prs_debug(ps, depth, desc, "sam_io_sam_entry2");
1093 if(!prs_uint32("user_idx ", ps, depth, &sam->user_idx))
1096 if(!prs_uint32("rid_user ", ps, depth, &sam->rid_user))
1098 if(!prs_uint16("acb_info ", ps, depth, &sam->acb_info))
1104 if(!smb_io_unihdr("unihdr", &sam->hdr_srv_name, ps, depth)) /* account name unicode string header */
1106 if(!smb_io_unihdr("unihdr", &sam->hdr_srv_desc, ps, depth)) /* account name unicode string header */
1112 /*******************************************************************
1113 reads or writes a SAM_STR3 structure.
1114 ********************************************************************/
1116 static BOOL sam_io_sam_str3(const char *desc, SAM_STR3 * sam, uint32 acct_buf,
1117 uint32 desc_buf, prs_struct *ps, int depth)
1122 prs_debug(ps, depth, desc, "sam_io_sam_str3");
1128 if(!smb_io_unistr2("uni_grp_name", &sam->uni_grp_name, acct_buf, ps, depth)) /* account name unicode string */
1130 if(!smb_io_unistr2("uni_grp_desc", &sam->uni_grp_desc, desc_buf, ps, depth)) /* account desc unicode string */
1136 /*******************************************************************
1137 inits a SAM_ENTRY3 structure.
1138 ********************************************************************/
1140 static void init_sam_entry3(SAM_ENTRY3 * sam, uint32 grp_idx,
1141 UNISTR2 *grp_name, UNISTR2 *grp_desc,
1144 DEBUG(5, ("init_sam_entry3\n"));
1146 sam->grp_idx = grp_idx;
1147 sam->rid_grp = rid_grp;
1148 sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */
1150 init_uni_hdr(&sam->hdr_grp_name, grp_name);
1151 init_uni_hdr(&sam->hdr_grp_desc, grp_desc);
1154 /*******************************************************************
1155 reads or writes a SAM_ENTRY3 structure.
1156 ********************************************************************/
1158 static BOOL sam_io_sam_entry3(const char *desc, SAM_ENTRY3 * sam,
1159 prs_struct *ps, int depth)
1164 prs_debug(ps, depth, desc, "sam_io_sam_entry3");
1170 if(!prs_uint32("grp_idx", ps, depth, &sam->grp_idx))
1173 if(!prs_uint32("rid_grp", ps, depth, &sam->rid_grp))
1175 if(!prs_uint32("attr ", ps, depth, &sam->attr))
1178 if(!smb_io_unihdr("unihdr", &sam->hdr_grp_name, ps, depth)) /* account name unicode string header */
1180 if(!smb_io_unihdr("unihdr", &sam->hdr_grp_desc, ps, depth)) /* account name unicode string header */
1186 /*******************************************************************
1187 inits a SAM_ENTRY4 structure.
1188 ********************************************************************/
1190 static void init_sam_entry4(SAM_ENTRY4 * sam, uint32 user_idx,
1191 uint32 len_acct_name)
1193 DEBUG(5, ("init_sam_entry4\n"));
1195 sam->user_idx = user_idx;
1196 init_str_hdr(&sam->hdr_acct_name, len_acct_name+1, len_acct_name, len_acct_name != 0);
1199 /*******************************************************************
1200 reads or writes a SAM_ENTRY4 structure.
1201 ********************************************************************/
1203 static BOOL sam_io_sam_entry4(const char *desc, SAM_ENTRY4 * sam,
1204 prs_struct *ps, int depth)
1209 prs_debug(ps, depth, desc, "sam_io_sam_entry4");
1215 if(!prs_uint32("user_idx", ps, depth, &sam->user_idx))
1217 if(!smb_io_strhdr("strhdr", &sam->hdr_acct_name, ps, depth))
1223 /*******************************************************************
1224 inits a SAM_ENTRY5 structure.
1225 ********************************************************************/
1227 static void init_sam_entry5(SAM_ENTRY5 * sam, uint32 grp_idx,
1228 uint32 len_grp_name)
1230 DEBUG(5, ("init_sam_entry5\n"));
1232 sam->grp_idx = grp_idx;
1233 init_str_hdr(&sam->hdr_grp_name, len_grp_name, len_grp_name,
1237 /*******************************************************************
1238 reads or writes a SAM_ENTRY5 structure.
1239 ********************************************************************/
1241 static BOOL sam_io_sam_entry5(const char *desc, SAM_ENTRY5 * sam,
1242 prs_struct *ps, int depth)
1247 prs_debug(ps, depth, desc, "sam_io_sam_entry5");
1253 if(!prs_uint32("grp_idx", ps, depth, &sam->grp_idx))
1255 if(!smb_io_strhdr("strhdr", &sam->hdr_grp_name, ps, depth))
1261 /*******************************************************************
1262 inits a SAM_ENTRY structure.
1263 ********************************************************************/
1265 void init_sam_entry(SAM_ENTRY *sam, UNISTR2 *uni2, uint32 rid)
1267 DEBUG(10, ("init_sam_entry: %d\n", rid));
1270 init_uni_hdr(&sam->hdr_name, uni2);
1273 /*******************************************************************
1274 reads or writes a SAM_ENTRY structure.
1275 ********************************************************************/
1277 static BOOL sam_io_sam_entry(const char *desc, SAM_ENTRY * sam,
1278 prs_struct *ps, int depth)
1283 prs_debug(ps, depth, desc, "sam_io_sam_entry");
1288 if(!prs_uint32("rid", ps, depth, &sam->rid))
1290 if(!smb_io_unihdr("unihdr", &sam->hdr_name, ps, depth)) /* account name unicode string header */
1296 /*******************************************************************
1297 inits a SAMR_Q_ENUM_DOM_USERS structure.
1298 ********************************************************************/
1300 void init_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS * q_e, POLICY_HND *pol,
1302 uint16 acb_mask, uint16 unk_1, uint32 size)
1304 DEBUG(5, ("init_samr_q_enum_dom_users\n"));
1308 q_e->start_idx = start_idx; /* zero indicates lots */
1309 q_e->acb_mask = acb_mask;
1310 q_e->unknown_1 = unk_1;
1311 q_e->max_size = size;
1314 /*******************************************************************
1315 reads or writes a structure.
1316 ********************************************************************/
1318 BOOL samr_io_q_enum_dom_users(const char *desc, SAMR_Q_ENUM_DOM_USERS * q_e,
1319 prs_struct *ps, int depth)
1324 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_users");
1330 if(!smb_io_pol_hnd("domain_pol", &q_e->pol, ps, depth))
1333 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
1335 if(!prs_uint16("acb_mask ", ps, depth, &q_e->acb_mask))
1337 if(!prs_uint16("unknown_1", ps, depth, &q_e->unknown_1))
1340 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1347 /*******************************************************************
1348 inits a SAMR_R_ENUM_DOM_USERS structure.
1349 ********************************************************************/
1351 void init_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS * r_u,
1352 uint32 next_idx, uint32 num_sam_entries)
1354 DEBUG(5, ("init_samr_r_enum_dom_users\n"));
1356 r_u->next_idx = next_idx;
1358 if (num_sam_entries != 0) {
1359 r_u->ptr_entries1 = 1;
1360 r_u->ptr_entries2 = 1;
1361 r_u->num_entries2 = num_sam_entries;
1362 r_u->num_entries3 = num_sam_entries;
1364 r_u->num_entries4 = num_sam_entries;
1366 r_u->ptr_entries1 = 0;
1367 r_u->num_entries2 = num_sam_entries;
1368 r_u->ptr_entries2 = 1;
1372 /*******************************************************************
1373 reads or writes a structure.
1374 ********************************************************************/
1376 BOOL samr_io_r_enum_dom_users(const char *desc, SAMR_R_ENUM_DOM_USERS * r_u,
1377 prs_struct *ps, int depth)
1384 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_users");
1390 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
1392 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
1395 if (r_u->ptr_entries1 != 0) {
1396 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
1398 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
1400 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
1403 if (UNMARSHALLING(ps) && (r_u->num_entries2 != 0)) {
1404 r_u->sam = (SAM_ENTRY *)prs_alloc_mem(ps,sizeof(SAM_ENTRY)*r_u->num_entries2);
1405 r_u->uni_acct_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2)*r_u->num_entries2);
1408 if ((r_u->sam == NULL || r_u->uni_acct_name == NULL) && r_u->num_entries2 != 0) {
1409 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_USERS\n"));
1410 r_u->num_entries4 = 0;
1411 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
1415 for (i = 0; i < r_u->num_entries2; i++) {
1416 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
1420 for (i = 0; i < r_u->num_entries2; i++) {
1421 if(!smb_io_unistr2("", &r_u->uni_acct_name[i],r_u->sam[i].hdr_name.buffer, ps,depth))
1430 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
1432 if(!prs_ntstatus("status", ps, depth, &r_u->status))
1438 /*******************************************************************
1439 inits a SAMR_Q_QUERY_DISPINFO structure.
1440 ********************************************************************/
1442 void init_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO * q_e, POLICY_HND *pol,
1443 uint16 switch_level, uint32 start_idx,
1444 uint32 max_entries, uint32 max_size)
1446 DEBUG(5, ("init_samr_q_query_dispinfo\n"));
1448 q_e->domain_pol = *pol;
1450 q_e->switch_level = switch_level;
1452 q_e->start_idx = start_idx;
1453 q_e->max_entries = max_entries;
1454 q_e->max_size = max_size;
1457 /*******************************************************************
1458 reads or writes a structure.
1459 ********************************************************************/
1461 BOOL samr_io_q_query_dispinfo(const char *desc, SAMR_Q_QUERY_DISPINFO * q_e,
1462 prs_struct *ps, int depth)
1467 prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo");
1473 if(!smb_io_pol_hnd("domain_pol", &q_e->domain_pol, ps, depth))
1476 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
1481 if(!prs_uint32("start_idx ", ps, depth, &q_e->start_idx))
1483 if(!prs_uint32("max_entries ", ps, depth, &q_e->max_entries))
1485 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1491 /*******************************************************************
1492 inits a SAM_DISPINFO_1 structure.
1493 ********************************************************************/
1495 NTSTATUS init_sam_dispinfo_1(TALLOC_CTX *ctx, SAM_DISPINFO_1 *sam, uint32 num_entries,
1496 uint32 start_idx, SAM_ACCOUNT *disp_user_info,
1497 DOM_SID *domain_sid)
1501 SAM_ACCOUNT *pwd = NULL;
1504 DEBUG(10, ("init_sam_dispinfo_1: num_entries: %d\n", num_entries));
1507 return NT_STATUS_OK;
1509 sam->sam=(SAM_ENTRY1 *)talloc(ctx, num_entries*sizeof(SAM_ENTRY1));
1511 return NT_STATUS_NO_MEMORY;
1513 sam->str=(SAM_STR1 *)talloc(ctx, num_entries*sizeof(SAM_STR1));
1515 return NT_STATUS_NO_MEMORY;
1517 ZERO_STRUCTP(sam->sam);
1518 ZERO_STRUCTP(sam->str);
1520 for (i = 0; i < num_entries ; i++) {
1521 const char *username;
1522 const char *fullname;
1523 const char *acct_desc;
1525 const DOM_SID *user_sid;
1526 fstring user_sid_string, domain_sid_string;
1528 DEBUG(11, ("init_sam_dispinfo_1: entry: %d\n",i));
1530 pwd=&disp_user_info[i+start_idx];
1532 username = pdb_get_username(pwd);
1533 fullname = pdb_get_fullname(pwd);
1534 acct_desc = pdb_get_acct_desc(pwd);
1545 user_sid = pdb_get_user_sid(pwd);
1547 if (!sid_peek_check_rid(domain_sid, user_sid, &user_rid)) {
1548 DEBUG(0, ("init_sam_dispinfo_1: User %s has SID %s, which conflicts with "
1549 "the domain sid %s. Failing operation.\n",
1551 sid_to_string(user_sid_string, user_sid),
1552 sid_to_string(domain_sid_string, domain_sid)));
1553 return NT_STATUS_UNSUCCESSFUL;
1556 init_unistr2(&sam->str[i].uni_acct_name, pdb_get_username(pwd), UNI_FLAGS_NONE);
1557 init_unistr2(&sam->str[i].uni_full_name, pdb_get_fullname(pwd), UNI_FLAGS_NONE);
1558 init_unistr2(&sam->str[i].uni_acct_desc, pdb_get_acct_desc(pwd), UNI_FLAGS_NONE);
1560 init_sam_entry1(&sam->sam[i], start_idx + i + 1,
1561 &sam->str[i].uni_acct_name, &sam->str[i].uni_full_name, &sam->str[i].uni_acct_desc,
1562 user_rid, pdb_get_acct_ctrl(pwd));
1566 return NT_STATUS_OK;
1569 /*******************************************************************
1570 reads or writes a structure.
1571 ********************************************************************/
1573 static BOOL sam_io_sam_dispinfo_1(const char *desc, SAM_DISPINFO_1 * sam,
1575 prs_struct *ps, int depth)
1579 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_1");
1585 if (UNMARSHALLING(ps) && num_entries > 0) {
1587 if ((sam->sam = (SAM_ENTRY1 *)
1588 prs_alloc_mem(ps, sizeof(SAM_ENTRY1) *
1589 num_entries)) == NULL) {
1590 DEBUG(0, ("out of memory allocating SAM_ENTRY1\n"));
1594 if ((sam->str = (SAM_STR1 *)
1595 prs_alloc_mem(ps, sizeof(SAM_STR1) *
1596 num_entries)) == NULL) {
1597 DEBUG(0, ("out of memory allocating SAM_STR1\n"));
1602 for (i = 0; i < num_entries; i++) {
1603 if(!sam_io_sam_entry1("", &sam->sam[i], ps, depth))
1607 for (i = 0; i < num_entries; i++) {
1608 if(!sam_io_sam_str1("", &sam->str[i],
1609 sam->sam[i].hdr_acct_name.buffer,
1610 sam->sam[i].hdr_user_name.buffer,
1611 sam->sam[i].hdr_user_desc.buffer, ps, depth))
1618 /*******************************************************************
1619 inits a SAM_DISPINFO_2 structure.
1620 ********************************************************************/
1622 NTSTATUS init_sam_dispinfo_2(TALLOC_CTX *ctx, SAM_DISPINFO_2 *sam, uint32 num_entries,
1623 uint32 start_idx, SAM_ACCOUNT *disp_user_info,
1624 DOM_SID *domain_sid )
1628 SAM_ACCOUNT *pwd = NULL;
1631 DEBUG(10, ("init_sam_dispinfo_2: num_entries: %d\n", num_entries));
1634 return NT_STATUS_OK;
1636 if (!(sam->sam=(SAM_ENTRY2 *)talloc(ctx, num_entries*sizeof(SAM_ENTRY2))))
1637 return NT_STATUS_NO_MEMORY;
1639 if (!(sam->str=(SAM_STR2 *)talloc(ctx, num_entries*sizeof(SAM_STR2))))
1640 return NT_STATUS_NO_MEMORY;
1642 ZERO_STRUCTP(sam->sam);
1643 ZERO_STRUCTP(sam->str);
1645 for (i = 0; i < num_entries; i++) {
1647 const DOM_SID *user_sid;
1648 const char *username;
1649 const char *acct_desc;
1650 fstring user_sid_string, domain_sid_string;
1652 DEBUG(11, ("init_sam_dispinfo_2: entry: %d\n",i));
1653 pwd=&disp_user_info[i+start_idx];
1655 username = pdb_get_username(pwd);
1656 acct_desc = pdb_get_acct_desc(pwd);
1657 user_sid = pdb_get_user_sid(pwd);
1659 if (!sid_peek_check_rid(domain_sid, user_sid, &user_rid)) {
1660 DEBUG(0, ("init_sam_dispinfo_2: User %s has SID %s, which conflicts with "
1661 "the domain sid %s. Failing operation.\n",
1663 sid_to_string(user_sid_string, user_sid),
1664 sid_to_string(domain_sid_string, domain_sid)));
1665 return NT_STATUS_UNSUCCESSFUL;
1668 init_unistr2(&sam->str[i].uni_srv_name, username, UNI_FLAGS_NONE);
1669 init_unistr2(&sam->str[i].uni_srv_desc, acct_desc, UNI_FLAGS_NONE);
1671 init_sam_entry2(&sam->sam[i], start_idx + i + 1,
1672 &sam->str[i].uni_srv_name, &sam->str[i].uni_srv_desc,
1673 user_rid, pdb_get_acct_ctrl(pwd));
1676 return NT_STATUS_OK;
1679 /*******************************************************************
1680 reads or writes a structure.
1681 ********************************************************************/
1683 static BOOL sam_io_sam_dispinfo_2(const char *desc, SAM_DISPINFO_2 * sam,
1685 prs_struct *ps, int depth)
1692 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_2");
1698 if (UNMARSHALLING(ps) && num_entries > 0) {
1700 if ((sam->sam = (SAM_ENTRY2 *)
1701 prs_alloc_mem(ps, sizeof(SAM_ENTRY2) *
1702 num_entries)) == NULL) {
1703 DEBUG(0, ("out of memory allocating SAM_ENTRY2\n"));
1707 if ((sam->str = (SAM_STR2 *)
1708 prs_alloc_mem(ps, sizeof(SAM_STR2) *
1709 num_entries)) == NULL) {
1710 DEBUG(0, ("out of memory allocating SAM_STR2\n"));
1715 for (i = 0; i < num_entries; i++) {
1716 if(!sam_io_sam_entry2("", &sam->sam[i], ps, depth))
1720 for (i = 0; i < num_entries; i++) {
1721 if(!sam_io_sam_str2("", &sam->str[i],
1722 sam->sam[i].hdr_srv_name.buffer,
1723 sam->sam[i].hdr_srv_desc.buffer, ps, depth))
1730 /*******************************************************************
1731 inits a SAM_DISPINFO_3 structure.
1732 ********************************************************************/
1734 NTSTATUS init_sam_dispinfo_3(TALLOC_CTX *ctx, SAM_DISPINFO_3 *sam, uint32 num_entries,
1735 uint32 start_idx, DOMAIN_GRP *disp_group_info)
1741 DEBUG(5, ("init_sam_dispinfo_3: num_entries: %d\n", num_entries));
1744 return NT_STATUS_OK;
1746 if (!(sam->sam=(SAM_ENTRY3 *)talloc(ctx, num_entries*sizeof(SAM_ENTRY3))))
1747 return NT_STATUS_NO_MEMORY;
1749 if (!(sam->str=(SAM_STR3 *)talloc(ctx, num_entries*sizeof(SAM_STR3))))
1750 return NT_STATUS_NO_MEMORY;
1752 ZERO_STRUCTP(sam->sam);
1753 ZERO_STRUCTP(sam->str);
1755 for (i = 0; i < num_entries; i++) {
1756 DOMAIN_GRP *grp = &disp_group_info[i+start_idx];
1758 DEBUG(11, ("init_sam_dispinfo_3: entry: %d\n",i));
1760 init_unistr2(&sam->str[i].uni_grp_name, grp->name, UNI_FLAGS_NONE);
1761 init_unistr2(&sam->str[i].uni_grp_desc, grp->comment, UNI_FLAGS_NONE);
1763 init_sam_entry3(&sam->sam[i], start_idx + i + 1, &sam->str[i].uni_grp_name,
1764 &sam->str[i].uni_grp_desc, grp->rid);
1767 return NT_STATUS_OK;
1770 /*******************************************************************
1771 reads or writes a structure.
1772 ********************************************************************/
1774 static BOOL sam_io_sam_dispinfo_3(const char *desc, SAM_DISPINFO_3 * sam,
1776 prs_struct *ps, int depth)
1783 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_3");
1789 if (UNMARSHALLING(ps) && num_entries > 0) {
1791 if ((sam->sam = (SAM_ENTRY3 *)
1792 prs_alloc_mem(ps, sizeof(SAM_ENTRY3) *
1793 num_entries)) == NULL) {
1794 DEBUG(0, ("out of memory allocating SAM_ENTRY3\n"));
1798 if ((sam->str = (SAM_STR3 *)
1799 prs_alloc_mem(ps, sizeof(SAM_STR3) *
1800 num_entries)) == NULL) {
1801 DEBUG(0, ("out of memory allocating SAM_STR3\n"));
1806 for (i = 0; i < num_entries; i++) {
1807 if(!sam_io_sam_entry3("", &sam->sam[i], ps, depth))
1811 for (i = 0; i < num_entries; i++) {
1812 if(!sam_io_sam_str3("", &sam->str[i],
1813 sam->sam[i].hdr_grp_name.buffer,
1814 sam->sam[i].hdr_grp_desc.buffer, ps, depth))
1821 /*******************************************************************
1822 inits a SAM_DISPINFO_4 structure.
1823 ********************************************************************/
1825 NTSTATUS init_sam_dispinfo_4(TALLOC_CTX *ctx, SAM_DISPINFO_4 *sam, uint32 num_entries,
1826 uint32 start_idx, SAM_ACCOUNT *disp_user_info)
1828 uint32 len_sam_name;
1831 SAM_ACCOUNT *pwd = NULL;
1834 DEBUG(5, ("init_sam_dispinfo_4: num_entries: %d\n", num_entries));
1837 return NT_STATUS_OK;
1839 if (!(sam->sam=(SAM_ENTRY4 *)talloc(ctx, num_entries*sizeof(SAM_ENTRY4))))
1840 return NT_STATUS_NO_MEMORY;
1842 if (!(sam->str=(SAM_STR4 *)talloc(ctx, num_entries*sizeof(SAM_STR4))))
1843 return NT_STATUS_NO_MEMORY;
1845 ZERO_STRUCTP(sam->sam);
1846 ZERO_STRUCTP(sam->str);
1848 for (i = 0; i < num_entries; i++) {
1849 DEBUG(11, ("init_sam_dispinfo_2: entry: %d\n",i));
1850 pwd=&disp_user_info[i+start_idx];
1852 len_sam_name = strlen(pdb_get_username(pwd));
1854 init_sam_entry4(&sam->sam[i], start_idx + i + 1, len_sam_name);
1856 init_string2(&sam->str[i].acct_name, pdb_get_username(pwd), len_sam_name+1, len_sam_name);
1859 return NT_STATUS_OK;
1862 /*******************************************************************
1863 reads or writes a structure.
1864 ********************************************************************/
1866 static BOOL sam_io_sam_dispinfo_4(const char *desc, SAM_DISPINFO_4 * sam,
1868 prs_struct *ps, int depth)
1875 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_4");
1881 if (UNMARSHALLING(ps) && num_entries > 0) {
1883 if ((sam->sam = (SAM_ENTRY4 *)
1884 prs_alloc_mem(ps, sizeof(SAM_ENTRY4) *
1885 num_entries)) == NULL) {
1886 DEBUG(0, ("out of memory allocating SAM_ENTRY4\n"));
1890 if ((sam->str = (SAM_STR4 *)
1891 prs_alloc_mem(ps, sizeof(SAM_STR4) *
1892 num_entries)) == NULL) {
1893 DEBUG(0, ("out of memory allocating SAM_STR4\n"));
1898 for (i = 0; i < num_entries; i++) {
1899 if(!sam_io_sam_entry4("", &sam->sam[i], ps, depth))
1903 for (i = 0; i < num_entries; i++) {
1904 if(!smb_io_string2("acct_name", &sam->str[i].acct_name,
1905 sam->sam[i].hdr_acct_name.buffer, ps, depth))
1912 /*******************************************************************
1913 inits a SAM_DISPINFO_5 structure.
1914 ********************************************************************/
1916 NTSTATUS init_sam_dispinfo_5(TALLOC_CTX *ctx, SAM_DISPINFO_5 *sam, uint32 num_entries,
1917 uint32 start_idx, DOMAIN_GRP *disp_group_info)
1919 uint32 len_sam_name;
1924 DEBUG(5, ("init_sam_dispinfo_5: num_entries: %d\n", num_entries));
1927 return NT_STATUS_OK;
1929 if (!(sam->sam=(SAM_ENTRY5 *)talloc(ctx, num_entries*sizeof(SAM_ENTRY5))))
1930 return NT_STATUS_NO_MEMORY;
1932 if (!(sam->str=(SAM_STR5 *)talloc(ctx, num_entries*sizeof(SAM_STR5))))
1933 return NT_STATUS_NO_MEMORY;
1935 ZERO_STRUCTP(sam->sam);
1936 ZERO_STRUCTP(sam->str);
1938 for (i = 0; i < num_entries; i++) {
1939 DOMAIN_GRP *grp = &disp_group_info[i+start_idx];
1941 DEBUG(11, ("init_sam_dispinfo_5: entry: %d\n",i));
1943 len_sam_name = strlen(grp->name);
1945 init_sam_entry5(&sam->sam[i], start_idx + i + 1, len_sam_name);
1946 init_string2(&sam->str[i].grp_name, grp->name, len_sam_name+1, len_sam_name);
1949 return NT_STATUS_OK;
1952 /*******************************************************************
1953 reads or writes a structure.
1954 ********************************************************************/
1956 static BOOL sam_io_sam_dispinfo_5(const char *desc, SAM_DISPINFO_5 * sam,
1958 prs_struct *ps, int depth)
1965 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_5");
1971 if (UNMARSHALLING(ps) && num_entries > 0) {
1973 if ((sam->sam = (SAM_ENTRY5 *)
1974 prs_alloc_mem(ps, sizeof(SAM_ENTRY5) *
1975 num_entries)) == NULL) {
1976 DEBUG(0, ("out of memory allocating SAM_ENTRY5\n"));
1980 if ((sam->str = (SAM_STR5 *)
1981 prs_alloc_mem(ps, sizeof(SAM_STR5) *
1982 num_entries)) == NULL) {
1983 DEBUG(0, ("out of memory allocating SAM_STR5\n"));
1988 for (i = 0; i < num_entries; i++) {
1989 if(!sam_io_sam_entry5("", &sam->sam[i], ps, depth))
1993 for (i = 0; i < num_entries; i++) {
1994 if(!smb_io_string2("grp_name", &sam->str[i].grp_name,
1995 sam->sam[i].hdr_grp_name.buffer, ps, depth))
2002 /*******************************************************************
2003 inits a SAMR_R_QUERY_DISPINFO structure.
2004 ********************************************************************/
2006 void init_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO * r_u,
2007 uint32 num_entries, uint32 total_size, uint32 data_size,
2008 uint16 switch_level, SAM_DISPINFO_CTR * ctr,
2011 DEBUG(5, ("init_samr_r_query_dispinfo: level %d\n", switch_level));
2013 r_u->total_size = total_size;
2015 r_u->data_size = data_size;
2017 r_u->switch_level = switch_level;
2018 r_u->num_entries = num_entries;
2021 r_u->ptr_entries = 0;
2023 r_u->ptr_entries = 1;
2025 r_u->num_entries2 = num_entries;
2028 r_u->status = status;
2031 /*******************************************************************
2032 reads or writes a structure.
2033 ********************************************************************/
2035 BOOL samr_io_r_query_dispinfo(const char *desc, SAMR_R_QUERY_DISPINFO * r_u,
2036 prs_struct *ps, int depth)
2041 prs_debug(ps, depth, desc, "samr_io_r_query_dispinfo");
2047 if(!prs_uint32("total_size ", ps, depth, &r_u->total_size))
2049 if(!prs_uint32("data_size ", ps, depth, &r_u->data_size))
2051 if(!prs_uint16("switch_level", ps, depth, &r_u->switch_level))
2056 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
2058 if(!prs_uint32("ptr_entries ", ps, depth, &r_u->ptr_entries))
2061 if (r_u->ptr_entries==0) {
2064 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2070 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
2073 switch (r_u->switch_level) {
2075 if(!sam_io_sam_dispinfo_1("users", r_u->ctr->sam.info1,
2076 r_u->num_entries, ps, depth))
2080 if(!sam_io_sam_dispinfo_2("servers", r_u->ctr->sam.info2,
2081 r_u->num_entries, ps, depth))
2085 if(!sam_io_sam_dispinfo_3("groups", r_u->ctr->sam.info3,
2086 r_u->num_entries, ps, depth))
2090 if(!sam_io_sam_dispinfo_4("user list",
2091 r_u->ctr->sam.info4,
2092 r_u->num_entries, ps, depth))
2096 if(!sam_io_sam_dispinfo_5("group list",
2097 r_u->ctr->sam.info5,
2098 r_u->num_entries, ps, depth))
2102 DEBUG(0,("samr_io_r_query_dispinfo: unknown switch value\n"));
2108 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2114 /*******************************************************************
2115 inits a SAMR_Q_OPEN_GROUP structure.
2116 ********************************************************************/
2118 void init_samr_q_open_group(SAMR_Q_OPEN_GROUP * q_c,
2120 uint32 access_mask, uint32 rid)
2122 DEBUG(5, ("init_samr_q_open_group\n"));
2124 q_c->domain_pol = *hnd;
2125 q_c->access_mask = access_mask;
2126 q_c->rid_group = rid;
2129 /*******************************************************************
2130 reads or writes a structure.
2131 ********************************************************************/
2133 BOOL samr_io_q_open_group(const char *desc, SAMR_Q_OPEN_GROUP * q_u,
2134 prs_struct *ps, int depth)
2139 prs_debug(ps, depth, desc, "samr_io_q_open_group");
2145 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
2148 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
2150 if(!prs_uint32("rid_group", ps, depth, &q_u->rid_group))
2156 /*******************************************************************
2157 reads or writes a structure.
2158 ********************************************************************/
2160 BOOL samr_io_r_open_group(const char *desc, SAMR_R_OPEN_GROUP * r_u,
2161 prs_struct *ps, int depth)
2166 prs_debug(ps, depth, desc, "samr_io_r_open_group");
2172 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2175 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2181 /*******************************************************************
2182 inits a GROUP_INFO1 structure.
2183 ********************************************************************/
2185 void init_samr_group_info1(GROUP_INFO1 * gr1,
2186 char *acct_name, char *acct_desc,
2189 DEBUG(5, ("init_samr_group_info1\n"));
2191 gr1->unknown_1 = 0x3;
2192 gr1->num_members = num_members;
2194 init_unistr2(&gr1->uni_acct_name, acct_name, UNI_FLAGS_NONE);
2195 init_uni_hdr(&gr1->hdr_acct_name, &gr1->uni_acct_name);
2196 init_unistr2(&gr1->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2197 init_uni_hdr(&gr1->hdr_acct_desc, &gr1->uni_acct_desc);
2200 /*******************************************************************
2201 reads or writes a structure.
2202 ********************************************************************/
2204 BOOL samr_io_group_info1(const char *desc, GROUP_INFO1 * gr1,
2205 prs_struct *ps, int depth)
2212 prs_debug(ps, depth, desc, "samr_io_group_info1");
2215 if(!prs_uint16("level", ps, depth, &dummy))
2221 if(!smb_io_unihdr("hdr_acct_name", &gr1->hdr_acct_name, ps, depth))
2224 if(!prs_uint32("unknown_1", ps, depth, &gr1->unknown_1))
2226 if(!prs_uint32("num_members", ps, depth, &gr1->num_members))
2229 if(!smb_io_unihdr("hdr_acct_desc", &gr1->hdr_acct_desc, ps, depth))
2232 if(!smb_io_unistr2("uni_acct_name", &gr1->uni_acct_name,
2233 gr1->hdr_acct_name.buffer, ps, depth))
2236 if(!smb_io_unistr2("uni_acct_desc", &gr1->uni_acct_desc,
2237 gr1->hdr_acct_desc.buffer, ps, depth))
2243 /*******************************************************************
2244 inits a GROUP_INFO2 structure.
2245 ********************************************************************/
2247 void init_samr_group_info2(GROUP_INFO2 * gr2, const char *acct_name)
2249 DEBUG(5, ("init_samr_group_info2\n"));
2252 init_unistr2(&gr2->uni_acct_name, acct_name, UNI_FLAGS_NONE);
2253 init_uni_hdr(&gr2->hdr_acct_name, &gr2->uni_acct_name);
2256 /*******************************************************************
2257 reads or writes a structure.
2258 ********************************************************************/
2260 BOOL samr_io_group_info2(const char *desc, GROUP_INFO2 *gr2, prs_struct *ps, int depth)
2265 prs_debug(ps, depth, desc, "samr_io_group_info2");
2268 if(!prs_uint16("hdr_level", ps, depth, &gr2->level))
2271 if(!smb_io_unihdr("hdr_acct_name", &gr2->hdr_acct_name, ps, depth))
2273 if(!smb_io_unistr2("uni_acct_name", &gr2->uni_acct_name,
2274 gr2->hdr_acct_name.buffer, ps, depth))
2280 /*******************************************************************
2281 inits a GROUP_INFO3 structure.
2282 ********************************************************************/
2284 void init_samr_group_info3(GROUP_INFO3 *gr3)
2286 DEBUG(5, ("init_samr_group_info3\n"));
2288 gr3->unknown_1 = 0x3;
2291 /*******************************************************************
2292 reads or writes a structure.
2293 ********************************************************************/
2295 BOOL samr_io_group_info3(const char *desc, GROUP_INFO3 *gr3, prs_struct *ps, int depth)
2300 prs_debug(ps, depth, desc, "samr_io_group_info3");
2306 if(!prs_uint32("unknown_1", ps, depth, &gr3->unknown_1))
2312 /*******************************************************************
2313 inits a GROUP_INFO4 structure.
2314 ********************************************************************/
2316 void init_samr_group_info4(GROUP_INFO4 * gr4, const char *acct_desc)
2318 DEBUG(5, ("init_samr_group_info4\n"));
2321 init_unistr2(&gr4->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2322 init_uni_hdr(&gr4->hdr_acct_desc, &gr4->uni_acct_desc);
2325 /*******************************************************************
2326 reads or writes a structure.
2327 ********************************************************************/
2329 BOOL samr_io_group_info4(const char *desc, GROUP_INFO4 * gr4,
2330 prs_struct *ps, int depth)
2335 prs_debug(ps, depth, desc, "samr_io_group_info4");
2338 if(!prs_uint16("hdr_level", ps, depth, &gr4->level))
2340 if(!smb_io_unihdr("hdr_acct_desc", &gr4->hdr_acct_desc, ps, depth))
2342 if(!smb_io_unistr2("uni_acct_desc", &gr4->uni_acct_desc,
2343 gr4->hdr_acct_desc.buffer, ps, depth))
2349 /*******************************************************************
2350 reads or writes a structure.
2351 ********************************************************************/
2353 static BOOL samr_group_info_ctr(const char *desc, GROUP_INFO_CTR **ctr,
2354 prs_struct *ps, int depth)
2356 if (UNMARSHALLING(ps))
2357 *ctr = (GROUP_INFO_CTR *)prs_alloc_mem(ps,sizeof(GROUP_INFO_CTR));
2362 prs_debug(ps, depth, desc, "samr_group_info_ctr");
2365 if(!prs_uint16("switch_value1", ps, depth, &(*ctr)->switch_value1))
2368 switch ((*ctr)->switch_value1) {
2370 if(!samr_io_group_info1("group_info1", &(*ctr)->group.info1, ps, depth))
2374 if(!samr_io_group_info2("group_info2", &(*ctr)->group.info2, ps, depth))
2378 if(!samr_io_group_info3("group_info3", &(*ctr)->group.info3, ps, depth))
2382 if(!samr_io_group_info4("group_info4", &(*ctr)->group.info4, ps, depth))
2386 DEBUG(0,("samr_group_info_ctr: unsupported switch level\n"));
2393 /*******************************************************************
2394 inits a SAMR_Q_CREATE_DOM_GROUP structure.
2395 ********************************************************************/
2397 void init_samr_q_create_dom_group(SAMR_Q_CREATE_DOM_GROUP * q_e,
2398 POLICY_HND *pol, const char *acct_desc,
2401 DEBUG(5, ("init_samr_q_create_dom_group\n"));
2405 init_unistr2(&q_e->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2406 init_uni_hdr(&q_e->hdr_acct_desc, &q_e->uni_acct_desc);
2408 q_e->access_mask = access_mask;
2411 /*******************************************************************
2412 reads or writes a structure.
2413 ********************************************************************/
2415 BOOL samr_io_q_create_dom_group(const char *desc, SAMR_Q_CREATE_DOM_GROUP * q_e,
2416 prs_struct *ps, int depth)
2421 prs_debug(ps, depth, desc, "samr_io_q_create_dom_group");
2427 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2430 if(!smb_io_unihdr("hdr_acct_desc", &q_e->hdr_acct_desc, ps, depth))
2432 if(!smb_io_unistr2("uni_acct_desc", &q_e->uni_acct_desc,
2433 q_e->hdr_acct_desc.buffer, ps, depth))
2438 if(!prs_uint32("access", ps, depth, &q_e->access_mask))
2444 /*******************************************************************
2445 reads or writes a structure.
2446 ********************************************************************/
2448 BOOL samr_io_r_create_dom_group(const char *desc, SAMR_R_CREATE_DOM_GROUP * r_u,
2449 prs_struct *ps, int depth)
2454 prs_debug(ps, depth, desc, "samr_io_r_create_dom_group");
2460 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2463 if(!prs_uint32("rid ", ps, depth, &r_u->rid))
2465 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2471 /*******************************************************************
2472 inits a SAMR_Q_DELETE_DOM_GROUP structure.
2473 ********************************************************************/
2475 void init_samr_q_delete_dom_group(SAMR_Q_DELETE_DOM_GROUP * q_c,
2478 DEBUG(5, ("init_samr_q_delete_dom_group\n"));
2480 q_c->group_pol = *hnd;
2483 /*******************************************************************
2484 reads or writes a structure.
2485 ********************************************************************/
2487 BOOL samr_io_q_delete_dom_group(const char *desc, SAMR_Q_DELETE_DOM_GROUP * q_u,
2488 prs_struct *ps, int depth)
2493 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_group");
2499 if(!smb_io_pol_hnd("group_pol", &q_u->group_pol, ps, depth))
2505 /*******************************************************************
2506 reads or writes a structure.
2507 ********************************************************************/
2509 BOOL samr_io_r_delete_dom_group(const char *desc, SAMR_R_DELETE_DOM_GROUP * r_u,
2510 prs_struct *ps, int depth)
2515 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_group");
2521 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2524 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2530 /*******************************************************************
2531 inits a SAMR_Q_DEL_GROUPMEM structure.
2532 ********************************************************************/
2534 void init_samr_q_del_groupmem(SAMR_Q_DEL_GROUPMEM * q_e,
2535 POLICY_HND *pol, uint32 rid)
2537 DEBUG(5, ("init_samr_q_del_groupmem\n"));
2543 /*******************************************************************
2544 reads or writes a structure.
2545 ********************************************************************/
2547 BOOL samr_io_q_del_groupmem(const char *desc, SAMR_Q_DEL_GROUPMEM * q_e,
2548 prs_struct *ps, int depth)
2553 prs_debug(ps, depth, desc, "samr_io_q_del_groupmem");
2559 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2562 if(!prs_uint32("rid", ps, depth, &q_e->rid))
2568 /*******************************************************************
2569 inits a SAMR_R_DEL_GROUPMEM structure.
2570 ********************************************************************/
2572 void init_samr_r_del_groupmem(SAMR_R_DEL_GROUPMEM * r_u, POLICY_HND *pol,
2575 DEBUG(5, ("init_samr_r_del_groupmem\n"));
2577 r_u->status = status;
2580 /*******************************************************************
2581 reads or writes a structure.
2582 ********************************************************************/
2584 BOOL samr_io_r_del_groupmem(const char *desc, SAMR_R_DEL_GROUPMEM * r_u,
2585 prs_struct *ps, int depth)
2590 prs_debug(ps, depth, desc, "samr_io_r_del_groupmem");
2596 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2602 /*******************************************************************
2603 inits a SAMR_Q_ADD_GROUPMEM structure.
2604 ********************************************************************/
2606 void init_samr_q_add_groupmem(SAMR_Q_ADD_GROUPMEM * q_e,
2607 POLICY_HND *pol, uint32 rid)
2609 DEBUG(5, ("init_samr_q_add_groupmem\n"));
2613 q_e->unknown = 0x0005;
2616 /*******************************************************************
2617 reads or writes a structure.
2618 ********************************************************************/
2620 BOOL samr_io_q_add_groupmem(const char *desc, SAMR_Q_ADD_GROUPMEM * q_e,
2621 prs_struct *ps, int depth)
2626 prs_debug(ps, depth, desc, "samr_io_q_add_groupmem");
2632 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2635 if(!prs_uint32("rid ", ps, depth, &q_e->rid))
2637 if(!prs_uint32("unknown", ps, depth, &q_e->unknown))
2643 /*******************************************************************
2644 inits a SAMR_R_ADD_GROUPMEM structure.
2645 ********************************************************************/
2647 void init_samr_r_add_groupmem(SAMR_R_ADD_GROUPMEM * r_u, POLICY_HND *pol,
2650 DEBUG(5, ("init_samr_r_add_groupmem\n"));
2652 r_u->status = status;
2655 /*******************************************************************
2656 reads or writes a structure.
2657 ********************************************************************/
2659 BOOL samr_io_r_add_groupmem(const char *desc, SAMR_R_ADD_GROUPMEM * r_u,
2660 prs_struct *ps, int depth)
2665 prs_debug(ps, depth, desc, "samr_io_r_add_groupmem");
2671 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2677 /*******************************************************************
2678 inits a SAMR_Q_SET_GROUPINFO structure.
2679 ********************************************************************/
2681 void init_samr_q_set_groupinfo(SAMR_Q_SET_GROUPINFO * q_e,
2682 POLICY_HND *pol, GROUP_INFO_CTR * ctr)
2684 DEBUG(5, ("init_samr_q_set_groupinfo\n"));
2690 /*******************************************************************
2691 reads or writes a structure.
2692 ********************************************************************/
2694 BOOL samr_io_q_set_groupinfo(const char *desc, SAMR_Q_SET_GROUPINFO * q_e,
2695 prs_struct *ps, int depth)
2700 prs_debug(ps, depth, desc, "samr_io_q_set_groupinfo");
2706 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2709 if(!samr_group_info_ctr("ctr", &q_e->ctr, ps, depth))
2715 /*******************************************************************
2716 inits a SAMR_R_SET_GROUPINFO structure.
2717 ********************************************************************/
2719 void init_samr_r_set_groupinfo(SAMR_R_SET_GROUPINFO * r_u, NTSTATUS status)
2721 DEBUG(5, ("init_samr_r_set_groupinfo\n"));
2723 r_u->status = status;
2726 /*******************************************************************
2727 reads or writes a structure.
2728 ********************************************************************/
2730 BOOL samr_io_r_set_groupinfo(const char *desc, SAMR_R_SET_GROUPINFO * r_u,
2731 prs_struct *ps, int depth)
2736 prs_debug(ps, depth, desc, "samr_io_r_set_groupinfo");
2742 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2748 /*******************************************************************
2749 inits a SAMR_Q_QUERY_GROUPINFO structure.
2750 ********************************************************************/
2752 void init_samr_q_query_groupinfo(SAMR_Q_QUERY_GROUPINFO * q_e,
2753 POLICY_HND *pol, uint16 switch_level)
2755 DEBUG(5, ("init_samr_q_query_groupinfo\n"));
2759 q_e->switch_level = switch_level;
2762 /*******************************************************************
2763 reads or writes a structure.
2764 ********************************************************************/
2766 BOOL samr_io_q_query_groupinfo(const char *desc, SAMR_Q_QUERY_GROUPINFO * q_e,
2767 prs_struct *ps, int depth)
2772 prs_debug(ps, depth, desc, "samr_io_q_query_groupinfo");
2778 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2781 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
2787 /*******************************************************************
2788 inits a SAMR_R_QUERY_GROUPINFO structure.
2789 ********************************************************************/
2791 void init_samr_r_query_groupinfo(SAMR_R_QUERY_GROUPINFO * r_u,
2792 GROUP_INFO_CTR * ctr, NTSTATUS status)
2794 DEBUG(5, ("init_samr_r_query_groupinfo\n"));
2796 r_u->ptr = (NT_STATUS_IS_OK(status) && ctr != NULL) ? 1 : 0;
2798 r_u->status = status;
2801 /*******************************************************************
2802 reads or writes a structure.
2803 ********************************************************************/
2805 BOOL samr_io_r_query_groupinfo(const char *desc, SAMR_R_QUERY_GROUPINFO * r_u,
2806 prs_struct *ps, int depth)
2811 prs_debug(ps, depth, desc, "samr_io_r_query_groupinfo");
2817 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
2820 if (r_u->ptr != 0) {
2821 if(!samr_group_info_ctr("ctr", &r_u->ctr, ps, depth))
2827 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2833 /*******************************************************************
2834 inits a SAMR_Q_QUERY_GROUPMEM structure.
2835 ********************************************************************/
2837 void init_samr_q_query_groupmem(SAMR_Q_QUERY_GROUPMEM * q_c, POLICY_HND *hnd)
2839 DEBUG(5, ("init_samr_q_query_groupmem\n"));
2841 q_c->group_pol = *hnd;
2844 /*******************************************************************
2845 reads or writes a structure.
2846 ********************************************************************/
2848 BOOL samr_io_q_query_groupmem(const char *desc, SAMR_Q_QUERY_GROUPMEM * q_u,
2849 prs_struct *ps, int depth)
2854 prs_debug(ps, depth, desc, "samr_io_q_query_groupmem");
2860 if(!smb_io_pol_hnd("group_pol", &q_u->group_pol, ps, depth))
2866 /*******************************************************************
2867 inits a SAMR_R_QUERY_GROUPMEM structure.
2868 ********************************************************************/
2870 void init_samr_r_query_groupmem(SAMR_R_QUERY_GROUPMEM * r_u,
2871 uint32 num_entries, uint32 *rid,
2872 uint32 *attr, NTSTATUS status)
2874 DEBUG(5, ("init_samr_r_query_groupmem\n"));
2876 if (NT_STATUS_IS_OK(status)) {
2878 r_u->num_entries = num_entries;
2880 r_u->ptr_attrs = attr != NULL ? 1 : 0;
2881 r_u->ptr_rids = rid != NULL ? 1 : 0;
2883 r_u->num_rids = num_entries;
2886 r_u->num_attrs = num_entries;
2890 r_u->num_entries = 0;
2893 r_u->status = status;
2896 /*******************************************************************
2897 reads or writes a structure.
2898 ********************************************************************/
2900 BOOL samr_io_r_query_groupmem(const char *desc, SAMR_R_QUERY_GROUPMEM * r_u,
2901 prs_struct *ps, int depth)
2908 if (UNMARSHALLING(ps))
2911 prs_debug(ps, depth, desc, "samr_io_r_query_groupmem");
2917 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
2919 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
2922 if (r_u->ptr != 0) {
2923 if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids))
2925 if(!prs_uint32("ptr_attrs", ps, depth, &r_u->ptr_attrs))
2928 if (r_u->ptr_rids != 0) {
2929 if(!prs_uint32("num_rids", ps, depth, &r_u->num_rids))
2931 if (UNMARSHALLING(ps) && r_u->num_rids != 0) {
2932 r_u->rid = (uint32 *)prs_alloc_mem(ps,sizeof(r_u->rid[0])*r_u->num_rids);
2933 if (r_u->rid == NULL)
2937 for (i = 0; i < r_u->num_rids; i++) {
2938 if(!prs_uint32("", ps, depth, &r_u->rid[i]))
2943 if (r_u->ptr_attrs != 0) {
2944 if(!prs_uint32("num_attrs", ps, depth, &r_u->num_attrs))
2947 if (UNMARSHALLING(ps) && r_u->num_attrs != 0) {
2948 r_u->attr = (uint32 *)prs_alloc_mem(ps,sizeof(r_u->attr[0])*r_u->num_attrs);
2949 if (r_u->attr == NULL)
2953 for (i = 0; i < r_u->num_attrs; i++) {
2954 if(!prs_uint32("", ps, depth, &r_u->attr[i]))
2960 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2966 /*******************************************************************
2967 inits a SAMR_Q_QUERY_USERGROUPS structure.
2968 ********************************************************************/
2970 void init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS * q_u,
2973 DEBUG(5, ("init_samr_q_query_usergroups\n"));
2978 /*******************************************************************
2979 reads or writes a structure.
2980 ********************************************************************/
2982 BOOL samr_io_q_query_usergroups(const char *desc, SAMR_Q_QUERY_USERGROUPS * q_u,
2983 prs_struct *ps, int depth)
2988 prs_debug(ps, depth, desc, "samr_io_q_query_usergroups");
2994 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
3000 /*******************************************************************
3001 inits a SAMR_R_QUERY_USERGROUPS structure.
3002 ********************************************************************/
3004 void init_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS * r_u,
3005 uint32 num_gids, DOM_GID * gid,
3008 DEBUG(5, ("init_samr_r_query_usergroups\n"));
3010 if (NT_STATUS_IS_OK(status)) {
3012 r_u->num_entries = num_gids;
3013 r_u->ptr_1 = (num_gids != 0) ? 1 : 0;
3014 r_u->num_entries2 = num_gids;
3019 r_u->num_entries = 0;
3024 r_u->status = status;
3027 /*******************************************************************
3028 reads or writes a structure.
3029 ********************************************************************/
3031 BOOL samr_io_gids(const char *desc, uint32 *num_gids, DOM_GID ** gid,
3032 prs_struct *ps, int depth)
3038 prs_debug(ps, depth, desc, "samr_io_gids");
3044 if(!prs_uint32("num_gids", ps, depth, num_gids))
3047 if ((*num_gids) != 0) {
3048 if (UNMARSHALLING(ps)) {
3049 (*gid) = (DOM_GID *)prs_alloc_mem(ps,sizeof(DOM_GID)*(*num_gids));
3052 if ((*gid) == NULL) {
3056 for (i = 0; i < (*num_gids); i++) {
3057 if(!smb_io_gid("gids", &(*gid)[i], ps, depth))
3065 /*******************************************************************
3066 reads or writes a structure.
3067 ********************************************************************/
3069 BOOL samr_io_r_query_usergroups(const char *desc, SAMR_R_QUERY_USERGROUPS * r_u,
3070 prs_struct *ps, int depth)
3075 prs_debug(ps, depth, desc, "samr_io_r_query_usergroups");
3081 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
3084 if (r_u->ptr_0 != 0) {
3085 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
3087 if(!prs_uint32("ptr_1 ", ps, depth, &r_u->ptr_1))
3090 if (r_u->num_entries != 0 && r_u->ptr_1 != 0) {
3091 if(!samr_io_gids("gids", &r_u->num_entries2, &r_u->gid, ps, depth))
3098 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3104 /*******************************************************************
3105 inits a SAMR_Q_ENUM_DOMAINS structure.
3106 ********************************************************************/
3108 void init_samr_q_enum_domains(SAMR_Q_ENUM_DOMAINS * q_e,
3110 uint32 start_idx, uint32 size)
3112 DEBUG(5, ("init_samr_q_enum_domains\n"));
3116 q_e->start_idx = start_idx;
3117 q_e->max_size = size;
3120 /*******************************************************************
3121 reads or writes a structure.
3122 ********************************************************************/
3124 BOOL samr_io_q_enum_domains(const char *desc, SAMR_Q_ENUM_DOMAINS * q_e,
3125 prs_struct *ps, int depth)
3130 prs_debug(ps, depth, desc, "samr_io_q_enum_domains");
3136 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
3139 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3141 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3147 /*******************************************************************
3148 inits a SAMR_R_ENUM_DOMAINS structure.
3149 ********************************************************************/
3151 void init_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS * r_u,
3152 uint32 next_idx, uint32 num_sam_entries)
3154 DEBUG(5, ("init_samr_r_enum_domains\n"));
3156 r_u->next_idx = next_idx;
3158 if (num_sam_entries != 0) {
3159 r_u->ptr_entries1 = 1;
3160 r_u->ptr_entries2 = 1;
3161 r_u->num_entries2 = num_sam_entries;
3162 r_u->num_entries3 = num_sam_entries;
3164 r_u->num_entries4 = num_sam_entries;
3166 r_u->ptr_entries1 = 0;
3167 r_u->num_entries2 = num_sam_entries;
3168 r_u->ptr_entries2 = 1;
3172 /*******************************************************************
3173 reads or writes a structure.
3174 ********************************************************************/
3176 BOOL samr_io_r_enum_domains(const char *desc, SAMR_R_ENUM_DOMAINS * r_u,
3177 prs_struct *ps, int depth)
3184 prs_debug(ps, depth, desc, "samr_io_r_enum_domains");
3190 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3192 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3195 if (r_u->ptr_entries1 != 0) {
3196 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3198 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3200 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3203 if (UNMARSHALLING(ps)) {
3204 r_u->sam = (SAM_ENTRY *)prs_alloc_mem(ps,sizeof(SAM_ENTRY)*r_u->num_entries2);
3205 r_u->uni_dom_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2)*r_u->num_entries2);
3208 if ((r_u->sam == NULL || r_u->uni_dom_name == NULL) && r_u->num_entries2 != 0) {
3209 DEBUG(0, ("NULL pointers in SAMR_R_ENUM_DOMAINS\n"));
3210 r_u->num_entries4 = 0;
3211 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3215 for (i = 0; i < r_u->num_entries2; i++) {
3217 slprintf(tmp, sizeof(tmp) - 1, "dom[%d]", i);
3218 if(!sam_io_sam_entry(tmp, &r_u->sam[i], ps, depth))
3222 for (i = 0; i < r_u->num_entries2; i++) {
3224 slprintf(tmp, sizeof(tmp) - 1, "dom[%d]", i);
3225 if(!smb_io_unistr2(tmp, &r_u->uni_dom_name[i],
3226 r_u->sam[i].hdr_name.buffer, ps,
3235 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3237 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3243 /*******************************************************************
3244 inits a SAMR_Q_ENUM_DOM_GROUPS structure.
3245 ********************************************************************/
3247 void init_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS * q_e,
3249 uint32 start_idx, uint32 size)
3251 DEBUG(5, ("init_samr_q_enum_dom_groups\n"));
3255 q_e->start_idx = start_idx;
3256 q_e->max_size = size;
3259 /*******************************************************************
3260 reads or writes a structure.
3261 ********************************************************************/
3263 BOOL samr_io_q_enum_dom_groups(const char *desc, SAMR_Q_ENUM_DOM_GROUPS * q_e,
3264 prs_struct *ps, int depth)
3269 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups");
3275 if(!smb_io_pol_hnd("pol", &(q_e->pol), ps, depth))
3278 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3280 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3286 /*******************************************************************
3287 inits a SAMR_R_ENUM_DOM_GROUPS structure.
3288 ********************************************************************/
3290 void init_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS * r_u,
3291 uint32 next_idx, uint32 num_sam_entries)
3293 DEBUG(5, ("init_samr_r_enum_dom_groups\n"));
3295 r_u->next_idx = next_idx;
3297 if (num_sam_entries != 0) {
3298 r_u->ptr_entries1 = 1;
3299 r_u->ptr_entries2 = 1;
3300 r_u->num_entries2 = num_sam_entries;
3301 r_u->num_entries3 = num_sam_entries;
3303 r_u->num_entries4 = num_sam_entries;
3305 r_u->ptr_entries1 = 0;
3306 r_u->num_entries2 = num_sam_entries;
3307 r_u->ptr_entries2 = 1;
3311 /*******************************************************************
3312 reads or writes a structure.
3313 ********************************************************************/
3315 BOOL samr_io_r_enum_dom_groups(const char *desc, SAMR_R_ENUM_DOM_GROUPS * r_u,
3316 prs_struct *ps, int depth)
3323 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups");
3329 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3331 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3334 if (r_u->ptr_entries1 != 0) {
3335 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3337 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3339 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3342 if (UNMARSHALLING(ps)) {
3343 r_u->sam = (SAM_ENTRY *)prs_alloc_mem(ps,sizeof(SAM_ENTRY)*r_u->num_entries2);
3344 r_u->uni_grp_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2)*r_u->num_entries2);
3347 if ((r_u->sam == NULL || r_u->uni_grp_name == NULL) && r_u->num_entries2 != 0) {
3349 ("NULL pointers in SAMR_R_ENUM_DOM_GROUPS\n"));
3350 r_u->num_entries4 = 0;
3351 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3355 for (i = 0; i < r_u->num_entries2; i++) {
3356 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
3360 for (i = 0; i < r_u->num_entries2; i++) {
3361 if(!smb_io_unistr2("", &r_u->uni_grp_name[i],
3362 r_u->sam[i].hdr_name.buffer, ps, depth))
3369 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3371 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3377 /*******************************************************************
3378 inits a SAMR_Q_ENUM_DOM_ALIASES structure.
3379 ********************************************************************/
3381 void init_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES * q_e,
3382 POLICY_HND *pol, uint32 start_idx,
3385 DEBUG(5, ("init_samr_q_enum_dom_aliases\n"));
3389 q_e->start_idx = start_idx;
3390 q_e->max_size = size;
3394 /*******************************************************************
3395 reads or writes a structure.
3396 ********************************************************************/
3398 BOOL samr_io_q_enum_dom_aliases(const char *desc, SAMR_Q_ENUM_DOM_ALIASES * q_e,
3399 prs_struct *ps, int depth)
3404 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases");
3410 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
3413 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3415 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3421 /*******************************************************************
3422 inits a SAMR_R_ENUM_DOM_ALIASES structure.
3423 ********************************************************************/
3425 void init_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u, uint32 next_idx, uint32 num_sam_entries)
3427 DEBUG(5, ("init_samr_r_enum_dom_aliases\n"));
3429 r_u->next_idx = next_idx;
3431 if (num_sam_entries != 0) {
3432 r_u->ptr_entries1 = 1;
3433 r_u->ptr_entries2 = 1;
3434 r_u->num_entries2 = num_sam_entries;
3435 r_u->num_entries3 = num_sam_entries;
3437 r_u->num_entries4 = num_sam_entries;
3439 r_u->ptr_entries1 = 0;
3440 r_u->num_entries2 = num_sam_entries;
3441 r_u->ptr_entries2 = 1;
3445 /*******************************************************************
3446 reads or writes a structure.
3447 ********************************************************************/
3449 BOOL samr_io_r_enum_dom_aliases(const char *desc, SAMR_R_ENUM_DOM_ALIASES * r_u,
3450 prs_struct *ps, int depth)
3457 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases");
3463 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3465 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3468 if (r_u->ptr_entries1 != 0) {
3469 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3471 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3473 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3476 if (UNMARSHALLING(ps) && (r_u->num_entries2 > 0)) {
3477 r_u->sam = (SAM_ENTRY *)prs_alloc_mem(ps,sizeof(SAM_ENTRY)*r_u->num_entries2);
3478 r_u->uni_grp_name = (UNISTR2 *)prs_alloc_mem(ps,sizeof(UNISTR2)*r_u->num_entries2);
3481 if (r_u->num_entries2 != 0 &&
3482 (r_u->sam == NULL || r_u->uni_grp_name == NULL)) {
3483 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_ALIASES\n"));
3484 r_u->num_entries4 = 0;
3485 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3489 for (i = 0; i < r_u->num_entries2; i++) {
3490 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
3494 for (i = 0; i < r_u->num_entries2; i++) {
3495 if(!smb_io_unistr2("", &r_u->uni_grp_name[i],
3496 r_u->sam[i].hdr_name.buffer, ps,
3504 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3506 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3512 /*******************************************************************
3513 inits a ALIAS_INFO1 structure.
3514 ********************************************************************/
3516 void init_samr_alias_info1(ALIAS_INFO1 * al1, char *acct_name, uint32 num_member, char *acct_desc)
3518 DEBUG(5, ("init_samr_alias_info1\n"));
3520 init_unistr2(&al1->uni_acct_name, acct_name, UNI_FLAGS_NONE);
3521 init_uni_hdr(&al1->hdr_acct_name, &al1->uni_acct_name);
3523 al1->num_member=num_member;
3525 init_unistr2(&al1->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
3526 init_uni_hdr(&al1->hdr_acct_desc, &al1->uni_acct_name);
3529 /*******************************************************************
3530 reads or writes a structure.
3531 ********************************************************************/
3533 BOOL samr_io_alias_info1(const char *desc, ALIAS_INFO1 * al1,
3534 prs_struct *ps, int depth)
3539 prs_debug(ps, depth, desc, "samr_io_alias_info1");
3545 if(!smb_io_unihdr("hdr_acct_name", &al1->hdr_acct_name, ps, depth))
3547 if(!prs_uint32("num_member", ps, depth, &al1->num_member))
3549 if(!smb_io_unihdr("hdr_acct_desc", &al1->hdr_acct_desc, ps, depth))
3552 if(!smb_io_unistr2("uni_acct_name", &al1->uni_acct_name,
3553 al1->hdr_acct_name.buffer, ps, depth))
3559 if(!smb_io_unistr2("uni_acct_desc", &al1->uni_acct_desc,
3560 al1->hdr_acct_desc.buffer, ps, depth))
3566 /*******************************************************************
3567 inits a ALIAS_INFO3 structure.
3568 ********************************************************************/
3570 void init_samr_alias_info3(ALIAS_INFO3 * al3, const char *acct_desc)
3572 DEBUG(5, ("init_samr_alias_info3\n"));
3574 init_unistr2(&al3->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
3575 init_uni_hdr(&al3->hdr_acct_desc, &al3->uni_acct_desc);
3578 /*******************************************************************
3579 reads or writes a structure.
3580 ********************************************************************/
3582 BOOL samr_io_alias_info3(const char *desc, ALIAS_INFO3 * al3,
3583 prs_struct *ps, int depth)
3588 prs_debug(ps, depth, desc, "samr_io_alias_info3");
3594 if(!smb_io_unihdr("hdr_acct_desc", &al3->hdr_acct_desc, ps, depth))
3596 if(!smb_io_unistr2("uni_acct_desc", &al3->uni_acct_desc,
3597 al3->hdr_acct_desc.buffer, ps, depth))
3603 /*******************************************************************
3604 reads or writes a structure.
3605 ********************************************************************/
3607 BOOL samr_alias_info_ctr(const char *desc, ALIAS_INFO_CTR * ctr,
3608 prs_struct *ps, int depth)
3613 prs_debug(ps, depth, desc, "samr_alias_info_ctr");
3616 if(!prs_uint16("switch_value1", ps, depth, &ctr->switch_value1))
3618 if(!prs_uint16("switch_value2", ps, depth, &ctr->switch_value2))
3621 switch (ctr->switch_value1) {
3623 if(!samr_io_alias_info1("alias_info1", &ctr->alias.info1, ps, depth))
3627 if(!samr_io_alias_info3("alias_info3", &ctr->alias.info3, ps, depth))
3631 DEBUG(0,("samr_alias_info_ctr: unsupported switch level\n"));
3638 /*******************************************************************
3639 inits a SAMR_Q_QUERY_ALIASINFO structure.
3640 ********************************************************************/
3642 void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO * q_e,
3643 POLICY_HND *pol, uint16 switch_level)
3645 DEBUG(5, ("init_samr_q_query_aliasinfo\n"));
3648 q_e->switch_level = switch_level;
3651 /*******************************************************************
3652 reads or writes a structure.
3653 ********************************************************************/
3655 BOOL samr_io_q_query_aliasinfo(const char *desc, SAMR_Q_QUERY_ALIASINFO * q_e,
3656 prs_struct *ps, int depth)
3661 prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo");
3667 if(!smb_io_pol_hnd("pol", &(q_e->pol), ps, depth))
3670 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
3676 /*******************************************************************
3677 inits a SAMR_R_QUERY_ALIASINFO structure.
3678 ********************************************************************/
3680 void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO * r_u,
3681 ALIAS_INFO_CTR * ctr, NTSTATUS status)
3683 DEBUG(5, ("init_samr_r_query_aliasinfo\n"));
3685 r_u->ptr = (NT_STATUS_IS_OK(status) && ctr != NULL) ? 1 : 0;
3687 r_u->status = status;
3690 /*******************************************************************
3691 reads or writes a structure.
3692 ********************************************************************/
3694 BOOL samr_io_r_query_aliasinfo(const char *desc, SAMR_R_QUERY_ALIASINFO * r_u,
3695 prs_struct *ps, int depth)
3700 prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo");
3706 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
3709 if (r_u->ptr != 0) {
3710 if(!samr_alias_info_ctr("ctr", &r_u->ctr, ps, depth))
3716 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3722 /*******************************************************************
3723 inits a SAMR_Q_SET_ALIASINFO structure.
3724 ********************************************************************/
3726 void init_samr_q_set_aliasinfo(SAMR_Q_SET_ALIASINFO * q_u,
3727 POLICY_HND *hnd, ALIAS_INFO_CTR * ctr)
3729 DEBUG(5, ("init_samr_q_set_aliasinfo\n"));
3731 q_u->alias_pol = *hnd;
3735 /*******************************************************************
3736 reads or writes a structure.
3737 ********************************************************************/
3739 BOOL samr_io_q_set_aliasinfo(const char *desc, SAMR_Q_SET_ALIASINFO * q_u,
3740 prs_struct *ps, int depth)
3745 prs_debug(ps, depth, desc, "samr_io_q_set_aliasinfo");
3751 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
3753 if(!samr_alias_info_ctr("ctr", &q_u->ctr, ps, depth))
3759 /*******************************************************************
3760 reads or writes a structure.
3761 ********************************************************************/
3763 BOOL samr_io_r_set_aliasinfo(const char *desc, SAMR_R_SET_ALIASINFO * r_u,
3764 prs_struct *ps, int depth)
3769 prs_debug(ps, depth, desc, "samr_io_r_set_aliasinfo");
3774 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3780 /*******************************************************************
3781 inits a SAMR_Q_QUERY_USERALIASES structure.
3782 ********************************************************************/
3784 void init_samr_q_query_useraliases(SAMR_Q_QUERY_USERALIASES * q_u,
3787 uint32 *ptr_sid, DOM_SID2 * sid)
3789 DEBUG(5, ("init_samr_q_query_useraliases\n"));
3793 q_u->num_sids1 = num_sids;
3795 q_u->num_sids2 = num_sids;
3797 q_u->ptr_sid = ptr_sid;
3801 /*******************************************************************
3802 reads or writes a SAMR_Q_QUERY_USERALIASES structure.
3803 ********************************************************************/
3805 BOOL samr_io_q_query_useraliases(const char *desc, SAMR_Q_QUERY_USERALIASES * q_u,
3806 prs_struct *ps, int depth)
3814 prs_debug(ps, depth, desc, "samr_io_q_query_useraliases");
3820 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
3823 if(!prs_uint32("num_sids1", ps, depth, &q_u->num_sids1))
3825 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
3831 if(!prs_uint32("num_sids2", ps, depth, &q_u->num_sids2))
3834 if (UNMARSHALLING(ps) && (q_u->num_sids2 != 0)) {
3835 q_u->ptr_sid = (uint32 *)prs_alloc_mem(ps,sizeof(q_u->ptr_sid[0])*q_u->num_sids2);
3836 if (q_u->ptr_sid == NULL)
3839 q_u->sid = (DOM_SID2 *)prs_alloc_mem(ps, sizeof(q_u->sid[0]) * q_u->num_sids2);
3840 if (q_u->sid == NULL)
3844 for (i = 0; i < q_u->num_sids2; i++) {
3845 slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i);
3846 if(!prs_uint32(tmp, ps, depth, &q_u->ptr_sid[i]))
3850 for (i = 0; i < q_u->num_sids2; i++) {
3851 if (q_u->ptr_sid[i] != 0) {
3852 slprintf(tmp, sizeof(tmp) - 1, "sid[%02d]", i);
3853 if(!smb_io_dom_sid2(tmp, &q_u->sid[i], ps, depth))
3861 /*******************************************************************
3862 inits a SAMR_R_QUERY_USERALIASES structure.
3863 ********************************************************************/
3865 void init_samr_r_query_useraliases(SAMR_R_QUERY_USERALIASES * r_u,
3866 uint32 num_rids, uint32 *rid,
3869 DEBUG(5, ("init_samr_r_query_useraliases\n"));
3871 if (NT_STATUS_IS_OK(status)) {
3872 r_u->num_entries = num_rids;
3874 r_u->num_entries2 = num_rids;
3878 r_u->num_entries = 0;
3880 r_u->num_entries2 = 0;
3883 r_u->status = status;
3886 /*******************************************************************
3887 reads or writes a structure.
3888 ********************************************************************/
3890 BOOL samr_io_rids(const char *desc, uint32 *num_rids, uint32 **rid,
3891 prs_struct *ps, int depth)
3898 prs_debug(ps, depth, desc, "samr_io_rids");
3904 if(!prs_uint32("num_rids", ps, depth, num_rids))
3907 if ((*num_rids) != 0) {
3908 if (UNMARSHALLING(ps)) {
3910 (*rid) = (uint32 *)prs_alloc_mem(ps,sizeof(uint32)*(*num_rids));
3915 for (i = 0; i < (*num_rids); i++) {
3916 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d]", i);
3917 if(!prs_uint32(tmp, ps, depth, &((*rid)[i])))
3925 /*******************************************************************
3926 reads or writes a structure.
3927 ********************************************************************/
3929 BOOL samr_io_r_query_useraliases(const char *desc, SAMR_R_QUERY_USERALIASES * r_u,
3930 prs_struct *ps, int depth)
3935 prs_debug(ps, depth, desc, "samr_io_r_query_useraliases");
3941 if(!prs_uint32("num_entries", ps, depth, &r_u->num_entries))
3943 if(!prs_uint32("ptr ", ps, depth, &r_u->ptr))
3946 if (r_u->ptr != 0) {
3947 if(!samr_io_rids("rids", &r_u->num_entries2, &r_u->rid, ps, depth))
3953 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3959 /*******************************************************************
3960 inits a SAMR_Q_OPEN_ALIAS structure.
3961 ********************************************************************/
3963 void init_samr_q_open_alias(SAMR_Q_OPEN_ALIAS * q_u, POLICY_HND *pol,
3964 uint32 access_mask, uint32 rid)
3966 DEBUG(5, ("init_samr_q_open_alias\n"));
3968 q_u->dom_pol = *pol;
3969 q_u->access_mask = access_mask;
3970 q_u->rid_alias = rid;
3973 /*******************************************************************
3974 reads or writes a structure.
3975 ********************************************************************/
3977 BOOL samr_io_q_open_alias(const char *desc, SAMR_Q_OPEN_ALIAS * q_u,
3978 prs_struct *ps, int depth)
3983 prs_debug(ps, depth, desc, "samr_io_q_open_alias");
3989 if(!smb_io_pol_hnd("domain_pol", &q_u->dom_pol, ps, depth))
3992 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
3994 if(!prs_uint32("rid_alias", ps, depth, &q_u->rid_alias))
4000 /*******************************************************************
4001 reads or writes a structure.
4002 ********************************************************************/
4004 BOOL samr_io_r_open_alias(const char *desc, SAMR_R_OPEN_ALIAS * r_u,
4005 prs_struct *ps, int depth)
4010 prs_debug(ps, depth, desc, "samr_io_r_open_alias");
4016 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
4019 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4025 /*******************************************************************
4026 inits a SAMR_Q_LOOKUP_RIDS structure.
4027 ********************************************************************/
4029 void init_samr_q_lookup_rids(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_RIDS * q_u,
4030 POLICY_HND *pol, uint32 flags,
4031 uint32 num_rids, uint32 *rid)
4033 DEBUG(5, ("init_samr_q_lookup_rids\n"));
4037 q_u->num_rids1 = num_rids;
4040 q_u->num_rids2 = num_rids;
4041 q_u->rid = (uint32 *)talloc_zero(ctx, num_rids * sizeof(q_u->rid[0]));
4042 if (q_u->rid == NULL) {
4046 memcpy(q_u->rid, rid, num_rids * sizeof(q_u->rid[0]));
4050 /*******************************************************************
4051 reads or writes a structure.
4052 ********************************************************************/
4054 BOOL samr_io_q_lookup_rids(const char *desc, SAMR_Q_LOOKUP_RIDS * q_u,
4055 prs_struct *ps, int depth)
4063 prs_debug(ps, depth, desc, "samr_io_q_lookup_rids");
4066 if (UNMARSHALLING(ps))
4072 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4075 if(!prs_uint32("num_rids1", ps, depth, &q_u->num_rids1))
4077 if(!prs_uint32("flags ", ps, depth, &q_u->flags))
4079 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
4081 if(!prs_uint32("num_rids2", ps, depth, &q_u->num_rids2))
4084 if (UNMARSHALLING(ps) && (q_u->num_rids2 != 0)) {
4085 q_u->rid = (uint32 *)prs_alloc_mem(ps, sizeof(q_u->rid[0])*q_u->num_rids2);
4086 if (q_u->rid == NULL)
4090 for (i = 0; i < q_u->num_rids2; i++) {
4091 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
4092 if(!prs_uint32(tmp, ps, depth, &q_u->rid[i]))
4099 /*******************************************************************
4100 inits a SAMR_R_LOOKUP_RIDS structure.
4101 ********************************************************************/
4103 void init_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS * r_u,
4104 uint32 num_names, UNIHDR * hdr_name,
4105 UNISTR2 *uni_name, uint32 *type)
4107 DEBUG(5, ("init_samr_r_lookup_rids\n"));
4109 r_u->hdr_name = NULL;
4110 r_u->uni_name = NULL;
4113 if (num_names != 0) {
4114 r_u->num_names1 = num_names;
4116 r_u->num_names2 = num_names;
4118 r_u->num_types1 = num_names;
4120 r_u->num_types2 = num_names;
4122 r_u->hdr_name = hdr_name;
4123 r_u->uni_name = uni_name;
4126 r_u->num_names1 = num_names;
4128 r_u->num_names2 = num_names;
4130 r_u->num_types1 = num_names;
4132 r_u->num_types2 = num_names;
4136 /*******************************************************************
4137 reads or writes a structure.
4138 ********************************************************************/
4140 BOOL samr_io_r_lookup_rids(const char *desc, SAMR_R_LOOKUP_RIDS * r_u,
4141 prs_struct *ps, int depth)
4148 prs_debug(ps, depth, desc, "samr_io_r_lookup_rids");
4154 if(!prs_uint32("num_names1", ps, depth, &r_u->num_names1))
4156 if(!prs_uint32("ptr_names ", ps, depth, &r_u->ptr_names))
4159 if (r_u->ptr_names != 0) {
4161 if(!prs_uint32("num_names2", ps, depth, &r_u->num_names2))
4165 if (UNMARSHALLING(ps) && (r_u->num_names2 != 0)) {
4166 r_u->hdr_name = (UNIHDR *) prs_alloc_mem(ps, r_u->num_names2 * sizeof(r_u->hdr_name[0]));
4167 if (r_u->hdr_name == NULL)
4170 r_u->uni_name = (UNISTR2 *)prs_alloc_mem(ps, r_u->num_names2 * sizeof(r_u->uni_name[0]));
4171 if (r_u->uni_name == NULL)
4175 for (i = 0; i < r_u->num_names2; i++) {
4176 slprintf(tmp, sizeof(tmp) - 1, "hdr[%02d] ", i);
4177 if(!smb_io_unihdr("", &r_u->hdr_name[i], ps, depth))
4180 for (i = 0; i < r_u->num_names2; i++) {
4181 slprintf(tmp, sizeof(tmp) - 1, "str[%02d] ", i);
4182 if(!smb_io_unistr2("", &r_u->uni_name[i], r_u->hdr_name[i].buffer, ps, depth))
4190 if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1))
4192 if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types))
4195 if (r_u->ptr_types != 0) {
4197 if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2))
4200 if (UNMARSHALLING(ps) && (r_u->num_types2 != 0)) {
4201 r_u->type = (uint32 *)prs_alloc_mem(ps, r_u->num_types2 * sizeof(r_u->type[0]));
4202 if (r_u->type == NULL)
4206 for (i = 0; i < r_u->num_types2; i++) {
4207 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
4208 if(!prs_uint32(tmp, ps, depth, &r_u->type[i]))
4213 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4219 /*******************************************************************
4220 inits a SAMR_Q_OPEN_ALIAS structure.
4221 ********************************************************************/
4223 void init_samr_q_delete_alias(SAMR_Q_DELETE_DOM_ALIAS * q_u, POLICY_HND *hnd)
4225 DEBUG(5, ("init_samr_q_delete_alias\n"));
4227 q_u->alias_pol = *hnd;
4230 /*******************************************************************
4231 reads or writes a structure.
4232 ********************************************************************/
4234 BOOL samr_io_q_delete_alias(const char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u,
4235 prs_struct *ps, int depth)
4240 prs_debug(ps, depth, desc, "samr_io_q_delete_alias");
4246 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4252 /*******************************************************************
4253 reads or writes a structure.
4254 ********************************************************************/
4256 BOOL samr_io_r_delete_alias(const char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u,
4257 prs_struct *ps, int depth)
4262 prs_debug(ps, depth, desc, "samr_io_r_delete_alias");
4268 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
4270 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4276 /*******************************************************************
4277 inits a SAMR_Q_CREATE_DOM_ALIAS structure.
4278 ********************************************************************/
4280 void init_samr_q_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS * q_u,
4281 POLICY_HND *hnd, const char *acct_desc)
4283 DEBUG(5, ("init_samr_q_create_dom_alias\n"));
4285 q_u->dom_pol = *hnd;
4287 init_unistr2(&q_u->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
4288 init_uni_hdr(&q_u->hdr_acct_desc, &q_u->uni_acct_desc);
4290 q_u->access_mask = MAXIMUM_ALLOWED_ACCESS;
4293 /*******************************************************************
4294 reads or writes a structure.
4295 ********************************************************************/
4297 BOOL samr_io_q_create_dom_alias(const char *desc, SAMR_Q_CREATE_DOM_ALIAS * q_u,
4298 prs_struct *ps, int depth)
4303 prs_debug(ps, depth, desc, "samr_io_q_create_dom_alias");
4309 if(!smb_io_pol_hnd("dom_pol", &q_u->dom_pol, ps, depth))
4312 if(!smb_io_unihdr("hdr_acct_desc", &q_u->hdr_acct_desc, ps, depth))
4314 if(!smb_io_unistr2("uni_acct_desc", &q_u->uni_acct_desc,
4315 q_u->hdr_acct_desc.buffer, ps, depth))
4320 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
4326 /*******************************************************************
4327 reads or writes a structure.
4328 ********************************************************************/
4330 BOOL samr_io_r_create_dom_alias(const char *desc, SAMR_R_CREATE_DOM_ALIAS * r_u,
4331 prs_struct *ps, int depth)
4336 prs_debug(ps, depth, desc, "samr_io_r_create_dom_alias");
4342 if(!smb_io_pol_hnd("alias_pol", &r_u->alias_pol, ps, depth))
4345 if(!prs_uint32("rid", ps, depth, &r_u->rid))
4348 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4354 /*******************************************************************
4355 inits a SAMR_Q_ADD_ALIASMEM structure.
4356 ********************************************************************/
4358 void init_samr_q_add_aliasmem(SAMR_Q_ADD_ALIASMEM * q_u, POLICY_HND *hnd,
4361 DEBUG(5, ("init_samr_q_add_aliasmem\n"));
4363 q_u->alias_pol = *hnd;
4364 init_dom_sid2(&q_u->sid, sid);
4367 /*******************************************************************
4368 reads or writes a structure.
4369 ********************************************************************/
4371 BOOL samr_io_q_add_aliasmem(const char *desc, SAMR_Q_ADD_ALIASMEM * q_u,
4372 prs_struct *ps, int depth)
4377 prs_debug(ps, depth, desc, "samr_io_q_add_aliasmem");
4383 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4385 if(!smb_io_dom_sid2("sid ", &q_u->sid, ps, depth))
4391 /*******************************************************************
4392 reads or writes a structure.
4393 ********************************************************************/
4395 BOOL samr_io_r_add_aliasmem(const char *desc, SAMR_R_ADD_ALIASMEM * r_u,
4396 prs_struct *ps, int depth)
4401 prs_debug(ps, depth, desc, "samr_io_r_add_aliasmem");
4407 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4413 /*******************************************************************
4414 inits a SAMR_Q_DEL_ALIASMEM structure.
4415 ********************************************************************/
4417 void init_samr_q_del_aliasmem(SAMR_Q_DEL_ALIASMEM * q_u, POLICY_HND *hnd,
4420 DEBUG(5, ("init_samr_q_del_aliasmem\n"));
4422 q_u->alias_pol = *hnd;
4423 init_dom_sid2(&q_u->sid, sid);
4426 /*******************************************************************
4427 reads or writes a structure.
4428 ********************************************************************/
4430 BOOL samr_io_q_del_aliasmem(const char *desc, SAMR_Q_DEL_ALIASMEM * q_u,
4431 prs_struct *ps, int depth)
4436 prs_debug(ps, depth, desc, "samr_io_q_del_aliasmem");
4442 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4444 if(!smb_io_dom_sid2("sid ", &q_u->sid, ps, depth))
4450 /*******************************************************************
4451 reads or writes a structure.
4452 ********************************************************************/
4454 BOOL samr_io_r_del_aliasmem(const char *desc, SAMR_R_DEL_ALIASMEM * r_u,
4455 prs_struct *ps, int depth)
4460 prs_debug(ps, depth, desc, "samr_io_r_del_aliasmem");
4466 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4472 /*******************************************************************
4473 inits a SAMR_Q_DELETE_DOM_ALIAS structure.
4474 ********************************************************************/
4476 void init_samr_q_delete_dom_alias(SAMR_Q_DELETE_DOM_ALIAS * q_c,
4479 DEBUG(5, ("init_samr_q_delete_dom_alias\n"));
4481 q_c->alias_pol = *hnd;
4484 /*******************************************************************
4485 reads or writes a structure.
4486 ********************************************************************/
4488 BOOL samr_io_q_delete_dom_alias(const char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u,
4489 prs_struct *ps, int depth)
4494 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_alias");
4500 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4506 /*******************************************************************
4507 inits a SAMR_R_DELETE_DOM_ALIAS structure.
4508 ********************************************************************/
4510 void init_samr_r_delete_dom_alias(SAMR_R_DELETE_DOM_ALIAS * r_u,
4513 DEBUG(5, ("init_samr_r_delete_dom_alias\n"));
4515 r_u->status = status;
4518 /*******************************************************************
4519 reads or writes a structure.
4520 ********************************************************************/
4522 BOOL samr_io_r_delete_dom_alias(const char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u,
4523 prs_struct *ps, int depth)
4528 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_alias");
4534 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4540 /*******************************************************************
4541 inits a SAMR_Q_QUERY_ALIASMEM structure.
4542 ********************************************************************/
4544 void init_samr_q_query_aliasmem(SAMR_Q_QUERY_ALIASMEM * q_c,
4547 DEBUG(5, ("init_samr_q_query_aliasmem\n"));
4549 q_c->alias_pol = *hnd;
4552 /*******************************************************************
4553 reads or writes a structure.
4554 ********************************************************************/
4556 BOOL samr_io_q_query_aliasmem(const char *desc, SAMR_Q_QUERY_ALIASMEM * q_u,
4557 prs_struct *ps, int depth)
4562 prs_debug(ps, depth, desc, "samr_io_q_query_aliasmem");
4568 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4574 /*******************************************************************
4575 inits a SAMR_R_QUERY_ALIASMEM structure.
4576 ********************************************************************/
4578 void init_samr_r_query_aliasmem(SAMR_R_QUERY_ALIASMEM * r_u,
4579 uint32 num_sids, DOM_SID2 * sid,
4582 DEBUG(5, ("init_samr_r_query_aliasmem\n"));
4584 if (NT_STATUS_IS_OK(status)) {
4585 r_u->num_sids = num_sids;
4586 r_u->ptr = (num_sids != 0) ? 1 : 0;
4587 r_u->num_sids1 = num_sids;
4595 r_u->status = status;
4598 /*******************************************************************
4599 reads or writes a structure.
4600 ********************************************************************/
4602 BOOL samr_io_r_query_aliasmem(const char *desc, SAMR_R_QUERY_ALIASMEM * r_u,
4603 prs_struct *ps, int depth)
4610 prs_debug(ps, depth, desc, "samr_io_r_query_aliasmem");
4616 if(!prs_uint32("num_sids ", ps, depth, &r_u->num_sids))
4618 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
4621 if (r_u->ptr != 0 && r_u->num_sids != 0) {
4622 uint32 *ptr_sid = NULL;
4624 if(!prs_uint32("num_sids1", ps, depth, &r_u->num_sids1))
4627 ptr_sid = talloc(ps->mem_ctx, sizeof(uint32) * r_u->num_sids1);
4632 for (i = 0; i < r_u->num_sids1; i++) {
4634 if(!prs_uint32("ptr_sid", ps, depth, &ptr_sid[i]))
4638 if (UNMARSHALLING(ps)) {
4639 r_u->sid = talloc(ps->mem_ctx, r_u->num_sids1 * sizeof(DOM_SID2));
4642 for (i = 0; i < r_u->num_sids1; i++) {
4643 if (ptr_sid[i] != 0) {
4644 if(!smb_io_dom_sid2("sid", &r_u->sid[i], ps, depth))
4652 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4658 /*******************************************************************
4659 inits a SAMR_Q_LOOKUP_NAMES structure.
4660 ********************************************************************/
4662 NTSTATUS init_samr_q_lookup_names(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_NAMES * q_u,
4663 POLICY_HND *pol, uint32 flags,
4664 uint32 num_names, const char **name)
4668 DEBUG(5, ("init_samr_q_lookup_names\n"));
4672 q_u->num_names1 = num_names;
4675 q_u->num_names2 = num_names;
4677 if (!(q_u->hdr_name = (UNIHDR *)talloc_zero(ctx, num_names * sizeof(UNIHDR))))
4678 return NT_STATUS_NO_MEMORY;
4680 if (!(q_u->uni_name = (UNISTR2 *)talloc_zero(ctx, num_names * sizeof(UNISTR2))))
4681 return NT_STATUS_NO_MEMORY;
4683 for (i = 0; i < num_names; i++) {
4684 init_unistr2(&q_u->uni_name[i], name[i], UNI_FLAGS_NONE); /* unicode string for machine account */
4685 init_uni_hdr(&q_u->hdr_name[i], &q_u->uni_name[i]); /* unicode header for user_name */
4688 return NT_STATUS_OK;
4691 /*******************************************************************
4692 reads or writes a structure.
4693 ********************************************************************/
4695 BOOL samr_io_q_lookup_names(const char *desc, SAMR_Q_LOOKUP_NAMES * q_u,
4696 prs_struct *ps, int depth)
4703 prs_debug(ps, depth, desc, "samr_io_q_lookup_names");
4706 if (UNMARSHALLING(ps))
4712 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4715 if(!prs_uint32("num_names1", ps, depth, &q_u->num_names1))
4717 if(!prs_uint32("flags ", ps, depth, &q_u->flags))
4719 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
4721 if(!prs_uint32("num_names2", ps, depth, &q_u->num_names2))
4724 if (UNMARSHALLING(ps) && (q_u->num_names2 != 0)) {
4725 q_u->hdr_name = (UNIHDR *)prs_alloc_mem(ps, sizeof(UNIHDR) *
4727 q_u->uni_name = (UNISTR2 *)prs_alloc_mem(ps, sizeof(UNISTR2) *
4729 if (!q_u->hdr_name || !q_u->uni_name)
4733 for (i = 0; i < q_u->num_names2; i++) {
4734 if(!smb_io_unihdr("", &q_u->hdr_name[i], ps, depth))
4738 for (i = 0; i < q_u->num_names2; i++) {
4739 if(!smb_io_unistr2("", &q_u->uni_name[i], q_u->hdr_name[i].buffer, ps, depth))
4746 /*******************************************************************
4747 inits a SAMR_R_LOOKUP_NAMES structure.
4748 ********************************************************************/
4750 NTSTATUS init_samr_r_lookup_names(TALLOC_CTX *ctx, SAMR_R_LOOKUP_NAMES * r_u,
4752 uint32 *rid, uint32 *type,
4755 DEBUG(5, ("init_samr_r_lookup_names\n"));
4757 if (NT_STATUS_IS_OK(status) && (num_rids != 0)) {
4760 r_u->num_types1 = num_rids;
4762 r_u->num_types2 = num_rids;
4764 r_u->num_rids1 = num_rids;
4766 r_u->num_rids2 = num_rids;
4768 if (!(r_u->rids = (uint32 *)talloc_zero(ctx, sizeof(uint32)*num_rids)))
4769 return NT_STATUS_NO_MEMORY;
4770 if (!(r_u->types = (uint32 *)talloc_zero(ctx, sizeof(uint32)*num_rids)))
4771 return NT_STATUS_NO_MEMORY;
4773 if (!r_u->rids || !r_u->types)
4776 for (i = 0; i < num_rids; i++) {
4777 r_u->rids[i] = rid[i];
4778 r_u->types[i] = type[i];
4783 r_u->num_types1 = 0;
4785 r_u->num_types2 = 0;
4795 r_u->status = status;
4797 return NT_STATUS_OK;
4800 /*******************************************************************
4801 reads or writes a structure.
4802 ********************************************************************/
4804 BOOL samr_io_r_lookup_names(const char *desc, SAMR_R_LOOKUP_NAMES * r_u,
4805 prs_struct *ps, int depth)
4813 prs_debug(ps, depth, desc, "samr_io_r_lookup_names");
4816 if (UNMARSHALLING(ps))
4822 if(!prs_uint32("num_rids1", ps, depth, &r_u->num_rids1))
4824 if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids))
4827 if (r_u->ptr_rids != 0) {
4828 if(!prs_uint32("num_rids2", ps, depth, &r_u->num_rids2))
4831 if (r_u->num_rids2 != r_u->num_rids1) {
4836 if (UNMARSHALLING(ps))
4837 r_u->rids = (uint32 *)prs_alloc_mem(ps, sizeof(uint32)*r_u->num_rids2);
4840 DEBUG(0, ("NULL rids in samr_io_r_lookup_names\n"));
4844 for (i = 0; i < r_u->num_rids2; i++) {
4845 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
4846 if(!prs_uint32(tmp, ps, depth, &r_u->rids[i]))
4851 if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1))
4853 if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types))
4856 if (r_u->ptr_types != 0) {
4857 if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2))
4860 if (r_u->num_types2 != r_u->num_types1) {
4865 if (UNMARSHALLING(ps))
4866 r_u->types = (uint32 *)prs_alloc_mem(ps, sizeof(uint32)*r_u->num_types2);
4869 DEBUG(0, ("NULL types in samr_io_r_lookup_names\n"));
4873 for (i = 0; i < r_u->num_types2; i++) {
4874 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
4875 if(!prs_uint32(tmp, ps, depth, &r_u->types[i]))
4880 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4886 /*******************************************************************
4887 inits a SAMR_Q_DELETE_DOM_USER structure.
4888 ********************************************************************/
4890 void init_samr_q_delete_dom_user(SAMR_Q_DELETE_DOM_USER * q_c,
4893 DEBUG(5, ("init_samr_q_delete_dom_user\n"));
4895 q_c->user_pol = *hnd;
4898 /*******************************************************************
4899 reads or writes a structure.
4900 ********************************************************************/
4902 BOOL samr_io_q_delete_dom_user(const char *desc, SAMR_Q_DELETE_DOM_USER * q_u,
4903 prs_struct *ps, int depth)
4908 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_user");
4914 if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth))
4920 /*******************************************************************
4921 reads or writes a structure.
4922 ********************************************************************/
4924 BOOL samr_io_r_delete_dom_user(const char *desc, SAMR_R_DELETE_DOM_USER * r_u,
4925 prs_struct *ps, int depth)
4930 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_user");
4936 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
4938 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4944 /*******************************************************************
4945 reads or writes a structure.
4946 ********************************************************************/
4948 void init_samr_q_open_user(SAMR_Q_OPEN_USER * q_u,
4950 uint32 access_mask, uint32 rid)
4952 DEBUG(5, ("samr_init_samr_q_open_user\n"));
4954 q_u->domain_pol = *pol;
4955 q_u->access_mask = access_mask;
4956 q_u->user_rid = rid;
4959 /*******************************************************************
4960 reads or writes a structure.
4961 ********************************************************************/
4963 BOOL samr_io_q_open_user(const char *desc, SAMR_Q_OPEN_USER * q_u,
4964 prs_struct *ps, int depth)
4969 prs_debug(ps, depth, desc, "samr_io_q_open_user");
4975 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
4978 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
4980 if(!prs_uint32("user_rid ", ps, depth, &q_u->user_rid))
4986 /*******************************************************************
4987 reads or writes a structure.
4988 ********************************************************************/
4990 BOOL samr_io_r_open_user(const char *desc, SAMR_R_OPEN_USER * r_u,
4991 prs_struct *ps, int depth)
4996 prs_debug(ps, depth, desc, "samr_io_r_open_user");
5002 if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth))
5005 if(!prs_ntstatus("status", ps, depth, &r_u->status))
5012 /*******************************************************************
5013 reads or writes a structure.
5014 ********************************************************************/
5016 void init_samr_q_create_user(SAMR_Q_CREATE_USER * q_u,
5019 uint32 acb_info, uint32 access_mask)
5021 DEBUG(5, ("samr_init_samr_q_create_user\n"));
5023 q_u->domain_pol = *pol;
5025 init_unistr2(&q_u->uni_name, name, UNI_FLAGS_NONE);
5026 init_uni_hdr(&q_u->hdr_name, &q_u->uni_name);
5028 q_u->acb_info = acb_info;
5029 q_u->access_mask = access_mask;
5032 /*******************************************************************
5033 reads or writes a structure.
5034 ********************************************************************/
5036 BOOL samr_io_q_create_user(const char *desc, SAMR_Q_CREATE_USER * q_u,
5037 prs_struct *ps, int depth)
5042 prs_debug(ps, depth, desc, "samr_io_q_create_user");
5048 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
5051 if(!smb_io_unihdr("hdr_name", &q_u->hdr_name, ps, depth))
5053 if(!smb_io_unistr2("uni_name", &q_u->uni_name, q_u->hdr_name.buffer, ps, depth))
5058 if(!prs_uint32("acb_info ", ps, depth, &q_u->acb_info))
5060 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
5066 /*******************************************************************
5067 reads or writes a structure.
5068 ********************************************************************/
5070 BOOL samr_io_r_create_user(const char *desc, SAMR_R_CREATE_USER * r_u,
5071 prs_struct *ps, int depth)
5076 prs_debug(ps, depth, desc, "samr_io_r_create_user");
5082 if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth))
5085 if(!prs_uint32("access_granted", ps, depth, &r_u->access_granted))
5087 if(!prs_uint32("user_rid ", ps, depth, &r_u->user_rid))
5089 if(!prs_ntstatus("status", ps, depth, &r_u->status))
5095 /*******************************************************************
5096 inits a SAMR_Q_QUERY_USERINFO structure.
5097 ********************************************************************/
5099 void init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO * q_u,
5100 POLICY_HND *hnd, uint16 switch_value)
5102 DEBUG(5, ("init_samr_q_query_userinfo\n"));
5105 q_u->switch_value = switch_value;
5108 /*******************************************************************
5109 reads or writes a structure.
5110 ********************************************************************/
5112 BOOL samr_io_q_query_userinfo(const char *desc, SAMR_Q_QUERY_USERINFO * q_u,
5113 prs_struct *ps, int depth)
5118 prs_debug(ps, depth, desc, "samr_io_q_query_userinfo");
5124 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
5127 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) /* 0x0015 or 0x0011 */
5133 /*******************************************************************
5134 reads or writes a LOGON_HRS structure.
5135 ********************************************************************/
5137 static BOOL sam_io_logon_hrs(const char *desc, LOGON_HRS * hrs,
5138 prs_struct *ps, int depth)
5143 prs_debug(ps, depth, desc, "sam_io_logon_hrs");
5149 if(!prs_uint32("len ", ps, depth, &hrs->len))
5152 if (hrs->len > sizeof(hrs->hours)) {
5153 DEBUG(3, ("sam_io_logon_hrs: truncating length from %d\n", hrs->len));
5154 hrs->len = sizeof(hrs->hours);
5157 if(!prs_uint8s(False, "hours", ps, depth, hrs->hours, hrs->len))
5163 /*******************************************************************
5164 inits a SAM_USER_INFO_12 structure.
5165 ********************************************************************/
5167 void init_sam_user_info12(SAM_USER_INFO_12 * usr,
5168 const uint8 lm_pwd[16], const uint8 nt_pwd[16])
5170 DEBUG(5, ("init_sam_user_info12\n"));
5172 usr->lm_pwd_active =
5173 memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd)) ? 1 : 0;
5174 usr->nt_pwd_active =
5175 memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd)) ? 1 : 0;
5178 /*******************************************************************
5179 reads or writes a structure.
5180 ********************************************************************/
5182 static BOOL sam_io_user_info12(const char *desc, SAM_USER_INFO_12 * u,
5183 prs_struct *ps, int depth)
5188 prs_debug(ps, depth, desc, "samr_io_r_user_info12");
5194 if(!prs_uint8s(False, "lm_pwd", ps, depth, u->lm_pwd, sizeof(u->lm_pwd)))
5196 if(!prs_uint8s(False, "nt_pwd", ps, depth, u->nt_pwd, sizeof(u->nt_pwd)))
5199 if(!prs_uint8("lm_pwd_active", ps, depth, &u->lm_pwd_active))
5201 if(!prs_uint8("nt_pwd_active", ps, depth, &u->nt_pwd_active))
5207 /*******************************************************************
5208 inits a SAM_USER_INFO_10 structure.
5209 ********************************************************************/
5211 void init_sam_user_info10(SAM_USER_INFO_10 * usr, uint32 acb_info)
5213 DEBUG(5, ("init_sam_user_info10\n"));
5215 usr->acb_info = acb_info;
5218 /*******************************************************************
5219 reads or writes a structure.
5220 ********************************************************************/
5222 static BOOL sam_io_user_info10(const char *desc, SAM_USER_INFO_10 * usr,
5223 prs_struct *ps, int depth)
5228 prs_debug(ps, depth, desc, "samr_io_r_user_info10");
5234 if(!prs_uint32("acb_info", ps, depth, &usr->acb_info))
5240 /*******************************************************************
5241 inits a SAM_USER_INFO_11 structure.
5242 ********************************************************************/
5244 void init_sam_user_info11(SAM_USER_INFO_11 * usr,
5247 uint32 rid_user, uint32 rid_group, uint16 acct_ctrl)
5249 DEBUG(5, ("init_sam_user_info11\n"));
5251 memcpy(&usr->expiry, expiry, sizeof(usr->expiry)); /* expiry time or something? */
5252 ZERO_STRUCT(usr->padding_1); /* 0 - padding 24 bytes */
5254 usr->padding_2 = 0; /* 0 - padding 4 bytes */
5256 usr->ptr_1 = 1; /* pointer */
5257 ZERO_STRUCT(usr->padding_3); /* 0 - padding 32 bytes */
5258 usr->padding_4 = 0; /* 0 - padding 4 bytes */
5260 usr->ptr_2 = 1; /* pointer */
5261 usr->padding_5 = 0; /* 0 - padding 4 bytes */
5263 usr->ptr_3 = 1; /* pointer */
5264 ZERO_STRUCT(usr->padding_6); /* 0 - padding 32 bytes */
5266 usr->rid_user = rid_user;
5267 usr->rid_group = rid_group;
5269 usr->acct_ctrl = acct_ctrl;
5270 usr->unknown_3 = 0x0000;
5272 usr->unknown_4 = 0x003f; /* 0x003f - 16 bit unknown */
5273 usr->unknown_5 = 0x003c; /* 0x003c - 16 bit unknown */
5275 ZERO_STRUCT(usr->padding_7); /* 0 - padding 16 bytes */
5276 usr->padding_8 = 0; /* 0 - padding 4 bytes */
5278 init_unistr2(&usr->uni_mach_acct, mach_acct, UNI_FLAGS_NONE); /* unicode string for machine account */
5279 init_uni_hdr(&usr->hdr_mach_acct, &usr->uni_mach_acct); /* unicode header for machine account */
5282 /*******************************************************************
5283 reads or writes a structure.
5284 ********************************************************************/
5286 static BOOL sam_io_user_info11(const char *desc, SAM_USER_INFO_11 * usr,
5287 prs_struct *ps, int depth)
5292 prs_debug(ps, depth, desc, "samr_io_r_unknown_11");
5298 if(!prs_uint8s(False, "padding_0", ps, depth, usr->padding_0, sizeof(usr->padding_0)))
5301 if(!smb_io_time("time", &usr->expiry, ps, depth))
5304 if(!prs_uint8s(False, "padding_1", ps, depth, usr->padding_1, sizeof(usr->padding_1)))
5307 if(!smb_io_unihdr("unihdr", &usr->hdr_mach_acct, ps, depth))
5310 if(!prs_uint32("padding_2", ps, depth, &usr->padding_2))
5313 if(!prs_uint32("ptr_1 ", ps, depth, &usr->ptr_1))
5315 if(!prs_uint8s(False, "padding_3", ps, depth, usr->padding_3, sizeof(usr->padding_3)))
5318 if(!prs_uint32("padding_4", ps, depth, &usr->padding_4))
5321 if(!prs_uint32("ptr_2 ", ps, depth, &usr->ptr_2))
5323 if(!prs_uint32("padding_5", ps, depth, &usr->padding_5))
5326 if(!prs_uint32("ptr_3 ", ps, depth, &usr->ptr_3))
5328 if(!prs_uint8s(False, "padding_6", ps, depth, usr->padding_6,sizeof(usr->padding_6)))
5331 if(!prs_uint32("rid_user ", ps, depth, &usr->rid_user))
5333 if(!prs_uint32("rid_group", ps, depth, &usr->rid_group))
5335 if(!prs_uint16("acct_ctrl", ps, depth, &usr->acct_ctrl))
5337 if(!prs_uint16("unknown_3", ps, depth, &usr->unknown_3))
5339 if(!prs_uint16("unknown_4", ps, depth, &usr->unknown_4))
5341 if(!prs_uint16("unknown_5", ps, depth, &usr->unknown_5))
5344 if(!prs_uint8s(False, "padding_7", ps, depth, usr->padding_7, sizeof(usr->padding_7)))
5347 if(!prs_uint32("padding_8", ps, depth, &(usr->padding_8)))
5350 if(!smb_io_unistr2("unistr2", &usr->uni_mach_acct, True, ps, depth))
5356 if(!prs_uint8s(False, "padding_9", ps, depth, usr->padding_9, sizeof(usr->padding_9)))
5362 /*************************************************************************
5364 *************************************************************************/
5366 void init_sam_user_info24(SAM_USER_INFO_24 * usr, char newpass[516], uint16 pw_len)
5368 DEBUG(10, ("init_sam_user_info24:\n"));
5369 memcpy(usr->pass, newpass, sizeof(usr->pass));
5370 usr->pw_len = pw_len;
5373 /*******************************************************************
5374 reads or writes a structure.
5375 ********************************************************************/
5377 static BOOL sam_io_user_info24(const char *desc, SAM_USER_INFO_24 * usr,
5378 prs_struct *ps, int depth)
5383 prs_debug(ps, depth, desc, "sam_io_user_info24");
5389 if(!prs_uint8s(False, "password", ps, depth, usr->pass,
5393 if (MARSHALLING(ps) && (usr->pw_len != 0)) {
5394 if (!prs_uint16("pw_len", ps, depth, &usr->pw_len))
5403 /*************************************************************************
5404 init_sam_user_info23
5406 unknown_6 = 0x0000 04ec
5408 *************************************************************************/
5410 void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */
5411 NTTIME * logoff_time, /* all zeros */
5412 NTTIME * kickoff_time, /* all zeros */
5413 NTTIME * pass_last_set_time, /* all zeros */
5414 NTTIME * pass_can_change_time, /* all zeros */
5415 NTTIME * pass_must_change_time, /* all zeros */
5426 uint32 user_rid, /* 0x0000 0000 */
5429 uint32 fields_present,
5432 uint16 bad_password_count,
5434 char newpass[516], uint32 unknown_6)
5436 usr->logon_time = *logon_time; /* all zeros */
5437 usr->logoff_time = *logoff_time; /* all zeros */
5438 usr->kickoff_time = *kickoff_time; /* all zeros */
5439 usr->pass_last_set_time = *pass_last_set_time; /* all zeros */
5440 usr->pass_can_change_time = *pass_can_change_time; /* all zeros */
5441 usr->pass_must_change_time = *pass_must_change_time; /* all zeros */
5443 ZERO_STRUCT(usr->nt_pwd);
5444 ZERO_STRUCT(usr->lm_pwd);
5446 usr->user_rid = user_rid; /* 0x0000 0000 */
5447 usr->group_rid = group_rid;
5448 usr->acb_info = acb_info;
5449 usr->fields_present = fields_present; /* 09f8 27fa */
5451 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5452 usr->ptr_logon_hrs = hrs ? 1 : 0;
5454 if (nt_time_is_zero(pass_must_change_time)) {
5455 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
5457 usr->passmustchange=0;
5460 ZERO_STRUCT(usr->padding1);
5461 ZERO_STRUCT(usr->padding2);
5463 usr->bad_password_count = bad_password_count;
5464 usr->logon_count = logon_count;
5466 memcpy(usr->pass, newpass, sizeof(usr->pass));
5468 copy_unistr2(&usr->uni_user_name, user_name);
5469 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
5471 copy_unistr2(&usr->uni_full_name, full_name);
5472 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
5474 copy_unistr2(&usr->uni_home_dir, home_dir);
5475 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
5477 copy_unistr2(&usr->uni_dir_drive, dir_drive);
5478 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
5480 copy_unistr2(&usr->uni_logon_script, log_scr);
5481 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
5483 copy_unistr2(&usr->uni_profile_path, prof_path);
5484 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
5486 copy_unistr2(&usr->uni_acct_desc, desc);
5487 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
5489 copy_unistr2(&usr->uni_workstations, wkstas);
5490 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
5492 copy_unistr2(&usr->uni_unknown_str, unk_str);
5493 init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
5495 copy_unistr2(&usr->uni_munged_dial, mung_dial);
5496 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
5498 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
5501 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
5504 /*************************************************************************
5505 init_sam_user_info23
5507 unknown_6 = 0x0000 04ec
5509 *************************************************************************/
5511 void init_sam_user_info23A(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */
5512 NTTIME * logoff_time, /* all zeros */
5513 NTTIME * kickoff_time, /* all zeros */
5514 NTTIME * pass_last_set_time, /* all zeros */
5515 NTTIME * pass_can_change_time, /* all zeros */
5516 NTTIME * pass_must_change_time, /* all zeros */
5517 char *user_name, /* NULL */
5519 char *home_dir, char *dir_drive, char *log_scr,
5520 char *prof_path, const char *desc, char *wkstas,
5521 char *unk_str, char *mung_dial, uint32 user_rid, /* 0x0000 0000 */
5522 uint32 group_rid, uint32 acb_info,
5523 uint32 fields_present, uint16 logon_divs,
5524 LOGON_HRS * hrs, uint16 bad_password_count, uint16 logon_count,
5525 char newpass[516], uint32 unknown_6)
5527 DATA_BLOB blob = base64_decode_data_blob(mung_dial);
5529 usr->logon_time = *logon_time; /* all zeros */
5530 usr->logoff_time = *logoff_time; /* all zeros */
5531 usr->kickoff_time = *kickoff_time; /* all zeros */
5532 usr->pass_last_set_time = *pass_last_set_time; /* all zeros */
5533 usr->pass_can_change_time = *pass_can_change_time; /* all zeros */
5534 usr->pass_must_change_time = *pass_must_change_time; /* all zeros */
5536 ZERO_STRUCT(usr->nt_pwd);
5537 ZERO_STRUCT(usr->lm_pwd);
5539 usr->user_rid = user_rid; /* 0x0000 0000 */
5540 usr->group_rid = group_rid;
5541 usr->acb_info = acb_info;
5542 usr->fields_present = fields_present; /* 09f8 27fa */
5544 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5545 usr->ptr_logon_hrs = hrs ? 1 : 0;
5547 if (nt_time_is_zero(pass_must_change_time)) {
5548 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
5550 usr->passmustchange=0;
5553 ZERO_STRUCT(usr->padding1);
5554 ZERO_STRUCT(usr->padding2);
5556 usr->bad_password_count = bad_password_count;
5557 usr->logon_count = logon_count;
5559 memcpy(usr->pass, newpass, sizeof(usr->pass));
5561 init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
5562 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
5564 init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
5565 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
5567 init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
5568 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
5570 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
5571 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
5573 init_unistr2(&usr->uni_logon_script, log_scr, UNI_FLAGS_NONE);
5574 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
5576 init_unistr2(&usr->uni_profile_path, prof_path, UNI_FLAGS_NONE);
5577 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
5579 init_unistr2(&usr->uni_acct_desc, desc, UNI_FLAGS_NONE);
5580 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
5582 init_unistr2(&usr->uni_workstations, wkstas, UNI_FLAGS_NONE);
5583 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
5585 init_unistr2(&usr->uni_unknown_str, unk_str, UNI_FLAGS_NONE);
5586 init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
5588 init_unistr2_from_datablob(&usr->uni_munged_dial, &blob);
5589 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
5591 data_blob_free(&blob);
5593 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
5596 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
5599 /*******************************************************************
5600 reads or writes a structure.
5601 ********************************************************************/
5603 static BOOL sam_io_user_info23(const char *desc, SAM_USER_INFO_23 * usr,
5604 prs_struct *ps, int depth)
5609 prs_debug(ps, depth, desc, "sam_io_user_info23");
5615 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
5617 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
5619 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
5621 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth))
5623 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth))
5625 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
5628 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
5630 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
5632 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
5634 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
5636 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
5638 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
5640 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
5642 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
5644 if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */
5646 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
5649 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
5651 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
5654 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
5656 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
5658 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
5661 if(!prs_uint32("fields_present ", ps, depth, &usr->fields_present))
5663 if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */
5667 if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs))
5670 if(!prs_uint16("bad_password_count ", ps, depth, &usr->bad_password_count))
5672 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count))
5675 if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1)))
5677 if(!prs_uint8("passmustchange ", ps, depth, &usr->passmustchange))
5679 if(!prs_uint8("padding2 ", ps, depth, &usr->padding2))
5683 if(!prs_uint8s(False, "password ", ps, depth, usr->pass, sizeof(usr->pass)))
5686 /* here begins pointed-to data */
5688 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
5691 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
5694 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
5697 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
5700 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
5703 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
5706 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
5709 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
5712 if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */
5715 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth))
5718 /* ok, this is only guess-work (as usual) */
5719 if (usr->ptr_logon_hrs) {
5720 if(!prs_uint32("unknown_6 ", ps, depth, &usr->unknown_6))
5722 if(!prs_uint32("padding4 ", ps, depth, &usr->padding4))
5724 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
5726 } else if (UNMARSHALLING(ps)) {
5734 /*******************************************************************
5735 reads or writes a structure.
5736 NB. This structure is *definately* incorrect. It's my best guess
5737 currently for W2K SP2. The password field is encrypted in a different
5738 way than normal... And there are definately other problems. JRA.
5739 ********************************************************************/
5741 static BOOL sam_io_user_info25(const char *desc, SAM_USER_INFO_25 * usr, prs_struct *ps, int depth)
5746 prs_debug(ps, depth, desc, "sam_io_user_info25");
5752 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
5754 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
5756 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
5758 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth))
5760 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth))
5762 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
5765 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
5767 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
5769 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
5771 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
5773 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
5775 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
5777 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
5779 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
5781 if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */
5783 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
5786 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
5788 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
5791 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
5793 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
5795 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
5798 if(!prs_uint32s(False, "unknown_6 ", ps, depth, usr->unknown_6, 6))
5801 if(!prs_uint8s(False, "password ", ps, depth, usr->pass, sizeof(usr->pass)))
5804 /* here begins pointed-to data */
5806 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
5809 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
5812 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
5815 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
5818 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
5821 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
5824 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
5827 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
5830 if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */
5833 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth))
5836 #if 0 /* JRA - unknown... */
5837 /* ok, this is only guess-work (as usual) */
5838 if (usr->ptr_logon_hrs) {
5839 if(!prs_uint32("unknown_6 ", ps, depth, &usr->unknown_6))
5841 if(!prs_uint32("padding4 ", ps, depth, &usr->padding4))
5843 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
5845 } else if (UNMARSHALLING(ps)) {
5855 /*************************************************************************
5856 init_sam_user_info21W
5858 unknown_6 = 0x0000 04ec
5860 *************************************************************************/
5862 void init_sam_user_info21W(SAM_USER_INFO_21 * usr,
5863 NTTIME * logon_time,
5864 NTTIME * logoff_time,
5865 NTTIME * kickoff_time,
5866 NTTIME * pass_last_set_time,
5867 NTTIME * pass_can_change_time,
5868 NTTIME * pass_must_change_time,
5884 uint32 fields_present,
5887 uint16 bad_password_count,
5891 usr->logon_time = *logon_time;
5892 usr->logoff_time = *logoff_time;
5893 usr->kickoff_time = *kickoff_time;
5894 usr->pass_last_set_time = *pass_last_set_time;
5895 usr->pass_can_change_time = *pass_can_change_time;
5896 usr->pass_must_change_time = *pass_must_change_time;
5898 memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd));
5899 memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd));
5901 usr->user_rid = user_rid;
5902 usr->group_rid = group_rid;
5903 usr->acb_info = acb_info;
5904 usr->fields_present = fields_present; /* 0x00ff ffff */
5906 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5907 usr->ptr_logon_hrs = hrs ? 1 : 0;
5908 usr->bad_password_count = bad_password_count;
5909 usr->logon_count = logon_count;
5911 if (nt_time_is_zero(pass_must_change_time)) {
5912 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
5914 usr->passmustchange=0;
5917 ZERO_STRUCT(usr->padding1);
5918 ZERO_STRUCT(usr->padding2);
5920 copy_unistr2(&usr->uni_user_name, user_name);
5921 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
5923 copy_unistr2(&usr->uni_full_name, full_name);
5924 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
5926 copy_unistr2(&usr->uni_home_dir, home_dir);
5927 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
5929 copy_unistr2(&usr->uni_dir_drive, dir_drive);
5930 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
5932 copy_unistr2(&usr->uni_logon_script, log_scr);
5933 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
5935 copy_unistr2(&usr->uni_profile_path, prof_path);
5936 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
5938 copy_unistr2(&usr->uni_acct_desc, desc);
5939 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
5941 copy_unistr2(&usr->uni_workstations, wkstas);
5942 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
5944 copy_unistr2(&usr->uni_unknown_str, unk_str);
5945 init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
5947 copy_unistr2(&usr->uni_munged_dial, mung_dial);
5948 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
5950 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
5953 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
5956 /*************************************************************************
5957 init_sam_user_info21
5959 unknown_6 = 0x0000 04ec
5961 *************************************************************************/
5963 NTSTATUS init_sam_user_info21A(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw, DOM_SID *domain_sid)
5965 NTTIME logon_time, logoff_time, kickoff_time,
5966 pass_last_set_time, pass_can_change_time,
5967 pass_must_change_time;
5969 const char* user_name = pdb_get_username(pw);
5970 const char* full_name = pdb_get_fullname(pw);
5971 const char* home_dir = pdb_get_homedir(pw);
5972 const char* dir_drive = pdb_get_dir_drive(pw);
5973 const char* logon_script = pdb_get_logon_script(pw);
5974 const char* profile_path = pdb_get_profile_path(pw);
5975 const char* description = pdb_get_acct_desc(pw);
5976 const char* workstations = pdb_get_workstations(pw);
5977 const char* munged_dial = pdb_get_munged_dial(pw);
5978 DATA_BLOB munged_dial_blob;
5981 const DOM_SID *user_sid;
5984 const DOM_SID *group_sid;
5987 munged_dial_blob = base64_decode_data_blob(munged_dial);
5989 munged_dial_blob = data_blob(NULL, 0);
5992 /* Create NTTIME structs */
5993 unix_to_nt_time (&logon_time, pdb_get_logon_time(pw));
5994 unix_to_nt_time (&logoff_time, pdb_get_logoff_time(pw));
5995 unix_to_nt_time (&kickoff_time, pdb_get_kickoff_time(pw));
5996 unix_to_nt_time (&pass_last_set_time, pdb_get_pass_last_set_time(pw));
5997 unix_to_nt_time (&pass_can_change_time, pdb_get_pass_can_change_time(pw));
5998 unix_to_nt_time (&pass_must_change_time,pdb_get_pass_must_change_time(pw));
6000 /* structure assignment */
6001 usr->logon_time = logon_time;
6002 usr->logoff_time = logoff_time;
6003 usr->kickoff_time = kickoff_time;
6004 usr->pass_last_set_time = pass_last_set_time;
6005 usr->pass_can_change_time = pass_can_change_time;
6006 usr->pass_must_change_time = pass_must_change_time;
6008 ZERO_STRUCT(usr->nt_pwd);
6009 ZERO_STRUCT(usr->lm_pwd);
6011 user_sid = pdb_get_user_sid(pw);
6013 if (!sid_peek_check_rid(domain_sid, user_sid, &user_rid)) {
6014 fstring user_sid_string;
6015 fstring domain_sid_string;
6016 DEBUG(0, ("init_sam_user_info_21A: User %s has SID %s, \nwhich conflicts with "
6017 "the domain sid %s. Failing operation.\n",
6019 sid_to_string(user_sid_string, user_sid),
6020 sid_to_string(domain_sid_string, domain_sid)));
6021 data_blob_free(&munged_dial_blob);
6022 return NT_STATUS_UNSUCCESSFUL;
6025 group_sid = pdb_get_group_sid(pw);
6027 if (!sid_peek_check_rid(domain_sid, group_sid, &group_rid)) {
6028 fstring group_sid_string;
6029 fstring domain_sid_string;
6030 DEBUG(0, ("init_sam_user_info_21A: User %s has Primary Group SID %s, \n"
6031 "which conflicts with the domain sid %s. Failing operation.\n",
6033 sid_to_string(group_sid_string, group_sid),
6034 sid_to_string(domain_sid_string, domain_sid)));
6035 data_blob_free(&munged_dial_blob);
6036 return NT_STATUS_UNSUCCESSFUL;
6039 usr->user_rid = user_rid;
6040 usr->group_rid = group_rid;
6041 usr->acb_info = pdb_get_acct_ctrl(pw);
6044 Look at a user on a real NT4 PDC with usrmgr, press
6045 'ok'. Then you will see that fields_present is set to
6046 0x08f827fa. Look at the user immediately after that again,
6047 and you will see that 0x00fffff is returned. This solves
6048 the problem that you get access denied after having looked
6052 usr->fields_present = pdb_build_fields_present(pw);
6054 usr->logon_divs = pdb_get_logon_divs(pw);
6055 usr->ptr_logon_hrs = pdb_get_hours(pw) ? 1 : 0;
6056 usr->bad_password_count = pdb_get_bad_password_count(pw);
6057 usr->logon_count = pdb_get_logon_count(pw);
6059 if (pdb_get_pass_must_change_time(pw) == 0) {
6060 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
6062 usr->passmustchange=0;
6065 ZERO_STRUCT(usr->padding1);
6066 ZERO_STRUCT(usr->padding2);
6068 init_unistr2(&usr->uni_user_name, user_name, UNI_STR_TERMINATE);
6069 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
6071 init_unistr2(&usr->uni_full_name, full_name, UNI_STR_TERMINATE);
6072 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
6074 init_unistr2(&usr->uni_home_dir, home_dir, UNI_STR_TERMINATE);
6075 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
6077 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_STR_TERMINATE);
6078 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
6080 init_unistr2(&usr->uni_logon_script, logon_script, UNI_STR_TERMINATE);
6081 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
6083 init_unistr2(&usr->uni_profile_path, profile_path, UNI_STR_TERMINATE);
6084 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
6086 init_unistr2(&usr->uni_acct_desc, description, UNI_STR_TERMINATE);
6087 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
6089 init_unistr2(&usr->uni_workstations, workstations, UNI_STR_TERMINATE);
6090 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
6092 init_unistr2(&usr->uni_unknown_str, NULL, UNI_STR_TERMINATE);
6093 init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
6095 init_unistr2_from_datablob(&usr->uni_munged_dial, &munged_dial_blob);
6096 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
6097 data_blob_free(&munged_dial_blob);
6099 usr->unknown_6 = pdb_get_unknown_6(pw);
6102 if (pdb_get_hours(pw)) {
6103 usr->logon_hrs.len = pdb_get_hours_len(pw);
6104 memcpy(&usr->logon_hrs.hours, pdb_get_hours(pw), MAX_HOURS_LEN);
6106 memset(&usr->logon_hrs, 0xff, sizeof(usr->logon_hrs));
6108 return NT_STATUS_OK;
6111 /*******************************************************************
6112 reads or writes a structure.
6113 ********************************************************************/
6115 static BOOL sam_io_user_info21(const char *desc, SAM_USER_INFO_21 * usr,
6116 prs_struct *ps, int depth)
6121 prs_debug(ps, depth, desc, "sam_io_user_info21");
6127 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
6129 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
6131 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps,depth))
6133 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
6135 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps,depth))
6137 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
6140 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
6142 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
6144 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
6146 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
6148 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
6150 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
6152 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
6154 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
6156 if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */
6158 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
6161 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
6163 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
6166 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
6168 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
6170 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
6173 if(!prs_uint32("fields_present ", ps, depth, &usr->fields_present))
6175 if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */
6179 if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs))
6182 if(!prs_uint16("bad_password_count ", ps, depth, &usr->bad_password_count))
6184 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count))
6187 if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1)))
6189 if(!prs_uint8("passmustchange ", ps, depth, &usr->passmustchange))
6191 if(!prs_uint8("padding2 ", ps, depth, &usr->padding2))
6194 /* here begins pointed-to data */
6196 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name,usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
6198 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
6200 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
6202 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
6204 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
6206 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
6208 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
6210 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
6212 if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */
6214 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial,usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */
6217 /* ok, this is only guess-work (as usual) */
6218 if (usr->ptr_logon_hrs) {
6221 if(!prs_uint32("unknown_6 ", ps, depth, &usr->unknown_6))
6223 if(!prs_uint32("padding4 ", ps, depth, &usr->padding4))
6225 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
6227 } else if (UNMARSHALLING(ps)) {
6235 void init_sam_user_info20A(SAM_USER_INFO_20 *usr, SAM_ACCOUNT *pw)
6237 const char *munged_dial = pdb_get_munged_dial(pw);
6238 DATA_BLOB blob = base64_decode_data_blob(munged_dial);
6240 init_unistr2_from_datablob(&usr->uni_munged_dial, &blob);
6241 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
6242 data_blob_free(&blob);
6245 /*******************************************************************
6246 reads or writes a structure.
6247 ********************************************************************/
6249 static BOOL sam_io_user_info20(const char *desc, SAM_USER_INFO_20 *usr,
6250 prs_struct *ps, int depth)
6255 prs_debug(ps, depth, desc, "sam_io_user_info20");
6261 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
6264 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial,usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */
6270 /*******************************************************************
6271 inits a SAM_USERINFO_CTR structure.
6272 ********************************************************************/
6274 NTSTATUS make_samr_userinfo_ctr_usr21(TALLOC_CTX *ctx, SAM_USERINFO_CTR * ctr,
6275 uint16 switch_value,
6276 SAM_USER_INFO_21 * usr)
6278 DEBUG(5, ("init_samr_userinfo_ctr\n"));
6280 ctr->switch_value = switch_value;
6281 ctr->info.id = NULL;
6283 switch (switch_value) {
6285 ctr->info.id10 = (SAM_USER_INFO_10 *)talloc_zero(ctx,sizeof(SAM_USER_INFO_10));
6286 if (ctr->info.id10 == NULL)
6287 return NT_STATUS_NO_MEMORY;
6289 init_sam_user_info10(ctr->info.id10, usr->acb_info);
6292 /* whoops - got this wrong. i think. or don't understand what's happening. */
6296 info = (void *)&id11;
6298 expire.low = 0xffffffff;
6299 expire.high = 0x7fffffff;
6301 ctr->info.id = (SAM_USER_INFO_11 *) talloc_zero(ctx,sizeof(*ctr->info.id11));
6302 init_sam_user_info11(ctr->info.id11, &expire,
6303 "BROOKFIELDS$", /* name */
6304 0x03ef, /* user rid */
6305 0x201, /* group rid */
6306 0x0080); /* acb info */
6312 ctr->info.id12 = (SAM_USER_INFO_12 *)talloc_zero(ctx,sizeof(SAM_USER_INFO_12));
6313 if (ctr->info.id12 == NULL)
6314 return NT_STATUS_NO_MEMORY;
6316 init_sam_user_info12(ctr->info.id12, usr->lm_pwd, usr->nt_pwd);
6320 SAM_USER_INFO_21 *cusr;
6321 cusr = (SAM_USER_INFO_21 *)talloc_zero(ctx,sizeof(SAM_USER_INFO_21));
6322 ctr->info.id21 = cusr;
6323 if (ctr->info.id21 == NULL)
6324 return NT_STATUS_NO_MEMORY;
6325 memcpy(cusr, usr, sizeof(*usr));
6326 memset(cusr->lm_pwd, 0, sizeof(cusr->lm_pwd));
6327 memset(cusr->nt_pwd, 0, sizeof(cusr->nt_pwd));
6331 DEBUG(4,("make_samr_userinfo_ctr: unsupported info\n"));
6332 return NT_STATUS_INVALID_INFO_CLASS;
6335 return NT_STATUS_OK;
6338 /*******************************************************************
6339 inits a SAM_USERINFO_CTR structure.
6340 ********************************************************************/
6342 static void init_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr, DATA_BLOB *sess_key,
6343 uint16 switch_value, void *info)
6345 DEBUG(5, ("init_samr_userinfo_ctr\n"));
6347 ctr->switch_value = switch_value;
6348 ctr->info.id = info;
6350 switch (switch_value) {
6352 SamOEMhashBlob(ctr->info.id24->pass, 516, sess_key);
6353 dump_data(100, (char *)sess_key->data, sess_key->length);
6354 dump_data(100, (char *)ctr->info.id24->pass, 516);
6357 SamOEMhashBlob(ctr->info.id23->pass, 516, sess_key);
6358 dump_data(100, (char *)sess_key->data, sess_key->length);
6359 dump_data(100, (char *)ctr->info.id23->pass, 516);
6362 DEBUG(4,("init_samr_userinfo_ctr: unsupported switch level\n"));
6366 /*******************************************************************
6367 reads or writes a structure.
6368 ********************************************************************/
6370 static BOOL samr_io_userinfo_ctr(const char *desc, SAM_USERINFO_CTR **ppctr,
6371 prs_struct *ps, int depth)
6374 SAM_USERINFO_CTR *ctr;
6376 prs_debug(ps, depth, desc, "samr_io_userinfo_ctr");
6379 if (UNMARSHALLING(ps)) {
6380 ctr = (SAM_USERINFO_CTR *)prs_alloc_mem(ps,sizeof(SAM_USERINFO_CTR));
6388 /* lkclXXXX DO NOT ALIGN BEFORE READING SWITCH VALUE! */
6390 if(!prs_uint16("switch_value", ps, depth, &ctr->switch_value))
6397 switch (ctr->switch_value) {
6399 if (UNMARSHALLING(ps))
6400 ctr->info.id10 = (SAM_USER_INFO_10 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_10));
6401 if (ctr->info.id10 == NULL) {
6402 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6405 ret = sam_io_user_info10("", ctr->info.id10, ps, depth);
6408 if (UNMARSHALLING(ps))
6409 ctr->info.id11 = (SAM_USER_INFO_11 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_11));
6411 if (ctr->info.id11 == NULL) {
6412 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6415 ret = sam_io_user_info11("", ctr->info.id11, ps, depth);
6418 if (UNMARSHALLING(ps))
6419 ctr->info.id12 = (SAM_USER_INFO_12 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_12));
6421 if (ctr->info.id12 == NULL) {
6422 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6425 ret = sam_io_user_info12("", ctr->info.id12, ps, depth);
6428 if (UNMARSHALLING(ps))
6429 ctr->info.id20 = (SAM_USER_INFO_20 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_20));
6431 if (ctr->info.id20 == NULL) {
6432 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6435 ret = sam_io_user_info20("", ctr->info.id20, ps, depth);
6438 if (UNMARSHALLING(ps))
6439 ctr->info.id21 = (SAM_USER_INFO_21 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_21));
6441 if (ctr->info.id21 == NULL) {
6442 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6445 ret = sam_io_user_info21("", ctr->info.id21, ps, depth);
6448 if (UNMARSHALLING(ps))
6449 ctr->info.id23 = (SAM_USER_INFO_23 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_23));
6451 if (ctr->info.id23 == NULL) {
6452 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6455 ret = sam_io_user_info23("", ctr->info.id23, ps, depth);
6458 if (UNMARSHALLING(ps))
6459 ctr->info.id24 = (SAM_USER_INFO_24 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_24));
6461 if (ctr->info.id24 == NULL) {
6462 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6465 ret = sam_io_user_info24("", ctr->info.id24, ps, depth);
6468 if (UNMARSHALLING(ps))
6469 ctr->info.id25 = (SAM_USER_INFO_25 *)prs_alloc_mem(ps,sizeof(SAM_USER_INFO_25));
6471 if (ctr->info.id25 == NULL) {
6472 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6475 ret = sam_io_user_info25("", ctr->info.id25, ps, depth);
6478 DEBUG(2, ("samr_io_userinfo_ctr: unknown switch level 0x%x\n", ctr->switch_value));
6486 /*******************************************************************
6487 inits a SAMR_R_QUERY_USERINFO structure.
6488 ********************************************************************/
6490 void init_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO * r_u,
6491 SAM_USERINFO_CTR * ctr, NTSTATUS status)
6493 DEBUG(5, ("init_samr_r_query_userinfo\n"));
6498 if (NT_STATUS_IS_OK(status)) {
6503 r_u->status = status; /* return status */
6506 /*******************************************************************
6507 reads or writes a structure.
6508 ********************************************************************/
6510 BOOL samr_io_r_query_userinfo(const char *desc, SAMR_R_QUERY_USERINFO * r_u,
6511 prs_struct *ps, int depth)
6516 prs_debug(ps, depth, desc, "samr_io_r_query_userinfo");
6522 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
6525 if (r_u->ptr != 0) {
6526 if(!samr_io_userinfo_ctr("ctr", &r_u->ctr, ps, depth))
6532 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6538 /*******************************************************************
6539 inits a SAMR_Q_SET_USERINFO structure.
6540 ********************************************************************/
6542 void init_samr_q_set_userinfo(SAMR_Q_SET_USERINFO * q_u,
6543 POLICY_HND *hnd, DATA_BLOB *sess_key,
6544 uint16 switch_value, void *info)
6546 DEBUG(5, ("init_samr_q_set_userinfo\n"));
6549 q_u->switch_value = switch_value;
6550 init_samr_userinfo_ctr(q_u->ctr, sess_key, switch_value, info);
6553 /*******************************************************************
6554 reads or writes a structure.
6555 ********************************************************************/
6557 BOOL samr_io_q_set_userinfo(const char *desc, SAMR_Q_SET_USERINFO * q_u,
6558 prs_struct *ps, int depth)
6563 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo");
6569 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
6571 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
6573 if(!samr_io_userinfo_ctr("ctr", &q_u->ctr, ps, depth))
6579 /*******************************************************************
6580 inits a SAMR_R_SET_USERINFO structure.
6581 ********************************************************************/
6583 void init_samr_r_set_userinfo(SAMR_R_SET_USERINFO * r_u, NTSTATUS status)
6585 DEBUG(5, ("init_samr_r_set_userinfo\n"));
6587 r_u->status = status; /* return status */
6590 /*******************************************************************
6591 reads or writes a structure.
6592 ********************************************************************/
6594 BOOL samr_io_r_set_userinfo(const char *desc, SAMR_R_SET_USERINFO * r_u,
6595 prs_struct *ps, int depth)
6600 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo");
6606 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6612 /*******************************************************************
6613 inits a SAMR_Q_SET_USERINFO2 structure.
6614 ********************************************************************/
6616 void init_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 * q_u,
6617 POLICY_HND *hnd, DATA_BLOB *sess_key,
6618 uint16 switch_value, SAM_USERINFO_CTR * ctr)
6620 DEBUG(5, ("init_samr_q_set_userinfo2\n"));
6623 q_u->switch_value = switch_value;
6626 if (q_u->ctr != NULL)
6627 q_u->ctr->switch_value = switch_value;
6629 switch (switch_value) {
6631 SamOEMhashBlob(ctr->info.id12->lm_pwd, 16, sess_key);
6632 SamOEMhashBlob(ctr->info.id12->nt_pwd, 16, sess_key);
6633 dump_data(100, (char *)sess_key->data, sess_key->length);
6634 dump_data(100, (char *)ctr->info.id12->lm_pwd, 16);
6635 dump_data(100, (char *)ctr->info.id12->nt_pwd, 16);
6640 /*******************************************************************
6641 reads or writes a structure.
6642 ********************************************************************/
6644 BOOL samr_io_q_set_userinfo2(const char *desc, SAMR_Q_SET_USERINFO2 * q_u,
6645 prs_struct *ps, int depth)
6650 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo2");
6656 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
6659 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
6661 if(!samr_io_userinfo_ctr("ctr", &q_u->ctr, ps, depth))
6667 /*******************************************************************
6668 inits a SAMR_R_SET_USERINFO2 structure.
6669 ********************************************************************/
6671 void init_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 * r_u, NTSTATUS status)
6673 DEBUG(5, ("init_samr_r_set_userinfo2\n"));
6675 r_u->status = status; /* return status */
6678 /*******************************************************************
6679 reads or writes a structure.
6680 ********************************************************************/
6682 BOOL samr_io_r_set_userinfo2(const char *desc, SAMR_R_SET_USERINFO2 * r_u,
6683 prs_struct *ps, int depth)
6688 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo2");
6694 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6700 /*******************************************************************
6701 inits a SAMR_Q_CONNECT structure.
6702 ********************************************************************/
6704 void init_samr_q_connect(SAMR_Q_CONNECT * q_u,
6705 char *srv_name, uint32 access_mask)
6707 DEBUG(5, ("init_samr_q_connect\n"));
6709 /* make PDC server name \\server */
6710 q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
6711 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
6713 /* example values: 0x0000 0002 */
6714 q_u->access_mask = access_mask;
6717 /*******************************************************************
6718 reads or writes a structure.
6719 ********************************************************************/
6721 BOOL samr_io_q_connect(const char *desc, SAMR_Q_CONNECT * q_u,
6722 prs_struct *ps, int depth)
6727 prs_debug(ps, depth, desc, "samr_io_q_connect");
6733 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
6735 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
6740 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
6746 /*******************************************************************
6747 reads or writes a structure.
6748 ********************************************************************/
6750 BOOL samr_io_r_connect(const char *desc, SAMR_R_CONNECT * r_u,
6751 prs_struct *ps, int depth)
6756 prs_debug(ps, depth, desc, "samr_io_r_connect");
6762 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
6765 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6771 /*******************************************************************
6772 inits a SAMR_Q_CONNECT4 structure.
6773 ********************************************************************/
6775 void init_samr_q_connect4(SAMR_Q_CONNECT4 * q_u,
6776 char *srv_name, uint32 access_mask)
6778 DEBUG(5, ("init_samr_q_connect\n"));
6780 /* make PDC server name \\server */
6781 q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
6782 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
6784 /* Only value we've seen, possibly an address type ? */
6787 /* example values: 0x0000 0002 */
6788 q_u->access_mask = access_mask;
6791 /*******************************************************************
6792 reads or writes a structure.
6793 ********************************************************************/
6795 BOOL samr_io_q_connect4(const char *desc, SAMR_Q_CONNECT4 * q_u,
6796 prs_struct *ps, int depth)
6801 prs_debug(ps, depth, desc, "samr_io_q_connect4");
6807 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
6809 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
6814 if(!prs_uint32("unk_0", ps, depth, &q_u->unk_0))
6816 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
6822 /*******************************************************************
6823 reads or writes a structure.
6824 ********************************************************************/
6826 BOOL samr_io_r_connect4(const char *desc, SAMR_R_CONNECT4 * r_u,
6827 prs_struct *ps, int depth)
6832 prs_debug(ps, depth, desc, "samr_io_r_connect4");
6838 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
6841 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6847 /*******************************************************************
6848 inits a SAMR_Q_CONNECT_ANON structure.
6849 ********************************************************************/
6851 void init_samr_q_connect_anon(SAMR_Q_CONNECT_ANON * q_u)
6853 DEBUG(5, ("init_samr_q_connect_anon\n"));
6856 q_u->unknown_0 = 0x5c; /* server name (?!!) */
6857 q_u->unknown_1 = 0x01;
6858 q_u->access_mask = 0x20;
6861 /*******************************************************************
6862 reads or writes a structure.
6863 ********************************************************************/
6865 BOOL samr_io_q_connect_anon(const char *desc, SAMR_Q_CONNECT_ANON * q_u,
6866 prs_struct *ps, int depth)
6871 prs_debug(ps, depth, desc, "samr_io_q_connect_anon");
6877 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
6879 if(!prs_uint16("unknown_0", ps, depth, &q_u->unknown_0))
6881 if(!prs_uint16("unknown_1", ps, depth, &q_u->unknown_1))
6883 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
6889 /*******************************************************************
6890 reads or writes a structure.
6891 ********************************************************************/
6893 BOOL samr_io_r_connect_anon(const char *desc, SAMR_R_CONNECT_ANON * r_u,
6894 prs_struct *ps, int depth)
6899 prs_debug(ps, depth, desc, "samr_io_r_connect_anon");
6905 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
6908 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6914 /*******************************************************************
6915 inits a SAMR_Q_GET_DOM_PWINFO structure.
6916 ********************************************************************/
6918 void init_samr_q_get_dom_pwinfo(SAMR_Q_GET_DOM_PWINFO * q_u,
6921 DEBUG(5, ("init_samr_q_get_dom_pwinfo\n"));
6924 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_FLAGS_NONE);
6925 init_uni_hdr(&q_u->hdr_srv_name, &q_u->uni_srv_name);
6928 /*******************************************************************
6929 reads or writes a structure.
6930 ********************************************************************/
6932 BOOL samr_io_q_get_dom_pwinfo(const char *desc, SAMR_Q_GET_DOM_PWINFO * q_u,
6933 prs_struct *ps, int depth)
6938 prs_debug(ps, depth, desc, "samr_io_q_get_dom_pwinfo");
6944 if(!prs_uint32("ptr", ps, depth, &q_u->ptr))
6946 if (q_u->ptr != 0) {
6947 if(!smb_io_unihdr("", &q_u->hdr_srv_name, ps, depth))
6949 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->hdr_srv_name.buffer, ps, depth))
6956 /*******************************************************************
6957 reads or writes a structure.
6958 ********************************************************************/
6960 BOOL samr_io_r_get_dom_pwinfo(const char *desc, SAMR_R_GET_DOM_PWINFO * r_u,
6961 prs_struct *ps, int depth)
6966 prs_debug(ps, depth, desc, "samr_io_r_get_dom_pwinfo");
6973 * see the Samba4 IDL for what these actually are.
6976 if(!prs_uint16("unk_0", ps, depth, &r_u->unk_0))
6980 if(!prs_uint32("unk_1", ps, depth, &r_u->unk_1))
6983 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6989 /*******************************************************************
6990 make a SAMR_ENC_PASSWD structure.
6991 ********************************************************************/
6993 void init_enc_passwd(SAMR_ENC_PASSWD * pwd, const char pass[512])
7001 memcpy(pwd->pass, pass, sizeof(pwd->pass));
7005 /*******************************************************************
7006 reads or writes a SAMR_ENC_PASSWD structure.
7007 ********************************************************************/
7009 BOOL samr_io_enc_passwd(const char *desc, SAMR_ENC_PASSWD * pwd,
7010 prs_struct *ps, int depth)
7015 prs_debug(ps, depth, desc, "samr_io_enc_passwd");
7021 if(!prs_uint32("ptr", ps, depth, &pwd->ptr))
7024 if (pwd->ptr != 0) {
7025 if(!prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass)))
7032 /*******************************************************************
7033 inits a SAMR_ENC_HASH structure.
7034 ********************************************************************/
7036 void init_enc_hash(SAMR_ENC_HASH * hsh, const uchar hash[16])
7044 memcpy(hsh->hash, hash, sizeof(hsh->hash));
7048 /*******************************************************************
7049 reads or writes a SAMR_ENC_HASH structure.
7050 ********************************************************************/
7052 BOOL samr_io_enc_hash(const char *desc, SAMR_ENC_HASH * hsh,
7053 prs_struct *ps, int depth)
7058 prs_debug(ps, depth, desc, "samr_io_enc_hash");
7064 if(!prs_uint32("ptr ", ps, depth, &hsh->ptr))
7066 if (hsh->ptr != 0) {
7067 if(!prs_uint8s(False, "hash", ps, depth, hsh->hash,sizeof(hsh->hash)))
7074 /*******************************************************************
7075 inits a SAMR_R_GET_DOM_PWINFO structure.
7076 ********************************************************************/
7078 void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER * q_u,
7079 const char *dest_host, const char *user_name,
7080 const char nt_newpass[516],
7081 const uchar nt_oldhash[16],
7082 const char lm_newpass[516],
7083 const uchar lm_oldhash[16])
7085 DEBUG(5, ("init_samr_q_chgpasswd_user\n"));
7088 init_unistr2(&q_u->uni_dest_host, dest_host, UNI_FLAGS_NONE);
7089 init_uni_hdr(&q_u->hdr_dest_host, &q_u->uni_dest_host);
7091 init_unistr2(&q_u->uni_user_name, user_name, UNI_FLAGS_NONE);
7092 init_uni_hdr(&q_u->hdr_user_name, &q_u->uni_user_name);
7094 init_enc_passwd(&q_u->nt_newpass, nt_newpass);
7095 init_enc_hash(&q_u->nt_oldhash, nt_oldhash);
7097 q_u->unknown = 0x01;
7099 init_enc_passwd(&q_u->lm_newpass, lm_newpass);
7100 init_enc_hash(&q_u->lm_oldhash, lm_oldhash);
7103 /*******************************************************************
7104 reads or writes a structure.
7105 ********************************************************************/
7107 BOOL samr_io_q_chgpasswd_user(const char *desc, SAMR_Q_CHGPASSWD_USER * q_u,
7108 prs_struct *ps, int depth)
7113 prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user");
7119 if(!prs_uint32("ptr_0", ps, depth, &q_u->ptr_0))
7122 if(!smb_io_unihdr("", &q_u->hdr_dest_host, ps, depth))
7124 if(!smb_io_unistr2("", &q_u->uni_dest_host, q_u->hdr_dest_host.buffer, ps, depth))
7129 if(!smb_io_unihdr("", &q_u->hdr_user_name, ps, depth))
7131 if(!smb_io_unistr2("", &q_u->uni_user_name, q_u->hdr_user_name.buffer,ps, depth))
7134 if(!samr_io_enc_passwd("nt_newpass", &q_u->nt_newpass, ps, depth))
7136 if(!samr_io_enc_hash("nt_oldhash", &q_u->nt_oldhash, ps, depth))
7139 if(!prs_uint32("unknown", ps, depth, &q_u->unknown))
7142 if(!samr_io_enc_passwd("lm_newpass", &q_u->lm_newpass, ps, depth))
7144 if(!samr_io_enc_hash("lm_oldhash", &q_u->lm_oldhash, ps, depth))
7150 /*******************************************************************
7151 inits a SAMR_R_CHGPASSWD_USER structure.
7152 ********************************************************************/
7154 void init_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER * r_u, NTSTATUS status)
7156 DEBUG(5, ("init_r_chgpasswd_user\n"));
7158 r_u->status = status;
7161 /*******************************************************************
7162 reads or writes a structure.
7163 ********************************************************************/
7165 BOOL samr_io_r_chgpasswd_user(const char *desc, SAMR_R_CHGPASSWD_USER * r_u,
7166 prs_struct *ps, int depth)
7171 prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user");
7177 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7183 /*******************************************************************
7184 reads or writes a structure.
7185 ********************************************************************/
7187 void init_samr_q_unknown_2e(SAMR_Q_UNKNOWN_2E *q_u,
7188 POLICY_HND *domain_pol, uint16 switch_value)
7190 DEBUG(5, ("init_samr_q_unknown_2e\n"));
7192 q_u->domain_pol = *domain_pol;
7193 q_u->switch_value = switch_value;
7196 /*******************************************************************
7197 reads or writes a structure.
7198 ********************************************************************/
7200 BOOL samr_io_q_unknown_2e(const char *desc, SAMR_Q_UNKNOWN_2E *q_u,
7201 prs_struct *ps, int depth)
7206 prs_debug(ps, depth, desc, "samr_io_q_unknown_2e");
7212 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
7215 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
7221 /*******************************************************************
7222 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
7223 ********************************************************************/
7225 void init_samr_r_samr_unknown_2e(SAMR_R_UNKNOWN_2E * r_u,
7226 uint16 switch_value, SAM_UNK_CTR * ctr,
7229 DEBUG(5, ("init_samr_r_samr_unknown_2e\n"));
7232 r_u->switch_value = 0;
7233 r_u->status = status; /* return status */
7235 if (NT_STATUS_IS_OK(status)) {
7236 r_u->switch_value = switch_value;
7242 /*******************************************************************
7243 reads or writes a structure.
7244 ********************************************************************/
7246 BOOL samr_io_r_samr_unknown_2e(const char *desc, SAMR_R_UNKNOWN_2E * r_u,
7247 prs_struct *ps, int depth)
7252 prs_debug(ps, depth, desc, "samr_io_r_samr_unknown_2e");
7258 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
7261 if (r_u->ptr_0 != 0 && r_u->ctr != NULL) {
7262 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
7267 switch (r_u->switch_value) {
7269 if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth))
7273 if(!sam_io_unk_info7("unk_inf7",&r_u->ctr->info.inf7, ps,depth))
7277 if(!sam_io_unk_info6("unk_inf6",&r_u->ctr->info.inf6, ps,depth))
7281 if(!sam_io_unk_info5("unk_inf5",&r_u->ctr->info.inf5, ps,depth))
7285 if(!sam_io_unk_info3("unk_inf3",&r_u->ctr->info.inf3, ps,depth))
7289 if(!sam_io_unk_info2("unk_inf2",&r_u->ctr->info.inf2, ps,depth))
7293 if(!sam_io_unk_info1("unk_inf1",&r_u->ctr->info.inf1, ps,depth))
7297 DEBUG(0, ("samr_io_r_samr_unknown_2e: unknown switch level 0x%x\n",
7298 r_u->switch_value));
7299 r_u->status = NT_STATUS_INVALID_INFO_CLASS;
7307 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7314 /*******************************************************************
7315 reads or writes a structure.
7316 ********************************************************************/
7318 void init_samr_q_set_domain_info(SAMR_Q_SET_DOMAIN_INFO *q_u,
7319 POLICY_HND *domain_pol, uint16 switch_value, SAM_UNK_CTR *ctr)
7321 DEBUG(5, ("init_samr_q_set_domain_info\n"));
7323 q_u->domain_pol = *domain_pol;
7324 q_u->switch_value0 = switch_value;
7326 q_u->switch_value = switch_value;
7331 /*******************************************************************
7332 reads or writes a structure.
7333 ********************************************************************/
7335 BOOL samr_io_q_set_domain_info(const char *desc, SAMR_Q_SET_DOMAIN_INFO *q_u,
7336 prs_struct *ps, int depth)
7341 prs_debug(ps, depth, desc, "samr_io_q_set_domain_info");
7347 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
7350 if(!prs_uint16("switch_value0", ps, depth, &q_u->switch_value0))
7353 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
7359 if ((q_u->ctr = (SAM_UNK_CTR *)prs_alloc_mem(ps, sizeof(SAM_UNK_CTR))) == NULL)
7362 switch (q_u->switch_value) {
7365 if(!sam_io_unk_info12("unk_inf12", &q_u->ctr->info.inf12, ps, depth))
7369 if(!sam_io_unk_info7("unk_inf7",&q_u->ctr->info.inf7, ps,depth))
7373 if(!sam_io_unk_info6("unk_inf6",&q_u->ctr->info.inf6, ps,depth))
7377 if(!sam_io_unk_info5("unk_inf5",&q_u->ctr->info.inf5, ps,depth))
7381 if(!sam_io_unk_info3("unk_inf3",&q_u->ctr->info.inf3, ps,depth))
7385 if(!sam_io_unk_info2("unk_inf2",&q_u->ctr->info.inf2, ps,depth))
7389 if(!sam_io_unk_info1("unk_inf1",&q_u->ctr->info.inf1, ps,depth))
7393 DEBUG(0, ("samr_io_r_samr_unknown_2e: unknown switch level 0x%x\n",
7394 q_u->switch_value));
7401 /*******************************************************************
7402 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
7403 ********************************************************************/
7405 void init_samr_r_set_domain_info(SAMR_R_SET_DOMAIN_INFO * r_u, NTSTATUS status)
7407 DEBUG(5, ("init_samr_r_set_domain_info\n"));
7409 r_u->status = status; /* return status */
7412 /*******************************************************************
7413 reads or writes a structure.
7414 ********************************************************************/
7416 BOOL samr_io_r_set_domain_info(const char *desc, SAMR_R_SET_DOMAIN_INFO * r_u,
7417 prs_struct *ps, int depth)
7422 prs_debug(ps, depth, desc, "samr_io_r_samr_unknown_2e");
7428 if(!prs_ntstatus("status", ps, depth, &r_u->status))