3 * Unix SMB/Netbios implementation.
5 * RPC Pipe client / server routines
6 * Copyright (C) Andrew Tridgell 1992-1997,
7 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
8 * Copyright (C) Paul Ashton 1997.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 extern int DEBUGLEVEL;
31 /*******************************************************************
32 Inits a SAMR_Q_CLOSE_HND structure.
33 ********************************************************************/
35 void init_samr_q_close_hnd(SAMR_Q_CLOSE_HND *q_c, POLICY_HND *hnd)
37 DEBUG(5,("init_samr_q_close_hnd\n"));
39 memcpy(&q_c->pol, hnd, sizeof(q_c->pol));
42 /*******************************************************************
43 Reads or writes a structure.
44 ********************************************************************/
46 BOOL samr_io_q_close_hnd(char *desc, SAMR_Q_CLOSE_HND *q_u, prs_struct *ps, int depth)
51 prs_debug(ps, depth, desc, "samr_io_q_close_hnd");
57 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
65 /*******************************************************************
66 Reads or writes a structure.
67 ********************************************************************/
69 BOOL samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND *r_u, 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))
85 if(!prs_uint32("status", ps, depth, &r_u->status))
92 /*******************************************************************
93 Reads or writes a structure.
94 ********************************************************************/
96 void init_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN *q_u,
97 POLICY_HND *connect_pol, uint32 rid,
100 DEBUG(5,("samr_init_q_open_domain\n"));
102 memcpy(&q_u->connect_pol, connect_pol, sizeof(q_u->connect_pol));
104 init_dom_sid2(&q_u->dom_sid, sid);
107 /*******************************************************************
108 Reads or writes a structure.
109 ********************************************************************/
111 BOOL samr_io_q_open_domain(char *desc, SAMR_Q_OPEN_DOMAIN *q_u, prs_struct *ps, int depth)
116 prs_debug(ps, depth, desc, "samr_io_q_open_domain");
122 if(!smb_io_pol_hnd("connect_pol", &q_u->connect_pol, ps, depth))
127 if(!prs_uint32("rid", ps, depth, &q_u->rid))
130 if(!smb_io_dom_sid2("sid", &q_u->dom_sid, ps, depth))
139 /*******************************************************************
140 Reads or writes a structure.
141 ********************************************************************/
143 BOOL samr_io_r_open_domain(char *desc, SAMR_R_OPEN_DOMAIN *r_u, prs_struct *ps, int depth)
148 prs_debug(ps, depth, desc, "samr_io_r_open_domain");
154 if(!smb_io_pol_hnd("domain_pol", &r_u->domain_pol, ps, depth))
159 if(!prs_uint32("status", ps, depth, &r_u->status))
165 /*******************************************************************
166 Reads or writes a structure.
167 ********************************************************************/
169 void init_samr_q_unknown_2c(SAMR_Q_UNKNOWN_2C *q_u, POLICY_HND *user_pol)
171 DEBUG(5,("samr_init_q_unknown_2c\n"));
173 memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol));
177 /*******************************************************************
178 Reads or writes a structure.
179 ********************************************************************/
181 BOOL samr_io_q_unknown_2c(char *desc, SAMR_Q_UNKNOWN_2C *q_u, prs_struct *ps, int depth)
186 prs_debug(ps, depth, desc, "samr_io_q_unknown_2c");
192 if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth))
200 /*******************************************************************
202 ********************************************************************/
204 void init_samr_r_unknown_2c(SAMR_R_UNKNOWN_2C *q_u, uint32 status)
206 DEBUG(5,("samr_init_r_unknown_2c\n"));
208 q_u->unknown_0 = 0x00160000;
209 q_u->unknown_1 = 0x00000000;
210 q_u->status = status;
214 /*******************************************************************
215 Reads or writes a structure.
216 ********************************************************************/
218 BOOL samr_io_r_unknown_2c(char *desc, SAMR_R_UNKNOWN_2C *r_u, prs_struct *ps, int depth)
223 prs_debug(ps, depth, desc, "samr_io_r_unknown_2c");
229 if(!prs_uint32("unknown_0", ps, depth, &r_u->unknown_0))
231 if(!prs_uint32("unknown_1", ps, depth, &r_u->unknown_1))
233 if(!prs_uint32("status ", ps, depth, &r_u->status))
239 /*******************************************************************
240 Inits a SAMR_Q_UNKNOWN_3 structure.
241 ********************************************************************/
243 void init_samr_q_unknown_3(SAMR_Q_UNKNOWN_3 *q_u,
244 POLICY_HND *user_pol, uint16 switch_value)
246 DEBUG(5,("samr_init_q_unknown_3\n"));
248 memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol));
249 q_u->switch_value = switch_value;
253 /*******************************************************************
254 Reads or writes a structure.
255 ********************************************************************/
257 BOOL samr_io_q_unknown_3(char *desc, SAMR_Q_UNKNOWN_3 *q_u, prs_struct *ps, int depth)
262 prs_debug(ps, depth, desc, "samr_io_q_unknown_3");
268 if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth))
274 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
282 /*******************************************************************
283 Inits a SAMR_Q_QUERY_DOMAIN_INFO structure.
284 ********************************************************************/
286 void init_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO *q_u,
287 POLICY_HND *domain_pol, uint16 switch_value)
289 DEBUG(5,("init_samr_q_query_dom_info\n"));
291 memcpy(&q_u->domain_pol, domain_pol, sizeof(q_u->domain_pol));
292 q_u->switch_value = switch_value;
295 /*******************************************************************
296 Reads or writes a structure.
297 ********************************************************************/
299 BOOL samr_io_q_query_dom_info(char *desc, SAMR_Q_QUERY_DOMAIN_INFO *q_u, prs_struct *ps, int depth)
304 prs_debug(ps, depth, desc, "samr_io_q_query_dom_info");
310 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
315 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
321 /*******************************************************************
323 ********************************************************************/
324 BOOL init_unk_info1(SAM_UNK_INFO_1 *u_1)
329 memset(u_1->padding, 0, sizeof(u_1->padding)); /* 12 bytes zeros */
330 u_1->unknown_1 = 0x80000000;
331 u_1->unknown_2 = 0x00000000;
336 /*******************************************************************
337 reads or writes a structure.
338 ********************************************************************/
339 static BOOL sam_io_unk_info1(char *desc, SAM_UNK_INFO_1 *u_1, prs_struct *ps, int depth)
344 prs_debug(ps, depth, desc, "sam_io_unk_info1");
347 if(!prs_uint8s(False, "padding", ps, depth, u_1->padding, sizeof(u_1->padding)))
350 if(!prs_uint32("unknown_1", ps, depth, &u_1->unknown_1)) /* 0x8000 0000 */
352 if(!prs_uint32("unknown_2", ps, depth, &u_1->unknown_2)) /* 0x0000 0000 */
361 /*******************************************************************
363 ********************************************************************/
365 void init_unk_info2(SAM_UNK_INFO_2 *u_2, char *domain, char *server)
367 int len_domain = strlen(domain);
368 int len_server = strlen(server);
370 u_2->unknown_0 = 0x00000000;
371 u_2->unknown_1 = 0x80000000;
372 u_2->unknown_2 = 0x00000000;
375 init_uni_hdr(&u_2->hdr_domain, len_domain);
376 init_uni_hdr(&u_2->hdr_server, len_server);
378 u_2->seq_num = 0x10000000;
379 u_2->unknown_3 = 0x00000000;
381 u_2->unknown_4 = 0x00000001;
382 u_2->unknown_5 = 0x00000003;
383 u_2->unknown_6 = 0x00000001;
384 u_2->num_domain_usrs = 0x00000008;
385 u_2->num_domain_grps = 0x00000003;
386 u_2->num_local_grps = 0x00000003;
388 memset(u_2->padding, 0, sizeof(u_2->padding)); /* 12 bytes zeros */
390 init_unistr2(&u_2->uni_domain, domain, len_domain);
391 init_unistr2(&u_2->uni_server, server, len_server);
394 /*******************************************************************
395 Reads or writes a structure.
396 ********************************************************************/
398 BOOL sam_io_unk_info2(char *desc, SAM_UNK_INFO_2 *u_2, prs_struct *ps, int depth)
403 prs_debug(ps, depth, desc, "sam_io_unk_info2");
406 if(!prs_uint32("unknown_0", ps, depth, &u_2->unknown_0)) /* 0x0000 0000 */
408 if(!prs_uint32("unknown_1", ps, depth, &u_2->unknown_1)) /* 0x8000 0000 */
410 if(!prs_uint32("unknown_2", ps, depth, &u_2->unknown_2)) /* 0x0000 0000 */
413 if(!prs_uint32("ptr_0", ps, depth, &u_2->ptr_0)) /* pointer to unknown structure */
415 if(!smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth)) /* domain name unicode header */
417 if(!smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth)) /* server name unicode header */
420 /* put all the data in here, at the moment, including what the above
421 pointer is referring to
424 if(!prs_uint32("seq_num ", ps, depth, &u_2->seq_num )) /* 0x0000 0099 or 0x1000 0000 */
426 if(!prs_uint32("unknown_3 ", ps, depth, &u_2->unknown_3 )) /* 0x0000 0000 */
429 if(!prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4 )) /* 0x0000 0001 */
431 if(!prs_uint32("unknown_5 ", ps, depth, &u_2->unknown_5 )) /* 0x0000 0003 */
433 if(!prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6 )) /* 0x0000 0001 */
435 if(!prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs )) /* 0x0000 0008 */
437 if(!prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps)) /* 0x0000 0003 */
439 if(!prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps)) /* 0x0000 0003 */
442 if(!prs_uint8s(False, "padding", ps, depth, u_2->padding, sizeof(u_2->padding))) /* 12 bytes zeros */
445 if(!smb_io_unistr2( "uni_domain", &u_2->uni_domain, u_2->hdr_domain.buffer, ps, depth)) /* domain name unicode string */
450 if(!smb_io_unistr2( "uni_server", &u_2->uni_server, u_2->hdr_server.buffer, ps, depth)) /* server name unicode string */
459 /*******************************************************************
461 ********************************************************************/
462 BOOL init_unk_info3(SAM_UNK_INFO_3 * u_3)
467 u_3->unknown_0 = 0x00000000;
468 u_3->unknown_1 = 0x80000000;
473 /*******************************************************************
474 reads or writes a structure.
475 ********************************************************************/
476 static BOOL sam_io_unk_info3(char *desc, SAM_UNK_INFO_3 *u_3, prs_struct *ps, int depth)
481 prs_debug(ps, depth, desc, "sam_io_unk_info3");
484 if(!prs_uint32("unknown_0", ps, depth, &u_3->unknown_0)) /* 0x0000 0000 */
486 if(!prs_uint32("unknown_1", ps, depth, &u_3->unknown_1)) /* 0x8000 0000 */
495 /*******************************************************************
497 ********************************************************************/
498 BOOL init_unk_info6(SAM_UNK_INFO_6 * u_6)
503 u_6->unknown_0 = 0x00000000;
505 memset(u_6->padding, 0, sizeof(u_6->padding)); /* 12 bytes zeros */
510 /*******************************************************************
511 reads or writes a structure.
512 ********************************************************************/
513 static BOOL sam_io_unk_info6(char *desc, SAM_UNK_INFO_6 *u_6, prs_struct *ps, int depth)
518 prs_debug(ps, depth, desc, "sam_io_unk_info6");
521 if(!prs_uint32("unknown_0", ps, depth, &u_6->unknown_0)) /* 0x0000 0000 */
523 if(!prs_uint32("ptr_0", ps, depth, &u_6->ptr_0)) /* pointer to unknown structure */
525 if(!prs_uint8s(False, "padding", ps, depth, u_6->padding, sizeof(u_6->padding))) /* 12 bytes zeros */
534 /*******************************************************************
536 ********************************************************************/
537 BOOL init_unk_info7(SAM_UNK_INFO_7 *u_7)
542 u_7->unknown_0 = 0x0003;
547 /*******************************************************************
548 reads or writes a structure.
549 ********************************************************************/
550 static BOOL sam_io_unk_info7(char *desc, SAM_UNK_INFO_7 *u_7, prs_struct *ps, int depth)
555 prs_debug(ps, depth, desc, "sam_io_unk_info7");
558 if(!prs_uint16("unknown_0", ps, depth, &u_7->unknown_0)) /* 0x0003 */
566 /*******************************************************************
568 ********************************************************************/
569 BOOL init_unk_info12(SAM_UNK_INFO_12 * u_12)
574 u_12->unknown_0 = 0xcf1dcc00;
575 u_12->unknown_1 = 0xfffffffb;
576 u_12->unknown_2 = 0xcf1dcc00;
577 u_12->unknown_3 = 0xfffffffb;
579 u_12->unknown_4 = 0x8a880000;
584 /*******************************************************************
585 reads or writes a structure.
586 ********************************************************************/
587 static BOOL sam_io_unk_info12(char *desc, SAM_UNK_INFO_12 * u_12,
588 prs_struct *ps, int depth)
593 prs_debug(ps, depth, desc, "sam_io_unk_info12");
596 if(!prs_uint32("unknown_0", ps, depth, &u_12->unknown_0))
598 if(!prs_uint32("unknown_1", ps, depth, &u_12->unknown_1))
600 if(!prs_uint32("unknown_2", ps, depth, &u_12->unknown_2))
602 if(!prs_uint32("unknown_3", ps, depth, &u_12->unknown_3))
604 if(!prs_uint32("unknown_4", ps, depth, &u_12->unknown_4))
613 /*******************************************************************
614 Inits a SAMR_R_QUERY_DOMAIN_INFO structure.
615 ********************************************************************/
617 void init_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO *r_u,
618 uint16 switch_value, SAM_UNK_CTR *ctr,
621 DEBUG(5,("init_samr_r_query_dom_info\n"));
624 r_u->switch_value = 0;
625 r_u->status = status; /* return status */
628 r_u->switch_value = switch_value;
634 /*******************************************************************
635 Reads or writes a structure.
636 ********************************************************************/
638 BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO *r_u, prs_struct *ps, int depth)
643 prs_debug(ps, depth, desc, "samr_io_r_query_dom_info");
649 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
652 if (r_u->ptr_0 != 0 && r_u->ctr != NULL) {
653 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
658 switch (r_u->switch_value) {
660 if(!sam_io_unk_info1("unk_inf1", &r_u->ctr->info.inf1, ps, depth))
664 if(!sam_io_unk_info2("unk_inf2", &r_u->ctr->info.inf2, ps, depth))
668 if(!sam_io_unk_info3("unk_inf3", &r_u->ctr->info.inf3, ps, depth))
672 if(!sam_io_unk_info6("unk_inf6", &r_u->ctr->info.inf6, ps, depth))
676 if(!sam_io_unk_info7("unk_inf7", &r_u->ctr->info.inf7, ps, depth))
680 if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth))
684 DEBUG(3,("samr_io_r_query_dom_info: unknown switch level 0x%x\n",
690 if(!prs_uint32("status", ps, depth, &r_u->status))
697 /*******************************************************************
698 Inits a DOM_SID3 structure.
699 Calculate length by adding up the size of the components.
700 ********************************************************************/
702 void init_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid)
705 sid3->len = 2 + 8 + sid3->sid.num_auths * 4;
708 /*******************************************************************
709 Reads or writes a SAM_SID3 structure.
711 this one's odd, because the length (in bytes) is specified at the beginning.
712 the length _includes_ the length of the length, too :-)
714 ********************************************************************/
716 static BOOL sam_io_dom_sid3(char *desc, DOM_SID3 *sid3, prs_struct *ps, int depth)
721 prs_debug(ps, depth, desc, "sam_io_dom_sid3");
724 if(!prs_uint16("len", ps, depth, &sid3->len))
728 if(!smb_io_dom_sid("", &sid3->sid, ps, depth))
734 /*******************************************************************
735 Inits a SAMR_R_UNKNOWN3 structure.
740 unknown_4,5 : 0x0000 0014
743 unknown_7 : 0x5800 or 0x0070
745 ********************************************************************/
747 static void init_sam_sid_stuff(SAM_SID_STUFF *stf,
748 uint16 unknown_2, uint16 unknown_3,
749 uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
750 int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS])
752 stf->unknown_2 = unknown_2;
753 stf->unknown_3 = unknown_3;
755 memset((char *)stf->padding1, '\0', sizeof(stf->padding1));
757 stf->unknown_4 = unknown_4;
758 stf->unknown_5 = unknown_4;
760 stf->unknown_6 = unknown_6;
761 stf->unknown_7 = unknown_7;
763 stf->num_sids = num_sid3s;
765 stf->padding2 = 0x0000;
767 memcpy(stf->sid, sid3, sizeof(DOM_SID3) * num_sid3s);
770 /*******************************************************************
771 Reads or writes a SAM_SID_STUFF structure.
772 ********************************************************************/
774 static BOOL sam_io_sid_stuff(char *desc, SAM_SID_STUFF *stf, prs_struct *ps, int depth)
781 DEBUG(5,("init_sam_sid_stuff\n"));
783 if(!prs_uint16("unknown_2", ps, depth, &stf->unknown_2))
785 if(!prs_uint16("unknown_3", ps, depth, &stf->unknown_3))
788 if(!prs_uint8s(False, "padding1", ps, depth, stf->padding1, sizeof(stf->padding1)))
791 if(!prs_uint32("unknown_4", ps, depth, &stf->unknown_4))
793 if(!prs_uint32("unknown_5", ps, depth, &stf->unknown_5))
795 if(!prs_uint16("unknown_6", ps, depth, &stf->unknown_6))
797 if(!prs_uint16("unknown_7", ps, depth, &stf->unknown_7))
800 if(!prs_uint32("num_sids ", ps, depth, &stf->num_sids ))
802 if(!prs_uint16("padding2 ", ps, depth, &stf->padding2 ))
805 SMB_ASSERT_ARRAY(stf->sid, stf->num_sids);
807 for (i = 0; i < stf->num_sids; i++) {
808 if(!sam_io_dom_sid3("", &(stf->sid[i]), ps, depth))
815 /*******************************************************************
816 Inits or writes a SAMR_R_UNKNOWN3 structure.
817 ********************************************************************/
819 void init_samr_r_unknown_3(SAMR_R_UNKNOWN_3 *r_u,
820 uint16 unknown_2, uint16 unknown_3,
821 uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
822 int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS],
825 DEBUG(5,("samr_init_r_unknown_3\n"));
833 init_sam_sid_stuff(&(r_u->sid_stuff), unknown_2, unknown_3,
834 unknown_4, unknown_6, unknown_7,
838 r_u->status = status;
841 /*******************************************************************
842 Reads or writes a SAMR_R_UNKNOWN_3 structure.
844 this one's odd, because the daft buggers use a different mechanism
845 for writing out the array of sids. they put the number of sids in
846 only one place: they've calculated the length of each sid and jumped
847 by that amount. then, retrospectively, the length of the whole buffer
848 is put at the beginning of the data stream.
852 ********************************************************************/
854 BOOL samr_io_r_unknown_3(char *desc, SAMR_R_UNKNOWN_3 *r_u, prs_struct *ps, int depth)
858 int ptr_sid_stuff = 0;
863 prs_debug(ps, depth, desc, "samr_io_r_unknown_3");
869 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
873 /* reading. do the length later */
874 if(!prs_uint32("sid_stuff_len0", ps, depth, &r_u->sid_stuff_len0))
878 ptr_len0 = prs_offset(ps);
879 if(!prs_set_offset(ps, ptr_len0 + 4))
883 if (r_u->ptr_0 != 0) {
884 if(!prs_uint32("ptr_1 ", ps, depth, &r_u->ptr_1))
887 /* reading. do the length later */
888 if(!prs_uint32("sid_stuff_len1", ps, depth, &r_u->sid_stuff_len1))
892 ptr_len1 = prs_offset(ps);
893 if(!prs_set_offset(ps, ptr_len1 + 4))
897 if (r_u->ptr_1 != 0) {
898 ptr_sid_stuff = prs_offset(ps);
899 if(!sam_io_sid_stuff("", &r_u->sid_stuff, ps, depth))
905 /* storing not reading. do the length, now. */
907 if (ptr_sid_stuff != 0) {
908 int old_len = prs_offset(ps);
909 uint32 sid_stuff_len = old_len - ptr_sid_stuff;
911 if(!prs_set_offset(ps, ptr_len0))
913 if(!prs_uint32("sid_stuff_len0", ps, depth, &sid_stuff_len))
916 if(!prs_set_offset(ps, ptr_len1))
918 if(!prs_uint32("sid_stuff_len1", ps, depth, &sid_stuff_len))
921 if(!prs_set_offset(ps, old_len))
926 if(!prs_uint32("status", ps, depth, &r_u->status))
932 /*******************************************************************
933 Reads or writes a SAM_STR1 structure.
934 ********************************************************************/
936 static BOOL sam_io_sam_str1(char *desc, SAM_STR1 *sam, uint32 acct_buf,
937 uint32 name_buf, uint32 desc_buf, prs_struct *ps, int depth)
942 prs_debug(ps, depth, desc, "sam_io_sam_str1");
948 if(!smb_io_unistr2("unistr2", &sam->uni_acct_name, acct_buf, ps, depth)) /* account name unicode string */
950 if(!smb_io_unistr2("unistr2", &sam->uni_full_name, name_buf, ps, depth)) /* full name unicode string */
952 if(!smb_io_unistr2("unistr2", &sam->uni_acct_desc, desc_buf, ps, depth)) /* account description unicode string */
958 /*******************************************************************
959 Inits a SAM_ENTRY1 structure.
960 ********************************************************************/
962 static void init_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx,
963 uint32 len_sam_name, uint32 len_sam_full, uint32 len_sam_desc,
964 uint32 rid_user, uint16 acb_info)
966 DEBUG(5,("init_sam_entry1\n"));
968 sam->user_idx = user_idx;
969 sam->rid_user = rid_user;
970 sam->acb_info = acb_info;
973 init_uni_hdr(&sam->hdr_acct_name, len_sam_name);
974 init_uni_hdr(&sam->hdr_user_name, len_sam_full);
975 init_uni_hdr(&sam->hdr_user_desc, len_sam_desc);
978 /*******************************************************************
979 Reads or writes a SAM_ENTRY1 structure.
980 ********************************************************************/
982 static BOOL sam_io_sam_entry1(char *desc, SAM_ENTRY1 *sam, prs_struct *ps, int depth)
987 prs_debug(ps, depth, desc, "sam_io_sam_entry1");
993 if(!prs_uint32("user_idx ", ps, depth, &sam->user_idx))
996 if(!prs_uint32("rid_user ", ps, depth, &sam->rid_user))
998 if(!prs_uint16("acb_info ", ps, depth, &sam->acb_info))
1000 if(!prs_uint16("pad ", ps, depth, &sam->pad))
1003 if(!smb_io_unihdr("unihdr", &sam->hdr_acct_name, ps, depth)) /* account name unicode string header */
1005 if(!smb_io_unihdr("unihdr", &sam->hdr_user_name, ps, depth)) /* account name unicode string header */
1007 if(!smb_io_unihdr("unihdr", &sam->hdr_user_desc, ps, depth)) /* account name unicode string header */
1013 /*******************************************************************
1014 Reads or writes a SAM_STR2 structure.
1015 ********************************************************************/
1017 static BOOL sam_io_sam_str2(char *desc, SAM_STR2 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth)
1022 prs_debug(ps, depth, desc, "sam_io_sam_str2");
1028 if(!smb_io_unistr2("unistr2", &sam->uni_srv_name, acct_buf, ps, depth)) /* account name unicode string */
1030 if(!smb_io_unistr2("unistr2", &sam->uni_srv_desc, desc_buf, ps, depth)) /* account description unicode string */
1036 /*******************************************************************
1037 Inits a SAM_ENTRY2 structure.
1038 ********************************************************************/
1040 static void init_sam_entry2(SAM_ENTRY2 *sam, uint32 user_idx,
1041 uint32 len_sam_name, uint32 len_sam_desc,
1042 uint32 rid_user, uint16 acb_info)
1044 DEBUG(5,("init_sam_entry2\n"));
1046 sam->user_idx = user_idx;
1047 sam->rid_user = rid_user;
1048 sam->acb_info = acb_info;
1051 init_uni_hdr(&sam->hdr_srv_name, len_sam_name);
1052 init_uni_hdr(&sam->hdr_srv_desc, len_sam_desc);
1055 /*******************************************************************
1056 Reads or writes a SAM_ENTRY2 structure.
1057 ********************************************************************/
1059 static BOOL sam_io_sam_entry2(char *desc, SAM_ENTRY2 *sam, prs_struct *ps, int depth)
1064 prs_debug(ps, depth, desc, "sam_io_sam_entry2");
1070 if(!prs_uint32("user_idx ", ps, depth, &sam->user_idx))
1073 if(!prs_uint32("rid_user ", ps, depth, &sam->rid_user))
1075 if(!prs_uint16("acb_info ", ps, depth, &sam->acb_info))
1077 if(!prs_uint16("pad ", ps, depth, &sam->pad))
1080 if(!smb_io_unihdr("unihdr", &sam->hdr_srv_name, ps, depth)) /* account name unicode string header */
1082 if(!smb_io_unihdr("unihdr", &sam->hdr_srv_desc, ps, depth)) /* account name unicode string header */
1088 /*******************************************************************
1089 Reads or writes a SAM_STR3 structure.
1090 ********************************************************************/
1092 static BOOL sam_io_sam_str3(char *desc, SAM_STR3 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth)
1097 prs_debug(ps, depth, desc, "sam_io_sam_str3");
1103 if(!smb_io_unistr2("unistr2", &sam->uni_grp_name, acct_buf, ps, depth)) /* account name unicode string */
1105 if(!smb_io_unistr2("unistr2", &sam->uni_grp_desc, desc_buf, ps, depth)) /* account description unicode string */
1111 /*******************************************************************
1112 Inits a SAM_ENTRY3 structure.
1113 ********************************************************************/
1115 static void init_sam_entry3(SAM_ENTRY3 *sam, uint32 grp_idx,
1116 uint32 len_grp_name, uint32 len_grp_desc, uint32 rid_grp)
1118 DEBUG(5,("init_sam_entry3\n"));
1121 sam->grp_idx = grp_idx;
1122 sam->rid_grp = rid_grp;
1123 sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */
1125 init_uni_hdr(&sam->hdr_grp_name, len_grp_name);
1126 init_uni_hdr(&sam->hdr_grp_desc, len_grp_desc);
1129 /*******************************************************************
1130 Reads or writes a SAM_ENTRY3 structure.
1131 ********************************************************************/
1133 static BOOL sam_io_sam_entry3(char *desc, SAM_ENTRY3 *sam, prs_struct *ps, int depth)
1138 prs_debug(ps, depth, desc, "sam_io_sam_entry3");
1144 if(!prs_uint32("grp_idx", ps, depth, &sam->grp_idx))
1147 if(!prs_uint32("rid_grp", ps, depth, &sam->rid_grp))
1149 if(!prs_uint32("attr ", ps, depth, &sam->attr))
1152 if(!smb_io_unihdr("unihdr", &sam->hdr_grp_name, ps, depth)) /* account name unicode string header */
1154 if(!smb_io_unihdr("unihdr", &sam->hdr_grp_desc, ps, depth)) /* account name unicode string header */
1160 /*******************************************************************
1161 Inits a SAM_ENTRY structure.
1162 ********************************************************************/
1164 static void init_sam_entry(SAM_ENTRY *sam, uint32 len_sam_name, uint32 rid)
1166 DEBUG(5,("init_sam_entry\n"));
1169 init_uni_hdr(&sam->hdr_name, len_sam_name);
1172 /*******************************************************************
1173 Reads or writes a SAM_ENTRY structure.
1174 ********************************************************************/
1176 static BOOL sam_io_sam_entry(char *desc, SAM_ENTRY *sam, prs_struct *ps, int depth)
1181 prs_debug(ps, depth, desc, "sam_io_sam_entry");
1186 if(!prs_uint32("rid", ps, depth, &sam->rid))
1188 if(!smb_io_unihdr("unihdr", &sam->hdr_name, ps, depth)) /* account name unicode string header */
1195 /*******************************************************************
1196 Inits a SAMR_Q_ENUM_DOM_USERS structure.
1197 ********************************************************************/
1199 void init_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, POLICY_HND *pol,
1200 uint16 req_num_entries, uint16 unk_0,
1201 uint16 acb_mask, uint16 unk_1, uint32 size)
1203 DEBUG(5,("init_q_enum_dom_users\n"));
1205 memcpy(&q_e->pol, pol, sizeof(*pol));
1207 q_e->req_num_entries = req_num_entries; /* zero indicates lots */
1208 q_e->unknown_0 = unk_0; /* this gets returned in the response */
1209 q_e->acb_mask = acb_mask;
1210 q_e->unknown_1 = unk_1;
1211 q_e->max_size = size;
1214 /*******************************************************************
1215 Reads or writes a structure.
1216 ********************************************************************/
1218 BOOL samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS *q_e, prs_struct *ps, int depth)
1223 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_users");
1229 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
1234 if(!prs_uint16("req_num_entries", ps, depth, &q_e->req_num_entries))
1236 if(!prs_uint16("unknown_0 ", ps, depth, &q_e->unknown_0))
1239 if(!prs_uint16("acb_mask ", ps, depth, &q_e->acb_mask))
1241 if(!prs_uint16("unknown_1 ", ps, depth, &q_e->unknown_1))
1244 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1254 /*******************************************************************
1255 Inits a SAMR_R_ENUM_DOM_USERS structure.
1256 ********************************************************************/
1258 void init_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS *r_u,
1259 uint16 total_num_entries, uint16 unk_0,
1260 uint32 num_sam_entries, SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES], uint32 status)
1264 DEBUG(5,("init_samr_r_enum_dom_users\n"));
1266 if (num_sam_entries >= MAX_SAM_ENTRIES) {
1267 num_sam_entries = MAX_SAM_ENTRIES;
1268 DEBUG(5,("limiting number of entries to %d\n",
1272 r_u->total_num_entries = total_num_entries;
1273 r_u->unknown_0 = unk_0;
1275 if (total_num_entries > 0) {
1276 r_u->ptr_entries1 = 1;
1277 r_u->ptr_entries2 = 1;
1278 r_u->num_entries2 = num_sam_entries;
1279 r_u->num_entries3 = num_sam_entries;
1281 SMB_ASSERT_ARRAY(r_u->sam, num_sam_entries);
1282 SMB_ASSERT_ARRAY(r_u->uni_acct_name, num_sam_entries);
1284 for (i = 0; i < num_sam_entries; i++) {
1285 init_sam_entry(&(r_u->sam[i]),
1286 pass[i].uni_user_name.uni_str_len,
1289 copy_unistr2(&r_u->uni_acct_name[i], &(pass[i].uni_user_name));
1292 r_u->num_entries4 = num_sam_entries;
1294 r_u->ptr_entries1 = 0;
1295 r_u->num_entries2 = num_sam_entries;
1296 r_u->ptr_entries2 = 1;
1299 r_u->status = status;
1302 /*******************************************************************
1303 Reads or writes a structure.
1304 ********************************************************************/
1306 BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struct *ps, int depth)
1313 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_users");
1319 if(!prs_uint16("total_num_entries", ps, depth, &r_u->total_num_entries))
1321 if(!prs_uint16("unknown_0 ", ps, depth, &r_u->unknown_0))
1323 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
1326 if (r_u->total_num_entries != 0 && r_u->ptr_entries1 != 0) {
1327 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
1329 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
1331 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
1334 SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries2);
1336 for (i = 0; i < r_u->num_entries2; i++) {
1337 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
1341 SMB_ASSERT_ARRAY(r_u->uni_acct_name, r_u->num_entries2);
1343 for (i = 0; i < r_u->num_entries2; i++) {
1344 if(!smb_io_unistr2("", &r_u->uni_acct_name[i],
1345 r_u->sam[i].hdr_name.buffer, ps, depth))
1352 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
1356 if(!prs_uint32("status", ps, depth, &r_u->status))
1362 /*******************************************************************
1363 Inits a SAMR_Q_ENUM_DOM_ALIASES structure.
1364 ********************************************************************/
1366 void init_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_e, POLICY_HND *pol, uint32 size)
1368 DEBUG(5,("init_q_enum_dom_aliases\n"));
1370 memcpy(&q_e->pol, pol, sizeof(*pol));
1373 q_e->max_size = size;
1377 /*******************************************************************
1378 Reads or writes a structure.
1379 ********************************************************************/
1381 BOOL samr_io_q_enum_dom_aliases(char *desc, SAMR_Q_ENUM_DOM_ALIASES *q_e, prs_struct *ps, int depth)
1386 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases");
1392 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
1397 if(!prs_uint32("unknown_0", ps, depth, &q_e->unknown_0))
1399 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size ))
1409 /*******************************************************************
1410 Inits a SAMR_R_ENUM_DOM_ALIASES structure.
1411 ********************************************************************/
1413 void init_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u,
1414 uint32 num_sam_entries, SAM_USER_INFO_21 grps[MAX_SAM_ENTRIES],
1419 DEBUG(5,("init_samr_r_enum_dom_aliases\n"));
1421 if (num_sam_entries >= MAX_SAM_ENTRIES) {
1422 num_sam_entries = MAX_SAM_ENTRIES;
1423 DEBUG(5,("limiting number of entries to %d\n",
1427 r_u->num_entries = num_sam_entries;
1429 if (num_sam_entries > 0) {
1430 r_u->ptr_entries = 1;
1431 r_u->num_entries2 = num_sam_entries;
1432 r_u->ptr_entries2 = 1;
1433 r_u->num_entries3 = num_sam_entries;
1435 SMB_ASSERT_ARRAY(r_u->sam, num_sam_entries);
1437 for (i = 0; i < num_sam_entries; i++) {
1438 init_sam_entry(&r_u->sam[i],
1439 grps[i].uni_user_name.uni_str_len,
1442 copy_unistr2(&r_u->uni_grp_name[i], &(grps[i].uni_user_name));
1445 r_u->num_entries4 = num_sam_entries;
1447 r_u->ptr_entries = 0;
1450 r_u->status = status;
1453 /*******************************************************************
1454 Reads or writes a structure.
1455 ********************************************************************/
1457 BOOL samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES *r_u, prs_struct *ps, int depth)
1464 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases");
1470 if(!prs_uint32("num_entries", ps, depth, &r_u->num_entries))
1472 if(!prs_uint32("ptr_entries", ps, depth, &r_u->ptr_entries))
1475 if (r_u->num_entries != 0 && r_u->ptr_entries != 0) {
1476 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
1478 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
1480 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
1483 SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries);
1485 for (i = 0; i < r_u->num_entries; i++) {
1486 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
1490 for (i = 0; i < r_u->num_entries; i++) {
1491 if(!smb_io_unistr2("", &r_u->uni_grp_name[i], r_u->sam[i].hdr_name.buffer, ps, depth))
1498 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
1502 if(!prs_uint32("status", ps, depth, &r_u->status))
1509 /*******************************************************************
1510 Inits a SAMR_Q_QUERY_DISPINFO structure.
1511 ********************************************************************/
1513 void init_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_e, POLICY_HND *pol,
1514 uint16 switch_level, uint32 start_idx, uint32 size)
1516 DEBUG(5,("init_q_query_dispinfo\n"));
1518 memcpy(&q_e->pol, pol, sizeof(*pol));
1520 q_e->switch_level = switch_level;
1522 q_e->start_idx = start_idx;
1523 q_e->max_entries = 0;
1524 q_e->max_size = size;
1527 /*******************************************************************
1528 Reads or writes a structure.
1529 ********************************************************************/
1531 BOOL samr_io_q_query_dispinfo(char *desc, SAMR_Q_QUERY_DISPINFO *q_e, prs_struct *ps, int depth)
1536 prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo");
1542 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
1547 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
1550 if(!prs_uint16("unknown_0 ", ps, depth, &q_e->unknown_0))
1555 if(!prs_uint32("start_idx ", ps, depth, &q_e->start_idx))
1557 if(!prs_uint32("max_entries ", ps, depth, &q_e->max_entries))
1559 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1569 /*******************************************************************
1570 Inits a SAM_INFO_2 structure.
1571 ********************************************************************/
1573 void init_sam_info_2(SAM_INFO_2 *sam, uint32 acb_mask,
1574 uint32 start_idx, uint32 num_sam_entries,
1575 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
1580 DEBUG(5,("init_sam_info_2\n"));
1582 if (num_sam_entries >= MAX_SAM_ENTRIES) {
1583 num_sam_entries = MAX_SAM_ENTRIES;
1584 DEBUG(5,("limiting number of entries to %d\n",
1588 for (i = start_idx, entries_added = 0; i < num_sam_entries; i++) {
1589 if ((pass[i].acb_info & acb_mask) == acb_mask) {
1590 init_sam_entry2(&sam->sam[entries_added],
1591 start_idx + entries_added + 1,
1592 pass[i].uni_user_name.uni_str_len,
1593 pass[i].uni_acct_desc.uni_str_len,
1597 copy_unistr2(&sam->str[entries_added].uni_srv_name, &pass[i].uni_user_name);
1598 copy_unistr2(&sam->str[entries_added].uni_srv_desc, &pass[i].uni_acct_desc);
1603 sam->num_entries = entries_added;
1604 sam->ptr_entries = 1;
1605 sam->num_entries2 = entries_added;
1609 /*******************************************************************
1610 Reads or writes a structure.
1611 ********************************************************************/
1613 static BOOL sam_io_sam_info_2(char *desc, SAM_INFO_2 *sam, prs_struct *ps, int depth)
1620 prs_debug(ps, depth, desc, "sam_io_sam_info_2");
1626 if(!prs_uint32("num_entries ", ps, depth, &sam->num_entries))
1628 if(!prs_uint32("ptr_entries ", ps, depth, &sam->ptr_entries))
1631 if(!prs_uint32("num_entries2 ", ps, depth, &sam->num_entries2))
1634 SMB_ASSERT_ARRAY(sam->sam, sam->num_entries);
1636 for (i = 0; i < sam->num_entries; i++) {
1637 if(!sam_io_sam_entry2("", &sam->sam[i], ps, depth))
1641 for (i = 0; i < sam->num_entries; i++) {
1642 if(!sam_io_sam_str2 ("", &sam->str[i],
1643 sam->sam[i].hdr_srv_name.buffer,
1644 sam->sam[i].hdr_srv_desc.buffer,
1652 /*******************************************************************
1653 Inits a SAM_INFO_1 structure.
1654 ********************************************************************/
1656 void init_sam_info_1(SAM_INFO_1 *sam, uint32 acb_mask,
1657 uint32 start_idx, uint32 num_sam_entries,
1658 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
1663 DEBUG(5,("init_sam_info_1\n"));
1665 if (num_sam_entries >= MAX_SAM_ENTRIES) {
1666 num_sam_entries = MAX_SAM_ENTRIES;
1667 DEBUG(5,("limiting number of entries to %d\n",
1670 DEBUG(5,("num_sam_entries: %u, start_idx: %u\n",num_sam_entries,
1673 for (i = 0, entries_added = 0;
1674 i < num_sam_entries; i++) {
1675 if ((pass[i].acb_info & acb_mask) == acb_mask) {
1676 init_sam_entry1(&sam->sam[entries_added],
1677 start_idx + entries_added + 1,
1678 pass[i].uni_user_name.uni_str_len,
1679 pass[i].uni_full_name.uni_str_len,
1680 pass[i].uni_acct_desc.uni_str_len,
1684 copy_unistr2(&sam->str[entries_added].uni_acct_name, &pass[i].uni_user_name);
1685 copy_unistr2(&sam->str[entries_added].uni_full_name, &pass[i].uni_full_name);
1686 copy_unistr2(&sam->str[entries_added].uni_acct_desc, &pass[i].uni_acct_desc);
1692 sam->num_entries = entries_added;
1693 sam->ptr_entries = 1;
1694 sam->num_entries2 = entries_added;
1697 /*******************************************************************
1698 Reads or writes a structure.
1699 ********************************************************************/
1701 static BOOL sam_io_sam_info_1(char *desc, SAM_INFO_1 *sam, prs_struct *ps, int depth)
1708 prs_debug(ps, depth, desc, "sam_io_sam_info_1");
1714 if(!prs_uint32("num_entries ", ps, depth, &sam->num_entries))
1716 if(!prs_uint32("ptr_entries ", ps, depth, &sam->ptr_entries))
1719 if(!prs_uint32("num_entries2 ", ps, depth, &sam->num_entries2))
1722 SMB_ASSERT_ARRAY(sam->sam, sam->num_entries);
1724 for (i = 0; i < sam->num_entries; i++) {
1725 if(!sam_io_sam_entry1("", &sam->sam[i], ps, depth))
1729 for (i = 0; i < sam->num_entries; i++) {
1730 if(!sam_io_sam_str1 ("", &sam->str[i],
1731 sam->sam[i].hdr_acct_name.buffer,
1732 sam->sam[i].hdr_user_name.buffer,
1733 sam->sam[i].hdr_user_desc.buffer,
1741 /*******************************************************************
1742 Inits a SAMR_R_QUERY_DISPINFO structure.
1743 ********************************************************************/
1745 void init_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO *r_u,
1746 uint16 switch_level, SAM_INFO_CTR *ctr, uint32 status)
1748 DEBUG(5,("init_samr_r_query_dispinfo\n"));
1750 if (status == 0x0 || status == 0x105) {
1751 r_u->unknown_0 = 0x0000001;
1752 r_u->unknown_1 = 0x0000001;
1754 r_u->unknown_0 = 0x0;
1755 r_u->unknown_1 = 0x0;
1758 r_u->switch_level = switch_level;
1760 r_u->status = status;
1763 /*******************************************************************
1764 Reads or writes a structure.
1765 ********************************************************************/
1767 BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struct *ps, int depth)
1772 prs_debug(ps, depth, desc, "samr_io_r_query_dispinfo");
1778 if(!prs_uint32("unknown_0 ", ps, depth, &r_u->unknown_0))
1780 if(!prs_uint32("unknown_1 ", ps, depth, &r_u->unknown_1))
1782 if(!prs_uint16("switch_level ", ps, depth, &r_u->switch_level))
1788 switch (r_u->switch_level) {
1790 if(!sam_io_sam_info_1("users", r_u->ctr->sam.info1, ps, depth))
1794 if(!sam_io_sam_info_2("servers", r_u->ctr->sam.info2, ps, depth))
1798 DEBUG(5,("samr_io_r_query_dispinfo: unknown switch value\n"));
1802 if(!prs_uint32("status", ps, depth, &r_u->status))
1808 /*******************************************************************
1809 Inits a SAMR_Q_ENUM_DOM_GROUPS structure.
1810 ********************************************************************/
1812 void init_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_e, POLICY_HND *pol,
1813 uint16 switch_level, uint32 start_idx, uint32 size)
1815 DEBUG(5,("init_q_enum_dom_groups\n"));
1817 memcpy(&q_e->pol, pol, sizeof(*pol));
1819 q_e->switch_level = switch_level;
1822 q_e->start_idx = start_idx;
1823 q_e->unknown_1 = 0x000007d0;
1824 q_e->max_size = size;
1827 /*******************************************************************
1828 Reads or writes a structure.
1829 ********************************************************************/
1831 BOOL samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS *q_e, prs_struct *ps, int depth)
1836 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups");
1842 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
1847 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
1849 if(!prs_uint16("unknown_0 ", ps, depth, &q_e->unknown_0))
1851 if(!prs_uint32("start_idx ", ps, depth, &q_e->start_idx))
1853 if(!prs_uint32("unknown_1 ", ps, depth, &q_e->unknown_1))
1855 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1865 /*******************************************************************
1866 Inits a SAMR_R_ENUM_DOM_GROUPS structure.
1867 ********************************************************************/
1869 void init_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS *r_u,
1870 uint32 start_idx, uint32 num_sam_entries,
1871 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES],
1877 DEBUG(5,("init_samr_r_enum_dom_groups\n"));
1879 if (num_sam_entries >= MAX_SAM_ENTRIES) {
1880 num_sam_entries = MAX_SAM_ENTRIES;
1881 DEBUG(5,("limiting number of entries to %d\n",
1885 if (status == 0x0) {
1886 for (i = start_idx, entries_added = 0; i < num_sam_entries; i++) {
1887 init_sam_entry3(&r_u->sam[entries_added],
1888 start_idx + entries_added + 1,
1889 pass[i].uni_user_name.uni_str_len,
1890 pass[i].uni_acct_desc.uni_str_len,
1893 copy_unistr2(&r_u->str[entries_added].uni_grp_name,
1894 &pass[i].uni_user_name);
1895 copy_unistr2(&r_u->str[entries_added].uni_grp_desc,
1896 &pass[i].uni_acct_desc);
1901 if (entries_added > 0) {
1902 r_u->unknown_0 = 0x0000492;
1903 r_u->unknown_1 = 0x000049a;
1905 r_u->unknown_0 = 0x0;
1906 r_u->unknown_1 = 0x0;
1908 r_u->switch_level = 3;
1909 r_u->num_entries = entries_added;
1910 r_u->ptr_entries = 1;
1911 r_u->num_entries2 = entries_added;
1913 r_u->switch_level = 0;
1916 r_u->status = status;
1919 /*******************************************************************
1920 Reads or writes a structure.
1921 ********************************************************************/
1923 BOOL samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS *r_u, prs_struct *ps, int depth)
1930 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups");
1936 if(!prs_uint32("unknown_0 ", ps, depth, &r_u->unknown_0))
1938 if(!prs_uint32("unknown_1 ", ps, depth, &r_u->unknown_1))
1940 if(!prs_uint32("switch_level ", ps, depth, &r_u->switch_level))
1943 if (r_u->switch_level != 0) {
1944 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
1946 if(!prs_uint32("ptr_entries ", ps, depth, &r_u->ptr_entries))
1949 if(!prs_uint32("num_entries2 ", ps, depth, &r_u->num_entries2))
1952 SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries);
1954 for (i = 0; i < r_u->num_entries; i++) {
1955 if(!sam_io_sam_entry3("", &r_u->sam[i], ps, depth))
1959 for (i = 0; i < r_u->num_entries; i++) {
1960 if(!sam_io_sam_str3 ("", &r_u->str[i],
1961 r_u->sam[i].hdr_grp_name.buffer,
1962 r_u->sam[i].hdr_grp_desc.buffer,
1968 if(!prs_uint32("status", ps, depth, &r_u->status))
1974 /*******************************************************************
1975 Inits a SAMR_Q_QUERY_ALIASINFO structure.
1976 ********************************************************************/
1978 void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_e,
1980 uint16 switch_level)
1982 DEBUG(5,("init_q_query_aliasinfo\n"));
1984 memcpy(&q_e->pol, pol, sizeof(*pol));
1986 q_e->switch_level = switch_level;
1989 /*******************************************************************
1990 Reads or writes a structure.
1991 ********************************************************************/
1993 BOOL samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO *q_e, prs_struct *ps, int depth)
1998 prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo");
2004 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2009 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
2015 /*******************************************************************
2016 Inits a SAMR_R_QUERY_ALIASINFO structure.
2017 ********************************************************************/
2019 void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *r_u, uint32 switch_level,
2020 char* alias, char* alias_desc)
2023 int alias_desc_len, alias_len;
2028 alias_len = alias?strlen(alias):0;
2029 alias_desc_len = alias_desc?strlen(alias_desc):0;
2031 DEBUG(5,("init_samr_r_query_aliasinfo\n"));
2033 r_u->switch_value = switch_level;
2035 if(r_u->status == 0)
2037 switch(switch_level)
2042 init_uni_hdr(&r_u->alias.info1.hdr_alias_name, alias_len);
2043 init_unistr2(&r_u->alias.info1.uni_alias_name, alias, alias_len);
2044 r_u->alias.info1.switch_value_1 = switch_level;
2045 init_uni_hdr(&r_u->alias.info1.hdr_alias_desc, alias_desc_len);
2046 init_unistr2(&r_u->alias.info1.uni_alias_desc, alias_desc, alias_desc_len);
2052 init_uni_hdr(&r_u->alias.info3.hdr_acct_desc, alias_desc_len);
2053 init_unistr2(&r_u->alias.info3.uni_acct_desc, alias_desc, alias_desc_len);
2058 r_u->status = 0xC0000000 | NT_STATUS_INVALID_INFO_CLASS;
2066 /*******************************************************************
2067 Reads or writes a structure.
2068 ********************************************************************/
2070 BOOL samr_io_r_query_aliasinfo(char *desc, SAMR_R_QUERY_ALIASINFO *r_u, prs_struct *ps, int depth)
2075 prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo");
2081 if(!prs_uint32("ptr ", ps, depth, &r_u->ptr))
2084 if (r_u->ptr != 0) {
2085 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
2090 if (r_u->switch_value != 0) {
2091 switch (r_u->switch_value) {
2093 smb_io_unihdr("",&r_u->alias.info1.hdr_alias_name, ps, depth);
2094 prs_uint32("switch_value_1", ps, depth, &r_u->alias.info1.switch_value_1);
2095 smb_io_unihdr("",&r_u->alias.info1.hdr_alias_desc, ps, depth);
2097 smb_io_unistr2("", &r_u->alias.info1.uni_alias_name,
2098 r_u->alias.info1.hdr_alias_name.buffer, ps, depth);
2099 smb_io_unistr2("", &r_u->alias.info1.uni_alias_desc,
2100 r_u->alias.info1.hdr_alias_desc.buffer, ps, depth);
2103 if(!smb_io_unihdr ("", &r_u->alias.info3.hdr_acct_desc, ps, depth))
2105 if(!smb_io_unistr2("", &r_u->alias.info3.uni_acct_desc,
2106 r_u->alias.info3.hdr_acct_desc.buffer, ps, depth))
2110 DEBUG(4,("samr_io_r_query_aliasinfo: unsupported switch level\n"));
2119 if(!prs_uint32("status", ps, depth, &r_u->status))
2125 /*******************************************************************
2126 Reads or writes a SAMR_Q_LOOKUP_IDS structure.
2127 ********************************************************************/
2129 BOOL samr_io_q_lookup_ids(char *desc, SAMR_Q_LOOKUP_IDS *q_u, prs_struct *ps, int depth)
2137 prs_debug(ps, depth, desc, "samr_io_q_lookup_ids");
2143 if(!smb_io_pol_hnd("pol", &(q_u->pol), ps, depth))
2148 if(!prs_uint32("num_sids1", ps, depth, &q_u->num_sids1))
2150 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
2152 if(!prs_uint32("num_sids2", ps, depth, &q_u->num_sids2))
2155 SMB_ASSERT_ARRAY(q_u->ptr_sid, q_u->num_sids2);
2157 for (i = 0; i < q_u->num_sids2; i++) {
2158 slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i);
2159 if(!prs_uint32(tmp, ps, depth, &q_u->ptr_sid[i]))
2163 for (i = 0; i < q_u->num_sids2; i++) {
2164 if (q_u->ptr_sid[i] != 0) {
2165 slprintf(tmp, sizeof(tmp)-1, "sid[%02d]", i);
2166 if(!smb_io_dom_sid2(tmp, &q_u->sid[i], ps, depth))
2177 /*******************************************************************
2178 Inits a SAMR_R_LOOKUP_IDS structure.
2179 ********************************************************************/
2181 void init_samr_r_lookup_ids(SAMR_R_LOOKUP_IDS *r_u,
2182 uint32 num_rids, uint32 *rid, uint32 status)
2186 DEBUG(5,("init_samr_r_lookup_ids\n"));
2188 if (status == 0x0) {
2189 r_u->num_entries = num_rids;
2191 r_u->num_entries2 = num_rids;
2193 SMB_ASSERT_ARRAY(r_u->rid, num_rids);
2195 for (i = 0; i < num_rids; i++) {
2196 r_u->rid[i] = rid[i];
2199 r_u->num_entries = 0;
2201 r_u->num_entries2 = 0;
2204 r_u->status = status;
2207 /*******************************************************************
2208 Reads or writes a structure.
2209 ********************************************************************/
2211 BOOL samr_io_r_lookup_ids(char *desc, SAMR_R_LOOKUP_IDS *r_u, prs_struct *ps, int depth)
2219 prs_debug(ps, depth, desc, "samr_io_r_lookup_ids");
2225 if(!prs_uint32("num_entries", ps, depth, &r_u->num_entries))
2227 if(!prs_uint32("ptr ", ps, depth, &r_u->ptr))
2229 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
2232 if (r_u->num_entries != 0) {
2233 SMB_ASSERT_ARRAY(r_u->rid, r_u->num_entries2);
2235 for (i = 0; i < r_u->num_entries2; i++) {
2236 slprintf(tmp, sizeof(tmp)-1, "rid[%02d]", i);
2237 if(!prs_uint32(tmp, ps, depth, &r_u->rid[i]))
2242 if(!prs_uint32("status", ps, depth, &r_u->status))
2248 /*******************************************************************
2249 Reads or writes a structure.
2250 ********************************************************************/
2252 BOOL samr_io_q_lookup_names(char *desc, SAMR_Q_LOOKUP_NAMES *q_u, prs_struct *ps, int depth)
2259 prs_debug(ps, depth, desc, "samr_io_q_lookup_names");
2264 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
2269 if(!prs_uint32("num_names1", ps, depth, &q_u->num_names1))
2271 if(!prs_uint32("flags ", ps, depth, &q_u->flags))
2273 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
2275 if(!prs_uint32("num_names2", ps, depth, &q_u->num_names2))
2278 SMB_ASSERT_ARRAY(q_u->hdr_name, q_u->num_names2);
2280 for (i = 0; i < q_u->num_names2; i++) {
2281 if(!smb_io_unihdr ("", &q_u->hdr_name[i], ps, depth))
2284 for (i = 0; i < q_u->num_names2; i++) {
2285 if(!smb_io_unistr2("", &q_u->uni_name[i], q_u->hdr_name[i].buffer, ps, depth))
2293 /*******************************************************************
2294 Inits a SAMR_R_LOOKUP_NAMES structure.
2295 ********************************************************************/
2297 void init_samr_r_lookup_names(SAMR_R_LOOKUP_NAMES *r_u,
2298 uint32 num_rids, uint32 *rid, enum SID_NAME_USE *type, uint32 status)
2302 DEBUG(5,("init_samr_r_lookup_names\n"));
2304 if (status == 0x0) {
2305 r_u->num_types1 = num_rids;
2307 r_u->num_types2 = num_rids;
2309 r_u->num_rids1 = num_rids;
2311 r_u->num_rids2 = num_rids;
2313 SMB_ASSERT_ARRAY(r_u->rid, num_rids);
2315 for (i = 0; i < num_rids; i++) {
2316 r_u->rid [i] = rid [i];
2317 r_u->type[i] = type[i];
2320 r_u->num_types1 = 0;
2322 r_u->num_types2 = 0;
2329 r_u->status = status;
2332 /*******************************************************************
2333 Reads or writes a structure.
2334 ********************************************************************/
2336 BOOL samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES *r_u, prs_struct *ps, int depth)
2344 prs_debug(ps, depth, desc, "samr_io_r_lookup_names");
2350 if(!prs_uint32("num_rids1", ps, depth, &r_u->num_rids1))
2352 if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids ))
2355 if (r_u->ptr_rids != 0) {
2356 if(!prs_uint32("num_rids2", ps, depth, &r_u->num_rids2))
2359 if (r_u->num_rids2 != r_u->num_rids1) {
2364 for (i = 0; i < r_u->num_rids2; i++) {
2365 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
2366 if(!prs_uint32(tmp, ps, depth, &r_u->rid[i]))
2371 if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1))
2373 if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types))
2376 if (r_u->ptr_types != 0) {
2377 if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2))
2380 if (r_u->num_types2 != r_u->num_types1) {
2385 for (i = 0; i < r_u->num_types2; i++) {
2386 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
2387 if(!prs_uint32(tmp, ps, depth, &r_u->type[i]))
2392 if(!prs_uint32("status", ps, depth, &r_u->status))
2398 /*******************************************************************
2399 Reads or writes a structure.
2400 ********************************************************************/
2402 BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS *q_u, prs_struct *ps, int depth)
2410 prs_debug(ps, depth, desc, "samr_io_q_lookup_rids");
2416 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
2421 if(!prs_uint32("num_gids1", ps, depth, &q_u->num_gids1))
2423 if(!prs_uint32("rid ", ps, depth, &q_u->rid))
2425 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
2427 if(!prs_uint32("num_gids2", ps, depth, &q_u->num_gids2))
2430 SMB_ASSERT_ARRAY(q_u->gid, q_u->num_gids2);
2432 for (i = 0; i < q_u->num_gids2; i++) {
2433 slprintf(tmp, sizeof(tmp) - 1, "gid[%02d] ", i);
2434 if(!prs_uint32(tmp, ps, depth, &q_u->gid[i]))
2441 /*******************************************************************
2442 Inits a SAMR_R_UNKNOWN_12 structure.
2443 ********************************************************************/
2445 void init_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u,
2446 uint32 num_aliases, fstring *als_name, uint32 *num_als_usrs,
2451 DEBUG(5,("init_samr_r_lookup_rids\n"));
2453 if (status == 0x0) {
2454 r_u->num_aliases1 = num_aliases;
2455 r_u->ptr_aliases = 1;
2456 r_u->num_aliases2 = num_aliases;
2458 r_u->num_als_usrs1 = num_aliases;
2459 r_u->ptr_als_usrs = 1;
2460 r_u->num_als_usrs2 = num_aliases;
2462 SMB_ASSERT_ARRAY(r_u->hdr_als_name, num_aliases);
2464 for (i = 0; i < num_aliases; i++) {
2465 int als_len = als_name[i] != NULL ? strlen(als_name[i]) : 0;
2466 init_uni_hdr(&r_u->hdr_als_name[i], als_len);
2467 init_unistr2(&r_u->uni_als_name[i], als_name[i], als_len);
2468 r_u->num_als_usrs[i] = num_als_usrs[i];
2471 r_u->num_aliases1 = num_aliases;
2472 r_u->ptr_aliases = 0;
2473 r_u->num_aliases2 = num_aliases;
2475 r_u->num_als_usrs1 = num_aliases;
2476 r_u->ptr_als_usrs = 0;
2477 r_u->num_als_usrs2 = num_aliases;
2480 r_u->status = status;
2483 /*******************************************************************
2484 Reads or writes a structure.
2485 ********************************************************************/
2487 BOOL samr_io_r_lookup_rids(char *desc, SAMR_R_LOOKUP_RIDS *r_u, prs_struct *ps, int depth)
2495 prs_debug(ps, depth, desc, "samr_io_r_lookup_rids");
2501 if(!prs_uint32("num_aliases1", ps, depth, &r_u->num_aliases1))
2503 if(!prs_uint32("ptr_aliases ", ps, depth, &r_u->ptr_aliases ))
2505 if(!prs_uint32("num_aliases2", ps, depth, &r_u->num_aliases2))
2508 if (r_u->ptr_aliases != 0 && r_u->num_aliases1 != 0) {
2509 SMB_ASSERT_ARRAY(r_u->hdr_als_name, r_u->num_aliases2);
2511 for (i = 0; i < r_u->num_aliases2; i++) {
2512 slprintf(tmp, sizeof(tmp) - 1, "als_hdr[%02d] ", i);
2513 if(!smb_io_unihdr ("", &r_u->hdr_als_name[i], ps, depth))
2516 for (i = 0; i < r_u->num_aliases2; i++) {
2517 slprintf(tmp, sizeof(tmp) - 1, "als_str[%02d] ", i);
2518 if(!smb_io_unistr2("", &r_u->uni_als_name[i], r_u->hdr_als_name[i].buffer, ps, depth))
2528 if(!prs_uint32("num_als_usrs1", ps, depth, &r_u->num_als_usrs1))
2530 if(!prs_uint32("ptr_als_usrs ", ps, depth, &r_u->ptr_als_usrs))
2532 if(!prs_uint32("num_als_usrs2", ps, depth, &r_u->num_als_usrs2))
2535 if (r_u->ptr_als_usrs != 0 && r_u->num_als_usrs1 != 0) {
2536 SMB_ASSERT_ARRAY(r_u->num_als_usrs, r_u->num_als_usrs2);
2538 for (i = 0; i < r_u->num_als_usrs2; i++) {
2539 slprintf(tmp, sizeof(tmp) - 1, "als_usrs[%02d] ", i);
2540 if(!prs_uint32(tmp, ps, depth, &r_u->num_als_usrs[i]))
2545 if(!prs_uint32("status", ps, depth, &r_u->status))
2552 /*******************************************************************
2553 Inits a SAMR_Q_OPEN_USER struct.
2554 ********************************************************************/
2556 void init_samr_q_open_user(SAMR_Q_OPEN_USER *q_u,
2558 uint32 unk_0, uint32 rid)
2560 DEBUG(5,("samr_init_q_open_user\n"));
2562 memcpy(&q_u->domain_pol, pol, sizeof(q_u->domain_pol));
2564 q_u->unknown_0 = unk_0;
2565 q_u->user_rid = rid;
2568 /*******************************************************************
2569 Reads or writes a structure.
2570 ********************************************************************/
2572 BOOL samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER *q_u, prs_struct *ps, int depth)
2577 prs_debug(ps, depth, desc, "samr_io_q_open_user");
2583 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
2588 if(!prs_uint32("unknown_0", ps, depth, &q_u->unknown_0))
2590 if(!prs_uint32("user_rid ", ps, depth, &q_u->user_rid))
2599 /*******************************************************************
2600 Reads or writes a structure.
2601 ********************************************************************/
2603 BOOL samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER *r_u, prs_struct *ps, int depth)
2608 prs_debug(ps, depth, desc, "samr_io_r_open_user");
2614 if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth))
2619 if(!prs_uint32("status", ps, depth, &r_u->status))
2625 /*******************************************************************
2626 Inits a SAMR_Q_QUERY_USERGROUPS structure.
2627 ********************************************************************/
2629 void init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u,
2632 DEBUG(5,("init_samr_q_query_usergroups\n"));
2634 memcpy(&q_u->pol, hnd, sizeof(q_u->pol));
2637 /*******************************************************************
2638 Reads or writes a structure.
2639 ********************************************************************/
2641 BOOL samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS *q_u, prs_struct *ps, int depth)
2646 prs_debug(ps, depth, desc, "samr_io_q_query_usergroups");
2652 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
2660 /*******************************************************************
2661 Inits a SAMR_R_QUERY_USERGROUPS structure.
2662 ********************************************************************/
2664 void init_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS *r_u,
2665 uint32 num_gids, DOM_GID *gid, uint32 status)
2667 DEBUG(5,("init_samr_r_query_usergroups\n"));
2669 if (status == 0x0) {
2671 r_u->num_entries = num_gids;
2673 r_u->num_entries2 = num_gids;
2678 r_u->num_entries = 0;
2682 r_u->status = status;
2685 /*******************************************************************
2686 Reads or writes a structure.
2687 ********************************************************************/
2689 BOOL samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS *r_u, prs_struct *ps, int depth)
2696 prs_debug(ps, depth, desc, "samr_io_r_query_usergroups");
2702 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
2705 if (r_u->ptr_0 != 0) {
2706 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
2708 if(!prs_uint32("ptr_1 ", ps, depth, &r_u->ptr_1))
2711 if (r_u->num_entries != 0) {
2712 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
2715 for (i = 0; i < r_u->num_entries2; i++) {
2716 if(!smb_io_gid("", &r_u->gid[i], ps, depth))
2722 if(!prs_uint32("status", ps, depth, &r_u->status))
2728 /*******************************************************************
2729 Inits a SAMR_Q_QUERY_USERINFO structure.
2730 ********************************************************************/
2732 void init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u,
2733 POLICY_HND *hnd, uint16 switch_value)
2735 DEBUG(5,("init_samr_q_query_userinfo\n"));
2737 memcpy(&q_u->pol, hnd, sizeof(q_u->pol));
2738 q_u->switch_value = switch_value;
2741 /*******************************************************************
2742 Reads or writes a structure.
2743 ********************************************************************/
2745 BOOL samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO *q_u, prs_struct *ps, int depth)
2750 prs_debug(ps, depth, desc, "samr_io_q_query_userinfo");
2756 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
2761 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) /* 0x0015 or 0x0011 */
2767 /*******************************************************************
2768 Reads or writes a LOGON_HRS structure.
2769 ********************************************************************/
2771 static BOOL sam_io_logon_hrs(char *desc, LOGON_HRS *hrs, prs_struct *ps, int depth)
2776 prs_debug(ps, depth, desc, "sam_io_logon_hrs");
2782 if(!prs_uint32 ("len ", ps, depth, &hrs->len))
2785 if (hrs->len > 64) {
2786 DEBUG(5,("sam_io_logon_hrs: truncating length\n"));
2790 if(!prs_uint8s (False, "hours", ps, depth, hrs->hours, hrs->len))
2796 /*******************************************************************
2797 Inits a SAM_USER_INFO_10 structure.
2798 ********************************************************************/
2800 void init_sam_user_info10(SAM_USER_INFO_10 *usr,
2803 DEBUG(5,("init_sam_user_info10\n"));
2805 usr->acb_info = acb_info;
2808 /*******************************************************************
2809 Reads or writes a structure.
2810 ********************************************************************/
2812 BOOL sam_io_user_info10(char *desc, SAM_USER_INFO_10 *usr, prs_struct *ps, int depth)
2817 prs_debug(ps, depth, desc, "samr_io_r_user_info10");
2823 if(!prs_uint32("acb_info", ps, depth, &usr->acb_info))
2829 /*******************************************************************
2830 Inits a SAM_USER_INFO_11 structure.
2831 ********************************************************************/
2833 void init_sam_user_info11(SAM_USER_INFO_11 *usr,
2843 DEBUG(5,("init_sam_user_info11\n"));
2845 len_mach_acct = strlen(mach_acct);
2847 memcpy(&usr->expiry,expiry, sizeof(usr->expiry)); /* expiry time or something? */
2848 memset((char *)usr->padding_1, '\0', sizeof(usr->padding_1)); /* 0 - padding 24 bytes */
2850 init_uni_hdr(&usr->hdr_mach_acct, len_mach_acct); /* unicode header for machine account */
2851 usr->padding_2 = 0; /* 0 - padding 4 bytes */
2853 usr->ptr_1 = 1; /* pointer */
2854 memset((char *)usr->padding_3, '\0', sizeof(usr->padding_3)); /* 0 - padding 32 bytes */
2855 usr->padding_4 = 0; /* 0 - padding 4 bytes */
2857 usr->ptr_2 = 1; /* pointer */
2858 usr->padding_5 = 0; /* 0 - padding 4 bytes */
2860 usr->ptr_3 = 1; /* pointer */
2861 memset((char *)usr->padding_6, '\0', sizeof(usr->padding_6)); /* 0 - padding 32 bytes */
2863 usr->rid_user = rid_user;
2864 usr->rid_group = rid_group;
2866 usr->acct_ctrl = acct_ctrl;
2867 usr->unknown_3 = 0x0000;
2869 usr->unknown_4 = 0x003f; /* 0x003f - 16 bit unknown */
2870 usr->unknown_5 = 0x003c; /* 0x003c - 16 bit unknown */
2872 memset((char *)usr->padding_7, '\0', sizeof(usr->padding_7)); /* 0 - padding 16 bytes */
2873 usr->padding_8 = 0; /* 0 - padding 4 bytes */
2875 init_unistr2(&usr->uni_mach_acct, mach_acct, len_mach_acct); /* unicode string for machine account */
2877 memset((char *)usr->padding_9, '\0', sizeof(usr->padding_9)); /* 0 - padding 48 bytes */
2880 /*******************************************************************
2881 Reads or writes a structure.
2882 ********************************************************************/
2884 BOOL sam_io_user_info11(char *desc, SAM_USER_INFO_11 *usr, prs_struct *ps, int depth)
2889 prs_debug(ps, depth, desc, "samr_io_r_unknown_24");
2895 if(!prs_uint8s (False, "padding_0", ps, depth, usr->padding_0, sizeof(usr->padding_0)))
2898 if(!smb_io_time("time", &(usr->expiry), ps, depth))
2901 if(!prs_uint8s (False, "padding_1", ps, depth, usr->padding_1, sizeof(usr->padding_1)))
2904 if(!smb_io_unihdr ("unihdr", &usr->hdr_mach_acct, ps, depth))
2906 if(!prs_uint32( "padding_2", ps, depth, &usr->padding_2))
2909 if(!prs_uint32( "ptr_1 ", ps, depth, &usr->ptr_1))
2911 if(!prs_uint8s (False, "padding_3", ps, depth, usr->padding_3, sizeof(usr->padding_3)))
2913 if(!prs_uint32( "padding_4", ps, depth, &usr->padding_4))
2916 if(!prs_uint32( "ptr_2 ", ps, depth, &usr->ptr_2))
2918 if(!prs_uint32( "padding_5", ps, depth, &usr->padding_5))
2921 if(!prs_uint32( "ptr_3 ", ps, depth, &usr->ptr_3))
2923 if(!prs_uint8s(False, "padding_6", ps, depth, usr->padding_6, sizeof(usr->padding_6)))
2926 if(!prs_uint32( "rid_user ", ps, depth, &usr->rid_user))
2928 if(!prs_uint32( "rid_group", ps, depth, &usr->rid_group))
2930 if(!prs_uint16( "acct_ctrl", ps, depth, &usr->acct_ctrl))
2932 if(!prs_uint16( "unknown_3", ps, depth, &usr->unknown_3))
2934 if(!prs_uint16( "unknown_4", ps, depth, &usr->unknown_4))
2936 if(!prs_uint16( "unknown_5", ps, depth, &usr->unknown_5))
2939 if(!prs_uint8s (False, "padding_7", ps, depth, usr->padding_7, sizeof(usr->padding_7)))
2941 if(!prs_uint32( "padding_8", ps, depth, &usr->padding_8))
2944 if(!smb_io_unistr2("unistr2", &usr->uni_mach_acct, True, ps, depth))
2949 if(!prs_uint8s(False, "padding_9", ps, depth, usr->padding_9, sizeof(usr->padding_9)))
2955 /*************************************************************************
2956 init_sam_user_info21
2958 unknown_3 = 0x00ff ffff
2959 unknown_5 = 0x0002 0000
2960 unknown_6 = 0x0000 04ec
2962 *************************************************************************/
2964 void init_sam_user_info21(SAM_USER_INFO_21 *usr,
2966 NTTIME *logoff_time,
2967 NTTIME *kickoff_time,
2968 NTTIME *pass_last_set_time,
2969 NTTIME *pass_can_change_time,
2970 NTTIME *pass_must_change_time,
2993 int len_user_name = user_name != NULL ? strlen(user_name ) : 0;
2994 int len_full_name = full_name != NULL ? strlen(full_name ) : 0;
2995 int len_home_dir = home_dir != NULL ? strlen(home_dir ) : 0;
2996 int len_dir_drive = dir_drive != NULL ? strlen(dir_drive ) : 0;
2997 int len_logon_script = logon_script != NULL ? strlen(logon_script) : 0;
2998 int len_profile_path = profile_path != NULL ? strlen(profile_path) : 0;
2999 int len_description = description != NULL ? strlen(description ) : 0;
3000 int len_workstations = workstations != NULL ? strlen(workstations) : 0;
3001 int len_unknown_str = unknown_str != NULL ? strlen(unknown_str ) : 0;
3002 int len_munged_dial = munged_dial != NULL ? strlen(munged_dial ) : 0;
3004 usr->logon_time = *logon_time;
3005 usr->logoff_time = *logoff_time;
3006 usr->kickoff_time = *kickoff_time;
3007 usr->pass_last_set_time = *pass_last_set_time;
3008 usr->pass_can_change_time = *pass_can_change_time;
3009 usr->pass_must_change_time = *pass_must_change_time;
3011 init_uni_hdr(&usr->hdr_user_name, len_user_name);
3012 init_uni_hdr(&usr->hdr_full_name, len_full_name);
3013 init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
3014 init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
3015 init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
3016 init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
3017 init_uni_hdr(&usr->hdr_acct_desc, len_description);
3018 init_uni_hdr(&usr->hdr_workstations, len_workstations);
3019 init_uni_hdr(&usr->hdr_unknown_str, len_unknown_str);
3020 init_uni_hdr(&usr->hdr_munged_dial, len_munged_dial);
3022 memset((char *)usr->nt_pwd, '\0', sizeof(usr->nt_pwd));
3023 memset((char *)usr->lm_pwd, '\0', sizeof(usr->lm_pwd));
3025 usr->user_rid = user_rid;
3026 usr->group_rid = group_rid;
3027 usr->acb_info = acb_info;
3028 usr->unknown_3 = unknown_3; /* 0x00ff ffff */
3030 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
3031 usr->ptr_logon_hrs = hrs ? 1 : 0;
3032 usr->unknown_5 = unknown_5; /* 0x0002 0000 */
3034 memset((char *)usr->padding1, '\0', sizeof(usr->padding1));
3036 init_unistr2(&usr->uni_user_name, user_name, len_user_name);
3037 init_unistr2(&usr->uni_full_name, full_name, len_full_name);
3038 init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir);
3039 init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive);
3040 init_unistr2(&usr->uni_logon_script, logon_script, len_logon_script);
3041 init_unistr2(&usr->uni_profile_path, profile_path, len_profile_path);
3042 init_unistr2(&usr->uni_acct_desc, description, len_description);
3043 init_unistr2(&usr->uni_workstations, workstations, len_workstations);
3044 init_unistr2(&usr->uni_unknown_str, unknown_str, len_unknown_str);
3045 init_unistr2(&usr->uni_munged_dial, munged_dial, len_munged_dial);
3047 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
3051 memcpy(&(usr->logon_hrs), hrs, sizeof(usr->logon_hrs));
3053 memset(&(usr->logon_hrs), 0xff, sizeof(usr->logon_hrs));
3057 /*******************************************************************
3058 Reads or writes a structure.
3059 ********************************************************************/
3061 static BOOL sam_io_user_info21(char *desc, SAM_USER_INFO_21 *usr, prs_struct *ps, int depth)
3066 prs_debug(ps, depth, desc, "sam_io_user_info21");
3072 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
3074 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
3076 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
3078 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth))
3080 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth))
3082 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
3085 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
3087 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
3089 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
3091 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
3093 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
3095 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
3097 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account description */
3099 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* workstations user can log on from */
3101 if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */
3103 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* workstations user can log on from */
3106 if(!prs_uint8s (False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
3108 if(!prs_uint8s (False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
3111 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
3113 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
3115 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info)) /* Group ID */
3118 if(!prs_uint32("unknown_3 ", ps, depth, &usr->unknown_3))
3120 if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */
3124 if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs))
3126 if(!prs_uint32("unknown_5 ", ps, depth, &usr->unknown_5))
3129 if(!prs_uint8s (False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1)))
3132 /* here begins pointed-to data */
3134 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
3138 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
3142 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
3146 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
3150 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
3154 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
3158 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user description unicode string */
3162 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
3166 if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str .buffer, ps, depth)) /* unknown string */
3170 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial .buffer, ps, depth)) /* worksations user can log on from */
3175 if(!prs_uint32("unknown_6 ", ps, depth, &usr->unknown_6))
3177 if(!prs_uint32("padding4 ", ps, depth, &usr->padding4))
3180 if (usr->ptr_logon_hrs)
3181 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
3187 /*******************************************************************
3188 Inits a SAMR_R_QUERY_USERINFO structure.
3189 ********************************************************************/
3191 void init_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO *r_u,
3192 uint16 switch_value, void *info, uint32 status)
3194 DEBUG(5,("init_samr_r_query_userinfo\n"));
3197 r_u->switch_value = 0;
3200 r_u->switch_value = switch_value;
3202 switch (switch_value) {
3205 r_u->info.id10 = (SAM_USER_INFO_10*)info;
3210 r_u->info.id11 = (SAM_USER_INFO_11*)info;
3215 r_u->info.id21 = (SAM_USER_INFO_21*)info;
3219 DEBUG(4,("init_samr_r_query_aliasinfo: unsupported switch level\n"));
3224 r_u->status = status; /* return status */
3227 /*******************************************************************
3228 Reads or writes a structure.
3229 ********************************************************************/
3231 BOOL samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO *r_u, prs_struct *ps, int depth)
3236 prs_debug(ps, depth, desc, "samr_io_r_query_userinfo");
3242 if(!prs_uint32("ptr ", ps, depth, &r_u->ptr))
3244 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
3249 if (r_u->ptr != 0 && r_u->switch_value != 0) {
3250 switch (r_u->switch_value) {
3252 if (r_u->info.id10 != NULL) {
3253 if(!sam_io_user_info10("", r_u->info.id10, ps, depth))
3256 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
3262 if (r_u->info.id11 != NULL) {
3263 if(!sam_io_user_info11("", r_u->info.id11, ps, depth))
3266 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
3272 if (r_u->info.id21 != NULL) {
3273 if(!sam_io_user_info21("", r_u->info.id21, ps, depth))
3276 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
3281 DEBUG(2,("samr_io_r_query_userinfo: unknown switch level\n"));
3289 if(!prs_uint32("status", ps, depth, &r_u->status))
3295 /*******************************************************************
3296 Reads or writes a structure.
3297 ********************************************************************/
3299 BOOL samr_io_q_create_user(char *desc, SAMR_Q_CREATE_USER *q_u, prs_struct *ps, int depth)
3304 prs_debug(ps, depth, desc, "samr_io_q_create_user");
3310 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
3315 if(!smb_io_unihdr ("", &q_u->hdr_mach_acct, ps, depth))
3317 if(!smb_io_unistr2("", &q_u->uni_mach_acct, q_u->hdr_mach_acct.buffer, ps, depth))
3323 if(!prs_uint32("acb_info", ps, depth, &q_u->acb_info))
3325 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
3331 /*******************************************************************
3332 Reads or writes a structure.
3333 ********************************************************************/
3335 BOOL samr_io_r_create_user(char *desc, SAMR_R_CREATE_USER *r_u, prs_struct *ps, int depth)
3340 prs_debug(ps, depth, desc, "samr_io_r_unknown_32");
3346 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
3349 if(!prs_uint32("unknown_0", ps, depth, &r_u->unknown_0))
3351 if(!prs_uint32("user_rid", ps, depth, &r_u->user_rid))
3354 if(!prs_uint32("status", ps, depth, &r_u->status))
3360 /*******************************************************************
3361 Inits a SAMR_Q_CONNECT structure.
3362 ********************************************************************/
3364 void init_samr_q_connect(SAMR_Q_CONNECT *q_u,
3365 char *srv_name, uint32 unknown_0)
3367 int len_srv_name = strlen(srv_name);
3369 DEBUG(5,("init_q_connect\n"));
3371 /* make PDC server name \\server */
3372 q_u->ptr_srv_name = len_srv_name > 0 ? 1 : 0;
3373 init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name+1);
3375 /* example values: 0x0000 0002 */
3376 q_u->unknown_0 = unknown_0;
3379 /*******************************************************************
3380 Reads or writes a structure.
3381 ********************************************************************/
3383 BOOL samr_io_q_connect(char *desc, SAMR_Q_CONNECT *q_u, prs_struct *ps, int depth)
3388 prs_debug(ps, depth, desc, "samr_io_q_connect");
3394 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
3396 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
3402 if(!prs_uint32("unknown_0 ", ps, depth, &q_u->unknown_0))
3408 /*******************************************************************
3409 Reads or writes a structure.
3410 ********************************************************************/
3412 BOOL samr_io_r_connect(char *desc, SAMR_R_CONNECT *r_u, prs_struct *ps, int depth)
3417 prs_debug(ps, depth, desc, "samr_io_r_connect");
3423 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
3428 if(!prs_uint32("status", ps, depth, &r_u->status))
3434 /*******************************************************************
3435 Inits a SAMR_Q_CONNECT_ANON structure.
3436 ********************************************************************/
3438 void init_samr_q_connect_anon(SAMR_Q_CONNECT_ANON *q_u)
3440 DEBUG(5,("init_q_connect_anon\n"));
3443 q_u->unknown_0 = 0x5c; /* server name (?!!) */
3444 q_u->unknown_1 = 0x01;
3445 q_u->unknown_2 = 0x20;
3449 /*******************************************************************
3450 Reads or writes a structure.
3451 ********************************************************************/
3453 BOOL samr_io_q_connect_anon(char *desc, SAMR_Q_CONNECT_ANON *q_u, prs_struct *ps, int depth)
3458 prs_debug(ps, depth, desc, "samr_io_q_connect_anon");
3464 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
3466 if(!prs_uint16("unknown_0", ps, depth, &q_u->unknown_0))
3468 if(!prs_uint16("unknown_1", ps, depth, &q_u->unknown_1))
3470 if(!prs_uint32("unknown_2", ps, depth, &q_u->unknown_2))
3476 /*******************************************************************
3477 Reads or writes a structure.
3478 ********************************************************************/
3480 BOOL samr_io_r_connect_anon(char *desc, SAMR_R_CONNECT_ANON *r_u, prs_struct *ps, int depth)
3485 prs_debug(ps, depth, desc, "samr_io_r_connect_anon");
3491 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
3496 if(!prs_uint32("status", ps, depth, &r_u->status))
3502 /*******************************************************************
3503 Inits a SAMR_Q_OPEN_ALIAS structure.
3504 ********************************************************************/
3505 void init_samr_q_open_alias(SAMR_Q_OPEN_ALIAS *q_u,
3506 uint32 unknown_0, uint32 rid)
3508 DEBUG(5,("init_q_open_alias\n"));
3510 /* example values: 0x0000 0008 */
3511 q_u->unknown_0 = unknown_0;
3513 q_u->rid_alias = rid;
3516 /*******************************************************************
3517 Reads or writes a structure.
3518 ********************************************************************/
3520 BOOL samr_io_q_open_alias(char *desc, SAMR_Q_OPEN_ALIAS *q_u, prs_struct *ps, int depth)
3525 prs_debug(ps, depth, desc, "samr_io_q_open_alias");
3531 if(!smb_io_pol_hnd("domain_pol", &(q_u->dom_pol), ps, depth))
3534 if(!prs_uint32("unknown_0", ps, depth, &q_u->unknown_0))
3536 if(!prs_uint32("rid_alias", ps, depth, &q_u->rid_alias))
3542 /*******************************************************************
3543 Reads or writes a structure.
3544 ********************************************************************/
3546 BOOL samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS *r_u, prs_struct *ps, int depth)
3551 prs_debug(ps, depth, desc, "samr_io_r_open_alias");
3557 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
3562 if(!prs_uint32("status", ps, depth, &r_u->status))
3568 /*******************************************************************
3569 Inits a SAMR_Q_UNKNOWN_12 structure.
3570 ********************************************************************/
3572 void init_samr_q_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u,
3573 POLICY_HND *pol, uint32 rid,
3574 uint32 num_gids, uint32 *gid)
3578 DEBUG(5,("init_samr_q_lookup_rids\n"));
3580 memcpy(&q_u->pol, pol, sizeof(*pol));
3582 q_u->num_gids1 = num_gids;
3585 q_u->num_gids2 = num_gids;
3587 for (i = 0; i < num_gids; i++) {
3588 q_u->gid[i] = gid[i];
3592 /*******************************************************************
3593 Inits a SAMR_Q_UNKNOWN_21 structure.
3594 ********************************************************************/
3596 void init_samr_q_unknown_21(SAMR_Q_UNKNOWN_21 *q_c,
3597 POLICY_HND *hnd, uint16 unk_1, uint16 unk_2)
3599 DEBUG(5,("init_samr_q_unknown_21\n"));
3601 memcpy(&q_c->group_pol, hnd, sizeof(q_c->group_pol));
3602 q_c->unknown_1 = unk_1;
3603 q_c->unknown_2 = unk_2;
3607 /*******************************************************************
3608 Inits a SAMR_Q_UNKNOWN_13 structure.
3609 ********************************************************************/
3611 void init_samr_q_unknown_13(SAMR_Q_UNKNOWN_13 *q_c,
3612 POLICY_HND *hnd, uint16 unk_1, uint16 unk_2)
3614 DEBUG(5,("init_samr_q_unknown_13\n"));
3616 memcpy(&q_c->alias_pol, hnd, sizeof(q_c->alias_pol));
3617 q_c->unknown_1 = unk_1;
3618 q_c->unknown_2 = unk_2;
3621 /*******************************************************************
3622 Inits a SAMR_Q_UNKNOWN_38 structure.
3623 ********************************************************************/
3624 void init_samr_q_unknown_38(SAMR_Q_UNKNOWN_38 *q_u, char *srv_name)
3626 int len_srv_name = strlen(srv_name);
3628 DEBUG(5,("init_q_unknown_38\n"));
3631 init_uni_hdr(&q_u->hdr_srv_name, len_srv_name);
3632 init_unistr2(&q_u->uni_srv_name, srv_name, len_srv_name);
3636 /*******************************************************************
3637 Reads or writes a structure.
3638 ********************************************************************/
3640 BOOL samr_io_q_unknown_38(char *desc, SAMR_Q_UNKNOWN_38 *q_u, prs_struct *ps, int depth)
3645 prs_debug(ps, depth, desc, "samr_io_q_unknown_38");
3651 if(!prs_uint32("ptr", ps, depth, &q_u->ptr))
3654 if (q_u->ptr != 0) {
3655 if(!smb_io_unihdr ("", &q_u->hdr_srv_name, ps, depth))
3657 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->hdr_srv_name.buffer, ps, depth))
3664 /*******************************************************************
3665 Inits a SAMR_R_UNKNOWN_38 structure.
3666 ********************************************************************/
3668 void init_samr_r_unknown_38(SAMR_R_UNKNOWN_38 *r_u)
3670 DEBUG(5,("init_r_unknown_38\n"));
3678 /*******************************************************************
3679 Reads or writes a structure.
3680 ********************************************************************/
3682 BOOL samr_io_r_unknown_38(char *desc, SAMR_R_UNKNOWN_38 *r_u, prs_struct *ps, int depth)
3687 prs_debug(ps, depth, desc, "samr_io_r_unknown_38");
3693 if(!prs_uint16("unk_0", ps, depth, &r_u->unk_0))
3697 if(!prs_uint16("unk_1", ps, depth, &r_u->unk_1))
3701 if(!prs_uint16("unk_2", ps, depth, &r_u->unk_2))
3705 if(!prs_uint16("unk_3", ps, depth, &r_u->unk_3))
3713 /*******************************************************************
3714 make a SAMR_ENC_PASSWD structure.
3715 ********************************************************************/
3717 void init_enc_passwd(SAMR_ENC_PASSWD *pwd, char pass[512])
3720 memcpy(pwd->pass, pass, sizeof(pwd->pass));
3723 /*******************************************************************
3724 Reads or writes a SAMR_ENC_PASSWD structure.
3725 ********************************************************************/
3727 BOOL samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD *pwd, prs_struct *ps, int depth)
3732 prs_debug(ps, depth, desc, "samr_io_enc_passwd");
3738 if(!prs_uint32("ptr", ps, depth, &pwd->ptr))
3740 if(!prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass)))
3746 /*******************************************************************
3747 Inits a SAMR_ENC_HASH structure.
3748 ********************************************************************/
3750 void init_enc_hash(SAMR_ENC_HASH *hsh, uchar hash[16])
3753 memcpy(hsh->hash, hash, sizeof(hsh->hash));
3756 /*******************************************************************
3757 Reads or writes a SAMR_ENC_HASH structure.
3758 ********************************************************************/
3760 BOOL samr_io_enc_hash(char *desc, SAMR_ENC_HASH *hsh, prs_struct *ps, int depth)
3765 prs_debug(ps, depth, desc, "samr_io_enc_hash");
3771 if(!prs_uint32("ptr ", ps, depth, &hsh->ptr))
3773 if(!prs_uint8s(False, "hash", ps, depth, hsh->hash, sizeof(hsh->hash)))
3779 /*******************************************************************
3780 Inits a SAMR_R_UNKNOWN_38 structure.
3781 ********************************************************************/
3783 void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER *q_u,
3784 char *dest_host, char *user_name,
3785 char nt_newpass[516], uchar nt_oldhash[16],
3786 char lm_newpass[516], uchar lm_oldhash[16])
3788 int len_dest_host = strlen(dest_host);
3789 int len_user_name = strlen(user_name);
3791 DEBUG(5,("init_samr_q_chgpasswd_user\n"));
3794 init_uni_hdr(&q_u->hdr_dest_host, len_dest_host);
3795 init_unistr2(&q_u->uni_dest_host, dest_host, len_dest_host);
3796 init_uni_hdr(&q_u->hdr_user_name, len_user_name);
3797 init_unistr2(&q_u->uni_user_name, user_name, len_user_name);
3799 init_enc_passwd(&q_u->nt_newpass, nt_newpass);
3800 init_enc_hash(&q_u->nt_oldhash, nt_oldhash);
3802 q_u->unknown = 0x01;
3804 init_enc_passwd(&q_u->lm_newpass, lm_newpass);
3805 init_enc_hash (&q_u->lm_oldhash, lm_oldhash);
3808 /*******************************************************************
3809 Reads or writes a structure.
3810 ********************************************************************/
3812 BOOL samr_io_q_chgpasswd_user(char *desc, SAMR_Q_CHGPASSWD_USER *q_u, prs_struct *ps, int depth)
3817 prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user");
3823 if(!prs_uint32("ptr_0", ps, depth, &q_u->ptr_0))
3826 if(!smb_io_unihdr ("", &q_u->hdr_dest_host, ps, depth))
3828 if(!smb_io_unistr2("", &q_u->uni_dest_host, q_u->hdr_dest_host.buffer, ps, depth))
3830 if(!smb_io_unihdr ("", &q_u->hdr_user_name, ps, depth))
3832 if(!smb_io_unistr2("", &q_u->uni_user_name, q_u->hdr_user_name.buffer, ps, depth))
3835 if(!samr_io_enc_passwd("nt_newpass", &q_u->nt_newpass, ps, depth))
3837 if(!samr_io_enc_hash ("nt_oldhash", &q_u->nt_oldhash, ps, depth))
3840 if(!prs_uint32("unknown", ps, depth, &q_u->unknown))
3843 if(!samr_io_enc_passwd("lm_newpass", &q_u->lm_newpass, ps, depth))
3845 if(!samr_io_enc_hash("lm_oldhash", &q_u->lm_oldhash, ps, depth))
3851 /*******************************************************************
3852 Inits a SAMR_R_CHGPASSWD_USER structure.
3853 ********************************************************************/
3855 void init_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER *r_u, uint32 status)
3857 DEBUG(5,("init_r_chgpasswd_user\n"));
3859 r_u->status = status;
3862 /*******************************************************************
3863 Reads or writes a structure.
3864 ********************************************************************/
3866 BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER *r_u, prs_struct *ps, int depth)
3871 prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user");
3877 if(!prs_uint32("status", ps, depth, &r_u->status))
3883 /**********************************************************************
3884 Reads or writes a structure
3885 **********************************************************************/
3886 BOOL samr_io_q_lookup_domain(char* desc, SAMR_Q_LOOKUP_DOMAIN* q_u, prs_struct *ps, int depth)
3891 prs_debug(ps, depth, desc, "samr_io_q_lookup_domain");
3896 smb_io_pol_hnd("connect_pol", &(q_u->connect_pol), ps, depth);
3898 smb_io_unihdr("hdr_domain", &(q_u->hdr_domain), ps, depth);
3899 smb_io_unistr2("uni_domain", &(q_u->uni_domain),
3900 q_u->hdr_domain.buffer, ps, depth);
3906 /*******************************************************************
3907 makes a SAMR_R_LOOKUP_DOMAIN structure.
3908 ********************************************************************/
3909 BOOL init_samr_r_lookup_domain(SAMR_R_LOOKUP_DOMAIN * r_u,
3910 DOM_SID *dom_sid, uint32 status)
3915 DEBUG(5, ("make_samr_r_lookup_domain\n"));
3917 r_u->status = status;
3922 init_dom_sid2(&r_u->dom_sid, dom_sid);
3928 /*******************************************************************
3929 reads or writes a structure.
3930 ********************************************************************/
3931 BOOL samr_io_r_lookup_domain(char *desc, SAMR_R_LOOKUP_DOMAIN * r_u,
3932 prs_struct *ps, int depth)
3937 prs_debug(ps, depth, desc, "samr_io_r_lookup_domain");
3942 prs_uint32("ptr", ps, depth, &(r_u->ptr_sid));
3944 if (r_u->ptr_sid != 0)
3946 smb_io_dom_sid2("sid", &(r_u->dom_sid), ps, depth);
3950 prs_uint32("status", ps, depth, &(r_u->status));
3955 /*******************************************************************
3956 reads or writes a structure.
3957 ********************************************************************/
3958 BOOL samr_io_q_enum_domains(char *desc, SAMR_Q_ENUM_DOMAINS * q_e,
3959 prs_struct *ps, int depth)
3964 prs_debug(ps, depth, desc, "samr_io_q_enum_domains");
3969 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
3971 prs_uint32("start_idx", ps, depth, &(q_e->start_idx));
3972 prs_uint32("max_size ", ps, depth, &(q_e->max_size));
3979 /*******************************************************************
3980 makes a SAMR_R_ENUM_DOMAINS structure.
3981 ********************************************************************/
3982 BOOL init_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS * r_u,
3983 uint32 next_idx, fstring* domains, uint32 num_sam_entries)
3990 DEBUG(5, ("init_samr_r_enum_domains\n"));
3992 r_u->next_idx = next_idx;
3994 r_u->uni_dom_name = (UNISTR2*) malloc(sizeof(UNISTR2) * num_sam_entries);
3995 r_u->sam = (SAM_ENTRY*) malloc(sizeof(SAM_ENTRY) * num_sam_entries);
3996 if(r_u->uni_dom_name == NULL || r_u->sam == NULL)
3998 free(r_u->uni_dom_name);
4000 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
4003 if(r_u->status == 0)
4004 for(i=0;i<num_sam_entries;i++) /* only two domains to send */
4006 init_unistr2(&r_u->uni_dom_name[i],domains[i], strlen(domains[i]));
4007 init_sam_entry(&(r_u->sam[i]), strlen(domains[i]), 0);
4011 num_sam_entries = 0;
4014 if (num_sam_entries != 0)
4016 r_u->ptr_entries1 = 1;
4017 r_u->ptr_entries2 = 1;
4018 r_u->num_entries2 = num_sam_entries;
4019 r_u->num_entries3 = num_sam_entries;
4021 r_u->num_entries4 = num_sam_entries;
4025 r_u->ptr_entries1 = 0;
4026 r_u->num_entries2 = num_sam_entries;
4027 r_u->ptr_entries2 = 1;
4033 /*******************************************************************
4034 reads or writes a structure.
4035 ********************************************************************/
4036 BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS * r_u,
4037 prs_struct *ps, int depth)
4044 prs_debug(ps, depth, desc, "samr_io_r_enum_domains");
4049 prs_uint32("next_idx ", ps, depth, &(r_u->next_idx));
4050 prs_uint32("ptr_entries1", ps, depth, &(r_u->ptr_entries1));
4052 if (r_u->ptr_entries1 != 0)
4054 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
4055 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
4056 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
4058 if (UNMARSHALLING(ps))
4060 r_u->sam = (SAM_ENTRY*) malloc(sizeof(SAM_ENTRY)*
4062 r_u->uni_dom_name = (UNISTR2*) malloc(sizeof(UNISTR2)*
4066 if ((r_u->sam == NULL || r_u->uni_dom_name == NULL)
4067 && r_u->num_entries2 != 0)
4069 DEBUG(0, ("NULL pointers in SAMR_R_ENUM_DOMAINS\n"));
4070 r_u->num_entries4 = 0;
4071 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
4075 for (i = 0; i < r_u->num_entries2; i++)
4078 slprintf(tmp, sizeof(tmp) - 1, "domains[%d]", i);
4079 sam_io_sam_entry(tmp, &(r_u->sam[i]), ps, depth);
4082 for (i = 0; i < r_u->num_entries2; i++)
4085 slprintf(tmp, sizeof(tmp) - 1, "domains[%d]", i);
4086 smb_io_unistr2(tmp, &(r_u->uni_dom_name[i]),
4087 r_u->sam[i].hdr_name.buffer, ps,
4096 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
4097 prs_uint32("status", ps, depth, &(r_u->status));
4102 /*******************************************************************
4103 reads or writes a structure.
4104 ********************************************************************/
4105 static BOOL sam_io_user_info12(char *desc, SAM_USER_INFO_12 *u, prs_struct *ps, int depth)
4110 DEBUG(0, ("possible security breach!\n"));
4112 prs_debug(ps, depth, desc, "samr_io_r_user_info12");
4118 if(!prs_uint8s(False, "lm_pwd", ps, depth, u->lm_pwd, sizeof(u->lm_pwd)))
4120 if(!prs_uint8s(False, "nt_pwd", ps, depth, u->nt_pwd, sizeof(u->nt_pwd)))
4123 if(!prs_uint8("lm_pwd_active", ps, depth, &u->lm_pwd_active))
4125 if(!prs_uint8("nt_pwd_active", ps, depth, &u->nt_pwd_active))
4131 /*******************************************************************
4132 reads or writes a structure.
4133 ********************************************************************/
4134 static BOOL sam_io_user_info23(char *desc, SAM_USER_INFO_23 *usr, prs_struct *ps, int depth)
4139 prs_debug(ps, depth, desc, "sam_io_user_info23");
4145 if(!smb_io_time("logon_time", &usr->logon_time, ps, depth))
4147 if(!smb_io_time("logoff_time", &usr->logoff_time, ps, depth))
4149 if(!smb_io_time("kickoff_time", &usr->kickoff_time, ps, depth))
4151 if(!smb_io_time("pass_last_set_time", &usr->pass_last_set_time, ps, depth))
4153 if(!smb_io_time("pass_can_change_time", &usr->pass_can_change_time, ps, depth))
4155 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
4158 if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
4160 if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
4162 if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
4164 if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
4166 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
4168 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
4170 if(!smb_io_unihdr("hdr_acct_desc", &usr->hdr_acct_desc, ps, depth)) /* account desc */
4172 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
4174 if(!smb_io_unihdr("hdr_unknown_str", &usr->hdr_unknown_str, ps, depth)) /* unknown string */
4176 if(!smb_io_unihdr("hdr_munged_dial", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
4179 if(!prs_uint8s(False, "lm_pwd", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
4181 if(!prs_uint8s(False, "nt_pwd", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
4184 if(!prs_uint32("user_rid", ps, depth, &usr->user_rid)) /* User ID */
4186 if(!prs_uint32("group_rid", ps, depth, &usr->group_rid)) /* Group ID */
4188 if(!prs_uint32("acb_info", ps, depth, &usr->acb_info))
4191 if(!prs_uint32("unknown_3", ps, depth, &usr->unknown_3))
4193 if(!prs_uint16("logon_divs", ps, depth, &usr->logon_divs)) /* logon divisions per week */
4197 if(!prs_uint32("ptr_logon_hrs", ps, depth, &usr->ptr_logon_hrs))
4199 if(!prs_uint8s(False, "padding1", ps, depth, usr->padding1, sizeof(usr->padding1)))
4201 if(!prs_uint32("unknown_5", ps, depth, &usr->unknown_5))
4204 if(!prs_uint8s(False, "password", ps, depth, usr->pass, sizeof(usr->pass)))
4207 /* here begins pointed-to data */
4209 if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
4213 if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
4217 if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
4221 if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
4225 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
4229 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
4233 if(!smb_io_unistr2("uni_acct_desc", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
4237 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
4241 if(!smb_io_unistr2("uni_unknown_str", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */
4245 if(!smb_io_unistr2("uni_munged_dial", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */
4250 /* ok, this is only guess-work (as usual) */
4251 if (usr->unknown_5 != 0x0) {
4252 if(!prs_uint32("unknown_6", ps, depth, &usr->unknown_6))
4254 if(!prs_uint32("padding4", ps, depth, &usr->padding4))
4256 } else if (UNMARSHALLING(ps)) {
4261 if (usr->ptr_logon_hrs) {
4262 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
4269 /*******************************************************************
4270 reads or writes a structure.
4271 ********************************************************************/
4272 static BOOL sam_io_user_info24(char *desc, SAM_USER_INFO_24 *usr, prs_struct *ps, int depth)
4277 prs_debug(ps, depth, desc, "sam_io_user_info24");
4283 if(!prs_uint8s(False, "password", ps, depth, usr->pass, sizeof(usr->pass)))
4289 /*******************************************************************
4290 reads or writes a structure.
4291 ********************************************************************/
4292 static BOOL samr_io_userinfo_ctr(char *desc, SAM_USERINFO_CTR *ctr, prs_struct *ps, int depth)
4297 prs_debug(ps, depth, desc, "samr_io_userinfo_ctr");
4300 /* lkclXXXX DO NOT ALIGN BEFORE READING SWITCH VALUE! */
4302 if(!prs_uint16("switch_value", ps, depth, &ctr->switch_value))
4307 switch (ctr->switch_value) {
4309 if (UNMARSHALLING(ps)) /* reading */
4310 ctr->info.id10 = (SAM_USER_INFO_10 *)malloc(sizeof(SAM_USER_INFO_10));
4311 if (ctr->info.id10 == NULL) {
4312 DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n"));
4315 if(!sam_io_user_info10("", ctr->info.id10, ps, depth))
4319 if (UNMARSHALLING(ps)) /* reading */
4320 ctr->info.id11 = (SAM_USER_INFO_11 *)malloc(sizeof(SAM_USER_INFO_11));
4321 if (ctr->info.id11 == NULL) {
4322 DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n"));
4325 if(!sam_io_user_info11("", ctr->info.id11, ps, depth))
4329 if (UNMARSHALLING(ps)) /* reading */
4330 ctr->info.id12 = (SAM_USER_INFO_12 *)malloc(sizeof(SAM_USER_INFO_12));
4331 if (ctr->info.id12 == NULL) {
4332 DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n"));
4335 if(!sam_io_user_info12("", ctr->info.id12, ps, depth))
4339 if (UNMARSHALLING(ps)) /* reading */
4340 ctr->info.id21 = (SAM_USER_INFO_21 *)malloc(sizeof(SAM_USER_INFO_21));
4341 if (ctr->info.id21 == NULL) {
4342 DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n"));
4345 if(!sam_io_user_info21("", ctr->info.id21, ps, depth))
4349 if (UNMARSHALLING(ps)) /* reading */
4350 ctr->info.id23 = (SAM_USER_INFO_23 *)malloc(sizeof(SAM_USER_INFO_23));
4351 if (ctr->info.id23 == NULL) {
4352 DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n"));
4355 if(!sam_io_user_info23("", ctr->info.id23, ps, depth))
4359 if (UNMARSHALLING(ps)) /* reading */
4360 ctr->info.id24 = (SAM_USER_INFO_24 *)malloc(sizeof(SAM_USER_INFO_24));
4361 if (ctr->info.id24 == NULL) {
4362 DEBUG(2, ("samr_io_userinfo_ctr: info pointer not initialised\n"));
4365 if(!sam_io_user_info24("", ctr->info.id24, ps, depth))
4369 DEBUG(2, ("samr_io_userinfo_ctr: unknown switch level 0x%x\n", ctr->switch_value));
4378 /*******************************************************************
4380 ********************************************************************/
4381 void free_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr)
4385 safe_free(ctr->info.id);
4386 ctr->info.id = NULL;
4389 /*******************************************************************
4390 reads or writes a structure.
4391 ********************************************************************/
4392 BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO *q_u, prs_struct *ps, int depth)
4397 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo");
4403 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4406 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
4408 if(!samr_io_userinfo_ctr("ctr", q_u->ctr, ps, depth))
4414 /*******************************************************************
4416 ********************************************************************/
4417 void free_samr_q_set_userinfo(SAMR_Q_SET_USERINFO * q_u)
4421 free_samr_userinfo_ctr(q_u->ctr);
4424 /*******************************************************************
4425 reads or writes a structure.
4426 ********************************************************************/
4427 BOOL samr_io_r_set_userinfo(char *desc, SAMR_R_SET_USERINFO *r_u, prs_struct *ps, int depth)
4432 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo");
4438 if(!prs_uint32("status", ps, depth, &r_u->status))
4444 /*******************************************************************
4445 reads or writes a structure.
4446 ********************************************************************/
4447 BOOL samr_io_q_set_userinfo2(char *desc, SAMR_Q_SET_USERINFO2 *q_u, prs_struct *ps, int depth)
4452 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo2");
4458 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4461 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
4463 if(!samr_io_userinfo_ctr("ctr", q_u->ctr, ps, depth))
4469 /*******************************************************************
4471 ********************************************************************/
4472 void free_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 *q_u)
4474 free_samr_userinfo_ctr(q_u->ctr);
4477 /*******************************************************************
4478 makes a SAMR_R_SET_USERINFO2 structure.
4479 ********************************************************************/
4480 BOOL make_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 *r_u, uint32 status)
4485 DEBUG(5, ("make_samr_r_set_userinfo2\n"));
4487 r_u->status = status; /* return status */
4492 /*******************************************************************
4493 reads or writes a structure.
4494 ********************************************************************/
4495 BOOL samr_io_r_set_userinfo2(char *desc, SAMR_R_SET_USERINFO2 *r_u, prs_struct *ps, int depth)
4500 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo2");
4506 if(!prs_uint32("status", ps, depth, &r_u->status))