2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1997,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
7 * Copyright (C) Paul Ashton 1997.
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 void make_samr_q_close_hnd(SAMR_Q_CLOSE_HND *q_c, POLICY_HND *hnd)
35 if (q_c == NULL || hnd == NULL) return;
37 DEBUG(5,("make_samr_q_close_hnd\n"));
39 memcpy(&(q_c->pol), hnd, sizeof(q_c->pol));
42 /*******************************************************************
43 reads or writes a structure.
44 ********************************************************************/
45 void samr_io_q_close_hnd(char *desc, SAMR_Q_CLOSE_HND *q_u, prs_struct *ps, int depth)
47 if (q_u == NULL) return;
49 prs_debug(ps, depth, desc, "samr_io_q_close_hnd");
54 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
58 /*******************************************************************
59 reads or writes a structure.
60 ********************************************************************/
61 void samr_io_r_close_hnd(char *desc, SAMR_R_CLOSE_HND *r_u, prs_struct *ps, int depth)
63 if (r_u == NULL) return;
65 prs_debug(ps, depth, desc, "samr_io_r_close_hnd");
70 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
73 prs_uint32("status", ps, depth, &(r_u->status));
77 /*******************************************************************
78 reads or writes a structure.
79 ********************************************************************/
80 void make_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN *q_u,
81 POLICY_HND *connect_pol, uint32 rid,
84 if (q_u == NULL) return;
86 DEBUG(5,("samr_make_q_open_domain\n"));
88 memcpy(&q_u->connect_pol, connect_pol, sizeof(q_u->connect_pol));
90 make_dom_sid2(&(q_u->dom_sid), sid);
93 /*******************************************************************
94 reads or writes a structure.
95 ********************************************************************/
96 void samr_io_q_open_domain(char *desc, SAMR_Q_OPEN_DOMAIN *q_u, prs_struct *ps, int depth)
98 if (q_u == NULL) return;
100 prs_debug(ps, depth, desc, "samr_io_q_open_domain");
105 smb_io_pol_hnd("connect_pol", &(q_u->connect_pol), ps, depth);
108 prs_uint32("rid", ps, depth, &(q_u->rid));
110 smb_io_dom_sid2("sid", &(q_u->dom_sid), ps, depth);
115 /*******************************************************************
116 reads or writes a structure.
117 ********************************************************************/
118 void samr_io_r_open_domain(char *desc, SAMR_R_OPEN_DOMAIN *r_u, prs_struct *ps, int depth)
120 if (r_u == NULL) return;
122 prs_debug(ps, depth, desc, "samr_io_r_open_domain");
127 smb_io_pol_hnd("domain_pol", &(r_u->domain_pol), ps, depth);
130 prs_uint32("status", ps, depth, &(r_u->status));
133 /*******************************************************************
134 reads or writes a structure.
135 ********************************************************************/
136 void make_samr_q_unknown_3(SAMR_Q_UNKNOWN_3 *q_u,
137 POLICY_HND *user_pol, uint16 switch_value)
139 if (q_u == NULL) return;
141 DEBUG(5,("samr_make_q_unknown_3\n"));
143 memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol));
144 q_u->switch_value = switch_value;
148 /*******************************************************************
149 reads or writes a structure.
150 ********************************************************************/
151 void samr_io_q_unknown_3(char *desc, SAMR_Q_UNKNOWN_3 *q_u, prs_struct *ps, int depth)
153 if (q_u == NULL) return;
155 prs_debug(ps, depth, desc, "samr_io_q_unknown_3");
160 smb_io_pol_hnd("user_pol", &(q_u->user_pol), ps, depth);
163 prs_uint16("switch_value", ps, depth, &(q_u->switch_value));
167 /*******************************************************************
168 reads or writes a structure.
169 ********************************************************************/
170 void make_samr_q_unknown_8(SAMR_Q_UNKNOWN_8 *q_u,
171 POLICY_HND *domain_pol, uint16 switch_value)
173 if (q_u == NULL) return;
175 DEBUG(5,("samr_make_q_unknown_8\n"));
177 memcpy(&q_u->domain_pol, domain_pol, sizeof(q_u->domain_pol));
178 q_u->switch_value = switch_value;
181 /*******************************************************************
182 reads or writes a structure.
183 ********************************************************************/
184 void samr_io_q_unknown_8(char *desc, SAMR_Q_UNKNOWN_8 *q_u, prs_struct *ps, int depth)
186 if (q_u == NULL) return;
188 prs_debug(ps, depth, desc, "samr_io_q_unknown_8");
193 smb_io_pol_hnd("domain_pol", &(q_u->domain_pol), ps, depth);
196 prs_uint16("switch_value", ps, depth, &(q_u->switch_value));
199 /*******************************************************************
200 makes a DOM_SID3 structure.
202 calculate length by adding up the size of the components.
203 ********************************************************************/
204 void make_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid)
206 if (sid3 == NULL) return;
209 sid3->len = 2 + 8 + sid3->sid.num_auths * 4;
212 /*******************************************************************
213 reads or writes a SAM_SID3 structure.
215 this one's odd, because the length (in bytes) is specified at the beginning.
216 the length _includes_ the length of the length, too :-)
218 ********************************************************************/
219 static void sam_io_dom_sid3(char *desc, DOM_SID3 *sid3, prs_struct *ps, int depth)
221 if (sid3 == NULL) return;
223 prs_debug(ps, depth, desc, "sam_io_dom_sid3");
226 prs_uint16("len", ps, depth, &(sid3->len));
228 smb_io_dom_sid("", &(sid3->sid), ps, depth);
231 /*******************************************************************
232 makes a SAMR_R_UNKNOWN3 structure.
237 unknown_4,5 : 0x0000 0014
240 unknown_7 : 0x5800 or 0x0070
242 ********************************************************************/
243 static void make_sam_sid_stuff(SAM_SID_STUFF *stf,
244 uint16 unknown_2, uint16 unknown_3,
245 uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
246 int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS])
248 stf->unknown_2 = unknown_2;
249 stf->unknown_3 = unknown_3;
251 bzero(stf->padding1, sizeof(stf->padding1));
253 stf->unknown_4 = unknown_4;
254 stf->unknown_5 = unknown_4;
256 stf->unknown_6 = unknown_6;
257 stf->unknown_7 = unknown_7;
259 stf->num_sids = num_sid3s;
261 stf->padding2 = 0x0000;
263 memcpy(stf->sid, sid3, sizeof(DOM_SID3) * num_sid3s);
266 /*******************************************************************
267 reads or writes a SAM_SID_STUFF structure.
268 ********************************************************************/
269 static void sam_io_sid_stuff(char *desc, SAM_SID_STUFF *stf, prs_struct *ps, int depth)
273 if (stf == NULL) return;
275 DEBUG(5,("make_sam_sid_stuff\n"));
277 prs_uint16("unknown_2", ps, depth, &(stf->unknown_2));
278 prs_uint16("unknown_3", ps, depth, &(stf->unknown_3));
280 prs_uint8s(False, "padding1", ps, depth, stf->padding1, sizeof(stf->padding1));
282 prs_uint32("unknown_4", ps, depth, &(stf->unknown_4));
283 prs_uint32("unknown_5", ps, depth, &(stf->unknown_5));
284 prs_uint16("unknown_6", ps, depth, &(stf->unknown_6));
285 prs_uint16("unknown_7", ps, depth, &(stf->unknown_7));
287 prs_uint32("num_sids ", ps, depth, &(stf->num_sids ));
288 prs_uint16("padding2 ", ps, depth, &(stf->padding2 ));
290 SMB_ASSERT_ARRAY(stf->sid, stf->num_sids);
292 for (i = 0; i < stf->num_sids; i++)
294 sam_io_dom_sid3("", &(stf->sid[i]), ps, depth);
298 /*******************************************************************
299 reads or writes a SAMR_R_UNKNOWN3 structure.
300 ********************************************************************/
301 void make_samr_r_unknown_3(SAMR_R_UNKNOWN_3 *r_u,
302 uint16 unknown_2, uint16 unknown_3,
303 uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
304 int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS],
307 if (r_u == NULL) return;
309 DEBUG(5,("samr_make_r_unknown_3\n"));
318 make_sam_sid_stuff(&(r_u->sid_stuff), unknown_2, unknown_3,
319 unknown_4, unknown_6, unknown_7,
323 r_u->status = status;
327 /*******************************************************************
328 reads or writes a SAMR_R_UNKNOWN_3 structure.
330 this one's odd, because the daft buggers use a different mechanism
331 for writing out the array of sids. they put the number of sids in
332 only one place: they've calculated the length of each sid and jumped
333 by that amount. then, retrospectively, the length of the whole buffer
334 is put at the beginning of the data stream.
338 ********************************************************************/
339 void samr_io_r_unknown_3(char *desc, SAMR_R_UNKNOWN_3 *r_u, prs_struct *ps, int depth)
343 int ptr_sid_stuff = 0;
345 if (r_u == NULL) return;
347 prs_debug(ps, depth, desc, "samr_io_r_unknown_3");
352 prs_uint32("ptr_0 ", ps, depth, &(r_u->ptr_0 ));
356 /* reading. do the length later */
357 prs_uint32("sid_stuff_len0", ps, depth, &(r_u->sid_stuff_len0));
362 ptr_len0 = ps->offset; ps->offset += 4;
367 prs_uint32("ptr_1 ", ps, depth, &(r_u->ptr_1 ));
370 /* reading. do the length later */
371 prs_uint32("sid_stuff_len1", ps, depth, &(r_u->sid_stuff_len1));
376 ptr_len1 = ps->offset; ps->offset += 4;
381 ptr_sid_stuff = ps->offset;
382 sam_io_sid_stuff("", &(r_u->sid_stuff), ps, depth);
386 if (!(ps->io)) /* storing not reading. do the length, now. */
388 if (ptr_sid_stuff != 0)
390 uint32 sid_stuff_len = ps->offset - ptr_sid_stuff;
391 int old_len = ps->offset;
393 ps->offset = ptr_len0;
394 prs_uint32("sid_stuff_len0", ps, depth, &sid_stuff_len);
396 ps->offset = ptr_len1;
397 prs_uint32("sid_stuff_len1", ps, depth, &sid_stuff_len);
399 ps->offset = old_len;
403 prs_uint32("status", ps, depth, &(r_u->status));
406 /*******************************************************************
407 reads or writes a SAM_STR1 structure.
408 ********************************************************************/
409 static void sam_io_sam_str1(char *desc, SAM_STR1 *sam, uint32 acct_buf, uint32 name_buf, uint32 desc_buf, prs_struct *ps, int depth)
411 if (sam == NULL) return;
413 prs_debug(ps, depth, desc, "sam_io_sam_str1");
418 smb_io_unistr2("unistr2", &(sam->uni_acct_name), acct_buf, ps, depth); /* account name unicode string */
419 smb_io_unistr2("unistr2", &(sam->uni_full_name), name_buf, ps, depth); /* full name unicode string */
420 smb_io_unistr2("unistr2", &(sam->uni_acct_desc), desc_buf, ps, depth); /* account description unicode string */
423 /*******************************************************************
424 makes a SAM_ENTRY1 structure.
425 ********************************************************************/
426 static void make_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx,
427 uint32 len_sam_name, uint32 len_sam_full, uint32 len_sam_desc,
428 uint32 rid_user, uint16 acb_info)
430 if (sam == NULL) return;
432 DEBUG(5,("make_sam_entry1\n"));
434 sam->user_idx = user_idx;
435 sam->rid_user = rid_user;
436 sam->acb_info = acb_info;
439 make_uni_hdr(&(sam->hdr_acct_name), len_sam_name, len_sam_name, len_sam_name != 0);
440 make_uni_hdr(&(sam->hdr_user_name), len_sam_full, len_sam_full, len_sam_full != 0);
441 make_uni_hdr(&(sam->hdr_user_desc), len_sam_desc, len_sam_desc, len_sam_desc != 0);
444 /*******************************************************************
445 reads or writes a SAM_ENTRY1 structure.
446 ********************************************************************/
447 static void sam_io_sam_entry1(char *desc, SAM_ENTRY1 *sam, prs_struct *ps, int depth)
449 if (sam == NULL) return;
451 prs_debug(ps, depth, desc, "sam_io_sam_entry1");
456 prs_uint32("user_idx ", ps, depth, &(sam->user_idx ));
458 prs_uint32("rid_user ", ps, depth, &(sam->rid_user ));
459 prs_uint16("acb_info ", ps, depth, &(sam->acb_info ));
460 prs_uint16("pad ", ps, depth, &(sam->pad ));
462 smb_io_unihdr("unihdr", &(sam->hdr_acct_name), ps, depth); /* account name unicode string header */
463 smb_io_unihdr("unihdr", &(sam->hdr_user_name), ps, depth); /* account name unicode string header */
464 smb_io_unihdr("unihdr", &(sam->hdr_user_desc), ps, depth); /* account name unicode string header */
467 /*******************************************************************
468 reads or writes a SAM_STR2 structure.
469 ********************************************************************/
470 static void sam_io_sam_str2(char *desc, SAM_STR2 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth)
472 if (sam == NULL) return;
474 prs_debug(ps, depth, desc, "sam_io_sam_str2");
479 smb_io_unistr2("unistr2", &(sam->uni_srv_name), acct_buf, ps, depth); /* account name unicode string */
480 smb_io_unistr2("unistr2", &(sam->uni_srv_desc), desc_buf, ps, depth); /* account description unicode string */
483 /*******************************************************************
484 makes a SAM_ENTRY2 structure.
485 ********************************************************************/
486 static void make_sam_entry2(SAM_ENTRY2 *sam, uint32 user_idx,
487 uint32 len_sam_name, uint32 len_sam_desc,
488 uint32 rid_user, uint16 acb_info)
490 if (sam == NULL) return;
492 DEBUG(5,("make_sam_entry2\n"));
494 sam->user_idx = user_idx;
495 sam->rid_user = rid_user;
496 sam->acb_info = acb_info;
499 make_uni_hdr(&(sam->hdr_srv_name), len_sam_name, len_sam_name, len_sam_name != 0);
500 make_uni_hdr(&(sam->hdr_srv_desc), len_sam_desc, len_sam_desc, len_sam_desc != 0);
503 /*******************************************************************
504 reads or writes a SAM_ENTRY2 structure.
505 ********************************************************************/
506 static void sam_io_sam_entry2(char *desc, SAM_ENTRY2 *sam, prs_struct *ps, int depth)
508 if (sam == NULL) return;
510 prs_debug(ps, depth, desc, "sam_io_sam_entry2");
515 prs_uint32("user_idx ", ps, depth, &(sam->user_idx ));
517 prs_uint32("rid_user ", ps, depth, &(sam->rid_user ));
518 prs_uint16("acb_info ", ps, depth, &(sam->acb_info ));
519 prs_uint16("pad ", ps, depth, &(sam->pad ));
521 smb_io_unihdr("unihdr", &(sam->hdr_srv_name), ps, depth); /* account name unicode string header */
522 smb_io_unihdr("unihdr", &(sam->hdr_srv_desc), ps, depth); /* account name unicode string header */
525 /*******************************************************************
526 reads or writes a SAM_STR3 structure.
527 ********************************************************************/
528 static void sam_io_sam_str3(char *desc, SAM_STR3 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth)
530 if (sam == NULL) return;
532 prs_debug(ps, depth, desc, "sam_io_sam_str3");
537 smb_io_unistr2("unistr2", &(sam->uni_grp_name), acct_buf, ps, depth); /* account name unicode string */
538 smb_io_unistr2("unistr2", &(sam->uni_grp_desc), desc_buf, ps, depth); /* account description unicode string */
541 /*******************************************************************
542 makes a SAM_ENTRY3 structure.
543 ********************************************************************/
544 static void make_sam_entry3(SAM_ENTRY3 *sam, uint32 grp_idx,
545 uint32 len_grp_name, uint32 len_grp_desc, uint32 rid_grp)
547 if (sam == NULL) return;
549 DEBUG(5,("make_sam_entry3\n"));
551 sam->grp_idx = grp_idx;
552 sam->rid_grp = rid_grp;
553 sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */
555 make_uni_hdr(&(sam->hdr_grp_name), len_grp_name, len_grp_name, len_grp_name != 0);
556 make_uni_hdr(&(sam->hdr_grp_desc), len_grp_desc, len_grp_desc, len_grp_desc != 0);
559 /*******************************************************************
560 reads or writes a SAM_ENTRY3 structure.
561 ********************************************************************/
562 static void sam_io_sam_entry3(char *desc, SAM_ENTRY3 *sam, prs_struct *ps, int depth)
564 if (sam == NULL) return;
566 prs_debug(ps, depth, desc, "sam_io_sam_entry3");
571 prs_uint32("grp_idx", ps, depth, &(sam->grp_idx));
573 prs_uint32("rid_grp", ps, depth, &(sam->rid_grp));
574 prs_uint32("attr ", ps, depth, &(sam->attr ));
576 smb_io_unihdr("unihdr", &(sam->hdr_grp_name), ps, depth); /* account name unicode string header */
577 smb_io_unihdr("unihdr", &(sam->hdr_grp_desc), ps, depth); /* account name unicode string header */
580 /*******************************************************************
581 makes a SAM_ENTRY structure.
582 ********************************************************************/
583 static void make_sam_entry(SAM_ENTRY *sam, uint32 len_sam_name, uint32 rid)
585 if (sam == NULL) return;
587 DEBUG(5,("make_sam_entry\n"));
590 make_uni_hdr(&(sam->hdr_name), len_sam_name, len_sam_name, len_sam_name != 0);
593 /*******************************************************************
594 reads or writes a SAM_ENTRY structure.
595 ********************************************************************/
596 static void sam_io_sam_entry(char *desc, SAM_ENTRY *sam, prs_struct *ps, int depth)
598 if (sam == NULL) return;
600 prs_debug(ps, depth, desc, "sam_io_sam_entry");
604 prs_uint32("rid", ps, depth, &(sam->rid ));
605 smb_io_unihdr("unihdr", &(sam->hdr_name), ps, depth); /* account name unicode string header */
609 /*******************************************************************
610 makes a SAMR_Q_ENUM_DOM_USERS structure.
611 ********************************************************************/
612 void make_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, POLICY_HND *pol,
613 uint16 req_num_entries, uint16 unk_0,
614 uint16 acb_mask, uint16 unk_1, uint32 size)
616 if (q_e == NULL || pol == NULL) return;
618 DEBUG(5,("make_q_enum_dom_users\n"));
620 memcpy(&(q_e->pol), pol, sizeof(*pol));
622 q_e->req_num_entries = req_num_entries; /* zero indicates lots */
623 q_e->unknown_0 = unk_0; /* this gets returned in the response */
624 q_e->acb_mask = acb_mask;
625 q_e->unknown_1 = unk_1;
626 q_e->max_size = size;
629 /*******************************************************************
630 reads or writes a structure.
631 ********************************************************************/
632 void samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS *q_e, prs_struct *ps, int depth)
634 if (q_e == NULL) return;
636 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_users");
641 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
644 prs_uint16("req_num_entries", ps, depth, &(q_e->req_num_entries));
645 prs_uint16("unknown_0 ", ps, depth, &(q_e->unknown_0 ));
647 prs_uint16("acb_mask ", ps, depth, &(q_e->acb_mask ));
648 prs_uint16("unknown_1 ", ps, depth, &(q_e->unknown_1 ));
650 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
656 /*******************************************************************
657 makes a SAMR_R_ENUM_DOM_USERS structure.
658 ********************************************************************/
659 void make_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS *r_u,
660 uint16 total_num_entries, uint16 unk_0,
661 uint32 num_sam_entries, SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES], uint32 status)
665 if (r_u == NULL) return;
667 DEBUG(5,("make_samr_r_enum_dom_users\n"));
669 if (num_sam_entries >= MAX_SAM_ENTRIES)
671 num_sam_entries = MAX_SAM_ENTRIES;
672 DEBUG(5,("limiting number of entries to %d\n",
676 r_u->total_num_entries = total_num_entries;
677 r_u->unknown_0 = unk_0;
679 if (total_num_entries > 0)
681 r_u->ptr_entries1 = 1;
682 r_u->ptr_entries2 = 1;
683 r_u->num_entries2 = num_sam_entries;
684 r_u->num_entries3 = num_sam_entries;
686 SMB_ASSERT_ARRAY(r_u->sam, num_sam_entries);
687 SMB_ASSERT_ARRAY(r_u->uni_acct_name, num_sam_entries);
689 for (i = 0; i < num_sam_entries; i++)
691 make_sam_entry(&(r_u->sam[i]),
692 pass[i].uni_user_name.uni_str_len,
695 copy_unistr2(&(r_u->uni_acct_name[i]), &(pass[i].uni_user_name));
698 r_u->num_entries4 = num_sam_entries;
702 r_u->ptr_entries1 = 0;
703 r_u->num_entries2 = num_sam_entries;
704 r_u->ptr_entries2 = 1;
707 r_u->status = status;
710 /*******************************************************************
711 reads or writes a structure.
712 ********************************************************************/
713 void samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struct *ps, int depth)
717 if (r_u == NULL) return;
719 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_users");
724 prs_uint16("total_num_entries", ps, depth, &(r_u->total_num_entries));
725 prs_uint16("unknown_0 ", ps, depth, &(r_u->unknown_0 ));
726 prs_uint32("ptr_entries1", ps, depth, &(r_u->ptr_entries1));
728 if (r_u->total_num_entries != 0 && r_u->ptr_entries1 != 0)
730 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
731 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
732 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
734 SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries2);
736 for (i = 0; i < r_u->num_entries2; i++)
739 sam_io_sam_entry("", &(r_u->sam[i]), ps, depth);
742 SMB_ASSERT_ARRAY(r_u->uni_acct_name, r_u->num_entries2);
744 for (i = 0; i < r_u->num_entries2; i++)
747 smb_io_unistr2("", &(r_u->uni_acct_name[i]), r_u->sam[i].hdr_name.buffer, ps, depth);
752 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
755 prs_uint32("status", ps, depth, &(r_u->status));
758 /*******************************************************************
759 makes a SAMR_Q_ENUM_DOM_ALIASES structure.
760 ********************************************************************/
761 void make_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_e, POLICY_HND *pol, uint32 size)
763 if (q_e == NULL || pol == NULL) return;
765 DEBUG(5,("make_q_enum_dom_aliases\n"));
767 memcpy(&(q_e->pol), pol, sizeof(*pol));
770 q_e->max_size = size;
774 /*******************************************************************
775 reads or writes a structure.
776 ********************************************************************/
777 void samr_io_q_enum_dom_aliases(char *desc, SAMR_Q_ENUM_DOM_ALIASES *q_e, prs_struct *ps, int depth)
779 if (q_e == NULL) return;
781 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases");
786 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
789 prs_uint32("unknown_0", ps, depth, &(q_e->unknown_0));
790 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
796 /*******************************************************************
797 makes a SAMR_R_ENUM_DOM_ALIASES structure.
798 ********************************************************************/
799 void make_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u,
800 uint32 num_sam_entries, SAM_USER_INFO_21 grps[MAX_SAM_ENTRIES],
805 if (r_u == NULL) return;
807 DEBUG(5,("make_samr_r_enum_dom_aliases\n"));
809 if (num_sam_entries >= MAX_SAM_ENTRIES)
811 num_sam_entries = MAX_SAM_ENTRIES;
812 DEBUG(5,("limiting number of entries to %d\n",
816 r_u->num_entries = num_sam_entries;
818 if (num_sam_entries > 0)
820 r_u->ptr_entries = 1;
821 r_u->num_entries2 = num_sam_entries;
822 r_u->ptr_entries2 = 1;
823 r_u->num_entries3 = num_sam_entries;
825 SMB_ASSERT_ARRAY(r_u->sam, num_sam_entries);
827 for (i = 0; i < num_sam_entries; i++)
829 make_sam_entry(&(r_u->sam[i]),
830 grps[i].uni_user_name.uni_str_len,
833 copy_unistr2(&(r_u->uni_grp_name[i]), &(grps[i].uni_user_name));
836 r_u->num_entries4 = num_sam_entries;
840 r_u->ptr_entries = 0;
843 r_u->status = status;
846 /*******************************************************************
847 reads or writes a structure.
848 ********************************************************************/
849 void samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES *r_u, prs_struct *ps, int depth)
853 if (r_u == NULL) return;
855 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases");
860 prs_uint32("num_entries", ps, depth, &(r_u->num_entries));
861 prs_uint32("ptr_entries", ps, depth, &(r_u->ptr_entries));
863 if (r_u->num_entries != 0 && r_u->ptr_entries != 0)
865 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
866 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
867 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
869 SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries);
871 for (i = 0; i < r_u->num_entries; i++)
873 sam_io_sam_entry("", &(r_u->sam[i]), ps, depth);
876 for (i = 0; i < r_u->num_entries; i++)
878 smb_io_unistr2("", &(r_u->uni_grp_name[i]), r_u->sam[i].hdr_name.buffer, ps, depth);
883 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
886 prs_uint32("status", ps, depth, &(r_u->status));
890 /*******************************************************************
891 makes a SAMR_Q_QUERY_DISPINFO structure.
892 ********************************************************************/
893 void make_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_e, POLICY_HND *pol,
894 uint16 switch_level, uint32 start_idx, uint32 size)
896 if (q_e == NULL || pol == NULL) return;
898 DEBUG(5,("make_q_query_dispinfo\n"));
900 memcpy(&(q_e->pol), pol, sizeof(*pol));
902 q_e->switch_level = switch_level;
905 q_e->start_idx = start_idx;
906 q_e->unknown_1 = 0x000007d0;
907 q_e->max_size = size;
910 /*******************************************************************
911 reads or writes a structure.
912 ********************************************************************/
913 void samr_io_q_query_dispinfo(char *desc, SAMR_Q_QUERY_DISPINFO *q_e, prs_struct *ps, int depth)
915 if (q_e == NULL) return;
917 prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo");
922 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
925 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
926 prs_uint16("unknown_0 ", ps, depth, &(q_e->unknown_0 ));
927 prs_uint32("start_idx ", ps, depth, &(q_e->start_idx ));
928 prs_uint32("unknown_1 ", ps, depth, &(q_e->unknown_1 ));
929 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
935 /*******************************************************************
936 makes a SAM_INFO_2 structure.
937 ********************************************************************/
938 void make_sam_info_2(SAM_INFO_2 *sam, uint32 acb_mask,
939 uint32 start_idx, uint32 num_sam_entries,
940 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
945 if (sam == NULL) return;
947 DEBUG(5,("make_sam_info_2\n"));
949 if (num_sam_entries >= MAX_SAM_ENTRIES)
951 num_sam_entries = MAX_SAM_ENTRIES;
952 DEBUG(5,("limiting number of entries to %d\n",
956 for (i = start_idx, entries_added = 0; i < num_sam_entries; i++)
958 if (IS_BITS_SET_ALL(pass[i].acb_info, acb_mask))
960 make_sam_entry2(&(sam->sam[entries_added]),
961 start_idx + entries_added + 1,
962 pass[i].uni_user_name.uni_str_len,
963 pass[i].uni_acct_desc.uni_str_len,
967 copy_unistr2(&(sam->str[entries_added].uni_srv_name), &(pass[i].uni_user_name));
968 copy_unistr2(&(sam->str[entries_added].uni_srv_desc), &(pass[i].uni_acct_desc));
973 sam->num_entries = entries_added;
974 sam->ptr_entries = 1;
975 sam->num_entries2 = entries_added;
979 /*******************************************************************
980 reads or writes a structure.
981 ********************************************************************/
982 static void sam_io_sam_info_2(char *desc, SAM_INFO_2 *sam, prs_struct *ps, int depth)
986 if (sam == NULL) return;
988 prs_debug(ps, depth, desc, "sam_io_sam_info_2");
993 prs_uint32("num_entries ", ps, depth, &(sam->num_entries ));
994 prs_uint32("ptr_entries ", ps, depth, &(sam->ptr_entries ));
996 prs_uint32("num_entries2 ", ps, depth, &(sam->num_entries2 ));
998 SMB_ASSERT_ARRAY(sam->sam, sam->num_entries);
1000 for (i = 0; i < sam->num_entries; i++)
1003 sam_io_sam_entry2("", &(sam->sam[i]), ps, depth);
1006 for (i = 0; i < sam->num_entries; i++)
1009 sam_io_sam_str2 ("", &(sam->str[i]),
1010 sam->sam[i].hdr_srv_name.buffer,
1011 sam->sam[i].hdr_srv_desc.buffer,
1017 /*******************************************************************
1018 makes a SAM_INFO_1 structure.
1019 ********************************************************************/
1020 void make_sam_info_1(SAM_INFO_1 *sam, uint32 acb_mask,
1021 uint32 start_idx, uint32 num_sam_entries,
1022 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
1027 if (sam == NULL) return;
1029 DEBUG(5,("make_sam_info_1\n"));
1031 if (num_sam_entries >= MAX_SAM_ENTRIES)
1033 num_sam_entries = MAX_SAM_ENTRIES;
1034 DEBUG(5,("limiting number of entries to %d\n",
1038 for (i = start_idx, entries_added = 0; i < num_sam_entries; i++)
1040 if (IS_BITS_SET_ALL(pass[i].acb_info, acb_mask))
1042 make_sam_entry1(&(sam->sam[entries_added]),
1043 start_idx + entries_added + 1,
1044 pass[i].uni_user_name.uni_str_len,
1045 pass[i].uni_full_name.uni_str_len,
1046 pass[i].uni_acct_desc.uni_str_len,
1050 copy_unistr2(&(sam->str[entries_added].uni_acct_name), &(pass[i].uni_user_name));
1051 copy_unistr2(&(sam->str[entries_added].uni_full_name), &(pass[i].uni_full_name));
1052 copy_unistr2(&(sam->str[entries_added].uni_acct_desc), &(pass[i].uni_acct_desc));
1058 sam->num_entries = entries_added;
1059 sam->ptr_entries = 1;
1060 sam->num_entries2 = entries_added;
1064 /*******************************************************************
1065 reads or writes a structure.
1066 ********************************************************************/
1067 static void sam_io_sam_info_1(char *desc, SAM_INFO_1 *sam, prs_struct *ps, int depth)
1071 if (sam == NULL) return;
1073 prs_debug(ps, depth, desc, "sam_io_sam_info_1");
1078 prs_uint32("num_entries ", ps, depth, &(sam->num_entries ));
1079 prs_uint32("ptr_entries ", ps, depth, &(sam->ptr_entries ));
1081 prs_uint32("num_entries2 ", ps, depth, &(sam->num_entries2 ));
1083 SMB_ASSERT_ARRAY(sam->sam, sam->num_entries);
1085 for (i = 0; i < sam->num_entries; i++)
1088 sam_io_sam_entry1("", &(sam->sam[i]), ps, depth);
1091 for (i = 0; i < sam->num_entries; i++)
1094 sam_io_sam_str1 ("", &(sam->str[i]),
1095 sam->sam[i].hdr_acct_name.buffer,
1096 sam->sam[i].hdr_user_name.buffer,
1097 sam->sam[i].hdr_user_desc.buffer,
1103 /*******************************************************************
1104 makes a SAMR_R_QUERY_DISPINFO structure.
1105 ********************************************************************/
1106 void make_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO *r_u,
1107 uint16 switch_level, SAM_INFO_CTR *ctr, uint32 status)
1109 if (r_u == NULL) return;
1111 DEBUG(5,("make_samr_r_query_dispinfo\n"));
1115 r_u->unknown_0 = 0x0000001;
1116 r_u->unknown_1 = 0x0000001;
1120 r_u->unknown_0 = 0x0;
1121 r_u->unknown_1 = 0x0;
1124 r_u->switch_level = switch_level;
1126 r_u->status = status;
1130 /*******************************************************************
1131 reads or writes a structure.
1132 ********************************************************************/
1133 void samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struct *ps, int depth)
1135 if (r_u == NULL) return;
1137 prs_debug(ps, depth, desc, "samr_io_r_query_dispinfo");
1142 prs_uint32("unknown_0 ", ps, depth, &(r_u->unknown_0 ));
1143 prs_uint32("unknown_1 ", ps, depth, &(r_u->unknown_1 ));
1144 prs_uint16("switch_level ", ps, depth, &(r_u->switch_level ));
1148 switch (r_u->switch_level)
1152 sam_io_sam_info_1("users", r_u->ctr->sam.info1, ps, depth);
1157 sam_io_sam_info_2("servers", r_u->ctr->sam.info2, ps, depth);
1162 DEBUG(5,("samr_io_r_query_dispinfo: unknown switch value\n"));
1167 prs_uint32("status", ps, depth, &(r_u->status));
1171 /*******************************************************************
1172 makes a SAMR_Q_ENUM_DOM_GROUPS structure.
1173 ********************************************************************/
1174 void make_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_e, POLICY_HND *pol,
1175 uint16 switch_level, uint32 start_idx, uint32 size)
1177 if (q_e == NULL || pol == NULL) return;
1179 DEBUG(5,("make_q_enum_dom_groups\n"));
1181 memcpy(&(q_e->pol), pol, sizeof(*pol));
1183 q_e->switch_level = switch_level;
1186 q_e->start_idx = start_idx;
1187 q_e->unknown_1 = 0x000007d0;
1188 q_e->max_size = size;
1192 /*******************************************************************
1193 reads or writes a structure.
1194 ********************************************************************/
1195 void samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS *q_e, prs_struct *ps, int depth)
1197 if (q_e == NULL) return;
1199 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups");
1204 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
1207 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
1208 prs_uint16("unknown_0 ", ps, depth, &(q_e->unknown_0 ));
1209 prs_uint32("start_idx ", ps, depth, &(q_e->start_idx ));
1210 prs_uint32("unknown_1 ", ps, depth, &(q_e->unknown_1 ));
1211 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
1217 /*******************************************************************
1218 makes a SAMR_R_ENUM_DOM_GROUPS structure.
1219 ********************************************************************/
1220 void make_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS *r_u,
1221 uint32 start_idx, uint32 num_sam_entries,
1222 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES],
1228 if (r_u == NULL) return;
1230 DEBUG(5,("make_samr_r_enum_dom_groups\n"));
1232 if (num_sam_entries >= MAX_SAM_ENTRIES)
1234 num_sam_entries = MAX_SAM_ENTRIES;
1235 DEBUG(5,("limiting number of entries to %d\n",
1241 for (i = start_idx, entries_added = 0; i < num_sam_entries; i++)
1243 make_sam_entry3(&(r_u->sam[entries_added]),
1244 start_idx + entries_added + 1,
1245 pass[i].uni_user_name.uni_str_len,
1246 pass[i].uni_acct_desc.uni_str_len,
1249 copy_unistr2(&(r_u->str[entries_added].uni_grp_name), &(pass[i].uni_user_name));
1250 copy_unistr2(&(r_u->str[entries_added].uni_grp_desc), &(pass[i].uni_acct_desc));
1255 if (entries_added > 0)
1257 r_u->unknown_0 = 0x0000492;
1258 r_u->unknown_1 = 0x000049a;
1262 r_u->unknown_0 = 0x0;
1263 r_u->unknown_1 = 0x0;
1265 r_u->switch_level = 3;
1266 r_u->num_entries = entries_added;
1267 r_u->ptr_entries = 1;
1268 r_u->num_entries2 = entries_added;
1272 r_u->switch_level = 0;
1275 r_u->status = status;
1278 /*******************************************************************
1279 reads or writes a structure.
1280 ********************************************************************/
1281 void samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS *r_u, prs_struct *ps, int depth)
1285 if (r_u == NULL) return;
1287 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups");
1292 prs_uint32("unknown_0 ", ps, depth, &(r_u->unknown_0 ));
1293 prs_uint32("unknown_1 ", ps, depth, &(r_u->unknown_1 ));
1294 prs_uint32("switch_level ", ps, depth, &(r_u->switch_level ));
1296 if (r_u->switch_level != 0)
1298 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries ));
1299 prs_uint32("ptr_entries ", ps, depth, &(r_u->ptr_entries ));
1301 prs_uint32("num_entries2 ", ps, depth, &(r_u->num_entries2 ));
1303 SMB_ASSERT_ARRAY(r_u->sam, r_u->num_entries);
1305 for (i = 0; i < r_u->num_entries; i++)
1308 sam_io_sam_entry3("", &(r_u->sam[i]), ps, depth);
1311 for (i = 0; i < r_u->num_entries; i++)
1314 sam_io_sam_str3 ("", &(r_u->str[i]),
1315 r_u->sam[i].hdr_grp_name.buffer,
1316 r_u->sam[i].hdr_grp_desc.buffer,
1321 prs_uint32("status", ps, depth, &(r_u->status));
1325 /*******************************************************************
1326 makes a SAMR_Q_QUERY_ALIASINFO structure.
1327 ********************************************************************/
1328 void make_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_e,
1330 uint16 switch_level)
1332 if (q_e == NULL || pol == NULL) return;
1334 DEBUG(5,("make_q_query_aliasinfo\n"));
1336 memcpy(&(q_e->pol), pol, sizeof(*pol));
1338 q_e->switch_level = switch_level;
1342 /*******************************************************************
1343 reads or writes a structure.
1344 ********************************************************************/
1345 void samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO *q_e, prs_struct *ps, int depth)
1347 if (q_e == NULL) return;
1349 prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo");
1354 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
1357 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
1361 /*******************************************************************
1362 makes a SAMR_R_QUERY_ALIASINFO structure.
1363 ********************************************************************/
1364 void make_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *r_u,
1365 uint16 switch_value, char *acct_desc,
1368 if (r_u == NULL) return;
1370 DEBUG(5,("make_samr_r_query_aliasinfo\n"));
1376 r_u->switch_value = switch_value;
1378 switch (switch_value)
1382 int acct_len = acct_desc ? strlen(acct_desc) : 0;
1386 make_uni_hdr(&(r_u->alias.info3.hdr_acct_desc), acct_len , acct_len, acct_desc ? 1 : 0);
1387 make_unistr2(&(r_u->alias.info3.uni_acct_desc), acct_desc, acct_len);
1394 DEBUG(4,("make_samr_r_query_aliasinfo: unsupported switch level\n"));
1400 r_u->status = status;
1404 /*******************************************************************
1405 reads or writes a structure.
1406 ********************************************************************/
1407 void samr_io_r_query_aliasinfo(char *desc, SAMR_R_QUERY_ALIASINFO *r_u, prs_struct *ps, int depth)
1409 if (r_u == NULL) return;
1411 prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo");
1416 prs_uint32("ptr ", ps, depth, &(r_u->ptr ));
1420 prs_uint16("switch_value", ps, depth, &(r_u->switch_value));
1423 if (r_u->switch_value != 0)
1425 switch (r_u->switch_value)
1429 smb_io_unihdr ("", &(r_u->alias.info3.hdr_acct_desc), ps, depth);
1430 smb_io_unistr2("", &(r_u->alias.info3.uni_acct_desc), r_u->alias.info3.hdr_acct_desc.buffer, ps, depth);
1435 DEBUG(4,("samr_io_r_query_aliasinfo: unsupported switch level\n"));
1444 prs_uint32("status", ps, depth, &(r_u->status));
1447 /*******************************************************************
1448 reads or writes a SAMR_Q_LOOKUP_IDS structure.
1449 ********************************************************************/
1450 void samr_io_q_lookup_ids(char *desc, SAMR_Q_LOOKUP_IDS *q_u, prs_struct *ps, int depth)
1455 if (q_u == NULL) return;
1457 prs_debug(ps, depth, desc, "samr_io_q_lookup_ids");
1462 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1465 prs_uint32("num_sids1", ps, depth, &(q_u->num_sids1));
1466 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
1467 prs_uint32("num_sids2", ps, depth, &(q_u->num_sids2));
1469 SMB_ASSERT_ARRAY(q_u->ptr_sid, q_u->num_sids2);
1471 for (i = 0; i < q_u->num_sids2; i++)
1473 slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i);
1474 prs_uint32(tmp, ps, depth, &(q_u->ptr_sid[i]));
1477 for (i = 0; i < q_u->num_sids2; i++)
1479 if (q_u->ptr_sid[i] != 0)
1482 slprintf(tmp, sizeof(tmp)-1, "sid[%02d]", i);
1483 smb_io_dom_sid2(tmp, &(q_u->sid[i]), ps, depth);
1491 /*******************************************************************
1492 makes a SAMR_R_LOOKUP_IDS structure.
1493 ********************************************************************/
1494 void make_samr_r_lookup_ids(SAMR_R_LOOKUP_IDS *r_u,
1495 uint32 num_rids, uint32 *rid, uint32 status)
1498 if (r_u == NULL) return;
1500 DEBUG(5,("make_samr_r_lookup_ids\n"));
1504 r_u->num_entries = num_rids;
1506 r_u->num_entries2 = num_rids;
1508 SMB_ASSERT_ARRAY(r_u->rid, num_rids);
1510 for (i = 0; i < num_rids; i++)
1512 r_u->rid[i] = rid[i];
1517 r_u->num_entries = 0;
1519 r_u->num_entries2 = 0;
1522 r_u->status = status;
1525 /*******************************************************************
1526 reads or writes a structure.
1527 ********************************************************************/
1528 void samr_io_r_lookup_ids(char *desc, SAMR_R_LOOKUP_IDS *r_u, prs_struct *ps, int depth)
1532 if (r_u == NULL) return;
1534 prs_debug(ps, depth, desc, "samr_io_r_lookup_ids");
1539 prs_uint32("num_entries", ps, depth, &(r_u->num_entries));
1540 prs_uint32("ptr ", ps, depth, &(r_u->ptr ));
1541 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
1543 if (r_u->num_entries != 0)
1545 SMB_ASSERT_ARRAY(r_u->rid, r_u->num_entries2);
1547 for (i = 0; i < r_u->num_entries2; i++)
1549 slprintf(tmp, sizeof(tmp)-1, "rid[%02d]", i);
1550 prs_uint32(tmp, ps, depth, &(r_u->rid[i]));
1554 prs_uint32("status", ps, depth, &(r_u->status));
1557 /*******************************************************************
1558 reads or writes a structure.
1559 ********************************************************************/
1560 void samr_io_q_lookup_names(char *desc, SAMR_Q_LOOKUP_NAMES *q_u, prs_struct *ps, int depth)
1564 if (q_u == NULL) return;
1566 prs_debug(ps, depth, desc, "samr_io_q_lookup_names");
1571 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1574 prs_uint32("num_rids1", ps, depth, &(q_u->num_rids1));
1575 prs_uint32("rid ", ps, depth, &(q_u->rid ));
1576 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
1577 prs_uint32("num_rids2", ps, depth, &(q_u->num_rids2));
1579 SMB_ASSERT_ARRAY(q_u->hdr_user_name, q_u->num_rids2);
1581 for (i = 0; i < q_u->num_rids2; i++)
1584 smb_io_unihdr ("", &(q_u->hdr_user_name[i]), ps, depth);
1586 for (i = 0; i < q_u->num_rids2; i++)
1589 smb_io_unistr2("", &(q_u->uni_user_name[i]), q_u->hdr_user_name[i].buffer, ps, depth);
1596 /*******************************************************************
1597 makes a SAMR_R_LOOKUP_NAMES structure.
1598 ********************************************************************/
1599 void make_samr_r_lookup_names(SAMR_R_LOOKUP_NAMES *r_u,
1600 uint32 num_rids, uint32 *rid, uint32 status)
1603 if (r_u == NULL) return;
1605 DEBUG(5,("make_samr_r_lookup_names\n"));
1609 r_u->num_entries = num_rids;
1610 r_u->undoc_buffer = 1;
1611 r_u->num_entries2 = num_rids;
1613 SMB_ASSERT_ARRAY(r_u->dom_rid, num_rids);
1615 for (i = 0; i < num_rids; i++)
1617 make_dom_rid3(&(r_u->dom_rid[i]), rid[i]);
1620 r_u->num_entries3 = num_rids;
1624 r_u->num_entries = 0;
1625 r_u->undoc_buffer = 0;
1626 r_u->num_entries2 = 0;
1627 r_u->num_entries3 = 0;
1630 r_u->status = status;
1633 /*******************************************************************
1634 reads or writes a structure.
1635 ********************************************************************/
1636 void samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES *r_u, prs_struct *ps, int depth)
1639 if (r_u == NULL) return;
1641 prs_debug(ps, depth, desc, "samr_io_r_lookup_names");
1646 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries ));
1647 prs_uint32("undoc_buffer", ps, depth, &(r_u->undoc_buffer));
1648 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
1650 if (r_u->num_entries != 0)
1652 SMB_ASSERT_ARRAY(r_u->dom_rid, r_u->num_entries2);
1654 for (i = 0; i < r_u->num_entries2; i++)
1657 smb_io_dom_rid3("", &(r_u->dom_rid[i]), ps, depth);
1662 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
1664 prs_uint32("status", ps, depth, &(r_u->status));
1667 /*******************************************************************
1668 reads or writes a structure.
1669 ********************************************************************/
1670 void samr_io_q_unknown_12(char *desc, SAMR_Q_UNKNOWN_12 *q_u, prs_struct *ps, int depth)
1675 if (q_u == NULL) return;
1677 prs_debug(ps, depth, desc, "samr_io_q_unknown_12");
1682 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1685 prs_uint32("num_gids1", ps, depth, &(q_u->num_gids1));
1686 prs_uint32("rid ", ps, depth, &(q_u->rid ));
1687 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
1688 prs_uint32("num_gids2", ps, depth, &(q_u->num_gids2));
1690 SMB_ASSERT_ARRAY(q_u->gid, q_u->num_gids2);
1692 for (i = 0; i < q_u->num_gids2; i++)
1695 slprintf(tmp, sizeof(tmp) - 1, "gid[%02d] ", i);
1696 prs_uint32(tmp, ps, depth, &(q_u->gid[i]));
1703 /*******************************************************************
1704 makes a SAMR_R_UNKNOWN_12 structure.
1705 ********************************************************************/
1706 void make_samr_r_unknown_12(SAMR_R_UNKNOWN_12 *r_u,
1707 uint32 num_aliases, fstring *als_name, uint32 *num_als_usrs,
1711 if (r_u == NULL || als_name == NULL || num_als_usrs == NULL) return;
1713 DEBUG(5,("make_samr_r_unknown_12\n"));
1717 r_u->num_aliases1 = num_aliases;
1718 r_u->ptr_aliases = 1;
1719 r_u->num_aliases2 = num_aliases;
1721 r_u->num_als_usrs1 = num_aliases;
1722 r_u->ptr_als_usrs = 1;
1723 r_u->num_als_usrs2 = num_aliases;
1725 SMB_ASSERT_ARRAY(r_u->hdr_als_name, num_aliases);
1727 for (i = 0; i < num_aliases; i++)
1729 int als_len = als_name[i] != NULL ? strlen(als_name[i]) : 0;
1730 make_uni_hdr(&(r_u->hdr_als_name[i]), als_len , als_len, als_name[i] ? 1 : 0);
1731 make_unistr2(&(r_u->uni_als_name[i]), als_name[i], als_len);
1732 r_u->num_als_usrs[i] = num_als_usrs[i];
1737 r_u->num_aliases1 = num_aliases;
1738 r_u->ptr_aliases = 0;
1739 r_u->num_aliases2 = num_aliases;
1741 r_u->num_als_usrs1 = num_aliases;
1742 r_u->ptr_als_usrs = 0;
1743 r_u->num_als_usrs2 = num_aliases;
1746 r_u->status = status;
1749 /*******************************************************************
1750 reads or writes a structure.
1751 ********************************************************************/
1752 void samr_io_r_unknown_12(char *desc, SAMR_R_UNKNOWN_12 *r_u, prs_struct *ps, int depth)
1756 if (r_u == NULL) return;
1758 prs_debug(ps, depth, desc, "samr_io_r_unknown_12");
1763 prs_uint32("num_aliases1", ps, depth, &(r_u->num_aliases1));
1764 prs_uint32("ptr_aliases ", ps, depth, &(r_u->ptr_aliases ));
1765 prs_uint32("num_aliases2", ps, depth, &(r_u->num_aliases2));
1767 if (r_u->ptr_aliases != 0 && r_u->num_aliases1 != 0)
1769 SMB_ASSERT_ARRAY(r_u->hdr_als_name, r_u->num_aliases2);
1771 for (i = 0; i < r_u->num_aliases2; i++)
1774 slprintf(tmp, sizeof(tmp) - 1, "als_hdr[%02d] ", i);
1775 smb_io_unihdr ("", &(r_u->hdr_als_name[i]), ps, depth);
1777 for (i = 0; i < r_u->num_aliases2; i++)
1780 slprintf(tmp, sizeof(tmp) - 1, "als_str[%02d] ", i);
1781 smb_io_unistr2("", &(r_u->uni_als_name[i]), r_u->hdr_als_name[i].buffer, ps, depth);
1787 prs_uint32("num_als_usrs1", ps, depth, &(r_u->num_als_usrs1));
1788 prs_uint32("ptr_als_usrs ", ps, depth, &(r_u->ptr_als_usrs ));
1789 prs_uint32("num_als_usrs2", ps, depth, &(r_u->num_als_usrs2));
1791 if (r_u->ptr_als_usrs != 0 && r_u->num_als_usrs1 != 0)
1793 SMB_ASSERT_ARRAY(r_u->num_als_usrs, r_u->num_als_usrs2);
1795 for (i = 0; i < r_u->num_als_usrs2; i++)
1798 slprintf(tmp, sizeof(tmp) - 1, "als_usrs[%02d] ", i);
1799 prs_uint32(tmp, ps, depth, &(r_u->num_als_usrs[i]));
1803 prs_uint32("status", ps, depth, &(r_u->status));
1807 /*******************************************************************
1808 reads or writes a structure.
1809 ********************************************************************/
1810 void make_samr_q_open_user(SAMR_Q_OPEN_USER *q_u,
1812 uint32 unk_0, uint32 rid)
1814 if (q_u == NULL) return;
1816 DEBUG(5,("samr_make_q_open_user\n"));
1818 memcpy(&q_u->domain_pol, pol, sizeof(q_u->domain_pol));
1820 q_u->unknown_0 = unk_0;
1821 q_u->user_rid = rid;
1824 /*******************************************************************
1825 reads or writes a structure.
1826 ********************************************************************/
1827 void samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER *q_u, prs_struct *ps, int depth)
1829 if (q_u == NULL) return;
1831 prs_debug(ps, depth, desc, "samr_io_q_open_user");
1836 smb_io_pol_hnd("domain_pol", &(q_u->domain_pol), ps, depth);
1839 prs_uint32("unknown_0", ps, depth, &(q_u->unknown_0));
1840 prs_uint32("user_rid ", ps, depth, &(q_u->user_rid ));
1845 /*******************************************************************
1846 reads or writes a structure.
1847 ********************************************************************/
1848 void samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER *r_u, prs_struct *ps, int depth)
1850 if (r_u == NULL) return;
1852 prs_debug(ps, depth, desc, "samr_io_r_open_user");
1857 smb_io_pol_hnd("user_pol", &(r_u->user_pol), ps, depth);
1860 prs_uint32("status", ps, depth, &(r_u->status));
1863 /*******************************************************************
1864 makes a SAMR_Q_QUERY_USERGROUPS structure.
1865 ********************************************************************/
1866 void make_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u,
1869 if (q_u == NULL || hnd == NULL) return;
1871 DEBUG(5,("make_samr_q_query_usergroups\n"));
1873 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
1877 /*******************************************************************
1878 reads or writes a structure.
1879 ********************************************************************/
1880 void samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS *q_u, prs_struct *ps, int depth)
1882 if (q_u == NULL) return;
1884 prs_debug(ps, depth, desc, "samr_io_q_query_usergroups");
1889 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1893 /*******************************************************************
1894 makes a SAMR_R_QUERY_USERGROUPS structure.
1895 ********************************************************************/
1896 void make_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS *r_u,
1897 uint32 num_gids, DOM_GID *gid, uint32 status)
1899 if (r_u == NULL) return;
1901 DEBUG(5,("make_samr_r_query_usergroups\n"));
1906 r_u->num_entries = num_gids;
1908 r_u->num_entries2 = num_gids;
1915 r_u->num_entries = 0;
1919 r_u->status = status;
1922 /*******************************************************************
1923 reads or writes a structure.
1924 ********************************************************************/
1925 void samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS *r_u, prs_struct *ps, int depth)
1928 if (r_u == NULL) return;
1930 prs_debug(ps, depth, desc, "samr_io_r_query_usergroups");
1935 prs_uint32("ptr_0 ", ps, depth, &(r_u->ptr_0 ));
1937 if (r_u->ptr_0 != 0)
1939 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries));
1940 prs_uint32("ptr_1 ", ps, depth, &(r_u->ptr_1 ));
1942 if (r_u->num_entries != 0)
1944 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
1946 for (i = 0; i < r_u->num_entries2; i++)
1949 smb_io_gid("", &(r_u->gid[i]), ps, depth);
1953 prs_uint32("status", ps, depth, &(r_u->status));
1956 /*******************************************************************
1957 makes a SAMR_Q_QUERY_USERINFO structure.
1958 ********************************************************************/
1959 void make_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u,
1960 POLICY_HND *hnd, uint16 switch_value)
1962 if (q_u == NULL || hnd == NULL) return;
1964 DEBUG(5,("make_samr_q_query_userinfo\n"));
1966 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
1967 q_u->switch_value = switch_value;
1971 /*******************************************************************
1972 reads or writes a structure.
1973 ********************************************************************/
1974 void samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO *q_u, prs_struct *ps, int depth)
1976 if (q_u == NULL) return;
1978 prs_debug(ps, depth, desc, "samr_io_q_query_userinfo");
1983 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1986 prs_uint16("switch_value", ps, depth, &(q_u->switch_value)); /* 0x0015 or 0x0011 */
1991 /*******************************************************************
1992 reads or writes a LOGON_HRS structure.
1993 ********************************************************************/
1994 static void sam_io_logon_hrs(char *desc, LOGON_HRS *hrs, prs_struct *ps, int depth)
1996 if (hrs == NULL) return;
1998 prs_debug(ps, depth, desc, "sam_io_logon_hrs");
2003 prs_uint32 ( "len ", ps, depth, &(hrs->len ));
2007 DEBUG(5,("sam_io_logon_hrs: truncating length\n"));
2011 prs_uint8s (False, "hours", ps, depth, hrs->hours, hrs->len);
2014 /*************************************************************************
2015 make_sam_user_info21
2017 unknown_3 = 0x00ff ffff
2018 unknown_5 = 0x0002 0000
2019 unknown_6 = 0x0000 04ec
2021 *************************************************************************/
2022 void make_sam_user_info21(SAM_USER_INFO_21 *usr,
2025 NTTIME *logoff_time,
2026 NTTIME *kickoff_time,
2027 NTTIME *pass_last_set_time,
2028 NTTIME *pass_can_change_time,
2029 NTTIME *pass_must_change_time,
2052 int len_user_name = user_name != NULL ? strlen(user_name ) : 0;
2053 int len_full_name = full_name != NULL ? strlen(full_name ) : 0;
2054 int len_home_dir = home_dir != NULL ? strlen(home_dir ) : 0;
2055 int len_dir_drive = dir_drive != NULL ? strlen(dir_drive ) : 0;
2056 int len_logon_script = logon_script != NULL ? strlen(logon_script) : 0;
2057 int len_profile_path = profile_path != NULL ? strlen(profile_path) : 0;
2058 int len_description = description != NULL ? strlen(description ) : 0;
2059 int len_workstations = workstations != NULL ? strlen(workstations) : 0;
2060 int len_unknown_str = unknown_str != NULL ? strlen(unknown_str ) : 0;
2061 int len_munged_dial = munged_dial != NULL ? strlen(munged_dial ) : 0;
2063 usr->logon_time = *logon_time;
2064 usr->logoff_time = *logoff_time;
2065 usr->kickoff_time = *kickoff_time;
2066 usr->pass_last_set_time = *pass_last_set_time;
2067 usr->pass_can_change_time = *pass_can_change_time;
2068 usr->pass_must_change_time = *pass_must_change_time;
2070 make_uni_hdr(&(usr->hdr_user_name ), len_user_name , len_user_name , len_user_name != 0);
2071 make_uni_hdr(&(usr->hdr_full_name ), len_full_name , len_full_name , len_full_name != 0);
2072 make_uni_hdr(&(usr->hdr_home_dir ), len_home_dir , len_home_dir , len_home_dir != 0);
2073 make_uni_hdr(&(usr->hdr_dir_drive ), len_dir_drive , len_dir_drive , len_dir_drive != 0);
2074 make_uni_hdr(&(usr->hdr_logon_script), len_logon_script, len_logon_script, len_logon_script != 0);
2075 make_uni_hdr(&(usr->hdr_profile_path), len_profile_path, len_profile_path, len_profile_path != 0);
2076 make_uni_hdr(&(usr->hdr_acct_desc ), len_description , len_description , len_description != 0);
2077 make_uni_hdr(&(usr->hdr_workstations), len_workstations, len_workstations, len_workstations != 0);
2078 make_uni_hdr(&(usr->hdr_unknown_str ), len_unknown_str , len_unknown_str , len_workstations != 0);
2079 make_uni_hdr(&(usr->hdr_munged_dial ), len_munged_dial , len_munged_dial , len_workstations != 0);
2081 bzero(usr->nt_pwd, sizeof(usr->nt_pwd));
2082 bzero(usr->lm_pwd, sizeof(usr->lm_pwd));
2084 usr->user_rid = user_rid;
2085 usr->group_rid = group_rid;
2086 usr->acb_info = acb_info;
2087 usr->unknown_3 = unknown_3; /* 0x00ff ffff */
2089 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
2090 usr->ptr_logon_hrs = hrs ? 1 : 0;
2091 usr->unknown_5 = unknown_5; /* 0x0002 0000 */
2093 bzero(usr->padding1, sizeof(usr->padding1));
2095 make_unistr2(&(usr->uni_user_name ), user_name , len_user_name );
2096 make_unistr2(&(usr->uni_full_name ), full_name , len_full_name );
2097 make_unistr2(&(usr->uni_home_dir ), home_dir , len_home_dir );
2098 make_unistr2(&(usr->uni_dir_drive ), dir_drive , len_dir_drive );
2099 make_unistr2(&(usr->uni_logon_script), logon_script, len_logon_script);
2100 make_unistr2(&(usr->uni_profile_path), profile_path, len_profile_path);
2101 make_unistr2(&(usr->uni_acct_desc ), description , len_description );
2102 make_unistr2(&(usr->uni_workstations), workstations, len_workstations);
2103 make_unistr2(&(usr->uni_unknown_str ), unknown_str , len_unknown_str );
2104 make_unistr2(&(usr->uni_munged_dial ), munged_dial , len_munged_dial );
2106 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
2111 memcpy(&(usr->logon_hrs), hrs, sizeof(usr->logon_hrs));
2115 memset(&(usr->logon_hrs), 0xff, sizeof(usr->logon_hrs));
2120 /*******************************************************************
2121 reads or writes a structure.
2122 ********************************************************************/
2123 static void sam_io_user_info21(char *desc, SAM_USER_INFO_21 *usr, prs_struct *ps, int depth)
2125 if (usr == NULL) return;
2127 prs_debug(ps, depth, desc, "lsa_io_user_info");
2132 smb_io_time("logon_time ", &(usr->logon_time) , ps, depth);
2133 smb_io_time("logoff_time ", &(usr->logoff_time) , ps, depth);
2134 smb_io_time("kickoff_time ", &(usr->kickoff_time) , ps, depth);
2135 smb_io_time("pass_last_set_time ", &(usr->pass_last_set_time) , ps, depth);
2136 smb_io_time("pass_can_change_time ", &(usr->pass_can_change_time) , ps, depth);
2137 smb_io_time("pass_must_change_time", &(usr->pass_must_change_time), ps, depth);
2139 smb_io_unihdr("hdr_user_name ", &(usr->hdr_user_name) , ps, depth); /* username unicode string header */
2140 smb_io_unihdr("hdr_full_name ", &(usr->hdr_full_name) , ps, depth); /* user's full name unicode string header */
2141 smb_io_unihdr("hdr_home_dir ", &(usr->hdr_home_dir) , ps, depth); /* home directory unicode string header */
2142 smb_io_unihdr("hdr_dir_drive ", &(usr->hdr_dir_drive) , ps, depth); /* home directory drive */
2143 smb_io_unihdr("hdr_logon_script", &(usr->hdr_logon_script), ps, depth); /* logon script unicode string header */
2144 smb_io_unihdr("hdr_profile_path", &(usr->hdr_profile_path), ps, depth); /* profile path unicode string header */
2145 smb_io_unihdr("hdr_acct_desc ", &(usr->hdr_acct_desc ) , ps, depth); /* account description */
2146 smb_io_unihdr("hdr_workstations", &(usr->hdr_workstations), ps, depth); /* workstations user can log on from */
2147 smb_io_unihdr("hdr_unknown_str ", &(usr->hdr_unknown_str ), ps, depth); /* unknown string */
2148 smb_io_unihdr("hdr_munged_dial ", &(usr->hdr_munged_dial ), ps, depth); /* workstations user can log on from */
2150 prs_uint8s (False, "lm_pwd ", ps, depth, usr->lm_pwd , sizeof(usr->lm_pwd ));
2151 prs_uint8s (False, "nt_pwd ", ps, depth, usr->nt_pwd , sizeof(usr->nt_pwd ));
2153 prs_uint32("user_rid ", ps, depth, &(usr->user_rid )); /* User ID */
2154 prs_uint32("group_rid ", ps, depth, &(usr->group_rid )); /* Group ID */
2155 prs_uint16("acb_info ", ps, depth, &(usr->acb_info )); /* Group ID */
2158 prs_uint32("unknown_3 ", ps, depth, &(usr->unknown_3 ));
2159 prs_uint16("logon_divs ", ps, depth, &(usr->logon_divs )); /* logon divisions per week */
2161 prs_uint32("ptr_logon_hrs ", ps, depth, &(usr->ptr_logon_hrs));
2162 prs_uint32("unknown_5 ", ps, depth, &(usr->unknown_5 ));
2164 prs_uint8s (False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1));
2166 /* here begins pointed-to data */
2168 smb_io_unistr2("uni_user_name ", &(usr->uni_user_name) , usr->hdr_user_name .buffer, ps, depth); /* username unicode string */
2169 smb_io_unistr2("uni_full_name ", &(usr->uni_full_name) , usr->hdr_full_name .buffer, ps, depth); /* user's full name unicode string */
2170 smb_io_unistr2("uni_home_dir ", &(usr->uni_home_dir) , usr->hdr_home_dir .buffer, ps, depth); /* home directory unicode string */
2171 smb_io_unistr2("uni_dir_drive ", &(usr->uni_dir_drive) , usr->hdr_dir_drive .buffer, ps, depth); /* home directory drive unicode string */
2172 smb_io_unistr2("uni_logon_script", &(usr->uni_logon_script), usr->hdr_logon_script.buffer, ps, depth); /* logon script unicode string */
2173 smb_io_unistr2("uni_profile_path", &(usr->uni_profile_path), usr->hdr_profile_path.buffer, ps, depth); /* profile path unicode string */
2174 smb_io_unistr2("uni_acct_desc ", &(usr->uni_acct_desc ), usr->hdr_acct_desc .buffer, ps, depth); /* user description unicode string */
2175 smb_io_unistr2("uni_workstations", &(usr->uni_workstations), usr->hdr_workstations.buffer, ps, depth); /* worksations user can log on from */
2176 smb_io_unistr2("uni_unknown_str ", &(usr->uni_unknown_str ), usr->hdr_unknown_str .buffer, ps, depth); /* unknown string */
2177 smb_io_unistr2("uni_munged_dial ", &(usr->uni_munged_dial ), usr->hdr_munged_dial .buffer, ps, depth); /* worksations user can log on from */
2179 prs_uint32("unknown_6 ", ps, depth, &(usr->unknown_6 ));
2180 prs_uint32("padding4 ", ps, depth, &(usr->padding4 ));
2182 if (usr->ptr_logon_hrs)
2184 sam_io_logon_hrs("logon_hrs", &(usr->logon_hrs) , ps, depth);
2190 /*******************************************************************
2191 makes a SAMR_R_QUERY_USERINFO structure.
2192 ********************************************************************/
2193 void make_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO *r_u,
2194 uint16 switch_value, void *info, uint32 status)
2197 if (r_u == NULL || info == NULL) return;
2199 DEBUG(5,("make_samr_r_query_userinfo\n"));
2202 r_u->switch_value = 0;
2206 r_u->switch_value = switch_value;
2208 switch (switch_value)
2213 r_u->info.id10 = (SAM_USER_INFO_10*)info;
2221 r_u->info.id11 = (SAM_USER_INFO_11*)info;
2229 r_u->info.id21 = (SAM_USER_INFO_21*)info;
2236 DEBUG(4,("make_samr_r_query_aliasinfo: unsupported switch level\n"));
2242 r_u->status = status; /* return status */
2245 /*******************************************************************
2246 reads or writes a structure.
2247 ********************************************************************/
2248 void samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO *r_u, prs_struct *ps, int depth)
2250 if (r_u == NULL) return;
2252 prs_debug(ps, depth, desc, "samr_io_r_query_userinfo");
2257 prs_uint32("ptr ", ps, depth, &(r_u->ptr ));
2258 prs_uint16("switch_value", ps, depth, &(r_u->switch_value));
2261 if (r_u->ptr != 0 && r_u->switch_value != 0)
2263 switch (r_u->switch_value)
2268 if (r_u->info.id10 != NULL)
2270 sam_io_user_info10("", r_u->info.id10, ps, depth);
2274 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
2281 if (r_u->info.id11 != NULL)
2283 sam_io_user_info11("", r_u->info.id11, ps, depth);
2287 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
2295 if (r_u->info.id21 != NULL)
2297 sam_io_user_info21("", r_u->info.id21, ps, depth);
2301 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
2308 DEBUG(2,("samr_io_r_query_userinfo: unknown switch level\n"));
2315 prs_uint32("status", ps, depth, &(r_u->status));
2318 /*******************************************************************
2319 reads or writes a structure.
2320 ********************************************************************/
2321 void samr_io_q_unknown_32(char *desc, SAMR_Q_UNKNOWN_32 *q_u, prs_struct *ps, int depth)
2323 if (q_u == NULL) return;
2325 prs_debug(ps, depth, desc, "samr_io_q_unknown_32");
2330 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
2333 smb_io_unihdr ("", &(q_u->hdr_mach_acct), ps, depth);
2334 smb_io_unistr2("", &(q_u->uni_mach_acct), q_u->hdr_mach_acct.buffer, ps, depth);
2338 prs_uint32("acct_ctrl", ps, depth, &(q_u->acct_ctrl));
2339 prs_uint16("unknown_1", ps, depth, &(q_u->unknown_1));
2340 prs_uint16("unknown_2", ps, depth, &(q_u->unknown_2));
2343 /*******************************************************************
2344 reads or writes a structure.
2345 ********************************************************************/
2346 void samr_io_r_unknown_32(char *desc, SAMR_R_UNKNOWN_32 *r_u, prs_struct *ps, int depth)
2348 if (r_u == NULL) return;
2350 prs_debug(ps, depth, desc, "samr_io_r_unknown_32");
2355 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
2358 prs_uint32("status", ps, depth, &(r_u->status));
2362 /*******************************************************************
2363 makes a SAMR_Q_CONNECT structure.
2364 ********************************************************************/
2365 void make_samr_q_connect(SAMR_Q_CONNECT *q_u,
2366 char *srv_name, uint32 unknown_0)
2368 int len_srv_name = strlen(srv_name);
2370 if (q_u == NULL) return;
2372 DEBUG(5,("make_q_connect\n"));
2374 /* make PDC server name \\server */
2375 q_u->ptr_srv_name = len_srv_name > 0 ? 1 : 0;
2376 make_unistr2(&(q_u->uni_srv_name), srv_name, len_srv_name);
2378 /* example values: 0x0000 0002 */
2379 q_u->unknown_0 = unknown_0;
2383 /*******************************************************************
2384 reads or writes a structure.
2385 ********************************************************************/
2386 void samr_io_q_connect(char *desc, SAMR_Q_CONNECT *q_u, prs_struct *ps, int depth)
2388 if (q_u == NULL) return;
2390 prs_debug(ps, depth, desc, "samr_io_q_connect");
2395 prs_uint32("ptr_srv_name", ps, depth, &(q_u->ptr_srv_name));
2396 smb_io_unistr2("", &(q_u->uni_srv_name), q_u->ptr_srv_name, ps, depth);
2400 prs_uint32("unknown_0 ", ps, depth, &(q_u->unknown_0 ));
2403 /*******************************************************************
2404 reads or writes a structure.
2405 ********************************************************************/
2406 void samr_io_r_connect(char *desc, SAMR_R_CONNECT *r_u, prs_struct *ps, int depth)
2408 if (r_u == NULL) return;
2410 prs_debug(ps, depth, desc, "samr_io_r_connect");
2415 smb_io_pol_hnd("connect_pol", &(r_u->connect_pol), ps, depth);
2418 prs_uint32("status", ps, depth, &(r_u->status));
2421 /*******************************************************************
2422 makes a SAMR_Q_CONNECT_ANON structure.
2423 ********************************************************************/
2424 void make_samr_q_connect_anon(SAMR_Q_CONNECT_ANON *q_u)
2426 if (q_u == NULL) return;
2428 DEBUG(5,("make_q_connect_anon\n"));
2431 q_u->unknown_0 = 0x5c; /* server name (?!!) */
2432 q_u->unknown_1 = 0x01;
2433 q_u->unknown_2 = 0x20;
2437 /*******************************************************************
2438 reads or writes a structure.
2439 ********************************************************************/
2440 void samr_io_q_connect_anon(char *desc, SAMR_Q_CONNECT_ANON *q_u, prs_struct *ps, int depth)
2442 if (q_u == NULL) return;
2444 prs_debug(ps, depth, desc, "samr_io_q_connect_anon");
2449 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
2450 prs_uint16("unknown_0", ps, depth, &(q_u->unknown_0));
2451 prs_uint16("unknown_1", ps, depth, &(q_u->unknown_1));
2452 prs_uint32("unknown_2", ps, depth, &(q_u->unknown_2));
2455 /*******************************************************************
2456 reads or writes a structure.
2457 ********************************************************************/
2458 void samr_io_r_connect_anon(char *desc, SAMR_R_CONNECT_ANON *r_u, prs_struct *ps, int depth)
2460 if (r_u == NULL) return;
2462 prs_debug(ps, depth, desc, "samr_io_r_connect_anon");
2467 smb_io_pol_hnd("connect_pol", &(r_u->connect_pol), ps, depth);
2470 prs_uint32("status", ps, depth, &(r_u->status));
2473 /*******************************************************************
2474 makes a SAMR_Q_OPEN_ALIAS structure.
2475 ********************************************************************/
2476 void make_samr_q_open_alias(SAMR_Q_OPEN_ALIAS *q_u,
2477 uint32 unknown_0, uint32 rid)
2479 if (q_u == NULL) return;
2481 DEBUG(5,("make_q_open_alias\n"));
2483 /* example values: 0x0000 0008 */
2484 q_u->unknown_0 = unknown_0;
2486 q_u->rid_alias = rid;
2489 /*******************************************************************
2490 reads or writes a structure.
2491 ********************************************************************/
2492 void samr_io_q_open_alias(char *desc, SAMR_Q_OPEN_ALIAS *q_u, prs_struct *ps, int depth)
2494 if (q_u == NULL) return;
2496 prs_debug(ps, depth, desc, "samr_io_q_open_alias");
2501 prs_uint32("unknown_0", ps, depth, &(q_u->unknown_0));
2502 prs_uint32("rid_alias", ps, depth, &(q_u->rid_alias));
2505 /*******************************************************************
2506 reads or writes a structure.
2507 ********************************************************************/
2508 void samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS *r_u, prs_struct *ps, int depth)
2510 if (r_u == NULL) return;
2512 prs_debug(ps, depth, desc, "samr_io_r_open_alias");
2517 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
2520 prs_uint32("status", ps, depth, &(r_u->status));
2523 /*******************************************************************
2524 makes a SAMR_Q_UNKNOWN_12 structure.
2525 ********************************************************************/
2526 void make_samr_q_unknown_12(SAMR_Q_UNKNOWN_12 *q_u,
2527 POLICY_HND *pol, uint32 rid,
2528 uint32 num_gids, uint32 *gid)
2531 if (q_u == NULL) return;
2533 DEBUG(5,("make_samr_r_unknwon_12\n"));
2535 memcpy(&(q_u->pol), pol, sizeof(*pol));
2537 q_u->num_gids1 = num_gids;
2540 q_u->num_gids2 = num_gids;
2542 for (i = 0; i < num_gids; i++)
2544 q_u->gid[i] = gid[i];
2549 /*******************************************************************
2550 makes a SAMR_Q_UNKNOWN_21 structure.
2551 ********************************************************************/
2552 void make_samr_q_unknown_21(SAMR_Q_UNKNOWN_21 *q_c,
2553 POLICY_HND *hnd, uint16 unk_1, uint16 unk_2)
2555 if (q_c == NULL || hnd == NULL) return;
2557 DEBUG(5,("make_samr_q_unknown_21\n"));
2559 memcpy(&(q_c->group_pol), hnd, sizeof(q_c->group_pol));
2560 q_c->unknown_1 = unk_1;
2561 q_c->unknown_2 = unk_2;
2565 /*******************************************************************
2566 makes a SAMR_Q_UNKNOWN_13 structure.
2567 ********************************************************************/
2568 void make_samr_q_unknown_13(SAMR_Q_UNKNOWN_13 *q_c,
2569 POLICY_HND *hnd, uint16 unk_1, uint16 unk_2)
2571 if (q_c == NULL || hnd == NULL) return;
2573 DEBUG(5,("make_samr_q_unknown_13\n"));
2575 memcpy(&(q_c->alias_pol), hnd, sizeof(q_c->alias_pol));
2576 q_c->unknown_1 = unk_1;
2577 q_c->unknown_2 = unk_2;
2581 /*******************************************************************
2582 makes a SAMR_Q_UNKNOWN_38 structure.
2583 ********************************************************************/
2584 void make_samr_q_unknown_38(SAMR_Q_UNKNOWN_38 *q_u, char *srv_name)
2586 int len_srv_name = strlen(srv_name);
2588 if (q_u == NULL) return;
2590 DEBUG(5,("make_q_unknown_38\n"));
2593 make_uni_hdr(&(q_u->hdr_srv_name), len_srv_name, len_srv_name, len_srv_name != 0);
2594 make_unistr2(&(q_u->uni_srv_name), srv_name, len_srv_name);
2598 /*******************************************************************
2599 reads or writes a structure.
2600 ********************************************************************/
2601 void samr_io_q_unknown_38(char *desc, SAMR_Q_UNKNOWN_38 *q_u, prs_struct *ps, int depth)
2603 if (q_u == NULL) return;
2605 prs_debug(ps, depth, desc, "samr_io_q_unknown_38");
2610 prs_uint32("ptr", ps, depth, &(q_u->ptr));
2613 smb_io_unihdr ("", &(q_u->hdr_srv_name), ps, depth);
2614 smb_io_unistr2("", &(q_u->uni_srv_name), q_u->hdr_srv_name.buffer, ps, depth);
2618 /*******************************************************************
2619 makes a SAMR_R_UNKNOWN_38 structure.
2620 ********************************************************************/
2621 void make_samr_r_unknown_38(SAMR_R_UNKNOWN_38 *r_u)
2623 if (r_u == NULL) return;
2625 DEBUG(5,("make_r_unknown_38\n"));
2633 /*******************************************************************
2634 reads or writes a structure.
2635 ********************************************************************/
2636 void samr_io_r_unknown_38(char *desc, SAMR_R_UNKNOWN_38 *r_u, prs_struct *ps, int depth)
2638 if (r_u == NULL) return;
2640 prs_debug(ps, depth, desc, "samr_io_r_unknown_38");
2645 prs_uint16("unk_0", ps, depth, &(r_u->unk_0));
2647 prs_uint16("unk_1", ps, depth, &(r_u->unk_1));
2649 prs_uint16("unk_2", ps, depth, &(r_u->unk_2));
2651 prs_uint16("unk_3", ps, depth, &(r_u->unk_3));
2655 /*******************************************************************
2656 make a SAMR_ENC_PASSWD structure.
2657 ********************************************************************/
2658 void make_enc_passwd(SAMR_ENC_PASSWD *pwd, char pass[512])
2660 if (pwd == NULL) return;
2663 memcpy(&(pwd->pass), pass, sizeof(pwd->pass));
2666 /*******************************************************************
2667 reads or writes a SAMR_ENC_PASSWD structure.
2668 ********************************************************************/
2669 void samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD *pwd, prs_struct *ps, int depth)
2671 if (pwd == NULL) return;
2673 prs_debug(ps, depth, desc, "samr_io_enc_passwd");
2678 prs_uint32("ptr", ps, depth, &(pwd->ptr));
2679 prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass));
2682 /*******************************************************************
2683 makes a SAMR_ENC_HASH structure.
2684 ********************************************************************/
2685 void make_enc_hash(SAMR_ENC_HASH *hsh, char hash[16])
2687 if (hsh == NULL) return;
2690 memcpy(&(hsh->hash), hash, sizeof(hsh->hash));
2693 /*******************************************************************
2694 reads or writes a SAMR_ENC_HASH structure.
2695 ********************************************************************/
2696 void samr_io_enc_hash(char *desc, SAMR_ENC_HASH *hsh, prs_struct *ps, int depth)
2698 if (hsh == NULL) return;
2700 prs_debug(ps, depth, desc, "samr_io_enc_hash");
2705 prs_uint32("ptr ", ps, depth, &(hsh->ptr));
2706 prs_uint8s(False, "hash", ps, depth, hsh->hash, sizeof(hsh->hash));
2709 /*******************************************************************
2710 makes a SAMR_R_UNKNOWN_38 structure.
2711 ********************************************************************/
2712 void make_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER *q_u,
2713 char *dest_host, char *user_name,
2714 char nt_newpass[516], char nt_oldhash[16],
2715 char lm_newpass[516], char lm_oldhash[16])
2717 int len_dest_host = strlen(dest_host);
2718 int len_user_name = strlen(user_name);
2720 if (q_u == NULL) return;
2722 DEBUG(5,("make_samr_q_chgpasswd_user\n"));
2725 make_uni_hdr(&(q_u->hdr_dest_host), len_dest_host, len_dest_host, len_dest_host != 0);
2726 make_unistr2(&(q_u->uni_dest_host), dest_host, len_dest_host);
2727 make_uni_hdr(&(q_u->hdr_user_name), len_user_name, len_user_name, len_user_name != 0);
2728 make_unistr2(&(q_u->uni_user_name), user_name, len_user_name);
2730 make_enc_passwd(&(q_u->nt_newpass), nt_newpass);
2731 make_enc_hash (&(q_u->nt_oldhash), nt_oldhash);
2733 q_u->unknown = 0x01;
2735 make_enc_passwd(&(q_u->lm_newpass), lm_newpass);
2736 make_enc_hash (&(q_u->lm_oldhash), lm_oldhash);
2739 /*******************************************************************
2740 reads or writes a structure.
2741 ********************************************************************/
2742 void samr_io_q_chgpasswd_user(char *desc, SAMR_Q_CHGPASSWD_USER *q_u, prs_struct *ps, int depth)
2744 if (q_u == NULL) return;
2746 prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user");
2751 prs_uint32("ptr_0", ps, depth, &(q_u->ptr_0));
2753 smb_io_unihdr ("", &(q_u->hdr_dest_host), ps, depth);
2754 smb_io_unistr2("", &(q_u->uni_dest_host), q_u->hdr_dest_host.buffer, ps, depth);
2755 smb_io_unihdr ("", &(q_u->hdr_user_name), ps, depth);
2756 smb_io_unistr2("", &(q_u->uni_user_name), q_u->hdr_user_name.buffer, ps, depth);
2758 samr_io_enc_passwd("nt_newpass", &(q_u->nt_newpass), ps, depth);
2760 samr_io_enc_hash ("nt_oldhash", &(q_u->nt_oldhash), ps, depth);
2762 prs_uint32("unknown", ps, depth, &(q_u->unknown));
2764 samr_io_enc_passwd("lm_newpass", &(q_u->lm_newpass), ps, depth);
2766 samr_io_enc_hash ("lm_oldhash", &(q_u->lm_oldhash), ps, depth);
2769 /*******************************************************************
2770 makes a SAMR_R_CHGPASSWD_USER structure.
2771 ********************************************************************/
2772 void make_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER *r_u, uint32 status)
2774 if (r_u == NULL) return;
2776 DEBUG(5,("make_r_chgpasswd_user\n"));
2778 r_u->status = status;
2781 /*******************************************************************
2782 reads or writes a structure.
2783 ********************************************************************/
2784 void samr_io_r_chgpasswd_user(char *desc, SAMR_R_CHGPASSWD_USER *r_u, prs_struct *ps, int depth)
2786 if (r_u == NULL) return;
2788 prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user");
2793 prs_uint32("status", ps, depth, &(r_u->status));