r24770: Use infolevel 25 to set the machine account's password (just like winxp).
[Samba.git] / source / rpc_parse / parse_samr.c
blob970fdd8cb157befa222c05da925e42b684a59a87
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->min_pwd_length = 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->password_properties = 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("min_pwd_length", ps, depth, &r_u->min_pwd_length))
379 return False;
380 if(!prs_uint16("unknown_1", ps, depth, &r_u->unknown_1))
381 return False;
382 if(!prs_uint32("password_properties", ps, depth, &r_u->password_properties))
383 return False;
385 if(!prs_ntstatus("status ", ps, depth, &r_u->status))
386 return False;
388 return True;
392 /*******************************************************************
393 reads or writes a structure.
394 ********************************************************************/
396 BOOL samr_io_q_set_sec_obj(const char *desc, SAMR_Q_SET_SEC_OBJ * q_u,
397 prs_struct *ps, int depth)
399 if (q_u == NULL)
400 return False;
402 prs_debug(ps, depth, desc, "samr_io_q_set_sec_obj");
403 depth++;
405 if(!prs_align(ps))
406 return False;
408 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
409 return False;
411 if(!prs_uint32("sec_info", ps, depth, &q_u->sec_info))
412 return False;
414 if(!sec_io_desc_buf("sec_desc", &q_u->buf, ps, depth))
415 return False;
417 return True;
421 /*******************************************************************
422 reads or writes a structure.
423 ********************************************************************/
425 void init_samr_q_query_sec_obj(SAMR_Q_QUERY_SEC_OBJ * q_u,
426 POLICY_HND *user_pol, uint32 sec_info)
428 DEBUG(5, ("samr_init_samr_q_query_sec_obj\n"));
430 q_u->user_pol = *user_pol;
431 q_u->sec_info = sec_info;
435 /*******************************************************************
436 reads or writes a structure.
437 ********************************************************************/
439 BOOL samr_io_q_query_sec_obj(const char *desc, SAMR_Q_QUERY_SEC_OBJ * q_u,
440 prs_struct *ps, int depth)
442 if (q_u == NULL)
443 return False;
445 prs_debug(ps, depth, desc, "samr_io_q_query_sec_obj");
446 depth++;
448 if(!prs_align(ps))
449 return False;
451 if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth))
452 return False;
454 if(!prs_uint32("sec_info", ps, depth, &q_u->sec_info))
455 return False;
457 return True;
460 /*******************************************************************
461 reads or writes a structure.
462 ********************************************************************/
464 void init_samr_q_query_domain_info(SAMR_Q_QUERY_DOMAIN_INFO * q_u,
465 POLICY_HND *domain_pol, uint16 switch_value)
467 DEBUG(5, ("samr_init_samr_q_query_domain_info\n"));
469 q_u->domain_pol = *domain_pol;
470 q_u->switch_value = switch_value;
473 /*******************************************************************
474 reads or writes a structure.
475 ********************************************************************/
477 BOOL samr_io_q_query_domain_info(const char *desc, SAMR_Q_QUERY_DOMAIN_INFO * q_u,
478 prs_struct *ps, int depth)
480 if (q_u == NULL)
481 return False;
483 prs_debug(ps, depth, desc, "samr_io_q_query_domain_info");
484 depth++;
486 if(!prs_align(ps))
487 return False;
489 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
490 return False;
492 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
493 return False;
495 return True;
498 /*******************************************************************
499 inits a structure.
500 ********************************************************************/
502 void init_unk_info1(SAM_UNK_INFO_1 *u_1, uint16 min_pass_len, uint16 pass_hist,
503 uint32 password_properties, NTTIME nt_expire, NTTIME nt_min_age)
505 u_1->min_length_password = min_pass_len;
506 u_1->password_history = pass_hist;
508 if (lp_check_password_script() && *lp_check_password_script()) {
509 password_properties |= DOMAIN_PASSWORD_COMPLEX;
511 u_1->password_properties = password_properties;
513 /* password never expire */
514 u_1->expire = nt_expire;
516 /* can change the password now */
517 u_1->min_passwordage = nt_min_age;
521 /*******************************************************************
522 reads or writes a structure.
523 ********************************************************************/
525 static BOOL sam_io_unk_info1(const char *desc, SAM_UNK_INFO_1 * u_1,
526 prs_struct *ps, int depth)
528 if (u_1 == NULL)
529 return False;
531 prs_debug(ps, depth, desc, "sam_io_unk_info1");
532 depth++;
534 if(!prs_uint16("min_length_password", ps, depth, &u_1->min_length_password))
535 return False;
536 if(!prs_uint16("password_history", ps, depth, &u_1->password_history))
537 return False;
538 if(!prs_uint32("password_properties", ps, depth, &u_1->password_properties))
539 return False;
540 if(!smb_io_time("expire", &u_1->expire, ps, depth))
541 return False;
542 if(!smb_io_time("min_passwordage", &u_1->min_passwordage, ps, depth))
543 return False;
545 return True;
548 /*******************************************************************
549 inits a structure.
550 ********************************************************************/
552 void init_unk_info2(SAM_UNK_INFO_2 * u_2,
553 const char *comment, const char *domain, const char *server,
554 uint32 seq_num, uint32 num_users, uint32 num_groups, uint32 num_alias, NTTIME nt_logout, uint32 server_role)
556 u_2->logout = nt_logout;
558 u_2->seq_num = seq_num;
561 u_2->unknown_4 = 0x00000001;
562 u_2->server_role = server_role;
563 u_2->unknown_6 = 0x00000001;
564 u_2->num_domain_usrs = num_users;
565 u_2->num_domain_grps = num_groups;
566 u_2->num_local_grps = num_alias;
568 init_unistr2(&u_2->uni_comment, comment, UNI_FLAGS_NONE);
569 init_uni_hdr(&u_2->hdr_comment, &u_2->uni_comment);
570 init_unistr2(&u_2->uni_domain, domain, UNI_FLAGS_NONE);
571 init_uni_hdr(&u_2->hdr_domain, &u_2->uni_domain);
572 init_unistr2(&u_2->uni_server, server, UNI_FLAGS_NONE);
573 init_uni_hdr(&u_2->hdr_server, &u_2->uni_server);
576 /*******************************************************************
577 reads or writes a structure.
578 ********************************************************************/
580 static BOOL sam_io_unk_info2(const char *desc, SAM_UNK_INFO_2 * u_2,
581 prs_struct *ps, int depth)
583 if (u_2 == NULL)
584 return False;
586 prs_debug(ps, depth, desc, "sam_io_unk_info2");
587 depth++;
589 if(!smb_io_time("logout", &u_2->logout, ps, depth))
590 return False;
591 if(!smb_io_unihdr("hdr_comment", &u_2->hdr_comment, ps, depth))
592 return False;
593 if(!smb_io_unihdr("hdr_domain", &u_2->hdr_domain, ps, depth))
594 return False;
595 if(!smb_io_unihdr("hdr_server", &u_2->hdr_server, ps, depth))
596 return False;
598 /* put all the data in here, at the moment, including what the above
599 pointer is referring to
602 if(!prs_uint64("seq_num ", ps, depth, &u_2->seq_num))
603 return False;
605 if(!prs_uint32("unknown_4 ", ps, depth, &u_2->unknown_4)) /* 0x0000 0001 */
606 return False;
607 if(!prs_uint32("server_role ", ps, depth, &u_2->server_role))
608 return False;
609 if(!prs_uint32("unknown_6 ", ps, depth, &u_2->unknown_6)) /* 0x0000 0001 */
610 return False;
611 if(!prs_uint32("num_domain_usrs ", ps, depth, &u_2->num_domain_usrs))
612 return False;
613 if(!prs_uint32("num_domain_grps", ps, depth, &u_2->num_domain_grps))
614 return False;
615 if(!prs_uint32("num_local_grps", ps, depth, &u_2->num_local_grps))
616 return False;
618 if(!smb_io_unistr2("uni_comment", &u_2->uni_comment, u_2->hdr_comment.buffer, ps, depth))
619 return False;
620 if(!smb_io_unistr2("uni_domain", &u_2->uni_domain, u_2->hdr_domain.buffer, ps, depth))
621 return False;
622 if(!smb_io_unistr2("uni_server", &u_2->uni_server, u_2->hdr_server.buffer, ps, depth))
623 return False;
625 return True;
628 /*******************************************************************
629 inits a structure.
630 ********************************************************************/
632 void init_unk_info3(SAM_UNK_INFO_3 *u_3, NTTIME nt_logout)
634 u_3->logout = nt_logout;
637 /*******************************************************************
638 reads or writes a structure.
639 ********************************************************************/
641 static BOOL sam_io_unk_info3(const char *desc, SAM_UNK_INFO_3 * u_3,
642 prs_struct *ps, int depth)
644 if (u_3 == NULL)
645 return False;
647 prs_debug(ps, depth, desc, "sam_io_unk_info3");
648 depth++;
650 if(!smb_io_time("logout", &u_3->logout, ps, depth))
651 return False;
653 return True;
656 /*******************************************************************
657 inits a structure.
658 ********************************************************************/
660 void init_unk_info4(SAM_UNK_INFO_4 * u_4,const char *comment)
662 init_unistr2(&u_4->uni_comment, comment, UNI_FLAGS_NONE);
663 init_uni_hdr(&u_4->hdr_comment, &u_4->uni_comment);
666 /*******************************************************************
667 reads or writes a structure.
668 ********************************************************************/
670 static BOOL sam_io_unk_info4(const char *desc, SAM_UNK_INFO_4 * u_4,
671 prs_struct *ps, int depth)
673 if (u_4 == NULL)
674 return False;
676 prs_debug(ps, depth, desc, "sam_io_unk_info4");
677 depth++;
679 if(!smb_io_unihdr("hdr_comment", &u_4->hdr_comment, ps, depth))
680 return False;
682 if(!smb_io_unistr2("uni_comment", &u_4->uni_comment, u_4->hdr_comment.buffer, ps, depth))
683 return False;
685 return True;
688 /*******************************************************************
689 inits a structure.
690 ********************************************************************/
692 void init_unk_info5(SAM_UNK_INFO_5 * u_5,const char *domain)
694 init_unistr2(&u_5->uni_domain, domain, UNI_FLAGS_NONE);
695 init_uni_hdr(&u_5->hdr_domain, &u_5->uni_domain);
698 /*******************************************************************
699 reads or writes a structure.
700 ********************************************************************/
702 static BOOL sam_io_unk_info5(const char *desc, SAM_UNK_INFO_5 * u_5,
703 prs_struct *ps, int depth)
705 if (u_5 == NULL)
706 return False;
708 prs_debug(ps, depth, desc, "sam_io_unk_info5");
709 depth++;
711 if(!smb_io_unihdr("hdr_domain", &u_5->hdr_domain, ps, depth))
712 return False;
714 if(!smb_io_unistr2("uni_domain", &u_5->uni_domain, u_5->hdr_domain.buffer, ps, depth))
715 return False;
717 return True;
720 /*******************************************************************
721 inits a structure.
722 ********************************************************************/
724 void init_unk_info6(SAM_UNK_INFO_6 * u_6, const char *server)
726 init_unistr2(&u_6->uni_server, server, UNI_FLAGS_NONE);
727 init_uni_hdr(&u_6->hdr_server, &u_6->uni_server);
730 /*******************************************************************
731 reads or writes a structure.
732 ********************************************************************/
734 static BOOL sam_io_unk_info6(const char *desc, SAM_UNK_INFO_6 * u_6,
735 prs_struct *ps, int depth)
737 if (u_6 == NULL)
738 return False;
740 prs_debug(ps, depth, desc, "sam_io_unk_info6");
741 depth++;
743 if(!smb_io_unihdr("hdr_server", &u_6->hdr_server, ps, depth))
744 return False;
746 if(!smb_io_unistr2("uni_server", &u_6->uni_server, u_6->hdr_server.buffer, ps, depth))
747 return False;
749 return True;
752 /*******************************************************************
753 inits a structure.
754 ********************************************************************/
756 void init_unk_info7(SAM_UNK_INFO_7 * u_7, uint32 server_role)
758 u_7->server_role = server_role;
761 /*******************************************************************
762 reads or writes a structure.
763 ********************************************************************/
765 static BOOL sam_io_unk_info7(const char *desc, SAM_UNK_INFO_7 * u_7,
766 prs_struct *ps, int depth)
768 if (u_7 == NULL)
769 return False;
771 prs_debug(ps, depth, desc, "sam_io_unk_info7");
772 depth++;
774 if(!prs_uint16("server_role", ps, depth, &u_7->server_role))
775 return False;
777 return True;
780 /*******************************************************************
781 inits a structure.
782 ********************************************************************/
784 void init_unk_info8(SAM_UNK_INFO_8 * u_8, uint32 seq_num)
786 unix_to_nt_time(&u_8->domain_create_time, 0);
787 u_8->seq_num = seq_num;
790 /*******************************************************************
791 reads or writes a structure.
792 ********************************************************************/
794 static BOOL sam_io_unk_info8(const char *desc, SAM_UNK_INFO_8 * u_8,
795 prs_struct *ps, int depth)
797 if (u_8 == NULL)
798 return False;
800 prs_debug(ps, depth, desc, "sam_io_unk_info8");
801 depth++;
803 if (!prs_uint64("seq_num", ps, depth, &u_8->seq_num))
804 return False;
806 if(!smb_io_time("domain_create_time", &u_8->domain_create_time, ps, depth))
807 return False;
809 return True;
812 /*******************************************************************
813 inits a structure.
814 ********************************************************************/
816 void init_unk_info9(SAM_UNK_INFO_9 * u_9, uint32 unknown)
818 u_9->unknown = unknown;
821 /*******************************************************************
822 reads or writes a structure.
823 ********************************************************************/
825 static BOOL sam_io_unk_info9(const char *desc, SAM_UNK_INFO_9 * u_9,
826 prs_struct *ps, int depth)
828 if (u_9 == NULL)
829 return False;
831 prs_debug(ps, depth, desc, "sam_io_unk_info9");
832 depth++;
834 if (!prs_uint32("unknown", ps, depth, &u_9->unknown))
835 return False;
837 return True;
840 /*******************************************************************
841 inits a structure.
842 ********************************************************************/
844 void init_unk_info12(SAM_UNK_INFO_12 * u_12, NTTIME nt_lock_duration, NTTIME nt_reset_time, uint16 lockout)
846 u_12->duration = nt_lock_duration;
847 u_12->reset_count = nt_reset_time;
849 u_12->bad_attempt_lockout = lockout;
852 /*******************************************************************
853 reads or writes a structure.
854 ********************************************************************/
856 static BOOL sam_io_unk_info12(const char *desc, SAM_UNK_INFO_12 * u_12,
857 prs_struct *ps, int depth)
859 if (u_12 == NULL)
860 return False;
862 prs_debug(ps, depth, desc, "sam_io_unk_info12");
863 depth++;
865 if(!smb_io_time("duration", &u_12->duration, ps, depth))
866 return False;
867 if(!smb_io_time("reset_count", &u_12->reset_count, ps, depth))
868 return False;
869 if(!prs_uint16("bad_attempt_lockout", ps, depth, &u_12->bad_attempt_lockout))
870 return False;
872 return True;
875 /*******************************************************************
876 inits a structure.
877 ********************************************************************/
879 void init_unk_info13(SAM_UNK_INFO_13 * u_13, uint32 seq_num)
881 unix_to_nt_time(&u_13->domain_create_time, 0);
882 u_13->seq_num = seq_num;
883 u_13->unknown1 = 0;
884 u_13->unknown2 = 0;
887 /*******************************************************************
888 reads or writes a structure.
889 ********************************************************************/
891 static BOOL sam_io_unk_info13(const char *desc, SAM_UNK_INFO_13 * u_13,
892 prs_struct *ps, int depth)
894 if (u_13 == NULL)
895 return False;
897 prs_debug(ps, depth, desc, "sam_io_unk_info13");
898 depth++;
900 if (!prs_uint64("seq_num", ps, depth, &u_13->seq_num))
901 return False;
903 if(!smb_io_time("domain_create_time", &u_13->domain_create_time, ps, depth))
904 return False;
906 if (!prs_uint32("unknown1", ps, depth, &u_13->unknown1))
907 return False;
908 if (!prs_uint32("unknown2", ps, depth, &u_13->unknown2))
909 return False;
911 return True;
914 /*******************************************************************
915 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
916 ********************************************************************/
918 void init_samr_r_query_domain_info(SAMR_R_QUERY_DOMAIN_INFO * r_u,
919 uint16 switch_value, SAM_UNK_CTR * ctr,
920 NTSTATUS status)
922 DEBUG(5, ("init_samr_r_query_domain_info\n"));
924 r_u->ptr_0 = 0;
925 r_u->switch_value = 0;
926 r_u->status = status; /* return status */
928 if (NT_STATUS_IS_OK(status)) {
929 r_u->switch_value = switch_value;
930 r_u->ptr_0 = 1;
931 r_u->ctr = ctr;
935 /*******************************************************************
936 reads or writes a structure.
937 ********************************************************************/
939 BOOL samr_io_r_query_domain_info(const char *desc, SAMR_R_QUERY_DOMAIN_INFO * r_u,
940 prs_struct *ps, int depth)
942 if (r_u == NULL)
943 return False;
945 prs_debug(ps, depth, desc, "samr_io_r_query_domain_info");
946 depth++;
948 if(!prs_align(ps))
949 return False;
951 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
952 return False;
954 if (r_u->ptr_0 != 0 && r_u->ctr != NULL) {
955 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
956 return False;
957 if(!prs_align(ps))
958 return False;
960 switch (r_u->switch_value) {
961 case 0x0d:
962 if(!sam_io_unk_info13("unk_inf13", &r_u->ctr->info.inf13, ps, depth))
963 return False;
964 break;
965 case 0x0c:
966 if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth))
967 return False;
968 break;
969 case 0x09:
970 if(!sam_io_unk_info9("unk_inf9",&r_u->ctr->info.inf9, ps,depth))
971 return False;
972 break;
973 case 0x08:
974 if(!sam_io_unk_info8("unk_inf8",&r_u->ctr->info.inf8, ps,depth))
975 return False;
976 break;
977 case 0x07:
978 if(!sam_io_unk_info7("unk_inf7",&r_u->ctr->info.inf7, ps,depth))
979 return False;
980 break;
981 case 0x06:
982 if(!sam_io_unk_info6("unk_inf6",&r_u->ctr->info.inf6, ps,depth))
983 return False;
984 break;
985 case 0x05:
986 if(!sam_io_unk_info5("unk_inf5",&r_u->ctr->info.inf5, ps,depth))
987 return False;
988 break;
989 case 0x04:
990 if(!sam_io_unk_info4("unk_inf4",&r_u->ctr->info.inf4, ps,depth))
991 return False;
992 break;
993 case 0x03:
994 if(!sam_io_unk_info3("unk_inf3",&r_u->ctr->info.inf3, ps,depth))
995 return False;
996 break;
997 case 0x02:
998 if(!sam_io_unk_info2("unk_inf2",&r_u->ctr->info.inf2, ps,depth))
999 return False;
1000 break;
1001 case 0x01:
1002 if(!sam_io_unk_info1("unk_inf1",&r_u->ctr->info.inf1, ps,depth))
1003 return False;
1004 break;
1005 default:
1006 DEBUG(0, ("samr_io_r_query_domain_info: unknown switch level 0x%x\n",
1007 r_u->switch_value));
1008 r_u->status = NT_STATUS_INVALID_INFO_CLASS;
1009 return False;
1013 if(!prs_align(ps))
1014 return False;
1016 if(!prs_ntstatus("status", ps, depth, &r_u->status))
1017 return False;
1019 return True;
1022 /*******************************************************************
1023 reads or writes a structure.
1024 ********************************************************************/
1026 void init_samr_q_set_sec_obj(SAMR_Q_SET_SEC_OBJ * q_u,
1027 POLICY_HND *pol, uint32 sec_info, SEC_DESC_BUF *buf)
1029 DEBUG(5, ("samr_init_samr_q_set_sec_obj\n"));
1031 q_u->pol = *pol;
1032 q_u->sec_info = sec_info;
1033 q_u->buf = buf;
1037 /*******************************************************************
1038 reads or writes a SAMR_R_SET_SEC_OBJ structure.
1039 ********************************************************************/
1041 BOOL samr_io_r_set_sec_obj(const char *desc, SAMR_R_SET_SEC_OBJ * r_u,
1042 prs_struct *ps, int depth)
1044 if (r_u == NULL)
1045 return False;
1047 prs_debug(ps, depth, desc, "samr_io_r_set_sec_obj");
1048 depth++;
1050 if(!prs_align(ps))
1051 return False;
1053 if(!prs_ntstatus("status", ps, depth, &r_u->status))
1054 return False;
1056 return True;
1059 /*******************************************************************
1060 reads or writes a SAMR_R_QUERY_SEC_OBJ structure.
1061 ********************************************************************/
1063 BOOL samr_io_r_query_sec_obj(const char *desc, SAMR_R_QUERY_SEC_OBJ * r_u,
1064 prs_struct *ps, int depth)
1066 if (r_u == NULL)
1067 return False;
1069 prs_debug(ps, depth, desc, "samr_io_r_query_sec_obj");
1070 depth++;
1072 if(!prs_align(ps))
1073 return False;
1075 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
1076 return False;
1077 if (r_u->ptr != 0) {
1078 if(!sec_io_desc_buf("sec", &r_u->buf, ps, depth))
1079 return False;
1082 if(!prs_ntstatus("status", ps, depth, &r_u->status))
1083 return False;
1085 return True;
1088 /*******************************************************************
1089 reads or writes a SAM_STR1 structure.
1090 ********************************************************************/
1092 static BOOL sam_io_sam_str1(const char *desc, SAM_STR1 * sam, uint32 acct_buf,
1093 uint32 name_buf, uint32 desc_buf,
1094 prs_struct *ps, int depth)
1096 if (sam == NULL)
1097 return False;
1099 prs_debug(ps, depth, desc, "sam_io_sam_str1");
1100 depth++;
1102 if(!prs_align(ps))
1103 return False;
1104 if (!smb_io_unistr2("name", &sam->uni_acct_name, acct_buf, ps, depth))
1105 return False;
1107 if (!smb_io_unistr2("desc", &sam->uni_acct_desc, desc_buf, ps, depth))
1108 return False;
1110 if (!smb_io_unistr2("full", &sam->uni_full_name, name_buf, ps, depth))
1111 return False;
1113 return True;
1116 /*******************************************************************
1117 inits a SAM_ENTRY1 structure.
1118 ********************************************************************/
1120 static void init_sam_entry1(SAM_ENTRY1 *sam, uint32 user_idx,
1121 UNISTR2 *sam_name, UNISTR2 *sam_full,
1122 UNISTR2 *sam_desc, uint32 rid_user,
1123 uint32 acb_info)
1125 DEBUG(5, ("init_sam_entry1\n"));
1127 ZERO_STRUCTP(sam);
1129 sam->user_idx = user_idx;
1130 sam->rid_user = rid_user;
1131 sam->acb_info = acb_info;
1133 init_uni_hdr(&sam->hdr_acct_name, sam_name);
1134 init_uni_hdr(&sam->hdr_user_name, sam_full);
1135 init_uni_hdr(&sam->hdr_user_desc, sam_desc);
1138 /*******************************************************************
1139 reads or writes a SAM_ENTRY1 structure.
1140 ********************************************************************/
1142 static BOOL sam_io_sam_entry1(const char *desc, SAM_ENTRY1 * sam,
1143 prs_struct *ps, int depth)
1145 if (sam == NULL)
1146 return False;
1148 prs_debug(ps, depth, desc, "sam_io_sam_entry1");
1149 depth++;
1151 if(!prs_align(ps))
1152 return False;
1154 if(!prs_uint32("user_idx ", ps, depth, &sam->user_idx))
1155 return False;
1157 if(!prs_uint32("rid_user ", ps, depth, &sam->rid_user))
1158 return False;
1159 if(!prs_uint32("acb_info ", ps, depth, &sam->acb_info))
1160 return False;
1162 if (!smb_io_unihdr("hdr_acct_name", &sam->hdr_acct_name, ps, depth))
1163 return False;
1164 if (!smb_io_unihdr("hdr_user_desc", &sam->hdr_user_desc, ps, depth))
1165 return False;
1166 if (!smb_io_unihdr("hdr_user_name", &sam->hdr_user_name, ps, depth))
1167 return False;
1169 return True;
1172 /*******************************************************************
1173 reads or writes a SAM_STR2 structure.
1174 ********************************************************************/
1176 static BOOL sam_io_sam_str2(const char *desc, SAM_STR2 * sam, uint32 acct_buf,
1177 uint32 desc_buf, prs_struct *ps, int depth)
1179 if (sam == NULL)
1180 return False;
1182 prs_debug(ps, depth, desc, "sam_io_sam_str2");
1183 depth++;
1185 if(!prs_align(ps))
1186 return False;
1188 if(!smb_io_unistr2("uni_srv_name", &sam->uni_srv_name, acct_buf, ps, depth)) /* account name unicode string */
1189 return False;
1190 if(!smb_io_unistr2("uni_srv_desc", &sam->uni_srv_desc, desc_buf, ps, depth)) /* account desc unicode string */
1191 return False;
1193 return True;
1196 /*******************************************************************
1197 inits a SAM_ENTRY2 structure.
1198 ********************************************************************/
1199 static void init_sam_entry2(SAM_ENTRY2 * sam, uint32 user_idx,
1200 UNISTR2 *sam_name, UNISTR2 *sam_desc,
1201 uint32 rid_user, uint32 acb_info)
1203 DEBUG(5, ("init_sam_entry2\n"));
1205 sam->user_idx = user_idx;
1206 sam->rid_user = rid_user;
1207 sam->acb_info = acb_info;
1209 init_uni_hdr(&sam->hdr_srv_name, sam_name);
1210 init_uni_hdr(&sam->hdr_srv_desc, sam_desc);
1213 /*******************************************************************
1214 reads or writes a SAM_ENTRY2 structure.
1215 ********************************************************************/
1217 static BOOL sam_io_sam_entry2(const char *desc, SAM_ENTRY2 * sam,
1218 prs_struct *ps, int depth)
1220 if (sam == NULL)
1221 return False;
1223 prs_debug(ps, depth, desc, "sam_io_sam_entry2");
1224 depth++;
1226 if(!prs_align(ps))
1227 return False;
1229 if(!prs_uint32("user_idx ", ps, depth, &sam->user_idx))
1230 return False;
1232 if(!prs_uint32("rid_user ", ps, depth, &sam->rid_user))
1233 return False;
1234 if(!prs_uint32("acb_info ", ps, depth, &sam->acb_info))
1235 return False;
1237 if(!smb_io_unihdr("unihdr", &sam->hdr_srv_name, ps, depth)) /* account name unicode string header */
1238 return False;
1239 if(!smb_io_unihdr("unihdr", &sam->hdr_srv_desc, ps, depth)) /* account name unicode string header */
1240 return False;
1242 return True;
1245 /*******************************************************************
1246 reads or writes a SAM_STR3 structure.
1247 ********************************************************************/
1249 static BOOL sam_io_sam_str3(const char *desc, SAM_STR3 * sam, uint32 acct_buf,
1250 uint32 desc_buf, prs_struct *ps, int depth)
1252 if (sam == NULL)
1253 return False;
1255 prs_debug(ps, depth, desc, "sam_io_sam_str3");
1256 depth++;
1258 if(!prs_align(ps))
1259 return False;
1261 if(!smb_io_unistr2("uni_grp_name", &sam->uni_grp_name, acct_buf, ps, depth)) /* account name unicode string */
1262 return False;
1263 if(!smb_io_unistr2("uni_grp_desc", &sam->uni_grp_desc, desc_buf, ps, depth)) /* account desc unicode string */
1264 return False;
1266 return True;
1269 /*******************************************************************
1270 inits a SAM_ENTRY3 structure.
1271 ********************************************************************/
1273 static void init_sam_entry3(SAM_ENTRY3 * sam, uint32 grp_idx,
1274 UNISTR2 *grp_name, UNISTR2 *grp_desc,
1275 uint32 rid_grp)
1277 DEBUG(5, ("init_sam_entry3\n"));
1279 sam->grp_idx = grp_idx;
1280 sam->rid_grp = rid_grp;
1281 sam->attr = 0x07; /* group rid attributes - gets ignored by nt 4.0 */
1283 init_uni_hdr(&sam->hdr_grp_name, grp_name);
1284 init_uni_hdr(&sam->hdr_grp_desc, grp_desc);
1287 /*******************************************************************
1288 reads or writes a SAM_ENTRY3 structure.
1289 ********************************************************************/
1291 static BOOL sam_io_sam_entry3(const char *desc, SAM_ENTRY3 * sam,
1292 prs_struct *ps, int depth)
1294 if (sam == NULL)
1295 return False;
1297 prs_debug(ps, depth, desc, "sam_io_sam_entry3");
1298 depth++;
1300 if(!prs_align(ps))
1301 return False;
1303 if(!prs_uint32("grp_idx", ps, depth, &sam->grp_idx))
1304 return False;
1306 if(!prs_uint32("rid_grp", ps, depth, &sam->rid_grp))
1307 return False;
1308 if(!prs_uint32("attr ", ps, depth, &sam->attr))
1309 return False;
1311 if(!smb_io_unihdr("unihdr", &sam->hdr_grp_name, ps, depth)) /* account name unicode string header */
1312 return False;
1313 if(!smb_io_unihdr("unihdr", &sam->hdr_grp_desc, ps, depth)) /* account name unicode string header */
1314 return False;
1316 return True;
1319 /*******************************************************************
1320 inits a SAM_ENTRY4 structure.
1321 ********************************************************************/
1323 static void init_sam_entry4(SAM_ENTRY4 * sam, uint32 user_idx,
1324 uint32 len_acct_name)
1326 DEBUG(5, ("init_sam_entry4\n"));
1328 sam->user_idx = user_idx;
1329 init_str_hdr(&sam->hdr_acct_name, len_acct_name+1, len_acct_name, len_acct_name != 0);
1332 /*******************************************************************
1333 reads or writes a SAM_ENTRY4 structure.
1334 ********************************************************************/
1336 static BOOL sam_io_sam_entry4(const char *desc, SAM_ENTRY4 * sam,
1337 prs_struct *ps, int depth)
1339 if (sam == NULL)
1340 return False;
1342 prs_debug(ps, depth, desc, "sam_io_sam_entry4");
1343 depth++;
1345 if(!prs_align(ps))
1346 return False;
1348 if(!prs_uint32("user_idx", ps, depth, &sam->user_idx))
1349 return False;
1350 if(!smb_io_strhdr("strhdr", &sam->hdr_acct_name, ps, depth))
1351 return False;
1353 return True;
1356 /*******************************************************************
1357 inits a SAM_ENTRY5 structure.
1358 ********************************************************************/
1360 static void init_sam_entry5(SAM_ENTRY5 * sam, uint32 grp_idx,
1361 uint32 len_grp_name)
1363 DEBUG(5, ("init_sam_entry5\n"));
1365 sam->grp_idx = grp_idx;
1366 init_str_hdr(&sam->hdr_grp_name, len_grp_name, len_grp_name,
1367 len_grp_name != 0);
1370 /*******************************************************************
1371 reads or writes a SAM_ENTRY5 structure.
1372 ********************************************************************/
1374 static BOOL sam_io_sam_entry5(const char *desc, SAM_ENTRY5 * sam,
1375 prs_struct *ps, int depth)
1377 if (sam == NULL)
1378 return False;
1380 prs_debug(ps, depth, desc, "sam_io_sam_entry5");
1381 depth++;
1383 if(!prs_align(ps))
1384 return False;
1386 if(!prs_uint32("grp_idx", ps, depth, &sam->grp_idx))
1387 return False;
1388 if(!smb_io_strhdr("strhdr", &sam->hdr_grp_name, ps, depth))
1389 return False;
1391 return True;
1394 /*******************************************************************
1395 inits a SAM_ENTRY structure.
1396 ********************************************************************/
1398 void init_sam_entry(SAM_ENTRY *sam, UNISTR2 *uni2, uint32 rid)
1400 DEBUG(10, ("init_sam_entry: %d\n", rid));
1402 sam->rid = rid;
1403 init_uni_hdr(&sam->hdr_name, uni2);
1406 /*******************************************************************
1407 reads or writes a SAM_ENTRY structure.
1408 ********************************************************************/
1410 static BOOL sam_io_sam_entry(const char *desc, SAM_ENTRY * sam,
1411 prs_struct *ps, int depth)
1413 if (sam == NULL)
1414 return False;
1416 prs_debug(ps, depth, desc, "sam_io_sam_entry");
1417 depth++;
1419 if(!prs_align(ps))
1420 return False;
1421 if(!prs_uint32("rid", ps, depth, &sam->rid))
1422 return False;
1423 if(!smb_io_unihdr("unihdr", &sam->hdr_name, ps, depth)) /* account name unicode string header */
1424 return False;
1426 return True;
1429 /*******************************************************************
1430 inits a SAMR_Q_ENUM_DOM_USERS structure.
1431 ********************************************************************/
1433 void init_samr_q_enum_dom_users(SAMR_Q_ENUM_DOM_USERS * q_e, POLICY_HND *pol,
1434 uint32 start_idx,
1435 uint32 acb_mask, uint32 size)
1437 DEBUG(5, ("init_samr_q_enum_dom_users\n"));
1439 q_e->pol = *pol;
1441 q_e->start_idx = start_idx; /* zero indicates lots */
1442 q_e->acb_mask = acb_mask;
1443 q_e->max_size = size;
1446 /*******************************************************************
1447 reads or writes a structure.
1448 ********************************************************************/
1450 BOOL samr_io_q_enum_dom_users(const char *desc, SAMR_Q_ENUM_DOM_USERS * q_e,
1451 prs_struct *ps, int depth)
1453 if (q_e == NULL)
1454 return False;
1456 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_users");
1457 depth++;
1459 if(!prs_align(ps))
1460 return False;
1462 if(!smb_io_pol_hnd("domain_pol", &q_e->pol, ps, depth))
1463 return False;
1465 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
1466 return False;
1467 if(!prs_uint32("acb_mask ", ps, depth, &q_e->acb_mask))
1468 return False;
1470 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1471 return False;
1473 return True;
1477 /*******************************************************************
1478 inits a SAMR_R_ENUM_DOM_USERS structure.
1479 ********************************************************************/
1481 void init_samr_r_enum_dom_users(SAMR_R_ENUM_DOM_USERS * r_u,
1482 uint32 next_idx, uint32 num_sam_entries)
1484 DEBUG(5, ("init_samr_r_enum_dom_users\n"));
1486 r_u->next_idx = next_idx;
1488 if (num_sam_entries != 0) {
1489 r_u->ptr_entries1 = 1;
1490 r_u->ptr_entries2 = 1;
1491 r_u->num_entries2 = num_sam_entries;
1492 r_u->num_entries3 = num_sam_entries;
1494 r_u->num_entries4 = num_sam_entries;
1495 } else {
1496 r_u->ptr_entries1 = 0;
1497 r_u->num_entries2 = num_sam_entries;
1498 r_u->ptr_entries2 = 1;
1502 /*******************************************************************
1503 reads or writes a structure.
1504 ********************************************************************/
1506 BOOL samr_io_r_enum_dom_users(const char *desc, SAMR_R_ENUM_DOM_USERS * r_u,
1507 prs_struct *ps, int depth)
1509 uint32 i;
1511 if (r_u == NULL)
1512 return False;
1514 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_users");
1515 depth++;
1517 if(!prs_align(ps))
1518 return False;
1520 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
1521 return False;
1522 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
1523 return False;
1525 if (r_u->ptr_entries1 != 0) {
1526 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
1527 return False;
1528 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
1529 return False;
1530 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
1531 return False;
1533 if (UNMARSHALLING(ps) && (r_u->num_entries2 != 0)) {
1534 r_u->sam = PRS_ALLOC_MEM(ps,SAM_ENTRY, r_u->num_entries2);
1535 r_u->uni_acct_name = PRS_ALLOC_MEM(ps,UNISTR2, r_u->num_entries2);
1538 if ((r_u->sam == NULL || r_u->uni_acct_name == NULL) && r_u->num_entries2 != 0) {
1539 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_USERS\n"));
1540 r_u->num_entries4 = 0;
1541 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
1542 return False;
1545 for (i = 0; i < r_u->num_entries2; i++) {
1546 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
1547 return False;
1550 for (i = 0; i < r_u->num_entries2; i++) {
1551 if(!smb_io_unistr2("", &r_u->uni_acct_name[i],r_u->sam[i].hdr_name.buffer, ps,depth))
1552 return False;
1557 if(!prs_align(ps))
1558 return False;
1560 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
1561 return False;
1562 if(!prs_ntstatus("status", ps, depth, &r_u->status))
1563 return False;
1565 return True;
1568 /*******************************************************************
1569 inits a SAMR_Q_QUERY_DISPINFO structure.
1570 ********************************************************************/
1572 void init_samr_q_query_dispinfo(SAMR_Q_QUERY_DISPINFO * q_e, POLICY_HND *pol,
1573 uint16 switch_level, uint32 start_idx,
1574 uint32 max_entries, uint32 max_size)
1576 DEBUG(5, ("init_samr_q_query_dispinfo\n"));
1578 q_e->domain_pol = *pol;
1580 q_e->switch_level = switch_level;
1582 q_e->start_idx = start_idx;
1583 q_e->max_entries = max_entries;
1584 q_e->max_size = max_size;
1587 /*******************************************************************
1588 reads or writes a structure.
1589 ********************************************************************/
1591 BOOL samr_io_q_query_dispinfo(const char *desc, SAMR_Q_QUERY_DISPINFO * q_e,
1592 prs_struct *ps, int depth)
1594 if (q_e == NULL)
1595 return False;
1597 prs_debug(ps, depth, desc, "samr_io_q_query_dispinfo");
1598 depth++;
1600 if(!prs_align(ps))
1601 return False;
1603 if(!smb_io_pol_hnd("domain_pol", &q_e->domain_pol, ps, depth))
1604 return False;
1606 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
1607 return False;
1608 if(!prs_align(ps))
1609 return False;
1611 if(!prs_uint32("start_idx ", ps, depth, &q_e->start_idx))
1612 return False;
1613 if(!prs_uint32("max_entries ", ps, depth, &q_e->max_entries))
1614 return False;
1615 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
1616 return False;
1618 return True;
1621 /*******************************************************************
1622 inits a SAM_DISPINFO_1 structure.
1623 ********************************************************************/
1625 NTSTATUS init_sam_dispinfo_1(TALLOC_CTX *ctx, SAM_DISPINFO_1 **sam,
1626 uint32 num_entries, uint32 start_idx,
1627 struct samr_displayentry *entries)
1629 uint32 i;
1631 DEBUG(10, ("init_sam_dispinfo_1: num_entries: %d\n", num_entries));
1633 if (num_entries==0)
1634 return NT_STATUS_OK;
1636 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_1, num_entries);
1637 if (*sam == NULL)
1638 return NT_STATUS_NO_MEMORY;
1640 (*sam)->sam=TALLOC_ARRAY(ctx, SAM_ENTRY1, num_entries);
1641 if ((*sam)->sam == NULL)
1642 return NT_STATUS_NO_MEMORY;
1644 (*sam)->str=TALLOC_ARRAY(ctx, SAM_STR1, num_entries);
1645 if ((*sam)->str == NULL)
1646 return NT_STATUS_NO_MEMORY;
1648 for (i = 0; i < num_entries ; i++) {
1649 init_unistr2(&(*sam)->str[i].uni_acct_name,
1650 entries[i].account_name, UNI_FLAGS_NONE);
1651 init_unistr2(&(*sam)->str[i].uni_full_name,
1652 entries[i].fullname, UNI_FLAGS_NONE);
1653 init_unistr2(&(*sam)->str[i].uni_acct_desc,
1654 entries[i].description, UNI_FLAGS_NONE);
1656 init_sam_entry1(&(*sam)->sam[i], start_idx+i+1,
1657 &(*sam)->str[i].uni_acct_name,
1658 &(*sam)->str[i].uni_full_name,
1659 &(*sam)->str[i].uni_acct_desc,
1660 entries[i].rid, entries[i].acct_flags);
1663 return NT_STATUS_OK;
1666 /*******************************************************************
1667 reads or writes a structure.
1668 ********************************************************************/
1670 static BOOL sam_io_sam_dispinfo_1(const char *desc, SAM_DISPINFO_1 * sam,
1671 uint32 num_entries,
1672 prs_struct *ps, int depth)
1674 uint32 i;
1676 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_1");
1677 depth++;
1679 if(!prs_align(ps))
1680 return False;
1682 if (UNMARSHALLING(ps) && num_entries > 0) {
1684 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY1, num_entries)) == NULL) {
1685 DEBUG(0, ("out of memory allocating SAM_ENTRY1\n"));
1686 return False;
1689 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR1, num_entries)) == NULL) {
1690 DEBUG(0, ("out of memory allocating SAM_STR1\n"));
1691 return False;
1695 for (i = 0; i < num_entries; i++) {
1696 if(!sam_io_sam_entry1("", &sam->sam[i], ps, depth))
1697 return False;
1700 for (i = 0; i < num_entries; i++) {
1701 if(!sam_io_sam_str1("", &sam->str[i],
1702 sam->sam[i].hdr_acct_name.buffer,
1703 sam->sam[i].hdr_user_name.buffer,
1704 sam->sam[i].hdr_user_desc.buffer, ps, depth))
1705 return False;
1708 return True;
1711 /*******************************************************************
1712 inits a SAM_DISPINFO_2 structure.
1713 ********************************************************************/
1715 NTSTATUS init_sam_dispinfo_2(TALLOC_CTX *ctx, SAM_DISPINFO_2 **sam,
1716 uint32 num_entries, uint32 start_idx,
1717 struct samr_displayentry *entries)
1719 uint32 i;
1721 DEBUG(10, ("init_sam_dispinfo_2: num_entries: %d\n", num_entries));
1723 if (num_entries==0)
1724 return NT_STATUS_OK;
1726 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_2, num_entries);
1727 if (*sam == NULL)
1728 return NT_STATUS_NO_MEMORY;
1730 (*sam)->sam = TALLOC_ARRAY(ctx, SAM_ENTRY2, num_entries);
1731 if ((*sam)->sam == NULL)
1732 return NT_STATUS_NO_MEMORY;
1734 (*sam)->str=TALLOC_ARRAY(ctx, SAM_STR2, num_entries);
1735 if ((*sam)->str == NULL)
1736 return NT_STATUS_NO_MEMORY;
1738 for (i = 0; i < num_entries; i++) {
1739 init_unistr2(&(*sam)->str[i].uni_srv_name,
1740 entries[i].account_name, UNI_FLAGS_NONE);
1741 init_unistr2(&(*sam)->str[i].uni_srv_desc,
1742 entries[i].description, UNI_FLAGS_NONE);
1744 init_sam_entry2(&(*sam)->sam[i], start_idx + i + 1,
1745 &(*sam)->str[i].uni_srv_name,
1746 &(*sam)->str[i].uni_srv_desc,
1747 entries[i].rid, entries[i].acct_flags);
1750 return NT_STATUS_OK;
1753 /*******************************************************************
1754 reads or writes a structure.
1755 ********************************************************************/
1757 static BOOL sam_io_sam_dispinfo_2(const char *desc, SAM_DISPINFO_2 * sam,
1758 uint32 num_entries,
1759 prs_struct *ps, int depth)
1761 uint32 i;
1763 if (sam == NULL)
1764 return False;
1766 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_2");
1767 depth++;
1769 if(!prs_align(ps))
1770 return False;
1772 if (UNMARSHALLING(ps) && num_entries > 0) {
1774 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY2, num_entries)) == NULL) {
1775 DEBUG(0, ("out of memory allocating SAM_ENTRY2\n"));
1776 return False;
1779 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR2, num_entries)) == NULL) {
1780 DEBUG(0, ("out of memory allocating SAM_STR2\n"));
1781 return False;
1785 for (i = 0; i < num_entries; i++) {
1786 if(!sam_io_sam_entry2("", &sam->sam[i], ps, depth))
1787 return False;
1790 for (i = 0; i < num_entries; i++) {
1791 if(!sam_io_sam_str2("", &sam->str[i],
1792 sam->sam[i].hdr_srv_name.buffer,
1793 sam->sam[i].hdr_srv_desc.buffer, ps, depth))
1794 return False;
1797 return True;
1800 /*******************************************************************
1801 inits a SAM_DISPINFO_3 structure.
1802 ********************************************************************/
1804 NTSTATUS init_sam_dispinfo_3(TALLOC_CTX *ctx, SAM_DISPINFO_3 **sam,
1805 uint32 num_entries, uint32 start_idx,
1806 struct samr_displayentry *entries)
1808 uint32 i;
1810 DEBUG(5, ("init_sam_dispinfo_3: num_entries: %d\n", num_entries));
1812 if (num_entries==0)
1813 return NT_STATUS_OK;
1815 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_3, num_entries);
1816 if (*sam == NULL)
1817 return NT_STATUS_NO_MEMORY;
1819 if (!((*sam)->sam=TALLOC_ARRAY(ctx, SAM_ENTRY3, num_entries)))
1820 return NT_STATUS_NO_MEMORY;
1822 if (!((*sam)->str=TALLOC_ARRAY(ctx, SAM_STR3, num_entries)))
1823 return NT_STATUS_NO_MEMORY;
1825 for (i = 0; i < num_entries; i++) {
1826 DEBUG(11, ("init_sam_dispinfo_3: entry: %d\n",i));
1828 init_unistr2(&(*sam)->str[i].uni_grp_name,
1829 entries[i].account_name, UNI_FLAGS_NONE);
1830 init_unistr2(&(*sam)->str[i].uni_grp_desc,
1831 entries[i].description, UNI_FLAGS_NONE);
1833 init_sam_entry3(&(*sam)->sam[i], start_idx+i+1,
1834 &(*sam)->str[i].uni_grp_name,
1835 &(*sam)->str[i].uni_grp_desc,
1836 entries[i].rid);
1839 return NT_STATUS_OK;
1842 /*******************************************************************
1843 reads or writes a structure.
1844 ********************************************************************/
1846 static BOOL sam_io_sam_dispinfo_3(const char *desc, SAM_DISPINFO_3 * sam,
1847 uint32 num_entries,
1848 prs_struct *ps, int depth)
1850 uint32 i;
1852 if (sam == NULL)
1853 return False;
1855 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_3");
1856 depth++;
1858 if(!prs_align(ps))
1859 return False;
1861 if (UNMARSHALLING(ps) && num_entries > 0) {
1863 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY3, num_entries)) == NULL) {
1864 DEBUG(0, ("out of memory allocating SAM_ENTRY3\n"));
1865 return False;
1868 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR3, num_entries)) == NULL) {
1869 DEBUG(0, ("out of memory allocating SAM_STR3\n"));
1870 return False;
1874 for (i = 0; i < num_entries; i++) {
1875 if(!sam_io_sam_entry3("", &sam->sam[i], ps, depth))
1876 return False;
1879 for (i = 0; i < num_entries; i++) {
1880 if(!sam_io_sam_str3("", &sam->str[i],
1881 sam->sam[i].hdr_grp_name.buffer,
1882 sam->sam[i].hdr_grp_desc.buffer, ps, depth))
1883 return False;
1886 return True;
1889 /*******************************************************************
1890 inits a SAM_DISPINFO_4 structure.
1891 ********************************************************************/
1893 NTSTATUS init_sam_dispinfo_4(TALLOC_CTX *ctx, SAM_DISPINFO_4 **sam,
1894 uint32 num_entries, uint32 start_idx,
1895 struct samr_displayentry *entries)
1897 uint32 i;
1899 DEBUG(5, ("init_sam_dispinfo_4: num_entries: %d\n", num_entries));
1901 if (num_entries==0)
1902 return NT_STATUS_OK;
1904 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_4, num_entries);
1905 if (*sam == NULL)
1906 return NT_STATUS_NO_MEMORY;
1908 (*sam)->sam = TALLOC_ARRAY(ctx, SAM_ENTRY4, num_entries);
1909 if ((*sam)->sam == NULL)
1910 return NT_STATUS_NO_MEMORY;
1912 (*sam)->str=TALLOC_ARRAY(ctx, SAM_STR4, num_entries);
1913 if ((*sam)->str == NULL)
1914 return NT_STATUS_NO_MEMORY;
1916 for (i = 0; i < num_entries; i++) {
1917 size_t len_sam_name = strlen(entries[i].account_name);
1919 DEBUG(11, ("init_sam_dispinfo_2: entry: %d\n",i));
1921 init_sam_entry4(&(*sam)->sam[i], start_idx + i + 1,
1922 len_sam_name);
1924 init_string2(&(*sam)->str[i].acct_name,
1925 entries[i].account_name, len_sam_name+1,
1926 len_sam_name);
1929 return NT_STATUS_OK;
1932 /*******************************************************************
1933 reads or writes a structure.
1934 ********************************************************************/
1936 static BOOL sam_io_sam_dispinfo_4(const char *desc, SAM_DISPINFO_4 * sam,
1937 uint32 num_entries,
1938 prs_struct *ps, int depth)
1940 uint32 i;
1942 if (sam == NULL)
1943 return False;
1945 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_4");
1946 depth++;
1948 if(!prs_align(ps))
1949 return False;
1951 if (UNMARSHALLING(ps) && num_entries > 0) {
1953 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY4, num_entries)) == NULL) {
1954 DEBUG(0, ("out of memory allocating SAM_ENTRY4\n"));
1955 return False;
1958 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR4, num_entries)) == NULL) {
1959 DEBUG(0, ("out of memory allocating SAM_STR4\n"));
1960 return False;
1964 for (i = 0; i < num_entries; i++) {
1965 if(!sam_io_sam_entry4("", &sam->sam[i], ps, depth))
1966 return False;
1969 for (i = 0; i < num_entries; i++) {
1970 if(!smb_io_string2("acct_name", &sam->str[i].acct_name,
1971 sam->sam[i].hdr_acct_name.buffer, ps, depth))
1972 return False;
1975 return True;
1978 /*******************************************************************
1979 inits a SAM_DISPINFO_5 structure.
1980 ********************************************************************/
1982 NTSTATUS init_sam_dispinfo_5(TALLOC_CTX *ctx, SAM_DISPINFO_5 **sam,
1983 uint32 num_entries, uint32 start_idx,
1984 struct samr_displayentry *entries)
1986 uint32 len_sam_name;
1987 uint32 i;
1989 DEBUG(5, ("init_sam_dispinfo_5: num_entries: %d\n", num_entries));
1991 if (num_entries==0)
1992 return NT_STATUS_OK;
1994 *sam = TALLOC_ZERO_ARRAY(ctx, SAM_DISPINFO_5, num_entries);
1995 if (*sam == NULL)
1996 return NT_STATUS_NO_MEMORY;
1998 if (!((*sam)->sam=TALLOC_ARRAY(ctx, SAM_ENTRY5, num_entries)))
1999 return NT_STATUS_NO_MEMORY;
2001 if (!((*sam)->str=TALLOC_ARRAY(ctx, SAM_STR5, num_entries)))
2002 return NT_STATUS_NO_MEMORY;
2004 for (i = 0; i < num_entries; i++) {
2005 DEBUG(11, ("init_sam_dispinfo_5: entry: %d\n",i));
2007 len_sam_name = strlen(entries[i].account_name);
2009 init_sam_entry5(&(*sam)->sam[i], start_idx+i+1, len_sam_name);
2010 init_string2(&(*sam)->str[i].grp_name, entries[i].account_name,
2011 len_sam_name+1, len_sam_name);
2014 return NT_STATUS_OK;
2017 /*******************************************************************
2018 reads or writes a structure.
2019 ********************************************************************/
2021 static BOOL sam_io_sam_dispinfo_5(const char *desc, SAM_DISPINFO_5 * sam,
2022 uint32 num_entries,
2023 prs_struct *ps, int depth)
2025 uint32 i;
2027 if (sam == NULL)
2028 return False;
2030 prs_debug(ps, depth, desc, "sam_io_sam_dispinfo_5");
2031 depth++;
2033 if(!prs_align(ps))
2034 return False;
2036 if (UNMARSHALLING(ps) && num_entries > 0) {
2038 if ((sam->sam = PRS_ALLOC_MEM(ps, SAM_ENTRY5, num_entries)) == NULL) {
2039 DEBUG(0, ("out of memory allocating SAM_ENTRY5\n"));
2040 return False;
2043 if ((sam->str = PRS_ALLOC_MEM(ps, SAM_STR5, num_entries)) == NULL) {
2044 DEBUG(0, ("out of memory allocating SAM_STR5\n"));
2045 return False;
2049 for (i = 0; i < num_entries; i++) {
2050 if(!sam_io_sam_entry5("", &sam->sam[i], ps, depth))
2051 return False;
2054 for (i = 0; i < num_entries; i++) {
2055 if(!smb_io_string2("grp_name", &sam->str[i].grp_name,
2056 sam->sam[i].hdr_grp_name.buffer, ps, depth))
2057 return False;
2060 return True;
2063 /*******************************************************************
2064 inits a SAMR_R_QUERY_DISPINFO structure.
2065 ********************************************************************/
2067 void init_samr_r_query_dispinfo(SAMR_R_QUERY_DISPINFO * r_u,
2068 uint32 num_entries, uint32 total_size, uint32 data_size,
2069 uint16 switch_level, SAM_DISPINFO_CTR * ctr,
2070 NTSTATUS status)
2072 DEBUG(5, ("init_samr_r_query_dispinfo: level %d\n", switch_level));
2074 r_u->total_size = total_size;
2076 r_u->data_size = data_size;
2078 r_u->switch_level = switch_level;
2079 r_u->num_entries = num_entries;
2081 if (num_entries==0)
2082 r_u->ptr_entries = 0;
2083 else
2084 r_u->ptr_entries = 1;
2086 r_u->num_entries2 = num_entries;
2087 r_u->ctr = ctr;
2089 r_u->status = status;
2092 /*******************************************************************
2093 reads or writes a structure.
2094 ********************************************************************/
2096 BOOL samr_io_r_query_dispinfo(const char *desc, SAMR_R_QUERY_DISPINFO * r_u,
2097 prs_struct *ps, int depth)
2099 if (r_u == NULL)
2100 return False;
2102 prs_debug(ps, depth, desc, "samr_io_r_query_dispinfo");
2103 depth++;
2105 if(!prs_align(ps))
2106 return False;
2108 if(!prs_uint32("total_size ", ps, depth, &r_u->total_size))
2109 return False;
2110 if(!prs_uint32("data_size ", ps, depth, &r_u->data_size))
2111 return False;
2112 if(!prs_uint16("switch_level", ps, depth, &r_u->switch_level))
2113 return False;
2114 if(!prs_align(ps))
2115 return False;
2117 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
2118 return False;
2119 if(!prs_uint32("ptr_entries ", ps, depth, &r_u->ptr_entries))
2120 return False;
2122 if (r_u->ptr_entries==0) {
2123 if(!prs_align(ps))
2124 return False;
2125 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2126 return False;
2128 return True;
2131 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
2132 return False;
2134 switch (r_u->switch_level) {
2135 case 0x1:
2136 if(!sam_io_sam_dispinfo_1("users", r_u->ctr->sam.info1,
2137 r_u->num_entries, ps, depth))
2138 return False;
2139 break;
2140 case 0x2:
2141 if(!sam_io_sam_dispinfo_2("servers", r_u->ctr->sam.info2,
2142 r_u->num_entries, ps, depth))
2143 return False;
2144 break;
2145 case 0x3:
2146 if(!sam_io_sam_dispinfo_3("groups", r_u->ctr->sam.info3,
2147 r_u->num_entries, ps, depth))
2148 return False;
2149 break;
2150 case 0x4:
2151 if(!sam_io_sam_dispinfo_4("user list",
2152 r_u->ctr->sam.info4,
2153 r_u->num_entries, ps, depth))
2154 return False;
2155 break;
2156 case 0x5:
2157 if(!sam_io_sam_dispinfo_5("group list",
2158 r_u->ctr->sam.info5,
2159 r_u->num_entries, ps, depth))
2160 return False;
2161 break;
2162 default:
2163 DEBUG(0,("samr_io_r_query_dispinfo: unknown switch value\n"));
2164 break;
2167 if(!prs_align(ps))
2168 return False;
2169 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2170 return False;
2172 return True;
2175 /*******************************************************************
2176 inits a SAMR_Q_GET_DISPENUM_INDEX structure.
2177 ********************************************************************/
2179 void init_samr_q_get_dispenum_index(SAMR_Q_GET_DISPENUM_INDEX * q_e, POLICY_HND *pol,
2180 uint16 switch_level, const char *name)
2182 DEBUG(5, ("init_samr_q_get_dispenum_index\n"));
2184 q_e->domain_pol = *pol;
2186 q_e->switch_level = switch_level;
2188 init_lsa_string(&q_e->name, name);
2191 /*******************************************************************
2192 reads or writes a structure.
2193 ********************************************************************/
2195 BOOL samr_io_q_get_dispenum_index(const char *desc, SAMR_Q_GET_DISPENUM_INDEX * q_e,
2196 prs_struct *ps, int depth)
2198 if (q_e == NULL)
2199 return False;
2201 prs_debug(ps, depth, desc, "samr_io_q_get_dispenum_index");
2202 depth++;
2204 if(!prs_align(ps))
2205 return False;
2207 if(!smb_io_pol_hnd("domain_pol", &q_e->domain_pol, ps, depth))
2208 return False;
2210 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
2211 return False;
2213 if (!smb_io_lsa_string("name", &q_e->name, ps, depth))
2214 return False;
2216 return True;
2219 /*******************************************************************
2220 reads or writes a structure.
2221 ********************************************************************/
2223 BOOL samr_io_r_get_dispenum_index(const char *desc, SAMR_R_GET_DISPENUM_INDEX * r_u,
2224 prs_struct *ps, int depth)
2226 if (r_u == NULL)
2227 return False;
2229 prs_debug(ps, depth, desc, "samr_io_r_get_dispenum_index");
2230 depth++;
2232 if(!prs_align(ps))
2233 return False;
2235 if(!prs_uint32("idx", ps, depth, &r_u->idx))
2236 return False;
2238 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2239 return False;
2241 return True;
2245 /*******************************************************************
2246 inits a SAMR_Q_OPEN_GROUP structure.
2247 ********************************************************************/
2249 void init_samr_q_open_group(SAMR_Q_OPEN_GROUP * q_c,
2250 POLICY_HND *hnd,
2251 uint32 access_mask, uint32 rid)
2253 DEBUG(5, ("init_samr_q_open_group\n"));
2255 q_c->domain_pol = *hnd;
2256 q_c->access_mask = access_mask;
2257 q_c->rid_group = rid;
2260 /*******************************************************************
2261 reads or writes a structure.
2262 ********************************************************************/
2264 BOOL samr_io_q_open_group(const char *desc, SAMR_Q_OPEN_GROUP * q_u,
2265 prs_struct *ps, int depth)
2267 if (q_u == NULL)
2268 return False;
2270 prs_debug(ps, depth, desc, "samr_io_q_open_group");
2271 depth++;
2273 if(!prs_align(ps))
2274 return False;
2276 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
2277 return False;
2279 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
2280 return False;
2281 if(!prs_uint32("rid_group", ps, depth, &q_u->rid_group))
2282 return False;
2284 return True;
2287 /*******************************************************************
2288 reads or writes a structure.
2289 ********************************************************************/
2291 BOOL samr_io_r_open_group(const char *desc, SAMR_R_OPEN_GROUP * r_u,
2292 prs_struct *ps, int depth)
2294 if (r_u == NULL)
2295 return False;
2297 prs_debug(ps, depth, desc, "samr_io_r_open_group");
2298 depth++;
2300 if(!prs_align(ps))
2301 return False;
2303 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2304 return False;
2306 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2307 return False;
2309 return True;
2312 /*******************************************************************
2313 inits a GROUP_INFO1 structure.
2314 ********************************************************************/
2316 void init_samr_group_info1(GROUP_INFO1 * gr1,
2317 char *acct_name, char *acct_desc,
2318 uint32 num_members)
2320 DEBUG(5, ("init_samr_group_info1\n"));
2322 gr1->group_attr = (SE_GROUP_MANDATORY|SE_GROUP_ENABLED_BY_DEFAULT); /* why not | SE_GROUP_ENABLED ? */
2323 gr1->num_members = num_members;
2325 init_unistr2(&gr1->uni_acct_name, acct_name, UNI_FLAGS_NONE);
2326 init_uni_hdr(&gr1->hdr_acct_name, &gr1->uni_acct_name);
2327 init_unistr2(&gr1->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2328 init_uni_hdr(&gr1->hdr_acct_desc, &gr1->uni_acct_desc);
2331 /*******************************************************************
2332 reads or writes a structure.
2333 ********************************************************************/
2335 BOOL samr_io_group_info1(const char *desc, GROUP_INFO1 * gr1,
2336 prs_struct *ps, int depth)
2338 uint16 dummy = 1;
2340 if (gr1 == NULL)
2341 return False;
2343 prs_debug(ps, depth, desc, "samr_io_group_info1");
2344 depth++;
2346 if(!prs_uint16("level", ps, depth, &dummy))
2347 return False;
2349 if(!prs_align(ps))
2350 return False;
2352 if(!smb_io_unihdr("hdr_acct_name", &gr1->hdr_acct_name, ps, depth))
2353 return False;
2355 if(!prs_uint32("group_attr", ps, depth, &gr1->group_attr))
2356 return False;
2357 if(!prs_uint32("num_members", ps, depth, &gr1->num_members))
2358 return False;
2360 if(!smb_io_unihdr("hdr_acct_desc", &gr1->hdr_acct_desc, ps, depth))
2361 return False;
2363 if(!smb_io_unistr2("uni_acct_name", &gr1->uni_acct_name,
2364 gr1->hdr_acct_name.buffer, ps, depth))
2365 return False;
2367 if(!smb_io_unistr2("uni_acct_desc", &gr1->uni_acct_desc,
2368 gr1->hdr_acct_desc.buffer, ps, depth))
2369 return False;
2371 return True;
2374 /*******************************************************************
2375 inits a GROUP_INFO2 structure.
2376 ********************************************************************/
2378 void init_samr_group_info2(GROUP_INFO2 * gr2, const char *acct_name)
2380 DEBUG(5, ("init_samr_group_info2\n"));
2382 gr2->level = 2;
2383 init_unistr2(&gr2->uni_acct_name, acct_name, UNI_FLAGS_NONE);
2384 init_uni_hdr(&gr2->hdr_acct_name, &gr2->uni_acct_name);
2387 /*******************************************************************
2388 reads or writes a structure.
2389 ********************************************************************/
2391 BOOL samr_io_group_info2(const char *desc, GROUP_INFO2 *gr2, prs_struct *ps, int depth)
2393 if (gr2 == NULL)
2394 return False;
2396 prs_debug(ps, depth, desc, "samr_io_group_info2");
2397 depth++;
2399 if(!prs_uint16("hdr_level", ps, depth, &gr2->level))
2400 return False;
2402 if(!smb_io_unihdr("hdr_acct_name", &gr2->hdr_acct_name, ps, depth))
2403 return False;
2404 if(!smb_io_unistr2("uni_acct_name", &gr2->uni_acct_name,
2405 gr2->hdr_acct_name.buffer, ps, depth))
2406 return False;
2408 return True;
2411 /*******************************************************************
2412 inits a GROUP_INFO3 structure.
2413 ********************************************************************/
2415 void init_samr_group_info3(GROUP_INFO3 *gr3)
2417 DEBUG(5, ("init_samr_group_info3\n"));
2419 gr3->group_attr = (SE_GROUP_MANDATORY|SE_GROUP_ENABLED_BY_DEFAULT); /* why not | SE_GROUP_ENABLED ? */
2422 /*******************************************************************
2423 reads or writes a structure.
2424 ********************************************************************/
2426 BOOL samr_io_group_info3(const char *desc, GROUP_INFO3 *gr3, prs_struct *ps, int depth)
2428 if (gr3 == NULL)
2429 return False;
2431 prs_debug(ps, depth, desc, "samr_io_group_info3");
2432 depth++;
2434 if(!prs_align(ps))
2435 return False;
2437 if(!prs_uint32("group_attr", ps, depth, &gr3->group_attr))
2438 return False;
2440 return True;
2443 /*******************************************************************
2444 inits a GROUP_INFO4 structure.
2445 ********************************************************************/
2447 void init_samr_group_info4(GROUP_INFO4 * gr4, const char *acct_desc)
2449 DEBUG(5, ("init_samr_group_info4\n"));
2451 gr4->level = 4;
2452 init_unistr2(&gr4->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2453 init_uni_hdr(&gr4->hdr_acct_desc, &gr4->uni_acct_desc);
2456 /*******************************************************************
2457 reads or writes a structure.
2458 ********************************************************************/
2460 BOOL samr_io_group_info4(const char *desc, GROUP_INFO4 * gr4,
2461 prs_struct *ps, int depth)
2463 if (gr4 == NULL)
2464 return False;
2466 prs_debug(ps, depth, desc, "samr_io_group_info4");
2467 depth++;
2469 if(!prs_uint16("hdr_level", ps, depth, &gr4->level))
2470 return False;
2471 if(!smb_io_unihdr("hdr_acct_desc", &gr4->hdr_acct_desc, ps, depth))
2472 return False;
2473 if(!smb_io_unistr2("uni_acct_desc", &gr4->uni_acct_desc,
2474 gr4->hdr_acct_desc.buffer, ps, depth))
2475 return False;
2477 return True;
2480 /*******************************************************************
2481 inits a GROUP_INFO5 structure.
2482 ********************************************************************/
2484 void init_samr_group_info5(GROUP_INFO5 * gr5,
2485 char *acct_name, char *acct_desc,
2486 uint32 num_members)
2488 DEBUG(5, ("init_samr_group_info5\n"));
2490 gr5->group_attr = (SE_GROUP_MANDATORY|SE_GROUP_ENABLED_BY_DEFAULT); /* why not | SE_GROUP_ENABLED ? */
2491 gr5->num_members = num_members;
2493 init_unistr2(&gr5->uni_acct_name, acct_name, UNI_FLAGS_NONE);
2494 init_uni_hdr(&gr5->hdr_acct_name, &gr5->uni_acct_name);
2495 init_unistr2(&gr5->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2496 init_uni_hdr(&gr5->hdr_acct_desc, &gr5->uni_acct_desc);
2499 /*******************************************************************
2500 reads or writes a structure.
2501 ********************************************************************/
2503 BOOL samr_io_group_info5(const char *desc, GROUP_INFO5 * gr5,
2504 prs_struct *ps, int depth)
2506 uint16 dummy = 1;
2508 if (gr5 == NULL)
2509 return False;
2511 prs_debug(ps, depth, desc, "samr_io_group_info5");
2512 depth++;
2514 if(!prs_uint16("level", ps, depth, &dummy))
2515 return False;
2517 if(!prs_align(ps))
2518 return False;
2520 if(!smb_io_unihdr("hdr_acct_name", &gr5->hdr_acct_name, ps, depth))
2521 return False;
2523 if(!prs_uint32("group_attr", ps, depth, &gr5->group_attr))
2524 return False;
2525 if(!prs_uint32("num_members", ps, depth, &gr5->num_members))
2526 return False;
2528 if(!smb_io_unihdr("hdr_acct_desc", &gr5->hdr_acct_desc, ps, depth))
2529 return False;
2531 if(!smb_io_unistr2("uni_acct_name", &gr5->uni_acct_name,
2532 gr5->hdr_acct_name.buffer, ps, depth))
2533 return False;
2535 if(!smb_io_unistr2("uni_acct_desc", &gr5->uni_acct_desc,
2536 gr5->hdr_acct_desc.buffer, ps, depth))
2537 return False;
2539 return True;
2543 /*******************************************************************
2544 reads or writes a structure.
2545 ********************************************************************/
2547 static BOOL samr_group_info_ctr(const char *desc, GROUP_INFO_CTR **ctr,
2548 prs_struct *ps, int depth)
2550 if (UNMARSHALLING(ps))
2551 *ctr = PRS_ALLOC_MEM(ps,GROUP_INFO_CTR,1);
2553 if (*ctr == NULL)
2554 return False;
2556 prs_debug(ps, depth, desc, "samr_group_info_ctr");
2557 depth++;
2559 if(!prs_uint16("switch_value1", ps, depth, &(*ctr)->switch_value1))
2560 return False;
2562 switch ((*ctr)->switch_value1) {
2563 case 1:
2564 if(!samr_io_group_info1("group_info1", &(*ctr)->group.info1, ps, depth))
2565 return False;
2566 break;
2567 case 2:
2568 if(!samr_io_group_info2("group_info2", &(*ctr)->group.info2, ps, depth))
2569 return False;
2570 break;
2571 case 3:
2572 if(!samr_io_group_info3("group_info3", &(*ctr)->group.info3, ps, depth))
2573 return False;
2574 break;
2575 case 4:
2576 if(!samr_io_group_info4("group_info4", &(*ctr)->group.info4, ps, depth))
2577 return False;
2578 break;
2579 case 5:
2580 if(!samr_io_group_info5("group_info5", &(*ctr)->group.info5, ps, depth))
2581 return False;
2582 break;
2583 default:
2584 DEBUG(0,("samr_group_info_ctr: unsupported switch level\n"));
2585 break;
2588 return True;
2591 /*******************************************************************
2592 inits a SAMR_Q_CREATE_DOM_GROUP structure.
2593 ********************************************************************/
2595 void init_samr_q_create_dom_group(SAMR_Q_CREATE_DOM_GROUP * q_e,
2596 POLICY_HND *pol, const char *acct_desc,
2597 uint32 access_mask)
2599 DEBUG(5, ("init_samr_q_create_dom_group\n"));
2601 q_e->pol = *pol;
2603 init_unistr2(&q_e->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
2604 init_uni_hdr(&q_e->hdr_acct_desc, &q_e->uni_acct_desc);
2606 q_e->access_mask = access_mask;
2609 /*******************************************************************
2610 reads or writes a structure.
2611 ********************************************************************/
2613 BOOL samr_io_q_create_dom_group(const char *desc, SAMR_Q_CREATE_DOM_GROUP * q_e,
2614 prs_struct *ps, int depth)
2616 if (q_e == NULL)
2617 return False;
2619 prs_debug(ps, depth, desc, "samr_io_q_create_dom_group");
2620 depth++;
2622 if(!prs_align(ps))
2623 return False;
2625 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2626 return False;
2628 if(!smb_io_unihdr("hdr_acct_desc", &q_e->hdr_acct_desc, ps, depth))
2629 return False;
2630 if(!smb_io_unistr2("uni_acct_desc", &q_e->uni_acct_desc,
2631 q_e->hdr_acct_desc.buffer, ps, depth))
2632 return False;
2634 if(!prs_align(ps))
2635 return False;
2636 if(!prs_uint32("access", ps, depth, &q_e->access_mask))
2637 return False;
2639 return True;
2642 /*******************************************************************
2643 reads or writes a structure.
2644 ********************************************************************/
2646 BOOL samr_io_r_create_dom_group(const char *desc, SAMR_R_CREATE_DOM_GROUP * r_u,
2647 prs_struct *ps, int depth)
2649 if (r_u == NULL)
2650 return False;
2652 prs_debug(ps, depth, desc, "samr_io_r_create_dom_group");
2653 depth++;
2655 if(!prs_align(ps))
2656 return False;
2658 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2659 return False;
2661 if(!prs_uint32("rid ", ps, depth, &r_u->rid))
2662 return False;
2663 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2664 return False;
2666 return True;
2669 /*******************************************************************
2670 inits a SAMR_Q_DELETE_DOM_GROUP structure.
2671 ********************************************************************/
2673 void init_samr_q_delete_dom_group(SAMR_Q_DELETE_DOM_GROUP * q_c,
2674 POLICY_HND *hnd)
2676 DEBUG(5, ("init_samr_q_delete_dom_group\n"));
2678 q_c->group_pol = *hnd;
2681 /*******************************************************************
2682 reads or writes a structure.
2683 ********************************************************************/
2685 BOOL samr_io_q_delete_dom_group(const char *desc, SAMR_Q_DELETE_DOM_GROUP * q_u,
2686 prs_struct *ps, int depth)
2688 if (q_u == NULL)
2689 return False;
2691 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_group");
2692 depth++;
2694 if(!prs_align(ps))
2695 return False;
2697 if(!smb_io_pol_hnd("group_pol", &q_u->group_pol, ps, depth))
2698 return False;
2700 return True;
2703 /*******************************************************************
2704 reads or writes a structure.
2705 ********************************************************************/
2707 BOOL samr_io_r_delete_dom_group(const char *desc, SAMR_R_DELETE_DOM_GROUP * r_u,
2708 prs_struct *ps, int depth)
2710 if (r_u == NULL)
2711 return False;
2713 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_group");
2714 depth++;
2716 if(!prs_align(ps))
2717 return False;
2719 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
2720 return False;
2722 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2723 return False;
2725 return True;
2728 /*******************************************************************
2729 inits a SAMR_Q_DEL_GROUPMEM structure.
2730 ********************************************************************/
2732 void init_samr_q_del_groupmem(SAMR_Q_DEL_GROUPMEM * q_e,
2733 POLICY_HND *pol, uint32 rid)
2735 DEBUG(5, ("init_samr_q_del_groupmem\n"));
2737 q_e->pol = *pol;
2738 q_e->rid = rid;
2741 /*******************************************************************
2742 reads or writes a structure.
2743 ********************************************************************/
2745 BOOL samr_io_q_del_groupmem(const char *desc, SAMR_Q_DEL_GROUPMEM * q_e,
2746 prs_struct *ps, int depth)
2748 if (q_e == NULL)
2749 return False;
2751 prs_debug(ps, depth, desc, "samr_io_q_del_groupmem");
2752 depth++;
2754 if(!prs_align(ps))
2755 return False;
2757 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2758 return False;
2760 if(!prs_uint32("rid", ps, depth, &q_e->rid))
2761 return False;
2763 return True;
2766 /*******************************************************************
2767 inits a SAMR_R_DEL_GROUPMEM structure.
2768 ********************************************************************/
2770 void init_samr_r_del_groupmem(SAMR_R_DEL_GROUPMEM * r_u, POLICY_HND *pol,
2771 NTSTATUS status)
2773 DEBUG(5, ("init_samr_r_del_groupmem\n"));
2775 r_u->status = status;
2778 /*******************************************************************
2779 reads or writes a structure.
2780 ********************************************************************/
2782 BOOL samr_io_r_del_groupmem(const char *desc, SAMR_R_DEL_GROUPMEM * r_u,
2783 prs_struct *ps, int depth)
2785 if (r_u == NULL)
2786 return False;
2788 prs_debug(ps, depth, desc, "samr_io_r_del_groupmem");
2789 depth++;
2791 if(!prs_align(ps))
2792 return False;
2794 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2795 return False;
2797 return True;
2800 /*******************************************************************
2801 inits a SAMR_Q_ADD_GROUPMEM structure.
2802 ********************************************************************/
2804 void init_samr_q_add_groupmem(SAMR_Q_ADD_GROUPMEM * q_e,
2805 POLICY_HND *pol, uint32 rid)
2807 DEBUG(5, ("init_samr_q_add_groupmem\n"));
2809 q_e->pol = *pol;
2810 q_e->rid = rid;
2811 q_e->unknown = 0x0005;
2814 /*******************************************************************
2815 reads or writes a structure.
2816 ********************************************************************/
2818 BOOL samr_io_q_add_groupmem(const char *desc, SAMR_Q_ADD_GROUPMEM * q_e,
2819 prs_struct *ps, int depth)
2821 if (q_e == NULL)
2822 return False;
2824 prs_debug(ps, depth, desc, "samr_io_q_add_groupmem");
2825 depth++;
2827 if(!prs_align(ps))
2828 return False;
2830 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2831 return False;
2833 if(!prs_uint32("rid ", ps, depth, &q_e->rid))
2834 return False;
2835 if(!prs_uint32("unknown", ps, depth, &q_e->unknown))
2836 return False;
2838 return True;
2841 /*******************************************************************
2842 inits a SAMR_R_ADD_GROUPMEM structure.
2843 ********************************************************************/
2845 void init_samr_r_add_groupmem(SAMR_R_ADD_GROUPMEM * r_u, POLICY_HND *pol,
2846 NTSTATUS status)
2848 DEBUG(5, ("init_samr_r_add_groupmem\n"));
2850 r_u->status = status;
2853 /*******************************************************************
2854 reads or writes a structure.
2855 ********************************************************************/
2857 BOOL samr_io_r_add_groupmem(const char *desc, SAMR_R_ADD_GROUPMEM * r_u,
2858 prs_struct *ps, int depth)
2860 if (r_u == NULL)
2861 return False;
2863 prs_debug(ps, depth, desc, "samr_io_r_add_groupmem");
2864 depth++;
2866 if(!prs_align(ps))
2867 return False;
2869 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2870 return False;
2872 return True;
2875 /*******************************************************************
2876 inits a SAMR_Q_SET_GROUPINFO structure.
2877 ********************************************************************/
2879 void init_samr_q_set_groupinfo(SAMR_Q_SET_GROUPINFO * q_e,
2880 POLICY_HND *pol, GROUP_INFO_CTR * ctr)
2882 DEBUG(5, ("init_samr_q_set_groupinfo\n"));
2884 q_e->pol = *pol;
2885 q_e->ctr = ctr;
2888 /*******************************************************************
2889 reads or writes a structure.
2890 ********************************************************************/
2892 BOOL samr_io_q_set_groupinfo(const char *desc, SAMR_Q_SET_GROUPINFO * q_e,
2893 prs_struct *ps, int depth)
2895 if (q_e == NULL)
2896 return False;
2898 prs_debug(ps, depth, desc, "samr_io_q_set_groupinfo");
2899 depth++;
2901 if(!prs_align(ps))
2902 return False;
2904 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2905 return False;
2907 if(!samr_group_info_ctr("ctr", &q_e->ctr, ps, depth))
2908 return False;
2910 return True;
2913 /*******************************************************************
2914 inits a SAMR_R_SET_GROUPINFO structure.
2915 ********************************************************************/
2917 void init_samr_r_set_groupinfo(SAMR_R_SET_GROUPINFO * r_u, NTSTATUS status)
2919 DEBUG(5, ("init_samr_r_set_groupinfo\n"));
2921 r_u->status = status;
2924 /*******************************************************************
2925 reads or writes a structure.
2926 ********************************************************************/
2928 BOOL samr_io_r_set_groupinfo(const char *desc, SAMR_R_SET_GROUPINFO * r_u,
2929 prs_struct *ps, int depth)
2931 if (r_u == NULL)
2932 return False;
2934 prs_debug(ps, depth, desc, "samr_io_r_set_groupinfo");
2935 depth++;
2937 if(!prs_align(ps))
2938 return False;
2940 if(!prs_ntstatus("status", ps, depth, &r_u->status))
2941 return False;
2943 return True;
2946 /*******************************************************************
2947 inits a SAMR_Q_QUERY_GROUPINFO structure.
2948 ********************************************************************/
2950 void init_samr_q_query_groupinfo(SAMR_Q_QUERY_GROUPINFO * q_e,
2951 POLICY_HND *pol, uint16 switch_level)
2953 DEBUG(5, ("init_samr_q_query_groupinfo\n"));
2955 q_e->pol = *pol;
2957 q_e->switch_level = switch_level;
2960 /*******************************************************************
2961 reads or writes a structure.
2962 ********************************************************************/
2964 BOOL samr_io_q_query_groupinfo(const char *desc, SAMR_Q_QUERY_GROUPINFO * q_e,
2965 prs_struct *ps, int depth)
2967 if (q_e == NULL)
2968 return False;
2970 prs_debug(ps, depth, desc, "samr_io_q_query_groupinfo");
2971 depth++;
2973 if(!prs_align(ps))
2974 return False;
2976 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
2977 return False;
2979 if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
2980 return False;
2982 return True;
2985 /*******************************************************************
2986 inits a SAMR_R_QUERY_GROUPINFO structure.
2987 ********************************************************************/
2989 void init_samr_r_query_groupinfo(SAMR_R_QUERY_GROUPINFO * r_u,
2990 GROUP_INFO_CTR * ctr, NTSTATUS status)
2992 DEBUG(5, ("init_samr_r_query_groupinfo\n"));
2994 r_u->ptr = (NT_STATUS_IS_OK(status) && ctr != NULL) ? 1 : 0;
2995 r_u->ctr = ctr;
2996 r_u->status = status;
2999 /*******************************************************************
3000 reads or writes a structure.
3001 ********************************************************************/
3003 BOOL samr_io_r_query_groupinfo(const char *desc, SAMR_R_QUERY_GROUPINFO * r_u,
3004 prs_struct *ps, int depth)
3006 if (r_u == NULL)
3007 return False;
3009 prs_debug(ps, depth, desc, "samr_io_r_query_groupinfo");
3010 depth++;
3012 if(!prs_align(ps))
3013 return False;
3015 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
3016 return False;
3018 if (r_u->ptr != 0) {
3019 if(!samr_group_info_ctr("ctr", &r_u->ctr, ps, depth))
3020 return False;
3023 if(!prs_align(ps))
3024 return False;
3025 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3026 return False;
3028 return True;
3031 /*******************************************************************
3032 inits a SAMR_Q_QUERY_GROUPMEM structure.
3033 ********************************************************************/
3035 void init_samr_q_query_groupmem(SAMR_Q_QUERY_GROUPMEM * q_c, POLICY_HND *hnd)
3037 DEBUG(5, ("init_samr_q_query_groupmem\n"));
3039 q_c->group_pol = *hnd;
3042 /*******************************************************************
3043 reads or writes a structure.
3044 ********************************************************************/
3046 BOOL samr_io_q_query_groupmem(const char *desc, SAMR_Q_QUERY_GROUPMEM * q_u,
3047 prs_struct *ps, int depth)
3049 if (q_u == NULL)
3050 return False;
3052 prs_debug(ps, depth, desc, "samr_io_q_query_groupmem");
3053 depth++;
3055 if(!prs_align(ps))
3056 return False;
3058 if(!smb_io_pol_hnd("group_pol", &q_u->group_pol, ps, depth))
3059 return False;
3061 return True;
3064 /*******************************************************************
3065 inits a SAMR_R_QUERY_GROUPMEM structure.
3066 ********************************************************************/
3068 void init_samr_r_query_groupmem(SAMR_R_QUERY_GROUPMEM * r_u,
3069 uint32 num_entries, uint32 *rid,
3070 uint32 *attr, NTSTATUS status)
3072 DEBUG(5, ("init_samr_r_query_groupmem\n"));
3074 if (NT_STATUS_IS_OK(status)) {
3075 r_u->ptr = 1;
3076 r_u->num_entries = num_entries;
3078 r_u->ptr_attrs = attr != NULL ? 1 : 0;
3079 r_u->ptr_rids = rid != NULL ? 1 : 0;
3081 r_u->num_rids = num_entries;
3082 r_u->rid = rid;
3084 r_u->num_attrs = num_entries;
3085 r_u->attr = attr;
3086 } else {
3087 r_u->ptr = 0;
3088 r_u->num_entries = 0;
3091 r_u->status = status;
3094 /*******************************************************************
3095 reads or writes a structure.
3096 ********************************************************************/
3098 BOOL samr_io_r_query_groupmem(const char *desc, SAMR_R_QUERY_GROUPMEM * r_u,
3099 prs_struct *ps, int depth)
3101 uint32 i;
3103 if (r_u == NULL)
3104 return False;
3106 if (UNMARSHALLING(ps))
3107 ZERO_STRUCTP(r_u);
3109 prs_debug(ps, depth, desc, "samr_io_r_query_groupmem");
3110 depth++;
3112 if(!prs_align(ps))
3113 return False;
3115 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
3116 return False;
3117 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
3118 return False;
3120 if (r_u->ptr != 0) {
3121 if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids))
3122 return False;
3123 if(!prs_uint32("ptr_attrs", ps, depth, &r_u->ptr_attrs))
3124 return False;
3126 if (r_u->ptr_rids != 0) {
3127 if(!prs_uint32("num_rids", ps, depth, &r_u->num_rids))
3128 return False;
3129 if (UNMARSHALLING(ps) && r_u->num_rids != 0) {
3130 r_u->rid = PRS_ALLOC_MEM(ps,uint32,r_u->num_rids);
3131 if (r_u->rid == NULL)
3132 return False;
3135 for (i = 0; i < r_u->num_rids; i++) {
3136 if(!prs_uint32("", ps, depth, &r_u->rid[i]))
3137 return False;
3141 if (r_u->ptr_attrs != 0) {
3142 if(!prs_uint32("num_attrs", ps, depth, &r_u->num_attrs))
3143 return False;
3145 if (UNMARSHALLING(ps) && r_u->num_attrs != 0) {
3146 r_u->attr = PRS_ALLOC_MEM(ps,uint32,r_u->num_attrs);
3147 if (r_u->attr == NULL)
3148 return False;
3151 for (i = 0; i < r_u->num_attrs; i++) {
3152 if(!prs_uint32("", ps, depth, &r_u->attr[i]))
3153 return False;
3158 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3159 return False;
3161 return True;
3164 /*******************************************************************
3165 inits a SAMR_Q_QUERY_USERGROUPS structure.
3166 ********************************************************************/
3168 void init_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS * q_u,
3169 POLICY_HND *hnd)
3171 DEBUG(5, ("init_samr_q_query_usergroups\n"));
3173 q_u->pol = *hnd;
3176 /*******************************************************************
3177 reads or writes a structure.
3178 ********************************************************************/
3180 BOOL samr_io_q_query_usergroups(const char *desc, SAMR_Q_QUERY_USERGROUPS * q_u,
3181 prs_struct *ps, int depth)
3183 if (q_u == NULL)
3184 return False;
3186 prs_debug(ps, depth, desc, "samr_io_q_query_usergroups");
3187 depth++;
3189 if(!prs_align(ps))
3190 return False;
3192 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
3193 return False;
3195 return True;
3198 /*******************************************************************
3199 inits a SAMR_R_QUERY_USERGROUPS structure.
3200 ********************************************************************/
3202 void init_samr_r_query_usergroups(SAMR_R_QUERY_USERGROUPS * r_u,
3203 uint32 num_gids, DOM_GID * gid,
3204 NTSTATUS status)
3206 DEBUG(5, ("init_samr_r_query_usergroups\n"));
3208 if (NT_STATUS_IS_OK(status)) {
3209 r_u->ptr_0 = 1;
3210 r_u->num_entries = num_gids;
3211 r_u->ptr_1 = (num_gids != 0) ? 1 : 0;
3212 r_u->num_entries2 = num_gids;
3214 r_u->gid = gid;
3215 } else {
3216 r_u->ptr_0 = 0;
3217 r_u->num_entries = 0;
3218 r_u->ptr_1 = 0;
3219 r_u->gid = NULL;
3222 r_u->status = status;
3225 /*******************************************************************
3226 reads or writes a structure.
3227 ********************************************************************/
3229 BOOL samr_io_gids(const char *desc, uint32 *num_gids, DOM_GID ** gid,
3230 prs_struct *ps, int depth)
3232 uint32 i;
3233 if (gid == NULL)
3234 return False;
3236 prs_debug(ps, depth, desc, "samr_io_gids");
3237 depth++;
3239 if(!prs_align(ps))
3240 return False;
3242 if(!prs_uint32("num_gids", ps, depth, num_gids))
3243 return False;
3245 if ((*num_gids) != 0) {
3246 if (UNMARSHALLING(ps)) {
3247 (*gid) = PRS_ALLOC_MEM(ps,DOM_GID,*num_gids);
3250 if ((*gid) == NULL) {
3251 return False;
3254 for (i = 0; i < (*num_gids); i++) {
3255 if(!smb_io_gid("gids", &(*gid)[i], ps, depth))
3256 return False;
3260 return True;
3263 /*******************************************************************
3264 reads or writes a structure.
3265 ********************************************************************/
3267 BOOL samr_io_r_query_usergroups(const char *desc, SAMR_R_QUERY_USERGROUPS * r_u,
3268 prs_struct *ps, int depth)
3270 if (r_u == NULL)
3271 return False;
3273 prs_debug(ps, depth, desc, "samr_io_r_query_usergroups");
3274 depth++;
3276 if(!prs_align(ps))
3277 return False;
3279 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
3280 return False;
3282 if (r_u->ptr_0 != 0) {
3283 if(!prs_uint32("num_entries ", ps, depth, &r_u->num_entries))
3284 return False;
3285 if(!prs_uint32("ptr_1 ", ps, depth, &r_u->ptr_1))
3286 return False;
3288 if (r_u->num_entries != 0 && r_u->ptr_1 != 0) {
3289 if(!samr_io_gids("gids", &r_u->num_entries2, &r_u->gid, ps, depth))
3290 return False;
3294 if(!prs_align(ps))
3295 return False;
3296 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3297 return False;
3299 return True;
3302 /*******************************************************************
3303 inits a SAMR_Q_ENUM_DOMAINS structure.
3304 ********************************************************************/
3306 void init_samr_q_enum_domains(SAMR_Q_ENUM_DOMAINS * q_e,
3307 POLICY_HND *pol,
3308 uint32 start_idx, uint32 size)
3310 DEBUG(5, ("init_samr_q_enum_domains\n"));
3312 q_e->pol = *pol;
3314 q_e->start_idx = start_idx;
3315 q_e->max_size = size;
3318 /*******************************************************************
3319 reads or writes a structure.
3320 ********************************************************************/
3322 BOOL samr_io_q_enum_domains(const char *desc, SAMR_Q_ENUM_DOMAINS * q_e,
3323 prs_struct *ps, int depth)
3325 if (q_e == NULL)
3326 return False;
3328 prs_debug(ps, depth, desc, "samr_io_q_enum_domains");
3329 depth++;
3331 if(!prs_align(ps))
3332 return False;
3334 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
3335 return False;
3337 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3338 return False;
3339 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3340 return False;
3342 return True;
3345 /*******************************************************************
3346 inits a SAMR_R_ENUM_DOMAINS structure.
3347 ********************************************************************/
3349 void init_samr_r_enum_domains(SAMR_R_ENUM_DOMAINS * r_u,
3350 uint32 next_idx, uint32 num_sam_entries)
3352 DEBUG(5, ("init_samr_r_enum_domains\n"));
3354 r_u->next_idx = next_idx;
3356 if (num_sam_entries != 0) {
3357 r_u->ptr_entries1 = 1;
3358 r_u->ptr_entries2 = 1;
3359 r_u->num_entries2 = num_sam_entries;
3360 r_u->num_entries3 = num_sam_entries;
3362 r_u->num_entries4 = num_sam_entries;
3363 } else {
3364 r_u->ptr_entries1 = 0;
3365 r_u->num_entries2 = num_sam_entries;
3366 r_u->ptr_entries2 = 1;
3370 /*******************************************************************
3371 reads or writes a structure.
3372 ********************************************************************/
3374 BOOL samr_io_r_enum_domains(const char *desc, SAMR_R_ENUM_DOMAINS * r_u,
3375 prs_struct *ps, int depth)
3377 uint32 i;
3379 if (r_u == NULL)
3380 return False;
3382 prs_debug(ps, depth, desc, "samr_io_r_enum_domains");
3383 depth++;
3385 if(!prs_align(ps))
3386 return False;
3388 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3389 return False;
3390 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3391 return False;
3393 if (r_u->ptr_entries1 != 0) {
3394 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3395 return False;
3396 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3397 return False;
3398 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3399 return False;
3401 if (UNMARSHALLING(ps) && r_u->num_entries2) {
3402 r_u->sam = PRS_ALLOC_MEM(ps,SAM_ENTRY,r_u->num_entries2);
3403 r_u->uni_dom_name = PRS_ALLOC_MEM(ps,UNISTR2,r_u->num_entries2);
3406 if ((r_u->sam == NULL || r_u->uni_dom_name == NULL) && r_u->num_entries2 != 0) {
3407 DEBUG(0, ("NULL pointers in SAMR_R_ENUM_DOMAINS\n"));
3408 r_u->num_entries4 = 0;
3409 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3410 return False;
3413 for (i = 0; i < r_u->num_entries2; i++) {
3414 fstring tmp;
3415 slprintf(tmp, sizeof(tmp) - 1, "dom[%d]", i);
3416 if(!sam_io_sam_entry(tmp, &r_u->sam[i], ps, depth))
3417 return False;
3420 for (i = 0; i < r_u->num_entries2; i++) {
3421 fstring tmp;
3422 slprintf(tmp, sizeof(tmp) - 1, "dom[%d]", i);
3423 if(!smb_io_unistr2(tmp, &r_u->uni_dom_name[i],
3424 r_u->sam[i].hdr_name.buffer, ps,
3425 depth))
3426 return False;
3431 if(!prs_align(ps))
3432 return False;
3433 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3434 return False;
3435 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3436 return False;
3438 return True;
3441 /*******************************************************************
3442 inits a SAMR_Q_ENUM_DOM_GROUPS structure.
3443 ********************************************************************/
3445 void init_samr_q_enum_dom_groups(SAMR_Q_ENUM_DOM_GROUPS * q_e,
3446 POLICY_HND *pol,
3447 uint32 start_idx, uint32 size)
3449 DEBUG(5, ("init_samr_q_enum_dom_groups\n"));
3451 q_e->pol = *pol;
3453 q_e->start_idx = start_idx;
3454 q_e->max_size = size;
3457 /*******************************************************************
3458 reads or writes a structure.
3459 ********************************************************************/
3461 BOOL samr_io_q_enum_dom_groups(const char *desc, SAMR_Q_ENUM_DOM_GROUPS * q_e,
3462 prs_struct *ps, int depth)
3464 if (q_e == NULL)
3465 return False;
3467 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_groups");
3468 depth++;
3470 if(!prs_align(ps))
3471 return False;
3473 if(!smb_io_pol_hnd("pol", &(q_e->pol), ps, depth))
3474 return False;
3476 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3477 return False;
3478 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3479 return False;
3481 return True;
3484 /*******************************************************************
3485 inits a SAMR_R_ENUM_DOM_GROUPS structure.
3486 ********************************************************************/
3488 void init_samr_r_enum_dom_groups(SAMR_R_ENUM_DOM_GROUPS * r_u,
3489 uint32 next_idx, uint32 num_sam_entries)
3491 DEBUG(5, ("init_samr_r_enum_dom_groups\n"));
3493 r_u->next_idx = next_idx;
3495 if (num_sam_entries != 0) {
3496 r_u->ptr_entries1 = 1;
3497 r_u->ptr_entries2 = 1;
3498 r_u->num_entries2 = num_sam_entries;
3499 r_u->num_entries3 = num_sam_entries;
3501 r_u->num_entries4 = num_sam_entries;
3502 } else {
3503 r_u->ptr_entries1 = 0;
3504 r_u->num_entries2 = num_sam_entries;
3505 r_u->ptr_entries2 = 1;
3509 /*******************************************************************
3510 reads or writes a structure.
3511 ********************************************************************/
3513 BOOL samr_io_r_enum_dom_groups(const char *desc, SAMR_R_ENUM_DOM_GROUPS * r_u,
3514 prs_struct *ps, int depth)
3516 uint32 i;
3518 if (r_u == NULL)
3519 return False;
3521 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_groups");
3522 depth++;
3524 if(!prs_align(ps))
3525 return False;
3527 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3528 return False;
3529 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3530 return False;
3532 if (r_u->ptr_entries1 != 0) {
3533 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3534 return False;
3535 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3536 return False;
3537 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3538 return False;
3540 if (UNMARSHALLING(ps) && r_u->num_entries2) {
3541 r_u->sam = PRS_ALLOC_MEM(ps,SAM_ENTRY,r_u->num_entries2);
3542 r_u->uni_grp_name = PRS_ALLOC_MEM(ps,UNISTR2,r_u->num_entries2);
3545 if ((r_u->sam == NULL || r_u->uni_grp_name == NULL) && r_u->num_entries2 != 0) {
3546 DEBUG(0,
3547 ("NULL pointers in SAMR_R_ENUM_DOM_GROUPS\n"));
3548 r_u->num_entries4 = 0;
3549 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3550 return False;
3553 for (i = 0; i < r_u->num_entries2; i++) {
3554 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
3555 return False;
3558 for (i = 0; i < r_u->num_entries2; i++) {
3559 if(!smb_io_unistr2("", &r_u->uni_grp_name[i],
3560 r_u->sam[i].hdr_name.buffer, ps, depth))
3561 return False;
3565 if(!prs_align(ps))
3566 return False;
3567 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3568 return False;
3569 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3570 return False;
3572 return True;
3575 /*******************************************************************
3576 inits a SAMR_Q_ENUM_DOM_ALIASES structure.
3577 ********************************************************************/
3579 void init_samr_q_enum_dom_aliases(SAMR_Q_ENUM_DOM_ALIASES * q_e,
3580 POLICY_HND *pol, uint32 start_idx,
3581 uint32 size)
3583 DEBUG(5, ("init_samr_q_enum_dom_aliases\n"));
3585 q_e->pol = *pol;
3587 q_e->start_idx = start_idx;
3588 q_e->max_size = size;
3592 /*******************************************************************
3593 reads or writes a structure.
3594 ********************************************************************/
3596 BOOL samr_io_q_enum_dom_aliases(const char *desc, SAMR_Q_ENUM_DOM_ALIASES * q_e,
3597 prs_struct *ps, int depth)
3599 if (q_e == NULL)
3600 return False;
3602 prs_debug(ps, depth, desc, "samr_io_q_enum_dom_aliases");
3603 depth++;
3605 if(!prs_align(ps))
3606 return False;
3608 if(!smb_io_pol_hnd("pol", &q_e->pol, ps, depth))
3609 return False;
3611 if(!prs_uint32("start_idx", ps, depth, &q_e->start_idx))
3612 return False;
3613 if(!prs_uint32("max_size ", ps, depth, &q_e->max_size))
3614 return False;
3616 return True;
3619 /*******************************************************************
3620 inits a SAMR_R_ENUM_DOM_ALIASES structure.
3621 ********************************************************************/
3623 void init_samr_r_enum_dom_aliases(SAMR_R_ENUM_DOM_ALIASES *r_u, uint32 next_idx, uint32 num_sam_entries)
3625 DEBUG(5, ("init_samr_r_enum_dom_aliases\n"));
3627 r_u->next_idx = next_idx;
3629 if (num_sam_entries != 0) {
3630 r_u->ptr_entries1 = 1;
3631 r_u->ptr_entries2 = 1;
3632 r_u->num_entries2 = num_sam_entries;
3633 r_u->num_entries3 = num_sam_entries;
3635 r_u->num_entries4 = num_sam_entries;
3636 } else {
3637 r_u->ptr_entries1 = 0;
3638 r_u->num_entries2 = num_sam_entries;
3639 r_u->ptr_entries2 = 1;
3643 /*******************************************************************
3644 reads or writes a structure.
3645 ********************************************************************/
3647 BOOL samr_io_r_enum_dom_aliases(const char *desc, SAMR_R_ENUM_DOM_ALIASES * r_u,
3648 prs_struct *ps, int depth)
3650 uint32 i;
3652 if (r_u == NULL)
3653 return False;
3655 prs_debug(ps, depth, desc, "samr_io_r_enum_dom_aliases");
3656 depth++;
3658 if(!prs_align(ps))
3659 return False;
3661 if(!prs_uint32("next_idx ", ps, depth, &r_u->next_idx))
3662 return False;
3663 if(!prs_uint32("ptr_entries1", ps, depth, &r_u->ptr_entries1))
3664 return False;
3666 if (r_u->ptr_entries1 != 0) {
3667 if(!prs_uint32("num_entries2", ps, depth, &r_u->num_entries2))
3668 return False;
3669 if(!prs_uint32("ptr_entries2", ps, depth, &r_u->ptr_entries2))
3670 return False;
3671 if(!prs_uint32("num_entries3", ps, depth, &r_u->num_entries3))
3672 return False;
3674 if (UNMARSHALLING(ps) && (r_u->num_entries2 > 0)) {
3675 r_u->sam = PRS_ALLOC_MEM(ps,SAM_ENTRY,r_u->num_entries2);
3676 r_u->uni_grp_name = PRS_ALLOC_MEM(ps,UNISTR2,r_u->num_entries2);
3679 if (r_u->num_entries2 != 0 &&
3680 (r_u->sam == NULL || r_u->uni_grp_name == NULL)) {
3681 DEBUG(0,("NULL pointers in SAMR_R_ENUM_DOM_ALIASES\n"));
3682 r_u->num_entries4 = 0;
3683 r_u->status = NT_STATUS_MEMORY_NOT_ALLOCATED;
3684 return False;
3687 for (i = 0; i < r_u->num_entries2; i++) {
3688 if(!sam_io_sam_entry("", &r_u->sam[i], ps, depth))
3689 return False;
3692 for (i = 0; i < r_u->num_entries2; i++) {
3693 if(!smb_io_unistr2("", &r_u->uni_grp_name[i],
3694 r_u->sam[i].hdr_name.buffer, ps,
3695 depth))
3696 return False;
3700 if(!prs_align(ps))
3701 return False;
3702 if(!prs_uint32("num_entries4", ps, depth, &r_u->num_entries4))
3703 return False;
3704 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3705 return False;
3707 return True;
3710 /*******************************************************************
3711 inits a ALIAS_INFO1 structure.
3712 ********************************************************************/
3714 void init_samr_alias_info1(ALIAS_INFO1 * al1, char *acct_name, uint32 num_member, char *acct_desc)
3716 DEBUG(5, ("init_samr_alias_info1\n"));
3718 init_unistr4(&al1->name, acct_name, UNI_FLAGS_NONE);
3719 al1->num_member = num_member;
3720 init_unistr4(&al1->description, acct_desc, UNI_FLAGS_NONE);
3723 /*******************************************************************
3724 reads or writes a structure.
3725 ********************************************************************/
3727 BOOL samr_io_alias_info1(const char *desc, ALIAS_INFO1 * al1,
3728 prs_struct *ps, int depth)
3730 if (al1 == NULL)
3731 return False;
3733 prs_debug(ps, depth, desc, "samr_io_alias_info1");
3734 depth++;
3736 if(!prs_align(ps))
3737 return False;
3739 if ( !prs_unistr4_hdr("name", ps, depth, &al1->name) )
3740 return False;
3741 if ( !prs_uint32("num_member", ps, depth, &al1->num_member) )
3742 return False;
3743 if ( !prs_unistr4_hdr("description", ps, depth, &al1->description) )
3744 return False;
3746 if ( !prs_unistr4_str("name", ps, depth, &al1->name) )
3747 return False;
3748 if ( !prs_align(ps) )
3749 return False;
3750 if ( !prs_unistr4_str("description", ps, depth, &al1->description) )
3751 return False;
3752 if ( !prs_align(ps) )
3753 return False;
3755 return True;
3758 /*******************************************************************
3759 inits a ALIAS_INFO3 structure.
3760 ********************************************************************/
3762 void init_samr_alias_info3(ALIAS_INFO3 * al3, const char *acct_desc)
3764 DEBUG(5, ("init_samr_alias_info3\n"));
3766 init_unistr4(&al3->description, acct_desc, UNI_FLAGS_NONE);
3769 /*******************************************************************
3770 reads or writes a structure.
3771 ********************************************************************/
3773 BOOL samr_io_alias_info3(const char *desc, ALIAS_INFO3 *al3,
3774 prs_struct *ps, int depth)
3776 if (al3 == NULL)
3777 return False;
3779 prs_debug(ps, depth, desc, "samr_io_alias_info3");
3780 depth++;
3782 if(!prs_align(ps))
3783 return False;
3785 if (!prs_unistr4("description", ps, depth, &al3->description))
3786 return False;
3788 return True;
3791 /*******************************************************************
3792 reads or writes a structure.
3793 ********************************************************************/
3795 BOOL samr_io_alias_info2(const char *desc, ALIAS_INFO2 *al2,
3796 prs_struct *ps, int depth)
3798 if (al2 == NULL)
3799 return False;
3801 prs_debug(ps, depth, desc, "samr_io_alias_info2");
3802 depth++;
3804 if(!prs_align(ps))
3805 return False;
3807 if (!prs_unistr4("name", ps, depth, &al2->name))
3808 return False;
3810 return True;
3813 /*******************************************************************
3814 reads or writes a structure.
3815 ********************************************************************/
3817 BOOL samr_alias_info_ctr(const char *desc, prs_struct *ps, int depth, ALIAS_INFO_CTR * ctr)
3819 if ( !ctr )
3820 return False;
3822 prs_debug(ps, depth, desc, "samr_alias_info_ctr");
3823 depth++;
3825 if ( !prs_uint16("level", ps, depth, &ctr->level) )
3826 return False;
3828 if(!prs_align(ps))
3829 return False;
3830 switch (ctr->level) {
3831 case 1:
3832 if(!samr_io_alias_info1("alias_info1", &ctr->alias.info1, ps, depth))
3833 return False;
3834 break;
3835 case 2:
3836 if(!samr_io_alias_info2("alias_info2", &ctr->alias.info2, ps, depth))
3837 return False;
3838 break;
3839 case 3:
3840 if(!samr_io_alias_info3("alias_info3", &ctr->alias.info3, ps, depth))
3841 return False;
3842 break;
3843 default:
3844 DEBUG(0,("samr_alias_info_ctr: unsupported switch level\n"));
3845 break;
3848 return True;
3851 /*******************************************************************
3852 inits a SAMR_Q_QUERY_ALIASINFO structure.
3853 ********************************************************************/
3855 void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO * q_e,
3856 POLICY_HND *pol, uint32 switch_level)
3858 DEBUG(5, ("init_samr_q_query_aliasinfo\n"));
3860 q_e->pol = *pol;
3861 q_e->level = switch_level;
3864 /*******************************************************************
3865 reads or writes a structure.
3866 ********************************************************************/
3868 BOOL samr_io_q_query_aliasinfo(const char *desc, SAMR_Q_QUERY_ALIASINFO *in,
3869 prs_struct *ps, int depth)
3871 if ( !in )
3872 return False;
3874 prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo");
3875 depth++;
3877 if(!prs_align(ps))
3878 return False;
3880 if ( !smb_io_pol_hnd("pol", &(in->pol), ps, depth) )
3881 return False;
3883 if ( !prs_uint16("level", ps, depth, &in->level) )
3884 return False;
3886 return True;
3889 /*******************************************************************
3890 inits a SAMR_R_QUERY_ALIASINFO structure.
3891 ********************************************************************/
3893 void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *out,
3894 ALIAS_INFO_CTR * ctr, NTSTATUS status)
3896 DEBUG(5, ("init_samr_r_query_aliasinfo\n"));
3898 out->ctr = ctr;
3899 out->status = status;
3902 /*******************************************************************
3903 reads or writes a structure.
3904 ********************************************************************/
3906 BOOL samr_io_r_query_aliasinfo(const char *desc, SAMR_R_QUERY_ALIASINFO *out,
3907 prs_struct *ps, int depth)
3909 if ( !out )
3910 return False;
3912 prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo");
3913 depth++;
3915 if(!prs_align(ps))
3916 return False;
3918 if ( !prs_pointer("alias", ps, depth, (void*)&out->ctr, sizeof(ALIAS_INFO_CTR), (PRS_POINTER_CAST)samr_alias_info_ctr))
3919 return False;
3920 if(!prs_align(ps))
3921 return False;
3923 if(!prs_ntstatus("status", ps, depth, &out->status))
3924 return False;
3926 return True;
3929 /*******************************************************************
3930 inits a SAMR_Q_SET_ALIASINFO structure.
3931 ********************************************************************/
3933 void init_samr_q_set_aliasinfo(SAMR_Q_SET_ALIASINFO * q_u,
3934 POLICY_HND *hnd, ALIAS_INFO_CTR * ctr)
3936 DEBUG(5, ("init_samr_q_set_aliasinfo\n"));
3938 q_u->alias_pol = *hnd;
3939 q_u->ctr = *ctr;
3942 /*******************************************************************
3943 reads or writes a structure.
3944 ********************************************************************/
3946 BOOL samr_io_q_set_aliasinfo(const char *desc, SAMR_Q_SET_ALIASINFO * q_u,
3947 prs_struct *ps, int depth)
3949 if (q_u == NULL)
3950 return False;
3952 prs_debug(ps, depth, desc, "samr_io_q_set_aliasinfo");
3953 depth++;
3955 if(!prs_align(ps))
3956 return False;
3958 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
3959 return False;
3960 if(!samr_alias_info_ctr("ctr", ps, depth, &q_u->ctr))
3961 return False;
3963 return True;
3966 /*******************************************************************
3967 reads or writes a structure.
3968 ********************************************************************/
3970 BOOL samr_io_r_set_aliasinfo(const char *desc, SAMR_R_SET_ALIASINFO * r_u,
3971 prs_struct *ps, int depth)
3973 if (r_u == NULL)
3974 return False;
3976 prs_debug(ps, depth, desc, "samr_io_r_set_aliasinfo");
3977 depth++;
3979 if(!prs_align(ps))
3980 return False;
3981 if(!prs_ntstatus("status", ps, depth, &r_u->status))
3982 return False;
3984 return True;
3987 /*******************************************************************
3988 inits a SAMR_Q_QUERY_USERALIASES structure.
3989 ********************************************************************/
3991 void init_samr_q_query_useraliases(SAMR_Q_QUERY_USERALIASES * q_u,
3992 POLICY_HND *hnd,
3993 uint32 num_sids,
3994 uint32 *ptr_sid, DOM_SID2 * sid)
3996 DEBUG(5, ("init_samr_q_query_useraliases\n"));
3998 q_u->pol = *hnd;
4000 q_u->num_sids1 = num_sids;
4001 q_u->ptr = 1;
4002 q_u->num_sids2 = num_sids;
4004 q_u->ptr_sid = ptr_sid;
4005 q_u->sid = sid;
4008 /*******************************************************************
4009 reads or writes a SAMR_Q_QUERY_USERALIASES structure.
4010 ********************************************************************/
4012 BOOL samr_io_q_query_useraliases(const char *desc, SAMR_Q_QUERY_USERALIASES * q_u,
4013 prs_struct *ps, int depth)
4015 fstring tmp;
4016 uint32 i;
4018 if (q_u == NULL)
4019 return False;
4021 prs_debug(ps, depth, desc, "samr_io_q_query_useraliases");
4022 depth++;
4024 if(!prs_align(ps))
4025 return False;
4027 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4028 return False;
4030 if(!prs_uint32("num_sids1", ps, depth, &q_u->num_sids1))
4031 return False;
4032 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
4033 return False;
4035 if (q_u->ptr==0)
4036 return True;
4038 if(!prs_uint32("num_sids2", ps, depth, &q_u->num_sids2))
4039 return False;
4041 if (UNMARSHALLING(ps) && (q_u->num_sids2 != 0)) {
4042 q_u->ptr_sid = PRS_ALLOC_MEM(ps,uint32,q_u->num_sids2);
4043 if (q_u->ptr_sid == NULL)
4044 return False;
4046 q_u->sid = PRS_ALLOC_MEM(ps, DOM_SID2, q_u->num_sids2);
4047 if (q_u->sid == NULL)
4048 return False;
4051 for (i = 0; i < q_u->num_sids2; i++) {
4052 slprintf(tmp, sizeof(tmp) - 1, "ptr[%02d]", i);
4053 if(!prs_uint32(tmp, ps, depth, &q_u->ptr_sid[i]))
4054 return False;
4057 for (i = 0; i < q_u->num_sids2; i++) {
4058 if (q_u->ptr_sid[i] != 0) {
4059 slprintf(tmp, sizeof(tmp) - 1, "sid[%02d]", i);
4060 if(!smb_io_dom_sid2(tmp, &q_u->sid[i], ps, depth))
4061 return False;
4065 return True;
4068 /*******************************************************************
4069 inits a SAMR_R_QUERY_USERALIASES structure.
4070 ********************************************************************/
4072 void init_samr_r_query_useraliases(SAMR_R_QUERY_USERALIASES * r_u,
4073 uint32 num_rids, uint32 *rid,
4074 NTSTATUS status)
4076 DEBUG(5, ("init_samr_r_query_useraliases\n"));
4078 if (NT_STATUS_IS_OK(status)) {
4079 r_u->num_entries = num_rids;
4080 r_u->ptr = 1;
4081 r_u->num_entries2 = num_rids;
4083 r_u->rid = rid;
4084 } else {
4085 r_u->num_entries = 0;
4086 r_u->ptr = 0;
4087 r_u->num_entries2 = 0;
4090 r_u->status = status;
4093 /*******************************************************************
4094 reads or writes a structure.
4095 ********************************************************************/
4097 BOOL samr_io_rids(const char *desc, uint32 *num_rids, uint32 **rid,
4098 prs_struct *ps, int depth)
4100 fstring tmp;
4101 uint32 i;
4102 if (rid == NULL)
4103 return False;
4105 prs_debug(ps, depth, desc, "samr_io_rids");
4106 depth++;
4108 if(!prs_align(ps))
4109 return False;
4111 if(!prs_uint32("num_rids", ps, depth, num_rids))
4112 return False;
4114 if ((*num_rids) != 0) {
4115 if (UNMARSHALLING(ps)) {
4116 /* reading */
4117 (*rid) = PRS_ALLOC_MEM(ps,uint32, *num_rids);
4119 if ((*rid) == NULL)
4120 return False;
4122 for (i = 0; i < (*num_rids); i++) {
4123 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d]", i);
4124 if(!prs_uint32(tmp, ps, depth, &((*rid)[i])))
4125 return False;
4129 return True;
4132 /*******************************************************************
4133 reads or writes a structure.
4134 ********************************************************************/
4136 BOOL samr_io_r_query_useraliases(const char *desc, SAMR_R_QUERY_USERALIASES * r_u,
4137 prs_struct *ps, int depth)
4139 if (r_u == NULL)
4140 return False;
4142 prs_debug(ps, depth, desc, "samr_io_r_query_useraliases");
4143 depth++;
4145 if(!prs_align(ps))
4146 return False;
4148 if(!prs_uint32("num_entries", ps, depth, &r_u->num_entries))
4149 return False;
4150 if(!prs_uint32("ptr ", ps, depth, &r_u->ptr))
4151 return False;
4153 if (r_u->ptr != 0) {
4154 if(!samr_io_rids("rids", &r_u->num_entries2, &r_u->rid, ps, depth))
4155 return False;
4158 if(!prs_align(ps))
4159 return False;
4160 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4161 return False;
4163 return True;
4166 /*******************************************************************
4167 inits a SAMR_Q_OPEN_ALIAS structure.
4168 ********************************************************************/
4170 void init_samr_q_open_alias(SAMR_Q_OPEN_ALIAS * q_u, POLICY_HND *pol,
4171 uint32 access_mask, uint32 rid)
4173 DEBUG(5, ("init_samr_q_open_alias\n"));
4175 q_u->dom_pol = *pol;
4176 q_u->access_mask = access_mask;
4177 q_u->rid_alias = rid;
4180 /*******************************************************************
4181 reads or writes a structure.
4182 ********************************************************************/
4184 BOOL samr_io_q_open_alias(const char *desc, SAMR_Q_OPEN_ALIAS * q_u,
4185 prs_struct *ps, int depth)
4187 if (q_u == NULL)
4188 return False;
4190 prs_debug(ps, depth, desc, "samr_io_q_open_alias");
4191 depth++;
4193 if(!prs_align(ps))
4194 return False;
4196 if(!smb_io_pol_hnd("domain_pol", &q_u->dom_pol, ps, depth))
4197 return False;
4199 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
4200 return False;
4201 if(!prs_uint32("rid_alias", ps, depth, &q_u->rid_alias))
4202 return False;
4204 return True;
4207 /*******************************************************************
4208 reads or writes a structure.
4209 ********************************************************************/
4211 BOOL samr_io_r_open_alias(const char *desc, SAMR_R_OPEN_ALIAS * r_u,
4212 prs_struct *ps, int depth)
4214 if (r_u == NULL)
4215 return False;
4217 prs_debug(ps, depth, desc, "samr_io_r_open_alias");
4218 depth++;
4220 if(!prs_align(ps))
4221 return False;
4223 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
4224 return False;
4226 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4227 return False;
4229 return True;
4232 /*******************************************************************
4233 inits a SAMR_Q_LOOKUP_RIDS structure.
4234 ********************************************************************/
4236 void init_samr_q_lookup_rids(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_RIDS * q_u,
4237 POLICY_HND *pol, uint32 flags,
4238 uint32 num_rids, uint32 *rid)
4240 DEBUG(5, ("init_samr_q_lookup_rids\n"));
4242 q_u->pol = *pol;
4244 q_u->num_rids1 = num_rids;
4245 q_u->flags = flags;
4246 q_u->ptr = 0;
4247 q_u->num_rids2 = num_rids;
4248 if (num_rids) {
4249 q_u->rid = TALLOC_ZERO_ARRAY(ctx, uint32, num_rids );
4250 } else {
4251 q_u->rid = NULL;
4253 if (q_u->rid == NULL) {
4254 q_u->num_rids1 = 0;
4255 q_u->num_rids2 = 0;
4256 } else {
4257 memcpy(q_u->rid, rid, num_rids * sizeof(q_u->rid[0]));
4261 /*******************************************************************
4262 reads or writes a structure.
4263 ********************************************************************/
4265 BOOL samr_io_q_lookup_rids(const char *desc, SAMR_Q_LOOKUP_RIDS * q_u,
4266 prs_struct *ps, int depth)
4268 uint32 i;
4269 fstring tmp;
4271 if (q_u == NULL)
4272 return False;
4274 prs_debug(ps, depth, desc, "samr_io_q_lookup_rids");
4275 depth++;
4277 if (UNMARSHALLING(ps))
4278 ZERO_STRUCTP(q_u);
4280 if(!prs_align(ps))
4281 return False;
4283 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4284 return False;
4286 if(!prs_uint32("num_rids1", ps, depth, &q_u->num_rids1))
4287 return False;
4288 if(!prs_uint32("flags ", ps, depth, &q_u->flags))
4289 return False;
4290 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
4291 return False;
4292 if(!prs_uint32("num_rids2", ps, depth, &q_u->num_rids2))
4293 return False;
4295 if (UNMARSHALLING(ps) && (q_u->num_rids2 != 0)) {
4296 q_u->rid = PRS_ALLOC_MEM(ps, uint32, q_u->num_rids2);
4297 if (q_u->rid == NULL)
4298 return False;
4301 for (i = 0; i < q_u->num_rids2; i++) {
4302 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
4303 if(!prs_uint32(tmp, ps, depth, &q_u->rid[i]))
4304 return False;
4307 return True;
4310 /*******************************************************************
4311 inits a SAMR_R_LOOKUP_RIDS structure.
4312 ********************************************************************/
4314 void init_samr_r_lookup_rids(SAMR_R_LOOKUP_RIDS * r_u,
4315 uint32 num_names, UNIHDR * hdr_name,
4316 UNISTR2 *uni_name, uint32 *type)
4318 DEBUG(5, ("init_samr_r_lookup_rids\n"));
4320 r_u->hdr_name = NULL;
4321 r_u->uni_name = NULL;
4322 r_u->type = NULL;
4324 if (num_names != 0) {
4325 r_u->num_names1 = num_names;
4326 r_u->ptr_names = 1;
4327 r_u->num_names2 = num_names;
4329 r_u->num_types1 = num_names;
4330 r_u->ptr_types = 1;
4331 r_u->num_types2 = num_names;
4333 r_u->hdr_name = hdr_name;
4334 r_u->uni_name = uni_name;
4335 r_u->type = type;
4336 } else {
4337 r_u->num_names1 = num_names;
4338 r_u->ptr_names = 0;
4339 r_u->num_names2 = num_names;
4341 r_u->num_types1 = num_names;
4342 r_u->ptr_types = 0;
4343 r_u->num_types2 = num_names;
4347 /*******************************************************************
4348 reads or writes a structure.
4349 ********************************************************************/
4351 BOOL samr_io_r_lookup_rids(const char *desc, SAMR_R_LOOKUP_RIDS * r_u,
4352 prs_struct *ps, int depth)
4354 uint32 i;
4355 fstring tmp;
4356 if (r_u == NULL)
4357 return False;
4359 prs_debug(ps, depth, desc, "samr_io_r_lookup_rids");
4360 depth++;
4362 if(!prs_align(ps))
4363 return False;
4365 if(!prs_uint32("num_names1", ps, depth, &r_u->num_names1))
4366 return False;
4367 if(!prs_uint32("ptr_names ", ps, depth, &r_u->ptr_names))
4368 return False;
4370 if (r_u->ptr_names != 0) {
4372 if(!prs_uint32("num_names2", ps, depth, &r_u->num_names2))
4373 return False;
4376 if (UNMARSHALLING(ps) && (r_u->num_names2 != 0)) {
4377 r_u->hdr_name = PRS_ALLOC_MEM(ps, UNIHDR, r_u->num_names2);
4378 if (r_u->hdr_name == NULL)
4379 return False;
4381 r_u->uni_name = PRS_ALLOC_MEM(ps, UNISTR2, r_u->num_names2);
4382 if (r_u->uni_name == NULL)
4383 return False;
4386 for (i = 0; i < r_u->num_names2; i++) {
4387 slprintf(tmp, sizeof(tmp) - 1, "hdr[%02d] ", i);
4388 if(!smb_io_unihdr("", &r_u->hdr_name[i], ps, depth))
4389 return False;
4391 for (i = 0; i < r_u->num_names2; i++) {
4392 slprintf(tmp, sizeof(tmp) - 1, "str[%02d] ", i);
4393 if(!smb_io_unistr2("", &r_u->uni_name[i], r_u->hdr_name[i].buffer, ps, depth))
4394 return False;
4399 if(!prs_align(ps))
4400 return False;
4401 if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1))
4402 return False;
4403 if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types))
4404 return False;
4406 if (r_u->ptr_types != 0) {
4408 if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2))
4409 return False;
4411 if (UNMARSHALLING(ps) && (r_u->num_types2 != 0)) {
4412 r_u->type = PRS_ALLOC_MEM(ps, uint32, r_u->num_types2);
4413 if (r_u->type == NULL)
4414 return False;
4417 for (i = 0; i < r_u->num_types2; i++) {
4418 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
4419 if(!prs_uint32(tmp, ps, depth, &r_u->type[i]))
4420 return False;
4424 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4425 return False;
4427 return True;
4430 /*******************************************************************
4431 inits a SAMR_Q_OPEN_ALIAS structure.
4432 ********************************************************************/
4434 void init_samr_q_delete_alias(SAMR_Q_DELETE_DOM_ALIAS * q_u, POLICY_HND *hnd)
4436 DEBUG(5, ("init_samr_q_delete_alias\n"));
4438 q_u->alias_pol = *hnd;
4441 /*******************************************************************
4442 reads or writes a structure.
4443 ********************************************************************/
4445 BOOL samr_io_q_delete_alias(const char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u,
4446 prs_struct *ps, int depth)
4448 if (q_u == NULL)
4449 return False;
4451 prs_debug(ps, depth, desc, "samr_io_q_delete_alias");
4452 depth++;
4454 if(!prs_align(ps))
4455 return False;
4457 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4458 return False;
4460 return True;
4463 /*******************************************************************
4464 reads or writes a structure.
4465 ********************************************************************/
4467 BOOL samr_io_r_delete_alias(const char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u,
4468 prs_struct *ps, int depth)
4470 if (r_u == NULL)
4471 return False;
4473 prs_debug(ps, depth, desc, "samr_io_r_delete_alias");
4474 depth++;
4476 if(!prs_align(ps))
4477 return False;
4479 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
4480 return False;
4481 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4482 return False;
4484 return True;
4487 /*******************************************************************
4488 inits a SAMR_Q_CREATE_DOM_ALIAS structure.
4489 ********************************************************************/
4491 void init_samr_q_create_dom_alias(SAMR_Q_CREATE_DOM_ALIAS * q_u,
4492 POLICY_HND *hnd, const char *acct_desc)
4494 DEBUG(5, ("init_samr_q_create_dom_alias\n"));
4496 q_u->dom_pol = *hnd;
4498 init_unistr2(&q_u->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
4499 init_uni_hdr(&q_u->hdr_acct_desc, &q_u->uni_acct_desc);
4501 q_u->access_mask = MAXIMUM_ALLOWED_ACCESS;
4504 /*******************************************************************
4505 reads or writes a structure.
4506 ********************************************************************/
4508 BOOL samr_io_q_create_dom_alias(const char *desc, SAMR_Q_CREATE_DOM_ALIAS * q_u,
4509 prs_struct *ps, int depth)
4511 if (q_u == NULL)
4512 return False;
4514 prs_debug(ps, depth, desc, "samr_io_q_create_dom_alias");
4515 depth++;
4517 if(!prs_align(ps))
4518 return False;
4520 if(!smb_io_pol_hnd("dom_pol", &q_u->dom_pol, ps, depth))
4521 return False;
4523 if(!smb_io_unihdr("hdr_acct_desc", &q_u->hdr_acct_desc, ps, depth))
4524 return False;
4525 if(!smb_io_unistr2("uni_acct_desc", &q_u->uni_acct_desc,
4526 q_u->hdr_acct_desc.buffer, ps, depth))
4527 return False;
4529 if(!prs_align(ps))
4530 return False;
4531 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
4532 return False;
4534 return True;
4537 /*******************************************************************
4538 reads or writes a structure.
4539 ********************************************************************/
4541 BOOL samr_io_r_create_dom_alias(const char *desc, SAMR_R_CREATE_DOM_ALIAS * r_u,
4542 prs_struct *ps, int depth)
4544 if (r_u == NULL)
4545 return False;
4547 prs_debug(ps, depth, desc, "samr_io_r_create_dom_alias");
4548 depth++;
4550 if(!prs_align(ps))
4551 return False;
4553 if(!smb_io_pol_hnd("alias_pol", &r_u->alias_pol, ps, depth))
4554 return False;
4556 if(!prs_uint32("rid", ps, depth, &r_u->rid))
4557 return False;
4559 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4560 return False;
4562 return True;
4565 /*******************************************************************
4566 inits a SAMR_Q_ADD_ALIASMEM structure.
4567 ********************************************************************/
4569 void init_samr_q_add_aliasmem(SAMR_Q_ADD_ALIASMEM * q_u, POLICY_HND *hnd,
4570 DOM_SID *sid)
4572 DEBUG(5, ("init_samr_q_add_aliasmem\n"));
4574 q_u->alias_pol = *hnd;
4575 init_dom_sid2(&q_u->sid, sid);
4578 /*******************************************************************
4579 reads or writes a structure.
4580 ********************************************************************/
4582 BOOL samr_io_q_add_aliasmem(const char *desc, SAMR_Q_ADD_ALIASMEM * q_u,
4583 prs_struct *ps, int depth)
4585 if (q_u == NULL)
4586 return False;
4588 prs_debug(ps, depth, desc, "samr_io_q_add_aliasmem");
4589 depth++;
4591 if(!prs_align(ps))
4592 return False;
4594 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4595 return False;
4596 if(!smb_io_dom_sid2("sid ", &q_u->sid, ps, depth))
4597 return False;
4599 return True;
4602 /*******************************************************************
4603 reads or writes a structure.
4604 ********************************************************************/
4606 BOOL samr_io_r_add_aliasmem(const char *desc, SAMR_R_ADD_ALIASMEM * r_u,
4607 prs_struct *ps, int depth)
4609 if (r_u == NULL)
4610 return False;
4612 prs_debug(ps, depth, desc, "samr_io_r_add_aliasmem");
4613 depth++;
4615 if(!prs_align(ps))
4616 return False;
4618 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4619 return False;
4621 return True;
4624 /*******************************************************************
4625 inits a SAMR_Q_DEL_ALIASMEM structure.
4626 ********************************************************************/
4628 void init_samr_q_del_aliasmem(SAMR_Q_DEL_ALIASMEM * q_u, POLICY_HND *hnd,
4629 DOM_SID *sid)
4631 DEBUG(5, ("init_samr_q_del_aliasmem\n"));
4633 q_u->alias_pol = *hnd;
4634 init_dom_sid2(&q_u->sid, sid);
4637 /*******************************************************************
4638 reads or writes a structure.
4639 ********************************************************************/
4641 BOOL samr_io_q_del_aliasmem(const char *desc, SAMR_Q_DEL_ALIASMEM * q_u,
4642 prs_struct *ps, int depth)
4644 if (q_u == NULL)
4645 return False;
4647 prs_debug(ps, depth, desc, "samr_io_q_del_aliasmem");
4648 depth++;
4650 if(!prs_align(ps))
4651 return False;
4653 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4654 return False;
4655 if(!smb_io_dom_sid2("sid ", &q_u->sid, ps, depth))
4656 return False;
4658 return True;
4661 /*******************************************************************
4662 reads or writes a structure.
4663 ********************************************************************/
4665 BOOL samr_io_r_del_aliasmem(const char *desc, SAMR_R_DEL_ALIASMEM * r_u,
4666 prs_struct *ps, int depth)
4668 if (r_u == NULL)
4669 return False;
4671 prs_debug(ps, depth, desc, "samr_io_r_del_aliasmem");
4672 depth++;
4674 if(!prs_align(ps))
4675 return False;
4677 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4678 return False;
4680 return True;
4683 /*******************************************************************
4684 inits a SAMR_Q_DELETE_DOM_ALIAS structure.
4685 ********************************************************************/
4687 void init_samr_q_delete_dom_alias(SAMR_Q_DELETE_DOM_ALIAS * q_c,
4688 POLICY_HND *hnd)
4690 DEBUG(5, ("init_samr_q_delete_dom_alias\n"));
4692 q_c->alias_pol = *hnd;
4695 /*******************************************************************
4696 reads or writes a structure.
4697 ********************************************************************/
4699 BOOL samr_io_q_delete_dom_alias(const char *desc, SAMR_Q_DELETE_DOM_ALIAS * q_u,
4700 prs_struct *ps, int depth)
4702 if (q_u == NULL)
4703 return False;
4705 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_alias");
4706 depth++;
4708 if(!prs_align(ps))
4709 return False;
4711 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4712 return False;
4714 return True;
4717 /*******************************************************************
4718 inits a SAMR_R_DELETE_DOM_ALIAS structure.
4719 ********************************************************************/
4721 void init_samr_r_delete_dom_alias(SAMR_R_DELETE_DOM_ALIAS * r_u,
4722 NTSTATUS status)
4724 DEBUG(5, ("init_samr_r_delete_dom_alias\n"));
4726 r_u->status = status;
4729 /*******************************************************************
4730 reads or writes a structure.
4731 ********************************************************************/
4733 BOOL samr_io_r_delete_dom_alias(const char *desc, SAMR_R_DELETE_DOM_ALIAS * r_u,
4734 prs_struct *ps, int depth)
4736 if (r_u == NULL)
4737 return False;
4739 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_alias");
4740 depth++;
4742 if(!prs_align(ps))
4743 return False;
4745 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
4746 return False;
4748 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4749 return False;
4751 return True;
4754 /*******************************************************************
4755 inits a SAMR_Q_QUERY_ALIASMEM structure.
4756 ********************************************************************/
4758 void init_samr_q_query_aliasmem(SAMR_Q_QUERY_ALIASMEM * q_c,
4759 POLICY_HND *hnd)
4761 DEBUG(5, ("init_samr_q_query_aliasmem\n"));
4763 q_c->alias_pol = *hnd;
4766 /*******************************************************************
4767 reads or writes a structure.
4768 ********************************************************************/
4770 BOOL samr_io_q_query_aliasmem(const char *desc, SAMR_Q_QUERY_ALIASMEM * q_u,
4771 prs_struct *ps, int depth)
4773 if (q_u == NULL)
4774 return False;
4776 prs_debug(ps, depth, desc, "samr_io_q_query_aliasmem");
4777 depth++;
4779 if(!prs_align(ps))
4780 return False;
4782 if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
4783 return False;
4785 return True;
4788 /*******************************************************************
4789 inits a SAMR_R_QUERY_ALIASMEM structure.
4790 ********************************************************************/
4792 void init_samr_r_query_aliasmem(SAMR_R_QUERY_ALIASMEM * r_u,
4793 uint32 num_sids, DOM_SID2 * sid,
4794 NTSTATUS status)
4796 DEBUG(5, ("init_samr_r_query_aliasmem\n"));
4798 if (NT_STATUS_IS_OK(status)) {
4799 r_u->num_sids = num_sids;
4800 r_u->ptr = (num_sids != 0) ? 1 : 0;
4801 r_u->num_sids1 = num_sids;
4803 r_u->sid = sid;
4804 } else {
4805 r_u->ptr = 0;
4806 r_u->num_sids = 0;
4809 r_u->status = status;
4812 /*******************************************************************
4813 reads or writes a structure.
4814 ********************************************************************/
4816 BOOL samr_io_r_query_aliasmem(const char *desc, SAMR_R_QUERY_ALIASMEM * r_u,
4817 prs_struct *ps, int depth)
4819 uint32 i;
4821 if (r_u == NULL)
4822 return False;
4824 prs_debug(ps, depth, desc, "samr_io_r_query_aliasmem");
4825 depth++;
4827 if(!prs_align(ps))
4828 return False;
4830 if(!prs_uint32("num_sids ", ps, depth, &r_u->num_sids))
4831 return False;
4832 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
4833 return False;
4835 if (r_u->ptr != 0 && r_u->num_sids != 0) {
4836 uint32 *ptr_sid = NULL;
4838 if(!prs_uint32("num_sids1", ps, depth, &r_u->num_sids1))
4839 return False;
4841 /* We must always use talloc here even when marshalling. */
4842 if (r_u->num_sids1) {
4843 ptr_sid = TALLOC_ARRAY(ps->mem_ctx, uint32, r_u->num_sids1);
4844 if (!ptr_sid) {
4845 return False;
4847 } else {
4848 ptr_sid = NULL;
4851 for (i = 0; i < r_u->num_sids1; i++) {
4852 ptr_sid[i] = 1;
4853 if(!prs_uint32("ptr_sid", ps, depth, &ptr_sid[i]))
4854 return False;
4857 if (UNMARSHALLING(ps)) {
4858 if (r_u->num_sids1) {
4859 r_u->sid = TALLOC_ARRAY(ps->mem_ctx, DOM_SID2, r_u->num_sids1);
4860 if (!r_u->sid) {
4861 return False;
4863 } else {
4864 r_u->sid = NULL;
4868 for (i = 0; i < r_u->num_sids1; i++) {
4869 if (ptr_sid[i] != 0) {
4870 if(!smb_io_dom_sid2("sid", &r_u->sid[i], ps, depth))
4871 return False;
4876 if(!prs_align(ps))
4877 return False;
4878 if(!prs_ntstatus("status", ps, depth, &r_u->status))
4879 return False;
4881 return True;
4884 /*******************************************************************
4885 inits a SAMR_Q_LOOKUP_NAMES structure.
4886 ********************************************************************/
4888 NTSTATUS init_samr_q_lookup_names(TALLOC_CTX *ctx, SAMR_Q_LOOKUP_NAMES * q_u,
4889 POLICY_HND *pol, uint32 flags,
4890 uint32 num_names, const char **name)
4892 uint32 i;
4894 DEBUG(5, ("init_samr_q_lookup_names\n"));
4896 q_u->pol = *pol;
4898 q_u->num_names1 = num_names;
4899 q_u->flags = flags;
4900 q_u->ptr = 0;
4901 q_u->num_names2 = num_names;
4903 if (num_names) {
4904 if (!(q_u->hdr_name = TALLOC_ZERO_ARRAY(ctx, UNIHDR, num_names)))
4905 return NT_STATUS_NO_MEMORY;
4907 if (!(q_u->uni_name = TALLOC_ZERO_ARRAY(ctx, UNISTR2, num_names)))
4908 return NT_STATUS_NO_MEMORY;
4909 } else {
4910 q_u->hdr_name = NULL;
4911 q_u->uni_name = NULL;
4914 for (i = 0; i < num_names; i++) {
4915 init_unistr2(&q_u->uni_name[i], name[i], UNI_FLAGS_NONE); /* unicode string for machine account */
4916 init_uni_hdr(&q_u->hdr_name[i], &q_u->uni_name[i]); /* unicode header for user_name */
4919 return NT_STATUS_OK;
4922 /*******************************************************************
4923 reads or writes a structure.
4924 ********************************************************************/
4926 BOOL samr_io_q_lookup_names(const char *desc, SAMR_Q_LOOKUP_NAMES * q_u,
4927 prs_struct *ps, int depth)
4929 uint32 i;
4931 if (q_u == NULL)
4932 return False;
4934 prs_debug(ps, depth, desc, "samr_io_q_lookup_names");
4935 depth++;
4937 if (UNMARSHALLING(ps))
4938 ZERO_STRUCTP(q_u);
4940 if(!prs_align(ps))
4941 return False;
4943 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
4944 return False;
4946 if(!prs_uint32("num_names1", ps, depth, &q_u->num_names1))
4947 return False;
4948 if(!prs_uint32("flags ", ps, depth, &q_u->flags))
4949 return False;
4950 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
4951 return False;
4952 if(!prs_uint32("num_names2", ps, depth, &q_u->num_names2))
4953 return False;
4955 if (UNMARSHALLING(ps) && (q_u->num_names2 != 0)) {
4956 q_u->hdr_name = PRS_ALLOC_MEM(ps, UNIHDR, q_u->num_names2);
4957 q_u->uni_name = PRS_ALLOC_MEM(ps, UNISTR2, q_u->num_names2);
4958 if (!q_u->hdr_name || !q_u->uni_name)
4959 return False;
4962 for (i = 0; i < q_u->num_names2; i++) {
4963 if(!smb_io_unihdr("", &q_u->hdr_name[i], ps, depth))
4964 return False;
4967 for (i = 0; i < q_u->num_names2; i++) {
4968 if(!smb_io_unistr2("", &q_u->uni_name[i], q_u->hdr_name[i].buffer, ps, depth))
4969 return False;
4972 return True;
4975 /*******************************************************************
4976 inits a SAMR_R_LOOKUP_NAMES structure.
4977 ********************************************************************/
4979 NTSTATUS init_samr_r_lookup_names(TALLOC_CTX *ctx, SAMR_R_LOOKUP_NAMES * r_u,
4980 uint32 num_rids,
4981 uint32 *rid, enum lsa_SidType *type,
4982 NTSTATUS status)
4984 DEBUG(5, ("init_samr_r_lookup_names\n"));
4986 if (NT_STATUS_IS_OK(status) && (num_rids != 0)) {
4987 uint32 i;
4989 r_u->num_types1 = num_rids;
4990 r_u->ptr_types = 1;
4991 r_u->num_types2 = num_rids;
4993 r_u->num_rids1 = num_rids;
4994 r_u->ptr_rids = 1;
4995 r_u->num_rids2 = num_rids;
4997 if (num_rids) {
4998 if (!(r_u->rids = TALLOC_ZERO_ARRAY(ctx, uint32, num_rids)))
4999 return NT_STATUS_NO_MEMORY;
5000 if (!(r_u->types = TALLOC_ZERO_ARRAY(ctx, uint32, num_rids)))
5001 return NT_STATUS_NO_MEMORY;
5002 } else {
5003 r_u->rids = NULL;
5004 r_u->types = NULL;
5007 if (!r_u->rids || !r_u->types)
5008 goto empty;
5010 for (i = 0; i < num_rids; i++) {
5011 r_u->rids[i] = rid[i];
5012 r_u->types[i] = type[i];
5014 } else {
5016 empty:
5017 r_u->num_types1 = 0;
5018 r_u->ptr_types = 0;
5019 r_u->num_types2 = 0;
5021 r_u->num_rids1 = 0;
5022 r_u->ptr_rids = 0;
5023 r_u->num_rids2 = 0;
5025 r_u->rids = NULL;
5026 r_u->types = NULL;
5029 r_u->status = status;
5031 return NT_STATUS_OK;
5034 /*******************************************************************
5035 reads or writes a structure.
5036 ********************************************************************/
5038 BOOL samr_io_r_lookup_names(const char *desc, SAMR_R_LOOKUP_NAMES * r_u,
5039 prs_struct *ps, int depth)
5041 uint32 i;
5042 fstring tmp;
5044 if (r_u == NULL)
5045 return False;
5047 prs_debug(ps, depth, desc, "samr_io_r_lookup_names");
5048 depth++;
5050 if (UNMARSHALLING(ps))
5051 ZERO_STRUCTP(r_u);
5053 if(!prs_align(ps))
5054 return False;
5056 if(!prs_uint32("num_rids1", ps, depth, &r_u->num_rids1))
5057 return False;
5058 if(!prs_uint32("ptr_rids ", ps, depth, &r_u->ptr_rids))
5059 return False;
5061 if (r_u->ptr_rids != 0) {
5062 if(!prs_uint32("num_rids2", ps, depth, &r_u->num_rids2))
5063 return False;
5065 if (r_u->num_rids2 != r_u->num_rids1) {
5066 /* RPC fault */
5067 return False;
5070 if (UNMARSHALLING(ps) && r_u->num_rids2) {
5071 r_u->rids = PRS_ALLOC_MEM(ps, uint32, r_u->num_rids2);
5073 if (!r_u->rids) {
5074 DEBUG(0, ("NULL rids in samr_io_r_lookup_names\n"));
5075 return False;
5079 for (i = 0; i < r_u->num_rids2; i++) {
5080 slprintf(tmp, sizeof(tmp) - 1, "rid[%02d] ", i);
5081 if(!prs_uint32(tmp, ps, depth, &r_u->rids[i]))
5082 return False;
5086 if(!prs_uint32("num_types1", ps, depth, &r_u->num_types1))
5087 return False;
5088 if(!prs_uint32("ptr_types ", ps, depth, &r_u->ptr_types))
5089 return False;
5091 if (r_u->ptr_types != 0) {
5092 if(!prs_uint32("num_types2", ps, depth, &r_u->num_types2))
5093 return False;
5095 if (r_u->num_types2 != r_u->num_types1) {
5096 /* RPC fault */
5097 return False;
5100 if (UNMARSHALLING(ps) && r_u->num_types2) {
5101 r_u->types = PRS_ALLOC_MEM(ps, uint32, r_u->num_types2);
5103 if (!r_u->types) {
5104 DEBUG(0, ("NULL types in samr_io_r_lookup_names\n"));
5105 return False;
5109 for (i = 0; i < r_u->num_types2; i++) {
5110 slprintf(tmp, sizeof(tmp) - 1, "type[%02d] ", i);
5111 if(!prs_uint32(tmp, ps, depth, &r_u->types[i]))
5112 return False;
5116 if(!prs_ntstatus("status", ps, depth, &r_u->status))
5117 return False;
5119 return True;
5122 /*******************************************************************
5123 inits a SAMR_Q_DELETE_DOM_USER structure.
5124 ********************************************************************/
5126 void init_samr_q_delete_dom_user(SAMR_Q_DELETE_DOM_USER * q_c,
5127 POLICY_HND *hnd)
5129 DEBUG(5, ("init_samr_q_delete_dom_user\n"));
5131 q_c->user_pol = *hnd;
5134 /*******************************************************************
5135 reads or writes a structure.
5136 ********************************************************************/
5138 BOOL samr_io_q_delete_dom_user(const char *desc, SAMR_Q_DELETE_DOM_USER * q_u,
5139 prs_struct *ps, int depth)
5141 if (q_u == NULL)
5142 return False;
5144 prs_debug(ps, depth, desc, "samr_io_q_delete_dom_user");
5145 depth++;
5147 if(!prs_align(ps))
5148 return False;
5150 if(!smb_io_pol_hnd("user_pol", &q_u->user_pol, ps, depth))
5151 return False;
5153 return True;
5156 /*******************************************************************
5157 reads or writes a structure.
5158 ********************************************************************/
5160 BOOL samr_io_r_delete_dom_user(const char *desc, SAMR_R_DELETE_DOM_USER * r_u,
5161 prs_struct *ps, int depth)
5163 if (r_u == NULL)
5164 return False;
5166 prs_debug(ps, depth, desc, "samr_io_r_delete_dom_user");
5167 depth++;
5169 if(!prs_align(ps))
5170 return False;
5172 if(!smb_io_pol_hnd("pol", &r_u->pol, ps, depth))
5173 return False;
5174 if(!prs_ntstatus("status", ps, depth, &r_u->status))
5175 return False;
5177 return True;
5180 /*******************************************************************
5181 reads or writes a structure.
5182 ********************************************************************/
5184 void init_samr_q_open_user(SAMR_Q_OPEN_USER * q_u,
5185 POLICY_HND *pol,
5186 uint32 access_mask, uint32 rid)
5188 DEBUG(5, ("samr_init_samr_q_open_user\n"));
5190 q_u->domain_pol = *pol;
5191 q_u->access_mask = access_mask;
5192 q_u->user_rid = rid;
5195 /*******************************************************************
5196 reads or writes a structure.
5197 ********************************************************************/
5199 BOOL samr_io_q_open_user(const char *desc, SAMR_Q_OPEN_USER * q_u,
5200 prs_struct *ps, int depth)
5202 if (q_u == NULL)
5203 return False;
5205 prs_debug(ps, depth, desc, "samr_io_q_open_user");
5206 depth++;
5208 if(!prs_align(ps))
5209 return False;
5211 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
5212 return False;
5214 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
5215 return False;
5216 if(!prs_uint32("user_rid ", ps, depth, &q_u->user_rid))
5217 return False;
5219 return True;
5222 /*******************************************************************
5223 reads or writes a structure.
5224 ********************************************************************/
5226 BOOL samr_io_r_open_user(const char *desc, SAMR_R_OPEN_USER * r_u,
5227 prs_struct *ps, int depth)
5229 if (r_u == NULL)
5230 return False;
5232 prs_debug(ps, depth, desc, "samr_io_r_open_user");
5233 depth++;
5235 if(!prs_align(ps))
5236 return False;
5238 if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth))
5239 return False;
5241 if(!prs_ntstatus("status", ps, depth, &r_u->status))
5242 return False;
5244 return True;
5248 /*******************************************************************
5249 reads or writes a structure.
5250 ********************************************************************/
5252 void init_samr_q_create_user(SAMR_Q_CREATE_USER * q_u,
5253 POLICY_HND *pol,
5254 const char *name,
5255 uint32 acb_info, uint32 access_mask)
5257 DEBUG(5, ("samr_init_samr_q_create_user\n"));
5259 q_u->domain_pol = *pol;
5261 init_unistr2(&q_u->uni_name, name, UNI_FLAGS_NONE);
5262 init_uni_hdr(&q_u->hdr_name, &q_u->uni_name);
5264 q_u->acb_info = acb_info;
5265 q_u->access_mask = access_mask;
5268 /*******************************************************************
5269 reads or writes a structure.
5270 ********************************************************************/
5272 BOOL samr_io_q_create_user(const char *desc, SAMR_Q_CREATE_USER * q_u,
5273 prs_struct *ps, int depth)
5275 if (q_u == NULL)
5276 return False;
5278 prs_debug(ps, depth, desc, "samr_io_q_create_user");
5279 depth++;
5281 if(!prs_align(ps))
5282 return False;
5284 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
5285 return False;
5287 if(!smb_io_unihdr("hdr_name", &q_u->hdr_name, ps, depth))
5288 return False;
5289 if(!smb_io_unistr2("uni_name", &q_u->uni_name, q_u->hdr_name.buffer, ps, depth))
5290 return False;
5292 if(!prs_align(ps))
5293 return False;
5294 if(!prs_uint32("acb_info ", ps, depth, &q_u->acb_info))
5295 return False;
5296 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
5297 return False;
5299 return True;
5302 /*******************************************************************
5303 reads or writes a structure.
5304 ********************************************************************/
5306 BOOL samr_io_r_create_user(const char *desc, SAMR_R_CREATE_USER * r_u,
5307 prs_struct *ps, int depth)
5309 if (r_u == NULL)
5310 return False;
5312 prs_debug(ps, depth, desc, "samr_io_r_create_user");
5313 depth++;
5315 if(!prs_align(ps))
5316 return False;
5318 if(!smb_io_pol_hnd("user_pol", &r_u->user_pol, ps, depth))
5319 return False;
5321 if(!prs_uint32("access_granted", ps, depth, &r_u->access_granted))
5322 return False;
5323 if(!prs_uint32("user_rid ", ps, depth, &r_u->user_rid))
5324 return False;
5325 if(!prs_ntstatus("status", ps, depth, &r_u->status))
5326 return False;
5328 return True;
5331 /*******************************************************************
5332 inits a SAMR_Q_QUERY_USERINFO structure.
5333 ********************************************************************/
5335 void init_samr_q_query_userinfo(SAMR_Q_QUERY_USERINFO * q_u,
5336 const POLICY_HND *hnd, uint16 switch_value)
5338 DEBUG(5, ("init_samr_q_query_userinfo\n"));
5340 q_u->pol = *hnd;
5341 q_u->switch_value = switch_value;
5344 /*******************************************************************
5345 reads or writes a structure.
5346 ********************************************************************/
5348 BOOL samr_io_q_query_userinfo(const char *desc, SAMR_Q_QUERY_USERINFO * q_u,
5349 prs_struct *ps, int depth)
5351 if (q_u == NULL)
5352 return False;
5354 prs_debug(ps, depth, desc, "samr_io_q_query_userinfo");
5355 depth++;
5357 if(!prs_align(ps))
5358 return False;
5360 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
5361 return False;
5363 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value)) /* 0x0015 or 0x0011 */
5364 return False;
5366 return True;
5369 /*******************************************************************
5370 reads or writes a LOGON_HRS structure.
5371 ********************************************************************/
5373 static BOOL sam_io_logon_hrs(const char *desc, LOGON_HRS * hrs,
5374 prs_struct *ps, int depth)
5376 if (hrs == NULL)
5377 return False;
5379 prs_debug(ps, depth, desc, "sam_io_logon_hrs");
5380 depth++;
5382 if(!prs_align(ps))
5383 return False;
5385 if(!prs_uint32("maxlen", ps, depth, &hrs->max_len))
5386 return False;
5388 if(!prs_uint32("offset", ps, depth, &hrs->offset))
5389 return False;
5391 if(!prs_uint32("len ", ps, depth, &hrs->len))
5392 return False;
5394 if (hrs->len > sizeof(hrs->hours)) {
5395 DEBUG(3, ("sam_io_logon_hrs: truncating length from %d\n", hrs->len));
5396 hrs->len = sizeof(hrs->hours);
5399 if(!prs_uint8s(False, "hours", ps, depth, hrs->hours, hrs->len))
5400 return False;
5402 return True;
5405 /*******************************************************************
5406 inits a SAM_USER_INFO_18 structure.
5407 ********************************************************************/
5409 void init_sam_user_info18(SAM_USER_INFO_18 * usr,
5410 const uint8 lm_pwd[16], const uint8 nt_pwd[16])
5412 DEBUG(5, ("init_sam_user_info18\n"));
5414 usr->lm_pwd_active =
5415 memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd)) ? 1 : 0;
5416 usr->nt_pwd_active =
5417 memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd)) ? 1 : 0;
5420 /*******************************************************************
5421 reads or writes a structure.
5422 ********************************************************************/
5424 static BOOL sam_io_user_info18(const char *desc, SAM_USER_INFO_18 * u,
5425 prs_struct *ps, int depth)
5427 if (u == NULL)
5428 return False;
5430 prs_debug(ps, depth, desc, "samr_io_r_user_info18");
5431 depth++;
5433 if(!prs_align(ps))
5434 return False;
5436 if(!prs_uint8s(False, "lm_pwd", ps, depth, u->lm_pwd, sizeof(u->lm_pwd)))
5437 return False;
5438 if(!prs_uint8s(False, "nt_pwd", ps, depth, u->nt_pwd, sizeof(u->nt_pwd)))
5439 return False;
5441 if(!prs_uint8("lm_pwd_active", ps, depth, &u->lm_pwd_active))
5442 return False;
5443 if(!prs_uint8("nt_pwd_active", ps, depth, &u->nt_pwd_active))
5444 return False;
5446 return True;
5449 /*******************************************************************
5450 inits a SAM_USER_INFO_7 structure.
5451 ********************************************************************/
5453 void init_sam_user_info7(SAM_USER_INFO_7 * usr, const char *name)
5455 DEBUG(5, ("init_sam_user_info7\n"));
5457 init_unistr2(&usr->uni_name, name, UNI_FLAGS_NONE); /* unicode string for name */
5458 init_uni_hdr(&usr->hdr_name, &usr->uni_name); /* unicode header for name */
5462 /*******************************************************************
5463 reads or writes a structure.
5464 ********************************************************************/
5466 static BOOL sam_io_user_info7(const char *desc, SAM_USER_INFO_7 * usr,
5467 prs_struct *ps, int depth)
5469 if (usr == NULL)
5470 return False;
5472 prs_debug(ps, depth, desc, "samr_io_r_user_info7");
5473 depth++;
5475 if(!prs_align(ps))
5476 return False;
5478 if(!smb_io_unihdr("unihdr", &usr->hdr_name, ps, depth))
5479 return False;
5481 if(!smb_io_unistr2("unistr2", &usr->uni_name, True, ps, depth))
5482 return False;
5484 return True;
5487 /*******************************************************************
5488 inits a SAM_USER_INFO_9 structure.
5489 ********************************************************************/
5491 void init_sam_user_info9(SAM_USER_INFO_9 * usr, uint32 rid_group)
5493 DEBUG(5, ("init_sam_user_info9\n"));
5495 usr->rid_group = rid_group;
5498 /*******************************************************************
5499 reads or writes a structure.
5500 ********************************************************************/
5502 static BOOL sam_io_user_info9(const char *desc, SAM_USER_INFO_9 * usr,
5503 prs_struct *ps, int depth)
5505 if (usr == NULL)
5506 return False;
5508 prs_debug(ps, depth, desc, "samr_io_r_user_info9");
5509 depth++;
5511 if(!prs_align(ps))
5512 return False;
5514 if(!prs_uint32("rid_group", ps, depth, &usr->rid_group))
5515 return False;
5517 return True;
5520 /*******************************************************************
5521 inits a SAM_USER_INFO_16 structure.
5522 ********************************************************************/
5524 void init_sam_user_info16(SAM_USER_INFO_16 * usr, uint32 acb_info)
5526 DEBUG(5, ("init_sam_user_info16\n"));
5528 usr->acb_info = acb_info;
5531 /*******************************************************************
5532 reads or writes a structure.
5533 ********************************************************************/
5535 static BOOL sam_io_user_info16(const char *desc, SAM_USER_INFO_16 * usr,
5536 prs_struct *ps, int depth)
5538 if (usr == NULL)
5539 return False;
5541 prs_debug(ps, depth, desc, "samr_io_r_user_info16");
5542 depth++;
5544 if(!prs_align(ps))
5545 return False;
5547 if(!prs_uint32("acb_info", ps, depth, &usr->acb_info))
5548 return False;
5550 return True;
5553 /*******************************************************************
5554 inits a SAM_USER_INFO_17 structure.
5555 ********************************************************************/
5557 void init_sam_user_info17(SAM_USER_INFO_17 * usr,
5558 NTTIME * expiry,
5559 char *mach_acct,
5560 uint32 rid_user, uint32 rid_group, uint16 acct_ctrl)
5562 DEBUG(5, ("init_sam_user_info17\n"));
5564 memcpy(&usr->expiry, expiry, sizeof(usr->expiry)); /* expiry time or something? */
5565 ZERO_STRUCT(usr->padding_1); /* 0 - padding 24 bytes */
5567 usr->padding_2 = 0; /* 0 - padding 4 bytes */
5569 usr->ptr_1 = 1; /* pointer */
5570 ZERO_STRUCT(usr->padding_3); /* 0 - padding 32 bytes */
5571 usr->padding_4 = 0; /* 0 - padding 4 bytes */
5573 usr->ptr_2 = 1; /* pointer */
5574 usr->padding_5 = 0; /* 0 - padding 4 bytes */
5576 usr->ptr_3 = 1; /* pointer */
5577 ZERO_STRUCT(usr->padding_6); /* 0 - padding 32 bytes */
5579 usr->rid_user = rid_user;
5580 usr->rid_group = rid_group;
5582 usr->acct_ctrl = acct_ctrl;
5583 usr->unknown_3 = 0x0000;
5585 usr->unknown_4 = 0x003f; /* 0x003f - 16 bit unknown */
5586 usr->unknown_5 = 0x003c; /* 0x003c - 16 bit unknown */
5588 ZERO_STRUCT(usr->padding_7); /* 0 - padding 16 bytes */
5589 usr->padding_8 = 0; /* 0 - padding 4 bytes */
5591 init_unistr2(&usr->uni_mach_acct, mach_acct, UNI_FLAGS_NONE); /* unicode string for machine account */
5592 init_uni_hdr(&usr->hdr_mach_acct, &usr->uni_mach_acct); /* unicode header for machine account */
5595 /*******************************************************************
5596 reads or writes a structure.
5597 ********************************************************************/
5599 static BOOL sam_io_user_info17(const char *desc, SAM_USER_INFO_17 * usr,
5600 prs_struct *ps, int depth)
5602 if (usr == NULL)
5603 return False;
5605 prs_debug(ps, depth, desc, "samr_io_r_unknown_17");
5606 depth++;
5608 if(!prs_align(ps))
5609 return False;
5611 if(!prs_uint8s(False, "padding_0", ps, depth, usr->padding_0, sizeof(usr->padding_0)))
5612 return False;
5614 if(!smb_io_time("time", &usr->expiry, ps, depth))
5615 return False;
5617 if(!prs_uint8s(False, "padding_1", ps, depth, usr->padding_1, sizeof(usr->padding_1)))
5618 return False;
5620 if(!smb_io_unihdr("unihdr", &usr->hdr_mach_acct, ps, depth))
5621 return False;
5623 if(!prs_uint32("padding_2", ps, depth, &usr->padding_2))
5624 return False;
5626 if(!prs_uint32("ptr_1 ", ps, depth, &usr->ptr_1))
5627 return False;
5628 if(!prs_uint8s(False, "padding_3", ps, depth, usr->padding_3, sizeof(usr->padding_3)))
5629 return False;
5631 if(!prs_uint32("padding_4", ps, depth, &usr->padding_4))
5632 return False;
5634 if(!prs_uint32("ptr_2 ", ps, depth, &usr->ptr_2))
5635 return False;
5636 if(!prs_uint32("padding_5", ps, depth, &usr->padding_5))
5637 return False;
5639 if(!prs_uint32("ptr_3 ", ps, depth, &usr->ptr_3))
5640 return False;
5641 if(!prs_uint8s(False, "padding_6", ps, depth, usr->padding_6,sizeof(usr->padding_6)))
5642 return False;
5644 if(!prs_uint32("rid_user ", ps, depth, &usr->rid_user))
5645 return False;
5646 if(!prs_uint32("rid_group", ps, depth, &usr->rid_group))
5647 return False;
5648 if(!prs_uint16("acct_ctrl", ps, depth, &usr->acct_ctrl))
5649 return False;
5650 if(!prs_uint16("unknown_3", ps, depth, &usr->unknown_3))
5651 return False;
5652 if(!prs_uint16("unknown_4", ps, depth, &usr->unknown_4))
5653 return False;
5654 if(!prs_uint16("unknown_5", ps, depth, &usr->unknown_5))
5655 return False;
5657 if(!prs_uint8s(False, "padding_7", ps, depth, usr->padding_7, sizeof(usr->padding_7)))
5658 return False;
5660 if(!prs_uint32("padding_8", ps, depth, &(usr->padding_8)))
5661 return False;
5663 if(!smb_io_unistr2("unistr2", &usr->uni_mach_acct, True, ps, depth))
5664 return False;
5666 if(!prs_align(ps))
5667 return False;
5669 if(!prs_uint8s(False, "padding_9", ps, depth, usr->padding_9, sizeof(usr->padding_9)))
5670 return False;
5672 return True;
5675 /*************************************************************************
5676 init_sam_user_infoa
5677 *************************************************************************/
5679 void init_sam_user_info24(SAM_USER_INFO_24 * usr, char newpass[516],
5680 uint8 pw_len)
5682 DEBUG(10, ("init_sam_user_info24:\n"));
5683 memcpy(usr->pass, newpass, sizeof(usr->pass));
5684 usr->pw_len = pw_len;
5687 /*******************************************************************
5688 reads or writes a structure.
5689 ********************************************************************/
5691 static BOOL sam_io_user_info24(const char *desc, SAM_USER_INFO_24 * usr,
5692 prs_struct *ps, int depth)
5694 if (usr == NULL)
5695 return False;
5697 prs_debug(ps, depth, desc, "sam_io_user_info24");
5698 depth++;
5700 if(!prs_align(ps))
5701 return False;
5703 if(!prs_uint8s(False, "password", ps, depth, usr->pass,
5704 sizeof(usr->pass)))
5705 return False;
5707 if (MARSHALLING(ps) && (usr->pw_len != 0)) {
5708 if (!prs_uint8("pw_len", ps, depth, &usr->pw_len))
5709 return False;
5710 } else if (UNMARSHALLING(ps)) {
5711 if (!prs_uint8("pw_len", ps, depth, &usr->pw_len))
5712 return False;
5715 return True;
5718 /*******************************************************************
5719 reads or writes a structure.
5720 ********************************************************************/
5722 static BOOL sam_io_user_info26(const char *desc, SAM_USER_INFO_26 * usr,
5723 prs_struct *ps, int depth)
5725 if (usr == NULL)
5726 return False;
5728 prs_debug(ps, depth, desc, "sam_io_user_info26");
5729 depth++;
5731 if(!prs_align(ps))
5732 return False;
5734 if(!prs_uint8s(False, "password", ps, depth, usr->pass,
5735 sizeof(usr->pass)))
5736 return False;
5738 if (!prs_uint8("pw_len", ps, depth, &usr->pw_len))
5739 return False;
5741 return True;
5745 /*************************************************************************
5746 init_sam_user_info23
5748 unknown_6 = 0x0000 04ec
5750 *************************************************************************/
5752 void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */
5753 NTTIME * logoff_time, /* all zeros */
5754 NTTIME * kickoff_time, /* all zeros */
5755 NTTIME * pass_last_set_time, /* all zeros */
5756 NTTIME * pass_can_change_time, /* all zeros */
5757 NTTIME * pass_must_change_time, /* all zeros */
5758 UNISTR2 *user_name,
5759 UNISTR2 *full_name,
5760 UNISTR2 *home_dir,
5761 UNISTR2 *dir_drive,
5762 UNISTR2 *log_scr,
5763 UNISTR2 *prof_path,
5764 UNISTR2 *desc,
5765 UNISTR2 *wkstas,
5766 UNISTR2 *unk_str,
5767 UNISTR2 *mung_dial,
5768 uint32 user_rid, /* 0x0000 0000 */
5769 uint32 group_rid,
5770 uint32 acb_info,
5771 uint32 fields_present,
5772 uint16 logon_divs,
5773 LOGON_HRS * hrs,
5774 uint16 bad_password_count,
5775 uint16 logon_count,
5776 char newpass[516])
5778 usr->logon_time = *logon_time; /* all zeros */
5779 usr->logoff_time = *logoff_time; /* all zeros */
5780 usr->kickoff_time = *kickoff_time; /* all zeros */
5781 usr->pass_last_set_time = *pass_last_set_time; /* all zeros */
5782 usr->pass_can_change_time = *pass_can_change_time; /* all zeros */
5783 usr->pass_must_change_time = *pass_must_change_time; /* all zeros */
5785 ZERO_STRUCT(usr->nt_pwd);
5786 ZERO_STRUCT(usr->lm_pwd);
5788 usr->user_rid = user_rid; /* 0x0000 0000 */
5789 usr->group_rid = group_rid;
5790 usr->acb_info = acb_info;
5791 usr->fields_present = fields_present; /* 09f8 27fa */
5793 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5794 usr->ptr_logon_hrs = hrs ? 1 : 0;
5796 if (nt_time_is_zero(pass_must_change_time)) {
5797 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
5798 } else {
5799 usr->passmustchange=0;
5802 ZERO_STRUCT(usr->padding1);
5803 ZERO_STRUCT(usr->padding2);
5805 usr->bad_password_count = bad_password_count;
5806 usr->logon_count = logon_count;
5808 memcpy(usr->pass, newpass, sizeof(usr->pass));
5810 copy_unistr2(&usr->uni_user_name, user_name);
5811 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
5813 copy_unistr2(&usr->uni_full_name, full_name);
5814 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
5816 copy_unistr2(&usr->uni_home_dir, home_dir);
5817 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
5819 copy_unistr2(&usr->uni_dir_drive, dir_drive);
5820 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
5822 copy_unistr2(&usr->uni_logon_script, log_scr);
5823 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
5825 copy_unistr2(&usr->uni_profile_path, prof_path);
5826 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
5828 copy_unistr2(&usr->uni_acct_desc, desc);
5829 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
5831 copy_unistr2(&usr->uni_workstations, wkstas);
5832 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
5834 copy_unistr2(&usr->uni_comment, unk_str);
5835 init_uni_hdr(&usr->hdr_comment, &usr->uni_comment);
5837 copy_unistr2(&usr->uni_munged_dial, mung_dial);
5838 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
5840 if (hrs) {
5841 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
5842 } else {
5843 ZERO_STRUCT(usr->logon_hrs);
5847 /*************************************************************************
5848 init_sam_user_info23
5850 unknown_6 = 0x0000 04ec
5852 *************************************************************************/
5854 void init_sam_user_info23A(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */
5855 NTTIME * logoff_time, /* all zeros */
5856 NTTIME * kickoff_time, /* all zeros */
5857 NTTIME * pass_last_set_time, /* all zeros */
5858 NTTIME * pass_can_change_time, /* all zeros */
5859 NTTIME * pass_must_change_time, /* all zeros */
5860 char *user_name, /* NULL */
5861 char *full_name,
5862 char *home_dir, char *dir_drive, char *log_scr,
5863 char *prof_path, const char *desc, char *wkstas,
5864 char *unk_str, char *mung_dial, uint32 user_rid, /* 0x0000 0000 */
5865 uint32 group_rid, uint32 acb_info,
5866 uint32 fields_present, uint16 logon_divs,
5867 LOGON_HRS * hrs, uint16 bad_password_count, uint16 logon_count,
5868 char newpass[516])
5870 DATA_BLOB blob = base64_decode_data_blob(mung_dial);
5872 usr->logon_time = *logon_time; /* all zeros */
5873 usr->logoff_time = *logoff_time; /* all zeros */
5874 usr->kickoff_time = *kickoff_time; /* all zeros */
5875 usr->pass_last_set_time = *pass_last_set_time; /* all zeros */
5876 usr->pass_can_change_time = *pass_can_change_time; /* all zeros */
5877 usr->pass_must_change_time = *pass_must_change_time; /* all zeros */
5879 ZERO_STRUCT(usr->nt_pwd);
5880 ZERO_STRUCT(usr->lm_pwd);
5882 usr->user_rid = user_rid; /* 0x0000 0000 */
5883 usr->group_rid = group_rid;
5884 usr->acb_info = acb_info;
5885 usr->fields_present = fields_present; /* 09f8 27fa */
5887 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
5888 usr->ptr_logon_hrs = hrs ? 1 : 0;
5890 if (nt_time_is_zero(pass_must_change_time)) {
5891 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
5892 } else {
5893 usr->passmustchange=0;
5896 ZERO_STRUCT(usr->padding1);
5897 ZERO_STRUCT(usr->padding2);
5899 usr->bad_password_count = bad_password_count;
5900 usr->logon_count = logon_count;
5902 memcpy(usr->pass, newpass, sizeof(usr->pass));
5904 init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
5905 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
5907 init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
5908 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
5910 init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
5911 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
5913 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
5914 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
5916 init_unistr2(&usr->uni_logon_script, log_scr, UNI_FLAGS_NONE);
5917 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
5919 init_unistr2(&usr->uni_profile_path, prof_path, UNI_FLAGS_NONE);
5920 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
5922 init_unistr2(&usr->uni_acct_desc, desc, UNI_FLAGS_NONE);
5923 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
5925 init_unistr2(&usr->uni_workstations, wkstas, UNI_FLAGS_NONE);
5926 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
5928 init_unistr2(&usr->uni_comment, unk_str, UNI_FLAGS_NONE);
5929 init_uni_hdr(&usr->hdr_comment, &usr->uni_comment);
5931 init_unistr2_from_datablob(&usr->uni_munged_dial, &blob);
5932 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
5934 data_blob_free(&blob);
5936 if (hrs) {
5937 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
5938 } else {
5939 ZERO_STRUCT(usr->logon_hrs);
5944 /*************************************************************************
5945 init_samr_user_info25P
5946 fields_present = ACCT_NT_PWD_SET | ACCT_LM_PWD_SET | ACCT_FLAGS
5947 *************************************************************************/
5949 void init_sam_user_info25P(SAM_USER_INFO_25 * usr,
5950 uint32 fields_present, uint32 acb_info,
5951 char newpass[532])
5953 usr->fields_present = fields_present;
5954 ZERO_STRUCT(usr->padding1);
5955 ZERO_STRUCT(usr->padding2);
5957 usr->acb_info = acb_info;
5958 memcpy(usr->pass, newpass, sizeof(usr->pass));
5962 /*******************************************************************
5963 reads or writes a structure.
5964 ********************************************************************/
5966 static BOOL sam_io_user_info23(const char *desc, SAM_USER_INFO_23 * usr,
5967 prs_struct *ps, int depth)
5969 if (usr == NULL)
5970 return False;
5972 prs_debug(ps, depth, desc, "sam_io_user_info23");
5973 depth++;
5975 if(!prs_align(ps))
5976 return False;
5978 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
5979 return False;
5980 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
5981 return False;
5982 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
5983 return False;
5984 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth))
5985 return False;
5986 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth))
5987 return False;
5988 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
5989 return False;
5991 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
5992 return False;
5993 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
5994 return False;
5995 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
5996 return False;
5997 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
5998 return False;
5999 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
6000 return False;
6001 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
6002 return False;
6003 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
6004 return False;
6005 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
6006 return False;
6007 if(!smb_io_unihdr("hdr_comment ", &usr->hdr_comment, ps, depth)) /* unknown string */
6008 return False;
6009 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
6010 return False;
6012 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
6013 return False;
6014 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
6015 return False;
6017 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
6018 return False;
6019 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
6020 return False;
6021 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
6022 return False;
6024 if(!prs_uint32("fields_present ", ps, depth, &usr->fields_present))
6025 return False;
6026 if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */
6027 return False;
6028 if(!prs_align(ps))
6029 return False;
6030 if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs))
6031 return False;
6033 if(!prs_uint16("bad_password_count ", ps, depth, &usr->bad_password_count))
6034 return False;
6035 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count))
6036 return False;
6038 if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1)))
6039 return False;
6040 if(!prs_uint8("passmustchange ", ps, depth, &usr->passmustchange))
6041 return False;
6042 if(!prs_uint8("padding2 ", ps, depth, &usr->padding2))
6043 return False;
6046 if(!prs_uint8s(False, "password ", ps, depth, usr->pass, sizeof(usr->pass)))
6047 return False;
6049 /* here begins pointed-to data */
6051 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
6052 return False;
6054 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
6055 return False;
6057 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
6058 return False;
6060 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
6061 return False;
6063 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
6064 return False;
6066 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
6067 return False;
6069 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
6070 return False;
6072 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
6073 return False;
6075 if(!smb_io_unistr2("uni_comment ", &usr->uni_comment, usr->hdr_comment.buffer, ps, depth)) /* unknown string */
6076 return False;
6078 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth))
6079 return False;
6081 /* ok, this is only guess-work (as usual) */
6082 if (usr->ptr_logon_hrs) {
6083 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
6084 return False;
6087 return True;
6090 /*******************************************************************
6091 reads or writes a structure.
6092 NB. This structure is *definately* incorrect. It's my best guess
6093 currently for W2K SP2. The password field is encrypted in a different
6094 way than normal... And there are definately other problems. JRA.
6095 ********************************************************************/
6097 static BOOL sam_io_user_info25(const char *desc, SAM_USER_INFO_25 * usr, prs_struct *ps, int depth)
6099 if (usr == NULL)
6100 return False;
6102 prs_debug(ps, depth, desc, "sam_io_user_info25");
6103 depth++;
6105 if(!prs_align(ps))
6106 return False;
6108 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
6109 return False;
6110 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
6111 return False;
6112 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
6113 return False;
6114 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps, depth))
6115 return False;
6116 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps, depth))
6117 return False;
6118 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
6119 return False;
6121 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
6122 return False;
6123 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
6124 return False;
6125 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
6126 return False;
6127 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
6128 return False;
6129 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
6130 return False;
6131 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
6132 return False;
6133 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
6134 return False;
6135 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
6136 return False;
6137 if(!smb_io_unihdr("hdr_comment ", &usr->hdr_comment, ps, depth)) /* unknown string */
6138 return False;
6139 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
6140 return False;
6142 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
6143 return False;
6144 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
6145 return False;
6147 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
6148 return False;
6149 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
6150 return False;
6151 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
6152 return False;
6153 if(!prs_uint32("fields_present ", ps, depth, &usr->fields_present))
6154 return False;
6156 if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */
6157 return False;
6158 if(!prs_align(ps))
6159 return False;
6160 if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs))
6161 return False;
6163 if(!prs_uint16("bad_password_count ", ps, depth, &usr->bad_password_count))
6164 return False;
6165 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count))
6166 return False;
6168 if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1)))
6169 return False;
6170 if(!prs_uint8("passmustchange ", ps, depth, &usr->passmustchange))
6171 return False;
6172 if(!prs_uint8("padding2 ", ps, depth, &usr->padding2))
6173 return False;
6176 if(!prs_uint8s(False, "password ", ps, depth, usr->pass, sizeof(usr->pass)))
6177 return False;
6179 /* here begins pointed-to data */
6181 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
6182 return False;
6184 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
6185 return False;
6187 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
6188 return False;
6190 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
6191 return False;
6193 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
6194 return False;
6196 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
6197 return False;
6199 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth)) /* user desc unicode string */
6200 return False;
6202 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth)) /* worksations user can log on from */
6203 return False;
6205 if(!smb_io_unistr2("uni_comment ", &usr->uni_comment, usr->hdr_comment.buffer, ps, depth)) /* unknown string */
6206 return False;
6208 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial, usr->hdr_munged_dial.buffer, ps, depth))
6209 return False;
6211 /* ok, this is only guess-work (as usual) */
6212 if (usr->ptr_logon_hrs) {
6213 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
6214 return False;
6217 return True;
6221 /*************************************************************************
6222 init_sam_user_info21W
6224 unknown_6 = 0x0000 04ec
6226 *************************************************************************/
6228 void init_sam_user_info21W(SAM_USER_INFO_21 * usr,
6229 NTTIME * logon_time,
6230 NTTIME * logoff_time,
6231 NTTIME * kickoff_time,
6232 NTTIME * pass_last_set_time,
6233 NTTIME * pass_can_change_time,
6234 NTTIME * pass_must_change_time,
6235 UNISTR2 *user_name,
6236 UNISTR2 *full_name,
6237 UNISTR2 *home_dir,
6238 UNISTR2 *dir_drive,
6239 UNISTR2 *log_scr,
6240 UNISTR2 *prof_path,
6241 UNISTR2 *desc,
6242 UNISTR2 *wkstas,
6243 UNISTR2 *unk_str,
6244 UNISTR2 *mung_dial,
6245 uchar lm_pwd[16],
6246 uchar nt_pwd[16],
6247 uint32 user_rid,
6248 uint32 group_rid,
6249 uint32 acb_info,
6250 uint32 fields_present,
6251 uint16 logon_divs,
6252 LOGON_HRS * hrs,
6253 uint16 bad_password_count,
6254 uint16 logon_count)
6256 usr->logon_time = *logon_time;
6257 usr->logoff_time = *logoff_time;
6258 usr->kickoff_time = *kickoff_time;
6259 usr->pass_last_set_time = *pass_last_set_time;
6260 usr->pass_can_change_time = *pass_can_change_time;
6261 usr->pass_must_change_time = *pass_must_change_time;
6263 memcpy(usr->lm_pwd, lm_pwd, sizeof(usr->lm_pwd));
6264 memcpy(usr->nt_pwd, nt_pwd, sizeof(usr->nt_pwd));
6266 usr->user_rid = user_rid;
6267 usr->group_rid = group_rid;
6268 usr->acb_info = acb_info;
6269 usr->fields_present = fields_present; /* 0x00ff ffff */
6271 usr->logon_divs = logon_divs; /* should be 168 (hours/week) */
6272 usr->ptr_logon_hrs = hrs ? 1 : 0;
6273 usr->bad_password_count = bad_password_count;
6274 usr->logon_count = logon_count;
6276 if (nt_time_is_zero(pass_must_change_time)) {
6277 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
6278 } else {
6279 usr->passmustchange=0;
6282 ZERO_STRUCT(usr->padding1);
6283 ZERO_STRUCT(usr->padding2);
6285 copy_unistr2(&usr->uni_user_name, user_name);
6286 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
6288 copy_unistr2(&usr->uni_full_name, full_name);
6289 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
6291 copy_unistr2(&usr->uni_home_dir, home_dir);
6292 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
6294 copy_unistr2(&usr->uni_dir_drive, dir_drive);
6295 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
6297 copy_unistr2(&usr->uni_logon_script, log_scr);
6298 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
6300 copy_unistr2(&usr->uni_profile_path, prof_path);
6301 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
6303 copy_unistr2(&usr->uni_acct_desc, desc);
6304 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
6306 copy_unistr2(&usr->uni_workstations, wkstas);
6307 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
6309 copy_unistr2(&usr->uni_comment, unk_str);
6310 init_uni_hdr(&usr->hdr_comment, &usr->uni_comment);
6312 copy_unistr2(&usr->uni_munged_dial, mung_dial);
6313 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
6315 if (hrs) {
6316 memcpy(&usr->logon_hrs, hrs, sizeof(usr->logon_hrs));
6317 } else {
6318 ZERO_STRUCT(usr->logon_hrs);
6322 /*************************************************************************
6323 init_sam_user_info21
6325 unknown_6 = 0x0000 04ec
6327 *************************************************************************/
6329 NTSTATUS init_sam_user_info21A(SAM_USER_INFO_21 *usr, struct samu *pw, DOM_SID *domain_sid)
6331 NTTIME logon_time, logoff_time, kickoff_time,
6332 pass_last_set_time, pass_can_change_time,
6333 pass_must_change_time;
6335 time_t must_change_time;
6336 const char* user_name = pdb_get_username(pw);
6337 const char* full_name = pdb_get_fullname(pw);
6338 const char* home_dir = pdb_get_homedir(pw);
6339 const char* dir_drive = pdb_get_dir_drive(pw);
6340 const char* logon_script = pdb_get_logon_script(pw);
6341 const char* profile_path = pdb_get_profile_path(pw);
6342 const char* description = pdb_get_acct_desc(pw);
6343 const char* workstations = pdb_get_workstations(pw);
6344 const char* munged_dial = pdb_get_munged_dial(pw);
6345 DATA_BLOB munged_dial_blob;
6347 uint32 user_rid;
6348 const DOM_SID *user_sid;
6350 uint32 group_rid;
6351 const DOM_SID *group_sid;
6353 if (munged_dial) {
6354 munged_dial_blob = base64_decode_data_blob(munged_dial);
6355 } else {
6356 munged_dial_blob = data_blob_null;
6359 /* Create NTTIME structs */
6360 unix_to_nt_time (&logon_time, pdb_get_logon_time(pw));
6361 unix_to_nt_time (&logoff_time, pdb_get_logoff_time(pw));
6362 unix_to_nt_time (&kickoff_time, pdb_get_kickoff_time(pw));
6363 unix_to_nt_time (&pass_last_set_time, pdb_get_pass_last_set_time(pw));
6364 unix_to_nt_time (&pass_can_change_time,pdb_get_pass_can_change_time(pw));
6365 must_change_time = pdb_get_pass_must_change_time(pw);
6366 if (must_change_time == get_time_t_max())
6367 unix_to_nt_time_abs(&pass_must_change_time, must_change_time);
6368 else
6369 unix_to_nt_time(&pass_must_change_time, must_change_time);
6371 /* structure assignment */
6372 usr->logon_time = logon_time;
6373 usr->logoff_time = logoff_time;
6374 usr->kickoff_time = kickoff_time;
6375 usr->pass_last_set_time = pass_last_set_time;
6376 usr->pass_can_change_time = pass_can_change_time;
6377 usr->pass_must_change_time = pass_must_change_time;
6379 ZERO_STRUCT(usr->nt_pwd);
6380 ZERO_STRUCT(usr->lm_pwd);
6382 user_sid = pdb_get_user_sid(pw);
6384 if (!sid_peek_check_rid(domain_sid, user_sid, &user_rid)) {
6385 fstring user_sid_string;
6386 fstring domain_sid_string;
6387 DEBUG(0, ("init_sam_user_info_21A: User %s has SID %s, \nwhich conflicts with "
6388 "the domain sid %s. Failing operation.\n",
6389 user_name,
6390 sid_to_string(user_sid_string, user_sid),
6391 sid_to_string(domain_sid_string, domain_sid)));
6392 data_blob_free(&munged_dial_blob);
6393 return NT_STATUS_UNSUCCESSFUL;
6396 become_root();
6397 group_sid = pdb_get_group_sid(pw);
6398 unbecome_root();
6400 if (!sid_peek_check_rid(domain_sid, group_sid, &group_rid)) {
6401 fstring group_sid_string;
6402 fstring domain_sid_string;
6403 DEBUG(0, ("init_sam_user_info_21A: User %s has Primary Group SID %s, \n"
6404 "which conflicts with the domain sid %s. Failing operation.\n",
6405 user_name,
6406 sid_to_string(group_sid_string, group_sid),
6407 sid_to_string(domain_sid_string, domain_sid)));
6408 data_blob_free(&munged_dial_blob);
6409 return NT_STATUS_UNSUCCESSFUL;
6412 usr->user_rid = user_rid;
6413 usr->group_rid = group_rid;
6414 usr->acb_info = pdb_get_acct_ctrl(pw);
6417 Look at a user on a real NT4 PDC with usrmgr, press
6418 'ok'. Then you will see that fields_present is set to
6419 0x08f827fa. Look at the user immediately after that again,
6420 and you will see that 0x00fffff is returned. This solves
6421 the problem that you get access denied after having looked
6422 at the user.
6423 -- Volker
6425 usr->fields_present = pdb_build_fields_present(pw);
6427 usr->logon_divs = pdb_get_logon_divs(pw);
6428 usr->ptr_logon_hrs = pdb_get_hours(pw) ? 1 : 0;
6429 usr->bad_password_count = pdb_get_bad_password_count(pw);
6430 usr->logon_count = pdb_get_logon_count(pw);
6432 if (pdb_get_pass_must_change_time(pw) == 0) {
6433 usr->passmustchange=PASS_MUST_CHANGE_AT_NEXT_LOGON;
6434 } else {
6435 usr->passmustchange=0;
6438 ZERO_STRUCT(usr->padding1);
6439 ZERO_STRUCT(usr->padding2);
6441 init_unistr2(&usr->uni_user_name, user_name, UNI_STR_TERMINATE);
6442 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
6444 init_unistr2(&usr->uni_full_name, full_name, UNI_STR_TERMINATE);
6445 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
6447 init_unistr2(&usr->uni_home_dir, home_dir, UNI_STR_TERMINATE);
6448 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
6450 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_STR_TERMINATE);
6451 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
6453 init_unistr2(&usr->uni_logon_script, logon_script, UNI_STR_TERMINATE);
6454 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
6456 init_unistr2(&usr->uni_profile_path, profile_path, UNI_STR_TERMINATE);
6457 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
6459 init_unistr2(&usr->uni_acct_desc, description, UNI_STR_TERMINATE);
6460 init_uni_hdr(&usr->hdr_acct_desc, &usr->uni_acct_desc);
6462 init_unistr2(&usr->uni_workstations, workstations, UNI_STR_TERMINATE);
6463 init_uni_hdr(&usr->hdr_workstations, &usr->uni_workstations);
6465 init_unistr2(&usr->uni_comment, NULL, UNI_STR_TERMINATE);
6466 init_uni_hdr(&usr->hdr_comment, &usr->uni_comment);
6468 init_unistr2_from_datablob(&usr->uni_munged_dial, &munged_dial_blob);
6469 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
6470 data_blob_free(&munged_dial_blob);
6472 if (pdb_get_hours(pw)) {
6473 usr->logon_hrs.max_len = 1260;
6474 usr->logon_hrs.offset = 0;
6475 usr->logon_hrs.len = pdb_get_hours_len(pw);
6476 memcpy(&usr->logon_hrs.hours, pdb_get_hours(pw), MAX_HOURS_LEN);
6477 } else {
6478 usr->logon_hrs.max_len = 1260;
6479 usr->logon_hrs.offset = 0;
6480 usr->logon_hrs.len = 0;
6481 memset(&usr->logon_hrs, 0xff, sizeof(usr->logon_hrs));
6484 return NT_STATUS_OK;
6487 /*******************************************************************
6488 reads or writes a structure.
6489 ********************************************************************/
6491 static BOOL sam_io_user_info21(const char *desc, SAM_USER_INFO_21 * usr,
6492 prs_struct *ps, int depth)
6494 if (usr == NULL)
6495 return False;
6497 prs_debug(ps, depth, desc, "sam_io_user_info21");
6498 depth++;
6500 if(!prs_align(ps))
6501 return False;
6503 if(!smb_io_time("logon_time ", &usr->logon_time, ps, depth))
6504 return False;
6505 if(!smb_io_time("logoff_time ", &usr->logoff_time, ps, depth))
6506 return False;
6507 if(!smb_io_time("pass_last_set_time ", &usr->pass_last_set_time, ps,depth))
6508 return False;
6509 if(!smb_io_time("kickoff_time ", &usr->kickoff_time, ps, depth))
6510 return False;
6511 if(!smb_io_time("pass_can_change_time ", &usr->pass_can_change_time, ps,depth))
6512 return False;
6513 if(!smb_io_time("pass_must_change_time", &usr->pass_must_change_time, ps, depth))
6514 return False;
6516 if(!smb_io_unihdr("hdr_user_name ", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
6517 return False;
6518 if(!smb_io_unihdr("hdr_full_name ", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
6519 return False;
6520 if(!smb_io_unihdr("hdr_home_dir ", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
6521 return False;
6522 if(!smb_io_unihdr("hdr_dir_drive ", &usr->hdr_dir_drive, ps, depth)) /* home directory drive */
6523 return False;
6524 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
6525 return False;
6526 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
6527 return False;
6528 if(!smb_io_unihdr("hdr_acct_desc ", &usr->hdr_acct_desc, ps, depth)) /* account desc */
6529 return False;
6530 if(!smb_io_unihdr("hdr_workstations", &usr->hdr_workstations, ps, depth)) /* wkstas user can log on from */
6531 return False;
6532 if(!smb_io_unihdr("hdr_comment ", &usr->hdr_comment, ps, depth)) /* unknown string */
6533 return False;
6534 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
6535 return False;
6537 if(!prs_uint8s(False, "lm_pwd ", ps, depth, usr->lm_pwd, sizeof(usr->lm_pwd)))
6538 return False;
6539 if(!prs_uint8s(False, "nt_pwd ", ps, depth, usr->nt_pwd, sizeof(usr->nt_pwd)))
6540 return False;
6542 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User ID */
6543 return False;
6544 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group ID */
6545 return False;
6546 if(!prs_uint32("acb_info ", ps, depth, &usr->acb_info))
6547 return False;
6549 if(!prs_uint32("fields_present ", ps, depth, &usr->fields_present))
6550 return False;
6551 if(!prs_uint16("logon_divs ", ps, depth, &usr->logon_divs)) /* logon divisions per week */
6552 return False;
6553 if(!prs_align(ps))
6554 return False;
6555 if(!prs_uint32("ptr_logon_hrs ", ps, depth, &usr->ptr_logon_hrs))
6556 return False;
6558 if(!prs_uint16("bad_password_count ", ps, depth, &usr->bad_password_count))
6559 return False;
6560 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count))
6561 return False;
6563 if(!prs_uint8s(False, "padding1 ", ps, depth, usr->padding1, sizeof(usr->padding1)))
6564 return False;
6565 if(!prs_uint8("passmustchange ", ps, depth, &usr->passmustchange))
6566 return False;
6567 if(!prs_uint8("padding2 ", ps, depth, &usr->padding2))
6568 return False;
6570 /* here begins pointed-to data */
6572 if(!smb_io_unistr2("uni_user_name ", &usr->uni_user_name,usr->hdr_user_name.buffer, ps, depth))
6573 return False;
6574 if(!smb_io_unistr2("uni_full_name ", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth))
6575 return False;
6576 if(!smb_io_unistr2("uni_home_dir ", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth))
6577 return False;
6578 if(!smb_io_unistr2("uni_dir_drive ", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth))
6579 return False;
6580 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth))
6581 return False;
6582 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth))
6583 return False;
6584 if(!smb_io_unistr2("uni_acct_desc ", &usr->uni_acct_desc, usr->hdr_acct_desc.buffer, ps, depth))
6585 return False;
6586 if(!smb_io_unistr2("uni_workstations", &usr->uni_workstations, usr->hdr_workstations.buffer, ps, depth))
6587 return False;
6588 if(!smb_io_unistr2("uni_comment", &usr->uni_comment, usr->hdr_comment.buffer, ps, depth))
6589 return False;
6590 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial,usr->hdr_munged_dial.buffer, ps, depth))
6591 return False;
6593 /* ok, this is only guess-work (as usual) */
6594 if (usr->ptr_logon_hrs) {
6595 if(!sam_io_logon_hrs("logon_hrs", &usr->logon_hrs, ps, depth))
6596 return False;
6599 return True;
6602 void init_sam_user_info20A(SAM_USER_INFO_20 *usr, struct samu *pw)
6604 const char *munged_dial = pdb_get_munged_dial(pw);
6605 DATA_BLOB blob;
6607 if (munged_dial) {
6608 blob = base64_decode_data_blob(munged_dial);
6609 } else {
6610 blob = data_blob_null;
6613 init_unistr2_from_datablob(&usr->uni_munged_dial, &blob);
6614 init_uni_hdr(&usr->hdr_munged_dial, &usr->uni_munged_dial);
6615 data_blob_free(&blob);
6618 /*******************************************************************
6619 reads or writes a structure.
6620 ********************************************************************/
6622 static BOOL sam_io_user_info20(const char *desc, SAM_USER_INFO_20 *usr,
6623 prs_struct *ps, int depth)
6625 if (usr == NULL)
6626 return False;
6628 prs_debug(ps, depth, desc, "sam_io_user_info20");
6629 depth++;
6631 if(!prs_align(ps))
6632 return False;
6634 if(!smb_io_unihdr("hdr_munged_dial ", &usr->hdr_munged_dial, ps, depth)) /* wkstas user can log on from */
6635 return False;
6637 if(!smb_io_unistr2("uni_munged_dial ", &usr->uni_munged_dial,usr->hdr_munged_dial.buffer, ps, depth)) /* worksations user can log on from */
6638 return False;
6640 return True;
6643 /*******************************************************************
6644 inits a SAM_USERINFO_CTR structure.
6645 ********************************************************************/
6647 NTSTATUS make_samr_userinfo_ctr_usr21(TALLOC_CTX *ctx, SAM_USERINFO_CTR * ctr,
6648 uint16 switch_value,
6649 SAM_USER_INFO_21 * usr)
6651 DEBUG(5, ("make_samr_userinfo_ctr_usr21\n"));
6653 ctr->switch_value = switch_value;
6654 ctr->info.id = NULL;
6656 switch (switch_value) {
6657 case 16:
6658 ctr->info.id16 = TALLOC_ZERO_P(ctx,SAM_USER_INFO_16);
6659 if (ctr->info.id16 == NULL)
6660 return NT_STATUS_NO_MEMORY;
6662 init_sam_user_info16(ctr->info.id16, usr->acb_info);
6663 break;
6664 #if 0
6665 /* whoops - got this wrong. i think. or don't understand what's happening. */
6666 case 17:
6668 NTTIME expire;
6669 info = (void *)&id11;
6671 expire.low = 0xffffffff;
6672 expire.high = 0x7fffffff;
6674 ctr->info.id = TALLOC_ZERO_P(ctx,SAM_USER_INFO_17);
6675 init_sam_user_info11(ctr->info.id17, &expire,
6676 "BROOKFIELDS$", /* name */
6677 0x03ef, /* user rid */
6678 0x201, /* group rid */
6679 0x0080); /* acb info */
6681 break;
6683 #endif
6684 case 18:
6685 ctr->info.id18 = TALLOC_ZERO_P(ctx,SAM_USER_INFO_18);
6686 if (ctr->info.id18 == NULL)
6687 return NT_STATUS_NO_MEMORY;
6689 init_sam_user_info18(ctr->info.id18, usr->lm_pwd, usr->nt_pwd);
6690 break;
6691 case 21:
6693 SAM_USER_INFO_21 *cusr;
6694 cusr = TALLOC_ZERO_P(ctx,SAM_USER_INFO_21);
6695 ctr->info.id21 = cusr;
6696 if (ctr->info.id21 == NULL)
6697 return NT_STATUS_NO_MEMORY;
6698 memcpy(cusr, usr, sizeof(*usr));
6699 memset(cusr->lm_pwd, 0, sizeof(cusr->lm_pwd));
6700 memset(cusr->nt_pwd, 0, sizeof(cusr->nt_pwd));
6701 break;
6703 default:
6704 DEBUG(4,("make_samr_userinfo_ctr: unsupported info\n"));
6705 return NT_STATUS_INVALID_INFO_CLASS;
6708 return NT_STATUS_OK;
6711 /*******************************************************************
6712 inits a SAM_USERINFO_CTR structure.
6713 ********************************************************************/
6715 static void init_samr_userinfo_ctr(SAM_USERINFO_CTR * ctr, DATA_BLOB *sess_key,
6716 uint16 switch_value, void *info)
6718 DEBUG(5, ("init_samr_userinfo_ctr\n"));
6720 ctr->switch_value = switch_value;
6721 ctr->info.id = info;
6723 switch (switch_value) {
6724 case 0x18:
6725 SamOEMhashBlob(ctr->info.id24->pass, 516, sess_key);
6726 dump_data(100, sess_key->data, sess_key->length);
6727 dump_data(100, ctr->info.id24->pass, 516);
6728 break;
6729 case 0x17:
6730 SamOEMhashBlob(ctr->info.id23->pass, 516, sess_key);
6731 dump_data(100, sess_key->data, sess_key->length);
6732 dump_data(100, ctr->info.id23->pass, 516);
6733 break;
6734 case 0x07:
6735 break;
6736 default:
6737 DEBUG(4,("init_samr_userinfo_ctr: unsupported switch level: %d\n", switch_value));
6741 /*******************************************************************
6742 reads or writes a structure.
6743 ********************************************************************/
6745 static BOOL samr_io_userinfo_ctr(const char *desc, SAM_USERINFO_CTR **ppctr,
6746 prs_struct *ps, int depth)
6748 BOOL ret;
6749 SAM_USERINFO_CTR *ctr;
6751 prs_debug(ps, depth, desc, "samr_io_userinfo_ctr");
6752 depth++;
6754 if (UNMARSHALLING(ps)) {
6755 ctr = PRS_ALLOC_MEM(ps,SAM_USERINFO_CTR,1);
6756 if (ctr == NULL)
6757 return False;
6758 *ppctr = ctr;
6759 } else {
6760 ctr = *ppctr;
6763 /* lkclXXXX DO NOT ALIGN BEFORE READING SWITCH VALUE! */
6765 if(!prs_uint16("switch_value", ps, depth, &ctr->switch_value))
6766 return False;
6767 if(!prs_align(ps))
6768 return False;
6770 ret = False;
6772 switch (ctr->switch_value) {
6773 case 7:
6774 if (UNMARSHALLING(ps))
6775 ctr->info.id7 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_7,1);
6776 if (ctr->info.id7 == NULL) {
6777 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6778 return False;
6780 ret = sam_io_user_info7("", ctr->info.id7, ps, depth);
6781 break;
6782 case 9:
6783 if (UNMARSHALLING(ps))
6784 ctr->info.id9 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_9,1);
6785 if (ctr->info.id9 == NULL) {
6786 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6787 return False;
6789 ret = sam_io_user_info9("", ctr->info.id9, ps, depth);
6790 break;
6791 case 16:
6792 if (UNMARSHALLING(ps))
6793 ctr->info.id16 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_16,1);
6794 if (ctr->info.id16 == NULL) {
6795 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6796 return False;
6798 ret = sam_io_user_info16("", ctr->info.id16, ps, depth);
6799 break;
6800 case 17:
6801 if (UNMARSHALLING(ps))
6802 ctr->info.id17 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_17,1);
6804 if (ctr->info.id17 == NULL) {
6805 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6806 return False;
6808 ret = sam_io_user_info17("", ctr->info.id17, ps, depth);
6809 break;
6810 case 18:
6811 if (UNMARSHALLING(ps))
6812 ctr->info.id18 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_18,1);
6814 if (ctr->info.id18 == NULL) {
6815 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6816 return False;
6818 ret = sam_io_user_info18("", ctr->info.id18, ps, depth);
6819 break;
6820 case 20:
6821 if (UNMARSHALLING(ps))
6822 ctr->info.id20 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_20,1);
6824 if (ctr->info.id20 == NULL) {
6825 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6826 return False;
6828 ret = sam_io_user_info20("", ctr->info.id20, ps, depth);
6829 break;
6830 case 21:
6831 if (UNMARSHALLING(ps))
6832 ctr->info.id21 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_21,1);
6834 if (ctr->info.id21 == NULL) {
6835 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6836 return False;
6838 ret = sam_io_user_info21("", ctr->info.id21, ps, depth);
6839 break;
6840 case 23:
6841 if (UNMARSHALLING(ps))
6842 ctr->info.id23 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_23,1);
6844 if (ctr->info.id23 == NULL) {
6845 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6846 return False;
6848 ret = sam_io_user_info23("", ctr->info.id23, ps, depth);
6849 break;
6850 case 24:
6851 if (UNMARSHALLING(ps))
6852 ctr->info.id24 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_24,1);
6854 if (ctr->info.id24 == NULL) {
6855 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6856 return False;
6858 ret = sam_io_user_info24("", ctr->info.id24, ps, depth);
6859 break;
6860 case 25:
6861 if (UNMARSHALLING(ps))
6862 ctr->info.id25 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_25,1);
6864 if (ctr->info.id25 == NULL) {
6865 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6866 return False;
6868 ret = sam_io_user_info25("", ctr->info.id25, ps, depth);
6869 break;
6870 case 26:
6871 if (UNMARSHALLING(ps))
6872 ctr->info.id26 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_26,1);
6874 if (ctr->info.id26 == NULL) {
6875 DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
6876 return False;
6878 ret = sam_io_user_info26("", ctr->info.id26, ps, depth);
6879 break;
6880 default:
6881 DEBUG(2, ("samr_io_userinfo_ctr: unknown switch level 0x%x\n", ctr->switch_value));
6882 ret = False;
6883 break;
6886 return ret;
6889 /*******************************************************************
6890 inits a SAMR_R_QUERY_USERINFO structure.
6891 ********************************************************************/
6893 void init_samr_r_query_userinfo(SAMR_R_QUERY_USERINFO * r_u,
6894 SAM_USERINFO_CTR * ctr, NTSTATUS status)
6896 DEBUG(5, ("init_samr_r_query_userinfo\n"));
6898 r_u->ptr = 0;
6899 r_u->ctr = NULL;
6901 if (NT_STATUS_IS_OK(status)) {
6902 r_u->ptr = 1;
6903 r_u->ctr = ctr;
6906 r_u->status = status; /* return status */
6909 /*******************************************************************
6910 reads or writes a structure.
6911 ********************************************************************/
6913 BOOL samr_io_r_query_userinfo(const char *desc, SAMR_R_QUERY_USERINFO * r_u,
6914 prs_struct *ps, int depth)
6916 if (r_u == NULL)
6917 return False;
6919 prs_debug(ps, depth, desc, "samr_io_r_query_userinfo");
6920 depth++;
6922 if(!prs_align(ps))
6923 return False;
6925 if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
6926 return False;
6928 if (r_u->ptr != 0) {
6929 if(!samr_io_userinfo_ctr("ctr", &r_u->ctr, ps, depth))
6930 return False;
6933 if(!prs_align(ps))
6934 return False;
6935 if(!prs_ntstatus("status", ps, depth, &r_u->status))
6936 return False;
6938 return True;
6941 /*******************************************************************
6942 inits a SAMR_Q_SET_USERINFO structure.
6943 ********************************************************************/
6945 void init_samr_q_set_userinfo(SAMR_Q_SET_USERINFO * q_u,
6946 const POLICY_HND *hnd, DATA_BLOB *sess_key,
6947 uint16 switch_value, void *info)
6949 DEBUG(5, ("init_samr_q_set_userinfo\n"));
6951 q_u->pol = *hnd;
6952 q_u->switch_value = switch_value;
6953 init_samr_userinfo_ctr(q_u->ctr, sess_key, switch_value, info);
6956 /*******************************************************************
6957 reads or writes a structure.
6958 ********************************************************************/
6960 BOOL samr_io_q_set_userinfo(const char *desc, SAMR_Q_SET_USERINFO * q_u,
6961 prs_struct *ps, int depth)
6963 if (q_u == NULL)
6964 return False;
6966 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo");
6967 depth++;
6969 if(!prs_align(ps))
6970 return False;
6972 smb_io_pol_hnd("pol", &(q_u->pol), ps, depth);
6974 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
6975 return False;
6976 if(!samr_io_userinfo_ctr("ctr", &q_u->ctr, ps, depth))
6977 return False;
6979 return True;
6982 /*******************************************************************
6983 inits a SAMR_R_SET_USERINFO structure.
6984 ********************************************************************/
6986 void init_samr_r_set_userinfo(SAMR_R_SET_USERINFO * r_u, NTSTATUS status)
6988 DEBUG(5, ("init_samr_r_set_userinfo\n"));
6990 r_u->status = status; /* return status */
6993 /*******************************************************************
6994 reads or writes a structure.
6995 ********************************************************************/
6997 BOOL samr_io_r_set_userinfo(const char *desc, SAMR_R_SET_USERINFO * r_u,
6998 prs_struct *ps, int depth)
7000 if (r_u == NULL)
7001 return False;
7003 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo");
7004 depth++;
7006 if(!prs_align(ps))
7007 return False;
7009 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7010 return False;
7012 return True;
7015 /*******************************************************************
7016 inits a SAMR_Q_SET_USERINFO2 structure.
7017 ********************************************************************/
7019 void init_samr_q_set_userinfo2(SAMR_Q_SET_USERINFO2 * q_u,
7020 const POLICY_HND *hnd, DATA_BLOB *sess_key,
7021 uint16 switch_value, SAM_USERINFO_CTR * ctr)
7023 DEBUG(5, ("init_samr_q_set_userinfo2\n"));
7025 q_u->pol = *hnd;
7026 q_u->switch_value = switch_value;
7027 q_u->ctr = ctr;
7029 q_u->ctr->switch_value = switch_value;
7031 switch (switch_value) {
7032 case 18:
7033 SamOEMhashBlob(ctr->info.id18->lm_pwd, 16, sess_key);
7034 SamOEMhashBlob(ctr->info.id18->nt_pwd, 16, sess_key);
7035 dump_data(100, sess_key->data, sess_key->length);
7036 dump_data(100, ctr->info.id18->lm_pwd, 16);
7037 dump_data(100, ctr->info.id18->nt_pwd, 16);
7038 break;
7042 /*******************************************************************
7043 reads or writes a structure.
7044 ********************************************************************/
7046 BOOL samr_io_q_set_userinfo2(const char *desc, SAMR_Q_SET_USERINFO2 * q_u,
7047 prs_struct *ps, int depth)
7049 if (q_u == NULL)
7050 return False;
7052 prs_debug(ps, depth, desc, "samr_io_q_set_userinfo2");
7053 depth++;
7055 if(!prs_align(ps))
7056 return False;
7058 if(!smb_io_pol_hnd("pol", &q_u->pol, ps, depth))
7059 return False;
7061 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
7062 return False;
7063 if(!samr_io_userinfo_ctr("ctr", &q_u->ctr, ps, depth))
7064 return False;
7066 return True;
7069 /*******************************************************************
7070 inits a SAMR_R_SET_USERINFO2 structure.
7071 ********************************************************************/
7073 void init_samr_r_set_userinfo2(SAMR_R_SET_USERINFO2 * r_u, NTSTATUS status)
7075 DEBUG(5, ("init_samr_r_set_userinfo2\n"));
7077 r_u->status = status; /* return status */
7080 /*******************************************************************
7081 reads or writes a structure.
7082 ********************************************************************/
7084 BOOL samr_io_r_set_userinfo2(const char *desc, SAMR_R_SET_USERINFO2 * r_u,
7085 prs_struct *ps, int depth)
7087 if (r_u == NULL)
7088 return False;
7090 prs_debug(ps, depth, desc, "samr_io_r_set_userinfo2");
7091 depth++;
7093 if(!prs_align(ps))
7094 return False;
7096 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7097 return False;
7099 return True;
7102 /*******************************************************************
7103 inits a SAMR_Q_CONNECT structure.
7104 ********************************************************************/
7106 void init_samr_q_connect(SAMR_Q_CONNECT * q_u,
7107 char *srv_name, uint32 access_mask)
7109 DEBUG(5, ("init_samr_q_connect\n"));
7111 /* make PDC server name \\server */
7112 q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
7113 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
7115 /* example values: 0x0000 0002 */
7116 q_u->access_mask = access_mask;
7119 /*******************************************************************
7120 reads or writes a structure.
7121 ********************************************************************/
7123 BOOL samr_io_q_connect(const char *desc, SAMR_Q_CONNECT * q_u,
7124 prs_struct *ps, int depth)
7126 if (q_u == NULL)
7127 return False;
7129 prs_debug(ps, depth, desc, "samr_io_q_connect");
7130 depth++;
7132 if(!prs_align(ps))
7133 return False;
7135 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
7136 return False;
7137 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
7138 return False;
7140 if(!prs_align(ps))
7141 return False;
7142 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
7143 return False;
7145 return True;
7148 /*******************************************************************
7149 reads or writes a structure.
7150 ********************************************************************/
7152 BOOL samr_io_r_connect(const char *desc, SAMR_R_CONNECT * r_u,
7153 prs_struct *ps, int depth)
7155 if (r_u == NULL)
7156 return False;
7158 prs_debug(ps, depth, desc, "samr_io_r_connect");
7159 depth++;
7161 if(!prs_align(ps))
7162 return False;
7164 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
7165 return False;
7167 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7168 return False;
7170 return True;
7173 /*******************************************************************
7174 inits a SAMR_Q_CONNECT4 structure.
7175 ********************************************************************/
7177 void init_samr_q_connect4(SAMR_Q_CONNECT4 * q_u,
7178 char *srv_name, uint32 access_mask)
7180 DEBUG(5, ("init_samr_q_connect4\n"));
7182 /* make PDC server name \\server */
7183 q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
7184 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
7186 /* Only value we've seen, possibly an address type ? */
7187 q_u->unk_0 = 2;
7189 /* example values: 0x0000 0002 */
7190 q_u->access_mask = access_mask;
7193 /*******************************************************************
7194 reads or writes a structure.
7195 ********************************************************************/
7197 BOOL samr_io_q_connect4(const char *desc, SAMR_Q_CONNECT4 * q_u,
7198 prs_struct *ps, int depth)
7200 if (q_u == NULL)
7201 return False;
7203 prs_debug(ps, depth, desc, "samr_io_q_connect4");
7204 depth++;
7206 if(!prs_align(ps))
7207 return False;
7209 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
7210 return False;
7211 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
7212 return False;
7214 if(!prs_align(ps))
7215 return False;
7216 if(!prs_uint32("unk_0", ps, depth, &q_u->unk_0))
7217 return False;
7218 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
7219 return False;
7221 return True;
7224 /*******************************************************************
7225 reads or writes a structure.
7226 ********************************************************************/
7228 BOOL samr_io_r_connect4(const char *desc, SAMR_R_CONNECT4 * r_u,
7229 prs_struct *ps, int depth)
7231 if (r_u == NULL)
7232 return False;
7234 prs_debug(ps, depth, desc, "samr_io_r_connect4");
7235 depth++;
7237 if(!prs_align(ps))
7238 return False;
7240 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
7241 return False;
7243 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7244 return False;
7246 return True;
7249 /*******************************************************************
7250 inits a SAMR_Q_CONNECT5 structure.
7251 ********************************************************************/
7253 void init_samr_q_connect5(SAMR_Q_CONNECT5 * q_u,
7254 char *srv_name, uint32 access_mask)
7256 DEBUG(5, ("init_samr_q_connect5\n"));
7258 /* make PDC server name \\server */
7259 q_u->ptr_srv_name = (srv_name != NULL && *srv_name) ? 1 : 0;
7260 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_STR_TERMINATE);
7262 /* example values: 0x0000 0002 */
7263 q_u->access_mask = access_mask;
7265 q_u->level = 1;
7266 q_u->info1_unk1 = 3;
7267 q_u->info1_unk2 = 0;
7270 /*******************************************************************
7271 inits a SAMR_R_CONNECT5 structure.
7272 ********************************************************************/
7274 void init_samr_r_connect5(SAMR_R_CONNECT5 * r_u, POLICY_HND *pol, NTSTATUS status)
7276 DEBUG(5, ("init_samr_q_connect5\n"));
7278 r_u->level = 1;
7279 r_u->info1_unk1 = 3;
7280 r_u->info1_unk2 = 0;
7282 r_u->connect_pol = *pol;
7283 r_u->status = status;
7286 /*******************************************************************
7287 reads or writes a structure.
7288 ********************************************************************/
7290 BOOL samr_io_q_connect5(const char *desc, SAMR_Q_CONNECT5 * q_u,
7291 prs_struct *ps, int depth)
7293 if (q_u == NULL)
7294 return False;
7296 prs_debug(ps, depth, desc, "samr_io_q_connect5");
7297 depth++;
7299 if(!prs_align(ps))
7300 return False;
7302 if(!prs_uint32("ptr_srv_name", ps, depth, &q_u->ptr_srv_name))
7303 return False;
7304 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->ptr_srv_name, ps, depth))
7305 return False;
7307 if(!prs_align(ps))
7308 return False;
7309 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
7310 return False;
7312 if(!prs_uint32("level", ps, depth, &q_u->level))
7313 return False;
7314 if(!prs_uint32("level", ps, depth, &q_u->level))
7315 return False;
7317 if(!prs_uint32("info1_unk1", ps, depth, &q_u->info1_unk1))
7318 return False;
7319 if(!prs_uint32("info1_unk2", ps, depth, &q_u->info1_unk2))
7320 return False;
7322 return True;
7325 /*******************************************************************
7326 reads or writes a structure.
7327 ********************************************************************/
7329 BOOL samr_io_r_connect5(const char *desc, SAMR_R_CONNECT5 * r_u,
7330 prs_struct *ps, int depth)
7332 if (r_u == NULL)
7333 return False;
7335 prs_debug(ps, depth, desc, "samr_io_r_connect5");
7336 depth++;
7338 if(!prs_align(ps))
7339 return False;
7341 if(!prs_uint32("level", ps, depth, &r_u->level))
7342 return False;
7343 if(!prs_uint32("level", ps, depth, &r_u->level))
7344 return False;
7345 if(!prs_uint32("info1_unk1", ps, depth, &r_u->info1_unk1))
7346 return False;
7347 if(!prs_uint32("info1_unk2", ps, depth, &r_u->info1_unk2))
7348 return False;
7350 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
7351 return False;
7353 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7354 return False;
7356 return True;
7359 /*******************************************************************
7360 inits a SAMR_Q_CONNECT_ANON structure.
7361 ********************************************************************/
7363 void init_samr_q_connect_anon(SAMR_Q_CONNECT_ANON * q_u)
7365 DEBUG(5, ("init_samr_q_connect_anon\n"));
7367 q_u->ptr = 1;
7368 q_u->unknown_0 = 0x5c; /* server name (?!!) */
7369 q_u->access_mask = MAXIMUM_ALLOWED_ACCESS;
7372 /*******************************************************************
7373 reads or writes a structure.
7374 ********************************************************************/
7376 BOOL samr_io_q_connect_anon(const char *desc, SAMR_Q_CONNECT_ANON * q_u,
7377 prs_struct *ps, int depth)
7379 if (q_u == NULL)
7380 return False;
7382 prs_debug(ps, depth, desc, "samr_io_q_connect_anon");
7383 depth++;
7385 if(!prs_align(ps))
7386 return False;
7388 if(!prs_uint32("ptr ", ps, depth, &q_u->ptr))
7389 return False;
7390 if (q_u->ptr) {
7391 if(!prs_uint16("unknown_0", ps, depth, &q_u->unknown_0))
7392 return False;
7394 if(!prs_align(ps))
7395 return False;
7396 if(!prs_uint32("access_mask", ps, depth, &q_u->access_mask))
7397 return False;
7399 return True;
7402 /*******************************************************************
7403 reads or writes a structure.
7404 ********************************************************************/
7406 BOOL samr_io_r_connect_anon(const char *desc, SAMR_R_CONNECT_ANON * r_u,
7407 prs_struct *ps, int depth)
7409 if (r_u == NULL)
7410 return False;
7412 prs_debug(ps, depth, desc, "samr_io_r_connect_anon");
7413 depth++;
7415 if(!prs_align(ps))
7416 return False;
7418 if(!smb_io_pol_hnd("connect_pol", &r_u->connect_pol, ps, depth))
7419 return False;
7421 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7422 return False;
7424 return True;
7427 /*******************************************************************
7428 inits a SAMR_Q_GET_DOM_PWINFO structure.
7429 ********************************************************************/
7431 void init_samr_q_get_dom_pwinfo(SAMR_Q_GET_DOM_PWINFO * q_u,
7432 char *srv_name)
7434 DEBUG(5, ("init_samr_q_get_dom_pwinfo\n"));
7436 q_u->ptr = 1;
7437 init_unistr2(&q_u->uni_srv_name, srv_name, UNI_FLAGS_NONE);
7438 init_uni_hdr(&q_u->hdr_srv_name, &q_u->uni_srv_name);
7441 /*******************************************************************
7442 reads or writes a structure.
7443 ********************************************************************/
7445 BOOL samr_io_q_get_dom_pwinfo(const char *desc, SAMR_Q_GET_DOM_PWINFO * q_u,
7446 prs_struct *ps, int depth)
7448 if (q_u == NULL)
7449 return False;
7451 prs_debug(ps, depth, desc, "samr_io_q_get_dom_pwinfo");
7452 depth++;
7454 if(!prs_align(ps))
7455 return False;
7457 if(!prs_uint32("ptr", ps, depth, &q_u->ptr))
7458 return False;
7459 if (q_u->ptr != 0) {
7460 if(!smb_io_unihdr("", &q_u->hdr_srv_name, ps, depth))
7461 return False;
7462 if(!smb_io_unistr2("", &q_u->uni_srv_name, q_u->hdr_srv_name.buffer, ps, depth))
7463 return False;
7466 return True;
7469 /*******************************************************************
7470 reads or writes a structure.
7471 ********************************************************************/
7473 BOOL samr_io_r_get_dom_pwinfo(const char *desc, SAMR_R_GET_DOM_PWINFO * r_u,
7474 prs_struct *ps, int depth)
7476 if (r_u == NULL)
7477 return False;
7479 prs_debug(ps, depth, desc, "samr_io_r_get_dom_pwinfo");
7480 depth++;
7482 if(!prs_align(ps))
7483 return False;
7485 if(!prs_uint16("min_pwd_length", ps, depth, &r_u->min_pwd_length))
7486 return False;
7487 if(!prs_align(ps))
7488 return False;
7489 if(!prs_uint32("password_properties", ps, depth, &r_u->password_properties))
7490 return False;
7492 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7493 return False;
7495 return True;
7498 /*******************************************************************
7499 make a SAMR_ENC_PASSWD structure.
7500 ********************************************************************/
7502 void init_enc_passwd(SAMR_ENC_PASSWD * pwd, const char pass[512])
7504 ZERO_STRUCTP(pwd);
7506 if (pass == NULL) {
7507 pwd->ptr = 0;
7508 } else {
7509 pwd->ptr = 1;
7510 memcpy(pwd->pass, pass, sizeof(pwd->pass));
7514 /*******************************************************************
7515 reads or writes a SAMR_ENC_PASSWD structure.
7516 ********************************************************************/
7518 BOOL samr_io_enc_passwd(const char *desc, SAMR_ENC_PASSWD * pwd,
7519 prs_struct *ps, int depth)
7521 if (pwd == NULL)
7522 return False;
7524 prs_debug(ps, depth, desc, "samr_io_enc_passwd");
7525 depth++;
7527 if(!prs_align(ps))
7528 return False;
7530 if(!prs_uint32("ptr", ps, depth, &pwd->ptr))
7531 return False;
7533 if (pwd->ptr != 0) {
7534 if(!prs_uint8s(False, "pwd", ps, depth, pwd->pass, sizeof(pwd->pass)))
7535 return False;
7538 return True;
7541 /*******************************************************************
7542 inits a SAMR_ENC_HASH structure.
7543 ********************************************************************/
7545 void init_enc_hash(SAMR_ENC_HASH * hsh, const uchar hash[16])
7547 ZERO_STRUCTP(hsh);
7549 if (hash == NULL) {
7550 hsh->ptr = 0;
7551 } else {
7552 hsh->ptr = 1;
7553 memcpy(hsh->hash, hash, sizeof(hsh->hash));
7557 /*******************************************************************
7558 reads or writes a SAMR_ENC_HASH structure.
7559 ********************************************************************/
7561 BOOL samr_io_enc_hash(const char *desc, SAMR_ENC_HASH * hsh,
7562 prs_struct *ps, int depth)
7564 if (hsh == NULL)
7565 return False;
7567 prs_debug(ps, depth, desc, "samr_io_enc_hash");
7568 depth++;
7570 if(!prs_align(ps))
7571 return False;
7573 if(!prs_uint32("ptr ", ps, depth, &hsh->ptr))
7574 return False;
7575 if (hsh->ptr != 0) {
7576 if(!prs_uint8s(False, "hash", ps, depth, hsh->hash,sizeof(hsh->hash)))
7577 return False;
7580 return True;
7583 /*******************************************************************
7584 inits a SAMR_Q_CHGPASSWD_USER structure.
7585 ********************************************************************/
7587 void init_samr_q_chgpasswd_user(SAMR_Q_CHGPASSWD_USER * q_u,
7588 const char *dest_host, const char *user_name,
7589 const uchar nt_newpass[516],
7590 const uchar nt_oldhash[16],
7591 const uchar lm_newpass[516],
7592 const uchar lm_oldhash[16])
7594 DEBUG(5, ("init_samr_q_chgpasswd_user\n"));
7596 q_u->ptr_0 = 1;
7597 init_unistr2(&q_u->uni_dest_host, dest_host, UNI_FLAGS_NONE);
7598 init_uni_hdr(&q_u->hdr_dest_host, &q_u->uni_dest_host);
7600 init_unistr2(&q_u->uni_user_name, user_name, UNI_FLAGS_NONE);
7601 init_uni_hdr(&q_u->hdr_user_name, &q_u->uni_user_name);
7603 init_enc_passwd(&q_u->nt_newpass, (const char *)nt_newpass);
7604 init_enc_hash(&q_u->nt_oldhash, nt_oldhash);
7606 q_u->unknown = 0x01;
7608 init_enc_passwd(&q_u->lm_newpass, (const char *)lm_newpass);
7609 init_enc_hash(&q_u->lm_oldhash, lm_oldhash);
7612 /*******************************************************************
7613 reads or writes a structure.
7614 ********************************************************************/
7616 BOOL samr_io_q_chgpasswd_user(const char *desc, SAMR_Q_CHGPASSWD_USER * q_u,
7617 prs_struct *ps, int depth)
7619 if (q_u == NULL)
7620 return False;
7622 prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user");
7623 depth++;
7625 if(!prs_align(ps))
7626 return False;
7628 if(!prs_uint32("ptr_0", ps, depth, &q_u->ptr_0))
7629 return False;
7631 if(!smb_io_unihdr("", &q_u->hdr_dest_host, ps, depth))
7632 return False;
7633 if(!smb_io_unistr2("", &q_u->uni_dest_host, q_u->hdr_dest_host.buffer, ps, depth))
7634 return False;
7636 if(!prs_align(ps))
7637 return False;
7638 if(!smb_io_unihdr("", &q_u->hdr_user_name, ps, depth))
7639 return False;
7640 if(!smb_io_unistr2("", &q_u->uni_user_name, q_u->hdr_user_name.buffer,ps, depth))
7641 return False;
7643 if(!samr_io_enc_passwd("nt_newpass", &q_u->nt_newpass, ps, depth))
7644 return False;
7645 if(!samr_io_enc_hash("nt_oldhash", &q_u->nt_oldhash, ps, depth))
7646 return False;
7648 if(!prs_uint32("unknown", ps, depth, &q_u->unknown))
7649 return False;
7651 if(!samr_io_enc_passwd("lm_newpass", &q_u->lm_newpass, ps, depth))
7652 return False;
7653 if(!samr_io_enc_hash("lm_oldhash", &q_u->lm_oldhash, ps, depth))
7654 return False;
7656 return True;
7659 /*******************************************************************
7660 inits a SAMR_R_CHGPASSWD_USER structure.
7661 ********************************************************************/
7663 void init_samr_r_chgpasswd_user(SAMR_R_CHGPASSWD_USER * r_u, NTSTATUS status)
7665 DEBUG(5, ("init_samr_r_chgpasswd_user\n"));
7667 r_u->status = status;
7670 /*******************************************************************
7671 reads or writes a structure.
7672 ********************************************************************/
7674 BOOL samr_io_r_chgpasswd_user(const char *desc, SAMR_R_CHGPASSWD_USER * r_u,
7675 prs_struct *ps, int depth)
7677 if (r_u == NULL)
7678 return False;
7680 prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user");
7681 depth++;
7683 if(!prs_align(ps))
7684 return False;
7686 if(!prs_ntstatus("status", ps, depth, &r_u->status))
7687 return False;
7689 return True;
7692 /*******************************************************************
7693 inits a SAMR_Q_CHGPASSWD3 structure.
7694 ********************************************************************/
7696 void init_samr_q_chgpasswd_user3(SAMR_Q_CHGPASSWD_USER3 * q_u,
7697 const char *dest_host, const char *user_name,
7698 const uchar nt_newpass[516],
7699 const uchar nt_oldhash[16],
7700 const uchar lm_newpass[516],
7701 const uchar lm_oldhash[16])
7703 DEBUG(5, ("init_samr_q_chgpasswd_user3\n"));
7705 q_u->ptr_0 = 1;
7706 init_unistr2(&q_u->uni_dest_host, dest_host, UNI_FLAGS_NONE);
7707 init_uni_hdr(&q_u->hdr_dest_host, &q_u->uni_dest_host);
7709 init_unistr2(&q_u->uni_user_name, user_name, UNI_FLAGS_NONE);
7710 init_uni_hdr(&q_u->hdr_user_name, &q_u->uni_user_name);
7712 init_enc_passwd(&q_u->nt_newpass, (const char *)nt_newpass);
7713 init_enc_hash(&q_u->nt_oldhash, nt_oldhash);
7715 q_u->lm_change = 0x01;
7717 init_enc_passwd(&q_u->lm_newpass, (const char *)lm_newpass);
7718 init_enc_hash(&q_u->lm_oldhash, lm_oldhash);
7720 init_enc_passwd(&q_u->password3, NULL);
7723 /*******************************************************************
7724 reads or writes a structure.
7725 ********************************************************************/
7727 BOOL samr_io_q_chgpasswd_user3(const char *desc, SAMR_Q_CHGPASSWD_USER3 * q_u,
7728 prs_struct *ps, int depth)
7730 if (q_u == NULL)
7731 return False;
7733 prs_debug(ps, depth, desc, "samr_io_q_chgpasswd_user3");
7734 depth++;
7736 if(!prs_align(ps))
7737 return False;
7739 if(!prs_uint32("ptr_0", ps, depth, &q_u->ptr_0))
7740 return False;
7742 if(!smb_io_unihdr("", &q_u->hdr_dest_host, ps, depth))
7743 return False;
7744 if(!smb_io_unistr2("", &q_u->uni_dest_host, q_u->hdr_dest_host.buffer, ps, depth))
7745 return False;
7747 if(!prs_align(ps))
7748 return False;
7749 if(!smb_io_unihdr("", &q_u->hdr_user_name, ps, depth))
7750 return False;
7751 if(!smb_io_unistr2("", &q_u->uni_user_name, q_u->hdr_user_name.buffer,ps, depth))
7752 return False;
7754 if(!samr_io_enc_passwd("nt_newpass", &q_u->nt_newpass, ps, depth))
7755 return False;
7756 if(!samr_io_enc_hash("nt_oldhash", &q_u->nt_oldhash, ps, depth))
7757 return False;
7759 if(!prs_uint32("lm_change", ps, depth, &q_u->lm_change))
7760 return False;
7762 if(!samr_io_enc_passwd("lm_newpass", &q_u->lm_newpass, ps, depth))
7763 return False;
7764 if(!samr_io_enc_hash("lm_oldhash", &q_u->lm_oldhash, ps, depth))
7765 return False;
7767 if(!samr_io_enc_passwd("password3", &q_u->password3, ps, depth))
7768 return False;
7770 return True;
7773 /*******************************************************************
7774 inits a SAMR_R_CHGPASSWD_USER3 structure.
7775 ********************************************************************/
7777 void init_samr_r_chgpasswd_user3(SAMR_R_CHGPASSWD_USER3 *r_u, NTSTATUS status,
7778 SAMR_CHANGE_REJECT *reject, SAM_UNK_INFO_1 *info)
7780 DEBUG(5, ("init_samr_r_chgpasswd_user3\n"));
7782 r_u->status = status;
7783 r_u->info = 0;
7784 r_u->ptr_info = 0;
7785 r_u->reject = 0;
7786 r_u->ptr_reject = 0;
7788 if (info) {
7789 r_u->info = info;
7790 r_u->ptr_info = 1;
7792 if (reject && (reject->reject_reason != Undefined)) {
7793 r_u->reject = reject;
7794 r_u->ptr_reject = 1;
7798 /*******************************************************************
7799 Reads or writes an SAMR_CHANGE_REJECT structure.
7800 ********************************************************************/
7802 BOOL samr_io_change_reject(const char *desc, SAMR_CHANGE_REJECT *reject, prs_struct *ps, int depth)
7804 if (reject == NULL)
7805 return False;
7807 prs_debug(ps, depth, desc, "samr_io_change_reject");
7808 depth++;
7810 if(!prs_align(ps))
7811 return False;
7813 if(UNMARSHALLING(ps))
7814 ZERO_STRUCTP(reject);
7816 if (!prs_uint32("reject_reason", ps, depth, &reject->reject_reason))
7817 return False;
7819 if (!prs_uint32("unknown1", ps, depth, &reject->unknown1))
7820 return False;
7822 if (!prs_uint32("unknown2", ps, depth, &reject->unknown2))
7823 return False;
7825 return True;
7828 /*******************************************************************
7829 reads or writes a structure.
7830 ********************************************************************/
7832 BOOL samr_io_r_chgpasswd_user3(const char *desc, SAMR_R_CHGPASSWD_USER3 *r_u,
7833 prs_struct *ps, int depth)
7835 if (r_u == NULL)
7836 return False;
7838 prs_debug(ps, depth, desc, "samr_io_r_chgpasswd_user3");
7839 depth++;
7841 if (!prs_align(ps))
7842 return False;
7844 if (!prs_uint32("ptr_info", ps, depth, &r_u->ptr_info))
7845 return False;
7847 /* special case: Windows 2000 can return stub data here saying
7848 NT_STATUS_NOT_SUPPORTED */
7850 if ( NT_STATUS_EQUAL( NT_STATUS_NOT_SUPPORTED, NT_STATUS(r_u->ptr_info)) ) {
7851 r_u->status = NT_STATUS_NOT_SUPPORTED;
7852 return True;
7855 if (r_u->ptr_info && r_u->info != NULL) {
7856 /* SAM_UNK_INFO_1 */
7857 if (!sam_io_unk_info1("info", r_u->info, ps, depth))
7858 return False;
7861 if (!prs_uint32("ptr_reject", ps, depth, &r_u->ptr_reject))
7862 return False;
7864 if (r_u->ptr_reject && r_u->reject != NULL) {
7865 /* SAMR_CHANGE_REJECT */
7866 if (!samr_io_change_reject("reject", r_u->reject, ps, depth))
7867 return False;
7870 if (!prs_ntstatus("status", ps, depth, &r_u->status))
7871 return False;
7873 return True;
7876 /*******************************************************************
7877 reads or writes a structure.
7878 ********************************************************************/
7880 void init_samr_q_query_domain_info2(SAMR_Q_QUERY_DOMAIN_INFO2 *q_u,
7881 POLICY_HND *domain_pol, uint16 switch_value)
7883 DEBUG(5, ("init_samr_q_query_domain_info2\n"));
7885 q_u->domain_pol = *domain_pol;
7886 q_u->switch_value = switch_value;
7889 /*******************************************************************
7890 reads or writes a structure.
7891 ********************************************************************/
7893 BOOL samr_io_q_query_domain_info2(const char *desc, SAMR_Q_QUERY_DOMAIN_INFO2 *q_u,
7894 prs_struct *ps, int depth)
7896 if (q_u == NULL)
7897 return False;
7899 prs_debug(ps, depth, desc, "samr_io_q_query_domain_info2");
7900 depth++;
7902 if(!prs_align(ps))
7903 return False;
7905 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
7906 return False;
7908 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
7909 return False;
7911 return True;
7914 /*******************************************************************
7915 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
7916 ********************************************************************/
7918 void init_samr_r_query_domain_info2(SAMR_R_QUERY_DOMAIN_INFO2 * r_u,
7919 uint16 switch_value, SAM_UNK_CTR * ctr,
7920 NTSTATUS status)
7922 DEBUG(5, ("init_samr_r_query_domain_info2\n"));
7924 r_u->ptr_0 = 0;
7925 r_u->switch_value = 0;
7926 r_u->status = status; /* return status */
7928 if (NT_STATUS_IS_OK(status)) {
7929 r_u->switch_value = switch_value;
7930 r_u->ptr_0 = 1;
7931 r_u->ctr = ctr;
7935 /*******************************************************************
7936 reads or writes a structure.
7937 ********************************************************************/
7939 BOOL samr_io_r_query_domain_info2(const char *desc, SAMR_R_QUERY_DOMAIN_INFO2 * r_u,
7940 prs_struct *ps, int depth)
7942 if (r_u == NULL)
7943 return False;
7945 prs_debug(ps, depth, desc, "samr_io_r_query_domain_info2");
7946 depth++;
7948 if(!prs_align(ps))
7949 return False;
7951 if(!prs_uint32("ptr_0 ", ps, depth, &r_u->ptr_0))
7952 return False;
7954 if (r_u->ptr_0 != 0 && r_u->ctr != NULL) {
7955 if(!prs_uint16("switch_value", ps, depth, &r_u->switch_value))
7956 return False;
7957 if(!prs_align(ps))
7958 return False;
7960 switch (r_u->switch_value) {
7961 case 0x0d:
7962 if(!sam_io_unk_info13("unk_inf13", &r_u->ctr->info.inf13, ps, depth))
7963 return False;
7964 break;
7965 case 0x0c:
7966 if(!sam_io_unk_info12("unk_inf12", &r_u->ctr->info.inf12, ps, depth))
7967 return False;
7968 break;
7969 case 0x09:
7970 if(!sam_io_unk_info9("unk_inf9",&r_u->ctr->info.inf9, ps,depth))
7971 return False;
7972 break;
7973 case 0x08:
7974 if(!sam_io_unk_info8("unk_inf8",&r_u->ctr->info.inf8, ps,depth))
7975 return False;
7976 break;
7977 case 0x07:
7978 if(!sam_io_unk_info7("unk_inf7",&r_u->ctr->info.inf7, ps,depth))
7979 return False;
7980 break;
7981 case 0x06:
7982 if(!sam_io_unk_info6("unk_inf6",&r_u->ctr->info.inf6, ps,depth))
7983 return False;
7984 break;
7985 case 0x05:
7986 if(!sam_io_unk_info5("unk_inf5",&r_u->ctr->info.inf5, ps,depth))
7987 return False;
7988 break;
7989 case 0x04:
7990 if(!sam_io_unk_info4("unk_inf4",&r_u->ctr->info.inf4, ps,depth))
7991 return False;
7992 break;
7993 case 0x03:
7994 if(!sam_io_unk_info3("unk_inf3",&r_u->ctr->info.inf3, ps,depth))
7995 return False;
7996 break;
7997 case 0x02:
7998 if(!sam_io_unk_info2("unk_inf2",&r_u->ctr->info.inf2, ps,depth))
7999 return False;
8000 break;
8001 case 0x01:
8002 if(!sam_io_unk_info1("unk_inf1",&r_u->ctr->info.inf1, ps,depth))
8003 return False;
8004 break;
8005 default:
8006 DEBUG(0, ("samr_io_r_query_domain_info2: unknown switch level 0x%x\n",
8007 r_u->switch_value));
8008 r_u->status = NT_STATUS_INVALID_INFO_CLASS;
8009 return False;
8013 if(!prs_align(ps))
8014 return False;
8016 if(!prs_ntstatus("status", ps, depth, &r_u->status))
8017 return False;
8019 return True;
8023 /*******************************************************************
8024 reads or writes a structure.
8025 ********************************************************************/
8027 void init_samr_q_set_domain_info(SAMR_Q_SET_DOMAIN_INFO *q_u,
8028 POLICY_HND *domain_pol, uint16 switch_value, SAM_UNK_CTR *ctr)
8030 DEBUG(5, ("init_samr_q_set_domain_info\n"));
8032 q_u->domain_pol = *domain_pol;
8033 q_u->switch_value0 = switch_value;
8035 q_u->switch_value = switch_value;
8036 q_u->ctr = ctr;
8040 /*******************************************************************
8041 reads or writes a structure.
8042 ********************************************************************/
8044 BOOL samr_io_q_set_domain_info(const char *desc, SAMR_Q_SET_DOMAIN_INFO *q_u,
8045 prs_struct *ps, int depth)
8047 if (q_u == NULL)
8048 return False;
8050 prs_debug(ps, depth, desc, "samr_io_q_set_domain_info");
8051 depth++;
8053 if(!prs_align(ps))
8054 return False;
8056 if(!smb_io_pol_hnd("domain_pol", &q_u->domain_pol, ps, depth))
8057 return False;
8059 if(!prs_uint16("switch_value0", ps, depth, &q_u->switch_value0))
8060 return False;
8062 if(!prs_uint16("switch_value", ps, depth, &q_u->switch_value))
8063 return False;
8065 if(!prs_align(ps))
8066 return False;
8068 if (UNMARSHALLING(ps)) {
8069 if ((q_u->ctr = PRS_ALLOC_MEM(ps, SAM_UNK_CTR, 1)) == NULL)
8070 return False;
8073 switch (q_u->switch_value) {
8075 case 0x0c:
8076 if(!sam_io_unk_info12("unk_inf12", &q_u->ctr->info.inf12, ps, depth))
8077 return False;
8078 break;
8079 case 0x07:
8080 if(!sam_io_unk_info7("unk_inf7",&q_u->ctr->info.inf7, ps,depth))
8081 return False;
8082 break;
8083 case 0x06:
8084 if(!sam_io_unk_info6("unk_inf6",&q_u->ctr->info.inf6, ps,depth))
8085 return False;
8086 break;
8087 case 0x05:
8088 if(!sam_io_unk_info5("unk_inf5",&q_u->ctr->info.inf5, ps,depth))
8089 return False;
8090 break;
8091 case 0x03:
8092 if(!sam_io_unk_info3("unk_inf3",&q_u->ctr->info.inf3, ps,depth))
8093 return False;
8094 break;
8095 case 0x02:
8096 if(!sam_io_unk_info2("unk_inf2",&q_u->ctr->info.inf2, ps,depth))
8097 return False;
8098 break;
8099 case 0x01:
8100 if(!sam_io_unk_info1("unk_inf1",&q_u->ctr->info.inf1, ps,depth))
8101 return False;
8102 break;
8103 default:
8104 DEBUG(0, ("samr_io_r_samr_unknown_2e: unknown switch level 0x%x\n",
8105 q_u->switch_value));
8106 return False;
8109 return True;
8112 /*******************************************************************
8113 inits a SAMR_R_QUERY_DOMAIN_INFO structure.
8114 ********************************************************************/
8116 void init_samr_r_set_domain_info(SAMR_R_SET_DOMAIN_INFO * r_u, NTSTATUS status)
8118 DEBUG(5, ("init_samr_r_set_domain_info\n"));
8120 r_u->status = status; /* return status */
8123 /*******************************************************************
8124 reads or writes a structure.
8125 ********************************************************************/
8127 BOOL samr_io_r_set_domain_info(const char *desc, SAMR_R_SET_DOMAIN_INFO * r_u,
8128 prs_struct *ps, int depth)
8130 if (r_u == NULL)
8131 return False;
8133 prs_debug(ps, depth, desc, "samr_io_r_samr_unknown_2e");
8134 depth++;
8136 if(!prs_align(ps))
8137 return False;
8139 if(!prs_ntstatus("status", ps, depth, &r_u->status))
8140 return False;
8142 return True;