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, DOM_SID *sid)
83 if (q_u == NULL) return;
85 DEBUG(5,("samr_make_q_open_domain\n"));
87 memcpy(&q_u->connect_pol, connect_pol, sizeof(q_u->connect_pol));
89 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));
134 /*******************************************************************
135 reads or writes a structure.
136 ********************************************************************/
137 void make_samr_q_unknown_8(SAMR_Q_UNKNOWN_8 *q_u,
138 POLICY_HND *domain_pol, uint16 switch_value)
140 if (q_u == NULL) return;
142 DEBUG(5,("samr_make_q_unknown_8\n"));
144 memcpy(&q_u->domain_pol, domain_pol, sizeof(q_u->domain_pol));
145 q_u->switch_value = switch_value;
149 /*******************************************************************
150 reads or writes a structure.
151 ********************************************************************/
152 void samr_io_q_unknown_8(char *desc, SAMR_Q_UNKNOWN_8 *q_u, prs_struct *ps, int depth)
154 if (q_u == NULL) return;
156 prs_debug(ps, depth, desc, "samr_io_q_unknown_8");
161 smb_io_pol_hnd("domain_pol", &(q_u->domain_pol), ps, depth);
164 prs_uint16("switch_value", ps, depth, &(q_u->switch_value));
168 /*******************************************************************
169 reads or writes a structure.
170 ********************************************************************/
171 void make_samr_q_unknown_3(SAMR_Q_UNKNOWN_3 *q_u,
172 POLICY_HND *user_pol, uint16 switch_value)
174 if (q_u == NULL) return;
176 DEBUG(5,("samr_make_q_unknown_3\n"));
178 memcpy(&q_u->user_pol, user_pol, sizeof(q_u->user_pol));
179 q_u->switch_value = switch_value;
183 /*******************************************************************
184 reads or writes a structure.
185 ********************************************************************/
186 void samr_io_q_unknown_3(char *desc, SAMR_Q_UNKNOWN_3 *q_u, prs_struct *ps, int depth)
188 if (q_u == NULL) return;
190 prs_debug(ps, depth, desc, "samr_io_q_unknown_3");
195 smb_io_pol_hnd("user_pol", &(q_u->user_pol), ps, depth);
198 prs_uint16("switch_value", ps, depth, &(q_u->switch_value));
202 /*******************************************************************
203 makes a DOM_SID3 structure.
205 calculate length by adding up the size of the components.
206 ********************************************************************/
207 void make_dom_sid3(DOM_SID3 *sid3, uint16 unk_0, uint16 unk_1, DOM_SID *sid)
209 if (sid3 == NULL) return;
212 sid3->len = 2 + 8 + sid3->sid.num_auths * 4;
215 /*******************************************************************
216 reads or writes a SAM_SID3 structure.
218 this one's odd, because the length (in bytes) is specified at the beginning.
219 the length _includes_ the length of the length, too :-)
221 ********************************************************************/
222 void sam_io_dom_sid3(char *desc, DOM_SID3 *sid3, prs_struct *ps, int depth)
224 if (sid3 == NULL) return;
226 prs_debug(ps, depth, desc, "sam_io_dom_sid3");
229 prs_uint16("len", ps, depth, &(sid3->len));
231 smb_io_dom_sid("", &(sid3->sid), ps, depth);
234 /*******************************************************************
235 makes a SAMR_R_UNKNOWN3 structure.
240 unknown_4,5 : 0x0000 0014
243 unknown_7 : 0x5800 or 0x0070
245 ********************************************************************/
246 void make_sam_sid_stuff(SAM_SID_STUFF *stf,
247 uint16 unknown_2, uint16 unknown_3,
248 uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
249 int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS])
251 stf->unknown_2 = unknown_2;
252 stf->unknown_3 = unknown_3;
254 bzero(stf->padding1, sizeof(stf->padding1));
256 stf->unknown_4 = unknown_4;
257 stf->unknown_5 = unknown_4;
259 stf->unknown_6 = unknown_6;
260 stf->unknown_7 = unknown_7;
262 stf->num_sids = num_sid3s;
264 stf->padding2 = 0x0000;
266 memcpy(stf->sid, sid3, sizeof(DOM_SID3) * num_sid3s);
269 /*******************************************************************
270 reads or writes a SAM_SID_STUFF structure.
271 ********************************************************************/
272 void sam_io_sid_stuff(char *desc, SAM_SID_STUFF *stf, prs_struct *ps, int depth)
276 if (stf == NULL) return;
278 DEBUG(5,("make_sam_sid_stuff\n"));
280 prs_uint16("unknown_2", ps, depth, &(stf->unknown_2));
281 prs_uint16("unknown_3", ps, depth, &(stf->unknown_3));
283 prs_uint8s(False, "padding1", ps, depth, stf->padding1, sizeof(stf->padding1));
285 prs_uint32("unknown_4", ps, depth, &(stf->unknown_4));
286 prs_uint32("unknown_5", ps, depth, &(stf->unknown_5));
287 prs_uint16("unknown_6", ps, depth, &(stf->unknown_6));
288 prs_uint16("unknown_7", ps, depth, &(stf->unknown_7));
290 prs_uint32("num_sids ", ps, depth, &(stf->num_sids ));
291 prs_uint16("padding2 ", ps, depth, &(stf->padding2 ));
293 ASSERT_ARRAY(stf->sid, stf->num_sids);
295 for (i = 0; i < stf->num_sids; i++)
297 sam_io_dom_sid3("", &(stf->sid[i]), ps, depth);
301 /*******************************************************************
302 reads or writes a SAMR_R_UNKNOWN3 structure.
303 ********************************************************************/
304 void make_samr_r_unknown_3(SAMR_R_UNKNOWN_3 *r_u,
305 uint16 unknown_2, uint16 unknown_3,
306 uint32 unknown_4, uint16 unknown_6, uint16 unknown_7,
307 int num_sid3s, DOM_SID3 sid3[MAX_SAM_SIDS],
310 if (r_u == NULL) return;
312 DEBUG(5,("samr_make_r_unknown_3\n"));
321 make_sam_sid_stuff(&(r_u->sid_stuff), unknown_2, unknown_3,
322 unknown_4, unknown_6, unknown_7,
326 r_u->status = status;
330 /*******************************************************************
331 reads or writes a SAMR_R_UNKNOWN_3 structure.
333 this one's odd, because the daft buggers use a different mechanism
334 for writing out the array of sids. they put the number of sids in
335 only one place: they've calculated the length of each sid and jumped
336 by that amount. then, retrospectively, the length of the whole buffer
337 is put at the beginning of the data stream.
341 ********************************************************************/
342 void samr_io_r_unknown_3(char *desc, SAMR_R_UNKNOWN_3 *r_u, prs_struct *ps, int depth)
346 int ptr_sid_stuff = 0;
348 if (r_u == NULL) return;
350 prs_debug(ps, depth, desc, "samr_io_r_unknown_3");
355 prs_uint32("ptr_0 ", ps, depth, &(r_u->ptr_0 ));
359 /* reading. do the length later */
360 prs_uint32("sid_stuff_len0", ps, depth, &(r_u->sid_stuff_len0));
365 ptr_len0 = ps->offset; ps->offset += 4;
370 prs_uint32("ptr_1 ", ps, depth, &(r_u->ptr_1 ));
373 /* reading. do the length later */
374 prs_uint32("sid_stuff_len1", ps, depth, &(r_u->sid_stuff_len1));
379 ptr_len1 = ps->offset; ps->offset += 4;
384 ptr_sid_stuff = ps->offset;
385 sam_io_sid_stuff("", &(r_u->sid_stuff), ps, depth);
389 if (!(ps->io)) /* storing not reading. do the length, now. */
391 if (ptr_sid_stuff != 0)
393 uint32 sid_stuff_len = ps->offset - ptr_sid_stuff;
394 int old_len = ps->offset;
396 ps->offset = ptr_len0;
397 prs_uint32("sid_stuff_len0", ps, depth, &sid_stuff_len);
399 ps->offset = ptr_len1;
400 prs_uint32("sid_stuff_len1", ps, depth, &sid_stuff_len);
402 ps->offset = old_len;
406 prs_uint32("status", ps, depth, &(r_u->status));
410 /*******************************************************************
411 makes a SAM_STR1 structure.
412 ********************************************************************/
413 void make_sam_str1(SAM_STR1 *sam, char *sam_acct, char *sam_name, char *sam_desc)
415 int len_sam_acct = sam_acct != NULL ? strlen(sam_acct) : 0;
416 int len_sam_name = sam_name != NULL ? strlen(sam_name) : 0;
417 int len_sam_desc = sam_desc != NULL ? strlen(sam_desc) : 0;
419 if (sam == NULL) return;
421 DEBUG(5,("make_sam_str1: %d\n", __LINE__));
423 make_unistr2(&(sam->uni_acct_name), sam_acct, len_sam_acct);
424 make_unistr2(&(sam->uni_full_name), sam_name, len_sam_name);
425 make_unistr2(&(sam->uni_acct_desc), sam_desc, len_sam_desc);
428 /*******************************************************************
429 reads or writes a SAM_STR1 structure.
430 ********************************************************************/
431 void sam_io_sam_str1(char *desc, SAM_STR1 *sam, uint32 acct_buf, uint32 name_buf, uint32 desc_buf, prs_struct *ps, int depth)
433 if (sam == NULL) return;
435 prs_debug(ps, depth, desc, "sam_io_sam_str1");
440 smb_io_unistr2("unistr2", &(sam->uni_acct_name), acct_buf, ps, depth); /* account name unicode string */
441 smb_io_unistr2("unistr2", &(sam->uni_full_name), name_buf, ps, depth); /* full name unicode string */
442 smb_io_unistr2("unistr2", &(sam->uni_acct_desc), desc_buf, ps, depth); /* account description unicode string */
445 /*******************************************************************
446 makes a SAM_ENTRY1 structure.
447 ********************************************************************/
448 void make_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx,
449 uint32 len_sam_name, uint32 len_sam_full, uint32 len_sam_desc,
450 uint32 rid_user, uint16 acb_info)
452 if (sam == NULL) return;
454 DEBUG(5,("make_sam_entry1: %d\n", __LINE__));
456 sam->user_idx = user_idx;
457 sam->rid_user = rid_user;
458 sam->acb_info = acb_info;
461 make_uni_hdr(&(sam->hdr_acct_name), len_sam_name, len_sam_name, len_sam_name != 0);
462 make_uni_hdr(&(sam->hdr_user_name), len_sam_full, len_sam_full, len_sam_full != 0);
463 make_uni_hdr(&(sam->hdr_user_desc), len_sam_desc, len_sam_desc, len_sam_desc != 0);
466 /*******************************************************************
467 reads or writes a SAM_ENTRY1 structure.
468 ********************************************************************/
469 void sam_io_sam_entry1(char *desc, SAM_ENTRY1 *sam, prs_struct *ps, int depth)
471 if (sam == NULL) return;
473 prs_debug(ps, depth, desc, "sam_io_sam_entry1");
478 prs_uint32("user_idx ", ps, depth, &(sam->user_idx ));
480 prs_uint32("rid_user ", ps, depth, &(sam->rid_user ));
481 prs_uint16("acb_info ", ps, depth, &(sam->acb_info ));
482 prs_uint16("pad ", ps, depth, &(sam->pad ));
484 smb_io_unihdr("unihdr", &(sam->hdr_acct_name), ps, depth); /* account name unicode string header */
485 smb_io_unihdr("unihdr", &(sam->hdr_user_name), ps, depth); /* account name unicode string header */
486 smb_io_unihdr("unihdr", &(sam->hdr_user_desc), ps, depth); /* account name unicode string header */
489 /*******************************************************************
490 makes a SAM_STR2 structure.
491 ********************************************************************/
492 void make_sam_str2(SAM_STR2 *sam, char *sam_acct, char *sam_desc)
494 int len_sam_acct = sam_acct != NULL ? strlen(sam_acct) : 0;
495 int len_sam_desc = sam_desc != NULL ? strlen(sam_desc) : 0;
497 if (sam == NULL) return;
499 DEBUG(5,("make_sam_str2: %d\n", __LINE__));
501 make_unistr2(&(sam->uni_srv_name), sam_acct, len_sam_acct);
502 make_unistr2(&(sam->uni_srv_desc), sam_desc, len_sam_desc);
505 /*******************************************************************
506 reads or writes a SAM_STR2 structure.
507 ********************************************************************/
508 void sam_io_sam_str2(char *desc, SAM_STR2 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth)
510 if (sam == NULL) return;
512 prs_debug(ps, depth, desc, "sam_io_sam_str2");
517 smb_io_unistr2("unistr2", &(sam->uni_srv_name), acct_buf, ps, depth); /* account name unicode string */
518 smb_io_unistr2("unistr2", &(sam->uni_srv_desc), desc_buf, ps, depth); /* account description unicode string */
521 /*******************************************************************
522 makes a SAM_ENTRY2 structure.
523 ********************************************************************/
524 void make_sam_entry2(SAM_ENTRY2 *sam, uint32 user_idx,
525 uint32 len_sam_name, uint32 len_sam_desc,
526 uint32 rid_user, uint16 acb_info)
528 if (sam == NULL) return;
530 DEBUG(5,("make_sam_entry2: %d\n", __LINE__));
532 sam->user_idx = user_idx;
533 sam->rid_user = rid_user;
534 sam->acb_info = acb_info;
537 make_uni_hdr(&(sam->hdr_srv_name), len_sam_name, len_sam_name, len_sam_name != 0);
538 make_uni_hdr(&(sam->hdr_srv_desc), len_sam_desc, len_sam_desc, len_sam_desc != 0);
541 /*******************************************************************
542 reads or writes a SAM_ENTRY2 structure.
543 ********************************************************************/
544 void sam_io_sam_entry2(char *desc, SAM_ENTRY2 *sam, prs_struct *ps, int depth)
546 if (sam == NULL) return;
548 prs_debug(ps, depth, desc, "sam_io_sam_entry2");
553 prs_uint32("user_idx ", ps, depth, &(sam->user_idx ));
555 prs_uint32("rid_user ", ps, depth, &(sam->rid_user ));
556 prs_uint16("acb_info ", ps, depth, &(sam->acb_info ));
557 prs_uint16("pad ", ps, depth, &(sam->pad ));
559 smb_io_unihdr("unihdr", &(sam->hdr_srv_name), ps, depth); /* account name unicode string header */
560 smb_io_unihdr("unihdr", &(sam->hdr_srv_desc), ps, depth); /* account name unicode string header */
563 /*******************************************************************
564 makes a SAM_STR3 structure.
565 ********************************************************************/
566 void make_sam_str3(SAM_STR3 *sam, char *grp_acct, char *grp_desc)
568 int len_grp_acct = strlen(grp_acct);
569 int len_grp_desc = strlen(grp_desc);
571 if (sam == NULL) return;
573 DEBUG(5,("make_sam_str3: %d\n", __LINE__));
575 make_unistr2(&(sam->uni_grp_name), grp_acct, len_grp_acct);
576 make_unistr2(&(sam->uni_grp_desc), grp_desc, len_grp_desc);
579 /*******************************************************************
580 reads or writes a SAM_STR3 structure.
581 ********************************************************************/
582 void sam_io_sam_str3(char *desc, SAM_STR3 *sam, uint32 acct_buf, uint32 desc_buf, prs_struct *ps, int depth)
584 if (sam == NULL) return;
586 prs_debug(ps, depth, desc, "sam_io_sam_str3");
591 smb_io_unistr2("unistr2", &(sam->uni_grp_name), acct_buf, ps, depth); /* account name unicode string */
592 smb_io_unistr2("unistr2", &(sam->uni_grp_desc), desc_buf, ps, depth); /* account description unicode string */
595 /*******************************************************************
596 makes a SAM_ENTRY3 structure.
597 ********************************************************************/
598 void make_sam_entry3(SAM_ENTRY3 *sam, uint32 grp_idx,
599 uint32 len_grp_name, uint32 len_grp_desc, uint32 rid_grp)
601 if (sam == NULL) return;
603 DEBUG(5,("make_sam_entry3: %d\n", __LINE__));
605 sam->grp_idx = grp_idx;
606 sam->rid_grp = rid_grp;
607 sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */
609 make_uni_hdr(&(sam->hdr_grp_name), len_grp_name, len_grp_name, len_grp_name != 0);
610 make_uni_hdr(&(sam->hdr_grp_desc), len_grp_desc, len_grp_desc, len_grp_desc != 0);
613 /*******************************************************************
614 reads or writes a SAM_ENTRY3 structure.
615 ********************************************************************/
616 void sam_io_sam_entry3(char *desc, SAM_ENTRY3 *sam, prs_struct *ps, int depth)
618 if (sam == NULL) return;
620 prs_debug(ps, depth, desc, "sam_io_sam_entry3");
625 prs_uint32("grp_idx", ps, depth, &(sam->grp_idx));
627 prs_uint32("rid_grp", ps, depth, &(sam->rid_grp));
628 prs_uint32("attr ", ps, depth, &(sam->attr ));
630 smb_io_unihdr("unihdr", &(sam->hdr_grp_name), ps, depth); /* account name unicode string header */
631 smb_io_unihdr("unihdr", &(sam->hdr_grp_desc), ps, depth); /* account name unicode string header */
634 /*******************************************************************
635 makes a SAM_ENTRY structure.
636 ********************************************************************/
637 void make_sam_entry(SAM_ENTRY *sam, uint32 len_sam_name, uint32 rid)
639 if (sam == NULL) return;
641 DEBUG(5,("make_sam_entry: %d\n", __LINE__));
644 make_uni_hdr(&(sam->hdr_name), len_sam_name, len_sam_name, len_sam_name != 0);
647 /*******************************************************************
648 reads or writes a SAM_ENTRY structure.
649 ********************************************************************/
650 void sam_io_sam_entry(char *desc, SAM_ENTRY *sam, prs_struct *ps, int depth)
652 if (sam == NULL) return;
654 prs_debug(ps, depth, desc, "sam_io_sam_entry");
658 prs_uint32("rid", ps, depth, &(sam->rid ));
659 smb_io_unihdr("unihdr", &(sam->hdr_name), ps, depth); /* account name unicode string header */
662 /*******************************************************************
663 makes a SAMR_Q_ENUM_DOM_USERS structure.
664 ********************************************************************/
665 void make_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS *q_e, POLICY_HND *pol,
666 uint16 req_num_entries, uint16 unk_0,
667 uint16 acb_mask, uint16 unk_1, uint32 size)
669 if (q_e == NULL || pol == NULL) return;
671 DEBUG(5,("make_q_enum_dom_users\n"));
673 memcpy(&(q_e->pol), pol, sizeof(*pol));
675 q_e->req_num_entries = req_num_entries; /* zero indicates lots */
676 q_e->unknown_0 = unk_0; /* this gets returned in the response */
677 q_e->acb_mask = acb_mask;
678 q_e->unknown_1 = unk_1;
679 q_e->max_size = size;
683 /*******************************************************************
684 reads or writes a structure.
685 ********************************************************************/
686 void samr_io_q_enum_dom_users(char *desc, SAMR_Q_ENUM_DOM_USERS *q_e, prs_struct *ps, int depth)
688 if (q_e == NULL) return;
690 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_users");
695 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
698 prs_uint16("req_num_entries", ps, depth, &(q_e->req_num_entries));
699 prs_uint16("unknown_0 ", ps, depth, &(q_e->unknown_0 ));
701 prs_uint16("acb_mask ", ps, depth, &(q_e->acb_mask ));
702 prs_uint16("unknown_1 ", ps, depth, &(q_e->unknown_1 ));
704 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
710 /*******************************************************************
711 makes a SAMR_R_ENUM_DOM_USERS structure.
712 ********************************************************************/
713 void make_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS *r_u,
714 uint16 total_num_entries, uint16 unk_0,
715 uint32 num_sam_entries, SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES], uint32 status)
719 if (r_u == NULL) return;
721 DEBUG(5,("make_samr_r_enum_dom_users\n"));
723 if (num_sam_entries >= MAX_SAM_ENTRIES)
725 num_sam_entries = MAX_SAM_ENTRIES;
726 DEBUG(5,("limiting number of entries to %d\n",
730 r_u->total_num_entries = total_num_entries;
731 r_u->unknown_0 = unk_0;
733 if (total_num_entries > 0)
735 r_u->ptr_entries1 = 1;
736 r_u->ptr_entries2 = 1;
737 r_u->num_entries2 = num_sam_entries;
738 r_u->num_entries3 = num_sam_entries;
740 ASSERT_ARRAY(r_u->sam, num_sam_entries);
741 ASSERT_ARRAY(r_u->uni_acct_name, num_sam_entries);
743 for (i = 0; i < num_sam_entries; i++)
745 make_sam_entry(&(r_u->sam[i]),
746 pass[i].uni_user_name.uni_str_len,
749 copy_unistr2(&(r_u->uni_acct_name[i]), &(pass[i].uni_user_name));
752 r_u->num_entries4 = num_sam_entries;
756 r_u->ptr_entries1 = 0;
757 r_u->num_entries2 = num_sam_entries;
758 r_u->ptr_entries2 = 1;
761 r_u->status = status;
764 /*******************************************************************
765 reads or writes a structure.
766 ********************************************************************/
767 void samr_io_r_enum_dom_users(char *desc, SAMR_R_ENUM_DOM_USERS *r_u, prs_struct *ps, int depth)
771 if (r_u == NULL) return;
773 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_users");
778 prs_uint16("total_num_entries", ps, depth, &(r_u->total_num_entries));
779 prs_uint16("unknown_0 ", ps, depth, &(r_u->unknown_0 ));
780 prs_uint32("ptr_entries1", ps, depth, &(r_u->ptr_entries1));
782 if (r_u->total_num_entries != 0 && r_u->ptr_entries1 != 0)
784 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
785 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
786 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
788 ASSERT_ARRAY(r_u->sam, r_u->num_entries2);
790 for (i = 0; i < r_u->num_entries2; i++)
793 sam_io_sam_entry("", &(r_u->sam[i]), ps, depth);
796 ASSERT_ARRAY(r_u->uni_acct_name, r_u->num_entries2);
798 for (i = 0; i < r_u->num_entries2; i++)
801 smb_io_unistr2("", &(r_u->uni_acct_name[i]), r_u->sam[i].hdr_name.buffer, ps, depth);
806 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
809 prs_uint32("status", ps, depth, &(r_u->status));
812 /*******************************************************************
813 makes a SAMR_Q_ENUM_DOM_ALIASES structure.
814 ********************************************************************/
815 void make_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES *q_e, POLICY_HND *pol, uint32 size)
817 if (q_e == NULL || pol == NULL) return;
819 DEBUG(5,("make_q_enum_dom_aliases\n"));
821 memcpy(&(q_e->pol), pol, sizeof(*pol));
824 q_e->max_size = size;
828 /*******************************************************************
829 reads or writes a structure.
830 ********************************************************************/
831 void samr_io_q_enum_dom_aliases(char *desc, SAMR_Q_ENUM_DOM_ALIASES *q_e, prs_struct *ps, int depth)
833 if (q_e == NULL) return;
835 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases");
840 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
843 prs_uint32("unknown_0", ps, depth, &(q_e->unknown_0));
844 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
850 /*******************************************************************
851 makes a SAMR_R_ENUM_DOM_ALIASES structure.
852 ********************************************************************/
853 void make_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u,
854 uint32 num_sam_entries, SAM_USER_INFO_21 grps[MAX_SAM_ENTRIES],
859 if (r_u == NULL) return;
861 DEBUG(5,("make_samr_r_enum_dom_aliases\n"));
863 if (num_sam_entries >= MAX_SAM_ENTRIES)
865 num_sam_entries = MAX_SAM_ENTRIES;
866 DEBUG(5,("limiting number of entries to %d\n",
870 r_u->num_entries = num_sam_entries;
872 if (num_sam_entries > 0)
874 r_u->ptr_entries = 1;
875 r_u->num_entries2 = num_sam_entries;
876 r_u->ptr_entries2 = 1;
877 r_u->num_entries3 = num_sam_entries;
879 ASSERT_ARRAY(r_u->sam, num_sam_entries);
881 for (i = 0; i < num_sam_entries; i++)
883 make_sam_entry(&(r_u->sam[i]),
884 grps[i].uni_user_name.uni_str_len,
887 copy_unistr2(&(r_u->uni_grp_name[i]), &(grps[i].uni_user_name));
890 r_u->num_entries4 = num_sam_entries;
894 r_u->ptr_entries = 0;
897 r_u->status = status;
900 /*******************************************************************
901 reads or writes a structure.
902 ********************************************************************/
903 void samr_io_r_enum_dom_aliases(char *desc, SAMR_R_ENUM_DOM_ALIASES *r_u, prs_struct *ps, int depth)
907 if (r_u == NULL) return;
909 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases");
914 prs_uint32("num_entries", ps, depth, &(r_u->num_entries));
915 prs_uint32("ptr_entries", ps, depth, &(r_u->ptr_entries));
917 if (r_u->num_entries != 0 && r_u->ptr_entries != 0)
919 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
920 prs_uint32("ptr_entries2", ps, depth, &(r_u->ptr_entries2));
921 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
923 ASSERT_ARRAY(r_u->sam, r_u->num_entries);
925 for (i = 0; i < r_u->num_entries; i++)
927 sam_io_sam_entry("", &(r_u->sam[i]), ps, depth);
930 for (i = 0; i < r_u->num_entries; i++)
932 smb_io_unistr2("", &(r_u->uni_grp_name[i]), r_u->sam[i].hdr_name.buffer, ps, depth);
937 prs_uint32("num_entries4", ps, depth, &(r_u->num_entries4));
940 prs_uint32("status", ps, depth, &(r_u->status));
943 /*******************************************************************
944 makes a SAMR_Q_QUERY_DISPINFO structure.
945 ********************************************************************/
946 void make_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO *q_e, POLICY_HND *pol,
947 uint16 switch_level, uint32 start_idx, uint32 size)
949 if (q_e == NULL || pol == NULL) return;
951 DEBUG(5,("make_q_query_dispinfo\n"));
953 memcpy(&(q_e->pol), pol, sizeof(*pol));
955 q_e->switch_level = switch_level;
958 q_e->start_idx = start_idx;
959 q_e->unknown_1 = 0x000007d0;
960 q_e->max_size = size;
964 /*******************************************************************
965 reads or writes a structure.
966 ********************************************************************/
967 void samr_io_q_query_dispinfo(char *desc, SAMR_Q_QUERY_DISPINFO *q_e, prs_struct *ps, int depth)
969 if (q_e == NULL) return;
971 prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo");
976 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
979 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
980 prs_uint16("unknown_0 ", ps, depth, &(q_e->unknown_0 ));
981 prs_uint32("start_idx ", ps, depth, &(q_e->start_idx ));
982 prs_uint32("unknown_1 ", ps, depth, &(q_e->unknown_1 ));
983 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
989 /*******************************************************************
990 makes a SAM_INFO_2 structure.
991 ********************************************************************/
992 void make_sam_info_2(SAM_INFO_2 *sam, uint32 acb_mask,
993 uint32 start_idx, uint32 num_sam_entries,
994 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
999 if (sam == NULL) return;
1001 DEBUG(5,("make_sam_info_2\n"));
1003 if (num_sam_entries >= MAX_SAM_ENTRIES)
1005 num_sam_entries = MAX_SAM_ENTRIES;
1006 DEBUG(5,("limiting number of entries to %d\n",
1010 for (i = start_idx, entries_added = 0; i < num_sam_entries; i++)
1012 if (IS_BITS_SET_ALL(pass[i].acb_info, acb_mask))
1014 make_sam_entry2(&(sam->sam[entries_added]),
1015 start_idx + entries_added + 1,
1016 pass[i].uni_user_name.uni_str_len,
1017 pass[i].uni_acct_desc.uni_str_len,
1021 copy_unistr2(&(sam->str[entries_added].uni_srv_name), &(pass[i].uni_user_name));
1022 copy_unistr2(&(sam->str[entries_added].uni_srv_desc), &(pass[i].uni_acct_desc));
1027 sam->num_entries = entries_added;
1028 sam->ptr_entries = 1;
1029 sam->num_entries2 = entries_added;
1033 /*******************************************************************
1034 reads or writes a structure.
1035 ********************************************************************/
1036 void sam_io_sam_info_2(char *desc, SAM_INFO_2 *sam, prs_struct *ps, int depth)
1040 if (sam == NULL) return;
1042 prs_debug(ps, depth, desc, "sam_io_sam_info_2");
1047 prs_uint32("num_entries ", ps, depth, &(sam->num_entries ));
1048 prs_uint32("ptr_entries ", ps, depth, &(sam->ptr_entries ));
1050 prs_uint32("num_entries2 ", ps, depth, &(sam->num_entries2 ));
1052 ASSERT_ARRAY(sam->sam, sam->num_entries);
1054 for (i = 0; i < sam->num_entries; i++)
1056 sam_io_sam_entry2("", &(sam->sam[i]), ps, depth);
1059 for (i = 0; i < sam->num_entries; i++)
1061 sam_io_sam_str2 ("", &(sam->str[i]),
1062 sam->sam[i].hdr_srv_name.buffer,
1063 sam->sam[i].hdr_srv_desc.buffer,
1069 /*******************************************************************
1070 makes a SAM_INFO_1 structure.
1071 ********************************************************************/
1072 void make_sam_info_1(SAM_INFO_1 *sam, uint32 acb_mask,
1073 uint32 start_idx, uint32 num_sam_entries,
1074 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES])
1079 if (sam == NULL) return;
1081 DEBUG(5,("make_sam_info_1\n"));
1083 if (num_sam_entries >= MAX_SAM_ENTRIES)
1085 num_sam_entries = MAX_SAM_ENTRIES;
1086 DEBUG(5,("limiting number of entries to %d\n",
1090 for (i = start_idx, entries_added = 0; i < num_sam_entries; i++)
1092 if (IS_BITS_SET_ALL(pass[i].acb_info, acb_mask))
1094 make_sam_entry1(&(sam->sam[entries_added]),
1095 start_idx + entries_added + 1,
1096 pass[i].uni_user_name.uni_str_len,
1097 pass[i].uni_full_name.uni_str_len,
1098 pass[i].uni_acct_desc.uni_str_len,
1102 copy_unistr2(&(sam->str[entries_added].uni_acct_name), &(pass[i].uni_user_name));
1103 copy_unistr2(&(sam->str[entries_added].uni_full_name), &(pass[i].uni_full_name));
1104 copy_unistr2(&(sam->str[entries_added].uni_acct_desc), &(pass[i].uni_acct_desc));
1110 sam->num_entries = entries_added;
1111 sam->ptr_entries = 1;
1112 sam->num_entries2 = entries_added;
1116 /*******************************************************************
1117 reads or writes a structure.
1118 ********************************************************************/
1119 void sam_io_sam_info_1(char *desc, SAM_INFO_1 *sam, prs_struct *ps, int depth)
1123 if (sam == NULL) return;
1125 prs_debug(ps, depth, desc, "sam_io_sam_info_1");
1130 prs_uint32("num_entries ", ps, depth, &(sam->num_entries ));
1131 prs_uint32("ptr_entries ", ps, depth, &(sam->ptr_entries ));
1133 prs_uint32("num_entries2 ", ps, depth, &(sam->num_entries2 ));
1135 ASSERT_ARRAY(sam->sam, sam->num_entries);
1137 for (i = 0; i < sam->num_entries; i++)
1139 sam_io_sam_entry1("", &(sam->sam[i]), ps, depth);
1142 for (i = 0; i < sam->num_entries; i++)
1144 sam_io_sam_str1 ("", &(sam->str[i]),
1145 sam->sam[i].hdr_acct_name.buffer,
1146 sam->sam[i].hdr_user_name.buffer,
1147 sam->sam[i].hdr_user_desc.buffer,
1153 /*******************************************************************
1154 makes a SAMR_R_QUERY_DISPINFO structure.
1155 ********************************************************************/
1156 void make_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO *r_u,
1157 uint16 switch_level, SAM_INFO_CTR *ctr, uint32 status)
1159 if (r_u == NULL) return;
1161 DEBUG(5,("make_samr_r_query_dispinfo\n"));
1165 r_u->unknown_0 = 0x0000001;
1166 r_u->unknown_1 = 0x0000001;
1170 r_u->unknown_0 = 0x0;
1171 r_u->unknown_1 = 0x0;
1174 r_u->switch_level = switch_level;
1176 r_u->status = status;
1180 /*******************************************************************
1181 reads or writes a structure.
1182 ********************************************************************/
1183 void samr_io_r_query_dispinfo(char *desc, SAMR_R_QUERY_DISPINFO *r_u, prs_struct *ps, int depth)
1185 if (r_u == NULL) return;
1187 prs_debug(ps, depth, desc, "samr_io_r_query_dispinfo");
1192 prs_uint32("unknown_0 ", ps, depth, &(r_u->unknown_0 ));
1193 prs_uint32("unknown_1 ", ps, depth, &(r_u->unknown_1 ));
1194 prs_uint16("switch_level ", ps, depth, &(r_u->switch_level ));
1198 switch (r_u->switch_level)
1202 sam_io_sam_info_1("users", r_u->ctr->sam.info1, ps, depth);
1207 sam_io_sam_info_2("servers", r_u->ctr->sam.info2, ps, depth);
1212 DEBUG(5,("samr_io_r_query_dispinfo: unknown switch value\n"));
1217 prs_uint32("status", ps, depth, &(r_u->status));
1221 /*******************************************************************
1222 makes a SAMR_Q_ENUM_DOM_GROUPS structure.
1223 ********************************************************************/
1224 void make_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS *q_e, POLICY_HND *pol,
1225 uint16 switch_level, uint32 start_idx, uint32 size)
1227 if (q_e == NULL || pol == NULL) return;
1229 DEBUG(5,("make_q_enum_dom_groups\n"));
1231 memcpy(&(q_e->pol), pol, sizeof(*pol));
1233 q_e->switch_level = switch_level;
1236 q_e->start_idx = start_idx;
1237 q_e->unknown_1 = 0x000007d0;
1238 q_e->max_size = size;
1242 /*******************************************************************
1243 reads or writes a structure.
1244 ********************************************************************/
1245 void samr_io_q_enum_dom_groups(char *desc, SAMR_Q_ENUM_DOM_GROUPS *q_e, prs_struct *ps, int depth)
1247 if (q_e == NULL) return;
1249 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups");
1254 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
1257 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
1258 prs_uint16("unknown_0 ", ps, depth, &(q_e->unknown_0 ));
1259 prs_uint32("start_idx ", ps, depth, &(q_e->start_idx ));
1260 prs_uint32("unknown_1 ", ps, depth, &(q_e->unknown_1 ));
1261 prs_uint32("max_size ", ps, depth, &(q_e->max_size ));
1267 /*******************************************************************
1268 makes a SAMR_R_ENUM_DOM_GROUPS structure.
1269 ********************************************************************/
1270 void make_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS *r_u,
1271 uint32 start_idx, uint32 num_sam_entries,
1272 SAM_USER_INFO_21 pass[MAX_SAM_ENTRIES],
1278 if (r_u == NULL) return;
1280 DEBUG(5,("make_samr_r_enum_dom_groups\n"));
1282 if (num_sam_entries >= MAX_SAM_ENTRIES)
1284 num_sam_entries = MAX_SAM_ENTRIES;
1285 DEBUG(5,("limiting number of entries to %d\n",
1291 for (i = start_idx, entries_added = 0; i < num_sam_entries; i++)
1293 make_sam_entry3(&(r_u->sam[entries_added]),
1294 start_idx + entries_added + 1,
1295 pass[i].uni_user_name.uni_str_len,
1296 pass[i].uni_acct_desc.uni_str_len,
1299 copy_unistr2(&(r_u->str[entries_added].uni_grp_name), &(pass[i].uni_user_name));
1300 copy_unistr2(&(r_u->str[entries_added].uni_grp_desc), &(pass[i].uni_acct_desc));
1305 if (entries_added > 0)
1307 r_u->unknown_0 = 0x0000492;
1308 r_u->unknown_1 = 0x000049a;
1312 r_u->unknown_0 = 0x0;
1313 r_u->unknown_1 = 0x0;
1315 r_u->switch_level = 3;
1316 r_u->num_entries = entries_added;
1317 r_u->ptr_entries = 1;
1318 r_u->num_entries2 = entries_added;
1322 r_u->switch_level = 0;
1325 r_u->status = status;
1328 /*******************************************************************
1329 reads or writes a structure.
1330 ********************************************************************/
1331 void samr_io_r_enum_dom_groups(char *desc, SAMR_R_ENUM_DOM_GROUPS *r_u, prs_struct *ps, int depth)
1335 if (r_u == NULL) return;
1337 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups");
1342 prs_uint32("unknown_0 ", ps, depth, &(r_u->unknown_0 ));
1343 prs_uint32("unknown_1 ", ps, depth, &(r_u->unknown_1 ));
1344 prs_uint32("switch_level ", ps, depth, &(r_u->switch_level ));
1346 if (r_u->switch_level != 0)
1348 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries ));
1349 prs_uint32("ptr_entries ", ps, depth, &(r_u->ptr_entries ));
1351 prs_uint32("num_entries2 ", ps, depth, &(r_u->num_entries2 ));
1353 ASSERT_ARRAY(r_u->sam, r_u->num_entries);
1355 for (i = 0; i < r_u->num_entries; i++)
1357 sam_io_sam_entry3("", &(r_u->sam[i]), ps, depth);
1360 for (i = 0; i < r_u->num_entries; i++)
1362 sam_io_sam_str3 ("", &(r_u->str[i]),
1363 r_u->sam[i].hdr_grp_name.buffer,
1364 r_u->sam[i].hdr_grp_desc.buffer,
1369 prs_uint32("status", ps, depth, &(r_u->status));
1373 /*******************************************************************
1374 makes a SAMR_Q_QUERY_ALIASINFO structure.
1375 ********************************************************************/
1376 void make_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO *q_e,
1378 uint16 switch_level)
1380 if (q_e == NULL || pol == NULL) return;
1382 DEBUG(5,("make_q_query_aliasinfo\n"));
1384 memcpy(&(q_e->pol), pol, sizeof(*pol));
1386 q_e->switch_level = switch_level;
1390 /*******************************************************************
1391 reads or writes a structure.
1392 ********************************************************************/
1393 void samr_io_q_query_aliasinfo(char *desc, SAMR_Q_QUERY_ALIASINFO *q_e, prs_struct *ps, int depth)
1395 if (q_e == NULL) return;
1397 prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo");
1402 smb_io_pol_hnd("pol", &(q_e->pol), ps, depth);
1405 prs_uint16("switch_level", ps, depth, &(q_e->switch_level));
1409 /*******************************************************************
1410 makes a SAMR_R_QUERY_ALIASINFO structure.
1411 ********************************************************************/
1412 void make_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *r_u,
1413 uint16 switch_value, char *acct_desc,
1416 if (r_u == NULL) return;
1418 DEBUG(5,("make_samr_r_query_aliasinfo\n"));
1424 r_u->switch_value = switch_value;
1426 switch (switch_value)
1430 int acct_len = acct_desc ? strlen(acct_desc) : 0;
1434 make_uni_hdr(&(r_u->alias.info3.hdr_acct_desc), acct_len , acct_len, acct_desc ? 1 : 0);
1435 make_unistr2(&(r_u->alias.info3.uni_acct_desc), acct_desc, acct_len);
1442 DEBUG(4,("make_samr_r_query_aliasinfo: unsupported switch level\n"));
1448 r_u->status = status;
1452 /*******************************************************************
1453 reads or writes a structure.
1454 ********************************************************************/
1455 void samr_io_r_query_aliasinfo(char *desc, SAMR_R_QUERY_ALIASINFO *r_u, prs_struct *ps, int depth)
1457 if (r_u == NULL) return;
1459 prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo");
1464 prs_uint32("ptr ", ps, depth, &(r_u->ptr ));
1468 prs_uint16("switch_value", ps, depth, &(r_u->switch_value));
1471 if (r_u->switch_value != 0)
1473 switch (r_u->switch_value)
1477 smb_io_unihdr ("", &(r_u->alias.info3.hdr_acct_desc), ps, depth);
1478 smb_io_unistr2("", &(r_u->alias.info3.uni_acct_desc), r_u->alias.info3.hdr_acct_desc.buffer, ps, depth);
1483 DEBUG(4,("samr_io_r_query_aliasinfo: unsupported switch level\n"));
1492 prs_uint32("status", ps, depth, &(r_u->status));
1495 /*******************************************************************
1496 reads or writes a SAMR_Q_LOOKUP_IDS structure.
1497 ********************************************************************/
1498 void samr_io_q_lookup_ids(char *desc, SAMR_Q_LOOKUP_IDS *q_u, prs_struct *ps, int depth)
1503 if (q_u == NULL) return;
1505 prs_debug(ps, depth, desc, "samr_io_q_lookup_ids");
1510 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1513 prs_uint32("num_sids1", ps, depth, &(q_u->num_sids1));
1514 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
1515 prs_uint32("num_sids2", ps, depth, &(q_u->num_sids2));
1517 ASSERT_ARRAY(q_u->ptr_sid, q_u->num_sids2);
1519 for (i = 0; i < q_u->num_sids2; i++)
1521 slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i);
1522 prs_uint32(tmp, ps, depth, &(q_u->ptr_sid[i]));
1525 for (i = 0; i < q_u->num_sids2; i++)
1527 if (q_u->ptr_sid[i] != 0)
1529 slprintf(tmp, sizeof(tmp)-1, "sid[%02d]", i);
1530 smb_io_dom_sid2(tmp, &(q_u->sid[i]), ps, depth);
1538 /*******************************************************************
1539 makes a SAMR_R_LOOKUP_IDS structure.
1540 ********************************************************************/
1541 void make_samr_r_lookup_ids(SAMR_R_LOOKUP_IDS *r_u,
1542 uint32 num_rids, uint32 *rid, uint32 status)
1545 if (r_u == NULL) return;
1547 DEBUG(5,("make_samr_r_lookup_ids\n"));
1551 r_u->num_entries = num_rids;
1553 r_u->num_entries2 = num_rids;
1555 ASSERT_ARRAY(r_u->rid, num_rids);
1557 for (i = 0; i < num_rids; i++)
1559 r_u->rid[i] = rid[i];
1564 r_u->num_entries = 0;
1566 r_u->num_entries2 = 0;
1569 r_u->status = status;
1572 /*******************************************************************
1573 reads or writes a structure.
1574 ********************************************************************/
1575 void samr_io_r_lookup_ids(char *desc, SAMR_R_LOOKUP_IDS *r_u, prs_struct *ps, int depth)
1579 if (r_u == NULL) return;
1581 prs_debug(ps, depth, desc, "samr_io_r_lookup_ids");
1586 prs_uint32("num_entries", ps, depth, &(r_u->num_entries));
1587 prs_uint32("ptr ", ps, depth, &(r_u->ptr ));
1588 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
1590 if (r_u->num_entries != 0)
1592 ASSERT_ARRAY(r_u->rid, r_u->num_entries2);
1594 for (i = 0; i < r_u->num_entries2; i++)
1596 slprintf(tmp, sizeof(tmp)-1, "rid[%02d]", i);
1597 prs_uint32(tmp, ps, depth, &(r_u->rid[i]));
1601 prs_uint32("status", ps, depth, &(r_u->status));
1604 /*******************************************************************
1605 reads or writes a structure.
1606 ********************************************************************/
1607 void samr_io_q_lookup_names(char *desc, SAMR_Q_LOOKUP_NAMES *q_u, prs_struct *ps, int depth)
1611 if (q_u == NULL) return;
1613 prs_debug(ps, depth, desc, "samr_io_q_lookup_names");
1618 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1621 prs_uint32("num_rids1", ps, depth, &(q_u->num_rids1));
1622 prs_uint32("rid ", ps, depth, &(q_u->rid ));
1623 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
1624 prs_uint32("num_rids2", ps, depth, &(q_u->num_rids2));
1626 ASSERT_ARRAY(q_u->hdr_user_name, q_u->num_rids2);
1628 for (i = 0; i < q_u->num_rids2; i++)
1630 smb_io_unihdr ("", &(q_u->hdr_user_name[i]), ps, depth);
1632 for (i = 0; i < q_u->num_rids2; i++)
1634 smb_io_unistr2("", &(q_u->uni_user_name[i]), q_u->hdr_user_name[i].buffer, ps, depth);
1641 /*******************************************************************
1642 makes a SAMR_R_LOOKUP_NAMES structure.
1643 ********************************************************************/
1644 void make_samr_r_lookup_names(SAMR_R_LOOKUP_NAMES *r_u,
1645 uint32 num_rids, uint32 *rid, uint32 status)
1648 if (r_u == NULL) return;
1650 DEBUG(5,("make_samr_r_lookup_names\n"));
1654 r_u->num_entries = num_rids;
1655 r_u->undoc_buffer = 1;
1656 r_u->num_entries2 = num_rids;
1658 ASSERT_ARRAY(r_u->dom_rid, num_rids);
1660 for (i = 0; i < num_rids; i++)
1662 make_dom_rid3(&(r_u->dom_rid[i]), rid[i]);
1665 r_u->num_entries3 = num_rids;
1669 r_u->num_entries = 0;
1670 r_u->undoc_buffer = 0;
1671 r_u->num_entries2 = 0;
1672 r_u->num_entries3 = 0;
1675 r_u->status = status;
1678 /*******************************************************************
1679 reads or writes a structure.
1680 ********************************************************************/
1681 void samr_io_r_lookup_names(char *desc, SAMR_R_LOOKUP_NAMES *r_u, prs_struct *ps, int depth)
1684 if (r_u == NULL) return;
1686 prs_debug(ps, depth, desc, "samr_io_r_lookup_names");
1691 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries ));
1692 prs_uint32("undoc_buffer", ps, depth, &(r_u->undoc_buffer));
1693 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
1695 if (r_u->num_entries != 0)
1697 ASSERT_ARRAY(r_u->dom_rid, r_u->num_entries2);
1699 for (i = 0; i < r_u->num_entries2; i++)
1701 smb_io_dom_rid3("", &(r_u->dom_rid[i]), ps, depth);
1706 prs_uint32("num_entries3", ps, depth, &(r_u->num_entries3));
1708 prs_uint32("status", ps, depth, &(r_u->status));
1711 /*******************************************************************
1712 makes a SAMR_Q_UNKNOWN_12 structure.
1713 ********************************************************************/
1714 void make_samr_q_unknown_12(SAMR_Q_UNKNOWN_12 *q_u,
1715 POLICY_HND *pol, uint32 rid,
1716 uint32 num_gids, uint32 *gid)
1719 if (q_u == NULL) return;
1721 DEBUG(5,("make_samr_r_unknwon_12\n"));
1723 memcpy(&(q_u->pol), pol, sizeof(*pol));
1725 q_u->num_gids1 = num_gids;
1728 q_u->num_gids2 = num_gids;
1730 ASSERT_ARRAY(q_u->gid, num_gids);
1732 for (i = 0; i < num_gids; i++)
1734 q_u->gid[i] = gid[i];
1738 /*******************************************************************
1739 reads or writes a structure.
1740 ********************************************************************/
1741 void samr_io_q_unknown_12(char *desc, SAMR_Q_UNKNOWN_12 *q_u, prs_struct *ps, int depth)
1746 if (q_u == NULL) return;
1748 prs_debug(ps, depth, desc, "samr_io_q_unknown_12");
1753 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1756 prs_uint32("num_gids1", ps, depth, &(q_u->num_gids1));
1757 prs_uint32("rid ", ps, depth, &(q_u->rid ));
1758 prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
1759 prs_uint32("num_gids2", ps, depth, &(q_u->num_gids2));
1761 ASSERT_ARRAY(q_u->gid, q_u->num_gids2);
1763 for (i = 0; i < q_u->num_gids2; i++)
1765 slprintf(tmp, sizeof(tmp) - 1, "gid[%02d] ", i);
1766 prs_uint32(tmp, ps, depth, &(q_u->gid[i]));
1773 /*******************************************************************
1774 makes a SAMR_R_UNKNOWN_12 structure.
1775 ********************************************************************/
1776 void make_samr_r_unknown_12(SAMR_R_UNKNOWN_12 *r_u,
1777 uint32 num_aliases, fstring *als_name, uint32 *num_als_usrs,
1781 if (r_u == NULL || als_name == NULL || num_als_usrs == NULL) return;
1783 DEBUG(5,("make_samr_r_unknown_12\n"));
1787 r_u->num_aliases1 = num_aliases;
1788 r_u->ptr_aliases = 1;
1789 r_u->num_aliases2 = num_aliases;
1791 r_u->num_als_usrs1 = num_aliases;
1792 r_u->ptr_als_usrs = 1;
1793 r_u->num_als_usrs2 = num_aliases;
1795 ASSERT_ARRAY(r_u->hdr_als_name, num_aliases);
1797 for (i = 0; i < num_aliases; i++)
1799 int als_len = als_name[i] != NULL ? strlen(als_name[i]) : 0;
1800 make_uni_hdr(&(r_u->hdr_als_name[i]), als_len , als_len, als_name[i] ? 1 : 0);
1801 make_unistr2(&(r_u->uni_als_name[i]), als_name[i], als_len);
1802 r_u->num_als_usrs[i] = num_als_usrs[i];
1807 r_u->num_aliases1 = num_aliases;
1808 r_u->ptr_aliases = 0;
1809 r_u->num_aliases2 = num_aliases;
1811 r_u->num_als_usrs1 = num_aliases;
1812 r_u->ptr_als_usrs = 0;
1813 r_u->num_als_usrs2 = num_aliases;
1816 r_u->status = status;
1819 /*******************************************************************
1820 reads or writes a structure.
1821 ********************************************************************/
1822 void samr_io_r_unknown_12(char *desc, SAMR_R_UNKNOWN_12 *r_u, prs_struct *ps, int depth)
1826 if (r_u == NULL) return;
1828 prs_debug(ps, depth, desc, "samr_io_r_unknown_12");
1833 prs_uint32("num_aliases1", ps, depth, &(r_u->num_aliases1));
1834 prs_uint32("ptr_aliases ", ps, depth, &(r_u->ptr_aliases ));
1835 prs_uint32("num_aliases2", ps, depth, &(r_u->num_aliases2));
1837 if (r_u->ptr_aliases != 0 && r_u->num_aliases1 != 0)
1839 ASSERT_ARRAY(r_u->hdr_als_name, r_u->num_aliases2);
1841 for (i = 0; i < r_u->num_aliases2; i++)
1843 slprintf(tmp, sizeof(tmp) - 1, "als_hdr[%02d] ", i);
1844 smb_io_unihdr ("", &(r_u->hdr_als_name[i]), ps, depth);
1846 for (i = 0; i < r_u->num_aliases2; i++)
1848 slprintf(tmp, sizeof(tmp) - 1, "als_str[%02d] ", i);
1849 smb_io_unistr2("", &(r_u->uni_als_name[i]), r_u->hdr_als_name[i].buffer, ps, depth);
1855 prs_uint32("num_als_usrs1", ps, depth, &(r_u->num_als_usrs1));
1856 prs_uint32("ptr_als_usrs ", ps, depth, &(r_u->ptr_als_usrs ));
1857 prs_uint32("num_als_usrs2", ps, depth, &(r_u->num_als_usrs2));
1859 if (r_u->ptr_als_usrs != 0 && r_u->num_als_usrs1 != 0)
1861 ASSERT_ARRAY(r_u->num_als_usrs, r_u->num_als_usrs2);
1863 for (i = 0; i < r_u->num_als_usrs2; i++)
1865 slprintf(tmp, sizeof(tmp) - 1, "als_usrs[%02d] ", i);
1866 prs_uint32(tmp, ps, depth, &(r_u->num_als_usrs[i]));
1870 prs_uint32("status", ps, depth, &(r_u->status));
1873 /*******************************************************************
1874 reads or writes a structure.
1875 ********************************************************************/
1876 void make_samr_q_open_user(SAMR_Q_OPEN_USER *q_u,
1878 uint32 unk_0, uint32 rid)
1880 if (q_u == NULL) return;
1882 DEBUG(5,("samr_make_q_open_user\n"));
1884 memcpy(&q_u->domain_pol, pol, sizeof(q_u->domain_pol));
1886 q_u->unknown_0 = unk_0;
1887 q_u->user_rid = rid;
1891 /*******************************************************************
1892 reads or writes a structure.
1893 ********************************************************************/
1894 void samr_io_q_open_user(char *desc, SAMR_Q_OPEN_USER *q_u, prs_struct *ps, int depth)
1896 if (q_u == NULL) return;
1898 prs_debug(ps, depth, desc, "samr_io_q_open_user");
1903 smb_io_pol_hnd("domain_pol", &(q_u->domain_pol), ps, depth);
1906 prs_uint32("unknown_0", ps, depth, &(q_u->unknown_0));
1907 prs_uint32("user_rid ", ps, depth, &(q_u->user_rid ));
1912 /*******************************************************************
1913 reads or writes a structure.
1914 ********************************************************************/
1915 void samr_io_r_open_user(char *desc, SAMR_R_OPEN_USER *r_u, prs_struct *ps, int depth)
1917 if (r_u == NULL) return;
1919 prs_debug(ps, depth, desc, "samr_io_r_open_user");
1924 smb_io_pol_hnd("user_pol", &(r_u->user_pol), ps, depth);
1927 prs_uint32("status", ps, depth, &(r_u->status));
1931 /*******************************************************************
1932 makes a SAMR_Q_QUERY_USERGROUPS structure.
1933 ********************************************************************/
1934 void make_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u,
1937 if (q_u == NULL || hnd == NULL) return;
1939 DEBUG(5,("make_samr_q_query_usergroups\n"));
1941 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
1944 /*******************************************************************
1945 reads or writes a structure.
1946 ********************************************************************/
1947 void samr_io_q_query_usergroups(char *desc, SAMR_Q_QUERY_USERGROUPS *q_u, prs_struct *ps, int depth)
1949 if (q_u == NULL) return;
1951 prs_debug(ps, depth, desc, "samr_io_q_query_usergroups");
1956 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
1960 /*******************************************************************
1961 makes a SAMR_R_QUERY_USERGROUPS structure.
1962 ********************************************************************/
1963 void make_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS *r_u,
1964 uint32 num_gids, DOM_GID *gid, uint32 status)
1966 if (r_u == NULL) return;
1968 DEBUG(5,("make_samr_r_query_usergroups\n"));
1973 r_u->num_entries = num_gids;
1975 r_u->num_entries2 = num_gids;
1981 for (i = 0; i < num_gids && i < LSA_MAX_GROUPS; i++)
1983 r_u->gid[i].g_rid = gid[i].g_rid;
1984 r_u->gid[i].attr = gid[i].attr ;
1992 r_u->num_entries = 0;
1996 r_u->status = status;
1999 /*******************************************************************
2000 reads or writes a structure.
2001 ********************************************************************/
2002 void samr_io_r_query_usergroups(char *desc, SAMR_R_QUERY_USERGROUPS *r_u, prs_struct *ps, int depth)
2005 if (r_u == NULL) return;
2007 prs_debug(ps, depth, desc, "samr_io_r_query_usergroups");
2012 prs_uint32("ptr_0 ", ps, depth, &(r_u->ptr_0 ));
2014 if (r_u->ptr_0 != 0)
2016 prs_uint32("num_entries ", ps, depth, &(r_u->num_entries));
2017 prs_uint32("ptr_1 ", ps, depth, &(r_u->ptr_1 ));
2019 if (r_u->num_entries != 0)
2021 prs_uint32("num_entries2", ps, depth, &(r_u->num_entries2));
2023 ASSERT_ARRAY(r_u->gid, r_u->num_entries2);
2025 for (i = 0; i < r_u->num_entries2; i++)
2027 smb_io_gid("", &(r_u->gid[i]), ps, depth);
2031 prs_uint32("status", ps, depth, &(r_u->status));
2034 /*******************************************************************
2035 makes a SAMR_Q_QUERY_USERINFO structure.
2036 ********************************************************************/
2037 void make_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO *q_u,
2038 POLICY_HND *hnd, uint16 switch_value)
2040 if (q_u == NULL || hnd == NULL) return;
2042 DEBUG(5,("make_samr_q_query_userinfo\n"));
2044 memcpy(&(q_u->pol), hnd, sizeof(q_u->pol));
2045 q_u->switch_value = switch_value;
2048 /*******************************************************************
2049 reads or writes a structure.
2050 ********************************************************************/
2051 void samr_io_q_query_userinfo(char *desc, SAMR_Q_QUERY_USERINFO *q_u, prs_struct *ps, int depth)
2053 if (q_u == NULL) return;
2055 prs_debug(ps, depth, desc, "samr_io_q_query_userinfo");
2060 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
2063 prs_uint16("switch_value", ps, depth, &(q_u->switch_value)); /* 0x0015 or 0x0011 */
2068 /*******************************************************************
2069 reads or writes a LOGON_HRS structure.
2070 ********************************************************************/
2071 void sam_io_logon_hrs(char *desc, LOGON_HRS *hrs, prs_struct *ps, int depth)
2073 if (hrs == NULL) return;
2075 prs_debug(ps, depth, desc, "sam_io_logon_hrs");
2080 prs_uint32 ( "len ", ps, depth, &(hrs->len ));
2084 DEBUG(5,("sam_io_logon_hrs: truncating length\n"));
2088 prs_uint8s (False, "hours", ps, depth, hrs->hours, hrs->len);
2091 /*******************************************************************
2092 makes a SAM_USER_INFO_11 structure.
2093 ********************************************************************/
2094 void make_sam_user_info11(SAM_USER_INFO_11 *usr,
2103 if (usr == NULL || expiry == NULL || mach_acct == NULL) return;
2105 DEBUG(5,("make_samr_r_unknown_24\n"));
2107 len_mach_acct = strlen(mach_acct);
2109 memcpy(&(usr->expiry),expiry, sizeof(usr->expiry)); /* expiry time or something? */
2110 bzero(usr->padding_1, sizeof(usr->padding_1)); /* 0 - padding 24 bytes */
2112 make_uni_hdr(&(usr->hdr_mach_acct), len_mach_acct, len_mach_acct, 4); /* unicode header for machine account */
2113 usr->padding_2 = 0; /* 0 - padding 4 bytes */
2115 usr->ptr_1 = 1; /* pointer */
2116 bzero(usr->padding_3, sizeof(usr->padding_3)); /* 0 - padding 32 bytes */
2117 usr->padding_4 = 0; /* 0 - padding 4 bytes */
2119 usr->ptr_2 = 1; /* pointer */
2120 usr->padding_5 = 0; /* 0 - padding 4 bytes */
2122 usr->ptr_3 = 1; /* pointer */
2123 bzero(usr->padding_6, sizeof(usr->padding_6)); /* 0 - padding 32 bytes */
2125 usr->rid_user = rid_user;
2126 usr->rid_group = rid_group;
2128 usr->acct_ctrl = acct_ctrl;
2129 usr->unknown_3 = 0x0000;
2131 usr->unknown_4 = 0x003f; /* 0x003f - 16 bit unknown */
2132 usr->unknown_5 = 0x003c; /* 0x003c - 16 bit unknown */
2134 bzero(usr->padding_7, sizeof(usr->padding_7)); /* 0 - padding 16 bytes */
2135 usr->padding_8 = 0; /* 0 - padding 4 bytes */
2137 make_unistr2(&(usr->uni_mach_acct), mach_acct, len_mach_acct); /* unicode string for machine account */
2139 bzero(usr->padding_9, sizeof(usr->padding_9)); /* 0 - padding 48 bytes */
2142 /*******************************************************************
2143 reads or writes a structure.
2144 ********************************************************************/
2145 void sam_io_user_info11(char *desc, SAM_USER_INFO_11 *usr, prs_struct *ps, int depth)
2147 if (usr == NULL) return;
2149 prs_debug(ps, depth, desc, "samr_io_r_unknown_24");
2154 prs_uint8s (False, "padding_0", ps, depth, usr->padding_0, sizeof(usr->padding_0));
2156 smb_io_time("time", &(usr->expiry), ps, depth);
2158 prs_uint8s (False, "padding_1", ps, depth, usr->padding_1, sizeof(usr->padding_1));
2160 smb_io_unihdr ("unihdr", &(usr->hdr_mach_acct), ps, depth);
2161 prs_uint32( "padding_2", ps, depth, &(usr->padding_2));
2163 prs_uint32( "ptr_1 ", ps, depth, &(usr->ptr_1 ));
2164 prs_uint8s (False, "padding_3", ps, depth, usr->padding_3, sizeof(usr->padding_3));
2165 prs_uint32( "padding_4", ps, depth, &(usr->padding_4));
2167 prs_uint32( "ptr_2 ", ps, depth, &(usr->ptr_2 ));
2168 prs_uint32( "padding_5", ps, depth, &(usr->padding_5));
2170 prs_uint32( "ptr_3 ", ps, depth, &(usr->ptr_3 ));
2171 prs_uint8s (False, "padding_6", ps, depth, usr->padding_6, sizeof(usr->padding_6));
2173 prs_uint32( "rid_user ", ps, depth, &(usr->rid_user ));
2174 prs_uint32( "rid_group", ps, depth, &(usr->rid_group));
2175 prs_uint16( "acct_ctrl", ps, depth, &(usr->acct_ctrl));
2176 prs_uint16( "unknown_3", ps, depth, &(usr->unknown_3));
2177 prs_uint16( "unknown_4", ps, depth, &(usr->unknown_4));
2178 prs_uint16( "unknown_5", ps, depth, &(usr->unknown_5));
2180 prs_uint8s (False, "padding_7", ps, depth, usr->padding_7, sizeof(usr->padding_7));
2181 prs_uint32( "padding_8", ps, depth, &(usr->padding_8));
2183 smb_io_unistr2("unistr2", &(usr->uni_mach_acct), True, ps, depth);
2186 prs_uint8s (False, "padding_9", ps, depth, usr->padding_9, sizeof(usr->padding_9));
2189 /*************************************************************************
2190 make_sam_user_info21
2192 unknown_3 = 0x00ff ffff
2193 unknown_5 = 0x0002 0000
2194 unknown_6 = 0x0000 04ec
2196 *************************************************************************/
2197 void make_sam_user_info21(SAM_USER_INFO_21 *usr,
2200 NTTIME *logoff_time,
2201 NTTIME *kickoff_time,
2202 NTTIME *pass_last_set_time,
2203 NTTIME *pass_can_change_time,
2204 NTTIME *pass_must_change_time,
2227 int len_user_name = user_name != NULL ? strlen(user_name ) : 0;
2228 int len_full_name = full_name != NULL ? strlen(full_name ) : 0;
2229 int len_home_dir = home_dir != NULL ? strlen(home_dir ) : 0;
2230 int len_dir_drive = dir_drive != NULL ? strlen(dir_drive ) : 0;
2231 int len_logon_script = logon_script != NULL ? strlen(logon_script) : 0;
2232 int len_profile_path = profile_path != NULL ? strlen(profile_path) : 0;
2233 int len_description = description != NULL ? strlen(description ) : 0;
2234 int len_workstations = workstations != NULL ? strlen(workstations) : 0;
2235 int len_unknown_str = unknown_str != NULL ? strlen(unknown_str ) : 0;
2236 int len_munged_dial = munged_dial != NULL ? strlen(munged_dial ) : 0;
2238 usr->logon_time = *logon_time;
2239 usr->logoff_time = *logoff_time;
2240 usr->kickoff_time = *kickoff_time;
2241 usr->pass_last_set_time = *pass_last_set_time;
2242 usr->pass_can_change_time = *pass_can_change_time;
2243 usr->pass_must_change_time = *pass_must_change_time;
2245 make_uni_hdr(&(usr->hdr_user_name ), len_user_name , len_user_name , len_user_name != 0);
2246 make_uni_hdr(&(usr->hdr_full_name ), len_full_name , len_full_name , len_full_name != 0);
2247 make_uni_hdr(&(usr->hdr_home_dir ), len_home_dir , len_home_dir , len_home_dir != 0);
2248 make_uni_hdr(&(usr->hdr_dir_drive ), len_dir_drive , len_dir_drive , len_dir_drive != 0);
2249 make_uni_hdr(&(usr->hdr_logon_script), len_logon_script, len_logon_script, len_logon_script != 0);
2250 make_uni_hdr(&(usr->hdr_profile_path), len_profile_path, len_profile_path, len_profile_path != 0);
2251 make_uni_hdr(&(usr->hdr_acct_desc ), len_description , len_description , len_description != 0);
2252 make_uni_hdr(&(usr->hdr_workstations), len_workstations, len_workstations, len_workstations != 0);
2253 make_uni_hdr(&(usr->hdr_unknown_str ), len_unknown_str , len_unknown_str , len_workstations != 0);
2254 make_uni_hdr(&(usr->hdr_munged_dial ), len_munged_dial , len_munged_dial , len_workstations != 0);
2256 bzero(usr->nt_pwd, sizeof(usr->nt_pwd));
2257 bzero(usr->lm_pwd, sizeof(usr->lm_pwd));
2259 usr->user_rid = user_rid;
2260 usr->group_rid = group_rid;
2261 usr->acb_info = acb_info;
2262 usr->unknown_3 = unknown_3; /* 0x00ff ffff */
2264 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
2265 usr->ptr_logon_hrs = hrs ? 1 : 0;
2266 usr->unknown_5 = unknown_5; /* 0x0002 0000 */
2268 bzero(usr->padding1, sizeof(usr->padding1));
2270 make_unistr2(&(usr->uni_user_name ), user_name , len_user_name );
2271 make_unistr2(&(usr->uni_full_name ), full_name , len_full_name );
2272 make_unistr2(&(usr->uni_home_dir ), home_dir , len_home_dir );
2273 make_unistr2(&(usr->uni_dir_drive ), dir_drive , len_dir_drive );
2274 make_unistr2(&(usr->uni_logon_script), logon_script, len_logon_script);
2275 make_unistr2(&(usr->uni_profile_path), profile_path, len_profile_path);
2276 make_unistr2(&(usr->uni_acct_desc ), description , len_description );
2277 make_unistr2(&(usr->uni_workstations), workstations, len_workstations);
2278 make_unistr2(&(usr->uni_unknown_str ), unknown_str , len_unknown_str );
2279 make_unistr2(&(usr->uni_munged_dial ), munged_dial , len_munged_dial );
2281 usr->unknown_6 = unknown_6; /* 0x0000 04ec */
2286 memcpy(&(usr->logon_hrs), hrs, sizeof(usr->logon_hrs));
2290 memset(&(usr->logon_hrs), 0xff, sizeof(usr->logon_hrs));
2295 /*******************************************************************
2296 reads or writes a structure.
2297 ********************************************************************/
2298 void sam_io_user_info21(char *desc, SAM_USER_INFO_21 *usr, prs_struct *ps, int depth)
2300 if (usr == NULL) return;
2302 prs_debug(ps, depth, desc, "lsa_io_user_info");
2307 smb_io_time("logon_time ", &(usr->logon_time) , ps, depth);
2308 smb_io_time("logoff_time ", &(usr->logoff_time) , ps, depth);
2309 smb_io_time("kickoff_time ", &(usr->kickoff_time) , ps, depth);
2310 smb_io_time("pass_last_set_time ", &(usr->pass_last_set_time) , ps, depth);
2311 smb_io_time("pass_can_change_time ", &(usr->pass_can_change_time) , ps, depth);
2312 smb_io_time("pass_must_change_time", &(usr->pass_must_change_time), ps, depth);
2314 smb_io_unihdr("hdr_user_name ", &(usr->hdr_user_name) , ps, depth); /* username unicode string header */
2315 smb_io_unihdr("hdr_full_name ", &(usr->hdr_full_name) , ps, depth); /* user's full name unicode string header */
2316 smb_io_unihdr("hdr_home_dir ", &(usr->hdr_home_dir) , ps, depth); /* home directory unicode string header */
2317 smb_io_unihdr("hdr_dir_drive ", &(usr->hdr_dir_drive) , ps, depth); /* home directory drive */
2318 smb_io_unihdr("hdr_logon_script", &(usr->hdr_logon_script), ps, depth); /* logon script unicode string header */
2319 smb_io_unihdr("hdr_profile_path", &(usr->hdr_profile_path), ps, depth); /* profile path unicode string header */
2320 smb_io_unihdr("hdr_acct_desc ", &(usr->hdr_acct_desc ) , ps, depth); /* account description */
2321 smb_io_unihdr("hdr_workstations", &(usr->hdr_workstations), ps, depth); /* workstations user can log on from */
2322 smb_io_unihdr("hdr_unknown_str ", &(usr->hdr_unknown_str ), ps, depth); /* unknown string */
2323 smb_io_unihdr("hdr_munged_dial ", &(usr->hdr_munged_dial ), ps, depth); /* workstations user can log on from */
2325 prs_uint8s (False, "lm_pwd ", ps, depth, usr->lm_pwd , sizeof(usr->lm_pwd ));
2326 prs_uint8s (False, "nt_pwd ", ps, depth, usr->nt_pwd , sizeof(usr->nt_pwd ));
2328 prs_uint32("user_rid ", ps, depth, &(usr->user_rid )); /* User ID */
2329 prs_uint32("group_rid ", ps, depth, &(usr->group_rid )); /* Group ID */
2330 prs_uint16("acb_info ", ps, depth, &(usr->acb_info )); /* Group ID */
2333 prs_uint32("unknown_3 ", ps, depth, &(usr->unknown_3 ));
2334 prs_uint16("logon_divs ", ps, depth, &(usr->logon_divs )); /* logon divisions per week */
2336 prs_uint32("ptr_logon_hrs ", ps, depth, &(usr->ptr_logon_hrs));
2337 prs_uint32("unknown_5 ", ps, depth, &(usr->unknown_5 ));
2339 prs_uint8s (False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1));
2341 /* here begins pointed-to data */
2343 smb_io_unistr2("uni_user_name ", &(usr->uni_user_name) , usr->hdr_user_name .buffer, ps, depth); /* username unicode string */
2344 smb_io_unistr2("uni_full_name ", &(usr->uni_full_name) , usr->hdr_full_name .buffer, ps, depth); /* user's full name unicode string */
2345 smb_io_unistr2("uni_home_dir ", &(usr->uni_home_dir) , usr->hdr_home_dir .buffer, ps, depth); /* home directory unicode string */
2346 smb_io_unistr2("uni_dir_drive ", &(usr->uni_dir_drive) , usr->hdr_dir_drive .buffer, ps, depth); /* home directory drive unicode string */
2347 smb_io_unistr2("uni_logon_script", &(usr->uni_logon_script), usr->hdr_logon_script.buffer, ps, depth); /* logon script unicode string */
2348 smb_io_unistr2("uni_profile_path", &(usr->uni_profile_path), usr->hdr_profile_path.buffer, ps, depth); /* profile path unicode string */
2349 smb_io_unistr2("uni_acct_desc ", &(usr->uni_acct_desc ), usr->hdr_acct_desc .buffer, ps, depth); /* user description unicode string */
2350 smb_io_unistr2("uni_workstations", &(usr->uni_workstations), usr->hdr_workstations.buffer, ps, depth); /* worksations user can log on from */
2351 smb_io_unistr2("uni_unknown_str ", &(usr->uni_unknown_str ), usr->hdr_unknown_str .buffer, ps, depth); /* unknown string */
2352 smb_io_unistr2("uni_munged_dial ", &(usr->uni_munged_dial ), usr->hdr_munged_dial .buffer, ps, depth); /* worksations user can log on from */
2354 prs_uint32("unknown_6 ", ps, depth, &(usr->unknown_6 ));
2355 prs_uint32("padding4 ", ps, depth, &(usr->padding4 ));
2357 if (usr->ptr_logon_hrs)
2359 sam_io_logon_hrs("logon_hrs", &(usr->logon_hrs) , ps, depth);
2364 /*******************************************************************
2365 makes a SAMR_R_QUERY_USERINFO structure.
2366 ********************************************************************/
2367 void make_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO *r_u,
2368 uint16 switch_value, void *info, uint32 status)
2371 if (r_u == NULL || info == NULL) return;
2373 DEBUG(5,("make_samr_r_query_userinfo\n"));
2376 r_u->switch_value = 0;
2380 r_u->switch_value = switch_value;
2382 switch (switch_value)
2387 r_u->info.id10 = (SAM_USER_INFO_10*)info;
2395 r_u->info.id11 = (SAM_USER_INFO_11*)info;
2403 r_u->info.id21 = (SAM_USER_INFO_21*)info;
2410 DEBUG(4,("make_samr_r_query_aliasinfo: unsupported switch level\n"));
2416 r_u->status = status; /* return status */
2419 /*******************************************************************
2420 reads or writes a structure.
2421 ********************************************************************/
2422 void samr_io_r_query_userinfo(char *desc, SAMR_R_QUERY_USERINFO *r_u, prs_struct *ps, int depth)
2424 if (r_u == NULL) return;
2426 prs_debug(ps, depth, desc, "samr_io_r_query_userinfo");
2431 prs_uint32("ptr ", ps, depth, &(r_u->ptr ));
2432 prs_uint16("switch_value", ps, depth, &(r_u->switch_value));
2435 if (r_u->ptr != 0 && r_u->switch_value != 0)
2437 switch (r_u->switch_value)
2442 if (r_u->info.id10 != NULL)
2444 sam_io_user_info10("", r_u->info.id10, ps, depth);
2448 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
2455 if (r_u->info.id11 != NULL)
2457 sam_io_user_info11("", r_u->info.id11, ps, depth);
2461 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
2469 if (r_u->info.id21 != NULL)
2471 sam_io_user_info21("", r_u->info.id21, ps, depth);
2475 DEBUG(2,("samr_io_r_query_userinfo: info pointer not initialised\n"));
2482 DEBUG(2,("samr_io_r_query_userinfo: unknown switch level\n"));
2489 prs_uint32("status", ps, depth, &(r_u->status));
2493 /*******************************************************************
2494 makes a SAMR_Q_UNKNOWN_21 structure.
2495 ********************************************************************/
2496 void make_samr_q_unknown_21(SAMR_Q_UNKNOWN_21 *q_c,
2497 POLICY_HND *hnd, uint16 unk_1, uint16 unk_2)
2499 if (q_c == NULL || hnd == NULL) return;
2501 DEBUG(5,("make_samr_q_unknown_21\n"));
2503 memcpy(&(q_c->group_pol), hnd, sizeof(q_c->group_pol));
2504 q_c->unknown_1 = unk_1;
2505 q_c->unknown_2 = unk_2;
2508 /*******************************************************************
2509 reads or writes a structure.
2510 ********************************************************************/
2511 void samr_io_q_unknown_21(char *desc, SAMR_Q_UNKNOWN_21 *q_u, prs_struct *ps, int depth)
2513 if (q_u == NULL) return;
2515 prs_debug(ps, depth, desc, "samr_io_q_unknown_21");
2520 smb_io_pol_hnd("group_pol", &(q_u->group_pol), ps, depth);
2523 prs_uint16("unknown_1", ps, depth, &(q_u->unknown_1));
2524 prs_uint16("unknown_2", ps, depth, &(q_u->unknown_2));
2527 /*******************************************************************
2528 makes a SAMR_Q_UNKNOWN_13 structure.
2529 ********************************************************************/
2530 void make_samr_q_unknown_13(SAMR_Q_UNKNOWN_13 *q_c,
2531 POLICY_HND *hnd, uint16 unk_1, uint16 unk_2)
2533 if (q_c == NULL || hnd == NULL) return;
2535 DEBUG(5,("make_samr_q_unknown_13\n"));
2537 memcpy(&(q_c->alias_pol), hnd, sizeof(q_c->alias_pol));
2538 q_c->unknown_1 = unk_1;
2539 q_c->unknown_2 = unk_2;
2542 /*******************************************************************
2543 reads or writes a structure.
2544 ********************************************************************/
2545 void samr_io_q_unknown_13(char *desc, SAMR_Q_UNKNOWN_13 *q_u, prs_struct *ps, int depth)
2547 if (q_u == NULL) return;
2549 prs_debug(ps, depth, desc, "samr_io_q_unknown_13");
2554 smb_io_pol_hnd("alias_pol", &(q_u->alias_pol), ps, depth);
2557 prs_uint16("unknown_1", ps, depth, &(q_u->unknown_1));
2558 prs_uint16("unknown_2", ps, depth, &(q_u->unknown_2));
2561 /*******************************************************************
2562 reads or writes a structure.
2563 ********************************************************************/
2564 void samr_io_q_unknown_32(char *desc, SAMR_Q_UNKNOWN_32 *q_u, prs_struct *ps, int depth)
2566 if (q_u == NULL) return;
2568 prs_debug(ps, depth, desc, "samr_io_q_unknown_32");
2573 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
2576 smb_io_unihdr ("", &(q_u->hdr_mach_acct), ps, depth);
2577 smb_io_unistr2("", &(q_u->uni_mach_acct), q_u->hdr_mach_acct.buffer, ps, depth);
2581 prs_uint32("acct_ctrl", ps, depth, &(q_u->acct_ctrl));
2582 prs_uint16("unknown_1", ps, depth, &(q_u->unknown_1));
2583 prs_uint16("unknown_2", ps, depth, &(q_u->unknown_2));
2586 /*******************************************************************
2587 reads or writes a structure.
2588 ********************************************************************/
2589 void samr_io_r_unknown_32(char *desc, SAMR_R_UNKNOWN_32 *r_u, prs_struct *ps, int depth)
2591 if (r_u == NULL) return;
2593 prs_debug(ps, depth, desc, "samr_io_r_unknown_32");
2598 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
2601 prs_uint32("status", ps, depth, &(r_u->status));
2605 /*******************************************************************
2606 makes a SAMR_Q_CONNECT structure.
2607 ********************************************************************/
2608 void make_samr_q_connect(SAMR_Q_CONNECT *q_u,
2609 char *srv_name, uint32 unknown_0)
2611 int len_srv_name = strlen(srv_name);
2613 if (q_u == NULL) return;
2615 DEBUG(5,("make_q_connect\n"));
2617 /* make PDC server name \\server */
2618 make_unistr2(&(q_u->uni_srv_name), srv_name, len_srv_name);
2620 /* example values: 0x0000 0002 */
2621 q_u->unknown_0 = unknown_0;
2624 /*******************************************************************
2625 reads or writes a structure.
2626 ********************************************************************/
2627 void samr_io_q_connect(char *desc, SAMR_Q_CONNECT *q_u, prs_struct *ps, int depth)
2629 if (q_u == NULL) return;
2631 prs_debug(ps, depth, desc, "samr_io_q_connect");
2636 prs_uint32("ptr_srv_name", ps, depth, &(q_u->ptr_srv_name));
2637 smb_io_unistr2("", &(q_u->uni_srv_name), q_u->ptr_srv_name, ps, depth);
2641 prs_uint32("unknown_0 ", ps, depth, &(q_u->unknown_0 ));
2644 /*******************************************************************
2645 reads or writes a structure.
2646 ********************************************************************/
2647 void samr_io_r_connect(char *desc, SAMR_R_CONNECT *r_u, prs_struct *ps, int depth)
2649 if (r_u == NULL) return;
2651 prs_debug(ps, depth, desc, "samr_io_r_connect");
2656 smb_io_pol_hnd("connect_pol", &(r_u->connect_pol), ps, depth);
2659 prs_uint32("status", ps, depth, &(r_u->status));
2662 /*******************************************************************
2663 makes a SAMR_Q_OPEN_ALIAS structure.
2664 ********************************************************************/
2665 void make_samr_q_open_alias(SAMR_Q_OPEN_ALIAS *q_u,
2666 uint32 unknown_0, uint32 rid)
2668 if (q_u == NULL) return;
2670 DEBUG(5,("make_q_open_alias\n"));
2672 /* example values: 0x0000 0008 */
2673 q_u->unknown_0 = unknown_0;
2675 q_u->rid_alias = rid;
2678 /*******************************************************************
2679 reads or writes a structure.
2680 ********************************************************************/
2681 void samr_io_q_open_alias(char *desc, SAMR_Q_OPEN_ALIAS *q_u, prs_struct *ps, int depth)
2683 if (q_u == NULL) return;
2685 prs_debug(ps, depth, desc, "samr_io_q_open_alias");
2690 prs_uint32("unknown_0", ps, depth, &(q_u->unknown_0));
2691 prs_uint32("rid_alias", ps, depth, &(q_u->rid_alias));
2694 /*******************************************************************
2695 reads or writes a structure.
2696 ********************************************************************/
2697 void samr_io_r_open_alias(char *desc, SAMR_R_OPEN_ALIAS *r_u, prs_struct *ps, int depth)
2699 if (r_u == NULL) return;
2701 prs_debug(ps, depth, desc, "samr_io_r_open_alias");
2706 smb_io_pol_hnd("pol", &(r_u->pol), ps, depth);
2709 prs_uint32("status", ps, depth, &(r_u->status));
2712 /*******************************************************************
2713 makes a SAMR_Q_UNKNOWN_38 structure.
2714 ********************************************************************/
2715 void make_samr_q_unknown_38(SAMR_Q_UNKNOWN_38 *q_u, char *srv_name)
2717 int len_srv_name = strlen(srv_name);
2719 if (q_u == NULL) return;
2721 DEBUG(5,("make_q_unknown_38\n"));
2724 make_uni_hdr(&(q_u->hdr_srv_name), len_srv_name, len_srv_name, len_srv_name != 0);
2725 make_unistr2(&(q_u->uni_srv_name), srv_name, len_srv_name);
2729 /*******************************************************************
2730 reads or writes a structure.
2731 ********************************************************************/
2732 void samr_io_q_unknown_38(char *desc, SAMR_Q_UNKNOWN_38 *q_u, prs_struct *ps, int depth)
2734 if (q_u == NULL) return;
2736 prs_debug(ps, depth, desc, "samr_io_q_unknown_38");
2741 prs_uint32("ptr", ps, depth, &(q_u->ptr));
2744 smb_io_unihdr ("", &(q_u->hdr_srv_name), ps, depth);
2745 smb_io_unistr2("", &(q_u->uni_srv_name), q_u->hdr_srv_name.buffer, ps, depth);
2749 /*******************************************************************
2750 makes a SAMR_R_UNKNOWN_38 structure.
2751 ********************************************************************/
2752 void make_samr_r_unknown_38(SAMR_R_UNKNOWN_38 *r_u,
2753 uint16 level, uint32 status)
2755 if (r_u == NULL) return;
2757 DEBUG(5,("make_r_unknown_38\n"));
2759 r_u->level.value = level;
2761 r_u->status = status;
2764 /*******************************************************************
2765 reads or writes a structure.
2766 ********************************************************************/
2767 void samr_io_r_unknown_38(char *desc, SAMR_R_UNKNOWN_38 *r_u, prs_struct *ps, int depth)
2769 if (r_u == NULL) return;
2771 prs_debug(ps, depth, desc, "samr_io_r_unknown_38");
2776 smb_io_lookup_level("level ", &(r_u->level), ps, depth);
2777 prs_uint32("ptr_0 ", ps, depth, &(r_u->ptr_0 ));
2778 prs_uint32("status", ps, depth, &(r_u->status));
2781 /*******************************************************************
2782 reads or writes a SAMR_ENC_PASSWD structure.
2783 ********************************************************************/
2784 void samr_io_enc_passwd(char *desc, SAMR_ENC_PASSWD *pwd, prs_struct *ps, int depth)
2786 if (pwd == NULL) return;
2788 prs_debug(ps, depth, desc, "samr_io_enc_passwd");
2793 prs_uint32("ptr", ps, depth, &(pwd->ptr));
2794 prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass));
2797 /*******************************************************************
2798 reads or writes a SAMR_ENC_HASH structure.
2799 ********************************************************************/
2800 void samr_io_enc_hash(char *desc, SAMR_ENC_HASH *hsh, prs_struct *ps, int depth)
2802 if (hsh == NULL) return;
2804 prs_debug(ps, depth, desc, "samr_io_enc_hash");
2809 prs_uint32("ptr ", ps, depth, &(hsh->ptr));
2810 prs_uint8s(False, "hash", ps, depth, hsh->hash, sizeof(hsh->hash));
2814 /* SAMR_Q_CHGPASSWD_USER */
2815 typedef struct q_samr_chgpasswd_user_info
2819 UNIHDR hdr_server; /* server name unicode header */
2820 UNISTR2 uni_server; /* server name unicode string */
2822 UNIHDR hdr_user_name; /* username unicode string header */
2823 UNISTR2 uni_user_name; /* username unicode string */
2825 SAMR_ENC_PASSWD nt_newpass;
2826 SAMR_ENC_HASH nt_oldhash;
2828 uint32 unknown_1; /* seems to always contain 0001 */
2830 SAMR_ENC_PASSWD lm_newpass;
2831 SAMR_ENC_HASH lm_oldhash;
2833 } SAMR_Q_CHGPASSWD_USER;
2835 /* SAMR_R_CHGPASSWD_USER */
2836 typedef struct r_samr_chgpasswd_user_info
2838 uint32 result; /* 0 == OK, C000006A (NT_STATUS_WRONG_PASSWORD) */
2840 } SAMR_R_CHGPASSWD_USER;