r12018: more 3.0.21 changes. This is a full sync except for changes to rpc-server...
[Samba.git] / source / rpc_parse / parse_samr.c
blob0a055ff826a72c352e0bccb42e06087cf9eae65a
1 /*
2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-2000,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-2000,
6 * Copyright (C) Paul Ashton 1997-2000,
7 * Copyright (C) Elrond 2000,
8 * Copyright (C) Jeremy Allison 2001,
9 * Copyright (C) Jean François Micouleau 1998-2001,
10 * Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002.
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include "includes.h"
29 #undef DBGC_CLASS
30 #define DBGC_CLASS DBGC_RPC_PARSE
32 /*******************************************************************
33 inits a SAMR_Q_CLOSE_HND structure.
34 ********************************************************************/
36 void init_samr_q_close_hnd(SAMR_Q_CLOSE_HND * q_c, POLICY_HND *hnd)
38 DEBUG(5, ("init_samr_q_close_hnd\n"));
40 q_c->pol = *hnd;
43 /*******************************************************************
44 reads or writes a structure.
45 ********************************************************************/
47 BOOL samr_io_q_close_hnd(const char *desc, SAMR_Q_CLOSE_HND * q_u,
48 prs_struct *ps, int depth)
50 if (q_u == NULL)
51 return False;
53 prs_debug(ps, depth, desc, "samr_io_q_close_hnd");
54 depth++;
56 if(!prs_align(ps))
57 return False;
59 return smb_io_pol_hnd("pol", &q_u->pol, ps, depth);
62 /*******************************************************************
63 reads or writes a structure.
64 ********************************************************************/
66 BOOL samr_io_r_close_hnd(const char *desc, SAMR_R_CLOSE_HND * r_u,
67 prs_struct *ps, int depth)
69 if (r_u == NULL)
70 return False;
72 prs_debug(ps, depth, desc, "samr_io_r_close_hnd");
73 depth++;
75 if(!prs_align(ps))
76 return False;
78 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
79 return False;
81 if(!prs_ntstatus("status", ps, depth, &r_u->status))
82 return False;
84 return True;
87 /*******************************************************************
88 inits a SAMR_Q_LOOKUP_DOMAIN structure.
89 ********************************************************************/
91 void init_samr_q_lookup_domain(SAMR_Q_LOOKUP_DOMAIN * q_u,
92 POLICY_HND *pol, char *dom_name)
94 DEBUG(5, ("init_samr_q_lookup_domain\n"));
96 q_u->connect_pol = *pol;
98 init_unistr2(&q_u->uni_domain, dom_name, UNI_FLAGS_NONE);
99 init_uni_hdr(&q_u->hdr_domain, &q_u->uni_domain);
102 /*******************************************************************
103 reads or writes a structure.
104 ********************************************************************/
105 BOOL samr_io_q_lookup_domain(const char *desc, SAMR_Q_LOOKUP_DOMAIN * q_u,
106 prs_struct *ps, int depth)
108 if (q_u == NULL)
109 return False;
111 prs_debug(ps, depth, desc, "samr_io_q_lookup_domain");
112 depth++;
114 if(!prs_align(ps))
115 return False;
117 if(!smb_io_pol_hnd("connect_pol", &q_u->connect_pol, ps, depth))
118 return False;
120 if(!smb_io_unihdr("hdr_domain", &q_u->hdr_domain, ps, depth))
121 return False;
123 if(!smb_io_unistr2("uni_domain", &q_u->uni_domain, q_u->hdr_domain.buffer, ps, depth))
124 return False;
126 return True;
129 /*******************************************************************
130 inits a SAMR_R_LOOKUP_DOMAIN structure.
131 ********************************************************************/
133 void init_samr_r_lookup_domain(SAMR_R_LOOKUP_DOMAIN * r_u,
134 DOM_SID *dom_sid, NTSTATUS status)
136 DEBUG(5, ("init_samr_r_lookup_domain\n"));
138 r_u->status = status;
139 r_u->ptr_sid = 0;
140 if (NT_STATUS_IS_OK(status)) {
141 r_u->ptr_sid = 1;
142 init_dom_sid2(&r_u->dom_sid, dom_sid);
146 /*******************************************************************
147 reads or writes a structure.
148 ********************************************************************/
150 BOOL samr_io_r_lookup_domain(const char *desc, SAMR_R_LOOKUP_DOMAIN * r_u,
151 prs_struct *ps, int depth)
153 if (r_u == NULL)
154 return False;
156 prs_debug(ps, depth, desc, "samr_io_r_lookup_domain");
157 depth++;
159 if(!prs_align(ps))
160 return False;
162 if(!prs_uint32("ptr", ps, depth, &r_u->ptr_sid))
163 return False;
165 if (r_u->ptr_sid != 0) {
166 if(!smb_io_dom_sid2("sid", &r_u->dom_sid, ps, depth))
167 return False;
168 if(!prs_align(ps))
169 return False;
172 if(!prs_ntstatus("status", ps, depth, &r_u->status))
173 return False;
175 return True;
178 /*******************************************************************
179 reads or writes a structure.
180 ********************************************************************/
182 void init_samr_q_remove_sid_foreign_domain(SAMR_Q_REMOVE_SID_FOREIGN_DOMAIN * q_u, POLICY_HND *dom_pol, DOM_SID *sid)
184 DEBUG(5, ("samr_init_samr_q_remove_sid_foreign_domain\n"));
186 q_u->dom_pol = *dom_pol;
187 init_dom_sid2(&q_u->sid, sid);
190 /*******************************************************************
191 reads or writes a structure.
192 ********************************************************************/
194 BOOL samr_io_q_remove_sid_foreign_domain(const char *desc, SAMR_Q_REMOVE_SID_FOREIGN_DOMAIN * q_u,
195 prs_struct *ps, int depth)
197 if (q_u == NULL)
198 return False;
200 prs_debug(ps, depth, desc, "samr_io_q_remove_sid_foreign_domain");
201 depth++;
203 if(!prs_align(ps))
204 return False;
206 if(!smb_io_pol_hnd("domain_pol", &q_u->dom_pol, ps, depth))
207 return False;
209 if(!smb_io_dom_sid2("sid", &q_u->sid, ps, depth))
210 return False;
212 if(!prs_align(ps))
213 return False;
215 return True;
218 /*******************************************************************
219 reads or writes a structure.
220 ********************************************************************/
222 BOOL samr_io_r_remove_sid_foreign_domain(const char *desc, SAMR_R_REMOVE_SID_FOREIGN_DOMAIN * r_u,
223 prs_struct *ps, int depth)
225 if (r_u == NULL)
226 return False;
228 prs_debug(ps, depth, desc, "samr_io_r_remove_sid_foreign_domain");
229 depth++;
231 if(!prs_align(ps))
232 return False;
234 if(!prs_ntstatus("status", ps, depth, &r_u->status))
235 return False;
237 return True;
240 /*******************************************************************
241 reads or writes a structure.
242 ********************************************************************/
244 void init_samr_q_open_domain(SAMR_Q_OPEN_DOMAIN * q_u,
245 POLICY_HND *pol, uint32 flags,
246 const DOM_SID *sid)
248 DEBUG(5, ("samr_init_samr_q_open_domain\n"));
250 q_u->pol = *pol;
251 q_u->flags = flags;
252 init_dom_sid2(&q_u->dom_sid, sid);
255 /*******************************************************************
256 reads or writes a structure.
257 ********************************************************************/
259 BOOL samr_io_q_open_domain(const char *desc, SAMR_Q_OPEN_DOMAIN * q_u,
260 prs_struct *ps, int depth)
262 if (q_u == NULL)
263 return False;
265 prs_debug(ps, depth, desc, "samr_io_q_open_domain");
266 depth++;
268 if(!prs_align(ps))
269 return False;
271 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
272 return False;
274 if(!prs_uint32("flags", ps, depth, &q_u->flags))
275 return False;
277 if(!smb_io_dom_sid2("sid", &q_u->dom_sid, ps, depth))
278 return False;
280 return True;
283 /*******************************************************************
284 reads or writes a structure.
285 ********************************************************************/
287 BOOL samr_io_r_open_domain(const char *desc, SAMR_R_OPEN_DOMAIN * r_u,
288 prs_struct *ps, int depth)
290 if (r_u == NULL)
291 return False;
293 prs_debug(ps, depth, desc, "samr_io_r_open_domain");
294 depth++;
296 if(!prs_align(ps))
297 return False;
299 if(!smb_io_pol_hnd("domain_pol", &r_u->domain_pol, ps, depth))
300 return False;
302 if(!prs_ntstatus("status", ps, depth, &r_u->status))
303 return False;
305 return True;
308 /*******************************************************************
309 reads or writes a structure.
310 ********************************************************************/
312 void init_samr_q_get_usrdom_pwinfo(SAMR_Q_GET_USRDOM_PWINFO * q_u,
313 POLICY_HND *user_pol)
315 DEBUG(5, ("samr_init_samr_q_get_usrdom_pwinfo\n"));
317 q_u->user_pol = *user_pol;
320 /*******************************************************************
321 reads or writes a structure.
322 ********************************************************************/
324 BOOL samr_io_q_get_usrdom_pwinfo(const char *desc, SAMR_Q_GET_USRDOM_PWINFO * q_u,
325 prs_struct *ps, int depth)
327 if (q_u == NULL)
328 return False;
330 prs_debug(ps, depth, desc, "samr_io_q_get_usrdom_pwinfo");
331 depth++;
333 if(!prs_align(ps))
334 return False;
336 return smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth);
339 /*******************************************************************
340 Init.
341 ********************************************************************/
343 void init_samr_r_get_usrdom_pwinfo(SAMR_R_GET_USRDOM_PWINFO *r_u, NTSTATUS status)
345 DEBUG(5, ("init_samr_r_get_usrdom_pwinfo\n"));
347 r_u->unknown_0 = 0x0000;
350 * used to be
351 * r_u->unknown_1 = 0x0015;
352 * but for trusts.
354 r_u->unknown_1 = 0x01D1;
355 r_u->unknown_1 = 0x0015;
357 r_u->unknown_2 = 0x00000000;
359 r_u->status = status;
362 /*******************************************************************
363 reads or writes a structure.
364 ********************************************************************/
366 BOOL samr_io_r_get_usrdom_pwinfo(const char *desc, SAMR_R_GET_USRDOM_PWINFO * r_u,
367 prs_struct *ps, int depth)
369 if (r_u == NULL)
370 return False;
372 prs_debug(ps, depth, desc, "samr_io_r_get_usrdom_pwinfo");
373 depth++;
375 if(!prs_align(ps))
376 return False;
378 if(!prs_uint16("unknown_0", ps, depth, &r_u->unknown_0))
379 return False;
380 if(!prs_uint16("unknown_1", ps, depth, &r_u->unknown_1))
381 return False;
382 if(!prs_uint32("unknown_2", ps, depth, &r_u->unknown_2))
383 return False;
384 if(!prs_ntstatus("status ", ps, depth, &r_u->status))
385 return False;
387 return True;
391 /*******************************************************************
392 reads or writes a structure.
393 ********************************************************************/
395 BOOL samr_io_q_set_sec_obj(const char *desc, SAMR_Q_SET_SEC_OBJ * q_u,
396 prs_struct *ps, int depth)
398 if (q_u == NULL)
399 return False;
401 prs_debug(ps, depth, desc, "samr_io_q_set_sec_obj");
402 depth++;
404 if(!prs_align(ps))
405 return False;
407 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
408 return False;
410 if(!prs_uint32("sec_info", ps, depth, &q_u->sec_info))
411 return False;
413 if(!sec_io_desc_buf("sec_desc", &q_u->buf, ps, depth))
414 return False;
416 return True;
420 /*******************************************************************
421 reads or writes a structure.
422 ********************************************************************/
424 void init_samr_q_query_sec_obj(SAMR_Q_QUERY_SEC_OBJ * q_u,
425 POLICY_HND *user_pol, uint32 sec_info)
427 DEBUG(5, ("samr_init_samr_q_query_sec_obj\n"));
429 q_u->user_pol = *user_pol;
430 q_u->sec_info = sec_info;
434 /*******************************************************************
435 reads or writes a structure.
436 ********************************************************************/
438 BOOL samr_io_q_query_sec_obj(const char *desc, SAMR_Q_QUERY_SEC_OBJ * q_u,
439 prs_struct *ps, int depth)
441 if (q_u == NULL)
442 return False;
444 prs_debug(ps, depth, desc, "samr_io_q_query_sec_obj");
445 depth++;
447 if(!prs_align(ps))
448 return False;
450 if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth))
451 return False;
453 if(!prs_uint32("sec_info", ps, depth, &q_u->sec_info))
454 return False;
456 return True;
459 /*******************************************************************
460 reads or writes a structure.
461 ********************************************************************/
463 void init_samr_q_query_dom_info(SAMR_Q_QUERY_DOMAIN_INFO * q_u,
464 POLICY_HND *domain_pol, uint16 switch_value)
466 DEBUG(5, ("samr_init_samr_q_query_dom_info\n"));
468 q_u->domain_pol = *domain_pol;
469 q_u->switch_value = switch_value;
472 /*******************************************************************
473 reads or writes a structure.
474 ********************************************************************/
476 BOOL samr_io_q_query_dom_info(const char *desc, SAMR_Q_QUERY_DOMAIN_INFO * q_u,
477 prs_struct *ps, int depth)
479 if (q_u == NULL)
480 return False;
482 prs_debug(ps, depth, desc, "samr_io_q_query_dom_info");
483 depth++;
485 if(!prs_align(ps))
486 return False;
488 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
489 return False;
491 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
492 return False;
494 return True;
498 /*******************************************************************
499 inits a structure.
500 ********************************************************************/
502 void init_unk_info3(SAM_UNK_INFO_3 *u_3, NTTIME nt_logout)
504 u_3->logout.low = nt_logout.low;
505 u_3->logout.high = nt_logout.high;
508 /*******************************************************************
509 reads or writes a structure.
510 ********************************************************************/
512 static BOOL sam_io_unk_info3(const char *desc, SAM_UNK_INFO_3 * u_3,
513 prs_struct *ps, int depth)
515 if (u_3 == NULL)
516 return False;
518 prs_debug(ps, depth, desc, "sam_io_unk_info3");
519 depth++;
521 if(!smb_io_time("logout", &u_3->logout, ps, depth))
522 return False;
524 return True;
527 /*******************************************************************
528 inits a structure.
529 ********************************************************************/
531 void init_unk_info6(SAM_UNK_INFO_6 * u_6)
533 u_6->unknown_0 = 0x00000000;
534 u_6->ptr_0 = 1;
535 memset(u_6->padding, 0, sizeof(u_6->padding)); /* 12 bytes zeros */
538 /*******************************************************************
539 reads or writes a structure.
540 ********************************************************************/
542 static BOOL sam_io_unk_info6(const char *desc, SAM_UNK_INFO_6 * u_6,
543 prs_struct *ps, int depth)
545 if (u_6 == NULL)
546 return False;
548 prs_debug(ps, depth, desc, "sam_io_unk_info6");
549 depth++;
551 if(!prs_uint32("unknown_0", ps, depth, &u_6->unknown_0)) /* 0x0000 0000 */
552 return False;
553 if(!prs_uint32("ptr_0", ps, depth, &u_6->ptr_0)) /* pointer to unknown structure */
554 return False;
555 if(!prs_uint8s(False, "padding", ps, depth, u_6->padding, sizeof(u_6->padding))) /* 12 bytes zeros */
556 return False;
558 return True;
561 /*******************************************************************
562 inits a structure.
563 ********************************************************************/
565 void init_unk_info7(SAM_UNK_INFO_7 * u_7, uint32 server_role)
567 u_7->server_role = server_role;
570 /*******************************************************************
571 reads or writes a structure.
572 ********************************************************************/
574 static BOOL sam_io_unk_info7(const char *desc, SAM_UNK_INFO_7 * u_7,
575 prs_struct *ps, int depth)
577 if (u_7 == NULL)
578 return False;
580 prs_debug(ps, depth, desc, "sam_io_unk_info7");
581 depth++;
583 if(!prs_uint16("server_role", ps, depth, &u_7->server_role))
584 return False;
586 return True;
589 /*******************************************************************
590 inits a structure.
591 ********************************************************************/
593 void init_unk_info8(SAM_UNK_INFO_8 * u_8, uint32 seq_num)
595 unix_to_nt_time(&u_8->domain_create_time, 0);
596 u_8->seq_num.low = seq_num;
597 u_8->seq_num.high = 0x0000;
600 /*******************************************************************
601 reads or writes a structure.
602 ********************************************************************/
604 static BOOL sam_io_unk_info8(const char *desc, SAM_UNK_INFO_8 * u_8,
605 prs_struct *ps, int depth)
607 if (u_8 == NULL)
608 return False;
610 prs_debug(ps, depth, desc, "sam_io_unk_info8");
611 depth++;
613 if (!prs_uint64("seq_num", ps, depth, &u_8->seq_num))
614 return False;
616 if(!smb_io_time("domain_create_time", &u_8->domain_create_time, ps, depth))
617 return False;
619 return True;
623 /*******************************************************************
624 inits a structure.
625 ********************************************************************/
627 void init_unk_info12(SAM_UNK_INFO_12 * u_12, NTTIME nt_lock_duration, NTTIME nt_reset_time, uint16 lockout)
629 u_12->duration.low = nt_lock_duration.low;
630 u_12->duration.high = nt_lock_duration.high;
631 u_12->reset_count.low = nt_reset_time.low;
632 u_12->reset_count.high = nt_reset_time.high;
634 u_12->bad_attempt_lockout = lockout;
637 /*******************************************************************
638 reads or writes a structure.
639 ********************************************************************/
641 static BOOL sam_io_unk_info12(const char *desc, SAM_UNK_INFO_12 * u_12,
642 prs_struct *ps, int depth)
644 if (u_12 == NULL)
645 return False;
647 prs_debug(ps, depth, desc, "sam_io_unk_info12");
648 depth++;
650 if(!smb_io_time("duration", &u_12->duration, ps, depth))
651 return False;
652 if(!smb_io_time("reset_count", &u_12->reset_count, ps, depth))
653 return False;
654 if(!prs_uint16("bad_attempt_lockout", ps, depth, &u_12->bad_attempt_lockout))
655 return False;
657 return True;
660 /*******************************************************************
661 inits a structure.
662 ********************************************************************/
664 void init_unk_info5(SAM_UNK_INFO_5 * u_5,const char *server)
666 init_unistr2(&u_5->uni_server, server, UNI_FLAGS_NONE);
667 init_uni_hdr(&u_5->hdr_server, &u_5->uni_server);
670 /*******************************************************************
671 reads or writes a structure.
672 ********************************************************************/
674 static BOOL sam_io_unk_info5(const char *desc, SAM_UNK_INFO_5 * u_5,
675 prs_struct *ps, int depth)
677 if (u_5 == NULL)
678 return False;
680 prs_debug(ps, depth, desc, "sam_io_unk_info5");
681 depth++;
683 if(!smb_io_unihdr("hdr_server", &u_5->hdr_server, ps, depth))
684 return False;
686 if(!smb_io_unistr2("uni_server", &u_5->uni_server, u_5->hdr_server.buffer, ps, depth))
687 return False;
689 return True;
692 /*******************************************************************
693 inits a structure.
694 ********************************************************************/
696 void init_unk_info2(SAM_UNK_INFO_2 * u_2,
697 const char *comment, const char *domain, const char *server,
698 uint32 seq_num, uint32 num_users, uint32 num_groups, uint32 num_alias, NTTIME nt_logout, uint32 server_role)
700 u_2->logout.low = nt_logout.low;
701 u_2->logout.high = nt_logout.high;
703 u_2->seq_num.low = seq_num;
704 u_2->seq_num.high = 0x00000000;
707 u_2->unknown_4 = 0x00000001;
708 u_2->server_role = server_role;
709 u_2->unknown_6 = 0x00000001;
710 u_2->num_domain_usrs = num_users;
711 u_2->num_domain_grps = num_groups;
712 u_2->num_local_grps = num_alias;
714 memset(u_2->padding, 0, sizeof(u_2->padding)); /* 12 bytes zeros */
716 init_unistr2(&u_2->uni_comment, comment, UNI_FLAGS_NONE);
717 init_uni_hdr(&u_2->hdr_comment, &u_2->uni_comment);
718 init_unistr2(&u_2->uni_domain, domain, UNI_FLAGS_NONE);
719 init_uni_hdr(&u_2->hdr_domain, &u_2->uni_domain);
720 init_unistr2(&u_2->uni_server, server, UNI_FLAGS_NONE);
721 init_uni_hdr(&u_2->hdr_server, &u_2->uni_server);
724 /*******************************************************************
725 reads or writes a structure.
726 ********************************************************************/
728 static BOOL sam_io_unk_info2(const char *desc, SAM_UNK_INFO_2 * u_2,
729 prs_struct *ps, int depth)
731 if (u_2 == NULL)
732 return False;
734 prs_debug(ps, depth, desc, "sam_io_unk_info2");
735 depth++;
737 if(!smb_io_time("logout", &u_2->logout, ps, depth))
738 return False;
739 if(!smb_io_unihdr("hdr_comment", &u_2->hdr_comment, ps, depth))
740 return False;
741 if(!smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth))
742 return False;
743 if(!smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth))
744 return False;
746 /* put all the data in here, at the moment, including what the above
747 pointer is referring to
750 if(!prs_uint64("seq_num ", ps, depth, &u_2->seq_num))
751 return False;
753 if(!prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4)) /* 0x0000 0001 */
754 return False;
755 if(!prs_uint32("server_role ", ps, depth, &u_2->server_role))
756 return False;
757 if(!prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6)) /* 0x0000 0001 */
758 return False;
759 if(!prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs))
760 return False;
761 if(!prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps))
762 return False;
763 if(!prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps))
764 return False;
766 if(!smb_io_unistr2("uni_comment", &u_2->uni_comment, u_2->hdr_comment.buffer, ps, depth))
767 return False;
768 if(!smb_io_unistr2("uni_domain", &u_2->uni_domain, u_2->hdr_domain.buffer, ps, depth))
769 return False;
770 if(!smb_io_unistr2("uni_server", &u_2->uni_server, u_2->hdr_server.buffer, ps, depth))
771 return False;
773 return True;
776 /*******************************************************************
777 inits a structure.
778 ********************************************************************/
780 void init_unk_info1(SAM_UNK_INFO_1 *u_1, uint16 min_pass_len, uint16 pass_hist,
781 uint32 password_properties, NTTIME nt_expire, NTTIME nt_min_age)
783 u_1->min_length_password = min_pass_len;
784 u_1->password_history = pass_hist;
785 u_1->password_properties = password_properties;
787 /* password never expire */
788 u_1->expire.high = nt_expire.high;
789 u_1->expire.low = nt_expire.low;
791 /* can change the password now */
792 u_1->min_passwordage.high = nt_min_age.high;
793 u_1->min_passwordage.low = nt_min_age.low;
797 /*******************************************************************
798 reads or writes a structure.
799 ********************************************************************/
801 static BOOL sam_io_unk_info1(const char *desc, SAM_UNK_INFO_1 * u_1,
802 prs_struct *ps, int depth)
804 if (u_1 == NULL)
805 return False;
807 prs_debug(ps, depth, desc, "sam_io_unk_info1");
808 depth++;
810 if(!prs_uint16("min_length_password", ps, depth, &u_1->min_length_password))
811 return False;
812 if(!prs_uint16("password_history", ps, depth, &u_1->password_history))
813 return False;
814 if(!prs_uint32("password_properties", ps, depth, &u_1->password_properties))
815 return False;
816 if(!smb_io_time("expire", &u_1->expire, ps, depth))
817 return False;
818 if(!smb_io_time("min_passwordage", &u_1->min_passwordage, ps, depth))
819 return False;
821 return True;
824 /*******************************************************************
825 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
826 ********************************************************************/
828 void init_samr_r_query_dom_info(SAMR_R_QUERY_DOMAIN_INFO * r_u,
829 uint16 switch_value, SAM_UNK_CTR * ctr,
830 NTSTATUS status)
832 DEBUG(5, ("init_samr_r_query_dom_info\n"));
834 r_u->ptr_0 = 0;
835 r_u->switch_value = 0;
836 r_u->status = status; /* return status */
838 if (NT_STATUS_IS_OK(status)) {
839 r_u->switch_value = switch_value;
840 r_u->ptr_0 = 1;
841 r_u->ctr = ctr;
845 /*******************************************************************
846 reads or writes a structure.
847 ********************************************************************/
849 BOOL samr_io_r_query_dom_info(const char *desc, SAMR_R_QUERY_DOMAIN_INFO * r_u,
850 prs_struct *ps, int depth)
852 if (r_u == NULL)
853 return False;
855 prs_debug(ps, depth, desc, "samr_io_r_query_dom_info");
856 depth++;
858 if(!prs_align(ps))
859 return False;
861 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
862 return False;
864 if (r_u->ptr_0 != 0 && r_u->ctr != NULL) {
865 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
866 return False;
867 if(!prs_align(ps))
868 return False;
870 switch (r_u->switch_value) {
871 case 0x0c:
872 if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth))
873 return False;
874 break;
875 case 0x08:
876 if(!sam_io_unk_info8("unk_inf8",&r_u->ctr->info.inf8, ps,depth))
877 return False;
878 break;
879 case 0x07:
880 if(!sam_io_unk_info7("unk_inf7",&r_u->ctr->info.inf7, ps,depth))
881 return False;
882 break;
883 case 0x06:
884 if(!sam_io_unk_info6("unk_inf6",&r_u->ctr->info.inf6, ps,depth))
885 return False;
886 break;
887 case 0x05:
888 if(!sam_io_unk_info5("unk_inf5",&r_u->ctr->info.inf5, ps,depth))
889 return False;
890 break;
891 case 0x03:
892 if(!sam_io_unk_info3("unk_inf3",&r_u->ctr->info.inf3, ps,depth))
893 return False;
894 break;
895 case 0x02:
896 if(!sam_io_unk_info2("unk_inf2",&r_u->ctr->info.inf2, ps,depth))
897 return False;
898 break;
899 case 0x01:
900 if(!sam_io_unk_info1("unk_inf1",&r_u->ctr->info.inf1, ps,depth))
901 return False;
902 break;
903 default:
904 DEBUG(0, ("samr_io_r_query_dom_info: unknown switch level 0x%x\n",
905 r_u->switch_value));
906 r_u->status = NT_STATUS_INVALID_INFO_CLASS;
907 return False;
911 if(!prs_align(ps))
912 return False;
914 if(!prs_ntstatus("status", ps, depth, &r_u->status))
915 return False;
917 return True;
920 /*******************************************************************
921 reads or writes a SAMR_R_SET_SEC_OBJ structure.
922 ********************************************************************/
924 BOOL samr_io_r_set_sec_obj(const char *desc, SAMR_R_SET_SEC_OBJ * r_u,
925 prs_struct *ps, int depth)
927 if (r_u == NULL)
928 return False;
930 prs_debug(ps, depth, desc, "samr_io_r_set_sec_obj");
931 depth++;
933 if(!prs_align(ps))
934 return False;
936 if(!prs_ntstatus("status", ps, depth, &r_u->status))
937 return False;
939 return True;
942 /*******************************************************************
943 reads or writes a SAMR_R_QUERY_SEC_OBJ structure.
944 ********************************************************************/
946 BOOL samr_io_r_query_sec_obj(const char *desc, SAMR_R_QUERY_SEC_OBJ * r_u,
947 prs_struct *ps, int depth)
949 if (r_u == NULL)
950 return False;
952 prs_debug(ps, depth, desc, "samr_io_r_query_sec_obj");
953 depth++;
955 if(!prs_align(ps))
956 return False;
958 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
959 return False;
960 if (r_u->ptr != 0) {
961 if(!sec_io_desc_buf("sec", &r_u->buf, ps, depth))
962 return False;
965 if(!prs_ntstatus("status", ps, depth, &r_u->status))
966 return False;
968 return True;
971 /*******************************************************************
972 reads or writes a SAM_STR1 structure.
973 ********************************************************************/
975 static BOOL sam_io_sam_str1(const char *desc, SAM_STR1 * sam, uint32 acct_buf,
976 uint32 name_buf, uint32 desc_buf,
977 prs_struct *ps, int depth)
979 if (sam == NULL)
980 return False;
982 prs_debug(ps, depth, desc, "sam_io_sam_str1");
983 depth++;
985 if(!prs_align(ps))
986 return False;
987 if (!smb_io_unistr2("name", &sam->uni_acct_name, acct_buf, ps, depth))
988 return False;
990 if (!smb_io_unistr2("desc", &sam->uni_acct_desc, desc_buf, ps, depth))
991 return False;
993 if (!smb_io_unistr2("full", &sam->uni_full_name, name_buf, ps, depth))
994 return False;
996 return True;
999 /*******************************************************************
1000 inits a SAM_ENTRY1 structure.
1001 ********************************************************************/
1003 static void init_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx,
1004 UNISTR2 *sam_name, UNISTR2 *sam_full,
1005 UNISTR2 *sam_desc, uint32 rid_user,
1006 uint16 acb_info)
1008 DEBUG(5, ("init_sam_entry1\n"));
1010 ZERO_STRUCTP(sam);
1012 sam->user_idx = user_idx;
1013 sam->rid_user = rid_user;
1014 sam->acb_info = acb_info;
1016 init_uni_hdr(&sam->hdr_acct_name, sam_name);
1017 init_uni_hdr(&sam->hdr_user_name, sam_full);
1018 init_uni_hdr(&sam->hdr_user_desc, sam_desc);
1021 /*******************************************************************
1022 reads or writes a SAM_ENTRY1 structure.
1023 ********************************************************************/
1025 static BOOL sam_io_sam_entry1(const char *desc, SAM_ENTRY1 * sam,
1026 prs_struct *ps, int depth)
1028 if (sam == NULL)
1029 return False;
1031 prs_debug(ps, depth, desc, "sam_io_sam_entry1");
1032 depth++;
1034 if(!prs_align(ps))
1035 return False;
1037 if(!prs_uint32("user_idx ", ps, depth, &sam->user_idx))
1038 return False;
1040 if(!prs_uint32("rid_user ", ps, depth, &sam->rid_user))
1041 return False;
1042 if(!prs_uint16("acb_info ", ps, depth, &sam->acb_info))
1043 return False;
1045 if(!prs_align(ps))
1046 return False;
1048 if (!smb_io_unihdr("hdr_acct_name", &sam->hdr_acct_name, ps, depth))
1049 return False;
1050 if (!smb_io_unihdr("hdr_user_desc", &sam->hdr_user_desc, ps, depth))
1051 return False;
1052 if (!smb_io_unihdr("hdr_user_name", &sam->hdr_user_name, ps, depth))
1053 return False;
1055 return True;
1058 /*******************************************************************
1059 reads or writes a SAM_STR2 structure.
1060 ********************************************************************/
1062 static BOOL sam_io_sam_str2(const char *desc, SAM_STR2 * sam, uint32 acct_buf,
1063 uint32 desc_buf, prs_struct *ps, int depth)
1065 if (sam == NULL)
1066 return False;
1068 prs_debug(ps, depth, desc, "sam_io_sam_str2");
1069 depth++;
1071 if(!prs_align(ps))
1072 return False;
1074 if(!smb_io_unistr2("uni_srv_name", &sam->uni_srv_name, acct_buf, ps, depth)) /* account name unicode string */
1075 return False;
1076 if(!smb_io_unistr2("uni_srv_desc", &sam->uni_srv_desc, desc_buf, ps, depth)) /* account desc unicode string */
1077 return False;
1079 return True;
1082 /*******************************************************************
1083 inits a SAM_ENTRY2 structure.
1084 ********************************************************************/
1085 static void init_sam_entry2(SAM_ENTRY2 * sam, uint32 user_idx,
1086 UNISTR2 *sam_name, UNISTR2 *sam_desc,
1087 uint32 rid_user, uint16 acb_info)
1089 DEBUG(5, ("init_sam_entry2\n"));
1091 sam->user_idx = user_idx;
1092 sam->rid_user = rid_user;
1093 sam->acb_info = acb_info;
1095 init_uni_hdr(&sam->hdr_srv_name, sam_name);
1096 init_uni_hdr(&sam->hdr_srv_desc, sam_desc);
1099 /*******************************************************************
1100 reads or writes a SAM_ENTRY2 structure.
1101 ********************************************************************/
1103 static BOOL sam_io_sam_entry2(const char *desc, SAM_ENTRY2 * sam,
1104 prs_struct *ps, int depth)
1106 if (sam == NULL)
1107 return False;
1109 prs_debug(ps, depth, desc, "sam_io_sam_entry2");
1110 depth++;
1112 if(!prs_align(ps))
1113 return False;
1115 if(!prs_uint32("user_idx ", ps, depth, &sam->user_idx))
1116 return False;
1118 if(!prs_uint32("rid_user ", ps, depth, &sam->rid_user))
1119 return False;
1120 if(!prs_uint16("acb_info ", ps, depth, &sam->acb_info))
1121 return False;
1123 if(!prs_align(ps))
1124 return False;
1126 if(!smb_io_unihdr("unihdr", &sam->hdr_srv_name, ps, depth)) /* account name unicode string header */
1127 return False;
1128 if(!smb_io_unihdr("unihdr", &sam->hdr_srv_desc, ps, depth)) /* account name unicode string header */
1129 return False;
1131 return True;
1134 /*******************************************************************
1135 reads or writes a SAM_STR3 structure.
1136 ********************************************************************/
1138 static BOOL sam_io_sam_str3(const char *desc, SAM_STR3 * sam, uint32 acct_buf,
1139 uint32 desc_buf, prs_struct *ps, int depth)
1141 if (sam == NULL)
1142 return False;
1144 prs_debug(ps, depth, desc, "sam_io_sam_str3");
1145 depth++;
1147 if(!prs_align(ps))
1148 return False;
1150 if(!smb_io_unistr2("uni_grp_name", &sam->uni_grp_name, acct_buf, ps, depth)) /* account name unicode string */
1151 return False;
1152 if(!smb_io_unistr2("uni_grp_desc", &sam->uni_grp_desc, desc_buf, ps, depth)) /* account desc unicode string */
1153 return False;
1155 return True;
1158 /*******************************************************************
1159 inits a SAM_ENTRY3 structure.
1160 ********************************************************************/
1162 static void init_sam_entry3(SAM_ENTRY3 * sam, uint32 grp_idx,
1163 UNISTR2 *grp_name, UNISTR2 *grp_desc,
1164 uint32 rid_grp)
1166 DEBUG(5, ("init_sam_entry3\n"));
1168 sam->grp_idx = grp_idx;
1169 sam->rid_grp = rid_grp;
1170 sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */
1172 init_uni_hdr(&sam->hdr_grp_name, grp_name);
1173 init_uni_hdr(&sam->hdr_grp_desc, grp_desc);
1176 /*******************************************************************
1177 reads or writes a SAM_ENTRY3 structure.
1178 ********************************************************************/
1180 static BOOL sam_io_sam_entry3(const char *desc, SAM_ENTRY3 * sam,
1181 prs_struct *ps, int depth)
1183 if (sam == NULL)
1184 return False;
1186 prs_debug(ps, depth, desc, "sam_io_sam_entry3");
1187 depth++;
1189 if(!prs_align(ps))
1190 return False;
1192 if(!prs_uint32("grp_idx", ps, depth, &sam->grp_idx))
1193 return False;
1195 if(!prs_uint32("rid_grp", ps, depth, &sam->rid_grp))
1196 return False;
1197 if(!prs_uint32("attr ", ps, depth, &sam->attr))
1198 return False;
1200 if(!smb_io_unihdr("unihdr", &sam->hdr_grp_name, ps, depth)) /* account name unicode string header */
1201 return False;
1202 if(!smb_io_unihdr("unihdr", &sam->hdr_grp_desc, ps, depth)) /* account name unicode string header */
1203 return False;
1205 return True;
1208 /*******************************************************************
1209 inits a SAM_ENTRY4 structure.
1210 ********************************************************************/
1212 static void init_sam_entry4(SAM_ENTRY4 * sam, uint32 user_idx,
1213 uint32 len_acct_name)
1215 DEBUG(5, ("init_sam_entry4\n"));
1217 sam->user_idx = user_idx;
1218 init_str_hdr(&sam->hdr_acct_name, len_acct_name+1, len_acct_name, len_acct_name != 0);
1221 /*******************************************************************
1222 reads or writes a SAM_ENTRY4 structure.
1223 ********************************************************************/
1225 static BOOL sam_io_sam_entry4(const char *desc, SAM_ENTRY4 * sam,
1226 prs_struct *ps, int depth)
1228 if (sam == NULL)
1229 return False;
1231 prs_debug(ps, depth, desc, "sam_io_sam_entry4");
1232 depth++;
1234 if(!prs_align(ps))
1235 return False;
1237 if(!prs_uint32("user_idx", ps, depth, &sam->user_idx))
1238 return False;
1239 if(!smb_io_strhdr("strhdr", &sam->hdr_acct_name, ps, depth))
1240 return False;
1242 return True;
1245 /*******************************************************************
1246 inits a SAM_ENTRY5 structure.
1247 ********************************************************************/
1249 static void init_sam_entry5(SAM_ENTRY5 * sam, uint32 grp_idx,
1250 uint32 len_grp_name)
1252 DEBUG(5, ("init_sam_entry5\n"));
1254 sam->grp_idx = grp_idx;
1255 init_str_hdr(&sam->hdr_grp_name, len_grp_name, len_grp_name,
1256 len_grp_name != 0);
1259 /*******************************************************************
1260 reads or writes a SAM_ENTRY5 structure.
1261 ********************************************************************/
1263 static BOOL sam_io_sam_entry5(const char *desc, SAM_ENTRY5 * sam,
1264 prs_struct *ps, int depth)
1266 if (sam == NULL)
1267 return False;
1269 prs_debug(ps, depth, desc, "sam_io_sam_entry5");
1270 depth++;
1272 if(!prs_align(ps))
1273 return False;
1275 if(!prs_uint32("grp_idx", ps, depth, &sam->grp_idx))
1276 return False;
1277 if(!smb_io_strhdr("strhdr", &sam->hdr_grp_name, ps, depth))
1278 return False;
1280 return True;
1283 /*******************************************************************
1284 inits a SAM_ENTRY structure.
1285 ********************************************************************/
1287 void init_sam_entry(SAM_ENTRY *sam, UNISTR2 *uni2, uint32 rid)
1289 DEBUG(10, ("init_sam_entry: %d\n", rid));
1291 sam->rid = rid;
1292 init_uni_hdr(&sam->hdr_name, uni2);
1295 /*******************************************************************
1296 reads or writes a SAM_ENTRY structure.
1297 ********************************************************************/
1299 static BOOL sam_io_sam_entry(const char *desc, SAM_ENTRY * sam,
1300 prs_struct *ps, int depth)
1302 if (sam == NULL)
1303 return False;
1305 prs_debug(ps, depth, desc, "sam_io_sam_entry");
1306 depth++;
1308 if(!prs_align(ps))
1309 return False;
1310 if(!prs_uint32("rid", ps, depth, &sam->rid))
1311 return False;
1312 if(!smb_io_unihdr("unihdr", &sam->hdr_name, ps, depth)) /* account name unicode string header */
1313 return False;
1315 return True;
1318 /*******************************************************************
1319 inits a SAMR_Q_ENUM_DOM_USERS structure.
1320 ********************************************************************/
1322 void init_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS * q_e, POLICY_HND *pol,
1323 uint32 start_idx,
1324 uint16 acb_mask, uint16 unk_1, uint32 size)
1326 DEBUG(5, ("init_samr_q_enum_dom_users\n"));
1328 q_e->pol = *pol;
1330 q_e->start_idx = start_idx; /* zero indicates lots */
1331 q_e->acb_mask = acb_mask;
1332 q_e->unknown_1 = unk_1;
1333 q_e->max_size = size;
1336 /*******************************************************************
1337 reads or writes a structure.
1338 ********************************************************************/
1340 BOOL samr_io_q_enum_dom_users(const char *desc, SAMR_Q_ENUM_DOM_USERS * q_e,
1341 prs_struct *ps, int depth)
1343 if (q_e == NULL)
1344 return False;
1346 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_users");
1347 depth++;
1349 if(!prs_align(ps))
1350 return False;
1352 if(!smb_io_pol_hnd("domain_pol", &q_e->pol, ps, depth))
1353 return False;
1355 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
1356 return False;
1357 if(!prs_uint16("acb_mask ", ps, depth, &q_e->acb_mask))
1358 return False;
1359 if(!prs_uint16("unknown_1", ps, depth, &q_e->unknown_1))
1360 return False;
1362 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1363 return False;
1365 return True;
1369 /*******************************************************************
1370 inits a SAMR_R_ENUM_DOM_USERS structure.
1371 ********************************************************************/
1373 void init_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS * r_u,
1374 uint32 next_idx, uint32 num_sam_entries)
1376 DEBUG(5, ("init_samr_r_enum_dom_users\n"));
1378 r_u->next_idx = next_idx;
1380 if (num_sam_entries != 0) {
1381 r_u->ptr_entries1 = 1;
1382 r_u->ptr_entries2 = 1;
1383 r_u->num_entries2 = num_sam_entries;
1384 r_u->num_entries3 = num_sam_entries;
1386 r_u->num_entries4 = num_sam_entries;
1387 } else {
1388 r_u->ptr_entries1 = 0;
1389 r_u->num_entries2 = num_sam_entries;
1390 r_u->ptr_entries2 = 1;
1394 /*******************************************************************
1395 reads or writes a structure.
1396 ********************************************************************/
1398 BOOL samr_io_r_enum_dom_users(const char *desc, SAMR_R_ENUM_DOM_USERS * r_u,
1399 prs_struct *ps, int depth)
1401 uint32 i;
1403 if (r_u == NULL)
1404 return False;
1406 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_users");
1407 depth++;
1409 if(!prs_align(ps))
1410 return False;
1412 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
1413 return False;
1414 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
1415 return False;
1417 if (r_u->ptr_entries1 != 0) {
1418 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
1419 return False;
1420 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
1421 return False;
1422 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
1423 return False;
1425 if (UNMARSHALLING(ps) && (r_u->num_entries2 != 0)) {
1426 r_u->sam = PRS_ALLOC_MEM(ps,SAM_ENTRY, r_u->num_entries2);
1427 r_u->uni_acct_name = PRS_ALLOC_MEM(ps,UNISTR2, r_u->num_entries2);
1430 if ((r_u->sam == NULL || r_u->uni_acct_name == NULL) && r_u->num_entries2 != 0) {
1431 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_USERS\n"));
1432 r_u->num_entries4 = 0;
1433 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
1434 return False;
1437 for (i = 0; i < r_u->num_entries2; i++) {
1438 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
1439 return False;
1442 for (i = 0; i < r_u->num_entries2; i++) {
1443 if(!smb_io_unistr2("", &r_u->uni_acct_name[i],r_u->sam[i].hdr_name.buffer, ps,depth))
1444 return False;
1449 if(!prs_align(ps))
1450 return False;
1452 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
1453 return False;
1454 if(!prs_ntstatus("status", ps, depth, &r_u->status))
1455 return False;
1457 return True;
1460 /*******************************************************************
1461 inits a SAMR_Q_QUERY_DISPINFO structure.
1462 ********************************************************************/
1464 void init_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO * q_e, POLICY_HND *pol,
1465 uint16 switch_level, uint32 start_idx,
1466 uint32 max_entries, uint32 max_size)
1468 DEBUG(5, ("init_samr_q_query_dispinfo\n"));
1470 q_e->domain_pol = *pol;
1472 q_e->switch_level = switch_level;
1474 q_e->start_idx = start_idx;
1475 q_e->max_entries = max_entries;
1476 q_e->max_size = max_size;
1479 /*******************************************************************
1480 reads or writes a structure.
1481 ********************************************************************/
1483 BOOL samr_io_q_query_dispinfo(const char *desc, SAMR_Q_QUERY_DISPINFO * q_e,
1484 prs_struct *ps, int depth)
1486 if (q_e == NULL)
1487 return False;
1489 prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo");
1490 depth++;
1492 if(!prs_align(ps))
1493 return False;
1495 if(!smb_io_pol_hnd("domain_pol", &q_e->domain_pol, ps, depth))
1496 return False;
1498 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
1499 return False;
1500 if(!prs_align(ps))
1501 return False;
1503 if(!prs_uint32("start_idx ", ps, depth, &q_e->start_idx))
1504 return False;
1505 if(!prs_uint32("max_entries ", ps, depth, &q_e->max_entries))
1506 return False;
1507 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1508 return False;
1510 return True;
1513 /*******************************************************************
1514 inits a SAM_DISPINFO_1 structure.
1515 ********************************************************************/
1517 NTSTATUS init_sam_dispinfo_1(TALLOC_CTX *ctx, SAM_DISPINFO_1 **sam,
1518 uint32 num_entries, uint32 start_idx,
1519 struct samr_displayentry *entries)
1521 uint32 i;
1523 DEBUG(10, ("init_sam_dispinfo_1: num_entries: %d\n", num_entries));
1525 if (num_entries==0)
1526 return NT_STATUS_OK;
1528 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_1, num_entries);
1529 if (*sam == NULL)
1530 return NT_STATUS_NO_MEMORY;
1532 (*sam)->sam=TALLOC_ARRAY(ctx, SAM_ENTRY1, num_entries);
1533 if ((*sam)->sam == NULL)
1534 return NT_STATUS_NO_MEMORY;
1536 (*sam)->str=TALLOC_ARRAY(ctx, SAM_STR1, num_entries);
1537 if ((*sam)->str == NULL)
1538 return NT_STATUS_NO_MEMORY;
1540 for (i = 0; i < num_entries ; i++) {
1541 init_unistr2(&(*sam)->str[i].uni_acct_name,
1542 entries[i].account_name, UNI_FLAGS_NONE);
1543 init_unistr2(&(*sam)->str[i].uni_full_name,
1544 entries[i].fullname, UNI_FLAGS_NONE);
1545 init_unistr2(&(*sam)->str[i].uni_acct_desc,
1546 entries[i].description, UNI_FLAGS_NONE);
1548 init_sam_entry1(&(*sam)->sam[i], start_idx+i+1,
1549 &(*sam)->str[i].uni_acct_name,
1550 &(*sam)->str[i].uni_full_name,
1551 &(*sam)->str[i].uni_acct_desc,
1552 entries[i].rid, entries[i].acct_flags);
1555 return NT_STATUS_OK;
1558 /*******************************************************************
1559 reads or writes a structure.
1560 ********************************************************************/
1562 static BOOL sam_io_sam_dispinfo_1(const char *desc, SAM_DISPINFO_1 * sam,
1563 uint32 num_entries,
1564 prs_struct *ps, int depth)
1566 uint32 i;
1568 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_1");
1569 depth++;
1571 if(!prs_align(ps))
1572 return False;
1574 if (UNMARSHALLING(ps) && num_entries > 0) {
1576 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY1, num_entries)) == NULL) {
1577 DEBUG(0, ("out of memory allocating SAM_ENTRY1\n"));
1578 return False;
1581 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR1, num_entries)) == NULL) {
1582 DEBUG(0, ("out of memory allocating SAM_STR1\n"));
1583 return False;
1587 for (i = 0; i < num_entries; i++) {
1588 if(!sam_io_sam_entry1("", &sam->sam[i], ps, depth))
1589 return False;
1592 for (i = 0; i < num_entries; i++) {
1593 if(!sam_io_sam_str1("", &sam->str[i],
1594 sam->sam[i].hdr_acct_name.buffer,
1595 sam->sam[i].hdr_user_name.buffer,
1596 sam->sam[i].hdr_user_desc.buffer, ps, depth))
1597 return False;
1600 return True;
1603 /*******************************************************************
1604 inits a SAM_DISPINFO_2 structure.
1605 ********************************************************************/
1607 NTSTATUS init_sam_dispinfo_2(TALLOC_CTX *ctx, SAM_DISPINFO_2 **sam,
1608 uint32 num_entries, uint32 start_idx,
1609 struct samr_displayentry *entries)
1611 uint32 i;
1613 DEBUG(10, ("init_sam_dispinfo_2: num_entries: %d\n", num_entries));
1615 if (num_entries==0)
1616 return NT_STATUS_OK;
1618 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_2, num_entries);
1619 if (*sam == NULL)
1620 return NT_STATUS_NO_MEMORY;
1622 (*sam)->sam = TALLOC_ARRAY(ctx, SAM_ENTRY2, num_entries);
1623 if ((*sam)->sam == NULL)
1624 return NT_STATUS_NO_MEMORY;
1626 (*sam)->str=TALLOC_ARRAY(ctx, SAM_STR2, num_entries);
1627 if ((*sam)->str == NULL)
1628 return NT_STATUS_NO_MEMORY;
1630 for (i = 0; i < num_entries; i++) {
1631 init_unistr2(&(*sam)->str[i].uni_srv_name,
1632 entries[i].account_name, UNI_FLAGS_NONE);
1633 init_unistr2(&(*sam)->str[i].uni_srv_desc,
1634 entries[i].description, UNI_FLAGS_NONE);
1636 init_sam_entry2(&(*sam)->sam[i], start_idx + i + 1,
1637 &(*sam)->str[i].uni_srv_name,
1638 &(*sam)->str[i].uni_srv_desc,
1639 entries[i].rid, entries[i].acct_flags);
1642 return NT_STATUS_OK;
1645 /*******************************************************************
1646 reads or writes a structure.
1647 ********************************************************************/
1649 static BOOL sam_io_sam_dispinfo_2(const char *desc, SAM_DISPINFO_2 * sam,
1650 uint32 num_entries,
1651 prs_struct *ps, int depth)
1653 uint32 i;
1655 if (sam == NULL)
1656 return False;
1658 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_2");
1659 depth++;
1661 if(!prs_align(ps))
1662 return False;
1664 if (UNMARSHALLING(ps) && num_entries > 0) {
1666 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY2, num_entries)) == NULL) {
1667 DEBUG(0, ("out of memory allocating SAM_ENTRY2\n"));
1668 return False;
1671 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR2, num_entries)) == NULL) {
1672 DEBUG(0, ("out of memory allocating SAM_STR2\n"));
1673 return False;
1677 for (i = 0; i < num_entries; i++) {
1678 if(!sam_io_sam_entry2("", &sam->sam[i], ps, depth))
1679 return False;
1682 for (i = 0; i < num_entries; i++) {
1683 if(!sam_io_sam_str2("", &sam->str[i],
1684 sam->sam[i].hdr_srv_name.buffer,
1685 sam->sam[i].hdr_srv_desc.buffer, ps, depth))
1686 return False;
1689 return True;
1692 /*******************************************************************
1693 inits a SAM_DISPINFO_3 structure.
1694 ********************************************************************/
1696 NTSTATUS init_sam_dispinfo_3(TALLOC_CTX *ctx, SAM_DISPINFO_3 **sam,
1697 uint32 num_entries, uint32 start_idx,
1698 struct samr_displayentry *entries)
1700 uint32 i;
1702 DEBUG(5, ("init_sam_dispinfo_3: num_entries: %d\n", num_entries));
1704 if (num_entries==0)
1705 return NT_STATUS_OK;
1707 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_3, num_entries);
1708 if (*sam == NULL)
1709 return NT_STATUS_NO_MEMORY;
1711 if (!((*sam)->sam=TALLOC_ARRAY(ctx, SAM_ENTRY3, num_entries)))
1712 return NT_STATUS_NO_MEMORY;
1714 if (!((*sam)->str=TALLOC_ARRAY(ctx, SAM_STR3, num_entries)))
1715 return NT_STATUS_NO_MEMORY;
1717 for (i = 0; i < num_entries; i++) {
1718 DEBUG(11, ("init_sam_dispinfo_3: entry: %d\n",i));
1720 init_unistr2(&(*sam)->str[i].uni_grp_name,
1721 entries[i].account_name, UNI_FLAGS_NONE);
1722 init_unistr2(&(*sam)->str[i].uni_grp_desc,
1723 entries[i].description, UNI_FLAGS_NONE);
1725 init_sam_entry3(&(*sam)->sam[i], start_idx+i+1,
1726 &(*sam)->str[i].uni_grp_name,
1727 &(*sam)->str[i].uni_grp_desc,
1728 entries[i].rid);
1731 return NT_STATUS_OK;
1734 /*******************************************************************
1735 reads or writes a structure.
1736 ********************************************************************/
1738 static BOOL sam_io_sam_dispinfo_3(const char *desc, SAM_DISPINFO_3 * sam,
1739 uint32 num_entries,
1740 prs_struct *ps, int depth)
1742 uint32 i;
1744 if (sam == NULL)
1745 return False;
1747 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_3");
1748 depth++;
1750 if(!prs_align(ps))
1751 return False;
1753 if (UNMARSHALLING(ps) && num_entries > 0) {
1755 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY3, num_entries)) == NULL) {
1756 DEBUG(0, ("out of memory allocating SAM_ENTRY3\n"));
1757 return False;
1760 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR3, num_entries)) == NULL) {
1761 DEBUG(0, ("out of memory allocating SAM_STR3\n"));
1762 return False;
1766 for (i = 0; i < num_entries; i++) {
1767 if(!sam_io_sam_entry3("", &sam->sam[i], ps, depth))
1768 return False;
1771 for (i = 0; i < num_entries; i++) {
1772 if(!sam_io_sam_str3("", &sam->str[i],
1773 sam->sam[i].hdr_grp_name.buffer,
1774 sam->sam[i].hdr_grp_desc.buffer, ps, depth))
1775 return False;
1778 return True;
1781 /*******************************************************************
1782 inits a SAM_DISPINFO_4 structure.
1783 ********************************************************************/
1785 NTSTATUS init_sam_dispinfo_4(TALLOC_CTX *ctx, SAM_DISPINFO_4 **sam,
1786 uint32 num_entries, uint32 start_idx,
1787 struct samr_displayentry *entries)
1789 uint32 i;
1791 DEBUG(5, ("init_sam_dispinfo_4: num_entries: %d\n", num_entries));
1793 if (num_entries==0)
1794 return NT_STATUS_OK;
1796 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_4, num_entries);
1797 if (*sam == NULL)
1798 return NT_STATUS_NO_MEMORY;
1800 (*sam)->sam = TALLOC_ARRAY(ctx, SAM_ENTRY4, num_entries);
1801 if ((*sam)->sam == NULL)
1802 return NT_STATUS_NO_MEMORY;
1804 (*sam)->str=TALLOC_ARRAY(ctx, SAM_STR4, num_entries);
1805 if ((*sam)->str == NULL)
1806 return NT_STATUS_NO_MEMORY;
1808 for (i = 0; i < num_entries; i++) {
1809 size_t len_sam_name = strlen(entries[i].account_name);
1811 DEBUG(11, ("init_sam_dispinfo_2: entry: %d\n",i));
1813 init_sam_entry4(&(*sam)->sam[i], start_idx + i + 1,
1814 len_sam_name);
1816 init_string2(&(*sam)->str[i].acct_name,
1817 entries[i].account_name, len_sam_name+1,
1818 len_sam_name);
1821 return NT_STATUS_OK;
1824 /*******************************************************************
1825 reads or writes a structure.
1826 ********************************************************************/
1828 static BOOL sam_io_sam_dispinfo_4(const char *desc, SAM_DISPINFO_4 * sam,
1829 uint32 num_entries,
1830 prs_struct *ps, int depth)
1832 uint32 i;
1834 if (sam == NULL)
1835 return False;
1837 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_4");
1838 depth++;
1840 if(!prs_align(ps))
1841 return False;
1843 if (UNMARSHALLING(ps) && num_entries > 0) {
1845 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY4, num_entries)) == NULL) {
1846 DEBUG(0, ("out of memory allocating SAM_ENTRY4\n"));
1847 return False;
1850 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR4, num_entries)) == NULL) {
1851 DEBUG(0, ("out of memory allocating SAM_STR4\n"));
1852 return False;
1856 for (i = 0; i < num_entries; i++) {
1857 if(!sam_io_sam_entry4("", &sam->sam[i], ps, depth))
1858 return False;
1861 for (i = 0; i < num_entries; i++) {
1862 if(!smb_io_string2("acct_name", &sam->str[i].acct_name,
1863 sam->sam[i].hdr_acct_name.buffer, ps, depth))
1864 return False;
1867 return True;
1870 /*******************************************************************
1871 inits a SAM_DISPINFO_5 structure.
1872 ********************************************************************/
1874 NTSTATUS init_sam_dispinfo_5(TALLOC_CTX *ctx, SAM_DISPINFO_5 **sam,
1875 uint32 num_entries, uint32 start_idx,
1876 struct samr_displayentry *entries)
1878 uint32 len_sam_name;
1879 uint32 i;
1881 DEBUG(5, ("init_sam_dispinfo_5: num_entries: %d\n", num_entries));
1883 if (num_entries==0)
1884 return NT_STATUS_OK;
1886 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_5, num_entries);
1887 if (*sam == NULL)
1888 return NT_STATUS_NO_MEMORY;
1890 if (!((*sam)->sam=TALLOC_ARRAY(ctx, SAM_ENTRY5, num_entries)))
1891 return NT_STATUS_NO_MEMORY;
1893 if (!((*sam)->str=TALLOC_ARRAY(ctx, SAM_STR5, num_entries)))
1894 return NT_STATUS_NO_MEMORY;
1896 for (i = 0; i < num_entries; i++) {
1897 DEBUG(11, ("init_sam_dispinfo_5: entry: %d\n",i));
1899 len_sam_name = strlen(entries[i].account_name);
1901 init_sam_entry5(&(*sam)->sam[i], start_idx+i+1, len_sam_name);
1902 init_string2(&(*sam)->str[i].grp_name, entries[i].account_name,
1903 len_sam_name+1, len_sam_name);
1906 return NT_STATUS_OK;
1909 /*******************************************************************
1910 reads or writes a structure.
1911 ********************************************************************/
1913 static BOOL sam_io_sam_dispinfo_5(const char *desc, SAM_DISPINFO_5 * sam,
1914 uint32 num_entries,
1915 prs_struct *ps, int depth)
1917 uint32 i;
1919 if (sam == NULL)
1920 return False;
1922 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_5");
1923 depth++;
1925 if(!prs_align(ps))
1926 return False;
1928 if (UNMARSHALLING(ps) && num_entries > 0) {
1930 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY5, num_entries)) == NULL) {
1931 DEBUG(0, ("out of memory allocating SAM_ENTRY5\n"));
1932 return False;
1935 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR5, num_entries)) == NULL) {
1936 DEBUG(0, ("out of memory allocating SAM_STR5\n"));
1937 return False;
1941 for (i = 0; i < num_entries; i++) {
1942 if(!sam_io_sam_entry5("", &sam->sam[i], ps, depth))
1943 return False;
1946 for (i = 0; i < num_entries; i++) {
1947 if(!smb_io_string2("grp_name", &sam->str[i].grp_name,
1948 sam->sam[i].hdr_grp_name.buffer, ps, depth))
1949 return False;
1952 return True;
1955 /*******************************************************************
1956 inits a SAMR_R_QUERY_DISPINFO structure.
1957 ********************************************************************/
1959 void init_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO * r_u,
1960 uint32 num_entries, uint32 total_size, uint32 data_size,
1961 uint16 switch_level, SAM_DISPINFO_CTR * ctr,
1962 NTSTATUS status)
1964 DEBUG(5, ("init_samr_r_query_dispinfo: level %d\n", switch_level));
1966 r_u->total_size = total_size;
1968 r_u->data_size = data_size;
1970 r_u->switch_level = switch_level;
1971 r_u->num_entries = num_entries;
1973 if (num_entries==0)
1974 r_u->ptr_entries = 0;
1975 else
1976 r_u->ptr_entries = 1;
1978 r_u->num_entries2 = num_entries;
1979 r_u->ctr = ctr;
1981 r_u->status = status;
1984 /*******************************************************************
1985 reads or writes a structure.
1986 ********************************************************************/
1988 BOOL samr_io_r_query_dispinfo(const char *desc, SAMR_R_QUERY_DISPINFO * r_u,
1989 prs_struct *ps, int depth)
1991 if (r_u == NULL)
1992 return False;
1994 prs_debug(ps, depth, desc, "samr_io_r_query_dispinfo");
1995 depth++;
1997 if(!prs_align(ps))
1998 return False;
2000 if(!prs_uint32("total_size ", ps, depth, &r_u->total_size))
2001 return False;
2002 if(!prs_uint32("data_size ", ps, depth, &r_u->data_size))
2003 return False;
2004 if(!prs_uint16("switch_level", ps, depth, &r_u->switch_level))
2005 return False;
2006 if(!prs_align(ps))
2007 return False;
2009 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
2010 return False;
2011 if(!prs_uint32("ptr_entries ", ps, depth, &r_u->ptr_entries))
2012 return False;
2014 if (r_u->ptr_entries==0) {
2015 if(!prs_align(ps))
2016 return False;
2017 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2018 return False;
2020 return True;
2023 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
2024 return False;
2026 switch (r_u->switch_level) {
2027 case 0x1:
2028 if(!sam_io_sam_dispinfo_1("users", r_u->ctr->sam.info1,
2029 r_u->num_entries, ps, depth))
2030 return False;
2031 break;
2032 case 0x2:
2033 if(!sam_io_sam_dispinfo_2("servers", r_u->ctr->sam.info2,
2034 r_u->num_entries, ps, depth))
2035 return False;
2036 break;
2037 case 0x3:
2038 if(!sam_io_sam_dispinfo_3("groups", r_u->ctr->sam.info3,
2039 r_u->num_entries, ps, depth))
2040 return False;
2041 break;
2042 case 0x4:
2043 if(!sam_io_sam_dispinfo_4("user list",
2044 r_u->ctr->sam.info4,
2045 r_u->num_entries, ps, depth))
2046 return False;
2047 break;
2048 case 0x5:
2049 if(!sam_io_sam_dispinfo_5("group list",
2050 r_u->ctr->sam.info5,
2051 r_u->num_entries, ps, depth))
2052 return False;
2053 break;
2054 default:
2055 DEBUG(0,("samr_io_r_query_dispinfo: unknown switch value\n"));
2056 break;
2059 if(!prs_align(ps))
2060 return False;
2061 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2062 return False;
2064 return True;
2067 /*******************************************************************
2068 inits a SAMR_Q_OPEN_GROUP structure.
2069 ********************************************************************/
2071 void init_samr_q_open_group(SAMR_Q_OPEN_GROUP * q_c,
2072 POLICY_HND *hnd,
2073 uint32 access_mask, uint32 rid)
2075 DEBUG(5, ("init_samr_q_open_group\n"));
2077 q_c->domain_pol = *hnd;
2078 q_c->access_mask = access_mask;
2079 q_c->rid_group = rid;
2082 /*******************************************************************
2083 reads or writes a structure.
2084 ********************************************************************/
2086 BOOL samr_io_q_open_group(const char *desc, SAMR_Q_OPEN_GROUP * q_u,
2087 prs_struct *ps, int depth)
2089 if (q_u == NULL)
2090 return False;
2092 prs_debug(ps, depth, desc, "samr_io_q_open_group");
2093 depth++;
2095 if(!prs_align(ps))
2096 return False;
2098 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
2099 return False;
2101 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
2102 return False;
2103 if(!prs_uint32("rid_group", ps, depth, &q_u->rid_group))
2104 return False;
2106 return True;
2109 /*******************************************************************
2110 reads or writes a structure.
2111 ********************************************************************/
2113 BOOL samr_io_r_open_group(const char *desc, SAMR_R_OPEN_GROUP * r_u,
2114 prs_struct *ps, int depth)
2116 if (r_u == NULL)
2117 return False;
2119 prs_debug(ps, depth, desc, "samr_io_r_open_group");
2120 depth++;
2122 if(!prs_align(ps))
2123 return False;
2125 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2126 return False;
2128 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2129 return False;
2131 return True;
2134 /*******************************************************************
2135 inits a GROUP_INFO1 structure.
2136 ********************************************************************/
2138 void init_samr_group_info1(GROUP_INFO1 * gr1,
2139 char *acct_name, char *acct_desc,
2140 uint32 num_members)
2142 DEBUG(5, ("init_samr_group_info1\n"));
2144 gr1->group_attr = (SE_GROUP_MANDATORY|SE_GROUP_ENABLED_BY_DEFAULT); /* why not | SE_GROUP_ENABLED ? */
2145 gr1->num_members = num_members;
2147 init_unistr2(&gr1->uni_acct_name, acct_name, UNI_FLAGS_NONE);
2148 init_uni_hdr(&gr1->hdr_acct_name, &gr1->uni_acct_name);
2149 init_unistr2(&gr1->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2150 init_uni_hdr(&gr1->hdr_acct_desc, &gr1->uni_acct_desc);
2153 /*******************************************************************
2154 reads or writes a structure.
2155 ********************************************************************/
2157 BOOL samr_io_group_info1(const char *desc, GROUP_INFO1 * gr1,
2158 prs_struct *ps, int depth)
2160 uint16 dummy = 1;
2162 if (gr1 == NULL)
2163 return False;
2165 prs_debug(ps, depth, desc, "samr_io_group_info1");
2166 depth++;
2168 if(!prs_uint16("level", ps, depth, &dummy))
2169 return False;
2171 if(!prs_align(ps))
2172 return False;
2174 if(!smb_io_unihdr("hdr_acct_name", &gr1->hdr_acct_name, ps, depth))
2175 return False;
2177 if(!prs_uint32("group_attr", ps, depth, &gr1->group_attr))
2178 return False;
2179 if(!prs_uint32("num_members", ps, depth, &gr1->num_members))
2180 return False;
2182 if(!smb_io_unihdr("hdr_acct_desc", &gr1->hdr_acct_desc, ps, depth))
2183 return False;
2185 if(!smb_io_unistr2("uni_acct_name", &gr1->uni_acct_name,
2186 gr1->hdr_acct_name.buffer, ps, depth))
2187 return False;
2189 if(!smb_io_unistr2("uni_acct_desc", &gr1->uni_acct_desc,
2190 gr1->hdr_acct_desc.buffer, ps, depth))
2191 return False;
2193 return True;
2196 /*******************************************************************
2197 inits a GROUP_INFO2 structure.
2198 ********************************************************************/
2200 void init_samr_group_info2(GROUP_INFO2 * gr2, const char *acct_name)
2202 DEBUG(5, ("init_samr_group_info2\n"));
2204 gr2->level = 2;
2205 init_unistr2(&gr2->uni_acct_name, acct_name, UNI_FLAGS_NONE);
2206 init_uni_hdr(&gr2->hdr_acct_name, &gr2->uni_acct_name);
2209 /*******************************************************************
2210 reads or writes a structure.
2211 ********************************************************************/
2213 BOOL samr_io_group_info2(const char *desc, GROUP_INFO2 *gr2, prs_struct *ps, int depth)
2215 if (gr2 == NULL)
2216 return False;
2218 prs_debug(ps, depth, desc, "samr_io_group_info2");
2219 depth++;
2221 if(!prs_uint16("hdr_level", ps, depth, &gr2->level))
2222 return False;
2224 if(!smb_io_unihdr("hdr_acct_name", &gr2->hdr_acct_name, ps, depth))
2225 return False;
2226 if(!smb_io_unistr2("uni_acct_name", &gr2->uni_acct_name,
2227 gr2->hdr_acct_name.buffer, ps, depth))
2228 return False;
2230 return True;
2233 /*******************************************************************
2234 inits a GROUP_INFO3 structure.
2235 ********************************************************************/
2237 void init_samr_group_info3(GROUP_INFO3 *gr3)
2239 DEBUG(5, ("init_samr_group_info3\n"));
2241 gr3->group_attr = (SE_GROUP_MANDATORY|SE_GROUP_ENABLED_BY_DEFAULT); /* why not | SE_GROUP_ENABLED ? */
2244 /*******************************************************************
2245 reads or writes a structure.
2246 ********************************************************************/
2248 BOOL samr_io_group_info3(const char *desc, GROUP_INFO3 *gr3, prs_struct *ps, int depth)
2250 if (gr3 == NULL)
2251 return False;
2253 prs_debug(ps, depth, desc, "samr_io_group_info3");
2254 depth++;
2256 if(!prs_align(ps))
2257 return False;
2259 if(!prs_uint32("group_attr", ps, depth, &gr3->group_attr))
2260 return False;
2262 return True;
2265 /*******************************************************************
2266 inits a GROUP_INFO4 structure.
2267 ********************************************************************/
2269 void init_samr_group_info4(GROUP_INFO4 * gr4, const char *acct_desc)
2271 DEBUG(5, ("init_samr_group_info4\n"));
2273 gr4->level = 4;
2274 init_unistr2(&gr4->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2275 init_uni_hdr(&gr4->hdr_acct_desc, &gr4->uni_acct_desc);
2278 /*******************************************************************
2279 reads or writes a structure.
2280 ********************************************************************/
2282 BOOL samr_io_group_info4(const char *desc, GROUP_INFO4 * gr4,
2283 prs_struct *ps, int depth)
2285 if (gr4 == NULL)
2286 return False;
2288 prs_debug(ps, depth, desc, "samr_io_group_info4");
2289 depth++;
2291 if(!prs_uint16("hdr_level", ps, depth, &gr4->level))
2292 return False;
2293 if(!smb_io_unihdr("hdr_acct_desc", &gr4->hdr_acct_desc, ps, depth))
2294 return False;
2295 if(!smb_io_unistr2("uni_acct_desc", &gr4->uni_acct_desc,
2296 gr4->hdr_acct_desc.buffer, ps, depth))
2297 return False;
2299 return True;
2302 /*******************************************************************
2303 reads or writes a structure.
2304 ********************************************************************/
2306 static BOOL samr_group_info_ctr(const char *desc, GROUP_INFO_CTR **ctr,
2307 prs_struct *ps, int depth)
2309 if (UNMARSHALLING(ps))
2310 *ctr = PRS_ALLOC_MEM(ps,GROUP_INFO_CTR,1);
2312 if (*ctr == NULL)
2313 return False;
2315 prs_debug(ps, depth, desc, "samr_group_info_ctr");
2316 depth++;
2318 if(!prs_uint16("switch_value1", ps, depth, &(*ctr)->switch_value1))
2319 return False;
2321 switch ((*ctr)->switch_value1) {
2322 case 1:
2323 if(!samr_io_group_info1("group_info1", &(*ctr)->group.info1, ps, depth))
2324 return False;
2325 break;
2326 case 2:
2327 if(!samr_io_group_info2("group_info2", &(*ctr)->group.info2, ps, depth))
2328 return False;
2329 break;
2330 case 3:
2331 if(!samr_io_group_info3("group_info3", &(*ctr)->group.info3, ps, depth))
2332 return False;
2333 break;
2334 case 4:
2335 if(!samr_io_group_info4("group_info4", &(*ctr)->group.info4, ps, depth))
2336 return False;
2337 break;
2338 default:
2339 DEBUG(0,("samr_group_info_ctr: unsupported switch level\n"));
2340 break;
2343 return True;
2346 /*******************************************************************
2347 inits a SAMR_Q_CREATE_DOM_GROUP structure.
2348 ********************************************************************/
2350 void init_samr_q_create_dom_group(SAMR_Q_CREATE_DOM_GROUP * q_e,
2351 POLICY_HND *pol, const char *acct_desc,
2352 uint32 access_mask)
2354 DEBUG(5, ("init_samr_q_create_dom_group\n"));
2356 q_e->pol = *pol;
2358 init_unistr2(&q_e->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2359 init_uni_hdr(&q_e->hdr_acct_desc, &q_e->uni_acct_desc);
2361 q_e->access_mask = access_mask;
2364 /*******************************************************************
2365 reads or writes a structure.
2366 ********************************************************************/
2368 BOOL samr_io_q_create_dom_group(const char *desc, SAMR_Q_CREATE_DOM_GROUP * q_e,
2369 prs_struct *ps, int depth)
2371 if (q_e == NULL)
2372 return False;
2374 prs_debug(ps, depth, desc, "samr_io_q_create_dom_group");
2375 depth++;
2377 if(!prs_align(ps))
2378 return False;
2380 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2381 return False;
2383 if(!smb_io_unihdr("hdr_acct_desc", &q_e->hdr_acct_desc, ps, depth))
2384 return False;
2385 if(!smb_io_unistr2("uni_acct_desc", &q_e->uni_acct_desc,
2386 q_e->hdr_acct_desc.buffer, ps, depth))
2387 return False;
2389 if(!prs_align(ps))
2390 return False;
2391 if(!prs_uint32("access", ps, depth, &q_e->access_mask))
2392 return False;
2394 return True;
2397 /*******************************************************************
2398 reads or writes a structure.
2399 ********************************************************************/
2401 BOOL samr_io_r_create_dom_group(const char *desc, SAMR_R_CREATE_DOM_GROUP * r_u,
2402 prs_struct *ps, int depth)
2404 if (r_u == NULL)
2405 return False;
2407 prs_debug(ps, depth, desc, "samr_io_r_create_dom_group");
2408 depth++;
2410 if(!prs_align(ps))
2411 return False;
2413 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2414 return False;
2416 if(!prs_uint32("rid ", ps, depth, &r_u->rid))
2417 return False;
2418 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2419 return False;
2421 return True;
2424 /*******************************************************************
2425 inits a SAMR_Q_DELETE_DOM_GROUP structure.
2426 ********************************************************************/
2428 void init_samr_q_delete_dom_group(SAMR_Q_DELETE_DOM_GROUP * q_c,
2429 POLICY_HND *hnd)
2431 DEBUG(5, ("init_samr_q_delete_dom_group\n"));
2433 q_c->group_pol = *hnd;
2436 /*******************************************************************
2437 reads or writes a structure.
2438 ********************************************************************/
2440 BOOL samr_io_q_delete_dom_group(const char *desc, SAMR_Q_DELETE_DOM_GROUP * q_u,
2441 prs_struct *ps, int depth)
2443 if (q_u == NULL)
2444 return False;
2446 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_group");
2447 depth++;
2449 if(!prs_align(ps))
2450 return False;
2452 if(!smb_io_pol_hnd("group_pol", &q_u->group_pol, ps, depth))
2453 return False;
2455 return True;
2458 /*******************************************************************
2459 reads or writes a structure.
2460 ********************************************************************/
2462 BOOL samr_io_r_delete_dom_group(const char *desc, SAMR_R_DELETE_DOM_GROUP * r_u,
2463 prs_struct *ps, int depth)
2465 if (r_u == NULL)
2466 return False;
2468 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_group");
2469 depth++;
2471 if(!prs_align(ps))
2472 return False;
2474 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2475 return False;
2477 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2478 return False;
2480 return True;
2483 /*******************************************************************
2484 inits a SAMR_Q_DEL_GROUPMEM structure.
2485 ********************************************************************/
2487 void init_samr_q_del_groupmem(SAMR_Q_DEL_GROUPMEM * q_e,
2488 POLICY_HND *pol, uint32 rid)
2490 DEBUG(5, ("init_samr_q_del_groupmem\n"));
2492 q_e->pol = *pol;
2493 q_e->rid = rid;
2496 /*******************************************************************
2497 reads or writes a structure.
2498 ********************************************************************/
2500 BOOL samr_io_q_del_groupmem(const char *desc, SAMR_Q_DEL_GROUPMEM * q_e,
2501 prs_struct *ps, int depth)
2503 if (q_e == NULL)
2504 return False;
2506 prs_debug(ps, depth, desc, "samr_io_q_del_groupmem");
2507 depth++;
2509 if(!prs_align(ps))
2510 return False;
2512 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2513 return False;
2515 if(!prs_uint32("rid", ps, depth, &q_e->rid))
2516 return False;
2518 return True;
2521 /*******************************************************************
2522 inits a SAMR_R_DEL_GROUPMEM structure.
2523 ********************************************************************/
2525 void init_samr_r_del_groupmem(SAMR_R_DEL_GROUPMEM * r_u, POLICY_HND *pol,
2526 NTSTATUS status)
2528 DEBUG(5, ("init_samr_r_del_groupmem\n"));
2530 r_u->status = status;
2533 /*******************************************************************
2534 reads or writes a structure.
2535 ********************************************************************/
2537 BOOL samr_io_r_del_groupmem(const char *desc, SAMR_R_DEL_GROUPMEM * r_u,
2538 prs_struct *ps, int depth)
2540 if (r_u == NULL)
2541 return False;
2543 prs_debug(ps, depth, desc, "samr_io_r_del_groupmem");
2544 depth++;
2546 if(!prs_align(ps))
2547 return False;
2549 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2550 return False;
2552 return True;
2555 /*******************************************************************
2556 inits a SAMR_Q_ADD_GROUPMEM structure.
2557 ********************************************************************/
2559 void init_samr_q_add_groupmem(SAMR_Q_ADD_GROUPMEM * q_e,
2560 POLICY_HND *pol, uint32 rid)
2562 DEBUG(5, ("init_samr_q_add_groupmem\n"));
2564 q_e->pol = *pol;
2565 q_e->rid = rid;
2566 q_e->unknown = 0x0005;
2569 /*******************************************************************
2570 reads or writes a structure.
2571 ********************************************************************/
2573 BOOL samr_io_q_add_groupmem(const char *desc, SAMR_Q_ADD_GROUPMEM * q_e,
2574 prs_struct *ps, int depth)
2576 if (q_e == NULL)
2577 return False;
2579 prs_debug(ps, depth, desc, "samr_io_q_add_groupmem");
2580 depth++;
2582 if(!prs_align(ps))
2583 return False;
2585 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2586 return False;
2588 if(!prs_uint32("rid ", ps, depth, &q_e->rid))
2589 return False;
2590 if(!prs_uint32("unknown", ps, depth, &q_e->unknown))
2591 return False;
2593 return True;
2596 /*******************************************************************
2597 inits a SAMR_R_ADD_GROUPMEM structure.
2598 ********************************************************************/
2600 void init_samr_r_add_groupmem(SAMR_R_ADD_GROUPMEM * r_u, POLICY_HND *pol,
2601 NTSTATUS status)
2603 DEBUG(5, ("init_samr_r_add_groupmem\n"));
2605 r_u->status = status;
2608 /*******************************************************************
2609 reads or writes a structure.
2610 ********************************************************************/
2612 BOOL samr_io_r_add_groupmem(const char *desc, SAMR_R_ADD_GROUPMEM * r_u,
2613 prs_struct *ps, int depth)
2615 if (r_u == NULL)
2616 return False;
2618 prs_debug(ps, depth, desc, "samr_io_r_add_groupmem");
2619 depth++;
2621 if(!prs_align(ps))
2622 return False;
2624 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2625 return False;
2627 return True;
2630 /*******************************************************************
2631 inits a SAMR_Q_SET_GROUPINFO structure.
2632 ********************************************************************/
2634 void init_samr_q_set_groupinfo(SAMR_Q_SET_GROUPINFO * q_e,
2635 POLICY_HND *pol, GROUP_INFO_CTR * ctr)
2637 DEBUG(5, ("init_samr_q_set_groupinfo\n"));
2639 q_e->pol = *pol;
2640 q_e->ctr = ctr;
2643 /*******************************************************************
2644 reads or writes a structure.
2645 ********************************************************************/
2647 BOOL samr_io_q_set_groupinfo(const char *desc, SAMR_Q_SET_GROUPINFO * q_e,
2648 prs_struct *ps, int depth)
2650 if (q_e == NULL)
2651 return False;
2653 prs_debug(ps, depth, desc, "samr_io_q_set_groupinfo");
2654 depth++;
2656 if(!prs_align(ps))
2657 return False;
2659 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2660 return False;
2662 if(!samr_group_info_ctr("ctr", &q_e->ctr, ps, depth))
2663 return False;
2665 return True;
2668 /*******************************************************************
2669 inits a SAMR_R_SET_GROUPINFO structure.
2670 ********************************************************************/
2672 void init_samr_r_set_groupinfo(SAMR_R_SET_GROUPINFO * r_u, NTSTATUS status)
2674 DEBUG(5, ("init_samr_r_set_groupinfo\n"));
2676 r_u->status = status;
2679 /*******************************************************************
2680 reads or writes a structure.
2681 ********************************************************************/
2683 BOOL samr_io_r_set_groupinfo(const char *desc, SAMR_R_SET_GROUPINFO * r_u,
2684 prs_struct *ps, int depth)
2686 if (r_u == NULL)
2687 return False;
2689 prs_debug(ps, depth, desc, "samr_io_r_set_groupinfo");
2690 depth++;
2692 if(!prs_align(ps))
2693 return False;
2695 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2696 return False;
2698 return True;
2701 /*******************************************************************
2702 inits a SAMR_Q_QUERY_GROUPINFO structure.
2703 ********************************************************************/
2705 void init_samr_q_query_groupinfo(SAMR_Q_QUERY_GROUPINFO * q_e,
2706 POLICY_HND *pol, uint16 switch_level)
2708 DEBUG(5, ("init_samr_q_query_groupinfo\n"));
2710 q_e->pol = *pol;
2712 q_e->switch_level = switch_level;
2715 /*******************************************************************
2716 reads or writes a structure.
2717 ********************************************************************/
2719 BOOL samr_io_q_query_groupinfo(const char *desc, SAMR_Q_QUERY_GROUPINFO * q_e,
2720 prs_struct *ps, int depth)
2722 if (q_e == NULL)
2723 return False;
2725 prs_debug(ps, depth, desc, "samr_io_q_query_groupinfo");
2726 depth++;
2728 if(!prs_align(ps))
2729 return False;
2731 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2732 return False;
2734 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
2735 return False;
2737 return True;
2740 /*******************************************************************
2741 inits a SAMR_R_QUERY_GROUPINFO structure.
2742 ********************************************************************/
2744 void init_samr_r_query_groupinfo(SAMR_R_QUERY_GROUPINFO * r_u,
2745 GROUP_INFO_CTR * ctr, NTSTATUS status)
2747 DEBUG(5, ("init_samr_r_query_groupinfo\n"));
2749 r_u->ptr = (NT_STATUS_IS_OK(status) && ctr != NULL) ? 1 : 0;
2750 r_u->ctr = ctr;
2751 r_u->status = status;
2754 /*******************************************************************
2755 reads or writes a structure.
2756 ********************************************************************/
2758 BOOL samr_io_r_query_groupinfo(const char *desc, SAMR_R_QUERY_GROUPINFO * r_u,
2759 prs_struct *ps, int depth)
2761 if (r_u == NULL)
2762 return False;
2764 prs_debug(ps, depth, desc, "samr_io_r_query_groupinfo");
2765 depth++;
2767 if(!prs_align(ps))
2768 return False;
2770 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
2771 return False;
2773 if (r_u->ptr != 0) {
2774 if(!samr_group_info_ctr("ctr", &r_u->ctr, ps, depth))
2775 return False;
2778 if(!prs_align(ps))
2779 return False;
2780 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2781 return False;
2783 return True;
2786 /*******************************************************************
2787 inits a SAMR_Q_QUERY_GROUPMEM structure.
2788 ********************************************************************/
2790 void init_samr_q_query_groupmem(SAMR_Q_QUERY_GROUPMEM * q_c, POLICY_HND *hnd)
2792 DEBUG(5, ("init_samr_q_query_groupmem\n"));
2794 q_c->group_pol = *hnd;
2797 /*******************************************************************
2798 reads or writes a structure.
2799 ********************************************************************/
2801 BOOL samr_io_q_query_groupmem(const char *desc, SAMR_Q_QUERY_GROUPMEM * q_u,
2802 prs_struct *ps, int depth)
2804 if (q_u == NULL)
2805 return False;
2807 prs_debug(ps, depth, desc, "samr_io_q_query_groupmem");
2808 depth++;
2810 if(!prs_align(ps))
2811 return False;
2813 if(!smb_io_pol_hnd("group_pol", &q_u->group_pol, ps, depth))
2814 return False;
2816 return True;
2819 /*******************************************************************
2820 inits a SAMR_R_QUERY_GROUPMEM structure.
2821 ********************************************************************/
2823 void init_samr_r_query_groupmem(SAMR_R_QUERY_GROUPMEM * r_u,
2824 uint32 num_entries, uint32 *rid,
2825 uint32 *attr, NTSTATUS status)
2827 DEBUG(5, ("init_samr_r_query_groupmem\n"));
2829 if (NT_STATUS_IS_OK(status)) {
2830 r_u->ptr = 1;
2831 r_u->num_entries = num_entries;
2833 r_u->ptr_attrs = attr != NULL ? 1 : 0;
2834 r_u->ptr_rids = rid != NULL ? 1 : 0;
2836 r_u->num_rids = num_entries;
2837 r_u->rid = rid;
2839 r_u->num_attrs = num_entries;
2840 r_u->attr = attr;
2841 } else {
2842 r_u->ptr = 0;
2843 r_u->num_entries = 0;
2846 r_u->status = status;
2849 /*******************************************************************
2850 reads or writes a structure.
2851 ********************************************************************/
2853 BOOL samr_io_r_query_groupmem(const char *desc, SAMR_R_QUERY_GROUPMEM * r_u,
2854 prs_struct *ps, int depth)
2856 uint32 i;
2858 if (r_u == NULL)
2859 return False;
2861 if (UNMARSHALLING(ps))
2862 ZERO_STRUCTP(r_u);
2864 prs_debug(ps, depth, desc, "samr_io_r_query_groupmem");
2865 depth++;
2867 if(!prs_align(ps))
2868 return False;
2870 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
2871 return False;
2872 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
2873 return False;
2875 if (r_u->ptr != 0) {
2876 if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids))
2877 return False;
2878 if(!prs_uint32("ptr_attrs", ps, depth, &r_u->ptr_attrs))
2879 return False;
2881 if (r_u->ptr_rids != 0) {
2882 if(!prs_uint32("num_rids", ps, depth, &r_u->num_rids))
2883 return False;
2884 if (UNMARSHALLING(ps) && r_u->num_rids != 0) {
2885 r_u->rid = PRS_ALLOC_MEM(ps,uint32,r_u->num_rids);
2886 if (r_u->rid == NULL)
2887 return False;
2890 for (i = 0; i < r_u->num_rids; i++) {
2891 if(!prs_uint32("", ps, depth, &r_u->rid[i]))
2892 return False;
2896 if (r_u->ptr_attrs != 0) {
2897 if(!prs_uint32("num_attrs", ps, depth, &r_u->num_attrs))
2898 return False;
2900 if (UNMARSHALLING(ps) && r_u->num_attrs != 0) {
2901 r_u->attr = PRS_ALLOC_MEM(ps,uint32,r_u->num_attrs);
2902 if (r_u->attr == NULL)
2903 return False;
2906 for (i = 0; i < r_u->num_attrs; i++) {
2907 if(!prs_uint32("", ps, depth, &r_u->attr[i]))
2908 return False;
2913 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2914 return False;
2916 return True;
2919 /*******************************************************************
2920 inits a SAMR_Q_QUERY_USERGROUPS structure.
2921 ********************************************************************/
2923 void init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS * q_u,
2924 POLICY_HND *hnd)
2926 DEBUG(5, ("init_samr_q_query_usergroups\n"));
2928 q_u->pol = *hnd;
2931 /*******************************************************************
2932 reads or writes a structure.
2933 ********************************************************************/
2935 BOOL samr_io_q_query_usergroups(const char *desc, SAMR_Q_QUERY_USERGROUPS * q_u,
2936 prs_struct *ps, int depth)
2938 if (q_u == NULL)
2939 return False;
2941 prs_debug(ps, depth, desc, "samr_io_q_query_usergroups");
2942 depth++;
2944 if(!prs_align(ps))
2945 return False;
2947 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
2948 return False;
2950 return True;
2953 /*******************************************************************
2954 inits a SAMR_R_QUERY_USERGROUPS structure.
2955 ********************************************************************/
2957 void init_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS * r_u,
2958 uint32 num_gids, DOM_GID * gid,
2959 NTSTATUS status)
2961 DEBUG(5, ("init_samr_r_query_usergroups\n"));
2963 if (NT_STATUS_IS_OK(status)) {
2964 r_u->ptr_0 = 1;
2965 r_u->num_entries = num_gids;
2966 r_u->ptr_1 = (num_gids != 0) ? 1 : 0;
2967 r_u->num_entries2 = num_gids;
2969 r_u->gid = gid;
2970 } else {
2971 r_u->ptr_0 = 0;
2972 r_u->num_entries = 0;
2973 r_u->ptr_1 = 0;
2974 r_u->gid = NULL;
2977 r_u->status = status;
2980 /*******************************************************************
2981 reads or writes a structure.
2982 ********************************************************************/
2984 BOOL samr_io_gids(const char *desc, uint32 *num_gids, DOM_GID ** gid,
2985 prs_struct *ps, int depth)
2987 uint32 i;
2988 if (gid == NULL)
2989 return False;
2991 prs_debug(ps, depth, desc, "samr_io_gids");
2992 depth++;
2994 if(!prs_align(ps))
2995 return False;
2997 if(!prs_uint32("num_gids", ps, depth, num_gids))
2998 return False;
3000 if ((*num_gids) != 0) {
3001 if (UNMARSHALLING(ps)) {
3002 (*gid) = PRS_ALLOC_MEM(ps,DOM_GID,*num_gids);
3005 if ((*gid) == NULL) {
3006 return False;
3009 for (i = 0; i < (*num_gids); i++) {
3010 if(!smb_io_gid("gids", &(*gid)[i], ps, depth))
3011 return False;
3015 return True;
3018 /*******************************************************************
3019 reads or writes a structure.
3020 ********************************************************************/
3022 BOOL samr_io_r_query_usergroups(const char *desc, SAMR_R_QUERY_USERGROUPS * r_u,
3023 prs_struct *ps, int depth)
3025 if (r_u == NULL)
3026 return False;
3028 prs_debug(ps, depth, desc, "samr_io_r_query_usergroups");
3029 depth++;
3031 if(!prs_align(ps))
3032 return False;
3034 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
3035 return False;
3037 if (r_u->ptr_0 != 0) {
3038 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
3039 return False;
3040 if(!prs_uint32("ptr_1 ", ps, depth, &r_u->ptr_1))
3041 return False;
3043 if (r_u->num_entries != 0 && r_u->ptr_1 != 0) {
3044 if(!samr_io_gids("gids", &r_u->num_entries2, &r_u->gid, ps, depth))
3045 return False;
3049 if(!prs_align(ps))
3050 return False;
3051 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3052 return False;
3054 return True;
3057 /*******************************************************************
3058 inits a SAMR_Q_ENUM_DOMAINS structure.
3059 ********************************************************************/
3061 void init_samr_q_enum_domains(SAMR_Q_ENUM_DOMAINS * q_e,
3062 POLICY_HND *pol,
3063 uint32 start_idx, uint32 size)
3065 DEBUG(5, ("init_samr_q_enum_domains\n"));
3067 q_e->pol = *pol;
3069 q_e->start_idx = start_idx;
3070 q_e->max_size = size;
3073 /*******************************************************************
3074 reads or writes a structure.
3075 ********************************************************************/
3077 BOOL samr_io_q_enum_domains(const char *desc, SAMR_Q_ENUM_DOMAINS * q_e,
3078 prs_struct *ps, int depth)
3080 if (q_e == NULL)
3081 return False;
3083 prs_debug(ps, depth, desc, "samr_io_q_enum_domains");
3084 depth++;
3086 if(!prs_align(ps))
3087 return False;
3089 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
3090 return False;
3092 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3093 return False;
3094 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3095 return False;
3097 return True;
3100 /*******************************************************************
3101 inits a SAMR_R_ENUM_DOMAINS structure.
3102 ********************************************************************/
3104 void init_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS * r_u,
3105 uint32 next_idx, uint32 num_sam_entries)
3107 DEBUG(5, ("init_samr_r_enum_domains\n"));
3109 r_u->next_idx = next_idx;
3111 if (num_sam_entries != 0) {
3112 r_u->ptr_entries1 = 1;
3113 r_u->ptr_entries2 = 1;
3114 r_u->num_entries2 = num_sam_entries;
3115 r_u->num_entries3 = num_sam_entries;
3117 r_u->num_entries4 = num_sam_entries;
3118 } else {
3119 r_u->ptr_entries1 = 0;
3120 r_u->num_entries2 = num_sam_entries;
3121 r_u->ptr_entries2 = 1;
3125 /*******************************************************************
3126 reads or writes a structure.
3127 ********************************************************************/
3129 BOOL samr_io_r_enum_domains(const char *desc, SAMR_R_ENUM_DOMAINS * r_u,
3130 prs_struct *ps, int depth)
3132 uint32 i;
3134 if (r_u == NULL)
3135 return False;
3137 prs_debug(ps, depth, desc, "samr_io_r_enum_domains");
3138 depth++;
3140 if(!prs_align(ps))
3141 return False;
3143 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3144 return False;
3145 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3146 return False;
3148 if (r_u->ptr_entries1 != 0) {
3149 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3150 return False;
3151 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3152 return False;
3153 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3154 return False;
3156 if (UNMARSHALLING(ps)) {
3157 r_u->sam = PRS_ALLOC_MEM(ps,SAM_ENTRY,r_u->num_entries2);
3158 r_u->uni_dom_name = PRS_ALLOC_MEM(ps,UNISTR2,r_u->num_entries2);
3161 if ((r_u->sam == NULL || r_u->uni_dom_name == NULL) && r_u->num_entries2 != 0) {
3162 DEBUG(0, ("NULL pointers in SAMR_R_ENUM_DOMAINS\n"));
3163 r_u->num_entries4 = 0;
3164 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3165 return False;
3168 for (i = 0; i < r_u->num_entries2; i++) {
3169 fstring tmp;
3170 slprintf(tmp, sizeof(tmp) - 1, "dom[%d]", i);
3171 if(!sam_io_sam_entry(tmp, &r_u->sam[i], ps, depth))
3172 return False;
3175 for (i = 0; i < r_u->num_entries2; i++) {
3176 fstring tmp;
3177 slprintf(tmp, sizeof(tmp) - 1, "dom[%d]", i);
3178 if(!smb_io_unistr2(tmp, &r_u->uni_dom_name[i],
3179 r_u->sam[i].hdr_name.buffer, ps,
3180 depth))
3181 return False;
3186 if(!prs_align(ps))
3187 return False;
3188 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3189 return False;
3190 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3191 return False;
3193 return True;
3196 /*******************************************************************
3197 inits a SAMR_Q_ENUM_DOM_GROUPS structure.
3198 ********************************************************************/
3200 void init_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS * q_e,
3201 POLICY_HND *pol,
3202 uint32 start_idx, uint32 size)
3204 DEBUG(5, ("init_samr_q_enum_dom_groups\n"));
3206 q_e->pol = *pol;
3208 q_e->start_idx = start_idx;
3209 q_e->max_size = size;
3212 /*******************************************************************
3213 reads or writes a structure.
3214 ********************************************************************/
3216 BOOL samr_io_q_enum_dom_groups(const char *desc, SAMR_Q_ENUM_DOM_GROUPS * q_e,
3217 prs_struct *ps, int depth)
3219 if (q_e == NULL)
3220 return False;
3222 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups");
3223 depth++;
3225 if(!prs_align(ps))
3226 return False;
3228 if(!smb_io_pol_hnd("pol", &(q_e->pol), ps, depth))
3229 return False;
3231 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3232 return False;
3233 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3234 return False;
3236 return True;
3239 /*******************************************************************
3240 inits a SAMR_R_ENUM_DOM_GROUPS structure.
3241 ********************************************************************/
3243 void init_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS * r_u,
3244 uint32 next_idx, uint32 num_sam_entries)
3246 DEBUG(5, ("init_samr_r_enum_dom_groups\n"));
3248 r_u->next_idx = next_idx;
3250 if (num_sam_entries != 0) {
3251 r_u->ptr_entries1 = 1;
3252 r_u->ptr_entries2 = 1;
3253 r_u->num_entries2 = num_sam_entries;
3254 r_u->num_entries3 = num_sam_entries;
3256 r_u->num_entries4 = num_sam_entries;
3257 } else {
3258 r_u->ptr_entries1 = 0;
3259 r_u->num_entries2 = num_sam_entries;
3260 r_u->ptr_entries2 = 1;
3264 /*******************************************************************
3265 reads or writes a structure.
3266 ********************************************************************/
3268 BOOL samr_io_r_enum_dom_groups(const char *desc, SAMR_R_ENUM_DOM_GROUPS * r_u,
3269 prs_struct *ps, int depth)
3271 uint32 i;
3273 if (r_u == NULL)
3274 return False;
3276 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups");
3277 depth++;
3279 if(!prs_align(ps))
3280 return False;
3282 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3283 return False;
3284 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3285 return False;
3287 if (r_u->ptr_entries1 != 0) {
3288 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3289 return False;
3290 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3291 return False;
3292 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3293 return False;
3295 if (UNMARSHALLING(ps)) {
3296 r_u->sam = PRS_ALLOC_MEM(ps,SAM_ENTRY,r_u->num_entries2);
3297 r_u->uni_grp_name = PRS_ALLOC_MEM(ps,UNISTR2,r_u->num_entries2);
3300 if ((r_u->sam == NULL || r_u->uni_grp_name == NULL) && r_u->num_entries2 != 0) {
3301 DEBUG(0,
3302 ("NULL pointers in SAMR_R_ENUM_DOM_GROUPS\n"));
3303 r_u->num_entries4 = 0;
3304 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3305 return False;
3308 for (i = 0; i < r_u->num_entries2; i++) {
3309 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
3310 return False;
3313 for (i = 0; i < r_u->num_entries2; i++) {
3314 if(!smb_io_unistr2("", &r_u->uni_grp_name[i],
3315 r_u->sam[i].hdr_name.buffer, ps, depth))
3316 return False;
3320 if(!prs_align(ps))
3321 return False;
3322 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3323 return False;
3324 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3325 return False;
3327 return True;
3330 /*******************************************************************
3331 inits a SAMR_Q_ENUM_DOM_ALIASES structure.
3332 ********************************************************************/
3334 void init_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES * q_e,
3335 POLICY_HND *pol, uint32 start_idx,
3336 uint32 size)
3338 DEBUG(5, ("init_samr_q_enum_dom_aliases\n"));
3340 q_e->pol = *pol;
3342 q_e->start_idx = start_idx;
3343 q_e->max_size = size;
3347 /*******************************************************************
3348 reads or writes a structure.
3349 ********************************************************************/
3351 BOOL samr_io_q_enum_dom_aliases(const char *desc, SAMR_Q_ENUM_DOM_ALIASES * q_e,
3352 prs_struct *ps, int depth)
3354 if (q_e == NULL)
3355 return False;
3357 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases");
3358 depth++;
3360 if(!prs_align(ps))
3361 return False;
3363 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
3364 return False;
3366 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3367 return False;
3368 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3369 return False;
3371 return True;
3374 /*******************************************************************
3375 inits a SAMR_R_ENUM_DOM_ALIASES structure.
3376 ********************************************************************/
3378 void init_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u, uint32 next_idx, uint32 num_sam_entries)
3380 DEBUG(5, ("init_samr_r_enum_dom_aliases\n"));
3382 r_u->next_idx = next_idx;
3384 if (num_sam_entries != 0) {
3385 r_u->ptr_entries1 = 1;
3386 r_u->ptr_entries2 = 1;
3387 r_u->num_entries2 = num_sam_entries;
3388 r_u->num_entries3 = num_sam_entries;
3390 r_u->num_entries4 = num_sam_entries;
3391 } else {
3392 r_u->ptr_entries1 = 0;
3393 r_u->num_entries2 = num_sam_entries;
3394 r_u->ptr_entries2 = 1;
3398 /*******************************************************************
3399 reads or writes a structure.
3400 ********************************************************************/
3402 BOOL samr_io_r_enum_dom_aliases(const char *desc, SAMR_R_ENUM_DOM_ALIASES * r_u,
3403 prs_struct *ps, int depth)
3405 uint32 i;
3407 if (r_u == NULL)
3408 return False;
3410 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases");
3411 depth++;
3413 if(!prs_align(ps))
3414 return False;
3416 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3417 return False;
3418 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3419 return False;
3421 if (r_u->ptr_entries1 != 0) {
3422 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3423 return False;
3424 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3425 return False;
3426 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3427 return False;
3429 if (UNMARSHALLING(ps) && (r_u->num_entries2 > 0)) {
3430 r_u->sam = PRS_ALLOC_MEM(ps,SAM_ENTRY,r_u->num_entries2);
3431 r_u->uni_grp_name = PRS_ALLOC_MEM(ps,UNISTR2,r_u->num_entries2);
3434 if (r_u->num_entries2 != 0 &&
3435 (r_u->sam == NULL || r_u->uni_grp_name == NULL)) {
3436 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_ALIASES\n"));
3437 r_u->num_entries4 = 0;
3438 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3439 return False;
3442 for (i = 0; i < r_u->num_entries2; i++) {
3443 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
3444 return False;
3447 for (i = 0; i < r_u->num_entries2; i++) {
3448 if(!smb_io_unistr2("", &r_u->uni_grp_name[i],
3449 r_u->sam[i].hdr_name.buffer, ps,
3450 depth))
3451 return False;
3455 if(!prs_align(ps))
3456 return False;
3457 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3458 return False;
3459 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3460 return False;
3462 return True;
3465 /*******************************************************************
3466 inits a ALIAS_INFO1 structure.
3467 ********************************************************************/
3469 void init_samr_alias_info1(ALIAS_INFO1 * al1, char *acct_name, uint32 num_member, char *acct_desc)
3471 DEBUG(5, ("init_samr_alias_info1\n"));
3473 init_unistr4(&al1->name, acct_name, UNI_FLAGS_NONE);
3474 al1->num_member = num_member;
3475 init_unistr4(&al1->description, acct_desc, UNI_FLAGS_NONE);
3478 /*******************************************************************
3479 reads or writes a structure.
3480 ********************************************************************/
3482 BOOL samr_io_alias_info1(const char *desc, ALIAS_INFO1 * al1,
3483 prs_struct *ps, int depth)
3485 if (al1 == NULL)
3486 return False;
3488 prs_debug(ps, depth, desc, "samr_io_alias_info1");
3489 depth++;
3491 if(!prs_align(ps))
3492 return False;
3494 if ( !prs_unistr4_hdr("name", ps, depth, &al1->name) )
3495 return False;
3496 if ( !prs_uint32("num_member", ps, depth, &al1->num_member) )
3497 return False;
3498 if ( !prs_unistr4_hdr("description", ps, depth, &al1->description) )
3499 return False;
3501 if ( !prs_unistr4_str("name", ps, depth, &al1->name) )
3502 return False;
3503 if ( !prs_align(ps) )
3504 return False;
3505 if ( !prs_unistr4_str("description", ps, depth, &al1->description) )
3506 return False;
3507 if ( !prs_align(ps) )
3508 return False;
3510 return True;
3513 /*******************************************************************
3514 inits a ALIAS_INFO3 structure.
3515 ********************************************************************/
3517 void init_samr_alias_info3(ALIAS_INFO3 * al3, const char *acct_desc)
3519 DEBUG(5, ("init_samr_alias_info3\n"));
3521 init_unistr4(&al3->description, acct_desc, UNI_FLAGS_NONE);
3524 /*******************************************************************
3525 reads or writes a structure.
3526 ********************************************************************/
3528 BOOL samr_io_alias_info3(const char *desc, ALIAS_INFO3 *al3,
3529 prs_struct *ps, int depth)
3531 if (al3 == NULL)
3532 return False;
3534 prs_debug(ps, depth, desc, "samr_io_alias_info3");
3535 depth++;
3537 if(!prs_align(ps))
3538 return False;
3540 if (!prs_unistr4("description", ps, depth, &al3->description))
3541 return False;
3543 return True;
3546 /*******************************************************************
3547 reads or writes a structure.
3548 ********************************************************************/
3550 BOOL samr_alias_info_ctr(const char *desc, prs_struct *ps, int depth, ALIAS_INFO_CTR * ctr)
3552 if ( !ctr )
3553 return False;
3555 prs_debug(ps, depth, desc, "samr_alias_info_ctr");
3556 depth++;
3558 if ( !prs_uint16("level", ps, depth, &ctr->level) )
3559 return False;
3561 if(!prs_align(ps))
3562 return False;
3563 switch (ctr->level) {
3564 case 1:
3565 if(!samr_io_alias_info1("alias_info1", &ctr->alias.info1, ps, depth))
3566 return False;
3567 break;
3568 case 3:
3569 if(!samr_io_alias_info3("alias_info3", &ctr->alias.info3, ps, depth))
3570 return False;
3571 break;
3572 default:
3573 DEBUG(0,("samr_alias_info_ctr: unsupported switch level\n"));
3574 break;
3577 return True;
3580 /*******************************************************************
3581 inits a SAMR_Q_QUERY_ALIASINFO structure.
3582 ********************************************************************/
3584 void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO * q_e,
3585 POLICY_HND *pol, uint32 switch_level)
3587 DEBUG(5, ("init_samr_q_query_aliasinfo\n"));
3589 q_e->pol = *pol;
3590 q_e->level = switch_level;
3593 /*******************************************************************
3594 reads or writes a structure.
3595 ********************************************************************/
3597 BOOL samr_io_q_query_aliasinfo(const char *desc, SAMR_Q_QUERY_ALIASINFO *in,
3598 prs_struct *ps, int depth)
3600 if ( !in )
3601 return False;
3603 prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo");
3604 depth++;
3606 if(!prs_align(ps))
3607 return False;
3609 if ( !smb_io_pol_hnd("pol", &(in->pol), ps, depth) )
3610 return False;
3612 if ( !prs_uint16("level", ps, depth, &in->level) )
3613 return False;
3615 return True;
3618 /*******************************************************************
3619 inits a SAMR_R_QUERY_ALIASINFO structure.
3620 ********************************************************************/
3622 void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *out,
3623 ALIAS_INFO_CTR * ctr, NTSTATUS status)
3625 DEBUG(5, ("init_samr_r_query_aliasinfo\n"));
3627 out->ctr = ctr;
3628 out->status = status;
3631 /*******************************************************************
3632 reads or writes a structure.
3633 ********************************************************************/
3635 BOOL samr_io_r_query_aliasinfo(const char *desc, SAMR_R_QUERY_ALIASINFO *out,
3636 prs_struct *ps, int depth)
3638 if ( !out )
3639 return False;
3641 prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo");
3642 depth++;
3644 if(!prs_align(ps))
3645 return False;
3647 if ( !prs_pointer("alias", ps, depth, (void**)&out->ctr, sizeof(ALIAS_INFO_CTR), (PRS_POINTER_CAST)samr_alias_info_ctr))
3648 return False;
3649 if(!prs_align(ps))
3650 return False;
3652 if(!prs_ntstatus("status", ps, depth, &out->status))
3653 return False;
3655 return True;
3658 /*******************************************************************
3659 inits a SAMR_Q_SET_ALIASINFO structure.
3660 ********************************************************************/
3662 void init_samr_q_set_aliasinfo(SAMR_Q_SET_ALIASINFO * q_u,
3663 POLICY_HND *hnd, ALIAS_INFO_CTR * ctr)
3665 DEBUG(5, ("init_samr_q_set_aliasinfo\n"));
3667 q_u->alias_pol = *hnd;
3668 q_u->ctr = *ctr;
3671 /*******************************************************************
3672 reads or writes a structure.
3673 ********************************************************************/
3675 BOOL samr_io_q_set_aliasinfo(const char *desc, SAMR_Q_SET_ALIASINFO * q_u,
3676 prs_struct *ps, int depth)
3678 if (q_u == NULL)
3679 return False;
3681 prs_debug(ps, depth, desc, "samr_io_q_set_aliasinfo");
3682 depth++;
3684 if(!prs_align(ps))
3685 return False;
3687 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
3688 return False;
3689 if(!samr_alias_info_ctr("ctr", ps, depth, &q_u->ctr))
3690 return False;
3692 return True;
3695 /*******************************************************************
3696 reads or writes a structure.
3697 ********************************************************************/
3699 BOOL samr_io_r_set_aliasinfo(const char *desc, SAMR_R_SET_ALIASINFO * r_u,
3700 prs_struct *ps, int depth)
3702 if (r_u == NULL)
3703 return False;
3705 prs_debug(ps, depth, desc, "samr_io_r_set_aliasinfo");
3706 depth++;
3708 if(!prs_align(ps))
3709 return False;
3710 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3711 return False;
3713 return True;
3716 /*******************************************************************
3717 inits a SAMR_Q_QUERY_USERALIASES structure.
3718 ********************************************************************/
3720 void init_samr_q_query_useraliases(SAMR_Q_QUERY_USERALIASES * q_u,
3721 POLICY_HND *hnd,
3722 uint32 num_sids,
3723 uint32 *ptr_sid, DOM_SID2 * sid)
3725 DEBUG(5, ("init_samr_q_query_useraliases\n"));
3727 q_u->pol = *hnd;
3729 q_u->num_sids1 = num_sids;
3730 q_u->ptr = 1;
3731 q_u->num_sids2 = num_sids;
3733 q_u->ptr_sid = ptr_sid;
3734 q_u->sid = sid;
3737 /*******************************************************************
3738 reads or writes a SAMR_Q_QUERY_USERALIASES structure.
3739 ********************************************************************/
3741 BOOL samr_io_q_query_useraliases(const char *desc, SAMR_Q_QUERY_USERALIASES * q_u,
3742 prs_struct *ps, int depth)
3744 fstring tmp;
3745 uint32 i;
3747 if (q_u == NULL)
3748 return False;
3750 prs_debug(ps, depth, desc, "samr_io_q_query_useraliases");
3751 depth++;
3753 if(!prs_align(ps))
3754 return False;
3756 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
3757 return False;
3759 if(!prs_uint32("num_sids1", ps, depth, &q_u->num_sids1))
3760 return False;
3761 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
3762 return False;
3764 if (q_u->ptr==0)
3765 return True;
3767 if(!prs_uint32("num_sids2", ps, depth, &q_u->num_sids2))
3768 return False;
3770 if (UNMARSHALLING(ps) && (q_u->num_sids2 != 0)) {
3771 q_u->ptr_sid = PRS_ALLOC_MEM(ps,uint32,q_u->num_sids2);
3772 if (q_u->ptr_sid == NULL)
3773 return False;
3775 q_u->sid = PRS_ALLOC_MEM(ps, DOM_SID2, q_u->num_sids2);
3776 if (q_u->sid == NULL)
3777 return False;
3780 for (i = 0; i < q_u->num_sids2; i++) {
3781 slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i);
3782 if(!prs_uint32(tmp, ps, depth, &q_u->ptr_sid[i]))
3783 return False;
3786 for (i = 0; i < q_u->num_sids2; i++) {
3787 if (q_u->ptr_sid[i] != 0) {
3788 slprintf(tmp, sizeof(tmp) - 1, "sid[%02d]", i);
3789 if(!smb_io_dom_sid2(tmp, &q_u->sid[i], ps, depth))
3790 return False;
3794 return True;
3797 /*******************************************************************
3798 inits a SAMR_R_QUERY_USERALIASES structure.
3799 ********************************************************************/
3801 void init_samr_r_query_useraliases(SAMR_R_QUERY_USERALIASES * r_u,
3802 uint32 num_rids, uint32 *rid,
3803 NTSTATUS status)
3805 DEBUG(5, ("init_samr_r_query_useraliases\n"));
3807 if (NT_STATUS_IS_OK(status)) {
3808 r_u->num_entries = num_rids;
3809 r_u->ptr = 1;
3810 r_u->num_entries2 = num_rids;
3812 r_u->rid = rid;
3813 } else {
3814 r_u->num_entries = 0;
3815 r_u->ptr = 0;
3816 r_u->num_entries2 = 0;
3819 r_u->status = status;
3822 /*******************************************************************
3823 reads or writes a structure.
3824 ********************************************************************/
3826 BOOL samr_io_rids(const char *desc, uint32 *num_rids, uint32 **rid,
3827 prs_struct *ps, int depth)
3829 fstring tmp;
3830 uint32 i;
3831 if (rid == NULL)
3832 return False;
3834 prs_debug(ps, depth, desc, "samr_io_rids");
3835 depth++;
3837 if(!prs_align(ps))
3838 return False;
3840 if(!prs_uint32("num_rids", ps, depth, num_rids))
3841 return False;
3843 if ((*num_rids) != 0) {
3844 if (UNMARSHALLING(ps)) {
3845 /* reading */
3846 (*rid) = PRS_ALLOC_MEM(ps,uint32, *num_rids);
3848 if ((*rid) == NULL)
3849 return False;
3851 for (i = 0; i < (*num_rids); i++) {
3852 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d]", i);
3853 if(!prs_uint32(tmp, ps, depth, &((*rid)[i])))
3854 return False;
3858 return True;
3861 /*******************************************************************
3862 reads or writes a structure.
3863 ********************************************************************/
3865 BOOL samr_io_r_query_useraliases(const char *desc, SAMR_R_QUERY_USERALIASES * r_u,
3866 prs_struct *ps, int depth)
3868 if (r_u == NULL)
3869 return False;
3871 prs_debug(ps, depth, desc, "samr_io_r_query_useraliases");
3872 depth++;
3874 if(!prs_align(ps))
3875 return False;
3877 if(!prs_uint32("num_entries", ps, depth, &r_u->num_entries))
3878 return False;
3879 if(!prs_uint32("ptr ", ps, depth, &r_u->ptr))
3880 return False;
3882 if (r_u->ptr != 0) {
3883 if(!samr_io_rids("rids", &r_u->num_entries2, &r_u->rid, ps, depth))
3884 return False;
3887 if(!prs_align(ps))
3888 return False;
3889 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3890 return False;
3892 return True;
3895 /*******************************************************************
3896 inits a SAMR_Q_OPEN_ALIAS structure.
3897 ********************************************************************/
3899 void init_samr_q_open_alias(SAMR_Q_OPEN_ALIAS * q_u, POLICY_HND *pol,
3900 uint32 access_mask, uint32 rid)
3902 DEBUG(5, ("init_samr_q_open_alias\n"));
3904 q_u->dom_pol = *pol;
3905 q_u->access_mask = access_mask;
3906 q_u->rid_alias = rid;
3909 /*******************************************************************
3910 reads or writes a structure.
3911 ********************************************************************/
3913 BOOL samr_io_q_open_alias(const char *desc, SAMR_Q_OPEN_ALIAS * q_u,
3914 prs_struct *ps, int depth)
3916 if (q_u == NULL)
3917 return False;
3919 prs_debug(ps, depth, desc, "samr_io_q_open_alias");
3920 depth++;
3922 if(!prs_align(ps))
3923 return False;
3925 if(!smb_io_pol_hnd("domain_pol", &q_u->dom_pol, ps, depth))
3926 return False;
3928 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
3929 return False;
3930 if(!prs_uint32("rid_alias", ps, depth, &q_u->rid_alias))
3931 return False;
3933 return True;
3936 /*******************************************************************
3937 reads or writes a structure.
3938 ********************************************************************/
3940 BOOL samr_io_r_open_alias(const char *desc, SAMR_R_OPEN_ALIAS * r_u,
3941 prs_struct *ps, int depth)
3943 if (r_u == NULL)
3944 return False;
3946 prs_debug(ps, depth, desc, "samr_io_r_open_alias");
3947 depth++;
3949 if(!prs_align(ps))
3950 return False;
3952 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
3953 return False;
3955 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3956 return False;
3958 return True;
3961 /*******************************************************************
3962 inits a SAMR_Q_LOOKUP_RIDS structure.
3963 ********************************************************************/
3965 void init_samr_q_lookup_rids(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_RIDS * q_u,
3966 POLICY_HND *pol, uint32 flags,
3967 uint32 num_rids, uint32 *rid)
3969 DEBUG(5, ("init_samr_q_lookup_rids\n"));
3971 q_u->pol = *pol;
3973 q_u->num_rids1 = num_rids;
3974 q_u->flags = flags;
3975 q_u->ptr = 0;
3976 q_u->num_rids2 = num_rids;
3977 q_u->rid = TALLOC_ZERO_ARRAY(ctx, uint32, num_rids );
3978 if (q_u->rid == NULL) {
3979 q_u->num_rids1 = 0;
3980 q_u->num_rids2 = 0;
3981 } else {
3982 memcpy(q_u->rid, rid, num_rids * sizeof(q_u->rid[0]));
3986 /*******************************************************************
3987 reads or writes a structure.
3988 ********************************************************************/
3990 BOOL samr_io_q_lookup_rids(const char *desc, SAMR_Q_LOOKUP_RIDS * q_u,
3991 prs_struct *ps, int depth)
3993 uint32 i;
3994 fstring tmp;
3996 if (q_u == NULL)
3997 return False;
3999 prs_debug(ps, depth, desc, "samr_io_q_lookup_rids");
4000 depth++;
4002 if (UNMARSHALLING(ps))
4003 ZERO_STRUCTP(q_u);
4005 if(!prs_align(ps))
4006 return False;
4008 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4009 return False;
4011 if(!prs_uint32("num_rids1", ps, depth, &q_u->num_rids1))
4012 return False;
4013 if(!prs_uint32("flags ", ps, depth, &q_u->flags))
4014 return False;
4015 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
4016 return False;
4017 if(!prs_uint32("num_rids2", ps, depth, &q_u->num_rids2))
4018 return False;
4020 if (UNMARSHALLING(ps) && (q_u->num_rids2 != 0)) {
4021 q_u->rid = PRS_ALLOC_MEM(ps, uint32, q_u->num_rids2);
4022 if (q_u->rid == NULL)
4023 return False;
4026 for (i = 0; i < q_u->num_rids2; i++) {
4027 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
4028 if(!prs_uint32(tmp, ps, depth, &q_u->rid[i]))
4029 return False;
4032 return True;
4035 /*******************************************************************
4036 inits a SAMR_R_LOOKUP_RIDS structure.
4037 ********************************************************************/
4039 void init_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS * r_u,
4040 uint32 num_names, UNIHDR * hdr_name,
4041 UNISTR2 *uni_name, uint32 *type)
4043 DEBUG(5, ("init_samr_r_lookup_rids\n"));
4045 r_u->hdr_name = NULL;
4046 r_u->uni_name = NULL;
4047 r_u->type = NULL;
4049 if (num_names != 0) {
4050 r_u->num_names1 = num_names;
4051 r_u->ptr_names = 1;
4052 r_u->num_names2 = num_names;
4054 r_u->num_types1 = num_names;
4055 r_u->ptr_types = 1;
4056 r_u->num_types2 = num_names;
4058 r_u->hdr_name = hdr_name;
4059 r_u->uni_name = uni_name;
4060 r_u->type = type;
4061 } else {
4062 r_u->num_names1 = num_names;
4063 r_u->ptr_names = 0;
4064 r_u->num_names2 = num_names;
4066 r_u->num_types1 = num_names;
4067 r_u->ptr_types = 0;
4068 r_u->num_types2 = num_names;
4072 /*******************************************************************
4073 reads or writes a structure.
4074 ********************************************************************/
4076 BOOL samr_io_r_lookup_rids(const char *desc, SAMR_R_LOOKUP_RIDS * r_u,
4077 prs_struct *ps, int depth)
4079 uint32 i;
4080 fstring tmp;
4081 if (r_u == NULL)
4082 return False;
4084 prs_debug(ps, depth, desc, "samr_io_r_lookup_rids");
4085 depth++;
4087 if(!prs_align(ps))
4088 return False;
4090 if(!prs_uint32("num_names1", ps, depth, &r_u->num_names1))
4091 return False;
4092 if(!prs_uint32("ptr_names ", ps, depth, &r_u->ptr_names))
4093 return False;
4095 if (r_u->ptr_names != 0) {
4097 if(!prs_uint32("num_names2", ps, depth, &r_u->num_names2))
4098 return False;
4101 if (UNMARSHALLING(ps) && (r_u->num_names2 != 0)) {
4102 r_u->hdr_name = PRS_ALLOC_MEM(ps, UNIHDR, r_u->num_names2);
4103 if (r_u->hdr_name == NULL)
4104 return False;
4106 r_u->uni_name = PRS_ALLOC_MEM(ps, UNISTR2, r_u->num_names2);
4107 if (r_u->uni_name == NULL)
4108 return False;
4111 for (i = 0; i < r_u->num_names2; i++) {
4112 slprintf(tmp, sizeof(tmp) - 1, "hdr[%02d] ", i);
4113 if(!smb_io_unihdr("", &r_u->hdr_name[i], ps, depth))
4114 return False;
4116 for (i = 0; i < r_u->num_names2; i++) {
4117 slprintf(tmp, sizeof(tmp) - 1, "str[%02d] ", i);
4118 if(!smb_io_unistr2("", &r_u->uni_name[i], r_u->hdr_name[i].buffer, ps, depth))
4119 return False;
4124 if(!prs_align(ps))
4125 return False;
4126 if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1))
4127 return False;
4128 if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types))
4129 return False;
4131 if (r_u->ptr_types != 0) {
4133 if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2))
4134 return False;
4136 if (UNMARSHALLING(ps) && (r_u->num_types2 != 0)) {
4137 r_u->type = PRS_ALLOC_MEM(ps, uint32, r_u->num_types2);
4138 if (r_u->type == NULL)
4139 return False;
4142 for (i = 0; i < r_u->num_types2; i++) {
4143 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
4144 if(!prs_uint32(tmp, ps, depth, &r_u->type[i]))
4145 return False;
4149 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4150 return False;
4152 return True;
4155 /*******************************************************************
4156 inits a SAMR_Q_OPEN_ALIAS structure.
4157 ********************************************************************/
4159 void init_samr_q_delete_alias(SAMR_Q_DELETE_DOM_ALIAS * q_u, POLICY_HND *hnd)
4161 DEBUG(5, ("init_samr_q_delete_alias\n"));
4163 q_u->alias_pol = *hnd;
4166 /*******************************************************************
4167 reads or writes a structure.
4168 ********************************************************************/
4170 BOOL samr_io_q_delete_alias(const char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u,
4171 prs_struct *ps, int depth)
4173 if (q_u == NULL)
4174 return False;
4176 prs_debug(ps, depth, desc, "samr_io_q_delete_alias");
4177 depth++;
4179 if(!prs_align(ps))
4180 return False;
4182 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4183 return False;
4185 return True;
4188 /*******************************************************************
4189 reads or writes a structure.
4190 ********************************************************************/
4192 BOOL samr_io_r_delete_alias(const char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u,
4193 prs_struct *ps, int depth)
4195 if (r_u == NULL)
4196 return False;
4198 prs_debug(ps, depth, desc, "samr_io_r_delete_alias");
4199 depth++;
4201 if(!prs_align(ps))
4202 return False;
4204 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
4205 return False;
4206 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4207 return False;
4209 return True;
4212 /*******************************************************************
4213 inits a SAMR_Q_CREATE_DOM_ALIAS structure.
4214 ********************************************************************/
4216 void init_samr_q_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS * q_u,
4217 POLICY_HND *hnd, const char *acct_desc)
4219 DEBUG(5, ("init_samr_q_create_dom_alias\n"));
4221 q_u->dom_pol = *hnd;
4223 init_unistr2(&q_u->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
4224 init_uni_hdr(&q_u->hdr_acct_desc, &q_u->uni_acct_desc);
4226 q_u->access_mask = MAXIMUM_ALLOWED_ACCESS;
4229 /*******************************************************************
4230 reads or writes a structure.
4231 ********************************************************************/
4233 BOOL samr_io_q_create_dom_alias(const char *desc, SAMR_Q_CREATE_DOM_ALIAS * q_u,
4234 prs_struct *ps, int depth)
4236 if (q_u == NULL)
4237 return False;
4239 prs_debug(ps, depth, desc, "samr_io_q_create_dom_alias");
4240 depth++;
4242 if(!prs_align(ps))
4243 return False;
4245 if(!smb_io_pol_hnd("dom_pol", &q_u->dom_pol, ps, depth))
4246 return False;
4248 if(!smb_io_unihdr("hdr_acct_desc", &q_u->hdr_acct_desc, ps, depth))
4249 return False;
4250 if(!smb_io_unistr2("uni_acct_desc", &q_u->uni_acct_desc,
4251 q_u->hdr_acct_desc.buffer, ps, depth))
4252 return False;
4254 if(!prs_align(ps))
4255 return False;
4256 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
4257 return False;
4259 return True;
4262 /*******************************************************************
4263 reads or writes a structure.
4264 ********************************************************************/
4266 BOOL samr_io_r_create_dom_alias(const char *desc, SAMR_R_CREATE_DOM_ALIAS * r_u,
4267 prs_struct *ps, int depth)
4269 if (r_u == NULL)
4270 return False;
4272 prs_debug(ps, depth, desc, "samr_io_r_create_dom_alias");
4273 depth++;
4275 if(!prs_align(ps))
4276 return False;
4278 if(!smb_io_pol_hnd("alias_pol", &r_u->alias_pol, ps, depth))
4279 return False;
4281 if(!prs_uint32("rid", ps, depth, &r_u->rid))
4282 return False;
4284 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4285 return False;
4287 return True;
4290 /*******************************************************************
4291 inits a SAMR_Q_ADD_ALIASMEM structure.
4292 ********************************************************************/
4294 void init_samr_q_add_aliasmem(SAMR_Q_ADD_ALIASMEM * q_u, POLICY_HND *hnd,
4295 DOM_SID *sid)
4297 DEBUG(5, ("init_samr_q_add_aliasmem\n"));
4299 q_u->alias_pol = *hnd;
4300 init_dom_sid2(&q_u->sid, sid);
4303 /*******************************************************************
4304 reads or writes a structure.
4305 ********************************************************************/
4307 BOOL samr_io_q_add_aliasmem(const char *desc, SAMR_Q_ADD_ALIASMEM * q_u,
4308 prs_struct *ps, int depth)
4310 if (q_u == NULL)
4311 return False;
4313 prs_debug(ps, depth, desc, "samr_io_q_add_aliasmem");
4314 depth++;
4316 if(!prs_align(ps))
4317 return False;
4319 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4320 return False;
4321 if(!smb_io_dom_sid2("sid ", &q_u->sid, ps, depth))
4322 return False;
4324 return True;
4327 /*******************************************************************
4328 reads or writes a structure.
4329 ********************************************************************/
4331 BOOL samr_io_r_add_aliasmem(const char *desc, SAMR_R_ADD_ALIASMEM * r_u,
4332 prs_struct *ps, int depth)
4334 if (r_u == NULL)
4335 return False;
4337 prs_debug(ps, depth, desc, "samr_io_r_add_aliasmem");
4338 depth++;
4340 if(!prs_align(ps))
4341 return False;
4343 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4344 return False;
4346 return True;
4349 /*******************************************************************
4350 inits a SAMR_Q_DEL_ALIASMEM structure.
4351 ********************************************************************/
4353 void init_samr_q_del_aliasmem(SAMR_Q_DEL_ALIASMEM * q_u, POLICY_HND *hnd,
4354 DOM_SID *sid)
4356 DEBUG(5, ("init_samr_q_del_aliasmem\n"));
4358 q_u->alias_pol = *hnd;
4359 init_dom_sid2(&q_u->sid, sid);
4362 /*******************************************************************
4363 reads or writes a structure.
4364 ********************************************************************/
4366 BOOL samr_io_q_del_aliasmem(const char *desc, SAMR_Q_DEL_ALIASMEM * q_u,
4367 prs_struct *ps, int depth)
4369 if (q_u == NULL)
4370 return False;
4372 prs_debug(ps, depth, desc, "samr_io_q_del_aliasmem");
4373 depth++;
4375 if(!prs_align(ps))
4376 return False;
4378 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4379 return False;
4380 if(!smb_io_dom_sid2("sid ", &q_u->sid, ps, depth))
4381 return False;
4383 return True;
4386 /*******************************************************************
4387 reads or writes a structure.
4388 ********************************************************************/
4390 BOOL samr_io_r_del_aliasmem(const char *desc, SAMR_R_DEL_ALIASMEM * r_u,
4391 prs_struct *ps, int depth)
4393 if (r_u == NULL)
4394 return False;
4396 prs_debug(ps, depth, desc, "samr_io_r_del_aliasmem");
4397 depth++;
4399 if(!prs_align(ps))
4400 return False;
4402 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4403 return False;
4405 return True;
4408 /*******************************************************************
4409 inits a SAMR_Q_DELETE_DOM_ALIAS structure.
4410 ********************************************************************/
4412 void init_samr_q_delete_dom_alias(SAMR_Q_DELETE_DOM_ALIAS * q_c,
4413 POLICY_HND *hnd)
4415 DEBUG(5, ("init_samr_q_delete_dom_alias\n"));
4417 q_c->alias_pol = *hnd;
4420 /*******************************************************************
4421 reads or writes a structure.
4422 ********************************************************************/
4424 BOOL samr_io_q_delete_dom_alias(const char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u,
4425 prs_struct *ps, int depth)
4427 if (q_u == NULL)
4428 return False;
4430 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_alias");
4431 depth++;
4433 if(!prs_align(ps))
4434 return False;
4436 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4437 return False;
4439 return True;
4442 /*******************************************************************
4443 inits a SAMR_R_DELETE_DOM_ALIAS structure.
4444 ********************************************************************/
4446 void init_samr_r_delete_dom_alias(SAMR_R_DELETE_DOM_ALIAS * r_u,
4447 NTSTATUS status)
4449 DEBUG(5, ("init_samr_r_delete_dom_alias\n"));
4451 r_u->status = status;
4454 /*******************************************************************
4455 reads or writes a structure.
4456 ********************************************************************/
4458 BOOL samr_io_r_delete_dom_alias(const char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u,
4459 prs_struct *ps, int depth)
4461 if (r_u == NULL)
4462 return False;
4464 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_alias");
4465 depth++;
4467 if(!prs_align(ps))
4468 return False;
4470 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4471 return False;
4473 return True;
4476 /*******************************************************************
4477 inits a SAMR_Q_QUERY_ALIASMEM structure.
4478 ********************************************************************/
4480 void init_samr_q_query_aliasmem(SAMR_Q_QUERY_ALIASMEM * q_c,
4481 POLICY_HND *hnd)
4483 DEBUG(5, ("init_samr_q_query_aliasmem\n"));
4485 q_c->alias_pol = *hnd;
4488 /*******************************************************************
4489 reads or writes a structure.
4490 ********************************************************************/
4492 BOOL samr_io_q_query_aliasmem(const char *desc, SAMR_Q_QUERY_ALIASMEM * q_u,
4493 prs_struct *ps, int depth)
4495 if (q_u == NULL)
4496 return False;
4498 prs_debug(ps, depth, desc, "samr_io_q_query_aliasmem");
4499 depth++;
4501 if(!prs_align(ps))
4502 return False;
4504 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4505 return False;
4507 return True;
4510 /*******************************************************************
4511 inits a SAMR_R_QUERY_ALIASMEM structure.
4512 ********************************************************************/
4514 void init_samr_r_query_aliasmem(SAMR_R_QUERY_ALIASMEM * r_u,
4515 uint32 num_sids, DOM_SID2 * sid,
4516 NTSTATUS status)
4518 DEBUG(5, ("init_samr_r_query_aliasmem\n"));
4520 if (NT_STATUS_IS_OK(status)) {
4521 r_u->num_sids = num_sids;
4522 r_u->ptr = (num_sids != 0) ? 1 : 0;
4523 r_u->num_sids1 = num_sids;
4525 r_u->sid = sid;
4526 } else {
4527 r_u->ptr = 0;
4528 r_u->num_sids = 0;
4531 r_u->status = status;
4534 /*******************************************************************
4535 reads or writes a structure.
4536 ********************************************************************/
4538 BOOL samr_io_r_query_aliasmem(const char *desc, SAMR_R_QUERY_ALIASMEM * r_u,
4539 prs_struct *ps, int depth)
4541 uint32 i;
4543 if (r_u == NULL)
4544 return False;
4546 prs_debug(ps, depth, desc, "samr_io_r_query_aliasmem");
4547 depth++;
4549 if(!prs_align(ps))
4550 return False;
4552 if(!prs_uint32("num_sids ", ps, depth, &r_u->num_sids))
4553 return False;
4554 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
4555 return False;
4557 if (r_u->ptr != 0 && r_u->num_sids != 0) {
4558 uint32 *ptr_sid = NULL;
4560 if(!prs_uint32("num_sids1", ps, depth, &r_u->num_sids1))
4561 return False;
4563 ptr_sid = TALLOC_ARRAY(ps->mem_ctx, uint32, r_u->num_sids1);
4564 if (!ptr_sid) {
4565 return False;
4568 for (i = 0; i < r_u->num_sids1; i++) {
4569 ptr_sid[i] = 1;
4570 if(!prs_uint32("ptr_sid", ps, depth, &ptr_sid[i]))
4571 return False;
4574 if (UNMARSHALLING(ps)) {
4575 r_u->sid = TALLOC_ARRAY(ps->mem_ctx, DOM_SID2, r_u->num_sids1);
4578 for (i = 0; i < r_u->num_sids1; i++) {
4579 if (ptr_sid[i] != 0) {
4580 if(!smb_io_dom_sid2("sid", &r_u->sid[i], ps, depth))
4581 return False;
4586 if(!prs_align(ps))
4587 return False;
4588 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4589 return False;
4591 return True;
4594 /*******************************************************************
4595 inits a SAMR_Q_LOOKUP_NAMES structure.
4596 ********************************************************************/
4598 NTSTATUS init_samr_q_lookup_names(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_NAMES * q_u,
4599 POLICY_HND *pol, uint32 flags,
4600 uint32 num_names, const char **name)
4602 uint32 i;
4604 DEBUG(5, ("init_samr_q_lookup_names\n"));
4606 q_u->pol = *pol;
4608 q_u->num_names1 = num_names;
4609 q_u->flags = flags;
4610 q_u->ptr = 0;
4611 q_u->num_names2 = num_names;
4613 if (!(q_u->hdr_name = TALLOC_ZERO_ARRAY(ctx, UNIHDR, num_names)))
4614 return NT_STATUS_NO_MEMORY;
4616 if (!(q_u->uni_name = TALLOC_ZERO_ARRAY(ctx, UNISTR2, num_names)))
4617 return NT_STATUS_NO_MEMORY;
4619 for (i = 0; i < num_names; i++) {
4620 init_unistr2(&q_u->uni_name[i], name[i], UNI_FLAGS_NONE); /* unicode string for machine account */
4621 init_uni_hdr(&q_u->hdr_name[i], &q_u->uni_name[i]); /* unicode header for user_name */
4624 return NT_STATUS_OK;
4627 /*******************************************************************
4628 reads or writes a structure.
4629 ********************************************************************/
4631 BOOL samr_io_q_lookup_names(const char *desc, SAMR_Q_LOOKUP_NAMES * q_u,
4632 prs_struct *ps, int depth)
4634 uint32 i;
4636 if (q_u == NULL)
4637 return False;
4639 prs_debug(ps, depth, desc, "samr_io_q_lookup_names");
4640 depth++;
4642 if (UNMARSHALLING(ps))
4643 ZERO_STRUCTP(q_u);
4645 if(!prs_align(ps))
4646 return False;
4648 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4649 return False;
4651 if(!prs_uint32("num_names1", ps, depth, &q_u->num_names1))
4652 return False;
4653 if(!prs_uint32("flags ", ps, depth, &q_u->flags))
4654 return False;
4655 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
4656 return False;
4657 if(!prs_uint32("num_names2", ps, depth, &q_u->num_names2))
4658 return False;
4660 if (UNMARSHALLING(ps) && (q_u->num_names2 != 0)) {
4661 q_u->hdr_name = PRS_ALLOC_MEM(ps, UNIHDR, q_u->num_names2);
4662 q_u->uni_name = PRS_ALLOC_MEM(ps, UNISTR2, q_u->num_names2);
4663 if (!q_u->hdr_name || !q_u->uni_name)
4664 return False;
4667 for (i = 0; i < q_u->num_names2; i++) {
4668 if(!smb_io_unihdr("", &q_u->hdr_name[i], ps, depth))
4669 return False;
4672 for (i = 0; i < q_u->num_names2; i++) {
4673 if(!smb_io_unistr2("", &q_u->uni_name[i], q_u->hdr_name[i].buffer, ps, depth))
4674 return False;
4677 return True;
4680 /*******************************************************************
4681 inits a SAMR_R_LOOKUP_NAMES structure.
4682 ********************************************************************/
4684 NTSTATUS init_samr_r_lookup_names(TALLOC_CTX *ctx, SAMR_R_LOOKUP_NAMES * r_u,
4685 uint32 num_rids,
4686 uint32 *rid, uint32 *type,
4687 NTSTATUS status)
4689 DEBUG(5, ("init_samr_r_lookup_names\n"));
4691 if (NT_STATUS_IS_OK(status) && (num_rids != 0)) {
4692 uint32 i;
4694 r_u->num_types1 = num_rids;
4695 r_u->ptr_types = 1;
4696 r_u->num_types2 = num_rids;
4698 r_u->num_rids1 = num_rids;
4699 r_u->ptr_rids = 1;
4700 r_u->num_rids2 = num_rids;
4702 if (!(r_u->rids = TALLOC_ZERO_ARRAY(ctx, uint32, num_rids)))
4703 return NT_STATUS_NO_MEMORY;
4704 if (!(r_u->types = TALLOC_ZERO_ARRAY(ctx, uint32, num_rids)))
4705 return NT_STATUS_NO_MEMORY;
4707 if (!r_u->rids || !r_u->types)
4708 goto empty;
4710 for (i = 0; i < num_rids; i++) {
4711 r_u->rids[i] = rid[i];
4712 r_u->types[i] = type[i];
4714 } else {
4716 empty:
4717 r_u->num_types1 = 0;
4718 r_u->ptr_types = 0;
4719 r_u->num_types2 = 0;
4721 r_u->num_rids1 = 0;
4722 r_u->ptr_rids = 0;
4723 r_u->num_rids2 = 0;
4725 r_u->rids = NULL;
4726 r_u->types = NULL;
4729 r_u->status = status;
4731 return NT_STATUS_OK;
4734 /*******************************************************************
4735 reads or writes a structure.
4736 ********************************************************************/
4738 BOOL samr_io_r_lookup_names(const char *desc, SAMR_R_LOOKUP_NAMES * r_u,
4739 prs_struct *ps, int depth)
4741 uint32 i;
4742 fstring tmp;
4744 if (r_u == NULL)
4745 return False;
4747 prs_debug(ps, depth, desc, "samr_io_r_lookup_names");
4748 depth++;
4750 if (UNMARSHALLING(ps))
4751 ZERO_STRUCTP(r_u);
4753 if(!prs_align(ps))
4754 return False;
4756 if(!prs_uint32("num_rids1", ps, depth, &r_u->num_rids1))
4757 return False;
4758 if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids))
4759 return False;
4761 if (r_u->ptr_rids != 0) {
4762 if(!prs_uint32("num_rids2", ps, depth, &r_u->num_rids2))
4763 return False;
4765 if (r_u->num_rids2 != r_u->num_rids1) {
4766 /* RPC fault */
4767 return False;
4770 if (UNMARSHALLING(ps))
4771 r_u->rids = PRS_ALLOC_MEM(ps, uint32, r_u->num_rids2);
4773 if (!r_u->rids) {
4774 DEBUG(0, ("NULL rids in samr_io_r_lookup_names\n"));
4775 return False;
4778 for (i = 0; i < r_u->num_rids2; i++) {
4779 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
4780 if(!prs_uint32(tmp, ps, depth, &r_u->rids[i]))
4781 return False;
4785 if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1))
4786 return False;
4787 if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types))
4788 return False;
4790 if (r_u->ptr_types != 0) {
4791 if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2))
4792 return False;
4794 if (r_u->num_types2 != r_u->num_types1) {
4795 /* RPC fault */
4796 return False;
4799 if (UNMARSHALLING(ps))
4800 r_u->types = PRS_ALLOC_MEM(ps, uint32, r_u->num_types2);
4802 if (!r_u->types) {
4803 DEBUG(0, ("NULL types in samr_io_r_lookup_names\n"));
4804 return False;
4807 for (i = 0; i < r_u->num_types2; i++) {
4808 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
4809 if(!prs_uint32(tmp, ps, depth, &r_u->types[i]))
4810 return False;
4814 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4815 return False;
4817 return True;
4820 /*******************************************************************
4821 inits a SAMR_Q_DELETE_DOM_USER structure.
4822 ********************************************************************/
4824 void init_samr_q_delete_dom_user(SAMR_Q_DELETE_DOM_USER * q_c,
4825 POLICY_HND *hnd)
4827 DEBUG(5, ("init_samr_q_delete_dom_user\n"));
4829 q_c->user_pol = *hnd;
4832 /*******************************************************************
4833 reads or writes a structure.
4834 ********************************************************************/
4836 BOOL samr_io_q_delete_dom_user(const char *desc, SAMR_Q_DELETE_DOM_USER * q_u,
4837 prs_struct *ps, int depth)
4839 if (q_u == NULL)
4840 return False;
4842 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_user");
4843 depth++;
4845 if(!prs_align(ps))
4846 return False;
4848 if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth))
4849 return False;
4851 return True;
4854 /*******************************************************************
4855 reads or writes a structure.
4856 ********************************************************************/
4858 BOOL samr_io_r_delete_dom_user(const char *desc, SAMR_R_DELETE_DOM_USER * r_u,
4859 prs_struct *ps, int depth)
4861 if (r_u == NULL)
4862 return False;
4864 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_user");
4865 depth++;
4867 if(!prs_align(ps))
4868 return False;
4870 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
4871 return False;
4872 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4873 return False;
4875 return True;
4878 /*******************************************************************
4879 reads or writes a structure.
4880 ********************************************************************/
4882 void init_samr_q_open_user(SAMR_Q_OPEN_USER * q_u,
4883 POLICY_HND *pol,
4884 uint32 access_mask, uint32 rid)
4886 DEBUG(5, ("samr_init_samr_q_open_user\n"));
4888 q_u->domain_pol = *pol;
4889 q_u->access_mask = access_mask;
4890 q_u->user_rid = rid;
4893 /*******************************************************************
4894 reads or writes a structure.
4895 ********************************************************************/
4897 BOOL samr_io_q_open_user(const char *desc, SAMR_Q_OPEN_USER * q_u,
4898 prs_struct *ps, int depth)
4900 if (q_u == NULL)
4901 return False;
4903 prs_debug(ps, depth, desc, "samr_io_q_open_user");
4904 depth++;
4906 if(!prs_align(ps))
4907 return False;
4909 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
4910 return False;
4912 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
4913 return False;
4914 if(!prs_uint32("user_rid ", ps, depth, &q_u->user_rid))
4915 return False;
4917 return True;
4920 /*******************************************************************
4921 reads or writes a structure.
4922 ********************************************************************/
4924 BOOL samr_io_r_open_user(const char *desc, SAMR_R_OPEN_USER * r_u,
4925 prs_struct *ps, int depth)
4927 if (r_u == NULL)
4928 return False;
4930 prs_debug(ps, depth, desc, "samr_io_r_open_user");
4931 depth++;
4933 if(!prs_align(ps))
4934 return False;
4936 if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth))
4937 return False;
4939 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4940 return False;
4942 return True;
4946 /*******************************************************************
4947 reads or writes a structure.
4948 ********************************************************************/
4950 void init_samr_q_create_user(SAMR_Q_CREATE_USER * q_u,
4951 POLICY_HND *pol,
4952 const char *name,
4953 uint32 acb_info, uint32 access_mask)
4955 DEBUG(5, ("samr_init_samr_q_create_user\n"));
4957 q_u->domain_pol = *pol;
4959 init_unistr2(&q_u->uni_name, name, UNI_FLAGS_NONE);
4960 init_uni_hdr(&q_u->hdr_name, &q_u->uni_name);
4962 q_u->acb_info = acb_info;
4963 q_u->access_mask = access_mask;
4966 /*******************************************************************
4967 reads or writes a structure.
4968 ********************************************************************/
4970 BOOL samr_io_q_create_user(const char *desc, SAMR_Q_CREATE_USER * q_u,
4971 prs_struct *ps, int depth)
4973 if (q_u == NULL)
4974 return False;
4976 prs_debug(ps, depth, desc, "samr_io_q_create_user");
4977 depth++;
4979 if(!prs_align(ps))
4980 return False;
4982 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
4983 return False;
4985 if(!smb_io_unihdr("hdr_name", &q_u->hdr_name, ps, depth))
4986 return False;
4987 if(!smb_io_unistr2("uni_name", &q_u->uni_name, q_u->hdr_name.buffer, ps, depth))
4988 return False;
4990 if(!prs_align(ps))
4991 return False;
4992 if(!prs_uint32("acb_info ", ps, depth, &q_u->acb_info))
4993 return False;
4994 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
4995 return False;
4997 return True;
5000 /*******************************************************************
5001 reads or writes a structure.
5002 ********************************************************************/
5004 BOOL samr_io_r_create_user(const char *desc, SAMR_R_CREATE_USER * r_u,
5005 prs_struct *ps, int depth)
5007 if (r_u == NULL)
5008 return False;
5010 prs_debug(ps, depth, desc, "samr_io_r_create_user");
5011 depth++;
5013 if(!prs_align(ps))
5014 return False;
5016 if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth))
5017 return False;
5019 if(!prs_uint32("access_granted", ps, depth, &r_u->access_granted))
5020 return False;
5021 if(!prs_uint32("user_rid ", ps, depth, &r_u->user_rid))
5022 return False;
5023 if(!prs_ntstatus("status", ps, depth, &r_u->status))
5024 return False;
5026 return True;
5029 /*******************************************************************
5030 inits a SAMR_Q_QUERY_USERINFO structure.
5031 ********************************************************************/
5033 void init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO * q_u,
5034 POLICY_HND *hnd, uint16 switch_value)
5036 DEBUG(5, ("init_samr_q_query_userinfo\n"));
5038 q_u->pol = *hnd;
5039 q_u->switch_value = switch_value;
5042 /*******************************************************************
5043 reads or writes a structure.
5044 ********************************************************************/
5046 BOOL samr_io_q_query_userinfo(const char *desc, SAMR_Q_QUERY_USERINFO * q_u,
5047 prs_struct *ps, int depth)
5049 if (q_u == NULL)
5050 return False;
5052 prs_debug(ps, depth, desc, "samr_io_q_query_userinfo");
5053 depth++;
5055 if(!prs_align(ps))
5056 return False;
5058 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
5059 return False;
5061 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) /* 0x0015 or 0x0011 */
5062 return False;
5064 return True;
5067 /*******************************************************************
5068 reads or writes a LOGON_HRS structure.
5069 ********************************************************************/
5071 static BOOL sam_io_logon_hrs(const char *desc, LOGON_HRS * hrs,
5072 prs_struct *ps, int depth)
5074 if (hrs == NULL)
5075 return False;
5077 prs_debug(ps, depth, desc, "sam_io_logon_hrs");
5078 depth++;
5080 if(!prs_align(ps))
5081 return False;
5083 if(!prs_uint32("maxlen", ps, depth, &hrs->max_len))
5084 return False;
5086 if(!prs_uint32("offset", ps, depth, &hrs->offset))
5087 return False;
5089 if(!prs_uint32("len ", ps, depth, &hrs->len))
5090 return False;
5092 if (hrs->len > sizeof(hrs->hours)) {
5093 DEBUG(3, ("sam_io_logon_hrs: truncating length from %d\n", hrs->len));
5094 hrs->len = sizeof(hrs->hours);
5097 if(!prs_uint8s(False, "hours", ps, depth, hrs->hours, hrs->len))
5098 return False;
5100 return True;
5103 /*******************************************************************
5104 inits a SAM_USER_INFO_18 structure.
5105 ********************************************************************/
5107 void init_sam_user_info18(SAM_USER_INFO_18 * usr,
5108 const uint8 lm_pwd[16], const uint8 nt_pwd[16])
5110 DEBUG(5, ("init_sam_user_info18\n"));
5112 usr->lm_pwd_active =
5113 memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd)) ? 1 : 0;
5114 usr->nt_pwd_active =
5115 memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd)) ? 1 : 0;
5118 /*******************************************************************
5119 reads or writes a structure.
5120 ********************************************************************/
5122 static BOOL sam_io_user_info18(const char *desc, SAM_USER_INFO_18 * u,
5123 prs_struct *ps, int depth)
5125 if (u == NULL)
5126 return False;
5128 prs_debug(ps, depth, desc, "samr_io_r_user_info18");
5129 depth++;
5131 if(!prs_align(ps))
5132 return False;
5134 if(!prs_uint8s(False, "lm_pwd", ps, depth, u->lm_pwd, sizeof(u->lm_pwd)))
5135 return False;
5136 if(!prs_uint8s(False, "nt_pwd", ps, depth, u->nt_pwd, sizeof(u->nt_pwd)))
5137 return False;
5139 if(!prs_uint8("lm_pwd_active", ps, depth, &u->lm_pwd_active))
5140 return False;
5141 if(!prs_uint8("nt_pwd_active", ps, depth, &u->nt_pwd_active))
5142 return False;
5144 return True;
5147 /*******************************************************************
5148 inits a SAM_USER_INFO_7 structure.
5149 ********************************************************************/
5151 void init_sam_user_info7(SAM_USER_INFO_7 * usr, const char *name)
5153 DEBUG(5, ("init_sam_user_info7\n"));
5155 init_unistr2(&usr->uni_name, name, UNI_FLAGS_NONE); /* unicode string for name */
5156 init_uni_hdr(&usr->hdr_name, &usr->uni_name); /* unicode header for name */
5160 /*******************************************************************
5161 reads or writes a structure.
5162 ********************************************************************/
5164 static BOOL sam_io_user_info7(const char *desc, SAM_USER_INFO_7 * usr,
5165 prs_struct *ps, int depth)
5167 if (usr == NULL)
5168 return False;
5170 prs_debug(ps, depth, desc, "samr_io_r_user_info7");
5171 depth++;
5173 if(!prs_align(ps))
5174 return False;
5176 if(!smb_io_unihdr("unihdr", &usr->hdr_name, ps, depth))
5177 return False;
5179 if(!smb_io_unistr2("unistr2", &usr->uni_name, True, ps, depth))
5180 return False;
5182 return True;
5185 /*******************************************************************
5186 inits a SAM_USER_INFO_16 structure.
5187 ********************************************************************/
5189 void init_sam_user_info16(SAM_USER_INFO_16 * usr, uint32 acb_info)
5191 DEBUG(5, ("init_sam_user_info16\n"));
5193 usr->acb_info = acb_info;
5196 /*******************************************************************
5197 reads or writes a structure.
5198 ********************************************************************/
5200 static BOOL sam_io_user_info16(const char *desc, SAM_USER_INFO_16 * usr,
5201 prs_struct *ps, int depth)
5203 if (usr == NULL)
5204 return False;
5206 prs_debug(ps, depth, desc, "samr_io_r_user_info16");
5207 depth++;
5209 if(!prs_align(ps))
5210 return False;
5212 if(!prs_uint32("acb_info", ps, depth, &usr->acb_info))
5213 return False;
5215 return True;
5218 /*******************************************************************
5219 inits a SAM_USER_INFO_17 structure.
5220 ********************************************************************/
5222 void init_sam_user_info17(SAM_USER_INFO_17 * usr,
5223 NTTIME * expiry,
5224 char *mach_acct,
5225 uint32 rid_user, uint32 rid_group, uint16 acct_ctrl)
5227 DEBUG(5, ("init_sam_user_info17\n"));
5229 memcpy(&usr->expiry, expiry, sizeof(usr->expiry)); /* expiry time or something? */
5230 ZERO_STRUCT(usr->padding_1); /* 0 - padding 24 bytes */
5232 usr->padding_2 = 0; /* 0 - padding 4 bytes */
5234 usr->ptr_1 = 1; /* pointer */
5235 ZERO_STRUCT(usr->padding_3); /* 0 - padding 32 bytes */
5236 usr->padding_4 = 0; /* 0 - padding 4 bytes */
5238 usr->ptr_2 = 1; /* pointer */
5239 usr->padding_5 = 0; /* 0 - padding 4 bytes */
5241 usr->ptr_3 = 1; /* pointer */
5242 ZERO_STRUCT(usr->padding_6); /* 0 - padding 32 bytes */
5244 usr->rid_user = rid_user;
5245 usr->rid_group = rid_group;
5247 usr->acct_ctrl = acct_ctrl;
5248 usr->unknown_3 = 0x0000;
5250 usr->unknown_4 = 0x003f; /* 0x003f - 16 bit unknown */
5251 usr->unknown_5 = 0x003c; /* 0x003c - 16 bit unknown */
5253 ZERO_STRUCT(usr->padding_7); /* 0 - padding 16 bytes */
5254 usr->padding_8 = 0; /* 0 - padding 4 bytes */
5256 init_unistr2(&usr->uni_mach_acct, mach_acct, UNI_FLAGS_NONE); /* unicode string for machine account */
5257 init_uni_hdr(&usr->hdr_mach_acct, &usr->uni_mach_acct); /* unicode header for machine account */
5260 /*******************************************************************
5261 reads or writes a structure.
5262 ********************************************************************/
5264 static BOOL sam_io_user_info17(const char *desc, SAM_USER_INFO_17 * usr,
5265 prs_struct *ps, int depth)
5267 if (usr == NULL)
5268 return False;
5270 prs_debug(ps, depth, desc, "samr_io_r_unknown_17");
5271 depth++;
5273 if(!prs_align(ps))
5274 return False;
5276 if(!prs_uint8s(False, "padding_0", ps, depth, usr->padding_0, sizeof(usr->padding_0)))
5277 return False;
5279 if(!smb_io_time("time", &usr->expiry, ps, depth))
5280 return False;
5282 if(!prs_uint8s(False, "padding_1", ps, depth, usr->padding_1, sizeof(usr->padding_1)))
5283 return False;
5285 if(!smb_io_unihdr("unihdr", &usr->hdr_mach_acct, ps, depth))
5286 return False;
5288 if(!prs_uint32("padding_2", ps, depth, &usr->padding_2))
5289 return False;
5291 if(!prs_uint32("ptr_1 ", ps, depth, &usr->ptr_1))
5292 return False;
5293 if(!prs_uint8s(False, "padding_3", ps, depth, usr->padding_3, sizeof(usr->padding_3)))
5294 return False;
5296 if(!prs_uint32("padding_4", ps, depth, &usr->padding_4))
5297 return False;
5299 if(!prs_uint32("ptr_2 ", ps, depth, &usr->ptr_2))
5300 return False;
5301 if(!prs_uint32("padding_5", ps, depth, &usr->padding_5))
5302 return False;
5304 if(!prs_uint32("ptr_3 ", ps, depth, &usr->ptr_3))
5305 return False;
5306 if(!prs_uint8s(False, "padding_6", ps, depth, usr->padding_6,sizeof(usr->padding_6)))
5307 return False;
5309 if(!prs_uint32("rid_user ", ps, depth, &usr->rid_user))
5310 return False;
5311 if(!prs_uint32("rid_group", ps, depth, &usr->rid_group))
5312 return False;
5313 if(!prs_uint16("acct_ctrl", ps, depth, &usr->acct_ctrl))
5314 return False;
5315 if(!prs_uint16("unknown_3", ps, depth, &usr->unknown_3))
5316 return False;
5317 if(!prs_uint16("unknown_4", ps, depth, &usr->unknown_4))
5318 return False;
5319 if(!prs_uint16("unknown_5", ps, depth, &usr->unknown_5))
5320 return False;
5322 if(!prs_uint8s(False, "padding_7", ps, depth, usr->padding_7, sizeof(usr->padding_7)))
5323 return False;
5325 if(!prs_uint32("padding_8", ps, depth, &(usr->padding_8)))
5326 return False;
5328 if(!smb_io_unistr2("unistr2", &usr->uni_mach_acct, True, ps, depth))
5329 return False;
5331 if(!prs_align(ps))
5332 return False;
5334 if(!prs_uint8s(False, "padding_9", ps, depth, usr->padding_9, sizeof(usr->padding_9)))
5335 return False;
5337 return True;
5340 /*************************************************************************
5341 init_sam_user_infoa
5342 *************************************************************************/
5344 void init_sam_user_info24(SAM_USER_INFO_24 * usr, char newpass[516], uint16 pw_len)
5346 DEBUG(10, ("init_sam_user_info24:\n"));
5347 memcpy(usr->pass, newpass, sizeof(usr->pass));
5348 usr->pw_len = pw_len;
5351 /*******************************************************************
5352 reads or writes a structure.
5353 ********************************************************************/
5355 static BOOL sam_io_user_info24(const char *desc, SAM_USER_INFO_24 * usr,
5356 prs_struct *ps, int depth)
5358 if (usr == NULL)
5359 return False;
5361 prs_debug(ps, depth, desc, "sam_io_user_info24");
5362 depth++;
5364 if(!prs_align(ps))
5365 return False;
5367 if(!prs_uint8s(False, "password", ps, depth, usr->pass,
5368 sizeof(usr->pass)))
5369 return False;
5371 if (MARSHALLING(ps) && (usr->pw_len != 0)) {
5372 if (!prs_uint16("pw_len", ps, depth, &usr->pw_len))
5373 return False;
5375 if(!prs_align(ps))
5376 return False;
5378 return True;
5381 /*************************************************************************
5382 init_sam_user_info23
5384 unknown_6 = 0x0000 04ec
5386 *************************************************************************/
5388 void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */
5389 NTTIME * logoff_time, /* all zeros */
5390 NTTIME * kickoff_time, /* all zeros */
5391 NTTIME * pass_last_set_time, /* all zeros */
5392 NTTIME * pass_can_change_time, /* all zeros */
5393 NTTIME * pass_must_change_time, /* all zeros */
5394 UNISTR2 *user_name,
5395 UNISTR2 *full_name,
5396 UNISTR2 *home_dir,
5397 UNISTR2 *dir_drive,
5398 UNISTR2 *log_scr,
5399 UNISTR2 *prof_path,
5400 UNISTR2 *desc,
5401 UNISTR2 *wkstas,
5402 UNISTR2 *unk_str,
5403 UNISTR2 *mung_dial,
5404 uint32 user_rid, /* 0x0000 0000 */
5405 uint32 group_rid,
5406 uint32 acb_info,
5407 uint32 fields_present,
5408 uint16 logon_divs,
5409 LOGON_HRS * hrs,
5410 uint16 bad_password_count,
5411 uint16 logon_count,
5412 char newpass[516])
5414 usr->logon_time = *logon_time; /* all zeros */
5415 usr->logoff_time = *logoff_time; /* all zeros */
5416 usr->kickoff_time = *kickoff_time; /* all zeros */
5417 usr->pass_last_set_time = *pass_last_set_time; /* all zeros */
5418 usr->pass_can_change_time = *pass_can_change_time; /* all zeros */
5419 usr->pass_must_change_time = *pass_must_change_time; /* all zeros */
5421 ZERO_STRUCT(usr->nt_pwd);
5422 ZERO_STRUCT(usr->lm_pwd);
5424 usr->user_rid = user_rid; /* 0x0000 0000 */
5425 usr->group_rid = group_rid;
5426 usr->acb_info = acb_info;
5427 usr->fields_present = fields_present; /* 09f8 27fa */
5429 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5430 usr->ptr_logon_hrs = hrs ? 1 : 0;
5432 if (nt_time_is_zero(pass_must_change_time)) {
5433 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
5434 } else {
5435 usr->passmustchange=0;
5438 ZERO_STRUCT(usr->padding1);
5439 ZERO_STRUCT(usr->padding2);
5441 usr->bad_password_count = bad_password_count;
5442 usr->logon_count = logon_count;
5444 memcpy(usr->pass, newpass, sizeof(usr->pass));
5446 copy_unistr2(&usr->uni_user_name, user_name);
5447 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
5449 copy_unistr2(&usr->uni_full_name, full_name);
5450 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
5452 copy_unistr2(&usr->uni_home_dir, home_dir);
5453 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
5455 copy_unistr2(&usr->uni_dir_drive, dir_drive);
5456 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
5458 copy_unistr2(&usr->uni_logon_script, log_scr);
5459 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
5461 copy_unistr2(&usr->uni_profile_path, prof_path);
5462 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
5464 copy_unistr2(&usr->uni_acct_desc, desc);
5465 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
5467 copy_unistr2(&usr->uni_workstations, wkstas);
5468 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
5470 copy_unistr2(&usr->uni_unknown_str, unk_str);
5471 init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
5473 copy_unistr2(&usr->uni_munged_dial, mung_dial);
5474 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
5476 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
5479 /*************************************************************************
5480 init_sam_user_info23
5482 unknown_6 = 0x0000 04ec
5484 *************************************************************************/
5486 void init_sam_user_info23A(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */
5487 NTTIME * logoff_time, /* all zeros */
5488 NTTIME * kickoff_time, /* all zeros */
5489 NTTIME * pass_last_set_time, /* all zeros */
5490 NTTIME * pass_can_change_time, /* all zeros */
5491 NTTIME * pass_must_change_time, /* all zeros */
5492 char *user_name, /* NULL */
5493 char *full_name,
5494 char *home_dir, char *dir_drive, char *log_scr,
5495 char *prof_path, const char *desc, char *wkstas,
5496 char *unk_str, char *mung_dial, uint32 user_rid, /* 0x0000 0000 */
5497 uint32 group_rid, uint32 acb_info,
5498 uint32 fields_present, uint16 logon_divs,
5499 LOGON_HRS * hrs, uint16 bad_password_count, uint16 logon_count,
5500 char newpass[516])
5502 DATA_BLOB blob = base64_decode_data_blob(mung_dial);
5504 usr->logon_time = *logon_time; /* all zeros */
5505 usr->logoff_time = *logoff_time; /* all zeros */
5506 usr->kickoff_time = *kickoff_time; /* all zeros */
5507 usr->pass_last_set_time = *pass_last_set_time; /* all zeros */
5508 usr->pass_can_change_time = *pass_can_change_time; /* all zeros */
5509 usr->pass_must_change_time = *pass_must_change_time; /* all zeros */
5511 ZERO_STRUCT(usr->nt_pwd);
5512 ZERO_STRUCT(usr->lm_pwd);
5514 usr->user_rid = user_rid; /* 0x0000 0000 */
5515 usr->group_rid = group_rid;
5516 usr->acb_info = acb_info;
5517 usr->fields_present = fields_present; /* 09f8 27fa */
5519 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5520 usr->ptr_logon_hrs = hrs ? 1 : 0;
5522 if (nt_time_is_zero(pass_must_change_time)) {
5523 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
5524 } else {
5525 usr->passmustchange=0;
5528 ZERO_STRUCT(usr->padding1);
5529 ZERO_STRUCT(usr->padding2);
5531 usr->bad_password_count = bad_password_count;
5532 usr->logon_count = logon_count;
5534 memcpy(usr->pass, newpass, sizeof(usr->pass));
5536 init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
5537 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
5539 init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
5540 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
5542 init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
5543 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
5545 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
5546 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
5548 init_unistr2(&usr->uni_logon_script, log_scr, UNI_FLAGS_NONE);
5549 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
5551 init_unistr2(&usr->uni_profile_path, prof_path, UNI_FLAGS_NONE);
5552 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
5554 init_unistr2(&usr->uni_acct_desc, desc, UNI_FLAGS_NONE);
5555 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
5557 init_unistr2(&usr->uni_workstations, wkstas, UNI_FLAGS_NONE);
5558 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
5560 init_unistr2(&usr->uni_unknown_str, unk_str, UNI_FLAGS_NONE);
5561 init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
5563 init_unistr2_from_datablob(&usr->uni_munged_dial, &blob);
5564 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
5566 data_blob_free(&blob);
5568 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
5571 /*******************************************************************
5572 reads or writes a structure.
5573 ********************************************************************/
5575 static BOOL sam_io_user_info23(const char *desc, SAM_USER_INFO_23 * usr,
5576 prs_struct *ps, int depth)
5578 if (usr == NULL)
5579 return False;
5581 prs_debug(ps, depth, desc, "sam_io_user_info23");
5582 depth++;
5584 if(!prs_align(ps))
5585 return False;
5587 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
5588 return False;
5589 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
5590 return False;
5591 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
5592 return False;
5593 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth))
5594 return False;
5595 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth))
5596 return False;
5597 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
5598 return False;
5600 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
5601 return False;
5602 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
5603 return False;
5604 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
5605 return False;
5606 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
5607 return False;
5608 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
5609 return False;
5610 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
5611 return False;
5612 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
5613 return False;
5614 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
5615 return False;
5616 if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */
5617 return False;
5618 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
5619 return False;
5621 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
5622 return False;
5623 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
5624 return False;
5626 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
5627 return False;
5628 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
5629 return False;
5630 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
5631 return False;
5633 if(!prs_uint32("fields_present ", ps, depth, &usr->fields_present))
5634 return False;
5635 if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */
5636 return False;
5637 if(!prs_align(ps))
5638 return False;
5639 if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs))
5640 return False;
5642 if(!prs_uint16("bad_password_count ", ps, depth, &usr->bad_password_count))
5643 return False;
5644 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count))
5645 return False;
5647 if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1)))
5648 return False;
5649 if(!prs_uint8("passmustchange ", ps, depth, &usr->passmustchange))
5650 return False;
5651 if(!prs_uint8("padding2 ", ps, depth, &usr->padding2))
5652 return False;
5655 if(!prs_uint8s(False, "password ", ps, depth, usr->pass, sizeof(usr->pass)))
5656 return False;
5658 /* here begins pointed-to data */
5660 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
5661 return False;
5663 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
5664 return False;
5666 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
5667 return False;
5669 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
5670 return False;
5672 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
5673 return False;
5675 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
5676 return False;
5678 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
5679 return False;
5681 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
5682 return False;
5684 if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */
5685 return False;
5687 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth))
5688 return False;
5690 /* ok, this is only guess-work (as usual) */
5691 if (usr->ptr_logon_hrs) {
5692 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
5693 return False;
5696 return True;
5699 /*******************************************************************
5700 reads or writes a structure.
5701 NB. This structure is *definately* incorrect. It's my best guess
5702 currently for W2K SP2. The password field is encrypted in a different
5703 way than normal... And there are definately other problems. JRA.
5704 ********************************************************************/
5706 static BOOL sam_io_user_info25(const char *desc, SAM_USER_INFO_25 * usr, prs_struct *ps, int depth)
5708 if (usr == NULL)
5709 return False;
5711 prs_debug(ps, depth, desc, "sam_io_user_info25");
5712 depth++;
5714 if(!prs_align(ps))
5715 return False;
5717 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
5718 return False;
5719 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
5720 return False;
5721 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
5722 return False;
5723 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth))
5724 return False;
5725 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth))
5726 return False;
5727 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
5728 return False;
5730 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
5731 return False;
5732 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
5733 return False;
5734 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
5735 return False;
5736 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
5737 return False;
5738 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
5739 return False;
5740 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
5741 return False;
5742 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
5743 return False;
5744 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
5745 return False;
5746 if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */
5747 return False;
5748 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
5749 return False;
5751 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
5752 return False;
5753 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
5754 return False;
5756 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
5757 return False;
5758 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
5759 return False;
5760 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
5761 return False;
5763 if(!prs_uint32s(False, "unknown_6 ", ps, depth, usr->unknown_6, 6))
5764 return False;
5766 if(!prs_uint8s(False, "password ", ps, depth, usr->pass, sizeof(usr->pass)))
5767 return False;
5769 /* here begins pointed-to data */
5771 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
5772 return False;
5774 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
5775 return False;
5777 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
5778 return False;
5780 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
5781 return False;
5783 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
5784 return False;
5786 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
5787 return False;
5789 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
5790 return False;
5792 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
5793 return False;
5795 if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */
5796 return False;
5798 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth))
5799 return False;
5801 #if 0 /* JRA - unknown... */
5802 /* ok, this is only guess-work (as usual) */
5803 if (usr->ptr_logon_hrs) {
5804 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
5805 return False;
5807 #endif
5809 return True;
5813 /*************************************************************************
5814 init_sam_user_info21W
5816 unknown_6 = 0x0000 04ec
5818 *************************************************************************/
5820 void init_sam_user_info21W(SAM_USER_INFO_21 * usr,
5821 NTTIME * logon_time,
5822 NTTIME * logoff_time,
5823 NTTIME * kickoff_time,
5824 NTTIME * pass_last_set_time,
5825 NTTIME * pass_can_change_time,
5826 NTTIME * pass_must_change_time,
5827 UNISTR2 *user_name,
5828 UNISTR2 *full_name,
5829 UNISTR2 *home_dir,
5830 UNISTR2 *dir_drive,
5831 UNISTR2 *log_scr,
5832 UNISTR2 *prof_path,
5833 UNISTR2 *desc,
5834 UNISTR2 *wkstas,
5835 UNISTR2 *unk_str,
5836 UNISTR2 *mung_dial,
5837 uchar lm_pwd[16],
5838 uchar nt_pwd[16],
5839 uint32 user_rid,
5840 uint32 group_rid,
5841 uint32 acb_info,
5842 uint32 fields_present,
5843 uint16 logon_divs,
5844 LOGON_HRS * hrs,
5845 uint16 bad_password_count,
5846 uint16 logon_count)
5848 usr->logon_time = *logon_time;
5849 usr->logoff_time = *logoff_time;
5850 usr->kickoff_time = *kickoff_time;
5851 usr->pass_last_set_time = *pass_last_set_time;
5852 usr->pass_can_change_time = *pass_can_change_time;
5853 usr->pass_must_change_time = *pass_must_change_time;
5855 memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd));
5856 memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd));
5858 usr->user_rid = user_rid;
5859 usr->group_rid = group_rid;
5860 usr->acb_info = acb_info;
5861 usr->fields_present = fields_present; /* 0x00ff ffff */
5863 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5864 usr->ptr_logon_hrs = hrs ? 1 : 0;
5865 usr->bad_password_count = bad_password_count;
5866 usr->logon_count = logon_count;
5868 if (nt_time_is_zero(pass_must_change_time)) {
5869 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
5870 } else {
5871 usr->passmustchange=0;
5874 ZERO_STRUCT(usr->padding1);
5875 ZERO_STRUCT(usr->padding2);
5877 copy_unistr2(&usr->uni_user_name, user_name);
5878 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
5880 copy_unistr2(&usr->uni_full_name, full_name);
5881 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
5883 copy_unistr2(&usr->uni_home_dir, home_dir);
5884 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
5886 copy_unistr2(&usr->uni_dir_drive, dir_drive);
5887 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
5889 copy_unistr2(&usr->uni_logon_script, log_scr);
5890 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
5892 copy_unistr2(&usr->uni_profile_path, prof_path);
5893 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
5895 copy_unistr2(&usr->uni_acct_desc, desc);
5896 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
5898 copy_unistr2(&usr->uni_workstations, wkstas);
5899 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
5901 copy_unistr2(&usr->uni_unknown_str, unk_str);
5902 init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
5904 copy_unistr2(&usr->uni_munged_dial, mung_dial);
5905 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
5907 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
5910 /*************************************************************************
5911 init_sam_user_info21
5913 unknown_6 = 0x0000 04ec
5915 *************************************************************************/
5917 NTSTATUS init_sam_user_info21A(SAM_USER_INFO_21 *usr, SAM_ACCOUNT *pw, DOM_SID *domain_sid)
5919 NTTIME logon_time, logoff_time, kickoff_time,
5920 pass_last_set_time, pass_can_change_time,
5921 pass_must_change_time;
5923 const char* user_name = pdb_get_username(pw);
5924 const char* full_name = pdb_get_fullname(pw);
5925 const char* home_dir = pdb_get_homedir(pw);
5926 const char* dir_drive = pdb_get_dir_drive(pw);
5927 const char* logon_script = pdb_get_logon_script(pw);
5928 const char* profile_path = pdb_get_profile_path(pw);
5929 const char* description = pdb_get_acct_desc(pw);
5930 const char* workstations = pdb_get_workstations(pw);
5931 const char* munged_dial = pdb_get_munged_dial(pw);
5932 DATA_BLOB munged_dial_blob;
5934 uint32 user_rid;
5935 const DOM_SID *user_sid;
5937 uint32 group_rid;
5938 const DOM_SID *group_sid;
5940 if (munged_dial) {
5941 munged_dial_blob = base64_decode_data_blob(munged_dial);
5942 } else {
5943 munged_dial_blob = data_blob(NULL, 0);
5946 /* Create NTTIME structs */
5947 unix_to_nt_time (&logon_time, pdb_get_logon_time(pw));
5948 unix_to_nt_time (&logoff_time, pdb_get_logoff_time(pw));
5949 unix_to_nt_time (&kickoff_time, pdb_get_kickoff_time(pw));
5950 unix_to_nt_time (&pass_last_set_time, pdb_get_pass_last_set_time(pw));
5951 unix_to_nt_time (&pass_can_change_time, pdb_get_pass_can_change_time(pw));
5952 unix_to_nt_time (&pass_must_change_time,pdb_get_pass_must_change_time(pw));
5954 /* structure assignment */
5955 usr->logon_time = logon_time;
5956 usr->logoff_time = logoff_time;
5957 usr->kickoff_time = kickoff_time;
5958 usr->pass_last_set_time = pass_last_set_time;
5959 usr->pass_can_change_time = pass_can_change_time;
5960 usr->pass_must_change_time = pass_must_change_time;
5962 ZERO_STRUCT(usr->nt_pwd);
5963 ZERO_STRUCT(usr->lm_pwd);
5965 user_sid = pdb_get_user_sid(pw);
5967 if (!sid_peek_check_rid(domain_sid, user_sid, &user_rid)) {
5968 fstring user_sid_string;
5969 fstring domain_sid_string;
5970 DEBUG(0, ("init_sam_user_info_21A: User %s has SID %s, \nwhich conflicts with "
5971 "the domain sid %s. Failing operation.\n",
5972 user_name,
5973 sid_to_string(user_sid_string, user_sid),
5974 sid_to_string(domain_sid_string, domain_sid)));
5975 data_blob_free(&munged_dial_blob);
5976 return NT_STATUS_UNSUCCESSFUL;
5979 group_sid = pdb_get_group_sid(pw);
5981 if (!sid_peek_check_rid(domain_sid, group_sid, &group_rid)) {
5982 fstring group_sid_string;
5983 fstring domain_sid_string;
5984 DEBUG(0, ("init_sam_user_info_21A: User %s has Primary Group SID %s, \n"
5985 "which conflicts with the domain sid %s. Failing operation.\n",
5986 user_name,
5987 sid_to_string(group_sid_string, group_sid),
5988 sid_to_string(domain_sid_string, domain_sid)));
5989 data_blob_free(&munged_dial_blob);
5990 return NT_STATUS_UNSUCCESSFUL;
5993 usr->user_rid = user_rid;
5994 usr->group_rid = group_rid;
5995 usr->acb_info = pdb_get_acct_ctrl(pw);
5998 Look at a user on a real NT4 PDC with usrmgr, press
5999 'ok'. Then you will see that fields_present is set to
6000 0x08f827fa. Look at the user immediately after that again,
6001 and you will see that 0x00fffff is returned. This solves
6002 the problem that you get access denied after having looked
6003 at the user.
6004 -- Volker
6006 usr->fields_present = pdb_build_fields_present(pw);
6008 usr->logon_divs = pdb_get_logon_divs(pw);
6009 usr->ptr_logon_hrs = pdb_get_hours(pw) ? 1 : 0;
6010 usr->bad_password_count = pdb_get_bad_password_count(pw);
6011 usr->logon_count = pdb_get_logon_count(pw);
6013 if (pdb_get_pass_must_change_time(pw) == 0) {
6014 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
6015 } else {
6016 usr->passmustchange=0;
6019 ZERO_STRUCT(usr->padding1);
6020 ZERO_STRUCT(usr->padding2);
6022 init_unistr2(&usr->uni_user_name, user_name, UNI_STR_TERMINATE);
6023 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
6025 init_unistr2(&usr->uni_full_name, full_name, UNI_STR_TERMINATE);
6026 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
6028 init_unistr2(&usr->uni_home_dir, home_dir, UNI_STR_TERMINATE);
6029 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
6031 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_STR_TERMINATE);
6032 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
6034 init_unistr2(&usr->uni_logon_script, logon_script, UNI_STR_TERMINATE);
6035 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
6037 init_unistr2(&usr->uni_profile_path, profile_path, UNI_STR_TERMINATE);
6038 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
6040 init_unistr2(&usr->uni_acct_desc, description, UNI_STR_TERMINATE);
6041 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
6043 init_unistr2(&usr->uni_workstations, workstations, UNI_STR_TERMINATE);
6044 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
6046 init_unistr2(&usr->uni_unknown_str, NULL, UNI_STR_TERMINATE);
6047 init_uni_hdr(&usr->hdr_unknown_str, &usr->uni_unknown_str);
6049 init_unistr2_from_datablob(&usr->uni_munged_dial, &munged_dial_blob);
6050 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
6051 data_blob_free(&munged_dial_blob);
6053 if (pdb_get_hours(pw)) {
6054 usr->logon_hrs.max_len = 1260;
6055 usr->logon_hrs.offset = 0;
6056 usr->logon_hrs.len = pdb_get_hours_len(pw);
6057 memcpy(&usr->logon_hrs.hours, pdb_get_hours(pw), MAX_HOURS_LEN);
6058 } else {
6059 usr->logon_hrs.max_len = 1260;
6060 usr->logon_hrs.offset = 0;
6061 usr->logon_hrs.len = 0;
6062 memset(&usr->logon_hrs, 0xff, sizeof(usr->logon_hrs));
6065 return NT_STATUS_OK;
6068 /*******************************************************************
6069 reads or writes a structure.
6070 ********************************************************************/
6072 static BOOL sam_io_user_info21(const char *desc, SAM_USER_INFO_21 * usr,
6073 prs_struct *ps, int depth)
6075 if (usr == NULL)
6076 return False;
6078 prs_debug(ps, depth, desc, "sam_io_user_info21");
6079 depth++;
6081 if(!prs_align(ps))
6082 return False;
6084 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
6085 return False;
6086 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
6087 return False;
6088 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps,depth))
6089 return False;
6090 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
6091 return False;
6092 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps,depth))
6093 return False;
6094 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
6095 return False;
6097 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
6098 return False;
6099 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
6100 return False;
6101 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
6102 return False;
6103 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
6104 return False;
6105 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
6106 return False;
6107 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
6108 return False;
6109 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
6110 return False;
6111 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
6112 return False;
6113 if(!smb_io_unihdr("hdr_unknown_str ", &usr->hdr_unknown_str, ps, depth)) /* unknown string */
6114 return False;
6115 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
6116 return False;
6118 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
6119 return False;
6120 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
6121 return False;
6123 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
6124 return False;
6125 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
6126 return False;
6127 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
6128 return False;
6130 if(!prs_uint32("fields_present ", ps, depth, &usr->fields_present))
6131 return False;
6132 if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */
6133 return False;
6134 if(!prs_align(ps))
6135 return False;
6136 if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs))
6137 return False;
6139 if(!prs_uint16("bad_password_count ", ps, depth, &usr->bad_password_count))
6140 return False;
6141 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count))
6142 return False;
6144 if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1)))
6145 return False;
6146 if(!prs_uint8("passmustchange ", ps, depth, &usr->passmustchange))
6147 return False;
6148 if(!prs_uint8("padding2 ", ps, depth, &usr->padding2))
6149 return False;
6151 /* here begins pointed-to data */
6153 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name,usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
6154 return False;
6155 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
6156 return False;
6157 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
6158 return False;
6159 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
6160 return False;
6161 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
6162 return False;
6163 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
6164 return False;
6165 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
6166 return False;
6167 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
6168 return False;
6169 if(!smb_io_unistr2("uni_unknown_str ", &usr->uni_unknown_str, usr->hdr_unknown_str.buffer, ps, depth)) /* unknown string */
6170 return False;
6171 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial,usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */
6172 return False;
6174 /* ok, this is only guess-work (as usual) */
6175 if (usr->ptr_logon_hrs) {
6176 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
6177 return False;
6180 return True;
6183 void init_sam_user_info20A(SAM_USER_INFO_20 *usr, SAM_ACCOUNT *pw)
6185 const char *munged_dial = pdb_get_munged_dial(pw);
6186 DATA_BLOB blob = base64_decode_data_blob(munged_dial);
6188 init_unistr2_from_datablob(&usr->uni_munged_dial, &blob);
6189 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
6190 data_blob_free(&blob);
6193 /*******************************************************************
6194 reads or writes a structure.
6195 ********************************************************************/
6197 static BOOL sam_io_user_info20(const char *desc, SAM_USER_INFO_20 *usr,
6198 prs_struct *ps, int depth)
6200 if (usr == NULL)
6201 return False;
6203 prs_debug(ps, depth, desc, "sam_io_user_info20");
6204 depth++;
6206 if(!prs_align(ps))
6207 return False;
6209 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
6210 return False;
6212 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial,usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */
6213 return False;
6215 return True;
6218 /*******************************************************************
6219 inits a SAM_USERINFO_CTR structure.
6220 ********************************************************************/
6222 NTSTATUS make_samr_userinfo_ctr_usr21(TALLOC_CTX *ctx, SAM_USERINFO_CTR * ctr,
6223 uint16 switch_value,
6224 SAM_USER_INFO_21 * usr)
6226 DEBUG(5, ("make_samr_userinfo_ctr_usr21\n"));
6228 ctr->switch_value = switch_value;
6229 ctr->info.id = NULL;
6231 switch (switch_value) {
6232 case 16:
6233 ctr->info.id16 = TALLOC_ZERO_P(ctx,SAM_USER_INFO_16);
6234 if (ctr->info.id16 == NULL)
6235 return NT_STATUS_NO_MEMORY;
6237 init_sam_user_info16(ctr->info.id16, usr->acb_info);
6238 break;
6239 #if 0
6240 /* whoops - got this wrong. i think. or don't understand what's happening. */
6241 case 17:
6243 NTTIME expire;
6244 info = (void *)&id11;
6246 expire.low = 0xffffffff;
6247 expire.high = 0x7fffffff;
6249 ctr->info.id = TALLOC_ZERO_P(ctx,SAM_USER_INFO_17);
6250 init_sam_user_info11(ctr->info.id17, &expire,
6251 "BROOKFIELDS$", /* name */
6252 0x03ef, /* user rid */
6253 0x201, /* group rid */
6254 0x0080); /* acb info */
6256 break;
6258 #endif
6259 case 18:
6260 ctr->info.id18 = TALLOC_ZERO_P(ctx,SAM_USER_INFO_18);
6261 if (ctr->info.id18 == NULL)
6262 return NT_STATUS_NO_MEMORY;
6264 init_sam_user_info18(ctr->info.id18, usr->lm_pwd, usr->nt_pwd);
6265 break;
6266 case 21:
6268 SAM_USER_INFO_21 *cusr;
6269 cusr = TALLOC_ZERO_P(ctx,SAM_USER_INFO_21);
6270 ctr->info.id21 = cusr;
6271 if (ctr->info.id21 == NULL)
6272 return NT_STATUS_NO_MEMORY;
6273 memcpy(cusr, usr, sizeof(*usr));
6274 memset(cusr->lm_pwd, 0, sizeof(cusr->lm_pwd));
6275 memset(cusr->nt_pwd, 0, sizeof(cusr->nt_pwd));
6276 break;
6278 default:
6279 DEBUG(4,("make_samr_userinfo_ctr: unsupported info\n"));
6280 return NT_STATUS_INVALID_INFO_CLASS;
6283 return NT_STATUS_OK;
6286 /*******************************************************************
6287 inits a SAM_USERINFO_CTR structure.
6288 ********************************************************************/
6290 static void init_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr, DATA_BLOB *sess_key,
6291 uint16 switch_value, void *info)
6293 DEBUG(5, ("init_samr_userinfo_ctr\n"));
6295 ctr->switch_value = switch_value;
6296 ctr->info.id = info;
6298 switch (switch_value) {
6299 case 0x18:
6300 SamOEMhashBlob(ctr->info.id24->pass, 516, sess_key);
6301 dump_data(100, (char *)sess_key->data, sess_key->length);
6302 dump_data(100, (char *)ctr->info.id24->pass, 516);
6303 break;
6304 case 0x17:
6305 SamOEMhashBlob(ctr->info.id23->pass, 516, sess_key);
6306 dump_data(100, (char *)sess_key->data, sess_key->length);
6307 dump_data(100, (char *)ctr->info.id23->pass, 516);
6308 break;
6309 case 0x07:
6310 break;
6311 default:
6312 DEBUG(4,("init_samr_userinfo_ctr: unsupported switch level: %d\n", switch_value));
6316 /*******************************************************************
6317 reads or writes a structure.
6318 ********************************************************************/
6320 static BOOL samr_io_userinfo_ctr(const char *desc, SAM_USERINFO_CTR **ppctr,
6321 prs_struct *ps, int depth)
6323 BOOL ret;
6324 SAM_USERINFO_CTR *ctr;
6326 prs_debug(ps, depth, desc, "samr_io_userinfo_ctr");
6327 depth++;
6329 if (UNMARSHALLING(ps)) {
6330 ctr = PRS_ALLOC_MEM(ps,SAM_USERINFO_CTR,1);
6331 if (ctr == NULL)
6332 return False;
6333 *ppctr = ctr;
6334 } else {
6335 ctr = *ppctr;
6338 /* lkclXXXX DO NOT ALIGN BEFORE READING SWITCH VALUE! */
6340 if(!prs_uint16("switch_value", ps, depth, &ctr->switch_value))
6341 return False;
6342 if(!prs_align(ps))
6343 return False;
6345 ret = False;
6347 switch (ctr->switch_value) {
6348 case 7:
6349 if (UNMARSHALLING(ps))
6350 ctr->info.id7 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_7,1);
6351 if (ctr->info.id7 == NULL) {
6352 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6353 return False;
6355 ret = sam_io_user_info7("", ctr->info.id7, ps, depth);
6356 break;
6357 case 16:
6358 if (UNMARSHALLING(ps))
6359 ctr->info.id16 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_16,1);
6360 if (ctr->info.id16 == NULL) {
6361 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6362 return False;
6364 ret = sam_io_user_info16("", ctr->info.id16, ps, depth);
6365 break;
6366 case 17:
6367 if (UNMARSHALLING(ps))
6368 ctr->info.id17 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_17,1);
6370 if (ctr->info.id17 == NULL) {
6371 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6372 return False;
6374 ret = sam_io_user_info17("", ctr->info.id17, ps, depth);
6375 break;
6376 case 18:
6377 if (UNMARSHALLING(ps))
6378 ctr->info.id18 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_18,1);
6380 if (ctr->info.id18 == NULL) {
6381 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6382 return False;
6384 ret = sam_io_user_info18("", ctr->info.id18, ps, depth);
6385 break;
6386 case 20:
6387 if (UNMARSHALLING(ps))
6388 ctr->info.id20 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_20,1);
6390 if (ctr->info.id20 == NULL) {
6391 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6392 return False;
6394 ret = sam_io_user_info20("", ctr->info.id20, ps, depth);
6395 break;
6396 case 21:
6397 if (UNMARSHALLING(ps))
6398 ctr->info.id21 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_21,1);
6400 if (ctr->info.id21 == NULL) {
6401 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6402 return False;
6404 ret = sam_io_user_info21("", ctr->info.id21, ps, depth);
6405 break;
6406 case 23:
6407 if (UNMARSHALLING(ps))
6408 ctr->info.id23 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_23,1);
6410 if (ctr->info.id23 == NULL) {
6411 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6412 return False;
6414 ret = sam_io_user_info23("", ctr->info.id23, ps, depth);
6415 break;
6416 case 24:
6417 if (UNMARSHALLING(ps))
6418 ctr->info.id24 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_24,1);
6420 if (ctr->info.id24 == NULL) {
6421 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6422 return False;
6424 ret = sam_io_user_info24("", ctr->info.id24, ps, depth);
6425 break;
6426 case 25:
6427 if (UNMARSHALLING(ps))
6428 ctr->info.id25 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_25,1);
6430 if (ctr->info.id25 == NULL) {
6431 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6432 return False;
6434 ret = sam_io_user_info25("", ctr->info.id25, ps, depth);
6435 break;
6436 default:
6437 DEBUG(2, ("samr_io_userinfo_ctr: unknown switch level 0x%x\n", ctr->switch_value));
6438 ret = False;
6439 break;
6442 return ret;
6445 /*******************************************************************
6446 inits a SAMR_R_QUERY_USERINFO structure.
6447 ********************************************************************/
6449 void init_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO * r_u,
6450 SAM_USERINFO_CTR * ctr, NTSTATUS status)
6452 DEBUG(5, ("init_samr_r_query_userinfo\n"));
6454 r_u->ptr = 0;
6455 r_u->ctr = NULL;
6457 if (NT_STATUS_IS_OK(status)) {
6458 r_u->ptr = 1;
6459 r_u->ctr = ctr;
6462 r_u->status = status; /* return status */
6465 /*******************************************************************
6466 reads or writes a structure.
6467 ********************************************************************/
6469 BOOL samr_io_r_query_userinfo(const char *desc, SAMR_R_QUERY_USERINFO * r_u,
6470 prs_struct *ps, int depth)
6472 if (r_u == NULL)
6473 return False;
6475 prs_debug(ps, depth, desc, "samr_io_r_query_userinfo");
6476 depth++;
6478 if(!prs_align(ps))
6479 return False;
6481 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
6482 return False;
6484 if (r_u->ptr != 0) {
6485 if(!samr_io_userinfo_ctr("ctr", &r_u->ctr, ps, depth))
6486 return False;
6489 if(!prs_align(ps))
6490 return False;
6491 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6492 return False;
6494 return True;
6497 /*******************************************************************
6498 inits a SAMR_Q_SET_USERINFO structure.
6499 ********************************************************************/
6501 void init_samr_q_set_userinfo(SAMR_Q_SET_USERINFO * q_u,
6502 POLICY_HND *hnd, DATA_BLOB *sess_key,
6503 uint16 switch_value, void *info)
6505 DEBUG(5, ("init_samr_q_set_userinfo\n"));
6507 q_u->pol = *hnd;
6508 q_u->switch_value = switch_value;
6509 init_samr_userinfo_ctr(q_u->ctr, sess_key, switch_value, info);
6512 /*******************************************************************
6513 reads or writes a structure.
6514 ********************************************************************/
6516 BOOL samr_io_q_set_userinfo(const char *desc, SAMR_Q_SET_USERINFO * q_u,
6517 prs_struct *ps, int depth)
6519 if (q_u == NULL)
6520 return False;
6522 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo");
6523 depth++;
6525 if(!prs_align(ps))
6526 return False;
6528 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
6530 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
6531 return False;
6532 if(!samr_io_userinfo_ctr("ctr", &q_u->ctr, ps, depth))
6533 return False;
6535 return True;
6538 /*******************************************************************
6539 inits a SAMR_R_SET_USERINFO structure.
6540 ********************************************************************/
6542 void init_samr_r_set_userinfo(SAMR_R_SET_USERINFO * r_u, NTSTATUS status)
6544 DEBUG(5, ("init_samr_r_set_userinfo\n"));
6546 r_u->status = status; /* return status */
6549 /*******************************************************************
6550 reads or writes a structure.
6551 ********************************************************************/
6553 BOOL samr_io_r_set_userinfo(const char *desc, SAMR_R_SET_USERINFO * r_u,
6554 prs_struct *ps, int depth)
6556 if (r_u == NULL)
6557 return False;
6559 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo");
6560 depth++;
6562 if(!prs_align(ps))
6563 return False;
6565 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6566 return False;
6568 return True;
6571 /*******************************************************************
6572 inits a SAMR_Q_SET_USERINFO2 structure.
6573 ********************************************************************/
6575 void init_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 * q_u,
6576 POLICY_HND *hnd, DATA_BLOB *sess_key,
6577 uint16 switch_value, SAM_USERINFO_CTR * ctr)
6579 DEBUG(5, ("init_samr_q_set_userinfo2\n"));
6581 q_u->pol = *hnd;
6582 q_u->switch_value = switch_value;
6583 q_u->ctr = ctr;
6585 if (q_u->ctr != NULL)
6586 q_u->ctr->switch_value = switch_value;
6588 switch (switch_value) {
6589 case 18:
6590 SamOEMhashBlob(ctr->info.id18->lm_pwd, 16, sess_key);
6591 SamOEMhashBlob(ctr->info.id18->nt_pwd, 16, sess_key);
6592 dump_data(100, (char *)sess_key->data, sess_key->length);
6593 dump_data(100, (char *)ctr->info.id18->lm_pwd, 16);
6594 dump_data(100, (char *)ctr->info.id18->nt_pwd, 16);
6595 break;
6599 /*******************************************************************
6600 reads or writes a structure.
6601 ********************************************************************/
6603 BOOL samr_io_q_set_userinfo2(const char *desc, SAMR_Q_SET_USERINFO2 * q_u,
6604 prs_struct *ps, int depth)
6606 if (q_u == NULL)
6607 return False;
6609 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo2");
6610 depth++;
6612 if(!prs_align(ps))
6613 return False;
6615 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
6616 return False;
6618 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
6619 return False;
6620 if(!samr_io_userinfo_ctr("ctr", &q_u->ctr, ps, depth))
6621 return False;
6623 return True;
6626 /*******************************************************************
6627 inits a SAMR_R_SET_USERINFO2 structure.
6628 ********************************************************************/
6630 void init_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 * r_u, NTSTATUS status)
6632 DEBUG(5, ("init_samr_r_set_userinfo2\n"));
6634 r_u->status = status; /* return status */
6637 /*******************************************************************
6638 reads or writes a structure.
6639 ********************************************************************/
6641 BOOL samr_io_r_set_userinfo2(const char *desc, SAMR_R_SET_USERINFO2 * r_u,
6642 prs_struct *ps, int depth)
6644 if (r_u == NULL)
6645 return False;
6647 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo2");
6648 depth++;
6650 if(!prs_align(ps))
6651 return False;
6653 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6654 return False;
6656 return True;
6659 /*******************************************************************
6660 inits a SAMR_Q_CONNECT structure.
6661 ********************************************************************/
6663 void init_samr_q_connect(SAMR_Q_CONNECT * q_u,
6664 char *srv_name, uint32 access_mask)
6666 DEBUG(5, ("init_samr_q_connect\n"));
6668 /* make PDC server name \\server */
6669 q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
6670 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
6672 /* example values: 0x0000 0002 */
6673 q_u->access_mask = access_mask;
6676 /*******************************************************************
6677 reads or writes a structure.
6678 ********************************************************************/
6680 BOOL samr_io_q_connect(const char *desc, SAMR_Q_CONNECT * q_u,
6681 prs_struct *ps, int depth)
6683 if (q_u == NULL)
6684 return False;
6686 prs_debug(ps, depth, desc, "samr_io_q_connect");
6687 depth++;
6689 if(!prs_align(ps))
6690 return False;
6692 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
6693 return False;
6694 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
6695 return False;
6697 if(!prs_align(ps))
6698 return False;
6699 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
6700 return False;
6702 return True;
6705 /*******************************************************************
6706 reads or writes a structure.
6707 ********************************************************************/
6709 BOOL samr_io_r_connect(const char *desc, SAMR_R_CONNECT * r_u,
6710 prs_struct *ps, int depth)
6712 if (r_u == NULL)
6713 return False;
6715 prs_debug(ps, depth, desc, "samr_io_r_connect");
6716 depth++;
6718 if(!prs_align(ps))
6719 return False;
6721 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
6722 return False;
6724 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6725 return False;
6727 return True;
6730 /*******************************************************************
6731 inits a SAMR_Q_CONNECT4 structure.
6732 ********************************************************************/
6734 void init_samr_q_connect4(SAMR_Q_CONNECT4 * q_u,
6735 char *srv_name, uint32 access_mask)
6737 DEBUG(5, ("init_samr_q_connect4\n"));
6739 /* make PDC server name \\server */
6740 q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
6741 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
6743 /* Only value we've seen, possibly an address type ? */
6744 q_u->unk_0 = 2;
6746 /* example values: 0x0000 0002 */
6747 q_u->access_mask = access_mask;
6750 /*******************************************************************
6751 reads or writes a structure.
6752 ********************************************************************/
6754 BOOL samr_io_q_connect4(const char *desc, SAMR_Q_CONNECT4 * q_u,
6755 prs_struct *ps, int depth)
6757 if (q_u == NULL)
6758 return False;
6760 prs_debug(ps, depth, desc, "samr_io_q_connect4");
6761 depth++;
6763 if(!prs_align(ps))
6764 return False;
6766 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
6767 return False;
6768 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
6769 return False;
6771 if(!prs_align(ps))
6772 return False;
6773 if(!prs_uint32("unk_0", ps, depth, &q_u->unk_0))
6774 return False;
6775 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
6776 return False;
6778 return True;
6781 /*******************************************************************
6782 reads or writes a structure.
6783 ********************************************************************/
6785 BOOL samr_io_r_connect4(const char *desc, SAMR_R_CONNECT4 * r_u,
6786 prs_struct *ps, int depth)
6788 if (r_u == NULL)
6789 return False;
6791 prs_debug(ps, depth, desc, "samr_io_r_connect4");
6792 depth++;
6794 if(!prs_align(ps))
6795 return False;
6797 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
6798 return False;
6800 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6801 return False;
6803 return True;
6806 /*******************************************************************
6807 inits a SAMR_Q_CONNECT5 structure.
6808 ********************************************************************/
6810 void init_samr_q_connect5(SAMR_Q_CONNECT5 * q_u,
6811 char *srv_name, uint32 access_mask)
6813 DEBUG(5, ("init_samr_q_connect5\n"));
6815 /* make PDC server name \\server */
6816 q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
6817 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
6819 /* example values: 0x0000 0002 */
6820 q_u->access_mask = access_mask;
6822 q_u->level = 1;
6823 q_u->info1_unk1 = 3;
6824 q_u->info1_unk2 = 0;
6827 /*******************************************************************
6828 inits a SAMR_R_CONNECT5 structure.
6829 ********************************************************************/
6831 void init_samr_r_connect5(SAMR_R_CONNECT5 * r_u, POLICY_HND *pol, NTSTATUS status)
6833 DEBUG(5, ("init_samr_q_connect5\n"));
6835 r_u->level = 1;
6836 r_u->info1_unk1 = 3;
6837 r_u->info1_unk2 = 0;
6839 r_u->connect_pol = *pol;
6840 r_u->status = status;
6843 /*******************************************************************
6844 reads or writes a structure.
6845 ********************************************************************/
6847 BOOL samr_io_q_connect5(const char *desc, SAMR_Q_CONNECT5 * q_u,
6848 prs_struct *ps, int depth)
6850 if (q_u == NULL)
6851 return False;
6853 prs_debug(ps, depth, desc, "samr_io_q_connect5");
6854 depth++;
6856 if(!prs_align(ps))
6857 return False;
6859 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
6860 return False;
6861 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
6862 return False;
6864 if(!prs_align(ps))
6865 return False;
6866 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
6867 return False;
6869 if(!prs_uint32("level", ps, depth, &q_u->level))
6870 return False;
6871 if(!prs_uint32("level", ps, depth, &q_u->level))
6872 return False;
6874 if(!prs_uint32("info1_unk1", ps, depth, &q_u->info1_unk1))
6875 return False;
6876 if(!prs_uint32("info1_unk2", ps, depth, &q_u->info1_unk2))
6877 return False;
6879 return True;
6882 /*******************************************************************
6883 reads or writes a structure.
6884 ********************************************************************/
6886 BOOL samr_io_r_connect5(const char *desc, SAMR_R_CONNECT5 * r_u,
6887 prs_struct *ps, int depth)
6889 if (r_u == NULL)
6890 return False;
6892 prs_debug(ps, depth, desc, "samr_io_r_connect5");
6893 depth++;
6895 if(!prs_align(ps))
6896 return False;
6898 if(!prs_uint32("level", ps, depth, &r_u->level))
6899 return False;
6900 if(!prs_uint32("level", ps, depth, &r_u->level))
6901 return False;
6902 if(!prs_uint32("info1_unk1", ps, depth, &r_u->info1_unk1))
6903 return False;
6904 if(!prs_uint32("info1_unk2", ps, depth, &r_u->info1_unk2))
6905 return False;
6907 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
6908 return False;
6910 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6911 return False;
6913 return True;
6916 /*******************************************************************
6917 inits a SAMR_Q_CONNECT_ANON structure.
6918 ********************************************************************/
6920 void init_samr_q_connect_anon(SAMR_Q_CONNECT_ANON * q_u)
6922 DEBUG(5, ("init_samr_q_connect_anon\n"));
6924 q_u->ptr = 1;
6925 q_u->unknown_0 = 0x5c; /* server name (?!!) */
6926 q_u->unknown_1 = 0x01;
6927 q_u->access_mask = 0x20;
6930 /*******************************************************************
6931 reads or writes a structure.
6932 ********************************************************************/
6934 BOOL samr_io_q_connect_anon(const char *desc, SAMR_Q_CONNECT_ANON * q_u,
6935 prs_struct *ps, int depth)
6937 if (q_u == NULL)
6938 return False;
6940 prs_debug(ps, depth, desc, "samr_io_q_connect_anon");
6941 depth++;
6943 if(!prs_align(ps))
6944 return False;
6946 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
6947 return False;
6948 if(!prs_uint16("unknown_0", ps, depth, &q_u->unknown_0))
6949 return False;
6950 if(!prs_uint16("unknown_1", ps, depth, &q_u->unknown_1))
6951 return False;
6952 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
6953 return False;
6955 return True;
6958 /*******************************************************************
6959 reads or writes a structure.
6960 ********************************************************************/
6962 BOOL samr_io_r_connect_anon(const char *desc, SAMR_R_CONNECT_ANON * r_u,
6963 prs_struct *ps, int depth)
6965 if (r_u == NULL)
6966 return False;
6968 prs_debug(ps, depth, desc, "samr_io_r_connect_anon");
6969 depth++;
6971 if(!prs_align(ps))
6972 return False;
6974 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
6975 return False;
6977 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6978 return False;
6980 return True;
6983 /*******************************************************************
6984 inits a SAMR_Q_GET_DOM_PWINFO structure.
6985 ********************************************************************/
6987 void init_samr_q_get_dom_pwinfo(SAMR_Q_GET_DOM_PWINFO * q_u,
6988 char *srv_name)
6990 DEBUG(5, ("init_samr_q_get_dom_pwinfo\n"));
6992 q_u->ptr = 1;
6993 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_FLAGS_NONE);
6994 init_uni_hdr(&q_u->hdr_srv_name, &q_u->uni_srv_name);
6997 /*******************************************************************
6998 reads or writes a structure.
6999 ********************************************************************/
7001 BOOL samr_io_q_get_dom_pwinfo(const char *desc, SAMR_Q_GET_DOM_PWINFO * q_u,
7002 prs_struct *ps, int depth)
7004 if (q_u == NULL)
7005 return False;
7007 prs_debug(ps, depth, desc, "samr_io_q_get_dom_pwinfo");
7008 depth++;
7010 if(!prs_align(ps))
7011 return False;
7013 if(!prs_uint32("ptr", ps, depth, &q_u->ptr))
7014 return False;
7015 if (q_u->ptr != 0) {
7016 if(!smb_io_unihdr("", &q_u->hdr_srv_name, ps, depth))
7017 return False;
7018 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->hdr_srv_name.buffer, ps, depth))
7019 return False;
7022 return True;
7025 /*******************************************************************
7026 reads or writes a structure.
7027 ********************************************************************/
7029 BOOL samr_io_r_get_dom_pwinfo(const char *desc, SAMR_R_GET_DOM_PWINFO * r_u,
7030 prs_struct *ps, int depth)
7032 if (r_u == NULL)
7033 return False;
7035 prs_debug(ps, depth, desc, "samr_io_r_get_dom_pwinfo");
7036 depth++;
7038 if(!prs_align(ps))
7039 return False;
7041 if(!prs_uint16("min_pwd_length", ps, depth, &r_u->min_pwd_length))
7042 return False;
7043 if(!prs_align(ps))
7044 return False;
7045 if(!prs_uint32("password_properties", ps, depth, &r_u->password_properties))
7046 return False;
7048 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7049 return False;
7051 return True;
7054 /*******************************************************************
7055 make a SAMR_ENC_PASSWD structure.
7056 ********************************************************************/
7058 void init_enc_passwd(SAMR_ENC_PASSWD * pwd, const char pass[512])
7060 ZERO_STRUCTP(pwd);
7062 if (pass == NULL) {
7063 pwd->ptr = 0;
7064 } else {
7065 pwd->ptr = 1;
7066 memcpy(pwd->pass, pass, sizeof(pwd->pass));
7070 /*******************************************************************
7071 reads or writes a SAMR_ENC_PASSWD structure.
7072 ********************************************************************/
7074 BOOL samr_io_enc_passwd(const char *desc, SAMR_ENC_PASSWD * pwd,
7075 prs_struct *ps, int depth)
7077 if (pwd == NULL)
7078 return False;
7080 prs_debug(ps, depth, desc, "samr_io_enc_passwd");
7081 depth++;
7083 if(!prs_align(ps))
7084 return False;
7086 if(!prs_uint32("ptr", ps, depth, &pwd->ptr))
7087 return False;
7089 if (pwd->ptr != 0) {
7090 if(!prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass)))
7091 return False;
7094 return True;
7097 /*******************************************************************
7098 inits a SAMR_ENC_HASH structure.
7099 ********************************************************************/
7101 void init_enc_hash(SAMR_ENC_HASH * hsh, const uchar hash[16])
7103 ZERO_STRUCTP(hsh);
7105 if (hash == NULL) {
7106 hsh->ptr = 0;
7107 } else {
7108 hsh->ptr = 1;
7109 memcpy(hsh->hash, hash, sizeof(hsh->hash));
7113 /*******************************************************************
7114 reads or writes a SAMR_ENC_HASH structure.
7115 ********************************************************************/
7117 BOOL samr_io_enc_hash(const char *desc, SAMR_ENC_HASH * hsh,
7118 prs_struct *ps, int depth)
7120 if (hsh == NULL)
7121 return False;
7123 prs_debug(ps, depth, desc, "samr_io_enc_hash");
7124 depth++;
7126 if(!prs_align(ps))
7127 return False;
7129 if(!prs_uint32("ptr ", ps, depth, &hsh->ptr))
7130 return False;
7131 if (hsh->ptr != 0) {
7132 if(!prs_uint8s(False, "hash", ps, depth, hsh->hash,sizeof(hsh->hash)))
7133 return False;
7136 return True;
7139 /*******************************************************************
7140 inits a SAMR_Q_CHGPASSWD_USER structure.
7141 ********************************************************************/
7143 void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER * q_u,
7144 const char *dest_host, const char *user_name,
7145 const uchar nt_newpass[516],
7146 const uchar nt_oldhash[16],
7147 const uchar lm_newpass[516],
7148 const uchar lm_oldhash[16])
7150 DEBUG(5, ("init_samr_q_chgpasswd_user\n"));
7152 q_u->ptr_0 = 1;
7153 init_unistr2(&q_u->uni_dest_host, dest_host, UNI_FLAGS_NONE);
7154 init_uni_hdr(&q_u->hdr_dest_host, &q_u->uni_dest_host);
7156 init_unistr2(&q_u->uni_user_name, user_name, UNI_FLAGS_NONE);
7157 init_uni_hdr(&q_u->hdr_user_name, &q_u->uni_user_name);
7159 init_enc_passwd(&q_u->nt_newpass, (const char *)nt_newpass);
7160 init_enc_hash(&q_u->nt_oldhash, nt_oldhash);
7162 q_u->unknown = 0x01;
7164 init_enc_passwd(&q_u->lm_newpass, (const char *)lm_newpass);
7165 init_enc_hash(&q_u->lm_oldhash, lm_oldhash);
7168 /*******************************************************************
7169 reads or writes a structure.
7170 ********************************************************************/
7172 BOOL samr_io_q_chgpasswd_user(const char *desc, SAMR_Q_CHGPASSWD_USER * q_u,
7173 prs_struct *ps, int depth)
7175 if (q_u == NULL)
7176 return False;
7178 prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user");
7179 depth++;
7181 if(!prs_align(ps))
7182 return False;
7184 if(!prs_uint32("ptr_0", ps, depth, &q_u->ptr_0))
7185 return False;
7187 if(!smb_io_unihdr("", &q_u->hdr_dest_host, ps, depth))
7188 return False;
7189 if(!smb_io_unistr2("", &q_u->uni_dest_host, q_u->hdr_dest_host.buffer, ps, depth))
7190 return False;
7192 if(!prs_align(ps))
7193 return False;
7194 if(!smb_io_unihdr("", &q_u->hdr_user_name, ps, depth))
7195 return False;
7196 if(!smb_io_unistr2("", &q_u->uni_user_name, q_u->hdr_user_name.buffer,ps, depth))
7197 return False;
7199 if(!samr_io_enc_passwd("nt_newpass", &q_u->nt_newpass, ps, depth))
7200 return False;
7201 if(!samr_io_enc_hash("nt_oldhash", &q_u->nt_oldhash, ps, depth))
7202 return False;
7204 if(!prs_uint32("unknown", ps, depth, &q_u->unknown))
7205 return False;
7207 if(!samr_io_enc_passwd("lm_newpass", &q_u->lm_newpass, ps, depth))
7208 return False;
7209 if(!samr_io_enc_hash("lm_oldhash", &q_u->lm_oldhash, ps, depth))
7210 return False;
7212 return True;
7215 /*******************************************************************
7216 inits a SAMR_R_CHGPASSWD_USER structure.
7217 ********************************************************************/
7219 void init_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER * r_u, NTSTATUS status)
7221 DEBUG(5, ("init_r_chgpasswd_user\n"));
7223 r_u->status = status;
7226 /*******************************************************************
7227 reads or writes a structure.
7228 ********************************************************************/
7230 BOOL samr_io_r_chgpasswd_user(const char *desc, SAMR_R_CHGPASSWD_USER * r_u,
7231 prs_struct *ps, int depth)
7233 if (r_u == NULL)
7234 return False;
7236 prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user");
7237 depth++;
7239 if(!prs_align(ps))
7240 return False;
7242 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7243 return False;
7245 return True;
7248 /*******************************************************************
7249 inits a SAMR_Q_CHGPASSWD3 structure.
7250 ********************************************************************/
7252 void init_samr_q_chgpasswd3(SAMR_Q_CHGPASSWD3 * q_u,
7253 const char *dest_host, const char *user_name,
7254 const uchar nt_newpass[516],
7255 const uchar nt_oldhash[16],
7256 const uchar lm_newpass[516],
7257 const uchar lm_oldhash[16])
7259 DEBUG(5, ("init_samr_q_chgpasswd3\n"));
7261 q_u->ptr_0 = 1;
7262 init_unistr2(&q_u->uni_dest_host, dest_host, UNI_FLAGS_NONE);
7263 init_uni_hdr(&q_u->hdr_dest_host, &q_u->uni_dest_host);
7265 init_unistr2(&q_u->uni_user_name, user_name, UNI_FLAGS_NONE);
7266 init_uni_hdr(&q_u->hdr_user_name, &q_u->uni_user_name);
7268 init_enc_passwd(&q_u->nt_newpass, (const char *)nt_newpass);
7269 init_enc_hash(&q_u->nt_oldhash, nt_oldhash);
7271 q_u->lm_change = 0x01;
7273 init_enc_passwd(&q_u->lm_newpass, (const char *)lm_newpass);
7274 init_enc_hash(&q_u->lm_oldhash, lm_oldhash);
7276 init_enc_passwd(&q_u->password3, NULL);
7279 /*******************************************************************
7280 reads or writes a structure.
7281 ********************************************************************/
7283 BOOL samr_io_q_chgpasswd3(const char *desc, SAMR_Q_CHGPASSWD3 * q_u,
7284 prs_struct *ps, int depth)
7286 if (q_u == NULL)
7287 return False;
7289 prs_debug(ps, depth, desc, "samr_io_q_chgpasswd3");
7290 depth++;
7292 if(!prs_align(ps))
7293 return False;
7295 if(!prs_uint32("ptr_0", ps, depth, &q_u->ptr_0))
7296 return False;
7298 if(!smb_io_unihdr("", &q_u->hdr_dest_host, ps, depth))
7299 return False;
7300 if(!smb_io_unistr2("", &q_u->uni_dest_host, q_u->hdr_dest_host.buffer, ps, depth))
7301 return False;
7303 if(!prs_align(ps))
7304 return False;
7305 if(!smb_io_unihdr("", &q_u->hdr_user_name, ps, depth))
7306 return False;
7307 if(!smb_io_unistr2("", &q_u->uni_user_name, q_u->hdr_user_name.buffer,ps, depth))
7308 return False;
7310 if(!samr_io_enc_passwd("nt_newpass", &q_u->nt_newpass, ps, depth))
7311 return False;
7312 if(!samr_io_enc_hash("nt_oldhash", &q_u->nt_oldhash, ps, depth))
7313 return False;
7315 if(!prs_uint32("lm_change", ps, depth, &q_u->lm_change))
7316 return False;
7318 if(!samr_io_enc_passwd("lm_newpass", &q_u->lm_newpass, ps, depth))
7319 return False;
7320 if(!samr_io_enc_hash("lm_oldhash", &q_u->lm_oldhash, ps, depth))
7321 return False;
7323 if(!samr_io_enc_passwd("password3", &q_u->password3, ps, depth))
7324 return False;
7326 return True;
7329 /*******************************************************************
7330 inits a SAMR_R_CHGPASSWD3 structure.
7331 ********************************************************************/
7333 void init_samr_r_chgpasswd3(SAMR_R_CHGPASSWD3 * r_u, NTSTATUS status)
7335 DEBUG(5, ("init_r_chgpasswd3\n"));
7337 r_u->status = status;
7340 /*******************************************************************
7341 Reads or writes an SAMR_CHANGE_REJECT structure.
7342 ********************************************************************/
7344 BOOL samr_io_change_reject(const char *desc, SAMR_CHANGE_REJECT *reject, prs_struct *ps, int depth)
7346 if (reject == NULL)
7347 return False;
7349 prs_debug(ps, depth, desc, "samr_io_change_reject");
7350 depth++;
7352 if(!prs_align(ps))
7353 return False;
7355 if(UNMARSHALLING(ps))
7356 ZERO_STRUCTP(reject);
7358 if (!prs_uint32("reject_reason", ps, depth, &reject->reject_reason))
7359 return False;
7361 if (!prs_uint32("unknown1", ps, depth, &reject->unknown1))
7362 return False;
7364 if (!prs_uint32("unknown2", ps, depth, &reject->unknown2))
7365 return False;
7367 return True;
7370 /*******************************************************************
7371 reads or writes a structure.
7372 ********************************************************************/
7374 BOOL samr_io_r_chgpasswd3(const char *desc, SAMR_R_CHGPASSWD3 * r_u,
7375 prs_struct *ps, int depth)
7377 uint32 ptr_info, ptr_reject;
7379 if (r_u == NULL)
7380 return False;
7382 prs_debug(ps, depth, desc, "samr_io_r_chgpasswd3");
7383 depth++;
7385 if(!prs_align(ps))
7386 return False;
7388 if(!prs_uint32("ptr_info", ps, depth, &ptr_info))
7389 return False;
7391 if (ptr_info) {
7393 /* SAM_UNK_INFO_1 */
7394 if(!sam_io_unk_info1("info", &r_u->info, ps, depth))
7395 return False;
7398 if(!prs_uint32("ptr_reject", ps, depth, &ptr_reject))
7399 return False;
7401 if (ptr_reject) {
7403 /* SAMR_CHANGE_REJECT */
7404 if(!samr_io_change_reject("reject", &r_u->reject, ps, depth))
7405 return False;
7408 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7409 return False;
7411 return True;
7414 /*******************************************************************
7415 reads or writes a structure.
7416 ********************************************************************/
7418 void init_samr_q_query_domain_info2(SAMR_Q_QUERY_DOMAIN_INFO2 *q_u,
7419 POLICY_HND *domain_pol, uint16 switch_value)
7421 DEBUG(5, ("init_samr_q_query_domain_info2\n"));
7423 q_u->domain_pol = *domain_pol;
7424 q_u->switch_value = switch_value;
7427 /*******************************************************************
7428 reads or writes a structure.
7429 ********************************************************************/
7431 BOOL samr_io_q_query_domain_info2(const char *desc, SAMR_Q_QUERY_DOMAIN_INFO2 *q_u,
7432 prs_struct *ps, int depth)
7434 if (q_u == NULL)
7435 return False;
7437 prs_debug(ps, depth, desc, "samr_io_q_query_domain_info2");
7438 depth++;
7440 if(!prs_align(ps))
7441 return False;
7443 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
7444 return False;
7446 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
7447 return False;
7449 return True;
7452 /*******************************************************************
7453 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
7454 ********************************************************************/
7456 void init_samr_r_samr_query_domain_info2(SAMR_R_QUERY_DOMAIN_INFO2 * r_u,
7457 uint16 switch_value, SAM_UNK_CTR * ctr,
7458 NTSTATUS status)
7460 DEBUG(5, ("init_samr_r_samr_query_domain_info2\n"));
7462 r_u->ptr_0 = 0;
7463 r_u->switch_value = 0;
7464 r_u->status = status; /* return status */
7466 if (NT_STATUS_IS_OK(status)) {
7467 r_u->switch_value = switch_value;
7468 r_u->ptr_0 = 1;
7469 r_u->ctr = ctr;
7473 /*******************************************************************
7474 reads or writes a structure.
7475 ********************************************************************/
7477 BOOL samr_io_r_samr_query_domain_info2(const char *desc, SAMR_R_QUERY_DOMAIN_INFO2 * r_u,
7478 prs_struct *ps, int depth)
7480 if (r_u == NULL)
7481 return False;
7483 prs_debug(ps, depth, desc, "samr_io_r_samr_query_domain_info2");
7484 depth++;
7486 if(!prs_align(ps))
7487 return False;
7489 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
7490 return False;
7492 if (r_u->ptr_0 != 0 && r_u->ctr != NULL) {
7493 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
7494 return False;
7495 if(!prs_align(ps))
7496 return False;
7498 switch (r_u->switch_value) {
7499 case 0x0c:
7500 if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth))
7501 return False;
7502 break;
7503 case 0x07:
7504 if(!sam_io_unk_info7("unk_inf7",&r_u->ctr->info.inf7, ps,depth))
7505 return False;
7506 break;
7507 case 0x06:
7508 if(!sam_io_unk_info6("unk_inf6",&r_u->ctr->info.inf6, ps,depth))
7509 return False;
7510 break;
7511 case 0x05:
7512 if(!sam_io_unk_info5("unk_inf5",&r_u->ctr->info.inf5, ps,depth))
7513 return False;
7514 break;
7515 case 0x03:
7516 if(!sam_io_unk_info3("unk_inf3",&r_u->ctr->info.inf3, ps,depth))
7517 return False;
7518 break;
7519 case 0x02:
7520 if(!sam_io_unk_info2("unk_inf2",&r_u->ctr->info.inf2, ps,depth))
7521 return False;
7522 break;
7523 case 0x01:
7524 if(!sam_io_unk_info1("unk_inf1",&r_u->ctr->info.inf1, ps,depth))
7525 return False;
7526 break;
7527 default:
7528 DEBUG(0, ("samr_io_r_samr_query_domain_info2: unknown switch level 0x%x\n",
7529 r_u->switch_value));
7530 r_u->status = NT_STATUS_INVALID_INFO_CLASS;
7531 return False;
7535 if(!prs_align(ps))
7536 return False;
7538 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7539 return False;
7541 return True;
7545 /*******************************************************************
7546 reads or writes a structure.
7547 ********************************************************************/
7549 void init_samr_q_set_domain_info(SAMR_Q_SET_DOMAIN_INFO *q_u,
7550 POLICY_HND *domain_pol, uint16 switch_value, SAM_UNK_CTR *ctr)
7552 DEBUG(5, ("init_samr_q_set_domain_info\n"));
7554 q_u->domain_pol = *domain_pol;
7555 q_u->switch_value0 = switch_value;
7557 q_u->switch_value = switch_value;
7558 q_u->ctr = ctr;
7562 /*******************************************************************
7563 reads or writes a structure.
7564 ********************************************************************/
7566 BOOL samr_io_q_set_domain_info(const char *desc, SAMR_Q_SET_DOMAIN_INFO *q_u,
7567 prs_struct *ps, int depth)
7569 if (q_u == NULL)
7570 return False;
7572 prs_debug(ps, depth, desc, "samr_io_q_set_domain_info");
7573 depth++;
7575 if(!prs_align(ps))
7576 return False;
7578 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
7579 return False;
7581 if(!prs_uint16("switch_value0", ps, depth, &q_u->switch_value0))
7582 return False;
7584 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
7585 return False;
7587 if(!prs_align(ps))
7588 return False;
7590 if ((q_u->ctr = PRS_ALLOC_MEM(ps, SAM_UNK_CTR, 1)) == NULL)
7591 return False;
7593 switch (q_u->switch_value) {
7595 case 0x0c:
7596 if(!sam_io_unk_info12("unk_inf12", &q_u->ctr->info.inf12, ps, depth))
7597 return False;
7598 break;
7599 case 0x07:
7600 if(!sam_io_unk_info7("unk_inf7",&q_u->ctr->info.inf7, ps,depth))
7601 return False;
7602 break;
7603 case 0x06:
7604 if(!sam_io_unk_info6("unk_inf6",&q_u->ctr->info.inf6, ps,depth))
7605 return False;
7606 break;
7607 case 0x05:
7608 if(!sam_io_unk_info5("unk_inf5",&q_u->ctr->info.inf5, ps,depth))
7609 return False;
7610 break;
7611 case 0x03:
7612 if(!sam_io_unk_info3("unk_inf3",&q_u->ctr->info.inf3, ps,depth))
7613 return False;
7614 break;
7615 case 0x02:
7616 if(!sam_io_unk_info2("unk_inf2",&q_u->ctr->info.inf2, ps,depth))
7617 return False;
7618 break;
7619 case 0x01:
7620 if(!sam_io_unk_info1("unk_inf1",&q_u->ctr->info.inf1, ps,depth))
7621 return False;
7622 break;
7623 default:
7624 DEBUG(0, ("samr_io_r_samr_unknown_2e: unknown switch level 0x%x\n",
7625 q_u->switch_value));
7626 return False;
7629 return True;
7632 /*******************************************************************
7633 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
7634 ********************************************************************/
7636 void init_samr_r_set_domain_info(SAMR_R_SET_DOMAIN_INFO * r_u, NTSTATUS status)
7638 DEBUG(5, ("init_samr_r_set_domain_info\n"));
7640 r_u->status = status; /* return status */
7643 /*******************************************************************
7644 reads or writes a structure.
7645 ********************************************************************/
7647 BOOL samr_io_r_set_domain_info(const char *desc, SAMR_R_SET_DOMAIN_INFO * r_u,
7648 prs_struct *ps, int depth)
7650 if (r_u == NULL)
7651 return False;
7653 prs_debug(ps, depth, desc, "samr_io_r_samr_unknown_2e");
7654 depth++;
7656 if(!prs_align(ps))
7657 return False;
7659 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7660 return False;
7662 return True;