2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1999,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-1999,
7 * Copyright (C) Paul Ashton 1997-1999.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 extern int DEBUGLEVEL;
30 /*******************************************************************
31 makes a SAMR_Q_CLOSE_HND structure.
32 ********************************************************************/
33 BOOL make_samr_q_close_hnd(SAMR_Q_CLOSE_HND *q_c, POLICY_HND *hnd)
35 if (q_c == NULL || hnd == NULL) return False;
37 DEBUG(5,("make_samr_q_close_hnd\n"));
39 memcpy(&(q_c->pol), hnd, sizeof(q_c->pol));
44 /*******************************************************************
45 reads or writes a structure.
46 ********************************************************************/
47 BOOL samr_io_q_close_hnd(char *desc, SAMR_Q_CLOSE_HND *q_u, prs_struct *ps, int depth)
49 if (q_u == NULL) return False;
51 prs_debug(ps, depth, desc, "samr_io_q_close_hnd");
56 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
62 /*******************************************************************
63 reads or writes a structure.
64 ********************************************************************/
65 BOOL samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND *r_u, prs_struct *ps, int depth)
67 if (r_u == NULL) return False;
69 prs_debug(ps, depth, desc, "samr_io_r_close_hnd");
74 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
77 prs_uint32("status", ps, depth, &(r_u->status));
82 /*******************************************************************
83 makes a SAMR_Q_LOOKUP_DOMAIN structure.
84 ********************************************************************/
85 BOOL make_samr_q_lookup_domain(SAMR_Q_LOOKUP_DOMAIN *q_u,
86 POLICY_HND *pol, const char *dom_name)
88 int len_name = strlen(dom_name);
90 if (q_u == NULL) return False;
92 DEBUG(5,("make_samr_q_lookup_domain\n"));
94 memcpy(&(q_u->connect_pol), pol, sizeof(*pol));
96 make_uni_hdr(&(q_u->hdr_domain), len_name);
97 make_unistr2(&(q_u->uni_domain), dom_name, len_name);
102 /*******************************************************************
103 reads or writes a structure.
104 ********************************************************************/
105 BOOL samr_io_q_lookup_domain(char *desc, SAMR_Q_LOOKUP_DOMAIN *q_u, prs_struct *ps, int depth)
107 if (q_u == NULL) return False;
109 prs_debug(ps, depth, desc, "samr_io_q_lookup_domain");
114 smb_io_pol_hnd("connect_pol", &(q_u->connect_pol), ps, depth);
117 smb_io_unihdr("hdr_domain", &(q_u->hdr_domain), ps, depth);
118 smb_io_unistr2("uni_domain", &(q_u->uni_domain),
119 q_u->hdr_domain.buffer, ps, depth);
125 /*******************************************************************
126 reads or writes a structure.
127 ********************************************************************/
128 BOOL samr_io_r_lookup_domain(char *desc, SAMR_R_LOOKUP_DOMAIN *r_u, prs_struct *ps, int depth)
130 if (r_u == NULL) return False;
132 prs_debug(ps, depth, desc, "samr_io_r_lookup_domain");
137 prs_uint32("ptr", ps, depth, &(r_u->ptr_sid));
139 if (r_u->ptr_sid != 0)
141 smb_io_dom_sid2("sid", &(r_u->dom_sid), ps, depth);
145 prs_uint32("status", ps, depth, &(r_u->status));
150 /*******************************************************************
151 reads or writes a structure.
152 ********************************************************************/
153 BOOL make_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN *q_u,
154 const POLICY_HND *connect_pol, uint32 flags,
157 if (q_u == NULL) return False;
159 DEBUG(5,("samr_make_samr_q_open_domain\n"));
161 memcpy(&q_u->connect_pol, connect_pol, sizeof(q_u->connect_pol));
163 make_dom_sid2(&(q_u->dom_sid), sid);
168 /*******************************************************************
169 reads or writes a structure.
170 ********************************************************************/
171 BOOL samr_io_q_open_domain(char *desc, SAMR_Q_OPEN_DOMAIN *q_u, prs_struct *ps, int depth)
173 if (q_u == NULL) return False;
175 prs_debug(ps, depth, desc, "samr_io_q_open_domain");
180 smb_io_pol_hnd("connect_pol", &(q_u->connect_pol), ps, depth);
183 prs_uint32("flags", ps, depth, &(q_u->flags));
185 smb_io_dom_sid2("sid", &(q_u->dom_sid), ps, depth);
192 /*******************************************************************
193 reads or writes a structure.
194 ********************************************************************/
195 BOOL samr_io_r_open_domain(char *desc, SAMR_R_OPEN_DOMAIN *r_u, prs_struct *ps, int depth)
197 if (r_u == NULL) return False;
199 prs_debug(ps, depth, desc, "samr_io_r_open_domain");
204 smb_io_pol_hnd("domain_pol", &(r_u->domain_pol), ps, depth);
207 prs_uint32("status", ps, depth, &(r_u->status));
212 /*******************************************************************
213 reads or writes a structure.
214 ********************************************************************/
215 BOOL make_samr_q_unknown_2c(SAMR_Q_UNKNOWN_2C *q_u, POLICY_HND *user_pol)
217 if (q_u == NULL) return False;
219 DEBUG(5,("samr_make_samr_q_unknown_2c\n"));
221 memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol));
227 /*******************************************************************
228 reads or writes a structure.
229 ********************************************************************/
230 BOOL samr_io_q_unknown_2c(char *desc, SAMR_Q_UNKNOWN_2C *q_u, prs_struct *ps, int depth)
232 if (q_u == NULL) return False;
234 prs_debug(ps, depth, desc, "samr_io_q_unknown_2c");
239 smb_io_pol_hnd("user_pol", &(q_u->user_pol), ps, depth);
245 /*******************************************************************
247 ********************************************************************/
248 BOOL make_samr_r_unknown_2c(SAMR_R_UNKNOWN_2C *q_u, uint32 status)
250 if (q_u == NULL) return False;
252 DEBUG(5,("samr_make_r_unknown_2c\n"));
254 q_u->unknown_0 = 0x00150000;
255 q_u->unknown_1 = 0x00000000;
256 q_u->status = status;
262 /*******************************************************************
263 reads or writes a structure.
264 ********************************************************************/
265 BOOL samr_io_r_unknown_2c(char *desc, SAMR_R_UNKNOWN_2C *r_u, prs_struct *ps, int depth)
267 if (r_u == NULL) return False;
269 prs_debug(ps, depth, desc, "samr_io_r_unknown_2c");
274 prs_uint32("unknown_0", ps, depth, &(r_u->unknown_0));
275 prs_uint32("unknown_1", ps, depth, &(r_u->unknown_1));
276 prs_uint32("status ", ps, depth, &(r_u->status ));
281 /*******************************************************************
282 reads or writes a structure.
283 ********************************************************************/
284 BOOL make_samr_q_unknown_3(SAMR_Q_UNKNOWN_3 *q_u,
285 POLICY_HND *user_pol, uint16 switch_value)
287 if (q_u == NULL) return False;
289 DEBUG(5,("samr_make_samr_q_unknown_3\n"));
291 memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol));
292 q_u->switch_value = switch_value;
298 /*******************************************************************
299 reads or writes a structure.
300 ********************************************************************/
301 BOOL samr_io_q_unknown_3(char *desc, SAMR_Q_UNKNOWN_3 *q_u, prs_struct *ps, int depth)
303 if (q_u == NULL) return False;
305 prs_debug(ps, depth, desc, "samr_io_q_unknown_3");
310 smb_io_pol_hnd("user_pol", &(q_u->user_pol), ps, depth);
313 prs_uint16("switch_value", ps, depth, &(q_u->switch_value));
319 /*******************************************************************
320 reads or writes a structure.
321 ********************************************************************/
322 BOOL make_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO *q_u,
323 POLICY_HND *domain_pol, uint16 switch_value)
325 if (q_u == NULL) return False;
327 DEBUG(5,("samr_make_samr_q_query_dom_info\n"));
329 memcpy(&q_u->domain_pol, domain_pol, sizeof(q_u->domain_pol));
330 q_u->switch_value = switch_value;
335 /*******************************************************************
336 reads or writes a structure.
337 ********************************************************************/
338 BOOL samr_io_q_query_dom_info(char *desc, SAMR_Q_QUERY_DOMAIN_INFO *q_u, prs_struct *ps, int depth)
340 if (q_u == NULL) return False;
342 prs_debug(ps, depth, desc, "samr_io_q_query_dom_info");
347 smb_io_pol_hnd("domain_pol", &(q_u->domain_pol), ps, depth);
350 prs_uint16("switch_value", ps, depth, &(q_u->switch_value));
357 /*******************************************************************
359 ********************************************************************/
360 BOOL make_unk_info3(SAM_UNK_INFO_3 *u_3)
362 if (u_3 == NULL) return False;
364 u_3->unknown_0 = 0x00000000;
365 u_3->unknown_1 = 0x80000000;
370 /*******************************************************************
371 reads or writes a structure.
372 ********************************************************************/
373 BOOL sam_io_unk_info3(char *desc, SAM_UNK_INFO_3 *u_3, prs_struct *ps, int depth)
375 if (u_3 == NULL) return False;
377 prs_debug(ps, depth, desc, "sam_io_unk_info3");
380 prs_uint32("unknown_0", ps, depth, &u_3->unknown_0); /* 0x0000 0000 */
381 prs_uint32("unknown_1", ps, depth, &u_3->unknown_1); /* 0x8000 0000 */
389 /*******************************************************************
391 ********************************************************************/
392 BOOL make_unk_info6(SAM_UNK_INFO_6 *u_6)
394 if (u_6 == NULL) return False;
396 u_6->unknown_0 = 0x00000000;
398 memset(u_6->padding, 0, sizeof(u_6->padding)); /* 12 bytes zeros */
403 /*******************************************************************
404 reads or writes a structure.
405 ********************************************************************/
406 BOOL sam_io_unk_info6(char *desc, SAM_UNK_INFO_6 *u_6, prs_struct *ps, int depth)
408 if (u_6 == NULL) return False;
410 prs_debug(ps, depth, desc, "sam_io_unk_info6");
413 prs_uint32("unknown_0", ps, depth, &u_6->unknown_0); /* 0x0000 0000 */
414 prs_uint32("ptr_0", ps, depth, &u_6->ptr_0); /* pointer to unknown structure */
415 prs_uint8s(False, "padding", ps, depth, u_6->padding, sizeof(u_6->padding)); /* 12 bytes zeros */
423 /*******************************************************************
425 ********************************************************************/
426 BOOL make_unk_info7(SAM_UNK_INFO_7 *u_7)
428 if (u_7 == NULL) return False;
430 u_7->unknown_0 = 0x0003;
435 /*******************************************************************
436 reads or writes a structure.
437 ********************************************************************/
438 BOOL sam_io_unk_info7(char *desc, SAM_UNK_INFO_7 *u_7, prs_struct *ps, int depth)
440 if (u_7 == NULL) return False;
442 prs_debug(ps, depth, desc, "sam_io_unk_info7");
445 prs_uint16("unknown_0", ps, depth, &u_7->unknown_0); /* 0x0003 */
452 /*******************************************************************
454 ********************************************************************/
455 BOOL make_unk_info2(SAM_UNK_INFO_2 *u_2, char *domain, char *server)
457 int len_domain = strlen(domain);
458 int len_server = strlen(server);
460 if (u_2 == NULL) return False;
462 u_2->unknown_0 = 0x00000000;
463 u_2->unknown_1 = 0x80000000;
464 u_2->unknown_2 = 0x00000000;
467 make_uni_hdr(&(u_2->hdr_domain), len_domain);
468 make_uni_hdr(&(u_2->hdr_server), len_server);
470 u_2->seq_num = 0x10000000;
471 u_2->unknown_3 = 0x00000000;
473 u_2->unknown_4 = 0x00000001;
474 u_2->unknown_5 = 0x00000003;
475 u_2->unknown_6 = 0x00000001;
476 u_2->num_domain_usrs = MAX_SAM_ENTRIES;
477 u_2->num_domain_grps = MAX_SAM_ENTRIES;
478 u_2->num_local_grps = MAX_SAM_ENTRIES;
480 memset(u_2->padding, 0, sizeof(u_2->padding)); /* 12 bytes zeros */
482 make_unistr2(&u_2->uni_domain, domain, len_domain);
483 make_unistr2(&u_2->uni_server, server, len_server);
488 /*******************************************************************
489 reads or writes a structure.
490 ********************************************************************/
491 BOOL sam_io_unk_info2(char *desc, SAM_UNK_INFO_2 *u_2, prs_struct *ps, int depth)
493 if (u_2 == NULL) return False;
495 prs_debug(ps, depth, desc, "sam_io_unk_info2");
498 prs_uint32("unknown_0", ps, depth, &u_2->unknown_0); /* 0x0000 0000 */
499 prs_uint32("unknown_1", ps, depth, &u_2->unknown_1); /* 0x8000 0000 */
500 prs_uint32("unknown_2", ps, depth, &u_2->unknown_2); /* 0x0000 0000 */
502 prs_uint32("ptr_0", ps, depth, &u_2->ptr_0); /* pointer to unknown structure */
503 smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth); /* domain name unicode header */
504 smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth); /* server name unicode header */
506 /* put all the data in here, at the moment, including what the above
507 pointer is referring to
510 prs_uint32("seq_num ", ps, depth, &u_2->seq_num ); /* 0x0000 0099 or 0x1000 0000 */
511 prs_uint32("unknown_3 ", ps, depth, &u_2->unknown_3 ); /* 0x0000 0000 */
513 prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4 ); /* 0x0000 0001 */
514 prs_uint32("unknown_5 ", ps, depth, &u_2->unknown_5 ); /* 0x0000 0003 */
515 prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6 ); /* 0x0000 0001 */
516 prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs ); /* 0x0000 0008 */
517 prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps); /* 0x0000 0003 */
518 prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps); /* 0x0000 0003 */
520 prs_uint8s(False, "padding", ps, depth, u_2->padding, sizeof(u_2->padding)); /* 12 bytes zeros */
522 smb_io_unistr2( "uni_domain", &u_2->uni_domain, u_2->hdr_domain.buffer, ps, depth); /* domain name unicode string */
524 smb_io_unistr2( "uni_server", &u_2->uni_server, u_2->hdr_server.buffer, ps, depth); /* server name unicode string */
532 /*******************************************************************
534 ********************************************************************/
535 BOOL make_unk_info1(SAM_UNK_INFO_1 *u_1)
537 if (u_1 == NULL) return False;
539 memset(u_1->padding, 0, sizeof(u_1->padding)); /* 12 bytes zeros */
540 u_1->unknown_1 = 0x80000000;
541 u_1->unknown_2 = 0x00000000;
546 /*******************************************************************
547 reads or writes a structure.
548 ********************************************************************/
549 BOOL sam_io_unk_info1(char *desc, SAM_UNK_INFO_1 *u_1, prs_struct *ps, int depth)
551 if (u_1 == NULL) return False;
553 prs_debug(ps, depth, desc, "sam_io_unk_info1");
556 prs_uint8s(False, "padding", ps, depth, u_1->padding, sizeof(u_1->padding)); /* 12 bytes zeros */
558 prs_uint32("unknown_1", ps, depth, &u_1->unknown_1); /* 0x8000 0000 */
559 prs_uint32("unknown_2", ps, depth, &u_1->unknown_2); /* 0x0000 0000 */
566 /*******************************************************************
567 makes a SAMR_R_QUERY_DOMAIN_INFO structure.
568 ********************************************************************/
569 BOOL make_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO *r_u,
570 uint16 switch_value, SAM_UNK_CTR *ctr,
573 if (r_u == NULL || ctr == NULL) return False;
575 DEBUG(5,("make_samr_r_query_dom_info\n"));
578 r_u->switch_value = 0;
579 r_u->status = status; /* return status */
583 r_u->switch_value = switch_value;
591 /*******************************************************************
592 reads or writes a structure.
593 ********************************************************************/
594 BOOL samr_io_r_query_dom_info(char *desc, SAMR_R_QUERY_DOMAIN_INFO *r_u, prs_struct *ps, int depth)
596 if (r_u == NULL) return False;
598 prs_debug(ps, depth, desc, "samr_io_r_query_dom_info");
603 prs_uint32("ptr_0 ", ps, depth, &(r_u->ptr_0));
605 if (r_u->ptr_0 != 0 && r_u->ctr != NULL)
607 prs_uint16("switch_value", ps, depth, &(r_u->switch_value));
610 switch (r_u->switch_value)
614 sam_io_unk_info7("unk_inf7", &r_u->ctr->info.inf7, ps, depth);
619 sam_io_unk_info6("unk_inf6", &r_u->ctr->info.inf6, ps, depth);
624 sam_io_unk_info3("unk_inf3", &r_u->ctr->info.inf3, ps, depth);
629 sam_io_unk_info2("unk_inf2", &r_u->ctr->info.inf2, ps, depth);
634 sam_io_unk_info1("unk_inf1", &r_u->ctr->info.inf1, ps, depth);
639 DEBUG(3,("samr_io_r_query_dom_info: unknown switch level 0x%x\n",
641 r_u->status = 0xC0000000|NT_STATUS_INVALID_INFO_CLASS;
647 prs_uint32("status ", ps, depth, &(r_u->status));
653 /*******************************************************************
654 makes a DOM_SID3 structure.
656 calculate length by adding up the size of the components.
657 ********************************************************************/
658 BOOL make_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid)
660 if (sid3 == NULL) return False;
663 sid3->len = 2 + 8 + sid3->sid.num_auths * 4;
668 /*******************************************************************
669 reads or writes a SAM_SID3 structure.
671 this one's odd, because the length (in bytes) is specified at the beginning.
672 the length _includes_ the length of the length, too :-)
674 ********************************************************************/
675 static BOOL sam_io_dom_sid3(char *desc, DOM_SID3 *sid3, prs_struct *ps, int depth)
677 if (sid3 == NULL) return False;
679 prs_debug(ps, depth, desc, "sam_io_dom_sid3");
682 prs_uint16("len", ps, depth, &(sid3->len));
684 smb_io_dom_sid("", &(sid3->sid), ps, depth);
689 /*******************************************************************
690 makes a SAMR_R_UNKNOWN3 structure.
695 unknown_4,5 : 0x0000 0014
698 unknown_7 : 0x5800 or 0x0070
700 ********************************************************************/
701 static BOOL make_sam_sid_stuff(SAM_SID_STUFF *stf,
702 uint16 unknown_2, uint16 unknown_3,
703 uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
704 int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS])
706 stf->unknown_2 = unknown_2;
707 stf->unknown_3 = unknown_3;
709 bzero(stf->padding1, sizeof(stf->padding1));
711 stf->unknown_4 = unknown_4;
712 stf->unknown_5 = unknown_4;
714 stf->unknown_6 = unknown_6;
715 stf->unknown_7 = unknown_7;
717 stf->num_sids = num_sid3s;
719 stf->padding2 = 0x0000;
721 memcpy(stf->sid, sid3, sizeof(DOM_SID3) * num_sid3s);
726 /*******************************************************************
727 reads or writes a SAM_SID_STUFF structure.
728 ********************************************************************/
729 static BOOL sam_io_sid_stuff(char *desc, SAM_SID_STUFF *stf, prs_struct *ps, int depth)
733 if (stf == NULL) return False;
735 DEBUG(5,("make_sam_sid_stuff\n"));
737 prs_uint16("unknown_2", ps, depth, &(stf->unknown_2));
738 prs_uint16("unknown_3", ps, depth, &(stf->unknown_3));
740 prs_uint8s(False, "padding1", ps, depth, stf->padding1, sizeof(stf->padding1));
742 prs_uint32("unknown_4", ps, depth, &(stf->unknown_4));
743 prs_uint32("unknown_5", ps, depth, &(stf->unknown_5));
744 prs_uint16("unknown_6", ps, depth, &(stf->unknown_6));
745 prs_uint16("unknown_7", ps, depth, &(stf->unknown_7));
747 prs_uint32("num_sids ", ps, depth, &(stf->num_sids ));
748 prs_uint16("padding2 ", ps, depth, &(stf->padding2 ));
750 SMB_ASSERT_ARRAY(stf->sid, stf->num_sids);
752 for (i = 0; i < stf->num_sids; i++)
754 sam_io_dom_sid3("", &(stf->sid[i]), ps, depth);
760 /*******************************************************************
761 reads or writes a SAMR_R_UNKNOWN3 structure.
762 ********************************************************************/
763 BOOL make_samr_r_unknown_3(SAMR_R_UNKNOWN_3 *r_u,
764 uint16 unknown_2, uint16 unknown_3,
765 uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
766 int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS],
769 if (r_u == NULL) return False;
771 DEBUG(5,("samr_make_r_unknown_3\n"));
780 make_sam_sid_stuff(&(r_u->sid_stuff), unknown_2, unknown_3,
781 unknown_4, unknown_6, unknown_7,
785 r_u->status = status;
791 /*******************************************************************
792 reads or writes a SAMR_R_UNKNOWN_3 structure.
794 this one's odd, because the daft buggers use a different mechanism
795 for writing out the array of sids. they put the number of sids in
796 only one place: they've calculated the length of each sid and jumped
797 by that amount. then, retrospectively, the length of the whole buffer
798 is put at the beginning of the data stream.
802 ********************************************************************/
803 BOOL samr_io_r_unknown_3(char *desc, SAMR_R_UNKNOWN_3 *r_u, prs_struct *ps, int depth)
807 int ptr_sid_stuff = 0;
809 if (r_u == NULL) return False;
811 prs_debug(ps, depth, desc, "samr_io_r_unknown_3");
816 prs_uint32("ptr_0 ", ps, depth, &(r_u->ptr_0 ));
820 /* reading. do the length later */
821 prs_uint32("sid_stuff_len0", ps, depth, &(r_u->sid_stuff_len0));
826 ptr_len0 = ps->offset; ps->offset += 4;
831 prs_uint32("ptr_1 ", ps, depth, &(r_u->ptr_1 ));
834 /* reading. do the length later */
835 prs_uint32("sid_stuff_len1", ps, depth, &(r_u->sid_stuff_len1));
840 ptr_len1 = ps->offset; ps->offset += 4;
845 ptr_sid_stuff = ps->offset;
846 sam_io_sid_stuff("", &(r_u->sid_stuff), ps, depth);
850 if (!(ps->io)) /* storing not reading. do the length, now. */
852 if (ptr_sid_stuff != 0)
854 uint32 sid_stuff_len = ps->offset - ptr_sid_stuff;
855 int old_len = ps->offset;
857 ps->offset = ptr_len0;
858 prs_uint32("sid_stuff_len0", ps, depth, &sid_stuff_len);
860 ps->offset = ptr_len1;
861 prs_uint32("sid_stuff_len1", ps, depth, &sid_stuff_len);
863 ps->offset = old_len;
867 prs_uint32("status", ps, depth, &(r_u->status));
872 /*******************************************************************
873 reads or writes a SAM_STR1 structure.
874 ********************************************************************/
875 static BOOL sam_io_sam_str1(char *desc, SAM_STR1 *sam, uint32 acct_buf, uint32 name_buf, uint32 desc_buf, prs_struct *ps, int depth)
877 if (sam == NULL) return False;
879 prs_debug(ps, depth, desc, "sam_io_sam_str1");
884 smb_io_unistr2("unistr2", &(sam->uni_acct_name), acct_buf, ps, depth); /* account name unicode string */
886 smb_io_unistr2("unistr2", &(sam->uni_full_name), name_buf, ps, depth); /* full name unicode string */
888 smb_io_unistr2("unistr2", &(sam->uni_acct_desc), desc_buf, ps, depth); /* account desc unicode string */
894 /*******************************************************************
895 makes a SAM_ENTRY1 structure.
896 ********************************************************************/
897 static BOOL make_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx,
898 uint32 len_sam_name, uint32 len_sam_full, uint32 len_sam_desc,
899 uint32 rid_user, uint16 acb_info)
901 if (sam == NULL) return False;
903 DEBUG(5,("make_sam_entry1\n"));
905 sam->user_idx = user_idx;
906 sam->rid_user = rid_user;
907 sam->acb_info = acb_info;
910 make_uni_hdr(&(sam->hdr_acct_name), len_sam_name);
911 make_uni_hdr(&(sam->hdr_user_name), len_sam_full);
912 make_uni_hdr(&(sam->hdr_user_desc), len_sam_desc);
917 /*******************************************************************
918 reads or writes a SAM_ENTRY1 structure.
919 ********************************************************************/
920 static BOOL sam_io_sam_entry1(char *desc, SAM_ENTRY1 *sam, prs_struct *ps, int depth)
922 if (sam == NULL) return False;
924 prs_debug(ps, depth, desc, "sam_io_sam_entry1");
929 prs_uint32("user_idx ", ps, depth, &(sam->user_idx ));
931 prs_uint32("rid_user ", ps, depth, &(sam->rid_user ));
932 prs_uint16("acb_info ", ps, depth, &(sam->acb_info ));
933 prs_uint16("pad ", ps, depth, &(sam->pad ));
935 smb_io_unihdr("unihdr", &(sam->hdr_acct_name), ps, depth); /* account name unicode string header */
936 smb_io_unihdr("unihdr", &(sam->hdr_user_name), ps, depth); /* account name unicode string header */
937 smb_io_unihdr("unihdr", &(sam->hdr_user_desc), ps, depth); /* account name unicode string header */
942 /*******************************************************************
943 reads or writes a SAM_STR2 structure.
944 ********************************************************************/
945 static BOOL sam_io_sam_str2(char *desc, SAM_STR2 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth)
947 if (sam == NULL) return False;
949 prs_debug(ps, depth, desc, "sam_io_sam_str2");
954 smb_io_unistr2("unistr2", &(sam->uni_srv_name), acct_buf, ps, depth); /* account name unicode string */
956 smb_io_unistr2("unistr2", &(sam->uni_srv_desc), desc_buf, ps, depth); /* account desc unicode string */
962 /*******************************************************************
963 makes a SAM_ENTRY2 structure.
964 ********************************************************************/
965 static BOOL make_sam_entry2(SAM_ENTRY2 *sam, uint32 user_idx,
966 uint32 len_sam_name, uint32 len_sam_desc,
967 uint32 rid_user, uint16 acb_info)
969 if (sam == NULL) return False;
971 DEBUG(5,("make_sam_entry2\n"));
973 sam->user_idx = user_idx;
974 sam->rid_user = rid_user;
975 sam->acb_info = acb_info;
978 make_uni_hdr(&(sam->hdr_srv_name), len_sam_name);
979 make_uni_hdr(&(sam->hdr_srv_desc), len_sam_desc);
984 /*******************************************************************
985 reads or writes a SAM_ENTRY2 structure.
986 ********************************************************************/
987 static BOOL sam_io_sam_entry2(char *desc, SAM_ENTRY2 *sam, prs_struct *ps, int depth)
989 if (sam == NULL) return False;
991 prs_debug(ps, depth, desc, "sam_io_sam_entry2");
996 prs_uint32("user_idx ", ps, depth, &(sam->user_idx ));
998 prs_uint32("rid_user ", ps, depth, &(sam->rid_user ));
999 prs_uint16("acb_info ", ps, depth, &(sam->acb_info ));
1000 prs_uint16("pad ", ps, depth, &(sam->pad ));
1002 smb_io_unihdr("unihdr", &(sam->hdr_srv_name), ps, depth); /* account name unicode string header */
1003 smb_io_unihdr("unihdr", &(sam->hdr_srv_desc), ps, depth); /* account name unicode string header */
1008 /*******************************************************************
1009 reads or writes a SAM_STR3 structure.
1010 ********************************************************************/
1011 static BOOL sam_io_sam_str3(char *desc, SAM_STR3 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth)
1013 if (sam == NULL) return False;
1015 prs_debug(ps, depth, desc, "sam_io_sam_str3");
1020 smb_io_unistr2("unistr2", &(sam->uni_grp_name), acct_buf, ps, depth); /* account name unicode string */
1022 smb_io_unistr2("unistr2", &(sam->uni_grp_desc), desc_buf, ps, depth); /* account desc unicode string */
1028 /*******************************************************************
1029 makes a SAM_ENTRY3 structure.
1030 ********************************************************************/
1031 static BOOL make_sam_entry3(SAM_ENTRY3 *sam, uint32 grp_idx,
1032 uint32 len_grp_name, uint32 len_grp_desc, uint32 rid_grp)
1034 if (sam == NULL) return False;
1036 DEBUG(5,("make_sam_entry3\n"));
1038 sam->grp_idx = grp_idx;
1039 sam->rid_grp = rid_grp;
1040 sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */
1042 make_uni_hdr(&(sam->hdr_grp_name), len_grp_name);
1043 make_uni_hdr(&(sam->hdr_grp_desc), len_grp_desc);
1048 /*******************************************************************
1049 reads or writes a SAM_ENTRY3 structure.
1050 ********************************************************************/
1051 static BOOL sam_io_sam_entry3(char *desc, SAM_ENTRY3 *sam, prs_struct *ps, int depth)
1053 if (sam == NULL) return False;
1055 prs_debug(ps, depth, desc, "sam_io_sam_entry3");
1060 prs_uint32("grp_idx", ps, depth, &(sam->grp_idx));
1062 prs_uint32("rid_grp", ps, depth, &(sam->rid_grp));
1063 prs_uint32("attr ", ps, depth, &(sam->attr ));
1065 smb_io_unihdr("unihdr", &(sam->hdr_grp_name), ps, depth); /* account name unicode string header */
1066 smb_io_unihdr("unihdr", &(sam->hdr_grp_desc), ps, depth); /* account name unicode string header */
1071 /*******************************************************************
1072 makes a SAM_ENTRY4 structure.
1073 ********************************************************************/
1074 static BOOL make_sam_entry4(SAM_ENTRY4 *sam, uint32 user_idx,
1075 uint32 len_acct_name)
1077 if (sam == NULL) return False;
1079 DEBUG(5,("make_sam_entry4\n"));
1081 sam->user_idx = user_idx;
1082 make_str_hdr(&(sam->hdr_acct_name), len_acct_name, len_acct_name,
1083 len_acct_name != 0);
1088 /*******************************************************************
1089 reads or writes a SAM_ENTRY4 structure.
1090 ********************************************************************/
1091 static BOOL sam_io_sam_entry4(char *desc, SAM_ENTRY4 *sam, prs_struct *ps, int depth)
1093 if (sam == NULL) return False;
1095 prs_debug(ps, depth, desc, "sam_io_sam_entry4");
1100 prs_uint32("user_idx", ps, depth, &(sam->user_idx));
1101 smb_io_strhdr("strhdr", &(sam->hdr_acct_name), ps, depth);
1106 /*******************************************************************
1107 makes a SAM_ENTRY5 structure.
1108 ********************************************************************/
1109 static BOOL make_sam_entry5(SAM_ENTRY5 *sam, uint32 grp_idx,
1110 uint32 len_grp_name)
1112 if (sam == NULL) return False;
1114 DEBUG(5,("make_sam_entry5\n"));
1116 sam->grp_idx = grp_idx;
1117 make_str_hdr(&(sam->hdr_grp_name), len_grp_name, len_grp_name,
1123 /*******************************************************************
1124 reads or writes a SAM_ENTRY5 structure.
1125 ********************************************************************/
1126 static BOOL sam_io_sam_entry5(char *desc, SAM_ENTRY5 *sam, prs_struct *ps, int depth)
1128 if (sam == NULL) return False;
1130 prs_debug(ps, depth, desc, "sam_io_sam_entry5");
1135 prs_uint32("grp_idx", ps, depth, &(sam->grp_idx));
1136 smb_io_strhdr("strhdr", &(sam->hdr_grp_name), ps, depth);
1141 /*******************************************************************
1142 makes a SAM_ENTRY structure.
1143 ********************************************************************/
1144 static BOOL make_sam_entry(SAM_ENTRY *sam, uint32 len_sam_name, uint32 rid)
1146 if (sam == NULL) return False;
1148 DEBUG(10,("make_sam_entry: %d %d\n", len_sam_name, rid));
1151 make_uni_hdr(&(sam->hdr_name), len_sam_name);
1156 /*******************************************************************
1157 reads or writes a SAM_ENTRY structure.
1158 ********************************************************************/
1159 static BOOL sam_io_sam_entry(char *desc, SAM_ENTRY *sam, prs_struct *ps, int depth)
1161 if (sam == NULL) return False;
1163 prs_debug(ps, depth, desc, "sam_io_sam_entry");
1167 prs_uint32("rid", ps, depth, &(sam->rid ));
1168 smb_io_unihdr("unihdr", &(sam->hdr_name), ps, depth); /* account name unicode string header */
1174 /*******************************************************************
1175 makes a SAMR_Q_ENUM_DOM_USERS structure.
1176 ********************************************************************/
1177 BOOL make_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, POLICY_HND *pol,
1179 uint16 acb_mask, uint16 unk_1, uint32 size)
1181 if (q_e == NULL || pol == NULL) return False;
1183 DEBUG(5,("make_samr_q_enum_dom_users\n"));
1185 memcpy(&(q_e->pol), pol, sizeof(*pol));
1187 q_e->start_idx = start_idx; /* zero indicates lots */
1188 q_e->acb_mask = acb_mask;
1189 q_e->unknown_1 = unk_1;
1190 q_e->max_size = size;
1195 /*******************************************************************
1196 reads or writes a structure.
1197 ********************************************************************/
1198 BOOL samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS *q_e, prs_struct *ps, int depth)
1200 if (q_e == NULL) return False;
1202 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_users");
1207 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
1210 prs_uint32("start_idx", ps, depth, &(q_e->start_idx));
1211 prs_uint16("acb_mask ", ps, depth, &(q_e->acb_mask ));
1212 prs_uint16("unknown_1", ps, depth, &(q_e->unknown_1));
1214 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
1222 /*******************************************************************
1223 makes a SAMR_R_ENUM_DOM_USERS structure.
1224 ********************************************************************/
1225 BOOL make_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS *r_u,
1227 uint32 num_sam_entries, SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES], uint32 status)
1231 if (r_u == NULL) return False;
1233 DEBUG(5,("make_samr_r_enum_dom_users\n"));
1235 r_u->next_idx = next_idx;
1237 r_u->uni_acct_name = NULL;
1239 if (num_sam_entries != 0)
1241 r_u->ptr_entries1 = 1;
1242 r_u->ptr_entries2 = 1;
1243 r_u->num_entries2 = num_sam_entries;
1244 r_u->num_entries3 = num_sam_entries;
1246 r_u->sam = (SAM_ENTRY*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->sam[0]));
1247 r_u->uni_acct_name = (UNISTR2*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->uni_acct_name[0]));
1249 if (r_u->sam == NULL || r_u->uni_acct_name == NULL)
1251 DEBUG(0,("NULL pointers in SAMR_R_QUERY_DISPINFO\n"));
1255 for (i = 0; i < num_sam_entries; i++)
1257 make_sam_entry(&(r_u->sam[i]),
1258 pass[i].uni_user_name.uni_str_len,
1261 copy_unistr2(&(r_u->uni_acct_name[i]), &(pass[i].uni_user_name));
1264 r_u->num_entries4 = num_sam_entries;
1268 r_u->ptr_entries1 = 0;
1269 r_u->num_entries2 = num_sam_entries;
1270 r_u->ptr_entries2 = 1;
1273 r_u->status = status;
1278 /*******************************************************************
1279 reads or writes a structure.
1280 ********************************************************************/
1281 BOOL samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struct *ps, int depth)
1285 if (r_u == NULL) return False;
1287 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_users");
1292 prs_uint32("next_idx ", ps, depth, &(r_u->next_idx ));
1293 prs_uint32("ptr_entries1", ps, depth, &(r_u->ptr_entries1));
1295 if (r_u->ptr_entries1 != 0)
1297 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
1298 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
1299 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
1303 r_u->sam = (SAM_ENTRY*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->sam[0]));
1304 r_u->uni_acct_name = (UNISTR2*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->uni_acct_name[0]));
1307 if ((r_u->sam == NULL || r_u->uni_acct_name == NULL) && r_u->num_entries2 != 0)
1309 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_USERS\n"));
1310 r_u->num_entries4 = 0;
1311 r_u->status = 0xC0000000|NT_STATUS_MEMORY_NOT_ALLOCATED;
1315 for (i = 0; i < r_u->num_entries2; i++)
1317 sam_io_sam_entry("", &(r_u->sam[i]), ps, depth);
1320 for (i = 0; i < r_u->num_entries2; i++)
1322 smb_io_unistr2("", &(r_u->uni_acct_name[i]), r_u->sam[i].hdr_name.buffer, ps, depth);
1330 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
1331 prs_uint32("status", ps, depth, &(r_u->status));
1336 /*******************************************************************
1337 makes a SAMR_Q_QUERY_DISPINFO structure.
1338 ********************************************************************/
1339 BOOL make_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_e, POLICY_HND *pol,
1340 uint16 switch_level, uint32 start_idx,
1343 if (q_e == NULL || pol == NULL) return False;
1345 DEBUG(5,("make_samr_q_query_dispinfo\n"));
1347 memcpy(&(q_e->domain_pol), pol, sizeof(*pol));
1349 q_e->switch_level = switch_level;
1351 q_e->start_idx = start_idx;
1352 q_e->max_entries = max_entries;
1353 q_e->max_size = 0xffff; /* Not especially useful */
1358 /*******************************************************************
1359 reads or writes a structure.
1360 ********************************************************************/
1361 BOOL samr_io_q_query_dispinfo(char *desc, SAMR_Q_QUERY_DISPINFO *q_e, prs_struct *ps, int depth)
1363 if (q_e == NULL) return False;
1365 prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo");
1370 smb_io_pol_hnd("domain_pol", &(q_e->domain_pol), ps, depth);
1373 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
1376 prs_uint32("start_idx ", ps, depth, &(q_e->start_idx ));
1377 prs_uint32("max_entries ", ps, depth, &(q_e->max_entries ));
1378 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
1384 /*******************************************************************
1385 makes a SAM_DISPINFO_1 structure.
1386 ********************************************************************/
1387 BOOL make_sam_dispinfo_1(SAM_DISPINFO_1 *sam, uint32 *num_entries,
1388 uint32 *data_size, uint32 start_idx,
1389 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
1391 uint32 len_sam_name, len_sam_full, len_sam_desc;
1392 uint32 max_entries, max_data_size;
1396 if (sam == NULL || num_entries == NULL || data_size == NULL) return False;
1398 DEBUG(5,("make_sam_dispinfo_1\n"));
1400 max_entries = *num_entries;
1401 max_data_size = *data_size;
1403 for (i = 0; (i < max_entries) && (dsize < max_data_size); i++)
1405 len_sam_name = pass[i].uni_user_name.uni_str_len;
1406 len_sam_full = pass[i].uni_full_name.uni_str_len;
1407 len_sam_desc = pass[i].uni_acct_desc.uni_str_len;
1409 make_sam_entry1(&(sam->sam[i]), start_idx + i + 1,
1410 len_sam_name, len_sam_full, len_sam_desc,
1411 pass[i].user_rid, pass[i].acb_info);
1413 copy_unistr2(&(sam->str[i].uni_acct_name), &(pass[i].uni_user_name));
1414 copy_unistr2(&(sam->str[i].uni_full_name), &(pass[i].uni_full_name));
1415 copy_unistr2(&(sam->str[i].uni_acct_desc), &(pass[i].uni_acct_desc));
1417 dsize += sizeof(SAM_ENTRY1);
1418 dsize += len_sam_name + len_sam_full + len_sam_desc;
1427 /*******************************************************************
1428 reads or writes a structure.
1429 ********************************************************************/
1430 static BOOL sam_io_sam_dispinfo_1(char *desc, SAM_DISPINFO_1 *sam, uint32 num_entries, prs_struct *ps, int depth)
1434 if (sam == NULL) return False;
1436 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_1");
1441 SMB_ASSERT_ARRAY(sam->sam, num_entries);
1443 for (i = 0; i < num_entries; i++)
1445 sam_io_sam_entry1("", &(sam->sam[i]), ps, depth);
1448 for (i = 0; i < num_entries; i++)
1450 sam_io_sam_str1 ("", &(sam->str[i]),
1451 sam->sam[i].hdr_acct_name.buffer,
1452 sam->sam[i].hdr_user_name.buffer,
1453 sam->sam[i].hdr_user_desc.buffer,
1461 /*******************************************************************
1462 makes a SAM_DISPINFO_2 structure.
1463 ********************************************************************/
1464 BOOL make_sam_dispinfo_2(SAM_DISPINFO_2 *sam, uint32 *num_entries,
1465 uint32 *data_size, uint32 start_idx,
1466 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
1468 uint32 len_sam_name, len_sam_desc;
1469 uint32 max_entries, max_data_size;
1473 if (sam == NULL || num_entries == NULL || data_size == NULL) return False;
1475 DEBUG(5,("make_sam_dispinfo_2\n"));
1477 max_entries = *num_entries;
1478 max_data_size = *data_size;
1480 for (i = 0; (i < max_entries) && (dsize < max_data_size); i++)
1482 len_sam_name = pass[i].uni_user_name.uni_str_len;
1483 len_sam_desc = pass[i].uni_acct_desc.uni_str_len;
1485 make_sam_entry2(&(sam->sam[i]), start_idx + i + 1,
1486 len_sam_name, len_sam_desc,
1487 pass[i].user_rid, pass[i].acb_info);
1489 copy_unistr2(&(sam->str[i].uni_srv_name), &(pass[i].uni_user_name));
1490 copy_unistr2(&(sam->str[i].uni_srv_desc), &(pass[i].uni_acct_desc));
1492 dsize += sizeof(SAM_ENTRY2);
1493 dsize += len_sam_name + len_sam_desc;
1502 /*******************************************************************
1503 reads or writes a structure.
1504 ********************************************************************/
1505 static BOOL sam_io_sam_dispinfo_2(char *desc, SAM_DISPINFO_2 *sam, uint32 num_entries, prs_struct *ps, int depth)
1509 if (sam == NULL) return False;
1511 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_2");
1516 SMB_ASSERT_ARRAY(sam->sam, num_entries);
1518 for (i = 0; i < num_entries; i++)
1520 sam_io_sam_entry2("", &(sam->sam[i]), ps, depth);
1523 for (i = 0; i < num_entries; i++)
1525 sam_io_sam_str2 ("", &(sam->str[i]),
1526 sam->sam[i].hdr_srv_name.buffer,
1527 sam->sam[i].hdr_srv_desc.buffer,
1535 /*******************************************************************
1536 makes a SAM_DISPINFO_3 structure.
1537 ********************************************************************/
1538 BOOL make_sam_dispinfo_3(SAM_DISPINFO_3 *sam, uint32 *num_entries,
1539 uint32 *data_size, uint32 start_idx,
1542 uint32 len_sam_name, len_sam_desc;
1543 uint32 max_entries, max_data_size;
1547 if (sam == NULL || num_entries == NULL || data_size == NULL) return False;
1549 DEBUG(5,("make_sam_dispinfo_3\n"));
1551 max_entries = *num_entries;
1552 max_data_size = *data_size;
1554 for (i = 0; (i < max_entries) && (dsize < max_data_size); i++)
1556 len_sam_name = strlen(grp[i].name);
1557 len_sam_desc = strlen(grp[i].comment);
1559 make_sam_entry3(&(sam->sam[i]), start_idx + i + 1,
1560 len_sam_name, len_sam_desc,
1563 make_unistr2(&(sam->str[i].uni_grp_name), grp[i].name , len_sam_name);
1564 make_unistr2(&(sam->str[i].uni_grp_desc), grp[i].comment, len_sam_desc);
1566 dsize += sizeof(SAM_ENTRY3);
1567 dsize += (len_sam_name + len_sam_desc) * 2;
1576 /*******************************************************************
1577 reads or writes a structure.
1578 ********************************************************************/
1579 static BOOL sam_io_sam_dispinfo_3(char *desc, SAM_DISPINFO_3 *sam, uint32 num_entries, prs_struct *ps, int depth)
1583 if (sam == NULL) return False;
1585 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_3");
1590 SMB_ASSERT_ARRAY(sam->sam, num_entries);
1592 for (i = 0; i < num_entries; i++)
1594 sam_io_sam_entry3("", &(sam->sam[i]), ps, depth);
1597 for (i = 0; i < num_entries; i++)
1599 sam_io_sam_str3 ("", &(sam->str[i]),
1600 sam->sam[i].hdr_grp_name.buffer,
1601 sam->sam[i].hdr_grp_desc.buffer,
1609 /*******************************************************************
1610 makes a SAM_DISPINFO_4 structure.
1611 ********************************************************************/
1612 BOOL make_sam_dispinfo_4(SAM_DISPINFO_4 *sam, uint32 *num_entries,
1613 uint32 *data_size, uint32 start_idx,
1614 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
1617 uint32 len_sam_name;
1618 uint32 max_entries, max_data_size;
1622 if (sam == NULL || num_entries == NULL || data_size == NULL) return False;
1624 DEBUG(5,("make_sam_dispinfo_4\n"));
1626 max_entries = *num_entries;
1627 max_data_size = *data_size;
1629 for (i = 0; (i < max_entries) && (dsize < max_data_size); i++)
1631 len_sam_name = pass[i].uni_user_name.uni_str_len;
1633 make_sam_entry4(&(sam->sam[i]), start_idx + i + 1,
1636 unistr2_to_ascii(sam_name, &(pass[i].uni_user_name), sizeof(sam_name));
1637 make_string2(&(sam->str[i].acct_name), sam_name, len_sam_name);
1639 dsize += sizeof(SAM_ENTRY4);
1640 dsize += len_sam_name;
1649 /*******************************************************************
1650 reads or writes a structure.
1651 ********************************************************************/
1652 static BOOL sam_io_sam_dispinfo_4(char *desc, SAM_DISPINFO_4 *sam, uint32 num_entries, prs_struct *ps, int depth)
1656 if (sam == NULL) return False;
1658 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_4");
1663 SMB_ASSERT_ARRAY(sam->sam, num_entries);
1665 for (i = 0; i < num_entries; i++)
1667 sam_io_sam_entry4("", &(sam->sam[i]), ps, depth);
1670 for (i = 0; i < num_entries; i++)
1672 smb_io_string2("acct_name", &(sam->str[i].acct_name),
1673 sam->sam[i].hdr_acct_name.buffer, ps, depth);
1680 /*******************************************************************
1681 makes a SAM_DISPINFO_5 structure.
1682 ********************************************************************/
1683 BOOL make_sam_dispinfo_5(SAM_DISPINFO_5 *sam, uint32 *num_entries,
1684 uint32 *data_size, uint32 start_idx,
1687 uint32 len_sam_name;
1688 uint32 max_entries, max_data_size;
1692 if (sam == NULL || num_entries == NULL || data_size == NULL) return False;
1694 DEBUG(5,("make_sam_dispinfo_5\n"));
1696 max_entries = *num_entries;
1697 max_data_size = *data_size;
1699 for (i = 0; (i < max_entries) && (dsize < max_data_size); i++)
1701 len_sam_name = strlen(grp[i].name);
1703 make_sam_entry5(&(sam->sam[i]), start_idx + i + 1,
1706 make_string2(&(sam->str[i].grp_name), grp[i].name,
1709 dsize += sizeof(SAM_ENTRY5);
1710 dsize += len_sam_name;
1719 /*******************************************************************
1720 reads or writes a structure.
1721 ********************************************************************/
1722 static BOOL sam_io_sam_dispinfo_5(char *desc, SAM_DISPINFO_5 *sam, uint32 num_entries, prs_struct *ps, int depth)
1726 if (sam == NULL) return False;
1728 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_5");
1733 SMB_ASSERT_ARRAY(sam->sam, num_entries);
1735 for (i = 0; i < num_entries; i++)
1737 sam_io_sam_entry5("", &(sam->sam[i]), ps, depth);
1740 for (i = 0; i < num_entries; i++)
1742 smb_io_string2("grp_name", &(sam->str[i].grp_name),
1743 sam->sam[i].hdr_grp_name.buffer, ps, depth);
1750 /*******************************************************************
1751 makes a SAMR_R_QUERY_DISPINFO structure.
1752 ********************************************************************/
1753 BOOL make_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO *r_u,
1754 uint32 num_entries, uint32 data_size,
1755 uint16 switch_level, SAM_DISPINFO_CTR *ctr,
1758 if (r_u == NULL) return False;
1760 DEBUG(5,("make_samr_r_query_dispinfo: level %d\n", switch_level));
1762 r_u->total_size = 0; /* not calculated */
1763 r_u->data_size = data_size;
1765 r_u->switch_level = switch_level;
1766 r_u->num_entries = num_entries;
1767 r_u->ptr_entries = 1;
1768 r_u->num_entries2 = num_entries;
1771 r_u->status = status;
1777 /*******************************************************************
1778 reads or writes a structure.
1779 ********************************************************************/
1780 BOOL samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struct *ps, int depth)
1782 if (r_u == NULL) return False;
1784 prs_debug(ps, depth, desc, "samr_io_r_query_dispinfo");
1789 prs_uint32("total_size ", ps, depth, &(r_u->total_size ));
1790 prs_uint32("data_size ", ps, depth, &(r_u->data_size ));
1791 prs_uint16("switch_level", ps, depth, &(r_u->switch_level));
1794 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries ));
1795 prs_uint32("ptr_entries ", ps, depth, &(r_u->ptr_entries ));
1796 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
1798 switch (r_u->switch_level)
1802 sam_io_sam_dispinfo_1("users", r_u->ctr->sam.info1, r_u->num_entries, ps, depth);
1807 sam_io_sam_dispinfo_2("servers", r_u->ctr->sam.info2, r_u->num_entries, ps, depth);
1812 sam_io_sam_dispinfo_3("groups", r_u->ctr->sam.info3, r_u->num_entries, ps, depth);
1817 sam_io_sam_dispinfo_4("user list", r_u->ctr->sam.info4,r_u->num_entries, ps, depth);
1822 sam_io_sam_dispinfo_5("group list", r_u->ctr->sam.info5, r_u->num_entries, ps, depth);
1827 DEBUG(5,("samr_io_r_query_dispinfo: unknown switch value\n"));
1834 prs_uint32("status", ps, depth, &(r_u->status));
1840 /*******************************************************************
1841 makes a SAMR_Q_OPEN_GROUP structure.
1842 ********************************************************************/
1843 BOOL make_samr_q_open_group(SAMR_Q_OPEN_GROUP *q_c,
1844 const POLICY_HND *hnd, uint32 unk, uint32 rid)
1846 if (q_c == NULL || hnd == NULL) return False;
1848 DEBUG(5,("make_samr_q_open_group\n"));
1850 memcpy(&(q_c->domain_pol), hnd, sizeof(q_c->domain_pol));
1852 q_c->rid_group = rid;
1857 /*******************************************************************
1858 reads or writes a structure.
1859 ********************************************************************/
1860 BOOL samr_io_q_open_group(char *desc, SAMR_Q_OPEN_GROUP *q_u, prs_struct *ps, int depth)
1862 if (q_u == NULL) return False;
1864 prs_debug(ps, depth, desc, "samr_io_q_open_group");
1869 smb_io_pol_hnd("domain_pol", &(q_u->domain_pol), ps, depth);
1871 prs_uint32("unknown ", ps, depth, &(q_u->unknown ));
1872 prs_uint32("rid_group", ps, depth, &(q_u->rid_group));
1877 /*******************************************************************
1878 reads or writes a structure.
1879 ********************************************************************/
1880 BOOL samr_io_r_open_group(char *desc, SAMR_R_OPEN_GROUP *r_u, prs_struct *ps, int depth)
1882 if (r_u == NULL) return False;
1884 prs_debug(ps, depth, desc, "samr_io_r_open_group");
1889 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
1892 prs_uint32("status", ps, depth, &(r_u->status));
1898 /*******************************************************************
1899 makes a GROUP_INFO1 structure.
1900 ********************************************************************/
1901 BOOL make_samr_group_info1(GROUP_INFO1 *gr1,
1902 char *acct_name, char *acct_desc,
1905 int desc_len = acct_desc != NULL ? strlen(acct_desc) : 0;
1906 int acct_len = acct_name != NULL ? strlen(acct_name) : 0;
1907 if (gr1 == NULL) return False;
1909 DEBUG(5,("make_samr_group_info1\n"));
1911 make_uni_hdr(&(gr1->hdr_acct_name), acct_len);
1913 gr1->unknown_1 = 0x3;
1914 gr1->num_members = num_members;
1916 make_uni_hdr(&(gr1->hdr_acct_desc), desc_len);
1918 make_unistr2(&(gr1->uni_acct_name), acct_name, acct_len);
1919 make_unistr2(&(gr1->uni_acct_desc), acct_desc, desc_len);
1925 /*******************************************************************
1926 reads or writes a structure.
1927 ********************************************************************/
1928 BOOL samr_io_group_info1(char *desc, GROUP_INFO1 *gr1, prs_struct *ps, int depth)
1930 if (gr1 == NULL) return False;
1932 prs_debug(ps, depth, desc, "samr_io_group_info1");
1937 smb_io_unihdr ("hdr_acct_name", &(gr1->hdr_acct_name) , ps, depth);
1939 prs_uint32("unknown_1", ps, depth, &(gr1->unknown_1));
1940 prs_uint32("num_members", ps, depth, &(gr1->num_members));
1942 smb_io_unihdr ("hdr_acct_desc", &(gr1->hdr_acct_desc) , ps, depth);
1944 smb_io_unistr2("uni_acct_name", &(gr1->uni_acct_name), gr1->hdr_acct_name.buffer, ps, depth);
1947 smb_io_unistr2("uni_acct_desc", &(gr1->uni_acct_desc), gr1->hdr_acct_desc.buffer, ps, depth);
1953 /*******************************************************************
1954 makes a GROUP_INFO4 structure.
1955 ********************************************************************/
1956 BOOL make_samr_group_info4(GROUP_INFO4 *gr4, const char *acct_desc)
1958 int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0;
1959 if (gr4 == NULL) return False;
1961 DEBUG(5,("make_samr_group_info4\n"));
1963 make_uni_hdr(&(gr4->hdr_acct_desc), acct_len);
1964 make_unistr2(&(gr4->uni_acct_desc), acct_desc, acct_len);
1970 /*******************************************************************
1971 reads or writes a structure.
1972 ********************************************************************/
1973 BOOL samr_io_group_info4(char *desc, GROUP_INFO4 *gr4, prs_struct *ps, int depth)
1975 if (gr4 == NULL) return False;
1977 prs_debug(ps, depth, desc, "samr_io_group_info4");
1982 smb_io_unihdr ("hdr_acct_desc", &(gr4->hdr_acct_desc) , ps, depth);
1983 smb_io_unistr2("uni_acct_desc", &(gr4->uni_acct_desc), gr4->hdr_acct_desc.buffer, ps, depth);
1989 /*******************************************************************
1990 reads or writes a structure.
1991 ********************************************************************/
1992 BOOL samr_group_info_ctr(char *desc, GROUP_INFO_CTR *ctr, prs_struct *ps, int depth)
1994 if (ctr == NULL) return False;
1996 prs_debug(ps, depth, desc, "samr_group_info_ctr");
1999 prs_uint16("switch_value1", ps, depth, &(ctr->switch_value1));
2000 prs_uint16("switch_value2", ps, depth, &(ctr->switch_value2));
2002 switch (ctr->switch_value1)
2006 samr_io_group_info1("group_info1", &(ctr->group.info1), ps, depth);
2011 samr_io_group_info4("group_info4", &(ctr->group.info4), ps, depth);
2016 DEBUG(4,("samr_group_info_ctr: unsupported switch level\n"));
2027 /*******************************************************************
2028 makes a SAMR_Q_CREATE_DOM_GROUP structure.
2029 ********************************************************************/
2030 BOOL make_samr_q_create_dom_group(SAMR_Q_CREATE_DOM_GROUP *q_e,
2032 const char *acct_desc)
2034 int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0;
2035 if (q_e == NULL || pol == NULL) return False;
2037 DEBUG(5,("make_samr_q_create_dom_group\n"));
2039 memcpy(&(q_e->pol), pol, sizeof(*pol));
2041 make_uni_hdr(&(q_e->hdr_acct_desc), acct_len);
2042 make_unistr2(&(q_e->uni_acct_desc), acct_desc, acct_len);
2044 q_e->unknown_1 = 0x0002;
2045 q_e->unknown_2 = 0x0001;
2051 /*******************************************************************
2052 reads or writes a structure.
2053 ********************************************************************/
2054 BOOL samr_io_q_create_dom_group(char *desc, SAMR_Q_CREATE_DOM_GROUP *q_e, prs_struct *ps, int depth)
2056 if (q_e == NULL) return False;
2058 prs_debug(ps, depth, desc, "samr_io_q_create_dom_group");
2063 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
2066 smb_io_unihdr ("hdr_acct_desc", &(q_e->hdr_acct_desc), ps, depth);
2067 smb_io_unistr2("uni_acct_desc", &(q_e->uni_acct_desc), q_e->hdr_acct_desc.buffer, ps, depth);
2070 prs_uint16("unknown_1", ps, depth, &(q_e->unknown_1));
2071 prs_uint16("unknown_2", ps, depth, &(q_e->unknown_2));
2077 /*******************************************************************
2078 makes a SAMR_R_CREATE_DOM_GROUP structure.
2079 ********************************************************************/
2080 BOOL make_samr_r_create_dom_group(SAMR_R_CREATE_DOM_GROUP *r_u, POLICY_HND *pol,
2081 uint32 rid, uint32 status)
2083 if (r_u == NULL) return False;
2085 DEBUG(5,("make_samr_r_create_dom_group\n"));
2087 memcpy(&(r_u->pol), pol, sizeof(*pol));
2090 r_u->status = status;
2096 /*******************************************************************
2097 reads or writes a structure.
2098 ********************************************************************/
2099 BOOL samr_io_r_create_dom_group(char *desc, SAMR_R_CREATE_DOM_GROUP *r_u, prs_struct *ps, int depth)
2101 if (r_u == NULL) return False;
2103 prs_debug(ps, depth, desc, "samr_io_r_create_dom_group");
2108 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
2111 prs_uint32("rid ", ps, depth, &(r_u->rid ));
2112 prs_uint32("status", ps, depth, &(r_u->status));
2117 /*******************************************************************
2118 makes a SAMR_Q_DELETE_DOM_GROUP structure.
2119 ********************************************************************/
2120 BOOL make_samr_q_delete_dom_group(SAMR_Q_DELETE_DOM_GROUP *q_c, POLICY_HND *hnd)
2122 if (q_c == NULL || hnd == NULL) return False;
2124 DEBUG(5,("make_samr_q_delete_dom_group\n"));
2126 memcpy(&(q_c->group_pol), hnd, sizeof(q_c->group_pol));
2131 /*******************************************************************
2132 reads or writes a structure.
2133 ********************************************************************/
2134 BOOL samr_io_q_delete_dom_group(char *desc, SAMR_Q_DELETE_DOM_GROUP *q_u, prs_struct *ps, int depth)
2136 if (q_u == NULL) return False;
2138 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_group");
2143 smb_io_pol_hnd("group_pol", &(q_u->group_pol), ps, depth);
2148 /*******************************************************************
2149 makes a SAMR_R_DELETE_DOM_GROUP structure.
2150 ********************************************************************/
2151 BOOL make_samr_r_delete_dom_group(SAMR_R_DELETE_DOM_GROUP *r_u,
2154 if (r_u == NULL) return False;
2156 DEBUG(5,("make_samr_r_delete_dom_group\n"));
2158 r_u->status = status;
2163 /*******************************************************************
2164 reads or writes a structure.
2165 ********************************************************************/
2166 BOOL samr_io_r_delete_dom_group(char *desc, SAMR_R_DELETE_DOM_GROUP *r_u, prs_struct *ps, int depth)
2168 if (r_u == NULL) return False;
2170 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_group");
2175 prs_uint32("status", ps, depth, &(r_u->status));
2182 /*******************************************************************
2183 makes a SAMR_Q_DEL_GROUPMEM structure.
2184 ********************************************************************/
2185 BOOL make_samr_q_del_groupmem(SAMR_Q_DEL_GROUPMEM *q_e,
2189 if (q_e == NULL || pol == NULL) return False;
2191 DEBUG(5,("make_samr_q_del_groupmem\n"));
2193 memcpy(&(q_e->pol), pol, sizeof(*pol));
2201 /*******************************************************************
2202 reads or writes a structure.
2203 ********************************************************************/
2204 BOOL samr_io_q_del_groupmem(char *desc, SAMR_Q_DEL_GROUPMEM *q_e, prs_struct *ps, int depth)
2206 if (q_e == NULL) return False;
2208 prs_debug(ps, depth, desc, "samr_io_q_del_groupmem");
2213 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
2216 prs_uint32("rid ", ps, depth, &(q_e->rid));
2222 /*******************************************************************
2223 makes a SAMR_R_DEL_GROUPMEM structure.
2224 ********************************************************************/
2225 BOOL make_samr_r_del_groupmem(SAMR_R_DEL_GROUPMEM *r_u, POLICY_HND *pol,
2228 if (r_u == NULL) return False;
2230 DEBUG(5,("make_samr_r_del_groupmem\n"));
2232 r_u->status = status;
2238 /*******************************************************************
2239 reads or writes a structure.
2240 ********************************************************************/
2241 BOOL samr_io_r_del_groupmem(char *desc, SAMR_R_DEL_GROUPMEM *r_u, prs_struct *ps, int depth)
2243 if (r_u == NULL) return False;
2245 prs_debug(ps, depth, desc, "samr_io_r_del_groupmem");
2250 prs_uint32("status", ps, depth, &(r_u->status));
2256 /*******************************************************************
2257 makes a SAMR_Q_ADD_GROUPMEM structure.
2258 ********************************************************************/
2259 BOOL make_samr_q_add_groupmem(SAMR_Q_ADD_GROUPMEM *q_e,
2263 if (q_e == NULL || pol == NULL) return False;
2265 DEBUG(5,("make_samr_q_add_groupmem\n"));
2267 memcpy(&(q_e->pol), pol, sizeof(*pol));
2270 q_e->unknown = 0x0005;
2276 /*******************************************************************
2277 reads or writes a structure.
2278 ********************************************************************/
2279 BOOL samr_io_q_add_groupmem(char *desc, SAMR_Q_ADD_GROUPMEM *q_e, prs_struct *ps, int depth)
2281 if (q_e == NULL) return False;
2283 prs_debug(ps, depth, desc, "samr_io_q_add_groupmem");
2288 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
2291 prs_uint32("rid ", ps, depth, &(q_e->rid));
2292 prs_uint32("unknown", ps, depth, &(q_e->unknown));
2298 /*******************************************************************
2299 makes a SAMR_R_ADD_GROUPMEM structure.
2300 ********************************************************************/
2301 BOOL make_samr_r_add_groupmem(SAMR_R_ADD_GROUPMEM *r_u, POLICY_HND *pol,
2304 if (r_u == NULL) return False;
2306 DEBUG(5,("make_samr_r_add_groupmem\n"));
2308 r_u->status = status;
2314 /*******************************************************************
2315 reads or writes a structure.
2316 ********************************************************************/
2317 BOOL samr_io_r_add_groupmem(char *desc, SAMR_R_ADD_GROUPMEM *r_u, prs_struct *ps, int depth)
2319 if (r_u == NULL) return False;
2321 prs_debug(ps, depth, desc, "samr_io_r_add_groupmem");
2326 prs_uint32("status", ps, depth, &(r_u->status));
2332 /*******************************************************************
2333 makes a SAMR_Q_SET_GROUPINFO structure.
2334 ********************************************************************/
2335 BOOL make_samr_q_set_groupinfo(SAMR_Q_SET_GROUPINFO *q_e,
2336 POLICY_HND *pol, GROUP_INFO_CTR *ctr)
2338 if (q_e == NULL || pol == NULL) return False;
2340 DEBUG(5,("make_samr_q_set_groupinfo\n"));
2342 memcpy(&(q_e->pol), pol, sizeof(*pol));
2349 /*******************************************************************
2350 reads or writes a structure.
2351 ********************************************************************/
2352 BOOL samr_io_q_set_groupinfo(char *desc, SAMR_Q_SET_GROUPINFO *q_e, prs_struct *ps, int depth)
2354 if (q_e == NULL) return False;
2356 prs_debug(ps, depth, desc, "samr_io_q_set_groupinfo");
2361 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
2364 samr_group_info_ctr("ctr", q_e->ctr, ps, depth);
2370 /*******************************************************************
2371 makes a SAMR_R_SET_GROUPINFO structure.
2372 ********************************************************************/
2373 BOOL make_samr_r_set_groupinfo(SAMR_R_SET_GROUPINFO *r_u,
2376 if (r_u == NULL) return False;
2378 DEBUG(5,("make_samr_r_set_groupinfo\n"));
2380 r_u->status = status;
2386 /*******************************************************************
2387 reads or writes a structure.
2388 ********************************************************************/
2389 BOOL samr_io_r_set_groupinfo(char *desc, SAMR_R_SET_GROUPINFO *r_u, prs_struct *ps, int depth)
2391 if (r_u == NULL) return False;
2393 prs_debug(ps, depth, desc, "samr_io_r_set_groupinfo");
2398 prs_uint32("status", ps, depth, &(r_u->status));
2403 /*******************************************************************
2404 makes a SAMR_Q_QUERY_GROUPINFO structure.
2405 ********************************************************************/
2406 BOOL make_samr_q_query_groupinfo(SAMR_Q_QUERY_GROUPINFO *q_e,
2408 uint16 switch_level)
2410 if (q_e == NULL || pol == NULL) return False;
2412 DEBUG(5,("make_samr_q_query_groupinfo\n"));
2414 memcpy(&(q_e->pol), pol, sizeof(*pol));
2416 q_e->switch_level = switch_level;
2422 /*******************************************************************
2423 reads or writes a structure.
2424 ********************************************************************/
2425 BOOL samr_io_q_query_groupinfo(char *desc, SAMR_Q_QUERY_GROUPINFO *q_e, prs_struct *ps, int depth)
2427 if (q_e == NULL) return False;
2429 prs_debug(ps, depth, desc, "samr_io_q_query_groupinfo");
2434 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
2437 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
2443 /*******************************************************************
2444 makes a SAMR_R_QUERY_GROUPINFO structure.
2445 ********************************************************************/
2446 BOOL make_samr_r_query_groupinfo(SAMR_R_QUERY_GROUPINFO *r_u, GROUP_INFO_CTR *ctr,
2449 if (r_u == NULL) return False;
2451 DEBUG(5,("make_samr_r_query_groupinfo\n"));
2453 r_u->ptr = (status == 0x0 && ctr != NULL) ? 1 : 0;
2455 r_u->status = status;
2461 /*******************************************************************
2462 reads or writes a structure.
2463 ********************************************************************/
2464 BOOL samr_io_r_query_groupinfo(char *desc, SAMR_R_QUERY_GROUPINFO *r_u, prs_struct *ps, int depth)
2466 if (r_u == NULL) return False;
2468 prs_debug(ps, depth, desc, "samr_io_r_query_groupinfo");
2473 prs_uint32("ptr", ps, depth, &(r_u->ptr));
2477 samr_group_info_ctr("ctr", r_u->ctr, ps, depth);
2480 prs_uint32("status", ps, depth, &(r_u->status));
2486 /*******************************************************************
2487 makes a SAMR_Q_QUERY_GROUPMEM structure.
2488 ********************************************************************/
2489 BOOL make_samr_q_query_groupmem(SAMR_Q_QUERY_GROUPMEM *q_c, POLICY_HND *hnd)
2491 if (q_c == NULL || hnd == NULL) return False;
2493 DEBUG(5,("make_samr_q_query_groupmem\n"));
2495 memcpy(&(q_c->group_pol), hnd, sizeof(q_c->group_pol));
2500 /*******************************************************************
2501 reads or writes a structure.
2502 ********************************************************************/
2503 BOOL samr_io_q_query_groupmem(char *desc, SAMR_Q_QUERY_GROUPMEM *q_u, prs_struct *ps, int depth)
2505 if (q_u == NULL) return False;
2507 prs_debug(ps, depth, desc, "samr_io_q_query_groupmem");
2512 smb_io_pol_hnd("group_pol", &(q_u->group_pol), ps, depth);
2517 /*******************************************************************
2518 makes a SAMR_R_QUERY_GROUPMEM structure.
2519 ********************************************************************/
2520 BOOL make_samr_r_query_groupmem(SAMR_R_QUERY_GROUPMEM *r_u,
2521 uint32 num_entries, uint32 *rid, uint32 *attr, uint32 status)
2523 if (r_u == NULL) return False;
2525 DEBUG(5,("make_samr_r_query_groupmem\n"));
2530 r_u->num_entries = num_entries;
2532 r_u->ptr_attrs = attr != NULL ? 1 : 0;
2533 r_u->ptr_rids = rid != NULL ? 1 : 0;
2535 r_u->num_rids = num_entries;
2538 r_u->num_attrs = num_entries;
2544 r_u->num_entries = 0;
2547 r_u->status = status;
2552 /*******************************************************************
2553 reads or writes a structure.
2554 ********************************************************************/
2555 BOOL samr_io_r_query_groupmem(char *desc, SAMR_R_QUERY_GROUPMEM *r_u, prs_struct *ps, int depth)
2559 if (r_u == NULL) return False;
2561 prs_debug(ps, depth, desc, "samr_io_r_query_groupmem");
2566 prs_uint32("ptr", ps, depth, &(r_u->ptr));
2567 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries));
2571 prs_uint32("ptr_rids ", ps, depth, &(r_u->ptr_rids ));
2572 prs_uint32("ptr_attrs", ps, depth, &(r_u->ptr_attrs));
2574 if (r_u->ptr_rids != 0)
2576 prs_uint32("num_rids", ps, depth, &(r_u->num_rids));
2577 if (r_u->num_rids != 0)
2579 r_u->rid = (uint32*)Realloc(r_u->rid,
2580 sizeof(r_u->rid[0]) *
2582 if (r_u->rid == NULL)
2584 samr_free_r_query_groupmem(r_u);
2588 for (i = 0; i < r_u->num_rids; i++)
2590 prs_uint32("", ps, depth, &(r_u->rid[i]));
2594 if (r_u->ptr_attrs != 0)
2596 prs_uint32("num_attrs", ps, depth, &(r_u->num_attrs));
2598 if (r_u->num_attrs != 0)
2600 r_u->attr = (uint32*)Realloc(r_u->attr,
2601 sizeof(r_u->attr[0]) *
2603 if (r_u->attr == NULL)
2605 samr_free_r_query_groupmem(r_u);
2609 for (i = 0; i < r_u->num_attrs; i++)
2611 prs_uint32("", ps, depth, &(r_u->attr[i]));
2616 prs_uint32("status", ps, depth, &(r_u->status));
2620 /* storing. memory no longer needed */
2621 samr_free_r_query_groupmem(r_u);
2628 /*******************************************************************
2630 ********************************************************************/
2631 void samr_free_r_query_groupmem(SAMR_R_QUERY_GROUPMEM *r_u)
2633 if (r_u->rid != NULL)
2638 if (r_u->attr != NULL)
2645 /*******************************************************************
2646 makes a SAMR_Q_QUERY_USERGROUPS structure.
2647 ********************************************************************/
2648 BOOL make_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u,
2651 if (q_u == NULL || hnd == NULL) return False;
2653 DEBUG(5,("make_samr_q_query_usergroups\n"));
2655 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
2661 /*******************************************************************
2662 reads or writes a structure.
2663 ********************************************************************/
2664 BOOL samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS *q_u, prs_struct *ps, int depth)
2666 if (q_u == NULL) return False;
2668 prs_debug(ps, depth, desc, "samr_io_q_query_usergroups");
2673 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
2679 /*******************************************************************
2680 makes a SAMR_R_QUERY_USERGROUPS structure.
2681 ********************************************************************/
2682 BOOL make_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS *r_u,
2683 uint32 num_gids, DOM_GID *gid, uint32 status)
2685 if (r_u == NULL) return False;
2687 DEBUG(5,("make_samr_r_query_usergroups\n"));
2692 r_u->num_entries = num_gids;
2693 r_u->ptr_1 = (num_gids != 0) ? 1 : 0;
2694 r_u->num_entries2 = num_gids;
2701 r_u->num_entries = 0;
2705 r_u->status = status;
2710 /*******************************************************************
2711 reads or writes a structure.
2712 ********************************************************************/
2713 BOOL samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS *r_u, prs_struct *ps, int depth)
2716 if (r_u == NULL) return False;
2718 prs_debug(ps, depth, desc, "samr_io_r_query_usergroups");
2723 prs_uint32("ptr_0 ", ps, depth, &(r_u->ptr_0 ));
2725 if (r_u->ptr_0 != 0)
2727 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries));
2728 prs_uint32("ptr_1 ", ps, depth, &(r_u->ptr_1 ));
2730 if (r_u->num_entries != 0)
2732 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
2734 r_u->gid = (DOM_GID*)malloc(r_u->num_entries2 * sizeof(r_u->gid[0]));
2735 if (r_u->gid == NULL)
2740 for (i = 0; i < r_u->num_entries2; i++)
2742 smb_io_gid("", &(r_u->gid[i]), ps, depth);
2746 prs_uint32("status", ps, depth, &(r_u->status));
2752 /*******************************************************************
2753 makes a SAMR_Q_ENUM_DOMAINS structure.
2754 ********************************************************************/
2755 BOOL make_samr_q_enum_domains(SAMR_Q_ENUM_DOMAINS *q_e, POLICY_HND *pol,
2756 uint32 start_idx, uint32 size)
2758 if (q_e == NULL || pol == NULL) return False;
2760 DEBUG(5,("make_samr_q_enum_domains\n"));
2762 memcpy(&(q_e->pol), pol, sizeof(*pol));
2764 q_e->start_idx = start_idx;
2765 q_e->max_size = size;
2771 /*******************************************************************
2772 reads or writes a structure.
2773 ********************************************************************/
2774 BOOL samr_io_q_enum_domains(char *desc, SAMR_Q_ENUM_DOMAINS *q_e, prs_struct *ps, int depth)
2776 if (q_e == NULL) return False;
2778 prs_debug(ps, depth, desc, "samr_io_q_enum_domains");
2783 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
2786 prs_uint32("start_idx", ps, depth, &(q_e->start_idx));
2787 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
2795 /*******************************************************************
2796 makes a SAMR_R_ENUM_DOMAINS structure.
2797 ********************************************************************/
2798 BOOL make_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS *r_u,
2800 uint32 num_sam_entries, char **doms, uint32 status)
2804 if (r_u == NULL) return False;
2806 DEBUG(5,("make_samr_r_enum_domains\n"));
2808 r_u->next_idx = next_idx;
2810 r_u->uni_dom_name = NULL;
2812 if (num_sam_entries != 0)
2814 r_u->ptr_entries1 = 1;
2815 r_u->ptr_entries2 = 1;
2816 r_u->num_entries2 = num_sam_entries;
2817 r_u->num_entries3 = num_sam_entries;
2819 r_u->sam = (SAM_ENTRY*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->sam[0]));
2820 r_u->uni_dom_name = (UNISTR2*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->uni_dom_name[0]));
2822 if (r_u->sam == NULL || r_u->uni_dom_name == NULL)
2824 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOMAINS\n"));
2828 for (i = 0; i < num_sam_entries; i++)
2830 int acct_name_len = doms[i] != NULL ? strlen(doms[i]) : 0;
2832 make_sam_entry(&(r_u->sam[i]), acct_name_len, 0);
2833 make_unistr2(&(r_u->uni_dom_name[i]), doms[i], acct_name_len);
2836 r_u->num_entries4 = num_sam_entries;
2840 r_u->ptr_entries1 = 0;
2841 r_u->num_entries2 = num_sam_entries;
2842 r_u->ptr_entries2 = 1;
2845 r_u->status = status;
2850 /*******************************************************************
2851 reads or writes a structure.
2852 ********************************************************************/
2853 BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS *r_u, prs_struct *ps, int depth)
2857 if (r_u == NULL) return False;
2859 prs_debug(ps, depth, desc, "samr_io_r_enum_domains");
2864 prs_uint32("next_idx ", ps, depth, &(r_u->next_idx ));
2865 prs_uint32("ptr_entries1", ps, depth, &(r_u->ptr_entries1));
2867 if (r_u->ptr_entries1 != 0)
2869 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
2870 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
2871 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
2875 r_u->sam = (SAM_ENTRY*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->sam[0]));
2876 r_u->uni_dom_name = (UNISTR2*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->uni_dom_name[0]));
2879 if ((r_u->sam == NULL || r_u->uni_dom_name == NULL) && r_u->num_entries2 != 0)
2881 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOMAINS\n"));
2882 r_u->num_entries4 = 0;
2883 r_u->status = 0xC0000000|NT_STATUS_MEMORY_NOT_ALLOCATED;
2887 for (i = 0; i < r_u->num_entries2; i++)
2890 slprintf(tmp, sizeof(tmp)-1, "dom[%d]", i);
2891 sam_io_sam_entry(tmp, &(r_u->sam[i]), ps, depth);
2894 for (i = 0; i < r_u->num_entries2; i++)
2897 slprintf(tmp, sizeof(tmp)-1, "dom[%d]", i);
2898 smb_io_unistr2(tmp, &(r_u->uni_dom_name[i]), r_u->sam[i].hdr_name.buffer, ps, depth);
2906 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
2907 prs_uint32("status", ps, depth, &(r_u->status));
2912 /*******************************************************************
2913 makes a SAMR_Q_ENUM_DOM_GROUPS structure.
2914 ********************************************************************/
2915 BOOL make_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_e, POLICY_HND *pol,
2916 uint32 start_idx, uint32 size)
2918 if (q_e == NULL || pol == NULL) return False;
2920 DEBUG(5,("make_samr_q_enum_dom_groups\n"));
2922 memcpy(&(q_e->pol), pol, sizeof(*pol));
2924 q_e->start_idx = start_idx;
2925 q_e->max_size = size;
2931 /*******************************************************************
2932 reads or writes a structure.
2933 ********************************************************************/
2934 BOOL samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS *q_e, prs_struct *ps, int depth)
2936 if (q_e == NULL) return False;
2938 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups");
2943 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
2946 prs_uint32("start_idx", ps, depth, &(q_e->start_idx));
2947 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
2955 /*******************************************************************
2956 makes a SAMR_R_ENUM_DOM_GROUPS structure.
2957 ********************************************************************/
2958 BOOL make_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS *r_u,
2960 uint32 num_sam_entries, DOMAIN_GRP *grps, uint32 status)
2964 if (r_u == NULL) return False;
2966 DEBUG(5,("make_samr_r_enum_dom_groups\n"));
2968 r_u->next_idx = next_idx;
2970 r_u->uni_grp_name = NULL;
2972 if (num_sam_entries != 0)
2974 r_u->ptr_entries1 = 1;
2975 r_u->ptr_entries2 = 1;
2976 r_u->num_entries2 = num_sam_entries;
2977 r_u->num_entries3 = num_sam_entries;
2979 r_u->sam = (SAM_ENTRY*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->sam[0]));
2980 r_u->uni_grp_name = (UNISTR2*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->uni_grp_name[0]));
2982 if (r_u->sam == NULL || r_u->uni_grp_name == NULL)
2984 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_GROUPS\n"));
2988 for (i = 0; i < num_sam_entries; i++)
2990 int acct_name_len = strlen(grps[i].name);
2992 make_sam_entry(&(r_u->sam[i]),
2996 make_unistr2(&(r_u->uni_grp_name[i]), grps[i].name, acct_name_len);
2999 r_u->num_entries4 = num_sam_entries;
3003 r_u->ptr_entries1 = 0;
3004 r_u->num_entries2 = num_sam_entries;
3005 r_u->ptr_entries2 = 1;
3008 r_u->status = status;
3013 /*******************************************************************
3014 reads or writes a structure.
3015 ********************************************************************/
3016 BOOL samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS *r_u, prs_struct *ps, int depth)
3020 if (r_u == NULL) return False;
3022 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups");
3027 prs_uint32("next_idx ", ps, depth, &(r_u->next_idx ));
3028 prs_uint32("ptr_entries1", ps, depth, &(r_u->ptr_entries1));
3030 if (r_u->ptr_entries1 != 0)
3032 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
3033 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
3034 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
3038 r_u->sam = (SAM_ENTRY*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->sam[0]));
3039 r_u->uni_grp_name = (UNISTR2*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->uni_grp_name[0]));
3042 if ((r_u->sam == NULL || r_u->uni_grp_name == NULL) && r_u->num_entries2 != 0)
3044 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_GROUPS\n"));
3045 r_u->num_entries4 = 0;
3046 r_u->status = 0xC0000000|NT_STATUS_MEMORY_NOT_ALLOCATED;
3050 for (i = 0; i < r_u->num_entries2; i++)
3052 sam_io_sam_entry("", &(r_u->sam[i]), ps, depth);
3055 for (i = 0; i < r_u->num_entries2; i++)
3057 smb_io_unistr2("", &(r_u->uni_grp_name[i]), r_u->sam[i].hdr_name.buffer, ps, depth);
3065 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
3066 prs_uint32("status", ps, depth, &(r_u->status));
3071 /*******************************************************************
3072 makes a SAMR_Q_ENUM_DOM_ALIASES structure.
3073 ********************************************************************/
3074 BOOL make_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_e, POLICY_HND *pol,
3075 uint32 start_idx, uint32 size)
3077 if (q_e == NULL || pol == NULL) return False;
3079 DEBUG(5,("make_samr_q_enum_dom_aliases\n"));
3081 memcpy(&(q_e->pol), pol, sizeof(*pol));
3083 q_e->start_idx = start_idx;
3084 q_e->max_size = size;
3090 /*******************************************************************
3091 reads or writes a structure.
3092 ********************************************************************/
3093 BOOL samr_io_q_enum_dom_aliases(char *desc, SAMR_Q_ENUM_DOM_ALIASES *q_e, prs_struct *ps, int depth)
3095 if (q_e == NULL) return False;
3097 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases");
3102 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
3105 prs_uint32("start_idx", ps, depth, &(q_e->start_idx));
3106 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
3114 /*******************************************************************
3115 makes a SAMR_R_ENUM_DOM_ALIASES structure.
3116 ********************************************************************/
3117 BOOL make_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u,
3119 uint32 num_sam_entries, LOCAL_GRP *alss, uint32 status)
3123 if (r_u == NULL) return False;
3125 DEBUG(5,("make_samr_r_enum_dom_aliases\n"));
3127 r_u->next_idx = next_idx;
3129 r_u->uni_grp_name = NULL;
3131 if (num_sam_entries != 0)
3133 r_u->ptr_entries1 = 1;
3134 r_u->ptr_entries2 = 1;
3135 r_u->num_entries2 = num_sam_entries;
3136 r_u->num_entries3 = num_sam_entries;
3138 r_u->sam = (SAM_ENTRY*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->sam[0]));
3139 r_u->uni_grp_name = (UNISTR2*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->uni_grp_name[0]));
3141 if (r_u->sam == NULL || r_u->uni_grp_name == NULL)
3143 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_ALIASES\n"));
3147 for (i = 0; i < num_sam_entries; i++)
3149 int acct_name_len = strlen(alss[i].name);
3151 make_sam_entry(&(r_u->sam[i]),
3155 make_unistr2(&(r_u->uni_grp_name[i]), alss[i].name, acct_name_len);
3158 r_u->num_entries4 = num_sam_entries;
3162 r_u->ptr_entries1 = 0;
3163 r_u->num_entries2 = num_sam_entries;
3164 r_u->ptr_entries2 = 1;
3167 r_u->status = status;
3172 /*******************************************************************
3173 reads or writes a structure.
3174 ********************************************************************/
3175 BOOL samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES *r_u, prs_struct *ps, int depth)
3179 if (r_u == NULL) return False;
3181 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases");
3186 prs_uint32("next_idx ", ps, depth, &(r_u->next_idx ));
3187 prs_uint32("ptr_entries1", ps, depth, &(r_u->ptr_entries1));
3189 if (r_u->ptr_entries1 != 0)
3191 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
3192 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
3193 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
3197 r_u->sam = (SAM_ENTRY*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->sam[0]));
3198 r_u->uni_grp_name = (UNISTR2*)Realloc(NULL, r_u->num_entries2 * sizeof(r_u->uni_grp_name[0]));
3201 if ((r_u->sam == NULL || r_u->uni_grp_name == NULL) && r_u->num_entries2 != 0)
3203 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_ALIASES\n"));
3204 r_u->num_entries4 = 0;
3205 r_u->status = 0xC0000000|NT_STATUS_MEMORY_NOT_ALLOCATED;
3209 for (i = 0; i < r_u->num_entries2; i++)
3211 sam_io_sam_entry("", &(r_u->sam[i]), ps, depth);
3214 for (i = 0; i < r_u->num_entries2; i++)
3216 smb_io_unistr2("", &(r_u->uni_grp_name[i]), r_u->sam[i].hdr_name.buffer, ps, depth);
3224 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
3225 prs_uint32("status", ps, depth, &(r_u->status));
3231 /*******************************************************************
3232 makes a ALIAS_INFO3 structure.
3233 ********************************************************************/
3234 BOOL make_samr_alias_info3(ALIAS_INFO3 *al3, const char *acct_desc)
3236 int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0;
3237 if (al3 == NULL) return False;
3239 DEBUG(5,("make_samr_alias_info3\n"));
3241 make_uni_hdr(&(al3->hdr_acct_desc), acct_len);
3242 make_unistr2(&(al3->uni_acct_desc), acct_desc, acct_len);
3248 /*******************************************************************
3249 reads or writes a structure.
3250 ********************************************************************/
3251 BOOL samr_io_alias_info3(char *desc, ALIAS_INFO3 *al3, prs_struct *ps, int depth)
3253 if (al3 == NULL) return False;
3255 prs_debug(ps, depth, desc, "samr_io_alias_info3");
3260 smb_io_unihdr ("hdr_acct_desc", &(al3->hdr_acct_desc) , ps, depth);
3261 smb_io_unistr2("uni_acct_desc", &(al3->uni_acct_desc), al3->hdr_acct_desc.buffer, ps, depth);
3267 /*******************************************************************
3268 reads or writes a structure.
3269 ********************************************************************/
3270 BOOL samr_alias_info_ctr(char *desc, ALIAS_INFO_CTR *ctr, prs_struct *ps, int depth)
3272 if (ctr == NULL) return False;
3274 prs_debug(ps, depth, desc, "samr_alias_info_ctr");
3277 prs_uint16("switch_value1", ps, depth, &(ctr->switch_value1));
3278 prs_uint16("switch_value2", ps, depth, &(ctr->switch_value2));
3280 switch (ctr->switch_value1)
3284 samr_io_alias_info3("alias_info3", &(ctr->alias.info3), ps, depth);
3289 DEBUG(4,("samr_alias_info_ctr: unsupported switch level\n"));
3300 /*******************************************************************
3301 makes a SAMR_Q_QUERY_ALIASINFO structure.
3302 ********************************************************************/
3303 BOOL make_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_e,
3305 uint16 switch_level)
3307 if (q_e == NULL || pol == NULL) return False;
3309 DEBUG(5,("make_samr_q_query_aliasinfo\n"));
3311 memcpy(&(q_e->pol), pol, sizeof(*pol));
3313 q_e->switch_level = switch_level;
3319 /*******************************************************************
3320 reads or writes a structure.
3321 ********************************************************************/
3322 BOOL samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO *q_e, prs_struct *ps, int depth)
3324 if (q_e == NULL) return False;
3326 prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo");
3331 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
3334 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
3340 /*******************************************************************
3341 makes a SAMR_R_QUERY_ALIASINFO structure.
3342 ********************************************************************/
3343 BOOL make_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *r_u, ALIAS_INFO_CTR *ctr,
3346 if (r_u == NULL) return False;
3348 DEBUG(5,("make_samr_r_query_aliasinfo\n"));
3350 r_u->ptr = (status == 0x0 && ctr != NULL) ? 1 : 0;
3352 r_u->status = status;
3358 /*******************************************************************
3359 reads or writes a structure.
3360 ********************************************************************/
3361 BOOL samr_io_r_query_aliasinfo(char *desc, SAMR_R_QUERY_ALIASINFO *r_u, prs_struct *ps, int depth)
3363 if (r_u == NULL) return False;
3365 prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo");
3370 prs_uint32("ptr", ps, depth, &(r_u->ptr));
3374 samr_alias_info_ctr("ctr", r_u->ctr, ps, depth);
3377 prs_uint32("status", ps, depth, &(r_u->status));
3383 /*******************************************************************
3384 makes a SAMR_Q_SET_ALIASINFO structure.
3385 ********************************************************************/
3386 BOOL make_samr_q_set_aliasinfo(SAMR_Q_SET_ALIASINFO *q_u, POLICY_HND *hnd,
3387 ALIAS_INFO_CTR *ctr)
3389 if (q_u == NULL) return False;
3391 DEBUG(5,("make_samr_q_set_aliasinfo\n"));
3393 memcpy(&(q_u->alias_pol), hnd, sizeof(q_u->alias_pol));
3400 /*******************************************************************
3401 reads or writes a structure.
3402 ********************************************************************/
3403 BOOL samr_io_q_set_aliasinfo(char *desc, SAMR_Q_SET_ALIASINFO *q_u, prs_struct *ps, int depth)
3405 if (q_u == NULL) return False;
3407 prs_debug(ps, depth, desc, "samr_io_q_set_aliasinfo");
3412 smb_io_pol_hnd("alias_pol", &(q_u->alias_pol), ps, depth);
3413 samr_alias_info_ctr("ctr", q_u->ctr, ps, depth);
3418 /*******************************************************************
3419 reads or writes a structure.
3420 ********************************************************************/
3421 BOOL samr_io_r_set_aliasinfo(char *desc, SAMR_R_SET_ALIASINFO *r_u, prs_struct *ps, int depth)
3423 if (r_u == NULL) return False;
3425 prs_debug(ps, depth, desc, "samr_io_r_set_aliasinfo");
3429 prs_uint32("status", ps, depth, &(r_u->status));
3436 /*******************************************************************
3437 makes a SAMR_Q_QUERY_USERALIASES structure.
3438 ********************************************************************/
3439 BOOL make_samr_q_query_useraliases(SAMR_Q_QUERY_USERALIASES *q_u,
3440 const POLICY_HND *hnd,
3441 uint32 *ptr_sid, DOM_SID2 *sid)
3443 if (q_u == NULL || hnd == NULL) return False;
3445 DEBUG(5,("make_samr_q_query_useraliases\n"));
3447 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
3453 q_u->ptr_sid = ptr_sid;
3459 /*******************************************************************
3460 reads or writes a SAMR_Q_QUERY_USERALIASES structure.
3461 ********************************************************************/
3462 BOOL samr_io_q_query_useraliases(char *desc, SAMR_Q_QUERY_USERALIASES *q_u, prs_struct *ps, int depth)
3467 if (q_u == NULL) return False;
3469 prs_debug(ps, depth, desc, "samr_io_q_query_useraliases");
3474 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
3477 prs_uint32("num_sids1", ps, depth, &(q_u->num_sids1));
3478 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
3479 prs_uint32("num_sids2", ps, depth, &(q_u->num_sids2));
3481 if (q_u->num_sids2 != 0)
3483 q_u->ptr_sid = (uint32*)Realloc(q_u->ptr_sid,
3484 sizeof(q_u->ptr_sid[0]) * q_u->num_sids2);
3485 if (q_u->ptr_sid == NULL)
3487 samr_free_q_query_useraliases(q_u);
3491 q_u->sid = (DOM_SID2*)Realloc(q_u->sid,
3492 sizeof(q_u->sid[0]) * q_u->num_sids2);
3493 if (q_u->sid == NULL)
3495 samr_free_q_query_useraliases(q_u);
3500 for (i = 0; i < q_u->num_sids2; i++)
3502 slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i);
3503 prs_uint32(tmp, ps, depth, &(q_u->ptr_sid[i]));
3506 for (i = 0; i < q_u->num_sids2; i++)
3508 if (q_u->ptr_sid[i] != 0)
3510 slprintf(tmp, sizeof(tmp)-1, "sid[%02d]", i);
3511 smb_io_dom_sid2(tmp, &(q_u->sid[i]), ps, depth);
3519 /* storing. memory no longer needed */
3520 samr_free_q_query_useraliases(q_u);
3525 /*******************************************************************
3526 frees memory in a SAMR_Q_QUERY_USERALIASES structure.
3527 ********************************************************************/
3528 void samr_free_q_query_useraliases(SAMR_Q_QUERY_USERALIASES *q_u)
3530 if (q_u->ptr_sid == NULL)
3533 q_u->ptr_sid = NULL;
3536 if (q_u->sid == NULL)
3543 /*******************************************************************
3544 makes a SAMR_R_QUERY_USERALIASES structure.
3545 ********************************************************************/
3546 BOOL make_samr_r_query_useraliases(SAMR_R_QUERY_USERALIASES *r_u,
3547 uint32 num_rids, uint32 *rid, uint32 status)
3549 if (r_u == NULL) return False;
3551 DEBUG(5,("make_samr_r_query_useraliases\n"));
3555 r_u->num_entries = num_rids;
3557 r_u->num_entries2 = num_rids;
3563 r_u->num_entries = 0;
3565 r_u->num_entries2 = 0;
3568 r_u->status = status;
3573 /*******************************************************************
3574 reads or writes a structure.
3575 ********************************************************************/
3576 BOOL samr_io_r_query_useraliases(char *desc, SAMR_R_QUERY_USERALIASES *r_u, prs_struct *ps, int depth)
3580 if (r_u == NULL) return False;
3582 prs_debug(ps, depth, desc, "samr_io_r_query_useraliases");
3587 prs_uint32("num_entries", ps, depth, &(r_u->num_entries));
3588 prs_uint32("ptr ", ps, depth, &(r_u->ptr ));
3589 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
3591 if (r_u->num_entries != 0)
3593 r_u->rid = (uint32*)Realloc(r_u->rid,
3594 sizeof(r_u->rid[0]) * r_u->num_entries);
3595 if (r_u->rid == NULL)
3597 samr_free_r_query_useraliases(r_u);
3601 for (i = 0; i < r_u->num_entries2; i++)
3603 slprintf(tmp, sizeof(tmp)-1, "rid[%02d]", i);
3604 prs_uint32(tmp, ps, depth, &(r_u->rid[i]));
3608 prs_uint32("status", ps, depth, &(r_u->status));
3612 /* storing. memory no longer needed */
3613 samr_free_r_query_useraliases(r_u);
3618 /*******************************************************************
3619 frees memory in a SAMR_R_QUERY_USERALIASES structure.
3620 ********************************************************************/
3621 void samr_free_r_query_useraliases(SAMR_R_QUERY_USERALIASES *r_u)
3623 if (r_u->rid == NULL)
3630 /*******************************************************************
3631 makes a SAMR_Q_OPEN_ALIAS structure.
3632 ********************************************************************/
3633 BOOL make_samr_q_open_alias(SAMR_Q_OPEN_ALIAS *q_u, const POLICY_HND *pol,
3634 uint32 unknown_0, uint32 rid)
3636 if (q_u == NULL) return False;
3638 DEBUG(5,("make_samr_q_open_alias\n"));
3640 memcpy(&(q_u->dom_pol), pol, sizeof(q_u->dom_pol));
3642 /* example values: 0x0000 0008 */
3643 q_u->unknown_0 = unknown_0;
3645 q_u->rid_alias = rid;
3650 /*******************************************************************
3651 reads or writes a structure.
3652 ********************************************************************/
3653 BOOL samr_io_q_open_alias(char *desc, SAMR_Q_OPEN_ALIAS *q_u, prs_struct *ps, int depth)
3655 if (q_u == NULL) return False;
3657 prs_debug(ps, depth, desc, "samr_io_q_open_alias");
3662 smb_io_pol_hnd("dom_pol", &(q_u->dom_pol), ps, depth);
3664 prs_uint32("unknown_0", ps, depth, &(q_u->unknown_0));
3665 prs_uint32("rid_alias", ps, depth, &(q_u->rid_alias));
3670 /*******************************************************************
3671 reads or writes a structure.
3672 ********************************************************************/
3673 BOOL samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS *r_u, prs_struct *ps, int depth)
3675 if (r_u == NULL) return False;
3677 prs_debug(ps, depth, desc, "samr_io_r_open_alias");
3682 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
3685 prs_uint32("status", ps, depth, &(r_u->status));
3690 /*******************************************************************
3691 makes a SAMR_Q_LOOKUP_RIDS structure.
3692 ********************************************************************/
3693 BOOL make_samr_q_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u,
3694 const POLICY_HND *pol, uint32 flags,
3695 uint32 num_rids, uint32 *rid)
3697 if (q_u == NULL) return False;
3699 DEBUG(5,("make_samr_r_unknwon_12\n"));
3701 memcpy(&(q_u->pol), pol, sizeof(*pol));
3703 q_u->num_rids1 = num_rids;
3706 q_u->num_rids2 = num_rids;
3712 /*******************************************************************
3713 reads or writes a structure.
3714 ********************************************************************/
3715 BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS *q_u, prs_struct *ps, int depth)
3720 if (q_u == NULL) return False;
3722 prs_debug(ps, depth, desc, "samr_io_q_lookup_rids");
3727 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
3730 prs_uint32("num_rids1", ps, depth, &(q_u->num_rids1));
3731 prs_uint32("flags ", ps, depth, &(q_u->flags ));
3732 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
3733 prs_uint32("num_rids2", ps, depth, &(q_u->num_rids2));
3735 if (q_u->num_rids2 != 0)
3737 q_u->rid = (uint32*)Realloc(q_u->rid, sizeof(q_u->rid[0]) *
3739 if (q_u->rid == NULL)
3741 samr_free_q_lookup_rids(q_u);
3746 for (i = 0; i < q_u->num_rids2; i++)
3748 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
3749 prs_uint32(tmp, ps, depth, &(q_u->rid[i]));
3756 /* storing. don't need memory any more */
3757 samr_free_q_lookup_rids(q_u);
3763 /*******************************************************************
3765 ********************************************************************/
3766 void samr_free_q_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u)
3768 if (q_u->rid != NULL)
3776 /*******************************************************************
3777 makes a SAMR_R_LOOKUP_RIDS structure.
3778 ********************************************************************/
3779 BOOL make_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u,
3780 uint32 num_names, fstring *name, uint8 *type,
3784 if (r_u == NULL || name == NULL || type == NULL) return False;
3786 DEBUG(5,("make_samr_r_lookup_rids\n"));
3790 r_u->num_names1 = num_names;
3792 r_u->num_names2 = num_names;
3794 r_u->num_types1 = num_names;
3796 r_u->num_types2 = num_names;
3800 r_u->hdr_name = (UNIHDR*)malloc(num_names * sizeof(r_u->hdr_name[0]));
3801 if (r_u->hdr_name == NULL)
3803 samr_free_r_lookup_rids(r_u);
3806 r_u->uni_name = (UNISTR2*)malloc(num_names * sizeof(r_u->uni_name[0]));
3807 if (r_u->uni_name == NULL)
3809 samr_free_r_lookup_rids(r_u);
3812 r_u->type = (uint32*)malloc(r_u->num_types2 * sizeof(r_u->type[0]));
3813 if (r_u->type == NULL)
3815 samr_free_r_lookup_rids(r_u);
3820 for (i = 0; i < num_names; i++)
3822 int len = name[i] != NULL ? strlen(name[i]) : 0;
3823 DEBUG(10,("name[%d]:%s\ttype:%d\n",
3824 i, name[i], type[i]));
3825 make_uni_hdr(&(r_u->hdr_name[i]), len);
3826 make_unistr2(&(r_u->uni_name[i]), name[i], len);
3827 r_u->type[i] = type[i];
3832 r_u->num_names1 = num_names;
3834 r_u->num_names2 = num_names;
3836 r_u->num_types1 = num_names;
3838 r_u->num_types2 = num_names;
3841 r_u->status = status;
3846 /*******************************************************************
3847 reads or writes a structure.
3848 ********************************************************************/
3849 BOOL samr_io_r_lookup_rids(char *desc, SAMR_R_LOOKUP_RIDS *r_u, prs_struct *ps, int depth)
3853 if (r_u == NULL) return False;
3855 prs_debug(ps, depth, desc, "samr_io_r_lookup_rids");
3860 prs_uint32("num_names1", ps, depth, &(r_u->num_names1));
3861 prs_uint32("ptr_names ", ps, depth, &(r_u->ptr_names ));
3862 prs_uint32("num_names2", ps, depth, &(r_u->num_names2));
3864 if (r_u->ptr_names != 0 && r_u->num_names1 != 0)
3866 r_u->hdr_name = (UNIHDR*)Realloc(r_u->hdr_name,
3867 r_u->num_names2 * sizeof(r_u->hdr_name[0]));
3868 if (r_u->hdr_name == NULL)
3873 r_u->uni_name = (UNISTR2*)Realloc(r_u->uni_name,
3874 r_u->num_names2 * sizeof(r_u->uni_name[0]));
3875 if (r_u->uni_name == NULL)
3877 free(r_u->hdr_name);
3880 for (i = 0; i < r_u->num_names2; i++)
3882 slprintf(tmp, sizeof(tmp) - 1, "hdr[%02d] ", i);
3883 smb_io_unihdr ("", &(r_u->hdr_name[i]), ps, depth);
3885 for (i = 0; i < r_u->num_names2; i++)
3887 slprintf(tmp, sizeof(tmp) - 1, "str[%02d] ", i);
3888 smb_io_unistr2("", &(r_u->uni_name[i]), r_u->hdr_name[i].buffer, ps, depth);
3895 prs_uint32("num_types1", ps, depth, &(r_u->num_types1));
3896 prs_uint32("ptr_types ", ps, depth, &(r_u->ptr_types ));
3897 prs_uint32("num_types2", ps, depth, &(r_u->num_types2));
3899 if (r_u->ptr_types != 0 && r_u->num_types1 != 0)
3901 r_u->type = (uint32*)Realloc(r_u->type, r_u->num_types2 *
3902 sizeof(r_u->type[0]));
3903 if (r_u->type == NULL)
3905 if (r_u->uni_name != NULL)
3907 free(r_u->uni_name);
3909 if (r_u->hdr_name != NULL)
3911 free(r_u->hdr_name);
3916 for (i = 0; i < r_u->num_types2; i++)
3918 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
3919 prs_uint32(tmp, ps, depth, &(r_u->type[i]));
3923 prs_uint32("status", ps, depth, &(r_u->status));
3927 /* storing. don't need memory any more */
3928 samr_free_r_lookup_rids(r_u);
3934 /*******************************************************************
3936 ********************************************************************/
3937 void samr_free_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u)
3939 if (r_u->uni_name != NULL)
3941 free(r_u->uni_name);
3942 r_u->uni_name = NULL;
3944 if (r_u->hdr_name != NULL)
3946 free(r_u->hdr_name);
3947 r_u->hdr_name = NULL;
3949 if (r_u->type != NULL)
3956 /*******************************************************************
3957 makes a SAMR_Q_OPEN_ALIAS structure.
3958 ********************************************************************/
3959 BOOL make_samr_q_delete_alias(SAMR_Q_DELETE_DOM_ALIAS *q_u, POLICY_HND *hnd)
3961 if (q_u == NULL) return False;
3963 DEBUG(5,("make_samr_q_delete_alias\n"));
3965 memcpy(&(q_u->alias_pol), hnd, sizeof(q_u->alias_pol));
3971 /*******************************************************************
3972 reads or writes a structure.
3973 ********************************************************************/
3974 BOOL samr_io_q_delete_alias(char *desc, SAMR_Q_DELETE_DOM_ALIAS *q_u, prs_struct *ps, int depth)
3976 if (q_u == NULL) return False;
3978 prs_debug(ps, depth, desc, "samr_io_q_delete_alias");
3983 smb_io_pol_hnd("alias_pol", &(q_u->alias_pol), ps, depth);
3988 /*******************************************************************
3989 reads or writes a structure.
3990 ********************************************************************/
3991 BOOL samr_io_r_delete_alias(char *desc, SAMR_R_DELETE_DOM_ALIAS *r_u, prs_struct *ps, int depth)
3993 if (r_u == NULL) return False;
3995 prs_debug(ps, depth, desc, "samr_io_r_delete_alias");
4000 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
4001 prs_uint32("status", ps, depth, &(r_u->status));
4007 /*******************************************************************
4008 makes a SAMR_Q_CREATE_DOM_ALIAS structure.
4009 ********************************************************************/
4010 BOOL make_samr_q_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS *q_u, POLICY_HND *hnd,
4011 const char *acct_desc)
4013 int acct_len = acct_desc != NULL ? strlen(acct_desc) : 0;
4014 if (q_u == NULL) return False;
4016 DEBUG(5,("make_samr_q_create_dom_alias\n"));
4018 memcpy(&(q_u->dom_pol), hnd, sizeof(q_u->dom_pol));
4020 make_uni_hdr(&(q_u->hdr_acct_desc), acct_len);
4021 make_unistr2(&(q_u->uni_acct_desc), acct_desc, acct_len);
4023 q_u->unknown_1 = 0x001f;
4024 q_u->unknown_2 = 0x000f;
4030 /*******************************************************************
4031 reads or writes a structure.
4032 ********************************************************************/
4033 BOOL samr_io_q_create_dom_alias(char *desc, SAMR_Q_CREATE_DOM_ALIAS *q_u, prs_struct *ps, int depth)
4035 if (q_u == NULL) return False;
4037 prs_debug(ps, depth, desc, "samr_io_q_create_dom_alias");
4042 smb_io_pol_hnd("dom_pol", &(q_u->dom_pol), ps, depth);
4044 smb_io_unihdr ("hdr_acct_desc", &(q_u->hdr_acct_desc) , ps, depth);
4045 smb_io_unistr2("uni_acct_desc", &(q_u->uni_acct_desc), q_u->hdr_acct_desc.buffer, ps, depth);
4048 prs_uint16("unknown_1", ps, depth, &(q_u->unknown_1));
4049 prs_uint16("unknown_2", ps, depth, &(q_u->unknown_2));
4054 /*******************************************************************
4055 makes a SAMR_R_CREATE_DOM_ALIAS structure.
4056 ********************************************************************/
4057 BOOL make_samr_r_create_dom_alias(SAMR_R_CREATE_DOM_ALIAS *r_u, POLICY_HND *pol,
4058 uint32 rid, uint32 status)
4060 if (r_u == NULL) return False;
4062 DEBUG(5,("make_samr_r_create_dom_alias\n"));
4064 memcpy(&(r_u->alias_pol), pol, sizeof(*pol));
4066 r_u->status = status;
4072 /*******************************************************************
4073 reads or writes a structure.
4074 ********************************************************************/
4075 BOOL samr_io_r_create_dom_alias(char *desc, SAMR_R_CREATE_DOM_ALIAS *r_u, prs_struct *ps, int depth)
4077 if (r_u == NULL) return False;
4079 prs_debug(ps, depth, desc, "samr_io_r_create_dom_alias");
4084 smb_io_pol_hnd("alias_pol", &(r_u->alias_pol), ps, depth);
4085 prs_uint32("rid", ps, depth, &(r_u->rid));
4087 prs_uint32("status", ps, depth, &(r_u->status));
4094 /*******************************************************************
4095 makes a SAMR_Q_ADD_ALIASMEM structure.
4096 ********************************************************************/
4097 BOOL make_samr_q_add_aliasmem(SAMR_Q_ADD_ALIASMEM *q_u, POLICY_HND *hnd,
4100 if (q_u == NULL) return False;
4102 DEBUG(5,("make_samr_q_add_aliasmem\n"));
4104 memcpy(&(q_u->alias_pol), hnd, sizeof(q_u->alias_pol));
4105 make_dom_sid2(&q_u->sid, sid);
4111 /*******************************************************************
4112 reads or writes a structure.
4113 ********************************************************************/
4114 BOOL samr_io_q_add_aliasmem(char *desc, SAMR_Q_ADD_ALIASMEM *q_u, prs_struct *ps, int depth)
4116 if (q_u == NULL) return False;
4118 prs_debug(ps, depth, desc, "samr_io_q_add_aliasmem");
4123 smb_io_pol_hnd ("alias_pol", &(q_u->alias_pol), ps, depth);
4124 smb_io_dom_sid2("sid ", &(q_u->sid ), ps, depth);
4129 /*******************************************************************
4130 reads or writes a structure.
4131 ********************************************************************/
4132 BOOL samr_io_r_add_aliasmem(char *desc, SAMR_R_ADD_ALIASMEM *r_u, prs_struct *ps, int depth)
4134 if (r_u == NULL) return False;
4136 prs_debug(ps, depth, desc, "samr_io_r_add_aliasmem");
4141 prs_uint32("status", ps, depth, &(r_u->status));
4147 /*******************************************************************
4148 makes a SAMR_Q_DEL_ALIASMEM structure.
4149 ********************************************************************/
4150 BOOL make_samr_q_del_aliasmem(SAMR_Q_DEL_ALIASMEM *q_u, POLICY_HND *hnd,
4153 if (q_u == NULL) return False;
4155 DEBUG(5,("make_samr_q_del_aliasmem\n"));
4157 memcpy(&(q_u->alias_pol), hnd, sizeof(q_u->alias_pol));
4158 make_dom_sid2(&q_u->sid, sid);
4164 /*******************************************************************
4165 reads or writes a structure.
4166 ********************************************************************/
4167 BOOL samr_io_q_del_aliasmem(char *desc, SAMR_Q_DEL_ALIASMEM *q_u, prs_struct *ps, int depth)
4169 if (q_u == NULL) return False;
4171 prs_debug(ps, depth, desc, "samr_io_q_del_aliasmem");
4176 smb_io_pol_hnd("alias_pol", &(q_u->alias_pol), ps, depth);
4177 smb_io_dom_sid2("sid ", &(q_u->sid ), ps, depth);
4182 /*******************************************************************
4183 reads or writes a structure.
4184 ********************************************************************/
4185 BOOL samr_io_r_del_aliasmem(char *desc, SAMR_R_DEL_ALIASMEM *r_u, prs_struct *ps, int depth)
4187 if (r_u == NULL) return False;
4189 prs_debug(ps, depth, desc, "samr_io_r_del_aliasmem");
4194 prs_uint32("status", ps, depth, &(r_u->status));
4199 /*******************************************************************
4200 makes a SAMR_Q_DELETE_DOM_ALIAS structure.
4201 ********************************************************************/
4202 BOOL make_samr_q_delete_dom_alias(SAMR_Q_DELETE_DOM_ALIAS *q_c, POLICY_HND *hnd)
4204 if (q_c == NULL || hnd == NULL) return False;
4206 DEBUG(5,("make_samr_q_delete_dom_alias\n"));
4208 memcpy(&(q_c->alias_pol), hnd, sizeof(q_c->alias_pol));
4213 /*******************************************************************
4214 reads or writes a structure.
4215 ********************************************************************/
4216 BOOL samr_io_q_delete_dom_alias(char *desc, SAMR_Q_DELETE_DOM_ALIAS *q_u, prs_struct *ps, int depth)
4218 if (q_u == NULL) return False;
4220 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_alias");
4225 smb_io_pol_hnd("alias_pol", &(q_u->alias_pol), ps, depth);
4230 /*******************************************************************
4231 makes a SAMR_R_DELETE_DOM_ALIAS structure.
4232 ********************************************************************/
4233 BOOL make_samr_r_delete_dom_alias(SAMR_R_DELETE_DOM_ALIAS *r_u,
4236 if (r_u == NULL) return False;
4238 DEBUG(5,("make_samr_r_delete_dom_alias\n"));
4240 r_u->status = status;
4245 /*******************************************************************
4246 reads or writes a structure.
4247 ********************************************************************/
4248 BOOL samr_io_r_delete_dom_alias(char *desc, SAMR_R_DELETE_DOM_ALIAS *r_u, prs_struct *ps, int depth)
4250 if (r_u == NULL) return False;
4252 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_alias");
4257 prs_uint32("status", ps, depth, &(r_u->status));
4263 /*******************************************************************
4264 makes a SAMR_Q_QUERY_ALIASMEM structure.
4265 ********************************************************************/
4266 BOOL make_samr_q_query_aliasmem(SAMR_Q_QUERY_ALIASMEM *q_c,
4267 const POLICY_HND *hnd)
4269 if (q_c == NULL || hnd == NULL) return False;
4271 DEBUG(5,("make_samr_q_query_aliasmem\n"));
4273 memcpy(&(q_c->alias_pol), hnd, sizeof(q_c->alias_pol));
4278 /*******************************************************************
4279 reads or writes a structure.
4280 ********************************************************************/
4281 BOOL samr_io_q_query_aliasmem(char *desc, SAMR_Q_QUERY_ALIASMEM *q_u, prs_struct *ps, int depth)
4283 if (q_u == NULL) return False;
4285 prs_debug(ps, depth, desc, "samr_io_q_query_aliasmem");
4290 smb_io_pol_hnd("alias_pol", &(q_u->alias_pol), ps, depth);
4295 /*******************************************************************
4296 makes a SAMR_R_QUERY_ALIASMEM structure.
4297 ********************************************************************/
4298 BOOL make_samr_r_query_aliasmem(SAMR_R_QUERY_ALIASMEM *r_u,
4299 uint32 num_sids, DOM_SID2 *sid, uint32 status)
4301 if (r_u == NULL) return False;
4303 DEBUG(5,("make_samr_r_query_aliasmem\n"));
4307 r_u->num_sids = num_sids;
4308 r_u->ptr = (num_sids != 0) ? 1 : 0;
4309 r_u->num_sids1 = num_sids;
4319 r_u->status = status;
4324 /*******************************************************************
4325 reads or writes a structure.
4326 ********************************************************************/
4327 BOOL samr_io_r_query_aliasmem(char *desc, SAMR_R_QUERY_ALIASMEM *r_u, prs_struct *ps, int depth)
4330 uint32 ptr_sid[MAX_LOOKUP_SIDS];
4332 if (r_u == NULL) return False;
4334 prs_debug(ps, depth, desc, "samr_io_r_query_aliasmem");
4339 prs_uint32("num_sids ", ps, depth, &(r_u->num_sids));
4340 prs_uint32("ptr", ps, depth, &(r_u->ptr));
4344 SMB_ASSERT_ARRAY(ptr_sid, r_u->num_sids);
4346 if (r_u->num_sids != 0)
4348 prs_uint32("num_sids1", ps, depth, &(r_u->num_sids1));
4350 for (i = 0; i < r_u->num_sids1; i++)
4353 prs_uint32("", ps, depth, &(ptr_sid[i]));
4355 for (i = 0; i < r_u->num_sids1; i++)
4357 if (ptr_sid[i] != 0)
4359 smb_io_dom_sid2("", &(r_u->sid[i]), ps, depth);
4364 prs_uint32("status", ps, depth, &(r_u->status));
4369 /*******************************************************************
4370 makes a SAMR_Q_LOOKUP_NAMES structure.
4371 ********************************************************************/
4372 BOOL make_samr_q_lookup_names(SAMR_Q_LOOKUP_NAMES *q_u,
4373 POLICY_HND *pol, uint32 flags,
4374 uint32 num_names, char **name)
4377 if (q_u == NULL) return False;
4379 DEBUG(5,("make_samr_q_lookup_names\n"));
4381 memcpy(&(q_u->pol), pol, sizeof(*pol));
4383 q_u->num_names1 = num_names;
4386 q_u->num_names2 = num_names;
4388 for (i = 0; i < num_names; i++)
4390 int len_name = name[i] != NULL ? strlen(name[i]) : 0;
4391 make_uni_hdr(&(q_u->hdr_name[i]), len_name); /* unicode header for user_name */
4392 make_unistr2(&(q_u->uni_name[i]), name[i], len_name); /* unicode string for machine account */
4399 /*******************************************************************
4400 reads or writes a structure.
4401 ********************************************************************/
4402 BOOL samr_io_q_lookup_names(char *desc, SAMR_Q_LOOKUP_NAMES *q_u, prs_struct *ps, int depth)
4406 if (q_u == NULL) return False;
4408 prs_debug(ps, depth, desc, "samr_io_q_lookup_names");
4413 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
4416 prs_uint32("num_names1", ps, depth, &(q_u->num_names1));
4417 prs_uint32("flags ", ps, depth, &(q_u->flags ));
4418 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
4419 prs_uint32("num_names2", ps, depth, &(q_u->num_names2));
4421 SMB_ASSERT_ARRAY(q_u->hdr_name, q_u->num_names2);
4423 for (i = 0; i < q_u->num_names2; i++)
4425 smb_io_unihdr ("", &(q_u->hdr_name[i]), ps, depth);
4427 for (i = 0; i < q_u->num_names2; i++)
4429 smb_io_unistr2("", &(q_u->uni_name[i]), q_u->hdr_name[i].buffer, ps, depth);
4439 /*******************************************************************
4440 makes a SAMR_R_LOOKUP_NAMES structure.
4441 ********************************************************************/
4442 BOOL make_samr_r_lookup_names(SAMR_R_LOOKUP_NAMES *r_u,
4443 uint32 num_rids, uint32 *rid, uint8 *type, uint32 status)
4446 if (r_u == NULL) return False;
4448 DEBUG(5,("make_samr_r_lookup_names\n"));
4452 r_u->num_types1 = num_rids;
4454 r_u->num_types2 = num_rids;
4456 r_u->num_rids1 = num_rids;
4458 r_u->num_rids2 = num_rids;
4460 SMB_ASSERT_ARRAY(r_u->rid, num_rids);
4462 for (i = 0; i < num_rids; i++)
4464 r_u->rid [i] = rid [i];
4465 r_u->type[i] = type[i];
4470 r_u->num_types1 = 0;
4472 r_u->num_types2 = 0;
4479 r_u->status = status;
4484 /*******************************************************************
4485 reads or writes a structure.
4486 ********************************************************************/
4487 BOOL samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES *r_u, prs_struct *ps, int depth)
4492 if (r_u == NULL) return False;
4494 prs_debug(ps, depth, desc, "samr_io_r_lookup_names");
4499 prs_uint32("num_rids1", ps, depth, &(r_u->num_rids1));
4500 prs_uint32("ptr_rids ", ps, depth, &(r_u->ptr_rids ));
4502 if (r_u->ptr_rids != 0)
4504 prs_uint32("num_rids2", ps, depth, &(r_u->num_rids2));
4506 if (r_u->num_rids2 != r_u->num_rids1)
4512 for (i = 0; i < r_u->num_rids2; i++)
4514 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
4515 prs_uint32(tmp, ps, depth, &(r_u->rid[i]));
4519 prs_uint32("num_types1", ps, depth, &(r_u->num_types1));
4520 prs_uint32("ptr_types ", ps, depth, &(r_u->ptr_types ));
4522 if (r_u->ptr_types != 0)
4524 prs_uint32("num_types2", ps, depth, &(r_u->num_types2));
4526 if (r_u->num_types2 != r_u->num_types1)
4532 for (i = 0; i < r_u->num_types2; i++)
4534 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
4535 prs_uint32(tmp, ps, depth, &(r_u->type[i]));
4539 prs_uint32("status", ps, depth, &(r_u->status));
4545 /*******************************************************************
4546 reads or writes a structure.
4547 ********************************************************************/
4548 BOOL make_samr_q_open_user(SAMR_Q_OPEN_USER *q_u,
4549 const POLICY_HND *pol,
4550 uint32 unk_0, uint32 rid)
4552 if (q_u == NULL) return False;
4554 DEBUG(5,("samr_make_samr_q_open_user\n"));
4556 memcpy(&q_u->domain_pol, pol, sizeof(q_u->domain_pol));
4558 q_u->unknown_0 = unk_0;
4559 q_u->user_rid = rid;
4564 /*******************************************************************
4565 reads or writes a structure.
4566 ********************************************************************/
4567 BOOL samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER *q_u, prs_struct *ps, int depth)
4569 if (q_u == NULL) return False;
4571 prs_debug(ps, depth, desc, "samr_io_q_open_user");
4576 smb_io_pol_hnd("domain_pol", &(q_u->domain_pol), ps, depth);
4579 prs_uint32("unknown_0", ps, depth, &(q_u->unknown_0));
4580 prs_uint32("user_rid ", ps, depth, &(q_u->user_rid ));
4587 /*******************************************************************
4588 reads or writes a structure.
4589 ********************************************************************/
4590 BOOL samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER *r_u, prs_struct *ps, int depth)
4592 if (r_u == NULL) return False;
4594 prs_debug(ps, depth, desc, "samr_io_r_open_user");
4599 smb_io_pol_hnd("user_pol", &(r_u->user_pol), ps, depth);
4602 prs_uint32("status", ps, depth, &(r_u->status));
4607 /*******************************************************************
4608 reads or writes a structure.
4609 ********************************************************************/
4610 BOOL make_samr_q_create_user(SAMR_Q_CREATE_USER *q_u,
4613 uint16 acb_info, uint32 unk_1)
4616 if (q_u == NULL) return False;
4617 len_name = strlen(name);
4619 DEBUG(5,("samr_make_samr_q_create_user\n"));
4621 memcpy(&q_u->domain_pol, pol, sizeof(q_u->domain_pol));
4623 make_uni_hdr(&(q_u->hdr_name), len_name);
4624 make_unistr2(&(q_u->uni_name), name, len_name);
4626 q_u->acb_info = acb_info;
4627 q_u->unknown_1 = unk_1;
4632 /*******************************************************************
4633 reads or writes a structure.
4634 ********************************************************************/
4635 BOOL samr_io_q_create_user(char *desc, SAMR_Q_CREATE_USER *q_u, prs_struct *ps, int depth)
4637 if (q_u == NULL) return False;
4639 prs_debug(ps, depth, desc, "samr_io_q_create_user");
4644 smb_io_pol_hnd("domain_pol", &(q_u->domain_pol), ps, depth);
4647 smb_io_unihdr ("unihdr", &(q_u->hdr_name), ps, depth);
4648 smb_io_unistr2("unistr2", &(q_u->uni_name), q_u->hdr_name.buffer, ps, depth);
4651 prs_uint16("acb_info", ps, depth, &(q_u->acb_info));
4653 prs_uint32("unknown_1", ps, depth, &(q_u->unknown_1));
4660 /*******************************************************************
4661 reads or writes a structure.
4662 ********************************************************************/
4663 BOOL make_samr_r_create_user(SAMR_R_CREATE_USER *r_u,
4664 POLICY_HND *user_pol,
4665 uint32 unk_0, uint32 user_rid,
4668 if (r_u == NULL) return False;
4670 DEBUG(5,("samr_make_samr_r_create_user\n"));
4672 memcpy(&r_u->user_pol, user_pol, sizeof(r_u->user_pol));
4674 r_u->unknown_0 = unk_0;
4675 r_u->user_rid = user_rid;
4676 r_u->status = status;
4681 /*******************************************************************
4682 reads or writes a structure.
4683 ********************************************************************/
4684 BOOL samr_io_r_create_user(char *desc, SAMR_R_CREATE_USER *r_u, prs_struct *ps, int depth)
4686 if (r_u == NULL) return False;
4688 prs_debug(ps, depth, desc, "samr_io_r_create_user");
4693 smb_io_pol_hnd("user_pol", &(r_u->user_pol), ps, depth);
4696 prs_uint32("unknown_0", ps, depth, &(r_u->unknown_0));
4697 prs_uint32("user_rid ", ps, depth, &(r_u->user_rid ));
4698 prs_uint32("status", ps, depth, &(r_u->status));
4703 /*******************************************************************
4704 makes a SAMR_Q_QUERY_USERINFO structure.
4705 ********************************************************************/
4706 BOOL make_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u,
4707 POLICY_HND *hnd, uint16 switch_value)
4709 if (q_u == NULL || hnd == NULL) return False;
4711 DEBUG(5,("make_samr_q_query_userinfo\n"));
4713 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
4714 q_u->switch_value = switch_value;
4720 /*******************************************************************
4721 reads or writes a structure.
4722 ********************************************************************/
4723 BOOL samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO *q_u, prs_struct *ps, int depth)
4725 if (q_u == NULL) return False;
4727 prs_debug(ps, depth, desc, "samr_io_q_query_userinfo");
4732 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
4735 prs_uint16("switch_value", ps, depth, &(q_u->switch_value)); /* 0x0015 or 0x0011 */
4742 /*******************************************************************
4743 reads or writes a LOGON_HRS structure.
4744 ********************************************************************/
4745 static BOOL sam_io_logon_hrs(char *desc, LOGON_HRS *hrs, prs_struct *ps, int depth)
4747 if (hrs == NULL) return False;
4749 prs_debug(ps, depth, desc, "sam_io_logon_hrs");
4754 prs_uint32 ( "len ", ps, depth, &(hrs->len ));
4758 DEBUG(5,("sam_io_logon_hrs: truncating length\n"));
4762 prs_uint8s (False, "hours", ps, depth, hrs->hours, hrs->len);
4767 /*******************************************************************
4768 makes a SAM_USER_INFO_10 structure.
4769 ********************************************************************/
4770 BOOL make_sam_user_info10(SAM_USER_INFO_10 *usr,
4773 if (usr == NULL) return False;
4775 DEBUG(5,("make_sam_user_info10\n"));
4777 usr->acb_info = acb_info;
4782 /*******************************************************************
4783 reads or writes a structure.
4784 ********************************************************************/
4785 BOOL sam_io_user_info10(char *desc, SAM_USER_INFO_10 *usr, prs_struct *ps, int depth)
4787 if (usr == NULL) return False;
4789 prs_debug(ps, depth, desc, "samr_io_r_user_info10");
4794 prs_uint32("acb_info", ps, depth, &(usr->acb_info));
4799 /*******************************************************************
4800 makes a SAM_USER_INFO_11 structure.
4801 ********************************************************************/
4802 BOOL make_sam_user_info11(SAM_USER_INFO_11 *usr,
4811 if (usr == NULL || expiry == NULL || mach_acct == NULL) return False;
4813 DEBUG(5,("make_sam_user_info11\n"));
4815 len_mach_acct = strlen(mach_acct);
4817 memcpy(&(usr->expiry),expiry, sizeof(usr->expiry)); /* expiry time or something? */
4818 bzero(usr->padding_1, sizeof(usr->padding_1)); /* 0 - padding 24 bytes */
4820 make_uni_hdr(&(usr->hdr_mach_acct), len_mach_acct); /* unicode header for machine account */
4821 usr->padding_2 = 0; /* 0 - padding 4 bytes */
4823 usr->ptr_1 = 1; /* pointer */
4824 bzero(usr->padding_3, sizeof(usr->padding_3)); /* 0 - padding 32 bytes */
4825 usr->padding_4 = 0; /* 0 - padding 4 bytes */
4827 usr->ptr_2 = 1; /* pointer */
4828 usr->padding_5 = 0; /* 0 - padding 4 bytes */
4830 usr->ptr_3 = 1; /* pointer */
4831 bzero(usr->padding_6, sizeof(usr->padding_6)); /* 0 - padding 32 bytes */
4833 usr->rid_user = rid_user;
4834 usr->rid_group = rid_group;
4836 usr->acct_ctrl = acct_ctrl;
4837 usr->unknown_3 = 0x0000;
4839 usr->unknown_4 = 0x003f; /* 0x003f - 16 bit unknown */
4840 usr->unknown_5 = 0x003c; /* 0x003c - 16 bit unknown */
4842 bzero(usr->padding_7, sizeof(usr->padding_7)); /* 0 - padding 16 bytes */
4843 usr->padding_8 = 0; /* 0 - padding 4 bytes */
4845 make_unistr2(&(usr->uni_mach_acct), mach_acct, len_mach_acct); /* unicode string for machine account */
4850 /*******************************************************************
4851 reads or writes a structure.
4852 ********************************************************************/
4853 BOOL sam_io_user_info11(char *desc, SAM_USER_INFO_11 *usr, prs_struct *ps, int depth)
4855 if (usr == NULL) return False;
4857 prs_debug(ps, depth, desc, "samr_io_r_unknown_11");
4862 prs_uint8s (False, "padding_0", ps, depth, usr->padding_0, sizeof(usr->padding_0));
4864 smb_io_time("time", &(usr->expiry), ps, depth);
4866 prs_uint8s (False, "padding_1", ps, depth, usr->padding_1, sizeof(usr->padding_1));
4868 smb_io_unihdr ("unihdr", &(usr->hdr_mach_acct), ps, depth);
4869 prs_uint32( "padding_2", ps, depth, &(usr->padding_2));
4871 prs_uint32( "ptr_1 ", ps, depth, &(usr->ptr_1 ));
4872 prs_uint8s (False, "padding_3", ps, depth, usr->padding_3, sizeof(usr->padding_3));
4873 prs_uint32( "padding_4", ps, depth, &(usr->padding_4));
4875 prs_uint32( "ptr_2 ", ps, depth, &(usr->ptr_2 ));
4876 prs_uint32( "padding_5", ps, depth, &(usr->padding_5));
4878 prs_uint32( "ptr_3 ", ps, depth, &(usr->ptr_3 ));
4879 prs_uint8s (False, "padding_6", ps, depth, usr->padding_6, sizeof(usr->padding_6));
4881 prs_uint32( "rid_user ", ps, depth, &(usr->rid_user ));
4882 prs_uint32( "rid_group", ps, depth, &(usr->rid_group));
4883 prs_uint16( "acct_ctrl", ps, depth, &(usr->acct_ctrl));
4884 prs_uint16( "unknown_3", ps, depth, &(usr->unknown_3));
4885 prs_uint16( "unknown_4", ps, depth, &(usr->unknown_4));
4886 prs_uint16( "unknown_5", ps, depth, &(usr->unknown_5));
4888 prs_uint8s (False, "padding_7", ps, depth, usr->padding_7, sizeof(usr->padding_7));
4889 prs_uint32( "padding_8", ps, depth, &(usr->padding_8));
4891 smb_io_unistr2("unistr2", &(usr->uni_mach_acct), True, ps, depth);
4894 prs_uint8s (False, "padding_9", ps, depth, usr->padding_9, sizeof(usr->padding_9));
4899 /*************************************************************************
4902 unknown_3 = 0x09f8 27fa
4903 unknown_5 = 0x0001 0000
4904 unknown_6 = 0x0000 04ec
4906 *************************************************************************/
4907 BOOL make_sam_user_info24(SAM_USER_INFO_24 *usr,
4908 char newpass[516], uint16 passlen)
4910 memcpy(usr->pass, newpass, sizeof(usr->pass));
4911 usr->unk_0 = passlen;
4916 /*******************************************************************
4917 reads or writes a structure.
4918 ********************************************************************/
4919 static BOOL sam_io_user_info24(char *desc, SAM_USER_INFO_24 *usr, prs_struct *ps, int depth)
4921 if (usr == NULL) return False;
4923 prs_debug(ps, depth, desc, "sam_io_user_info24");
4928 prs_uint8s (False, "password", ps, depth, usr->pass, sizeof(usr->pass));
4929 prs_uint16("unk_0", ps, depth, &(usr->unk_0)); /* unknown */
4936 /*************************************************************************
4937 make_sam_user_info23
4939 unknown_3 = 0x09f8 27fa
4940 unknown_5 = 0x0001 0000
4941 unknown_6 = 0x0000 04ec
4943 *************************************************************************/
4944 BOOL make_sam_user_info23W(SAM_USER_INFO_23 *usr,
4946 NTTIME *logon_time, /* all zeros */
4947 NTTIME *logoff_time, /* all zeros */
4948 NTTIME *kickoff_time, /* all zeros */
4949 NTTIME *pass_last_set_time, /* all zeros */
4950 NTTIME *pass_can_change_time, /* all zeros */
4951 NTTIME *pass_must_change_time, /* all zeros */
4953 UNISTR2 *user_name, /* NULL */
4964 uint32 user_rid, /* 0x0000 0000 */
4975 int len_user_name = user_name != NULL ? user_name->uni_str_len : 0;
4976 int len_full_name = full_name != NULL ? full_name->uni_str_len : 0;
4977 int len_home_dir = home_dir != NULL ? home_dir ->uni_str_len : 0;
4978 int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0;
4979 int len_logon_script = log_scr != NULL ? log_scr ->uni_str_len : 0;
4980 int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0;
4981 int len_description = desc != NULL ? desc ->uni_str_len : 0;
4982 int len_workstations = wkstas != NULL ? wkstas ->uni_str_len : 0;
4983 int len_unknown_str = unk_str != NULL ? unk_str ->uni_str_len : 0;
4984 int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0;
4986 usr->logon_time = *logon_time; /* all zeros */
4987 usr->logoff_time = *logoff_time; /* all zeros */
4988 usr->kickoff_time = *kickoff_time; /* all zeros */
4989 usr->pass_last_set_time = *pass_last_set_time; /* all zeros */
4990 usr->pass_can_change_time = *pass_can_change_time; /* all zeros */
4991 usr->pass_must_change_time = *pass_must_change_time; /* all zeros */
4993 make_uni_hdr(&(usr->hdr_user_name ), len_user_name ); /* NULL */
4994 make_uni_hdr(&(usr->hdr_full_name ), len_full_name );
4995 make_uni_hdr(&(usr->hdr_home_dir ), len_home_dir );
4996 make_uni_hdr(&(usr->hdr_dir_drive ), len_dir_drive );
4997 make_uni_hdr(&(usr->hdr_logon_script), len_logon_script);
4998 make_uni_hdr(&(usr->hdr_profile_path), len_profile_path);
4999 make_uni_hdr(&(usr->hdr_acct_desc ), len_description );
5000 make_uni_hdr(&(usr->hdr_workstations), len_workstations);
5001 make_uni_hdr(&(usr->hdr_unknown_str ), len_unknown_str );
5002 make_uni_hdr(&(usr->hdr_munged_dial ), len_munged_dial );
5004 bzero(usr->nt_pwd, sizeof(usr->nt_pwd));
5005 bzero(usr->lm_pwd, sizeof(usr->lm_pwd));
5007 usr->user_rid = user_rid; /* 0x0000 0000 */
5008 usr->group_rid = group_rid;
5009 usr->acb_info = acb_info;
5010 usr->unknown_3 = unknown_3; /* 09f8 27fa */
5012 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5013 usr->ptr_logon_hrs = hrs ? 1 : 0;
5015 bzero(usr->padding1, sizeof(usr->padding1));
5017 usr->unknown_5 = unknown_5; /* 0x0001 0000 */
5019 memcpy(usr->pass, newpass, sizeof(usr->pass));
5021 copy_unistr2(&(usr->uni_user_name ), user_name);
5022 copy_unistr2(&(usr->uni_full_name ), full_name);
5023 copy_unistr2(&(usr->uni_home_dir ), home_dir );
5024 copy_unistr2(&(usr->uni_dir_drive ), dir_drive);
5025 copy_unistr2(&(usr->uni_logon_script), log_scr );
5026 copy_unistr2(&(usr->uni_profile_path), prof_path);
5027 copy_unistr2(&(usr->uni_acct_desc ), desc );
5028 copy_unistr2(&(usr->uni_workstations), wkstas );
5029 copy_unistr2(&(usr->uni_unknown_str ), unk_str );
5030 copy_unistr2(&(usr->uni_munged_dial ), mung_dial);
5032 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
5037 memcpy(&(usr->logon_hrs), hrs, sizeof(usr->logon_hrs));
5041 memset(&(usr->logon_hrs), 0xff, sizeof(usr->logon_hrs));
5047 /*************************************************************************
5048 make_sam_user_info23
5050 unknown_3 = 0x09f8 27fa
5051 unknown_5 = 0x0001 0000
5052 unknown_6 = 0x0000 04ec
5054 *************************************************************************/
5055 BOOL make_sam_user_info23A(SAM_USER_INFO_23 *usr,
5057 NTTIME *logon_time, /* all zeros */
5058 NTTIME *logoff_time, /* all zeros */
5059 NTTIME *kickoff_time, /* all zeros */
5060 NTTIME *pass_last_set_time, /* all zeros */
5061 NTTIME *pass_can_change_time, /* all zeros */
5062 NTTIME *pass_must_change_time, /* all zeros */
5064 char *user_name, /* NULL */
5075 uint32 user_rid, /* 0x0000 0000 */
5086 int len_user_name = user_name != NULL ? strlen(user_name) : 0;
5087 int len_full_name = full_name != NULL ? strlen(full_name) : 0;
5088 int len_home_dir = home_dir != NULL ? strlen(home_dir ) : 0;
5089 int len_dir_drive = dir_drive != NULL ? strlen(dir_drive) : 0;
5090 int len_logon_script = log_scr != NULL ? strlen(log_scr ) : 0;
5091 int len_profile_path = prof_path != NULL ? strlen(prof_path) : 0;
5092 int len_description = desc != NULL ? strlen(desc ) : 0;
5093 int len_workstations = wkstas != NULL ? strlen(wkstas ) : 0;
5094 int len_unknown_str = unk_str != NULL ? strlen(unk_str ) : 0;
5095 int len_munged_dial = mung_dial != NULL ? strlen(mung_dial) : 0;
5097 usr->logon_time = *logon_time; /* all zeros */
5098 usr->logoff_time = *logoff_time; /* all zeros */
5099 usr->kickoff_time = *kickoff_time; /* all zeros */
5100 usr->pass_last_set_time = *pass_last_set_time; /* all zeros */
5101 usr->pass_can_change_time = *pass_can_change_time; /* all zeros */
5102 usr->pass_must_change_time = *pass_must_change_time; /* all zeros */
5104 make_uni_hdr(&(usr->hdr_user_name ), len_user_name ); /* NULL */
5105 make_uni_hdr(&(usr->hdr_full_name ), len_full_name );
5106 make_uni_hdr(&(usr->hdr_home_dir ), len_home_dir );
5107 make_uni_hdr(&(usr->hdr_dir_drive ), len_dir_drive );
5108 make_uni_hdr(&(usr->hdr_logon_script), len_logon_script);
5109 make_uni_hdr(&(usr->hdr_profile_path), len_profile_path);
5110 make_uni_hdr(&(usr->hdr_acct_desc ), len_description );
5111 make_uni_hdr(&(usr->hdr_workstations), len_workstations);
5112 make_uni_hdr(&(usr->hdr_unknown_str ), len_unknown_str );
5113 make_uni_hdr(&(usr->hdr_munged_dial ), len_munged_dial );
5115 bzero(usr->nt_pwd, sizeof(usr->nt_pwd));
5116 bzero(usr->lm_pwd, sizeof(usr->lm_pwd));
5118 usr->user_rid = user_rid; /* 0x0000 0000 */
5119 usr->group_rid = group_rid;
5120 usr->acb_info = acb_info;
5121 usr->unknown_3 = unknown_3; /* 09f8 27fa */
5123 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5124 usr->ptr_logon_hrs = hrs ? 1 : 0;
5126 bzero(usr->padding1, sizeof(usr->padding1));
5128 usr->unknown_5 = unknown_5; /* 0x0001 0000 */
5130 memcpy(usr->pass, newpass, sizeof(usr->pass));
5132 make_unistr2(&(usr->uni_user_name ), user_name , len_user_name ); /* NULL */
5133 make_unistr2(&(usr->uni_full_name ), full_name , len_full_name );
5134 make_unistr2(&(usr->uni_home_dir ), home_dir , len_home_dir );
5135 make_unistr2(&(usr->uni_dir_drive ), dir_drive , len_dir_drive );
5136 make_unistr2(&(usr->uni_logon_script), log_scr, len_logon_script);
5137 make_unistr2(&(usr->uni_profile_path), prof_path, len_profile_path);
5138 make_unistr2(&(usr->uni_acct_desc ), desc , len_description );
5139 make_unistr2(&(usr->uni_workstations), wkstas, len_workstations);
5140 make_unistr2(&(usr->uni_unknown_str ), unk_str , len_unknown_str );
5141 make_unistr2(&(usr->uni_munged_dial ), mung_dial , len_munged_dial );
5143 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
5148 memcpy(&(usr->logon_hrs), hrs, sizeof(usr->logon_hrs));
5152 memset(&(usr->logon_hrs), 0xff, sizeof(usr->logon_hrs));
5158 /*******************************************************************
5159 reads or writes a structure.
5160 ********************************************************************/
5161 static BOOL sam_io_user_info16(char *desc, SAM_USER_INFO_16 *usr, prs_struct *ps, int depth)
5163 if (usr == NULL) return False;
5165 prs_debug(ps, depth, desc, "sam_io_user_info16");
5170 prs_uint16("acb_info", ps, depth, &(usr->acb_info));
5176 /*******************************************************************
5177 reads or writes a structure.
5178 ********************************************************************/
5179 static BOOL sam_io_user_info23(char *desc, SAM_USER_INFO_23 *usr, prs_struct *ps, int depth)
5181 if (usr == NULL) return False;
5183 prs_debug(ps, depth, desc, "sam_io_user_info23");
5188 smb_io_time("logon_time ", &(usr->logon_time) , ps, depth);
5189 smb_io_time("logoff_time ", &(usr->logoff_time) , ps, depth);
5190 smb_io_time("kickoff_time ", &(usr->kickoff_time) , ps, depth);
5191 smb_io_time("pass_last_set_time ", &(usr->pass_last_set_time) , ps, depth);
5192 smb_io_time("pass_can_change_time ", &(usr->pass_can_change_time) , ps, depth);
5193 smb_io_time("pass_must_change_time", &(usr->pass_must_change_time), ps, depth);
5195 smb_io_unihdr("hdr_user_name ", &(usr->hdr_user_name) , ps, depth); /* username unicode string header */
5196 smb_io_unihdr("hdr_full_name ", &(usr->hdr_full_name) , ps, depth); /* user's full name unicode string header */
5197 smb_io_unihdr("hdr_home_dir ", &(usr->hdr_home_dir) , ps, depth); /* home directory unicode string header */
5198 smb_io_unihdr("hdr_dir_drive ", &(usr->hdr_dir_drive) , ps, depth); /* home directory drive */
5199 smb_io_unihdr("hdr_logon_script", &(usr->hdr_logon_script), ps, depth); /* logon script unicode string header */
5200 smb_io_unihdr("hdr_profile_path", &(usr->hdr_profile_path), ps, depth); /* profile path unicode string header */
5201 smb_io_unihdr("hdr_acct_desc ", &(usr->hdr_acct_desc ) , ps, depth); /* account desc */
5202 smb_io_unihdr("hdr_workstations", &(usr->hdr_workstations), ps, depth); /* wkstas user can log on from */
5203 smb_io_unihdr("hdr_unknown_str ", &(usr->hdr_unknown_str ), ps, depth); /* unknown string */
5204 smb_io_unihdr("hdr_munged_dial ", &(usr->hdr_munged_dial ), ps, depth); /* wkstas user can log on from */
5206 prs_uint8s (False, "lm_pwd ", ps, depth, usr->lm_pwd , sizeof(usr->lm_pwd ));
5207 prs_uint8s (False, "nt_pwd ", ps, depth, usr->nt_pwd , sizeof(usr->nt_pwd ));
5209 prs_uint32("user_rid ", ps, depth, &(usr->user_rid )); /* User ID */
5210 prs_uint32("group_rid ", ps, depth, &(usr->group_rid )); /* Group ID */
5211 prs_uint16("acb_info ", ps, depth, &(usr->acb_info )); /* Group ID */
5214 prs_uint32("unknown_3 ", ps, depth, &(usr->unknown_3 ));
5215 prs_uint16("logon_divs ", ps, depth, &(usr->logon_divs )); /* logon divisions per week */
5217 prs_uint32("ptr_logon_hrs ", ps, depth, &(usr->ptr_logon_hrs));
5218 prs_uint8s (False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1));
5219 prs_uint32("unknown_5 ", ps, depth, &(usr->unknown_5 ));
5221 prs_uint8s (False, "password ", ps, depth, usr->pass, sizeof(usr->pass));
5223 /* here begins pointed-to data */
5225 smb_io_unistr2("uni_user_name ", &(usr->uni_user_name) , usr->hdr_user_name .buffer, ps, depth); /* username unicode string */
5227 smb_io_unistr2("uni_full_name ", &(usr->uni_full_name) , usr->hdr_full_name .buffer, ps, depth); /* user's full name unicode string */
5229 smb_io_unistr2("uni_home_dir ", &(usr->uni_home_dir) , usr->hdr_home_dir .buffer, ps, depth); /* home directory unicode string */
5231 smb_io_unistr2("uni_dir_drive ", &(usr->uni_dir_drive) , usr->hdr_dir_drive .buffer, ps, depth); /* home directory drive unicode string */
5233 smb_io_unistr2("uni_logon_script", &(usr->uni_logon_script), usr->hdr_logon_script.buffer, ps, depth); /* logon script unicode string */
5235 smb_io_unistr2("uni_profile_path", &(usr->uni_profile_path), usr->hdr_profile_path.buffer, ps, depth); /* profile path unicode string */
5237 smb_io_unistr2("uni_acct_desc ", &(usr->uni_acct_desc ), usr->hdr_acct_desc .buffer, ps, depth); /* user desc unicode string */
5239 smb_io_unistr2("uni_workstations", &(usr->uni_workstations), usr->hdr_workstations.buffer, ps, depth); /* worksations user can log on from */
5241 smb_io_unistr2("uni_unknown_str ", &(usr->uni_unknown_str ), usr->hdr_unknown_str .buffer, ps, depth); /* unknown string */
5243 smb_io_unistr2("uni_munged_dial ", &(usr->uni_munged_dial ), usr->hdr_munged_dial .buffer, ps, depth); /* worksations user can log on from */
5246 prs_uint32("unknown_6 ", ps, depth, &(usr->unknown_6 ));
5247 prs_uint32("padding4 ", ps, depth, &(usr->padding4 ));
5249 if (usr->ptr_logon_hrs)
5251 sam_io_logon_hrs("logon_hrs", &(usr->logon_hrs) , ps, depth);
5259 /*************************************************************************
5260 make_sam_user_info21
5262 unknown_3 = 0x00ff ffff
5263 unknown_5 = 0x0002 0000
5264 unknown_6 = 0x0000 04ec
5266 *************************************************************************/
5267 BOOL make_sam_user_info21(SAM_USER_INFO_21 *usr,
5270 NTTIME *logoff_time,
5271 NTTIME *kickoff_time,
5272 NTTIME *pass_last_set_time,
5273 NTTIME *pass_can_change_time,
5274 NTTIME *pass_must_change_time,
5297 int len_user_name = user_name != NULL ? strlen(user_name) : 0;
5298 int len_full_name = full_name != NULL ? strlen(full_name) : 0;
5299 int len_home_dir = home_dir != NULL ? strlen(home_dir ) : 0;
5300 int len_dir_drive = dir_drive != NULL ? strlen(dir_drive) : 0;
5301 int len_logon_script = log_scr != NULL ? strlen(log_scr ) : 0;
5302 int len_profile_path = prof_path != NULL ? strlen(prof_path) : 0;
5303 int len_description = desc != NULL ? strlen(desc ) : 0;
5304 int len_workstations = wkstas != NULL ? strlen(wkstas ) : 0;
5305 int len_unknown_str = unk_str != NULL ? strlen(unk_str ) : 0;
5306 int len_munged_dial = mung_dial != NULL ? strlen(mung_dial) : 0;
5308 usr->logon_time = *logon_time;
5309 usr->logoff_time = *logoff_time;
5310 usr->kickoff_time = *kickoff_time;
5311 usr->pass_last_set_time = *pass_last_set_time;
5312 usr->pass_can_change_time = *pass_can_change_time;
5313 usr->pass_must_change_time = *pass_must_change_time;
5315 make_uni_hdr(&(usr->hdr_user_name ), len_user_name );
5316 make_uni_hdr(&(usr->hdr_full_name ), len_full_name );
5317 make_uni_hdr(&(usr->hdr_home_dir ), len_home_dir );
5318 make_uni_hdr(&(usr->hdr_dir_drive ), len_dir_drive );
5319 make_uni_hdr(&(usr->hdr_logon_script), len_logon_script);
5320 make_uni_hdr(&(usr->hdr_profile_path), len_profile_path);
5321 make_uni_hdr(&(usr->hdr_acct_desc ), len_description );
5322 make_uni_hdr(&(usr->hdr_workstations), len_workstations);
5323 make_uni_hdr(&(usr->hdr_unknown_str ), len_unknown_str );
5324 make_uni_hdr(&(usr->hdr_munged_dial ), len_munged_dial );
5326 bzero(usr->nt_pwd, sizeof(usr->nt_pwd));
5327 bzero(usr->lm_pwd, sizeof(usr->lm_pwd));
5329 usr->user_rid = user_rid;
5330 usr->group_rid = group_rid;
5331 usr->acb_info = acb_info;
5332 usr->unknown_3 = unknown_3; /* 0x00ff ffff */
5334 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5335 usr->ptr_logon_hrs = hrs ? 1 : 0;
5336 usr->unknown_5 = unknown_5; /* 0x0002 0000 */
5338 bzero(usr->padding1, sizeof(usr->padding1));
5340 make_unistr2(&(usr->uni_user_name ), user_name , len_user_name );
5341 make_unistr2(&(usr->uni_full_name ), full_name , len_full_name );
5342 make_unistr2(&(usr->uni_home_dir ), home_dir , len_home_dir );
5343 make_unistr2(&(usr->uni_dir_drive ), dir_drive , len_dir_drive );
5344 make_unistr2(&(usr->uni_logon_script), log_scr, len_logon_script);
5345 make_unistr2(&(usr->uni_profile_path), prof_path, len_profile_path);
5346 make_unistr2(&(usr->uni_acct_desc ), desc , len_description );
5347 make_unistr2(&(usr->uni_workstations), wkstas, len_workstations);
5348 make_unistr2(&(usr->uni_unknown_str ), unk_str , len_unknown_str );
5349 make_unistr2(&(usr->uni_munged_dial ), mung_dial , len_munged_dial );
5351 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
5356 memcpy(&(usr->logon_hrs), hrs, sizeof(usr->logon_hrs));
5360 memset(&(usr->logon_hrs), 0xff, sizeof(usr->logon_hrs));
5367 /*******************************************************************
5368 reads or writes a structure.
5369 ********************************************************************/
5370 static BOOL sam_io_user_info21(char *desc, SAM_USER_INFO_21 *usr, prs_struct *ps, int depth)
5372 if (usr == NULL) return False;
5374 prs_debug(ps, depth, desc, "sam_io_user_info21");
5379 smb_io_time("logon_time ", &(usr->logon_time) , ps, depth);
5380 smb_io_time("logoff_time ", &(usr->logoff_time) , ps, depth);
5381 smb_io_time("kickoff_time ", &(usr->kickoff_time) , ps, depth);
5382 smb_io_time("pass_last_set_time ", &(usr->pass_last_set_time) , ps, depth);
5383 smb_io_time("pass_can_change_time ", &(usr->pass_can_change_time) , ps, depth);
5384 smb_io_time("pass_must_change_time", &(usr->pass_must_change_time), ps, depth);
5386 smb_io_unihdr("hdr_user_name ", &(usr->hdr_user_name) , ps, depth); /* username unicode string header */
5387 smb_io_unihdr("hdr_full_name ", &(usr->hdr_full_name) , ps, depth); /* user's full name unicode string header */
5388 smb_io_unihdr("hdr_home_dir ", &(usr->hdr_home_dir) , ps, depth); /* home directory unicode string header */
5389 smb_io_unihdr("hdr_dir_drive ", &(usr->hdr_dir_drive) , ps, depth); /* home directory drive */
5390 smb_io_unihdr("hdr_logon_script", &(usr->hdr_logon_script), ps, depth); /* logon script unicode string header */
5391 smb_io_unihdr("hdr_profile_path", &(usr->hdr_profile_path), ps, depth); /* profile path unicode string header */
5392 smb_io_unihdr("hdr_acct_desc ", &(usr->hdr_acct_desc ) , ps, depth); /* account desc */
5393 smb_io_unihdr("hdr_workstations", &(usr->hdr_workstations), ps, depth); /* wkstas user can log on from */
5394 smb_io_unihdr("hdr_unknown_str ", &(usr->hdr_unknown_str ), ps, depth); /* unknown string */
5395 smb_io_unihdr("hdr_munged_dial ", &(usr->hdr_munged_dial ), ps, depth); /* wkstas user can log on from */
5397 prs_uint8s (False, "lm_pwd ", ps, depth, usr->lm_pwd , sizeof(usr->lm_pwd ));
5398 prs_uint8s (False, "nt_pwd ", ps, depth, usr->nt_pwd , sizeof(usr->nt_pwd ));
5400 prs_uint32("user_rid ", ps, depth, &(usr->user_rid )); /* User ID */
5401 prs_uint32("group_rid ", ps, depth, &(usr->group_rid )); /* Group ID */
5402 prs_uint16("acb_info ", ps, depth, &(usr->acb_info )); /* Group ID */
5405 prs_uint32("unknown_3 ", ps, depth, &(usr->unknown_3 ));
5406 prs_uint16("logon_divs ", ps, depth, &(usr->logon_divs )); /* logon divisions per week */
5408 prs_uint32("ptr_logon_hrs ", ps, depth, &(usr->ptr_logon_hrs));
5409 prs_uint32("unknown_5 ", ps, depth, &(usr->unknown_5 ));
5411 prs_uint8s (False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1));
5413 /* here begins pointed-to data */
5415 smb_io_unistr2("uni_user_name ", &(usr->uni_user_name) , usr->hdr_user_name .buffer, ps, depth); /* username unicode string */
5417 smb_io_unistr2("uni_full_name ", &(usr->uni_full_name) , usr->hdr_full_name .buffer, ps, depth); /* user's full name unicode string */
5419 smb_io_unistr2("uni_home_dir ", &(usr->uni_home_dir) , usr->hdr_home_dir .buffer, ps, depth); /* home directory unicode string */
5421 smb_io_unistr2("uni_dir_drive ", &(usr->uni_dir_drive) , usr->hdr_dir_drive .buffer, ps, depth); /* home directory drive unicode string */
5423 smb_io_unistr2("uni_logon_script", &(usr->uni_logon_script), usr->hdr_logon_script.buffer, ps, depth); /* logon script unicode string */
5425 smb_io_unistr2("uni_profile_path", &(usr->uni_profile_path), usr->hdr_profile_path.buffer, ps, depth); /* profile path unicode string */
5427 smb_io_unistr2("uni_acct_desc ", &(usr->uni_acct_desc ), usr->hdr_acct_desc .buffer, ps, depth); /* user desc unicode string */
5429 smb_io_unistr2("uni_workstations", &(usr->uni_workstations), usr->hdr_workstations.buffer, ps, depth); /* worksations user can log on from */
5431 smb_io_unistr2("uni_unknown_str ", &(usr->uni_unknown_str ), usr->hdr_unknown_str .buffer, ps, depth); /* unknown string */
5433 smb_io_unistr2("uni_munged_dial ", &(usr->uni_munged_dial ), usr->hdr_munged_dial .buffer, ps, depth); /* worksations user can log on from */
5436 prs_uint32("unknown_6 ", ps, depth, &(usr->unknown_6 ));
5437 prs_uint32("padding4 ", ps, depth, &(usr->padding4 ));
5439 if (usr->ptr_logon_hrs)
5441 sam_io_logon_hrs("logon_hrs", &(usr->logon_hrs) , ps, depth);
5449 /*******************************************************************
5450 makes a SAMR_R_QUERY_USERINFO structure.
5451 ********************************************************************/
5452 BOOL make_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO *r_u,
5453 uint16 switch_value, void *info, uint32 status)
5456 if (r_u == NULL || info == NULL) return False;
5458 DEBUG(5,("make_samr_r_query_userinfo\n"));
5461 r_u->switch_value = 0;
5465 r_u->switch_value = switch_value;
5467 switch (switch_value)
5472 r_u->info.id10 = (SAM_USER_INFO_10*)info;
5480 r_u->info.id11 = (SAM_USER_INFO_11*)info;
5488 r_u->info.id21 = (SAM_USER_INFO_21*)info;
5496 r_u->info.id23 = (SAM_USER_INFO_23*)info;
5504 r_u->info.id24 = (SAM_USER_INFO_24*)info;
5511 DEBUG(4,("make_samr_r_query_userinfo: unsupported switch level\n"));
5517 r_u->status = status; /* return status */
5522 /*******************************************************************
5523 reads or writes a structure.
5524 ********************************************************************/
5525 BOOL samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO *r_u, prs_struct *ps, int depth)
5527 if (r_u == NULL) return False;
5529 prs_debug(ps, depth, desc, "samr_io_r_query_userinfo");
5534 prs_uint32("ptr ", ps, depth, &(r_u->ptr ));
5535 prs_uint16("switch_value", ps, depth, &(r_u->switch_value));
5538 if (r_u->ptr != 0 && r_u->switch_value != 0 && r_u->info.id != NULL)
5540 switch (r_u->switch_value)
5544 if (r_u->info.id10 != NULL)
5546 sam_io_user_info10("", r_u->info.id10, ps, depth);
5550 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
5558 if (r_u->info.id11 != NULL)
5560 sam_io_user_info11("", r_u->info.id11, ps, depth);
5564 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
5572 if (r_u->info.id21 != NULL)
5574 sam_io_user_info21("", r_u->info.id21, ps, depth);
5578 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
5585 if (r_u->info.id23 != NULL)
5587 sam_io_user_info23("", r_u->info.id23, ps, depth);
5591 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
5598 if (r_u->info.id24 != NULL)
5600 sam_io_user_info24("", r_u->info.id24, ps, depth);
5604 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
5611 DEBUG(2,("samr_io_r_query_userinfo: unknown switch level\n"));
5618 prs_uint32("status", ps, depth, &(r_u->status));
5623 /*******************************************************************
5624 makes a SAMR_Q_SET_USERINFO structure.
5625 ********************************************************************/
5626 BOOL make_samr_q_set_userinfo(SAMR_Q_SET_USERINFO *q_u,
5628 uint16 switch_value, void *info)
5630 if (q_u == NULL || hnd == NULL) return False;
5632 DEBUG(5,("make_samr_q_set_userinfo\n"));
5634 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
5635 q_u->switch_value = switch_value;
5636 q_u->switch_value2 = switch_value;
5637 q_u->info.id = info;
5639 switch (switch_value)
5644 if (!cli_get_usr_sesskey(hnd, sess_key))
5648 SamOEMhash(q_u->info.id24->pass, sess_key, 1);
5649 #ifdef DEBUG_PASSWORD
5650 dump_data(100, sess_key, 16);
5651 dump_data(100, q_u->info.id24->pass, 516);
5658 if (!cli_get_usr_sesskey(hnd, sess_key))
5662 SamOEMhash(q_u->info.id23->pass, sess_key, 1);
5663 #ifdef DEBUG_PASSWORD
5664 dump_data(100, sess_key, 16);
5665 dump_data(100, q_u->info.id23->pass, 516);
5671 DEBUG(4,("make_samr_q_set_userinfo: unsupported switch level\n"));
5680 /*******************************************************************
5681 reads or writes a structure.
5682 ********************************************************************/
5683 BOOL samr_io_q_set_userinfo(char *desc, SAMR_Q_SET_USERINFO *q_u, prs_struct *ps, int depth)
5685 if (q_u == NULL) return False;
5687 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo");
5692 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
5695 prs_uint16("switch_value ", ps, depth, &(q_u->switch_value ));
5696 prs_uint16("switch_value2", ps, depth, &(q_u->switch_value2));
5700 switch (q_u->switch_value)
5711 q_u->info.id = (SAM_USER_INFO_24*)Realloc(NULL,
5712 sizeof(*q_u->info.id24));
5714 if (q_u->info.id == NULL)
5716 DEBUG(2,("samr_io_q_query_userinfo: info pointer not initialised\n"));
5719 sam_io_user_info24("", q_u->info.id24, ps, depth);
5727 q_u->info.id = (SAM_USER_INFO_23*)Realloc(NULL,
5728 sizeof(*q_u->info.id23));
5730 if (q_u->info.id == NULL)
5732 DEBUG(2,("samr_io_q_query_userinfo: info pointer not initialised\n"));
5735 sam_io_user_info23("", q_u->info.id23, ps, depth);
5740 DEBUG(2,("samr_io_q_query_userinfo: unknown switch level\n"));
5750 free_samr_q_set_userinfo(q_u);
5756 /*******************************************************************
5758 ********************************************************************/
5759 void free_samr_q_set_userinfo(SAMR_Q_SET_USERINFO *q_u)
5761 if (q_u->info.id == NULL)
5765 q_u->info.id = NULL;
5768 /*******************************************************************
5769 makes a SAMR_R_SET_USERINFO structure.
5770 ********************************************************************/
5771 BOOL make_samr_r_set_userinfo(SAMR_R_SET_USERINFO *r_u, uint32 status)
5774 if (r_u == NULL) return False;
5776 DEBUG(5,("make_samr_r_set_userinfo\n"));
5778 r_u->status = status; /* return status */
5783 /*******************************************************************
5784 reads or writes a structure.
5785 ********************************************************************/
5786 BOOL samr_io_r_set_userinfo(char *desc, SAMR_R_SET_USERINFO *r_u, prs_struct *ps, int depth)
5788 if (r_u == NULL) return False;
5790 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo");
5795 prs_uint32("status", ps, depth, &(r_u->status));
5800 /*******************************************************************
5801 makes a SAMR_Q_SET_USERINFO2 structure.
5802 ********************************************************************/
5803 BOOL make_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 *q_u,
5805 uint16 switch_value, void *info)
5807 if (q_u == NULL || hnd == NULL) return False;
5809 DEBUG(5,("make_samr_q_set_userinfo2\n"));
5811 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
5812 q_u->switch_value = switch_value;
5813 q_u->switch_value2 = switch_value;
5814 q_u->info.id = info;
5816 switch (switch_value)
5824 DEBUG(4,("make_samr_q_set_userinfo2: unsupported switch level\n"));
5833 /*******************************************************************
5834 reads or writes a structure.
5835 ********************************************************************/
5836 BOOL samr_io_q_set_userinfo2(char *desc, SAMR_Q_SET_USERINFO2 *q_u, prs_struct *ps, int depth)
5838 if (q_u == NULL) return False;
5840 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo2");
5845 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
5848 prs_uint16("switch_value ", ps, depth, &(q_u->switch_value ));
5849 prs_uint16("switch_value2", ps, depth, &(q_u->switch_value2));
5853 switch (q_u->switch_value)
5864 q_u->info.id = (SAM_USER_INFO_16*)Realloc(NULL,
5865 sizeof(*q_u->info.id16));
5867 if (q_u->info.id == NULL)
5869 DEBUG(2,("samr_io_q_query_userinfo2: info pointer not initialised\n"));
5872 sam_io_user_info16("", q_u->info.id16, ps, depth);
5877 DEBUG(2,("samr_io_q_query_userinfo2: unknown switch level\n"));
5887 free_samr_q_set_userinfo2(q_u);
5893 /*******************************************************************
5895 ********************************************************************/
5896 void free_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 *q_u)
5898 if (q_u->info.id == NULL)
5902 q_u->info.id = NULL;
5905 /*******************************************************************
5906 makes a SAMR_R_SET_USERINFO2 structure.
5907 ********************************************************************/
5908 BOOL make_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 *r_u,
5911 if (r_u == NULL) return False;
5913 DEBUG(5,("make_samr_r_set_userinfo2\n"));
5915 r_u->status = status; /* return status */
5920 /*******************************************************************
5921 reads or writes a structure.
5922 ********************************************************************/
5923 BOOL samr_io_r_set_userinfo2(char *desc, SAMR_R_SET_USERINFO2 *r_u, prs_struct *ps, int depth)
5925 if (r_u == NULL) return False;
5927 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo2");
5932 prs_uint32("status", ps, depth, &(r_u->status));
5937 /*******************************************************************
5938 makes a SAMR_Q_CONNECT structure.
5939 ********************************************************************/
5940 BOOL make_samr_q_connect(SAMR_Q_CONNECT *q_u,
5941 const char *srv_name, uint32 unknown_0)
5943 int len_srv_name = strlen(srv_name);
5945 if (q_u == NULL) return False;
5947 DEBUG(5,("make_samr_q_connect\n"));
5949 /* make PDC server name \\server */
5950 q_u->ptr_srv_name = len_srv_name > 0 ? 1 : 0;
5951 make_unistr2(&(q_u->uni_srv_name), srv_name, len_srv_name+1);
5953 /* example values: 0x0000 0002 */
5954 q_u->unknown_0 = unknown_0;
5960 /*******************************************************************
5961 reads or writes a structure.
5962 ********************************************************************/
5963 BOOL samr_io_q_connect(char *desc, SAMR_Q_CONNECT *q_u, prs_struct *ps, int depth)
5965 if (q_u == NULL) return False;
5967 prs_debug(ps, depth, desc, "samr_io_q_connect");
5972 prs_uint32("ptr_srv_name", ps, depth, &(q_u->ptr_srv_name));
5973 smb_io_unistr2("", &(q_u->uni_srv_name), q_u->ptr_srv_name, ps, depth);
5977 prs_uint32("unknown_0 ", ps, depth, &(q_u->unknown_0 ));
5982 /*******************************************************************
5983 reads or writes a structure.
5984 ********************************************************************/
5985 BOOL samr_io_r_connect(char *desc, SAMR_R_CONNECT *r_u, prs_struct *ps, int depth)
5987 if (r_u == NULL) return False;
5989 prs_debug(ps, depth, desc, "samr_io_r_connect");
5994 smb_io_pol_hnd("connect_pol", &(r_u->connect_pol), ps, depth);
5997 prs_uint32("status", ps, depth, &(r_u->status));
6002 /*******************************************************************
6003 makes a SAMR_Q_CONNECT_ANON structure.
6004 ********************************************************************/
6005 BOOL make_samr_q_connect_anon(SAMR_Q_CONNECT_ANON *q_u)
6007 if (q_u == NULL) return False;
6009 DEBUG(5,("make_samr_q_connect_anon\n"));
6012 q_u->unknown_0 = 0x5c; /* server name (?!!) */
6013 q_u->unknown_1 = 0x01;
6014 q_u->unknown_2 = 0x20;
6020 /*******************************************************************
6021 reads or writes a structure.
6022 ********************************************************************/
6023 BOOL samr_io_q_connect_anon(char *desc, SAMR_Q_CONNECT_ANON *q_u, prs_struct *ps, int depth)
6025 if (q_u == NULL) return False;
6027 prs_debug(ps, depth, desc, "samr_io_q_connect_anon");
6032 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
6033 prs_uint16("unknown_0", ps, depth, &(q_u->unknown_0));
6034 prs_uint16("unknown_1", ps, depth, &(q_u->unknown_1));
6035 prs_uint32("unknown_2", ps, depth, &(q_u->unknown_2));
6040 /*******************************************************************
6041 reads or writes a structure.
6042 ********************************************************************/
6043 BOOL samr_io_r_connect_anon(char *desc, SAMR_R_CONNECT_ANON *r_u, prs_struct *ps, int depth)
6045 if (r_u == NULL) return False;
6047 prs_debug(ps, depth, desc, "samr_io_r_connect_anon");
6052 smb_io_pol_hnd("connect_pol", &(r_u->connect_pol), ps, depth);
6055 prs_uint32("status", ps, depth, &(r_u->status));
6060 /*******************************************************************
6061 makes a SAMR_Q_UNKNOWN_38 structure.
6062 ********************************************************************/
6063 BOOL make_samr_q_unknown_38(SAMR_Q_UNKNOWN_38 *q_u, char *srv_name)
6065 int len_srv_name = strlen(srv_name);
6067 if (q_u == NULL) return False;
6069 DEBUG(5,("make_samr_q_unknown_38\n"));
6072 make_uni_hdr(&(q_u->hdr_srv_name), len_srv_name);
6073 make_unistr2(&(q_u->uni_srv_name), srv_name, len_srv_name);
6079 /*******************************************************************
6080 reads or writes a structure.
6081 ********************************************************************/
6082 BOOL samr_io_q_unknown_38(char *desc, SAMR_Q_UNKNOWN_38 *q_u, prs_struct *ps, int depth)
6084 if (q_u == NULL) return False;
6086 prs_debug(ps, depth, desc, "samr_io_q_unknown_38");
6091 prs_uint32("ptr", ps, depth, &(q_u->ptr));
6094 smb_io_unihdr ("", &(q_u->hdr_srv_name), ps, depth);
6095 smb_io_unistr2("", &(q_u->uni_srv_name), q_u->hdr_srv_name.buffer, ps, depth);
6102 /*******************************************************************
6103 makes a SAMR_R_UNKNOWN_38 structure.
6104 ********************************************************************/
6105 BOOL make_samr_r_unknown_38(SAMR_R_UNKNOWN_38 *r_u)
6107 if (r_u == NULL) return False;
6109 DEBUG(5,("make_r_unknown_38\n"));
6119 /*******************************************************************
6120 reads or writes a structure.
6121 ********************************************************************/
6122 BOOL samr_io_r_unknown_38(char *desc, SAMR_R_UNKNOWN_38 *r_u, prs_struct *ps, int depth)
6124 if (r_u == NULL) return False;
6126 prs_debug(ps, depth, desc, "samr_io_r_unknown_38");
6131 prs_uint16("unk_0", ps, depth, &(r_u->unk_0));
6133 prs_uint16("unk_1", ps, depth, &(r_u->unk_1));
6135 prs_uint16("unk_2", ps, depth, &(r_u->unk_2));
6137 prs_uint16("unk_3", ps, depth, &(r_u->unk_3));
6143 /*******************************************************************
6144 make a SAMR_ENC_PASSWD structure.
6145 ********************************************************************/
6146 BOOL make_enc_passwd(SAMR_ENC_PASSWD *pwd, char pass[512])
6148 if (pwd == NULL) return False;
6151 memcpy(pwd->pass, pass, sizeof(pwd->pass));
6156 /*******************************************************************
6157 reads or writes a SAMR_ENC_PASSWD structure.
6158 ********************************************************************/
6159 BOOL samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD *pwd, prs_struct *ps, int depth)
6161 if (pwd == NULL) return False;
6163 prs_debug(ps, depth, desc, "samr_io_enc_passwd");
6168 prs_uint32("ptr", ps, depth, &(pwd->ptr));
6169 prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass));
6174 /*******************************************************************
6175 makes a SAMR_ENC_HASH structure.
6176 ********************************************************************/
6177 BOOL make_enc_hash(SAMR_ENC_HASH *hsh, uchar hash[16])
6179 if (hsh == NULL) return False;
6182 memcpy(hsh->hash, hash, sizeof(hsh->hash));
6187 /*******************************************************************
6188 reads or writes a SAMR_ENC_HASH structure.
6189 ********************************************************************/
6190 BOOL samr_io_enc_hash(char *desc, SAMR_ENC_HASH *hsh, prs_struct *ps, int depth)
6192 if (hsh == NULL) return False;
6194 prs_debug(ps, depth, desc, "samr_io_enc_hash");
6199 prs_uint32("ptr ", ps, depth, &(hsh->ptr));
6200 prs_uint8s(False, "hash", ps, depth, hsh->hash, sizeof(hsh->hash));
6205 /*******************************************************************
6206 makes a SAMR_R_UNKNOWN_38 structure.
6207 ********************************************************************/
6208 BOOL make_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER *q_u,
6209 char *dest_host, char *user_name,
6210 char nt_newpass[516], uchar nt_oldhash[16],
6211 char lm_newpass[516], uchar lm_oldhash[16])
6213 int len_dest_host = strlen(dest_host);
6214 int len_user_name = strlen(user_name);
6216 if (q_u == NULL) return False;
6218 DEBUG(5,("make_samr_q_chgpasswd_user\n"));
6221 make_uni_hdr(&(q_u->hdr_dest_host), len_dest_host);
6222 make_unistr2(&(q_u->uni_dest_host), dest_host, len_dest_host);
6223 make_uni_hdr(&(q_u->hdr_user_name), len_user_name);
6224 make_unistr2(&(q_u->uni_user_name), user_name, len_user_name);
6226 make_enc_passwd(&(q_u->nt_newpass), nt_newpass);
6227 make_enc_hash (&(q_u->nt_oldhash), nt_oldhash);
6229 q_u->unknown = 0x01;
6231 make_enc_passwd(&(q_u->lm_newpass), lm_newpass);
6232 make_enc_hash (&(q_u->lm_oldhash), lm_oldhash);
6237 /*******************************************************************
6238 reads or writes a structure.
6239 ********************************************************************/
6240 BOOL samr_io_q_chgpasswd_user(char *desc, SAMR_Q_CHGPASSWD_USER *q_u, prs_struct *ps, int depth)
6242 if (q_u == NULL) return False;
6244 prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user");
6249 prs_uint32("ptr_0", ps, depth, &(q_u->ptr_0));
6251 smb_io_unihdr ("", &(q_u->hdr_dest_host), ps, depth);
6252 smb_io_unistr2("", &(q_u->uni_dest_host), q_u->hdr_dest_host.buffer, ps, depth);
6255 smb_io_unihdr ("", &(q_u->hdr_user_name), ps, depth);
6256 smb_io_unistr2("", &(q_u->uni_user_name), q_u->hdr_user_name.buffer, ps, depth);
6259 samr_io_enc_passwd("nt_newpass", &(q_u->nt_newpass), ps, depth);
6260 samr_io_enc_hash ("nt_oldhash", &(q_u->nt_oldhash), ps, depth);
6262 prs_uint32("unknown", ps, depth, &(q_u->unknown));
6264 samr_io_enc_passwd("lm_newpass", &(q_u->lm_newpass), ps, depth);
6265 samr_io_enc_hash ("lm_oldhash", &(q_u->lm_oldhash), ps, depth);
6270 /*******************************************************************
6271 makes a SAMR_R_CHGPASSWD_USER structure.
6272 ********************************************************************/
6273 BOOL make_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER *r_u, uint32 status)
6275 if (r_u == NULL) return False;
6277 DEBUG(5,("make_r_chgpasswd_user\n"));
6279 r_u->status = status;
6284 /*******************************************************************
6285 reads or writes a structure.
6286 ********************************************************************/
6287 BOOL samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER *r_u, prs_struct *ps, int depth)
6289 if (r_u == NULL) return False;
6291 prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user");
6296 prs_uint32("status", ps, depth, &(r_u->status));