r18865: fixed some of the most obvious NTSTATUS/WERROR mixups in Samba3. It
[Samba/nascimento.git] / source3 / rpc_parse / parse_net.c
blobac8921987a749430d04926011ee8755a8e63a5bf
1 /*
2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997.
7 * Copyright (C) Jean Francois Micouleau 2002.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "includes.h"
26 #undef DBGC_CLASS
27 #define DBGC_CLASS DBGC_RPC_PARSE
29 /*******************************************************************
30 Reads or writes a structure.
31 ********************************************************************/
33 static BOOL net_io_neg_flags(const char *desc, NEG_FLAGS *neg, prs_struct *ps, int depth)
35 if (neg == NULL)
36 return False;
38 prs_debug(ps, depth, desc, "net_io_neg_flags");
39 depth++;
41 if(!prs_align(ps))
42 return False;
44 if(!prs_uint32("neg_flags", ps, depth, &neg->neg_flags))
45 return False;
47 return True;
50 /*******************************************************************
51 Inits a NETLOGON_INFO_3 structure.
52 ********************************************************************/
54 static void init_netinfo_3(NETLOGON_INFO_3 *info, uint32 flags, uint32 logon_attempts)
56 info->flags = flags;
57 info->logon_attempts = logon_attempts;
58 info->reserved_1 = 0x0;
59 info->reserved_2 = 0x0;
60 info->reserved_3 = 0x0;
61 info->reserved_4 = 0x0;
62 info->reserved_5 = 0x0;
65 /*******************************************************************
66 Reads or writes a NETLOGON_INFO_3 structure.
67 ********************************************************************/
69 static BOOL net_io_netinfo_3(const char *desc, NETLOGON_INFO_3 *info, prs_struct *ps, int depth)
71 if (info == NULL)
72 return False;
74 prs_debug(ps, depth, desc, "net_io_netinfo_3");
75 depth++;
77 if(!prs_align(ps))
78 return False;
80 if(!prs_uint32("flags ", ps, depth, &info->flags))
81 return False;
82 if(!prs_uint32("logon_attempts", ps, depth, &info->logon_attempts))
83 return False;
84 if(!prs_uint32("reserved_1 ", ps, depth, &info->reserved_1))
85 return False;
86 if(!prs_uint32("reserved_2 ", ps, depth, &info->reserved_2))
87 return False;
88 if(!prs_uint32("reserved_3 ", ps, depth, &info->reserved_3))
89 return False;
90 if(!prs_uint32("reserved_4 ", ps, depth, &info->reserved_4))
91 return False;
92 if(!prs_uint32("reserved_5 ", ps, depth, &info->reserved_5))
93 return False;
95 return True;
99 /*******************************************************************
100 Inits a NETLOGON_INFO_1 structure.
101 ********************************************************************/
103 static void init_netinfo_1(NETLOGON_INFO_1 *info, uint32 flags, uint32 pdc_status)
105 info->flags = flags;
106 info->pdc_status = pdc_status;
109 /*******************************************************************
110 Reads or writes a NETLOGON_INFO_1 structure.
111 ********************************************************************/
113 static BOOL net_io_netinfo_1(const char *desc, NETLOGON_INFO_1 *info, prs_struct *ps, int depth)
115 if (info == NULL)
116 return False;
118 prs_debug(ps, depth, desc, "net_io_netinfo_1");
119 depth++;
121 if(!prs_align(ps))
122 return False;
124 if(!prs_uint32("flags ", ps, depth, &info->flags))
125 return False;
126 if(!prs_uint32("pdc_status", ps, depth, &info->pdc_status))
127 return False;
129 return True;
132 /*******************************************************************
133 Inits a NETLOGON_INFO_2 structure.
134 ********************************************************************/
136 static void init_netinfo_2(NETLOGON_INFO_2 *info, uint32 flags, uint32 pdc_status,
137 uint32 tc_status, const char *trusted_dc_name)
139 info->flags = flags;
140 info->pdc_status = pdc_status;
141 info->ptr_trusted_dc_name = 1;
142 info->tc_status = tc_status;
144 if (trusted_dc_name != NULL)
145 init_unistr2(&info->uni_trusted_dc_name, trusted_dc_name, UNI_STR_TERMINATE);
146 else
147 init_unistr2(&info->uni_trusted_dc_name, "", UNI_STR_TERMINATE);
150 /*******************************************************************
151 Reads or writes a NETLOGON_INFO_2 structure.
152 ********************************************************************/
154 static BOOL net_io_netinfo_2(const char *desc, NETLOGON_INFO_2 *info, prs_struct *ps, int depth)
156 if (info == NULL)
157 return False;
159 prs_debug(ps, depth, desc, "net_io_netinfo_2");
160 depth++;
162 if(!prs_align(ps))
163 return False;
165 if(!prs_uint32("flags ", ps, depth, &info->flags))
166 return False;
167 if(!prs_uint32("pdc_status ", ps, depth, &info->pdc_status))
168 return False;
169 if(!prs_uint32("ptr_trusted_dc_name", ps, depth, &info->ptr_trusted_dc_name))
170 return False;
171 if(!prs_uint32("tc_status ", ps, depth, &info->tc_status))
172 return False;
174 if (info->ptr_trusted_dc_name != 0) {
175 if(!smb_io_unistr2("unistr2", &info->uni_trusted_dc_name, info->ptr_trusted_dc_name, ps, depth))
176 return False;
179 if(!prs_align(ps))
180 return False;
182 return True;
185 static BOOL net_io_ctrl_data_info_5(const char *desc, CTRL_DATA_INFO_5 *info, prs_struct *ps, int depth)
187 if (info == NULL)
188 return False;
190 prs_debug(ps, depth, desc, "net_io_ctrl_data_info_5");
191 depth++;
193 if ( !prs_uint32( "function_code", ps, depth, &info->function_code ) )
194 return False;
196 if(!prs_uint32("ptr_domain", ps, depth, &info->ptr_domain))
197 return False;
199 if ( info->ptr_domain ) {
200 if(!smb_io_unistr2("domain", &info->domain, info->ptr_domain, ps, depth))
201 return False;
204 return True;
207 static BOOL net_io_ctrl_data_info_6(const char *desc, CTRL_DATA_INFO_6 *info, prs_struct *ps, int depth)
209 if (info == NULL)
210 return False;
212 prs_debug(ps, depth, desc, "net_io_ctrl_data_info_6");
213 depth++;
215 if ( !prs_uint32( "function_code", ps, depth, &info->function_code ) )
216 return False;
218 if(!prs_uint32("ptr_domain", ps, depth, &info->ptr_domain))
219 return False;
221 if ( info->ptr_domain ) {
222 if(!smb_io_unistr2("domain", &info->domain, info->ptr_domain, ps, depth))
223 return False;
226 return True;
229 /*******************************************************************
230 Reads or writes an NET_Q_LOGON_CTRL2 structure.
231 ********************************************************************/
233 BOOL net_io_q_logon_ctrl2(const char *desc, NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth)
235 if (q_l == NULL)
236 return False;
238 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl2");
239 depth++;
241 if(!prs_align(ps))
242 return False;
244 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
245 return False;
247 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
248 return False;
250 if(!prs_align(ps))
251 return False;
253 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
254 return False;
255 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
256 return False;
257 switch ( q_l->function_code ) {
258 case NETLOGON_CONTROL_REDISCOVER:
259 if ( !net_io_ctrl_data_info_5( "ctrl_data_info5", &q_l->info.info5, ps, depth) )
260 return False;
261 break;
263 case NETLOGON_CONTROL_TC_QUERY:
264 if ( !net_io_ctrl_data_info_6( "ctrl_data_info6", &q_l->info.info6, ps, depth) )
265 return False;
266 break;
268 default:
269 DEBUG(0,("net_io_q_logon_ctrl2: unknown function_code [%d]\n",
270 q_l->function_code));
271 return False;
274 return True;
277 /*******************************************************************
278 Inits an NET_Q_LOGON_CTRL2 structure.
279 ********************************************************************/
281 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l, const char *srv_name,
282 uint32 query_level)
284 DEBUG(5,("init_q_logon_ctrl2\n"));
286 q_l->function_code = 0x01;
287 q_l->query_level = query_level;
289 init_unistr2(&q_l->uni_server_name, srv_name, UNI_STR_TERMINATE);
292 /*******************************************************************
293 Inits an NET_R_LOGON_CTRL2 structure.
294 ********************************************************************/
296 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l, uint32 query_level,
297 uint32 flags, uint32 pdc_status,
298 uint32 logon_attempts, uint32 tc_status,
299 const char *trusted_domain_name)
301 r_l->switch_value = query_level;
303 switch (query_level) {
304 case 1:
305 r_l->ptr = 1; /* undocumented pointer */
306 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
307 r_l->status = NT_STATUS_OK;
308 break;
309 case 2:
310 r_l->ptr = 1; /* undocumented pointer */
311 init_netinfo_2(&r_l->logon.info2, flags, pdc_status,
312 tc_status, trusted_domain_name);
313 r_l->status = NT_STATUS_OK;
314 break;
315 case 3:
316 r_l->ptr = 1; /* undocumented pointer */
317 init_netinfo_3(&r_l->logon.info3, flags, logon_attempts);
318 r_l->status = NT_STATUS_OK;
319 break;
320 default:
321 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
322 r_l->switch_value));
323 r_l->ptr = 0; /* undocumented pointer */
325 /* take a guess at an error code... */
326 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
327 break;
331 /*******************************************************************
332 Reads or writes an NET_R_LOGON_CTRL2 structure.
333 ********************************************************************/
335 BOOL net_io_r_logon_ctrl2(const char *desc, NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth)
337 if (r_l == NULL)
338 return False;
340 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl2");
341 depth++;
343 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
344 return False;
345 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
346 return False;
348 if (r_l->ptr != 0) {
349 switch (r_l->switch_value) {
350 case 1:
351 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
352 return False;
353 break;
354 case 2:
355 if(!net_io_netinfo_2("", &r_l->logon.info2, ps, depth))
356 return False;
357 break;
358 case 3:
359 if(!net_io_netinfo_3("", &r_l->logon.info3, ps, depth))
360 return False;
361 break;
362 default:
363 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
364 r_l->switch_value));
365 break;
369 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
370 return False;
372 return True;
375 /*******************************************************************
376 Reads or writes an NET_Q_LOGON_CTRL structure.
377 ********************************************************************/
379 BOOL net_io_q_logon_ctrl(const char *desc, NET_Q_LOGON_CTRL *q_l, prs_struct *ps,
380 int depth)
382 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl");
383 depth++;
385 if(!prs_align(ps))
386 return False;
388 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
389 return False;
391 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
392 return False;
394 if(!prs_align(ps))
395 return False;
397 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
398 return False;
399 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
400 return False;
402 return True;
405 /*******************************************************************
406 Inits an NET_Q_LOGON_CTRL structure.
407 ********************************************************************/
409 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL *q_l, const char *srv_name,
410 uint32 query_level)
412 DEBUG(5,("init_q_logon_ctrl\n"));
414 q_l->function_code = 0x01; /* ??? */
415 q_l->query_level = query_level;
417 init_unistr2(&q_l->uni_server_name, srv_name, UNI_STR_TERMINATE);
420 /*******************************************************************
421 Inits an NET_R_LOGON_CTRL structure.
422 ********************************************************************/
424 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL *r_l, uint32 query_level,
425 uint32 flags, uint32 pdc_status)
427 DEBUG(5,("init_r_logon_ctrl\n"));
429 r_l->switch_value = query_level; /* should only be 0x1 */
431 switch (query_level) {
432 case 1:
433 r_l->ptr = 1; /* undocumented pointer */
434 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
435 r_l->status = NT_STATUS_OK;
436 break;
437 default:
438 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
439 r_l->switch_value));
440 r_l->ptr = 0; /* undocumented pointer */
442 /* take a guess at an error code... */
443 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
444 break;
448 /*******************************************************************
449 Reads or writes an NET_R_LOGON_CTRL structure.
450 ********************************************************************/
452 BOOL net_io_r_logon_ctrl(const char *desc, NET_R_LOGON_CTRL *r_l, prs_struct *ps,
453 int depth)
455 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl");
456 depth++;
458 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
459 return False;
460 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
461 return False;
463 if (r_l->ptr != 0) {
464 switch (r_l->switch_value) {
465 case 1:
466 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
467 return False;
468 break;
469 default:
470 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
471 r_l->switch_value));
472 break;
476 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
477 return False;
479 return True;
482 /*******************************************************************
483 Inits an NET_R_GETDCNAME structure.
484 ********************************************************************/
485 void init_net_q_getdcname(NET_Q_GETDCNAME *r_t, const char *logon_server,
486 const char *domainname)
488 DEBUG(5,("init_r_getdcname\n"));
490 r_t->ptr_logon_server = (logon_server != NULL);
491 init_unistr2(&r_t->uni_logon_server, logon_server, UNI_STR_TERMINATE);
492 r_t->ptr_domainname = (domainname != NULL);
493 init_unistr2(&r_t->uni_domainname, domainname, UNI_STR_TERMINATE);
496 /*******************************************************************
497 Reads or writes an NET_Q_GETDCNAME structure.
498 ********************************************************************/
500 BOOL net_io_q_getdcname(const char *desc, NET_Q_GETDCNAME *r_t, prs_struct *ps,
501 int depth)
503 if (r_t == NULL)
504 return False;
506 prs_debug(ps, depth, desc, "net_io_q_getdcname");
507 depth++;
509 if (!prs_uint32("ptr_logon_server", ps, depth, &r_t->ptr_logon_server))
510 return False;
512 if (!smb_io_unistr2("logon_server", &r_t->uni_logon_server,
513 r_t->ptr_logon_server, ps, depth))
514 return False;
516 if (!prs_align(ps))
517 return False;
519 if (!prs_uint32("ptr_domainname", ps, depth, &r_t->ptr_domainname))
520 return False;
522 if (!smb_io_unistr2("domainname", &r_t->uni_domainname,
523 r_t->ptr_domainname, ps, depth))
524 return False;
526 return True;
530 /*******************************************************************
531 Inits an NET_R_GETDCNAME structure.
532 ********************************************************************/
533 void init_net_r_getdcname(NET_R_GETDCNAME *r_t, const char *dcname)
535 DEBUG(5,("init_r_getdcname\n"));
537 init_unistr2(&r_t->uni_dcname, dcname, UNI_STR_TERMINATE);
540 /*******************************************************************
541 Reads or writes an NET_R_GETDCNAME structure.
542 ********************************************************************/
544 BOOL net_io_r_getdcname(const char *desc, NET_R_GETDCNAME *r_t, prs_struct *ps,
545 int depth)
547 if (r_t == NULL)
548 return False;
550 prs_debug(ps, depth, desc, "net_io_r_getdcname");
551 depth++;
553 if (!prs_uint32("ptr_dcname", ps, depth, &r_t->ptr_dcname))
554 return False;
556 if (!smb_io_unistr2("dcname", &r_t->uni_dcname,
557 r_t->ptr_dcname, ps, depth))
558 return False;
560 if (!prs_align(ps))
561 return False;
563 if (!prs_ntstatus("status", ps, depth, &r_t->status))
564 return False;
566 return True;
569 /*******************************************************************
570 Inits an NET_R_TRUST_DOM_LIST structure.
571 ********************************************************************/
573 void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
574 uint32 num_doms, const char *dom_name)
576 unsigned int i = 0;
578 DEBUG(5,("init_r_trust_dom\n"));
580 for (i = 0; i < MAX_TRUST_DOMS; i++) {
581 r_t->uni_trust_dom_name[i].uni_str_len = 0;
582 r_t->uni_trust_dom_name[i].uni_max_len = 0;
584 if (num_doms > MAX_TRUST_DOMS)
585 num_doms = MAX_TRUST_DOMS;
587 for (i = 0; i < num_doms; i++) {
588 fstring domain_name;
589 fstrcpy(domain_name, dom_name);
590 strupper_m(domain_name);
591 init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, UNI_STR_TERMINATE);
592 /* the use of UNISTR2 here is non-standard. */
593 r_t->uni_trust_dom_name[i].offset = 0x1;
596 r_t->status = NT_STATUS_OK;
599 /*******************************************************************
600 Reads or writes an NET_R_TRUST_DOM_LIST structure.
601 ********************************************************************/
603 BOOL net_io_r_trust_dom(const char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth)
605 uint32 value;
607 if (r_t == NULL)
608 return False;
610 prs_debug(ps, depth, desc, "net_io_r_trust_dom");
611 depth++;
613 /* temporary code to give a valid response */
614 value=2;
615 if(!prs_uint32("status", ps, depth, &value))
616 return False;
618 value=1;
619 if(!prs_uint32("status", ps, depth, &value))
620 return False;
621 value=2;
622 if(!prs_uint32("status", ps, depth, &value))
623 return False;
625 value=0;
626 if(!prs_uint32("status", ps, depth, &value))
627 return False;
629 value=0;
630 if(!prs_uint32("status", ps, depth, &value))
631 return False;
633 /* old non working code */
634 #if 0
635 int i;
637 for (i = 0; i < MAX_TRUST_DOMS; i++) {
638 if (r_t->uni_trust_dom_name[i].uni_str_len == 0)
639 break;
640 if(!smb_io_unistr2("", &r_t->uni_trust_dom_name[i], True, ps, depth))
641 return False;
644 if(!prs_ntstatus("status", ps, depth, &r_t->status))
645 return False;
646 #endif
647 return True;
651 /*******************************************************************
652 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
653 ********************************************************************/
655 BOOL net_io_q_trust_dom(const char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth)
657 if (q_l == NULL)
658 return False;
660 prs_debug(ps, depth, desc, "net_io_q_trust_dom");
661 depth++;
663 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
664 return False;
665 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
666 return False;
668 return True;
671 /*******************************************************************
672 Inits an NET_Q_REQ_CHAL structure.
673 ********************************************************************/
675 void init_q_req_chal(NET_Q_REQ_CHAL *q_c,
676 const char *logon_srv, const char *logon_clnt,
677 const DOM_CHAL *clnt_chal)
679 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
681 q_c->undoc_buffer = 1; /* don't know what this buffer is */
683 init_unistr2(&q_c->uni_logon_srv, logon_srv , UNI_STR_TERMINATE);
684 init_unistr2(&q_c->uni_logon_clnt, logon_clnt, UNI_STR_TERMINATE);
686 memcpy(q_c->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
688 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
691 /*******************************************************************
692 Reads or writes an NET_Q_REQ_CHAL structure.
693 ********************************************************************/
695 BOOL net_io_q_req_chal(const char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth)
697 if (q_c == NULL)
698 return False;
700 prs_debug(ps, depth, desc, "net_io_q_req_chal");
701 depth++;
703 if(!prs_align(ps))
704 return False;
706 if(!prs_uint32("undoc_buffer", ps, depth, &q_c->undoc_buffer))
707 return False;
709 if(!smb_io_unistr2("", &q_c->uni_logon_srv, True, ps, depth)) /* logon server unicode string */
710 return False;
711 if(!smb_io_unistr2("", &q_c->uni_logon_clnt, True, ps, depth)) /* logon client unicode string */
712 return False;
714 if(!smb_io_chal("", &q_c->clnt_chal, ps, depth))
715 return False;
717 return True;
720 /*******************************************************************
721 Reads or writes a structure.
722 ********************************************************************/
724 BOOL net_io_r_req_chal(const char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth)
726 if (r_c == NULL)
727 return False;
729 prs_debug(ps, depth, desc, "net_io_r_req_chal");
730 depth++;
732 if(!prs_align(ps))
733 return False;
735 if(!smb_io_chal("", &r_c->srv_chal, ps, depth)) /* server challenge */
736 return False;
738 if(!prs_ntstatus("status", ps, depth, &r_c->status))
739 return False;
741 return True;
745 /*******************************************************************
746 Reads or writes a structure.
747 ********************************************************************/
749 BOOL net_io_q_auth(const char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth)
751 if (q_a == NULL)
752 return False;
754 prs_debug(ps, depth, desc, "net_io_q_auth");
755 depth++;
757 if(!prs_align(ps))
758 return False;
760 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
761 return False;
762 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
763 return False;
765 return True;
768 /*******************************************************************
769 Reads or writes a structure.
770 ********************************************************************/
772 BOOL net_io_r_auth(const char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth)
774 if (r_a == NULL)
775 return False;
777 prs_debug(ps, depth, desc, "net_io_r_auth");
778 depth++;
780 if(!prs_align(ps))
781 return False;
783 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
784 return False;
786 if(!prs_ntstatus("status", ps, depth, &r_a->status))
787 return False;
789 return True;
792 /*******************************************************************
793 Inits a NET_Q_AUTH_2 struct.
794 ********************************************************************/
796 void init_q_auth_2(NET_Q_AUTH_2 *q_a,
797 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
798 const DOM_CHAL *clnt_chal, uint32 clnt_flgs)
800 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
802 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
803 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
804 q_a->clnt_flgs.neg_flags = clnt_flgs;
806 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
809 /*******************************************************************
810 Reads or writes a structure.
811 ********************************************************************/
813 BOOL net_io_q_auth_2(const char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth)
815 if (q_a == NULL)
816 return False;
818 prs_debug(ps, depth, desc, "net_io_q_auth_2");
819 depth++;
821 if(!prs_align(ps))
822 return False;
824 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
825 return False;
826 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
827 return False;
828 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
829 return False;
831 return True;
834 /*******************************************************************
835 Reads or writes a structure.
836 ********************************************************************/
838 BOOL net_io_r_auth_2(const char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth)
840 if (r_a == NULL)
841 return False;
843 prs_debug(ps, depth, desc, "net_io_r_auth_2");
844 depth++;
846 if(!prs_align(ps))
847 return False;
849 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
850 return False;
851 if(!net_io_neg_flags("", &r_a->srv_flgs, ps, depth))
852 return False;
854 if(!prs_ntstatus("status", ps, depth, &r_a->status))
855 return False;
857 return True;
860 /*******************************************************************
861 Inits a NET_Q_AUTH_3 struct.
862 ********************************************************************/
864 void init_q_auth_3(NET_Q_AUTH_3 *q_a,
865 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
866 const DOM_CHAL *clnt_chal, uint32 clnt_flgs)
868 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
870 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
871 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
872 q_a->clnt_flgs.neg_flags = clnt_flgs;
874 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
877 /*******************************************************************
878 Reads or writes a structure.
879 ********************************************************************/
881 BOOL net_io_q_auth_3(const char *desc, NET_Q_AUTH_3 *q_a, prs_struct *ps, int depth)
883 if (q_a == NULL)
884 return False;
886 prs_debug(ps, depth, desc, "net_io_q_auth_3");
887 depth++;
889 if(!prs_align(ps))
890 return False;
892 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
893 return False;
894 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
895 return False;
896 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
897 return False;
899 return True;
902 /*******************************************************************
903 Reads or writes a structure.
904 ********************************************************************/
906 BOOL net_io_r_auth_3(const char *desc, NET_R_AUTH_3 *r_a, prs_struct *ps, int depth)
908 if (r_a == NULL)
909 return False;
911 prs_debug(ps, depth, desc, "net_io_r_auth_3");
912 depth++;
914 if(!prs_align(ps))
915 return False;
917 if(!smb_io_chal("srv_chal", &r_a->srv_chal, ps, depth)) /* server challenge */
918 return False;
919 if(!net_io_neg_flags("srv_flgs", &r_a->srv_flgs, ps, depth))
920 return False;
921 if (!prs_uint32("unknown", ps, depth, &r_a->unknown))
922 return False;
924 if(!prs_ntstatus("status", ps, depth, &r_a->status))
925 return False;
927 return True;
931 /*******************************************************************
932 Inits a NET_Q_SRV_PWSET.
933 ********************************************************************/
935 void init_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
936 const char *logon_srv, const char *sess_key, const char *acct_name,
937 uint16 sec_chan, const char *comp_name,
938 DOM_CRED *cred, const uchar hashed_mach_pwd[16])
940 unsigned char nt_cypher[16];
942 DEBUG(5,("init_q_srv_pwset\n"));
944 /* Process the new password. */
945 cred_hash3( nt_cypher, hashed_mach_pwd, (const unsigned char *)sess_key, 1);
947 init_clnt_info(&q_s->clnt_id, logon_srv, acct_name, sec_chan, comp_name, cred);
949 memcpy(q_s->pwd, nt_cypher, sizeof(q_s->pwd));
952 /*******************************************************************
953 Reads or writes a structure.
954 ********************************************************************/
956 BOOL net_io_q_srv_pwset(const char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth)
958 if (q_s == NULL)
959 return False;
961 prs_debug(ps, depth, desc, "net_io_q_srv_pwset");
962 depth++;
964 if(!prs_align(ps))
965 return False;
967 if(!smb_io_clnt_info("", &q_s->clnt_id, ps, depth)) /* client identification/authentication info */
968 return False;
969 if(!prs_uint8s (False, "pwd", ps, depth, q_s->pwd, 16)) /* new password - undocumented */
970 return False;
972 return True;
975 /*******************************************************************
976 Reads or writes a structure.
977 ********************************************************************/
979 BOOL net_io_r_srv_pwset(const char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth)
981 if (r_s == NULL)
982 return False;
984 prs_debug(ps, depth, desc, "net_io_r_srv_pwset");
985 depth++;
987 if(!prs_align(ps))
988 return False;
990 if(!smb_io_cred("", &r_s->srv_cred, ps, depth)) /* server challenge */
991 return False;
993 if(!prs_ntstatus("status", ps, depth, &r_s->status))
994 return False;
996 return True;
999 /*************************************************************************
1000 Init DOM_SID2 array from a string containing multiple sids
1001 *************************************************************************/
1003 static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsids)
1005 const char *ptr;
1006 pstring s2;
1007 int count = 0;
1009 DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
1011 *ppsids = NULL;
1013 if(sids_str) {
1014 int number;
1015 DOM_SID2 *sids;
1017 /* Count the number of valid SIDs. */
1018 for (count = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
1019 DOM_SID tmpsid;
1020 if (string_to_sid(&tmpsid, s2))
1021 count++;
1024 /* Now allocate space for them. */
1025 *ppsids = TALLOC_ZERO_ARRAY(ctx, DOM_SID2, count);
1026 if (*ppsids == NULL)
1027 return 0;
1029 sids = *ppsids;
1031 for (number = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
1032 DOM_SID tmpsid;
1033 if (string_to_sid(&tmpsid, s2)) {
1034 /* count only valid sids */
1035 init_dom_sid2(&sids[number], &tmpsid);
1036 number++;
1041 return count;
1044 /*******************************************************************
1045 Inits a NET_ID_INFO_1 structure.
1046 ********************************************************************/
1048 void init_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
1049 uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
1050 const char *user_name, const char *wksta_name,
1051 const char *sess_key,
1052 unsigned char lm_cypher[16], unsigned char nt_cypher[16])
1054 unsigned char lm_owf[16];
1055 unsigned char nt_owf[16];
1057 DEBUG(5,("init_id_info1: %d\n", __LINE__));
1059 id->ptr_id_info1 = 1;
1061 id->param_ctrl = param_ctrl;
1062 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1065 if (lm_cypher && nt_cypher) {
1066 unsigned char key[16];
1067 #ifdef DEBUG_PASSWORD
1068 DEBUG(100,("lm cypher:"));
1069 dump_data(100, (char *)lm_cypher, 16);
1071 DEBUG(100,("nt cypher:"));
1072 dump_data(100, (char *)nt_cypher, 16);
1073 #endif
1075 memset(key, 0, 16);
1076 memcpy(key, sess_key, 8);
1078 memcpy(lm_owf, lm_cypher, 16);
1079 SamOEMhash(lm_owf, key, 16);
1080 memcpy(nt_owf, nt_cypher, 16);
1081 SamOEMhash(nt_owf, key, 16);
1083 #ifdef DEBUG_PASSWORD
1084 DEBUG(100,("encrypt of lm owf password:"));
1085 dump_data(100, (char *)lm_owf, 16);
1087 DEBUG(100,("encrypt of nt owf password:"));
1088 dump_data(100, (char *)nt_owf, 16);
1089 #endif
1090 /* set up pointers to cypher blocks */
1091 lm_cypher = lm_owf;
1092 nt_cypher = nt_owf;
1095 init_owf_info(&id->lm_owf, lm_cypher);
1096 init_owf_info(&id->nt_owf, nt_cypher);
1098 init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
1099 init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
1100 init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
1101 init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
1102 init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
1103 init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
1106 /*******************************************************************
1107 Reads or writes an NET_ID_INFO_1 structure.
1108 ********************************************************************/
1110 static BOOL net_io_id_info1(const char *desc, NET_ID_INFO_1 *id, prs_struct *ps, int depth)
1112 if (id == NULL)
1113 return False;
1115 prs_debug(ps, depth, desc, "net_io_id_info1");
1116 depth++;
1118 if(!prs_align(ps))
1119 return False;
1121 if(!prs_uint32("ptr_id_info1", ps, depth, &id->ptr_id_info1))
1122 return False;
1124 if (id->ptr_id_info1 != 0) {
1125 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1126 return False;
1128 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1129 return False;
1130 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1131 return False;
1133 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1134 return False;
1135 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1136 return False;
1138 if(!smb_io_owf_info("", &id->lm_owf, ps, depth))
1139 return False;
1140 if(!smb_io_owf_info("", &id->nt_owf, ps, depth))
1141 return False;
1143 if(!smb_io_unistr2("unistr2", &id->uni_domain_name,
1144 id->hdr_domain_name.buffer, ps, depth))
1145 return False;
1146 if(!smb_io_unistr2("unistr2", &id->uni_user_name,
1147 id->hdr_user_name.buffer, ps, depth))
1148 return False;
1149 if(!smb_io_unistr2("unistr2", &id->uni_wksta_name,
1150 id->hdr_wksta_name.buffer, ps, depth))
1151 return False;
1154 return True;
1157 /*******************************************************************
1158 Inits a NET_ID_INFO_2 structure.
1160 This is a network logon packet. The log_id parameters
1161 are what an NT server would generate for LUID once the
1162 user is logged on. I don't think we care about them.
1164 Note that this has no access to the NT and LM hashed passwords,
1165 so it forwards the challenge, and the NT and LM responses (24
1166 bytes each) over the secure channel to the Domain controller
1167 for it to say yea or nay. This is the preferred method of
1168 checking for a logon as it doesn't export the password
1169 hashes to anyone who has compromised the secure channel. JRA.
1170 ********************************************************************/
1172 void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
1173 uint32 param_ctrl,
1174 uint32 log_id_low, uint32 log_id_high,
1175 const char *user_name, const char *wksta_name,
1176 const uchar lm_challenge[8],
1177 const uchar * lm_chal_resp, size_t lm_chal_resp_len,
1178 const uchar * nt_chal_resp, size_t nt_chal_resp_len)
1181 DEBUG(5,("init_id_info2: %d\n", __LINE__));
1183 id->ptr_id_info2 = 1;
1185 id->param_ctrl = param_ctrl;
1186 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1188 memcpy(id->lm_chal, lm_challenge, sizeof(id->lm_chal));
1189 init_str_hdr(&id->hdr_nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len, (nt_chal_resp != NULL) ? 1 : 0);
1190 init_str_hdr(&id->hdr_lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len, (lm_chal_resp != NULL) ? 1 : 0);
1192 init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
1193 init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
1194 init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
1195 init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
1196 init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
1197 init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
1199 init_string2(&id->nt_chal_resp, (const char *)nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len);
1200 init_string2(&id->lm_chal_resp, (const char *)lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len);
1204 /*******************************************************************
1205 Reads or writes an NET_ID_INFO_2 structure.
1206 ********************************************************************/
1208 static BOOL net_io_id_info2(const char *desc, NET_ID_INFO_2 *id, prs_struct *ps, int depth)
1210 if (id == NULL)
1211 return False;
1213 prs_debug(ps, depth, desc, "net_io_id_info2");
1214 depth++;
1216 if(!prs_align(ps))
1217 return False;
1219 if(!prs_uint32("ptr_id_info2", ps, depth, &id->ptr_id_info2))
1220 return False;
1222 if (id->ptr_id_info2 != 0) {
1223 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1224 return False;
1226 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1227 return False;
1228 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1229 return False;
1231 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1232 return False;
1233 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1234 return False;
1236 if(!prs_uint8s (False, "lm_chal", ps, depth, id->lm_chal, 8)) /* lm 8 byte challenge */
1237 return False;
1239 if(!smb_io_strhdr("hdr_nt_chal_resp", &id->hdr_nt_chal_resp, ps, depth))
1240 return False;
1241 if(!smb_io_strhdr("hdr_lm_chal_resp", &id->hdr_lm_chal_resp, ps, depth))
1242 return False;
1244 if(!smb_io_unistr2("uni_domain_name", &id->uni_domain_name,
1245 id->hdr_domain_name.buffer, ps, depth))
1246 return False;
1247 if(!smb_io_unistr2("uni_user_name ", &id->uni_user_name,
1248 id->hdr_user_name.buffer, ps, depth))
1249 return False;
1250 if(!smb_io_unistr2("uni_wksta_name ", &id->uni_wksta_name,
1251 id->hdr_wksta_name.buffer, ps, depth))
1252 return False;
1253 if(!smb_io_string2("nt_chal_resp", &id->nt_chal_resp,
1254 id->hdr_nt_chal_resp.buffer, ps, depth))
1255 return False;
1256 if(!smb_io_string2("lm_chal_resp", &id->lm_chal_resp,
1257 id->hdr_lm_chal_resp.buffer, ps, depth))
1258 return False;
1261 return True;
1265 /*******************************************************************
1266 Inits a DOM_SAM_INFO structure.
1267 ********************************************************************/
1269 void init_sam_info(DOM_SAM_INFO *sam,
1270 const char *logon_srv, const char *comp_name,
1271 DOM_CRED *clnt_cred,
1272 DOM_CRED *rtn_cred, uint16 logon_level,
1273 NET_ID_INFO_CTR *ctr)
1275 DEBUG(5,("init_sam_info: %d\n", __LINE__));
1277 init_clnt_info2(&sam->client, logon_srv, comp_name, clnt_cred);
1279 if (rtn_cred != NULL) {
1280 sam->ptr_rtn_cred = 1;
1281 memcpy(&sam->rtn_cred, rtn_cred, sizeof(sam->rtn_cred));
1282 } else {
1283 sam->ptr_rtn_cred = 0;
1286 sam->logon_level = logon_level;
1287 sam->ctr = ctr;
1290 /*******************************************************************
1291 Reads or writes a DOM_SAM_INFO structure.
1292 ********************************************************************/
1294 static BOOL net_io_id_info_ctr(const char *desc, NET_ID_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
1296 NET_ID_INFO_CTR *ctr = *pp_ctr;
1298 prs_debug(ps, depth, desc, "smb_io_sam_info_ctr");
1299 depth++;
1301 if (UNMARSHALLING(ps)) {
1302 ctr = *pp_ctr = PRS_ALLOC_MEM(ps, NET_ID_INFO_CTR, 1);
1303 if (ctr == NULL)
1304 return False;
1307 if (ctr == NULL)
1308 return False;
1310 /* don't 4-byte align here! */
1312 if(!prs_uint16("switch_value ", ps, depth, &ctr->switch_value))
1313 return False;
1315 switch (ctr->switch_value) {
1316 case 1:
1317 if(!net_io_id_info1("", &ctr->auth.id1, ps, depth))
1318 return False;
1319 break;
1320 case 2:
1321 if(!net_io_id_info2("", &ctr->auth.id2, ps, depth))
1322 return False;
1323 break;
1324 default:
1325 /* PANIC! */
1326 DEBUG(4,("smb_io_sam_info_ctr: unknown switch_value!\n"));
1327 break;
1330 return True;
1333 /*******************************************************************
1334 Reads or writes a DOM_SAM_INFO structure.
1335 ********************************************************************/
1337 static BOOL smb_io_sam_info(const char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int depth)
1339 if (sam == NULL)
1340 return False;
1342 prs_debug(ps, depth, desc, "smb_io_sam_info");
1343 depth++;
1345 if(!prs_align(ps))
1346 return False;
1348 if(!smb_io_clnt_info2("", &sam->client, ps, depth))
1349 return False;
1351 if(!prs_uint32("ptr_rtn_cred ", ps, depth, &sam->ptr_rtn_cred))
1352 return False;
1353 if (sam->ptr_rtn_cred) {
1354 if(!smb_io_cred("", &sam->rtn_cred, ps, depth))
1355 return False;
1358 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1359 return False;
1361 if (sam->logon_level != 0) {
1362 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1363 return False;
1366 return True;
1369 /*******************************************************************
1370 Reads or writes a DOM_SAM_INFO_EX structure.
1371 ********************************************************************/
1373 static BOOL smb_io_sam_info_ex(const char *desc, DOM_SAM_INFO_EX *sam, prs_struct *ps, int depth)
1375 if (sam == NULL)
1376 return False;
1378 prs_debug(ps, depth, desc, "smb_io_sam_info_ex");
1379 depth++;
1381 if(!prs_align(ps))
1382 return False;
1384 if(!smb_io_clnt_srv("", &sam->client, ps, depth))
1385 return False;
1387 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1388 return False;
1390 if (sam->logon_level != 0) {
1391 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1392 return False;
1395 return True;
1398 /*************************************************************************
1399 Inits a NET_USER_INFO_3 structure.
1401 This is a network logon reply packet, and contains much information about
1402 the user. This information is passed as a (very long) paramater list
1403 to avoid having to link in the PASSDB code to every program that deals
1404 with this file.
1405 *************************************************************************/
1407 void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
1408 uint32 user_rid,
1409 uint32 group_rid,
1411 const char* user_name,
1412 const char* full_name,
1413 const char* home_dir,
1414 const char* dir_drive,
1415 const char* logon_script,
1416 const char* profile_path,
1418 time_t unix_logon_time,
1419 time_t unix_logoff_time,
1420 time_t unix_kickoff_time,
1421 time_t unix_pass_last_set_time,
1422 time_t unix_pass_can_change_time,
1423 time_t unix_pass_must_change_time,
1425 uint16 logon_count, uint16 bad_pw_count,
1426 uint32 num_groups, const DOM_GID *gids,
1427 uint32 user_flgs, uint32 acct_flags,
1428 uchar user_session_key[16],
1429 uchar lm_session_key[16],
1430 const char *logon_srv, const char *logon_dom,
1431 const DOM_SID *dom_sid)
1433 /* only cope with one "other" sid, right now. */
1434 /* need to count the number of space-delimited sids */
1435 unsigned int i;
1436 int num_other_sids = 0;
1438 NTTIME logon_time, logoff_time, kickoff_time,
1439 pass_last_set_time, pass_can_change_time,
1440 pass_must_change_time;
1442 ZERO_STRUCTP(usr);
1444 usr->ptr_user_info = 1; /* yes, we're bothering to put USER_INFO data here */
1446 /* Create NTTIME structs */
1447 unix_to_nt_time (&logon_time, unix_logon_time);
1448 unix_to_nt_time (&logoff_time, unix_logoff_time);
1449 unix_to_nt_time (&kickoff_time, unix_kickoff_time);
1450 unix_to_nt_time (&pass_last_set_time, unix_pass_last_set_time);
1451 unix_to_nt_time (&pass_can_change_time, unix_pass_can_change_time);
1452 unix_to_nt_time (&pass_must_change_time, unix_pass_must_change_time);
1454 usr->logon_time = logon_time;
1455 usr->logoff_time = logoff_time;
1456 usr->kickoff_time = kickoff_time;
1457 usr->pass_last_set_time = pass_last_set_time;
1458 usr->pass_can_change_time = pass_can_change_time;
1459 usr->pass_must_change_time = pass_must_change_time;
1461 usr->logon_count = logon_count;
1462 usr->bad_pw_count = bad_pw_count;
1464 usr->user_rid = user_rid;
1465 usr->group_rid = group_rid;
1466 usr->num_groups = num_groups;
1468 usr->buffer_groups = 1; /* indicates fill in groups, below, even if there are none */
1469 usr->user_flgs = user_flgs;
1470 usr->acct_flags = acct_flags;
1472 if (user_session_key != NULL)
1473 memcpy(usr->user_sess_key, user_session_key, sizeof(usr->user_sess_key));
1474 else
1475 memset((char *)usr->user_sess_key, '\0', sizeof(usr->user_sess_key));
1477 usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
1479 memset((char *)usr->lm_sess_key, '\0', sizeof(usr->lm_sess_key));
1481 for (i=0; i<7; i++) {
1482 memset(&usr->unknown[i], '\0', sizeof(usr->unknown));
1485 if (lm_session_key != NULL) {
1486 memcpy(usr->lm_sess_key, lm_session_key, sizeof(usr->lm_sess_key));
1489 num_other_sids = init_dom_sid2s(ctx, NULL, &usr->other_sids);
1491 usr->num_other_sids = num_other_sids;
1492 usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0;
1494 init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
1495 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
1496 init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
1497 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
1498 init_unistr2(&usr->uni_logon_script, logon_script, UNI_FLAGS_NONE);
1499 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
1500 init_unistr2(&usr->uni_profile_path, profile_path, UNI_FLAGS_NONE);
1501 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
1502 init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
1503 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
1504 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
1505 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
1507 usr->num_groups2 = num_groups;
1509 usr->gids = TALLOC_ZERO_ARRAY(ctx,DOM_GID,num_groups);
1510 if (usr->gids == NULL && num_groups>0)
1511 return;
1513 for (i = 0; i < num_groups; i++)
1514 usr->gids[i] = gids[i];
1516 init_unistr2(&usr->uni_logon_srv, logon_srv, UNI_FLAGS_NONE);
1517 init_uni_hdr(&usr->hdr_logon_srv, &usr->uni_logon_srv);
1518 init_unistr2(&usr->uni_logon_dom, logon_dom, UNI_FLAGS_NONE);
1519 init_uni_hdr(&usr->hdr_logon_dom, &usr->uni_logon_dom);
1521 init_dom_sid2(&usr->dom_sid, dom_sid);
1522 /* "other" sids are set up above */
1525 void dump_acct_flags(uint32 acct_flags) {
1527 int lvl = 10;
1528 DEBUG(lvl,("dump_acct_flags\n"));
1529 if (acct_flags & ACB_NORMAL) {
1530 DEBUGADD(lvl,("\taccount has ACB_NORMAL\n"));
1532 if (acct_flags & ACB_PWNOEXP) {
1533 DEBUGADD(lvl,("\taccount has ACB_PWNOEXP\n"));
1535 if (acct_flags & ACB_ENC_TXT_PWD_ALLOWED) {
1536 DEBUGADD(lvl,("\taccount has ACB_ENC_TXT_PWD_ALLOWED\n"));
1538 if (acct_flags & ACB_NOT_DELEGATED) {
1539 DEBUGADD(lvl,("\taccount has ACB_NOT_DELEGATED\n"));
1541 if (acct_flags & ACB_USE_DES_KEY_ONLY) {
1542 DEBUGADD(lvl,("\taccount has ACB_USE_DES_KEY_ONLY set, sig verify wont work\n"));
1544 if (acct_flags & ACB_NO_AUTH_DATA_REQD) {
1545 DEBUGADD(lvl,("\taccount has ACB_NO_AUTH_DATA_REQD set\n"));
1547 if (acct_flags & ACB_PWEXPIRED) {
1548 DEBUGADD(lvl,("\taccount has ACB_PWEXPIRED set\n"));
1552 void dump_user_flgs(uint32 user_flags) {
1554 int lvl = 10;
1555 DEBUG(lvl,("dump_user_flgs\n"));
1556 if (user_flags & LOGON_EXTRA_SIDS) {
1557 DEBUGADD(lvl,("\taccount has LOGON_EXTRA_SIDS\n"));
1559 if (user_flags & LOGON_RESOURCE_GROUPS) {
1560 DEBUGADD(lvl,("\taccount has LOGON_RESOURCE_GROUPS\n"));
1562 if (user_flags & LOGON_NTLMV2_ENABLED) {
1563 DEBUGADD(lvl,("\taccount has LOGON_NTLMV2_ENABLED\n"));
1565 if (user_flags & LOGON_CACHED_ACCOUNT) {
1566 DEBUGADD(lvl,("\taccount has LOGON_CACHED_ACCOUNT\n"));
1568 if (user_flags & LOGON_PROFILE_PATH_RETURNED) {
1569 DEBUGADD(lvl,("\taccount has LOGON_PROFILE_PATH_RETURNED\n"));
1571 if (user_flags & LOGON_SERVER_TRUST_ACCOUNT) {
1572 DEBUGADD(lvl,("\taccount has LOGON_SERVER_TRUST_ACCOUNT\n"));
1578 /*******************************************************************
1579 This code has been modified to cope with a NET_USER_INFO_2 - which is
1580 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1581 We use validation level to determine if we're marshalling a info 2 or
1582 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1583 Jacobsen at HP. JRA.
1584 ********************************************************************/
1586 BOOL net_io_user_info3(const char *desc, NET_USER_INFO_3 *usr, prs_struct *ps,
1587 int depth, uint16 validation_level, BOOL kerb_validation_level)
1589 unsigned int i;
1591 if (usr == NULL)
1592 return False;
1594 prs_debug(ps, depth, desc, "net_io_user_info3");
1595 depth++;
1597 if (UNMARSHALLING(ps))
1598 ZERO_STRUCTP(usr);
1600 if(!prs_align(ps))
1601 return False;
1603 if(!prs_uint32("ptr_user_info ", ps, depth, &usr->ptr_user_info))
1604 return False;
1606 if (usr->ptr_user_info == 0)
1607 return True;
1609 if(!smb_io_time("logon time", &usr->logon_time, ps, depth)) /* logon time */
1610 return False;
1611 if(!smb_io_time("logoff time", &usr->logoff_time, ps, depth)) /* logoff time */
1612 return False;
1613 if(!smb_io_time("kickoff time", &usr->kickoff_time, ps, depth)) /* kickoff time */
1614 return False;
1615 if(!smb_io_time("last set time", &usr->pass_last_set_time, ps, depth)) /* password last set time */
1616 return False;
1617 if(!smb_io_time("can change time", &usr->pass_can_change_time , ps, depth)) /* password can change time */
1618 return False;
1619 if(!smb_io_time("must change time", &usr->pass_must_change_time, ps, depth)) /* password must change time */
1620 return False;
1622 if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
1623 return False;
1624 if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
1625 return False;
1626 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
1627 return False;
1628 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
1629 return False;
1630 if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
1631 return False;
1632 if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive unicode string header */
1633 return False;
1635 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count)) /* logon count */
1636 return False;
1637 if(!prs_uint16("bad_pw_count ", ps, depth, &usr->bad_pw_count)) /* bad password count */
1638 return False;
1640 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User RID */
1641 return False;
1642 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group RID */
1643 return False;
1644 if(!prs_uint32("num_groups ", ps, depth, &usr->num_groups)) /* num groups */
1645 return False;
1646 if(!prs_uint32("buffer_groups ", ps, depth, &usr->buffer_groups)) /* undocumented buffer pointer to groups. */
1647 return False;
1648 if(!prs_uint32("user_flgs ", ps, depth, &usr->user_flgs)) /* user flags */
1649 return False;
1650 dump_user_flgs(usr->user_flgs);
1651 if(!prs_uint8s(False, "user_sess_key", ps, depth, usr->user_sess_key, 16)) /* user session key */
1652 return False;
1654 if(!smb_io_unihdr("hdr_logon_srv", &usr->hdr_logon_srv, ps, depth)) /* logon server unicode string header */
1655 return False;
1656 if(!smb_io_unihdr("hdr_logon_dom", &usr->hdr_logon_dom, ps, depth)) /* logon domain unicode string header */
1657 return False;
1659 if(!prs_uint32("buffer_dom_id ", ps, depth, &usr->buffer_dom_id)) /* undocumented logon domain id pointer */
1660 return False;
1662 if(!prs_uint8s(False, "lm_sess_key", ps, depth, usr->lm_sess_key, 8)) /* lm session key */
1663 return False;
1665 if(!prs_uint32("acct_flags ", ps, depth, &usr->acct_flags)) /* Account flags */
1666 return False;
1667 dump_acct_flags(usr->acct_flags);
1668 for (i = 0; i < 7; i++)
1670 if (!prs_uint32("unkown", ps, depth, &usr->unknown[i])) /* unknown */
1671 return False;
1674 if (validation_level == 3) {
1675 if(!prs_uint32("num_other_sids", ps, depth, &usr->num_other_sids)) /* 0 - num_sids */
1676 return False;
1677 if(!prs_uint32("buffer_other_sids", ps, depth, &usr->buffer_other_sids)) /* NULL - undocumented pointer to SIDs. */
1678 return False;
1679 } else {
1680 if (UNMARSHALLING(ps)) {
1681 usr->num_other_sids = 0;
1682 usr->buffer_other_sids = 0;
1686 /* get kerb validation info (not really part of user_info_3) - Guenther */
1688 if (kerb_validation_level) {
1690 if(!prs_uint32("ptr_res_group_dom_sid", ps, depth, &usr->ptr_res_group_dom_sid))
1691 return False;
1692 if(!prs_uint32("res_group_count", ps, depth, &usr->res_group_count))
1693 return False;
1694 if(!prs_uint32("ptr_res_groups", ps, depth, &usr->ptr_res_groups))
1695 return False;
1698 if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
1699 return False;
1700 if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
1701 return False;
1702 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
1703 return False;
1704 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
1705 return False;
1706 if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
1707 return False;
1708 if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
1709 return False;
1711 if(!prs_align(ps))
1712 return False;
1714 if(!prs_uint32("num_groups2 ", ps, depth, &usr->num_groups2)) /* num groups2 */
1715 return False;
1717 if (usr->num_groups != usr->num_groups2) {
1718 DEBUG(3,("net_io_user_info3: num_groups mismatch! (%d != %d)\n",
1719 usr->num_groups, usr->num_groups2));
1720 return False;
1723 if (UNMARSHALLING(ps)) {
1724 usr->gids = PRS_ALLOC_MEM(ps, DOM_GID, usr->num_groups);
1725 if (usr->gids == NULL)
1726 return False;
1729 for (i = 0; i < usr->num_groups; i++) {
1730 if(!smb_io_gid("", &usr->gids[i], ps, depth)) /* group info */
1731 return False;
1734 if(!smb_io_unistr2("uni_logon_srv", &usr->uni_logon_srv, usr->hdr_logon_srv.buffer, ps, depth)) /* logon server unicode string */
1735 return False;
1736 if(!smb_io_unistr2("uni_logon_dom", &usr->uni_logon_dom, usr->hdr_logon_dom.buffer, ps, depth)) /* logon domain unicode string */
1737 return False;
1739 if(!smb_io_dom_sid2("", &usr->dom_sid, ps, depth)) /* domain SID */
1740 return False;
1742 if (validation_level == 3 && usr->buffer_other_sids) {
1744 uint32 num_other_sids = usr->num_other_sids;
1746 if (!(usr->user_flgs & LOGON_EXTRA_SIDS)) {
1747 DEBUG(10,("net_io_user_info3: user_flgs attribute does not have LOGON_EXTRA_SIDS\n"));
1748 /* return False; */
1751 if (!prs_uint32("num_other_sids", ps, depth,
1752 &num_other_sids))
1753 return False;
1755 if (num_other_sids != usr->num_other_sids)
1756 return False;
1758 if (UNMARSHALLING(ps)) {
1759 usr->other_sids = PRS_ALLOC_MEM(ps, DOM_SID2, usr->num_other_sids);
1760 usr->other_sids_attrib =
1761 PRS_ALLOC_MEM(ps, uint32, usr->num_other_sids);
1763 if ((num_other_sids != 0) &&
1764 ((usr->other_sids == NULL) ||
1765 (usr->other_sids_attrib == NULL)))
1766 return False;
1769 /* First the pointers to the SIDS and attributes */
1771 depth++;
1773 for (i=0; i<usr->num_other_sids; i++) {
1774 uint32 ptr = 1;
1776 if (!prs_uint32("sid_ptr", ps, depth, &ptr))
1777 return False;
1779 if (UNMARSHALLING(ps) && (ptr == 0))
1780 return False;
1782 if (!prs_uint32("attribute", ps, depth,
1783 &usr->other_sids_attrib[i]))
1784 return False;
1787 for (i = 0; i < usr->num_other_sids; i++) {
1788 if(!smb_io_dom_sid2("", &usr->other_sids[i], ps, depth)) /* other domain SIDs */
1789 return False;
1792 depth--;
1795 return True;
1798 /*******************************************************************
1799 Reads or writes a structure.
1800 ********************************************************************/
1802 BOOL net_io_q_sam_logon(const char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth)
1804 if (q_l == NULL)
1805 return False;
1807 prs_debug(ps, depth, desc, "net_io_q_sam_logon");
1808 depth++;
1810 if(!prs_align(ps))
1811 return False;
1813 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth))
1814 return False;
1816 if(!prs_align_uint16(ps))
1817 return False;
1819 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1820 return False;
1822 return True;
1825 /*******************************************************************
1826 Reads or writes a structure.
1827 ********************************************************************/
1829 BOOL net_io_r_sam_logon(const char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth)
1831 if (r_l == NULL)
1832 return False;
1834 prs_debug(ps, depth, desc, "net_io_r_sam_logon");
1835 depth++;
1837 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1838 return False;
1839 if (&r_l->buffer_creds) {
1840 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1841 return False;
1844 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1845 return False;
1846 if(!prs_align(ps))
1847 return False;
1849 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1850 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
1851 return False;
1852 #else
1853 if (r_l->switch_value != 0) {
1854 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
1855 return False;
1857 #endif
1859 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1860 return False;
1862 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1863 return False;
1865 if(!prs_align(ps))
1866 return False;
1868 return True;
1871 /*******************************************************************
1872 Reads or writes a structure.
1873 ********************************************************************/
1875 BOOL net_io_q_sam_logon_ex(const char *desc, NET_Q_SAM_LOGON_EX *q_l, prs_struct *ps, int depth)
1877 if (q_l == NULL)
1878 return False;
1880 prs_debug(ps, depth, desc, "net_io_q_sam_logon_ex");
1881 depth++;
1883 if(!prs_align(ps))
1884 return False;
1886 if(!smb_io_sam_info_ex("", &q_l->sam_id, ps, depth))
1887 return False;
1889 if(!prs_align_uint16(ps))
1890 return False;
1892 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1893 return False;
1895 if(!prs_uint32("flags ", ps, depth, &q_l->flags))
1896 return False;
1898 return True;
1901 /*******************************************************************
1902 Reads or writes a structure.
1903 ********************************************************************/
1905 BOOL net_io_r_sam_logon_ex(const char *desc, NET_R_SAM_LOGON_EX *r_l, prs_struct *ps, int depth)
1907 if (r_l == NULL)
1908 return False;
1910 prs_debug(ps, depth, desc, "net_io_r_sam_logon_ex");
1911 depth++;
1913 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1914 return False;
1915 if(!prs_align(ps))
1916 return False;
1918 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1919 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
1920 return False;
1921 #else
1922 if (r_l->switch_value != 0) {
1923 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
1924 return False;
1926 #endif
1928 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1929 return False;
1931 if(!prs_uint32("flags ", ps, depth, &r_l->flags))
1932 return False;
1934 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1935 return False;
1937 if(!prs_align(ps))
1938 return False;
1940 return True;
1944 /*******************************************************************
1945 Reads or writes a structure.
1946 ********************************************************************/
1948 BOOL net_io_q_sam_logoff(const char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth)
1950 if (q_l == NULL)
1951 return False;
1953 prs_debug(ps, depth, desc, "net_io_q_sam_logoff");
1954 depth++;
1956 if(!prs_align(ps))
1957 return False;
1959 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
1960 return False;
1962 return True;
1965 /*******************************************************************
1966 Reads or writes a structure.
1967 ********************************************************************/
1969 BOOL net_io_r_sam_logoff(const char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth)
1971 if (r_l == NULL)
1972 return False;
1974 prs_debug(ps, depth, desc, "net_io_r_sam_logoff");
1975 depth++;
1977 if(!prs_align(ps))
1978 return False;
1980 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1981 return False;
1982 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1983 return False;
1985 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1986 return False;
1988 return True;
1991 /*******************************************************************
1992 makes a NET_Q_SAM_SYNC structure.
1993 ********************************************************************/
1994 BOOL init_net_q_sam_sync(NET_Q_SAM_SYNC * q_s, const char *srv_name,
1995 const char *cli_name, DOM_CRED *cli_creds,
1996 DOM_CRED *ret_creds, uint32 database_id,
1997 uint32 next_rid)
1999 DEBUG(5, ("init_q_sam_sync\n"));
2001 init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
2002 init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
2004 if (cli_creds)
2005 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
2007 if (cli_creds)
2008 memcpy(&q_s->ret_creds, ret_creds, sizeof(q_s->ret_creds));
2009 else
2010 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
2012 q_s->database_id = database_id;
2013 q_s->restart_state = 0;
2014 q_s->sync_context = next_rid;
2015 q_s->max_size = 0xffff;
2017 return True;
2020 /*******************************************************************
2021 reads or writes a structure.
2022 ********************************************************************/
2023 BOOL net_io_q_sam_sync(const char *desc, NET_Q_SAM_SYNC * q_s, prs_struct *ps,
2024 int depth)
2026 prs_debug(ps, depth, desc, "net_io_q_sam_sync");
2027 depth++;
2029 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
2030 return False;
2031 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
2032 return False;
2034 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
2035 return False;
2036 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
2037 return False;
2039 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
2040 return False;
2041 if (!prs_uint32("restart_state", ps, depth, &q_s->restart_state))
2042 return False;
2043 if (!prs_uint32("sync_context ", ps, depth, &q_s->sync_context))
2044 return False;
2046 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
2047 return False;
2049 return True;
2052 /*******************************************************************
2053 reads or writes a structure.
2054 ********************************************************************/
2055 static BOOL net_io_sam_delta_hdr(const char *desc, SAM_DELTA_HDR * delta,
2056 prs_struct *ps, int depth)
2058 prs_debug(ps, depth, desc, "net_io_sam_delta_hdr");
2059 depth++;
2061 if (!prs_uint16("type", ps, depth, &delta->type))
2062 return False;
2063 if (!prs_uint16("type2", ps, depth, &delta->type2))
2064 return False;
2065 if (!prs_uint32("target_rid", ps, depth, &delta->target_rid))
2066 return False;
2068 if (!prs_uint32("type3", ps, depth, &delta->type3))
2069 return False;
2071 /* Not sure why we need this but it seems to be necessary to get
2072 sam deltas working. */
2074 if (delta->type != 0x16) {
2075 if (!prs_uint32("ptr_delta", ps, depth, &delta->ptr_delta))
2076 return False;
2079 return True;
2082 /*******************************************************************
2083 reads or writes a structure.
2084 ********************************************************************/
2085 static BOOL net_io_sam_delta_mod_count(const char *desc, SAM_DELTA_MOD_COUNT *info,
2086 prs_struct *ps, int depth)
2088 prs_debug(ps, depth, desc, "net_io_sam_delta_stamp");
2089 depth++;
2091 if (!prs_uint32("seqnum", ps, depth, &info->seqnum))
2092 return False;
2093 if (!prs_uint32("dom_mod_count_ptr", ps, depth,
2094 &info->dom_mod_count_ptr))
2095 return False;
2097 if (info->dom_mod_count_ptr) {
2098 if (!prs_uint64("dom_mod_count", ps, depth,
2099 &info->dom_mod_count))
2100 return False;
2103 return True;
2106 /*******************************************************************
2107 reads or writes a structure.
2108 ********************************************************************/
2109 static BOOL net_io_sam_domain_info(const char *desc, SAM_DOMAIN_INFO * info,
2110 prs_struct *ps, int depth)
2112 prs_debug(ps, depth, desc, "net_io_sam_domain_info");
2113 depth++;
2115 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
2116 return False;
2117 if (!smb_io_unihdr("hdr_oem_info", &info->hdr_oem_info, ps, depth))
2118 return False;
2120 if (!prs_uint64("force_logoff", ps, depth, &info->force_logoff))
2121 return False;
2122 if (!prs_uint16("min_pwd_len", ps, depth, &info->min_pwd_len))
2123 return False;
2124 if (!prs_uint16("pwd_history_len", ps, depth, &info->pwd_history_len))
2125 return False;
2126 if (!prs_uint64("max_pwd_age", ps, depth, &info->max_pwd_age))
2127 return False;
2128 if (!prs_uint64("min_pwd_age", ps, depth, &info->min_pwd_age))
2129 return False;
2130 if (!prs_uint64("dom_mod_count", ps, depth, &info->dom_mod_count))
2131 return False;
2132 if (!smb_io_time("creation_time", &info->creation_time, ps, depth))
2133 return False;
2134 if (!prs_uint32("security_information", ps, depth, &info->security_information))
2135 return False;
2136 if (!smb_io_bufhdr4("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2137 return False;
2138 if (!smb_io_lockout_string_hdr("hdr_account_lockout_string", &info->hdr_account_lockout, ps, depth))
2139 return False;
2140 if (!smb_io_unihdr("hdr_unknown2", &info->hdr_unknown2, ps, depth))
2141 return False;
2142 if (!smb_io_unihdr("hdr_unknown3", &info->hdr_unknown3, ps, depth))
2143 return False;
2144 if (!smb_io_unihdr("hdr_unknown4", &info->hdr_unknown4, ps, depth))
2145 return False;
2146 if (!prs_uint32("logon_chgpass", ps, depth, &info->logon_chgpass))
2147 return False;
2148 if (!prs_uint32("unknown6", ps, depth, &info->unknown6))
2149 return False;
2150 if (!prs_uint32("unknown7", ps, depth, &info->unknown7))
2151 return False;
2152 if (!prs_uint32("unknown8", ps, depth, &info->unknown8))
2153 return False;
2155 if (!smb_io_unistr2("uni_dom_name", &info->uni_dom_name,
2156 info->hdr_dom_name.buffer, ps, depth))
2157 return False;
2158 if (!smb_io_unistr2("buf_oem_info", &info->buf_oem_info,
2159 info->hdr_oem_info.buffer, ps, depth))
2160 return False;
2162 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2163 return False;
2165 if (!smb_io_account_lockout_str("account_lockout", &info->account_lockout,
2166 info->hdr_account_lockout.buffer, ps, depth))
2167 return False;
2169 if (!smb_io_unistr2("buf_unknown2", &info->buf_unknown2,
2170 info->hdr_unknown2.buffer, ps, depth))
2171 return False;
2172 if (!smb_io_unistr2("buf_unknown3", &info->buf_unknown3,
2173 info->hdr_unknown3.buffer, ps, depth))
2174 return False;
2175 if (!smb_io_unistr2("buf_unknown4", &info->buf_unknown4,
2176 info->hdr_unknown4.buffer, ps, depth))
2177 return False;
2179 return True;
2182 /*******************************************************************
2183 reads or writes a structure.
2184 ********************************************************************/
2185 static BOOL net_io_sam_group_info(const char *desc, SAM_GROUP_INFO * info,
2186 prs_struct *ps, int depth)
2188 prs_debug(ps, depth, desc, "net_io_sam_group_info");
2189 depth++;
2191 if (!smb_io_unihdr("hdr_grp_name", &info->hdr_grp_name, ps, depth))
2192 return False;
2193 if (!smb_io_gid("gid", &info->gid, ps, depth))
2194 return False;
2195 if (!smb_io_unihdr("hdr_grp_desc", &info->hdr_grp_desc, ps, depth))
2196 return False;
2197 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2198 return False;
2200 if (ps->data_offset + 48 > ps->buffer_size)
2201 return False;
2202 ps->data_offset += 48;
2204 if (!smb_io_unistr2("uni_grp_name", &info->uni_grp_name,
2205 info->hdr_grp_name.buffer, ps, depth))
2206 return False;
2207 if (!smb_io_unistr2("uni_grp_desc", &info->uni_grp_desc,
2208 info->hdr_grp_desc.buffer, ps, depth))
2209 return False;
2210 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2211 return False;
2213 return True;
2216 /*******************************************************************
2217 reads or writes a structure.
2218 ********************************************************************/
2219 static BOOL net_io_sam_passwd_info(const char *desc, SAM_PWD * pwd,
2220 prs_struct *ps, int depth)
2222 prs_debug(ps, depth, desc, "net_io_sam_passwd_info");
2223 depth++;
2225 if (!prs_uint32("unk_0 ", ps, depth, &pwd->unk_0))
2226 return False;
2228 if (!smb_io_unihdr("hdr_lm_pwd", &pwd->hdr_lm_pwd, ps, depth))
2229 return False;
2230 if (!prs_uint8s(False, "buf_lm_pwd", ps, depth, pwd->buf_lm_pwd, 16))
2231 return False;
2233 if (!smb_io_unihdr("hdr_nt_pwd", &pwd->hdr_nt_pwd, ps, depth))
2234 return False;
2235 if (!prs_uint8s(False, "buf_nt_pwd", ps, depth, pwd->buf_nt_pwd, 16))
2236 return False;
2238 if (!smb_io_unihdr("", &pwd->hdr_empty_lm, ps, depth))
2239 return False;
2240 if (!smb_io_unihdr("", &pwd->hdr_empty_nt, ps, depth))
2241 return False;
2243 return True;
2246 /*******************************************************************
2247 reads or writes a structure.
2248 ********************************************************************/
2249 static BOOL net_io_sam_account_info(const char *desc, SAM_ACCOUNT_INFO *info,
2250 prs_struct *ps, int depth)
2252 BUFHDR2 hdr_priv_data;
2253 uint32 i;
2255 prs_debug(ps, depth, desc, "net_io_sam_account_info");
2256 depth++;
2258 if (!smb_io_unihdr("hdr_acct_name", &info->hdr_acct_name, ps, depth))
2259 return False;
2260 if (!smb_io_unihdr("hdr_full_name", &info->hdr_full_name, ps, depth))
2261 return False;
2263 if (!prs_uint32("user_rid ", ps, depth, &info->user_rid))
2264 return False;
2265 if (!prs_uint32("group_rid", ps, depth, &info->group_rid))
2266 return False;
2268 if (!smb_io_unihdr("hdr_home_dir ", &info->hdr_home_dir, ps, depth))
2269 return False;
2270 if (!smb_io_unihdr("hdr_dir_drive", &info->hdr_dir_drive, ps, depth))
2271 return False;
2272 if (!smb_io_unihdr("hdr_logon_script", &info->hdr_logon_script, ps,
2273 depth))
2274 return False;
2276 if (!smb_io_unihdr("hdr_acct_desc", &info->hdr_acct_desc, ps, depth))
2277 return False;
2278 if (!smb_io_unihdr("hdr_workstations", &info->hdr_workstations, ps,
2279 depth))
2280 return False;
2282 if (!smb_io_time("logon_time", &info->logon_time, ps, depth))
2283 return False;
2284 if (!smb_io_time("logoff_time", &info->logoff_time, ps, depth))
2285 return False;
2287 if (!prs_uint32("logon_divs ", ps, depth, &info->logon_divs))
2288 return False;
2289 if (!prs_uint32("ptr_logon_hrs", ps, depth, &info->ptr_logon_hrs))
2290 return False;
2292 if (!prs_uint16("bad_pwd_count", ps, depth, &info->bad_pwd_count))
2293 return False;
2294 if (!prs_uint16("logon_count", ps, depth, &info->logon_count))
2295 return False;
2296 if (!smb_io_time("pwd_last_set_time", &info->pwd_last_set_time, ps,
2297 depth))
2298 return False;
2299 if (!smb_io_time("acct_expiry_time", &info->acct_expiry_time, ps,
2300 depth))
2301 return False;
2303 if (!prs_uint32("acb_info", ps, depth, &info->acb_info))
2304 return False;
2305 if (!prs_uint8s(False, "nt_pwd", ps, depth, info->nt_pwd, 16))
2306 return False;
2307 if (!prs_uint8s(False, "lm_pwd", ps, depth, info->lm_pwd, 16))
2308 return False;
2309 if (!prs_uint8("lm_pwd_present", ps, depth, &info->lm_pwd_present))
2310 return False;
2311 if (!prs_uint8("nt_pwd_present", ps, depth, &info->nt_pwd_present))
2312 return False;
2313 if (!prs_uint8("pwd_expired", ps, depth, &info->pwd_expired))
2314 return False;
2316 if (!smb_io_unihdr("hdr_comment", &info->hdr_comment, ps, depth))
2317 return False;
2318 if (!smb_io_unihdr("hdr_parameters", &info->hdr_parameters, ps,
2319 depth))
2320 return False;
2321 if (!prs_uint16("country", ps, depth, &info->country))
2322 return False;
2323 if (!prs_uint16("codepage", ps, depth, &info->codepage))
2324 return False;
2326 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data, ps, depth))
2327 return False;
2328 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2329 return False;
2330 if (!smb_io_unihdr("hdr_profile", &info->hdr_profile, ps, depth))
2331 return False;
2333 for (i = 0; i < 3; i++)
2335 if (!smb_io_unihdr("hdr_reserved", &info->hdr_reserved[i],
2336 ps, depth))
2337 return False;
2340 for (i = 0; i < 4; i++)
2342 if (!prs_uint32("dw_reserved", ps, depth,
2343 &info->dw_reserved[i]))
2344 return False;
2347 if (!smb_io_unistr2("uni_acct_name", &info->uni_acct_name,
2348 info->hdr_acct_name.buffer, ps, depth))
2349 return False;
2350 prs_align(ps);
2351 if (!smb_io_unistr2("uni_full_name", &info->uni_full_name,
2352 info->hdr_full_name.buffer, ps, depth))
2353 return False;
2354 prs_align(ps);
2355 if (!smb_io_unistr2("uni_home_dir ", &info->uni_home_dir,
2356 info->hdr_home_dir.buffer, ps, depth))
2357 return False;
2358 prs_align(ps);
2359 if (!smb_io_unistr2("uni_dir_drive", &info->uni_dir_drive,
2360 info->hdr_dir_drive.buffer, ps, depth))
2361 return False;
2362 prs_align(ps);
2363 if (!smb_io_unistr2("uni_logon_script", &info->uni_logon_script,
2364 info->hdr_logon_script.buffer, ps, depth))
2365 return False;
2366 prs_align(ps);
2367 if (!smb_io_unistr2("uni_acct_desc", &info->uni_acct_desc,
2368 info->hdr_acct_desc.buffer, ps, depth))
2369 return False;
2370 prs_align(ps);
2371 if (!smb_io_unistr2("uni_workstations", &info->uni_workstations,
2372 info->hdr_workstations.buffer, ps, depth))
2373 return False;
2374 prs_align(ps);
2376 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2377 return False;
2378 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2379 return False;
2381 if (!smb_io_rpc_blob("buf_logon_hrs", &info->buf_logon_hrs, ps, depth))
2382 return False;
2383 prs_align(ps);
2384 if (!smb_io_unistr2("uni_comment", &info->uni_comment,
2385 info->hdr_comment.buffer, ps, depth))
2386 return False;
2387 prs_align(ps);
2388 if (!smb_io_unistr2("uni_parameters", &info->uni_parameters,
2389 info->hdr_parameters.buffer, ps, depth))
2390 return False;
2391 prs_align(ps);
2392 if (hdr_priv_data.buffer != 0)
2394 int old_offset = 0;
2395 uint32 len = 0x44;
2396 if (!prs_uint32("pwd_len", ps, depth, &len))
2397 return False;
2398 old_offset = ps->data_offset;
2399 if (len > 0)
2401 if (ps->io)
2403 /* reading */
2404 if (!prs_hash1(ps, ps->data_offset, len))
2405 return False;
2407 if (!net_io_sam_passwd_info("pass", &info->pass,
2408 ps, depth))
2409 return False;
2411 if (!ps->io)
2413 /* writing */
2414 if (!prs_hash1(ps, old_offset, len))
2415 return False;
2418 if (old_offset + len > ps->buffer_size)
2419 return False;
2420 ps->data_offset = old_offset + len;
2422 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2423 return False;
2424 prs_align(ps);
2425 if (!smb_io_unistr2("uni_profile", &info->uni_profile,
2426 info->hdr_profile.buffer, ps, depth))
2427 return False;
2429 prs_align(ps);
2431 return True;
2434 /*******************************************************************
2435 reads or writes a structure.
2436 ********************************************************************/
2437 static BOOL net_io_sam_group_mem_info(const char *desc, SAM_GROUP_MEM_INFO * info,
2438 prs_struct *ps, int depth)
2440 uint32 i;
2441 fstring tmp;
2443 prs_debug(ps, depth, desc, "net_io_sam_group_mem_info");
2444 depth++;
2446 prs_align(ps);
2447 if (!prs_uint32("ptr_rids ", ps, depth, &info->ptr_rids))
2448 return False;
2449 if (!prs_uint32("ptr_attribs", ps, depth, &info->ptr_attribs))
2450 return False;
2451 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2452 return False;
2454 if (ps->data_offset + 16 > ps->buffer_size)
2455 return False;
2456 ps->data_offset += 16;
2458 if (info->ptr_rids != 0)
2460 if (!prs_uint32("num_members2", ps, depth,
2461 &info->num_members2))
2462 return False;
2464 if (info->num_members2 != info->num_members)
2466 /* RPC fault */
2467 return False;
2470 info->rids = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_members2);
2472 if (info->rids == NULL) {
2473 DEBUG(0, ("out of memory allocating %d rids\n",
2474 info->num_members2));
2475 return False;
2478 for (i = 0; i < info->num_members2; i++)
2480 slprintf(tmp, sizeof(tmp) - 1, "rids[%02d]", i);
2481 if (!prs_uint32(tmp, ps, depth, &info->rids[i]))
2482 return False;
2486 if (info->ptr_attribs != 0)
2488 if (!prs_uint32("num_members3", ps, depth,
2489 &info->num_members3))
2490 return False;
2491 if (info->num_members3 != info->num_members)
2493 /* RPC fault */
2494 return False;
2497 info->attribs = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_members3);
2499 if (info->attribs == NULL) {
2500 DEBUG(0, ("out of memory allocating %d attribs\n",
2501 info->num_members3));
2502 return False;
2505 for (i = 0; i < info->num_members3; i++)
2507 slprintf(tmp, sizeof(tmp) - 1, "attribs[%02d]", i);
2508 if (!prs_uint32(tmp, ps, depth, &info->attribs[i]))
2509 return False;
2513 return True;
2516 /*******************************************************************
2517 reads or writes a structure.
2518 ********************************************************************/
2519 static BOOL net_io_sam_alias_info(const char *desc, SAM_ALIAS_INFO * info,
2520 prs_struct *ps, int depth)
2522 prs_debug(ps, depth, desc, "net_io_sam_alias_info");
2523 depth++;
2525 if (!smb_io_unihdr("hdr_als_name", &info->hdr_als_name, ps, depth))
2526 return False;
2527 if (!prs_uint32("als_rid", ps, depth, &info->als_rid))
2528 return False;
2529 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2530 return False;
2531 if (!smb_io_unihdr("hdr_als_desc", &info->hdr_als_desc, ps, depth))
2532 return False;
2534 if (ps->data_offset + 40 > ps->buffer_size)
2535 return False;
2536 ps->data_offset += 40;
2538 if (!smb_io_unistr2("uni_als_name", &info->uni_als_name,
2539 info->hdr_als_name.buffer, ps, depth))
2540 return False;
2541 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2542 return False;
2544 if (!smb_io_unistr2("uni_als_desc", &info->uni_als_desc,
2545 info->hdr_als_desc.buffer, ps, depth))
2546 return False;
2548 return True;
2551 /*******************************************************************
2552 reads or writes a structure.
2553 ********************************************************************/
2554 static BOOL net_io_sam_alias_mem_info(const char *desc, SAM_ALIAS_MEM_INFO * info,
2555 prs_struct *ps, int depth)
2557 uint32 i;
2558 fstring tmp;
2560 prs_debug(ps, depth, desc, "net_io_sam_alias_mem_info");
2561 depth++;
2563 prs_align(ps);
2564 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2565 return False;
2566 if (!prs_uint32("ptr_members", ps, depth, &info->ptr_members))
2567 return False;
2569 if (ps->data_offset + 16 > ps->buffer_size)
2570 return False;
2571 ps->data_offset += 16;
2573 if (info->ptr_members != 0)
2575 if (!prs_uint32("num_sids", ps, depth, &info->num_sids))
2576 return False;
2577 if (info->num_sids != info->num_members)
2579 /* RPC fault */
2580 return False;
2583 info->ptr_sids = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_sids);
2585 if (info->ptr_sids == NULL) {
2586 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2587 info->num_sids));
2588 return False;
2591 for (i = 0; i < info->num_sids; i++)
2593 slprintf(tmp, sizeof(tmp) - 1, "ptr_sids[%02d]", i);
2594 if (!prs_uint32(tmp, ps, depth, &info->ptr_sids[i]))
2595 return False;
2598 info->sids = TALLOC_ARRAY(ps->mem_ctx, DOM_SID2, info->num_sids);
2600 if (info->sids == NULL) {
2601 DEBUG(0, ("error allocating %d sids\n",
2602 info->num_sids));
2603 return False;
2606 for (i = 0; i < info->num_sids; i++)
2608 if (info->ptr_sids[i] != 0)
2610 slprintf(tmp, sizeof(tmp) - 1, "sids[%02d]",
2612 if (!smb_io_dom_sid2(tmp, &info->sids[i],
2613 ps, depth))
2614 return False;
2619 return True;
2622 /*******************************************************************
2623 reads or writes a structure.
2624 ********************************************************************/
2625 static BOOL net_io_sam_policy_info(const char *desc, SAM_DELTA_POLICY *info,
2626 prs_struct *ps, int depth)
2628 unsigned int i;
2629 prs_debug(ps, depth, desc, "net_io_sam_policy_info");
2630 depth++;
2632 if(!prs_align(ps))
2633 return False;
2635 if (!prs_uint32("max_log_size", ps, depth, &info->max_log_size))
2636 return False;
2637 if (!prs_uint64("audit_retention_period", ps, depth,
2638 &info->audit_retention_period))
2639 return False;
2640 if (!prs_uint32("auditing_mode", ps, depth, &info->auditing_mode))
2641 return False;
2642 if (!prs_uint32("num_events", ps, depth, &info->num_events))
2643 return False;
2644 if (!prs_uint32("ptr_events", ps, depth, &info->ptr_events))
2645 return False;
2647 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
2648 return False;
2650 if (!prs_uint32("sid_ptr", ps, depth, &info->sid_ptr))
2651 return False;
2653 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2654 return False;
2655 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2656 &info->non_paged_pool_limit))
2657 return False;
2658 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2659 return False;
2660 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2661 return False;
2662 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2663 return False;
2664 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2665 return False;
2666 if (!smb_io_time("modify_time", &info->modify_time, ps, depth))
2667 return False;
2668 if (!smb_io_time("create_time", &info->create_time, ps, depth))
2669 return False;
2670 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2671 return False;
2673 for (i=0; i<4; i++) {
2674 UNIHDR dummy;
2675 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2676 return False;
2679 for (i=0; i<4; i++) {
2680 uint32 reserved;
2681 if (!prs_uint32("reserved", ps, depth, &reserved))
2682 return False;
2685 if (!prs_uint32("num_event_audit_options", ps, depth,
2686 &info->num_event_audit_options))
2687 return False;
2689 for (i=0; i<info->num_event_audit_options; i++)
2690 if (!prs_uint32("event_audit_option", ps, depth,
2691 &info->event_audit_option))
2692 return False;
2694 if (!smb_io_unistr2("domain_name", &info->domain_name, True, ps, depth))
2695 return False;
2697 if(!smb_io_dom_sid2("domain_sid", &info->domain_sid, ps, depth))
2698 return False;
2700 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2702 return False;
2704 return True;
2707 #if 0
2709 /* This function is pretty broken - see bug #334 */
2711 /*******************************************************************
2712 reads or writes a structure.
2713 ********************************************************************/
2714 static BOOL net_io_sam_trustdoms_info(const char *desc, SAM_DELTA_TRUSTDOMS *info,
2715 prs_struct *ps, int depth)
2717 int i;
2719 prs_debug(ps, depth, desc, "net_io_sam_trustdoms_info");
2720 depth++;
2722 if(!prs_align(ps))
2723 return False;
2725 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2726 return False;
2728 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2729 return False;
2731 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2732 return False;
2734 if(!smb_io_unihdr("hdr_domain", &info->hdr_domain, ps, depth))
2735 return False;
2737 if(!prs_uint32("unknown0", ps, depth, &info->unknown0))
2738 return False;
2739 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2740 return False;
2741 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2742 return False;
2744 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2745 return False;
2746 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2747 return False;
2749 for (i=0; i<12; i++)
2750 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2751 return False;
2753 if (!smb_io_unistr2("domain", &info->domain, True, ps, depth))
2754 return False;
2756 return True;
2759 #endif
2761 #if 0
2763 /* This function doesn't work - see bug #334 */
2765 /*******************************************************************
2766 reads or writes a structure.
2767 ********************************************************************/
2768 static BOOL net_io_sam_secret_info(const char *desc, SAM_DELTA_SECRET *info,
2769 prs_struct *ps, int depth)
2771 int i;
2773 prs_debug(ps, depth, desc, "net_io_sam_secret_info");
2774 depth++;
2776 if(!prs_align(ps))
2777 return False;
2779 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2780 return False;
2782 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2783 return False;
2785 if (!smb_io_unistr2("secret", &info->secret, True, ps, depth))
2786 return False;
2788 if(!prs_align(ps))
2789 return False;
2791 if(!prs_uint32("count1", ps, depth, &info->count1))
2792 return False;
2793 if(!prs_uint32("count2", ps, depth, &info->count2))
2794 return False;
2795 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2796 return False;
2799 if(!smb_io_time("time1", &info->time1, ps, depth)) /* logon time */
2800 return False;
2801 if(!prs_uint32("count3", ps, depth, &info->count3))
2802 return False;
2803 if(!prs_uint32("count4", ps, depth, &info->count4))
2804 return False;
2805 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2806 return False;
2807 if(!smb_io_time("time2", &info->time2, ps, depth)) /* logon time */
2808 return False;
2809 if(!prs_uint32("unknow1", ps, depth, &info->unknow1))
2810 return False;
2813 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2814 return False;
2815 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2816 return False;
2817 for(i=0; i<12; i++)
2818 if(!prs_uint32("unknow2", ps, depth, &info->unknow2))
2819 return False;
2821 if(!prs_uint32("chal_len", ps, depth, &info->chal_len))
2822 return False;
2823 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2824 return False;
2825 if(!prs_uint32("chal_len2", ps, depth, &info->chal_len2))
2826 return False;
2828 if(!prs_uint8s (False, "chal", ps, depth, info->chal, info->chal_len2))
2829 return False;
2831 if(!prs_uint32("key_len", ps, depth, &info->key_len))
2832 return False;
2833 if(!prs_uint32("reserved2", ps, depth, &info->reserved2))
2834 return False;
2835 if(!prs_uint32("key_len2", ps, depth, &info->key_len2))
2836 return False;
2838 if(!prs_uint8s (False, "key", ps, depth, info->key, info->key_len2))
2839 return False;
2842 if(!prs_uint32("buf_size3", ps, depth, &info->buf_size3))
2843 return False;
2845 if(!sec_io_desc("sec_desc2", &info->sec_desc2, ps, depth))
2846 return False;
2849 return True;
2852 #endif
2854 /*******************************************************************
2855 reads or writes a structure.
2856 ********************************************************************/
2857 static BOOL net_io_sam_privs_info(const char *desc, SAM_DELTA_PRIVS *info,
2858 prs_struct *ps, int depth)
2860 unsigned int i;
2862 prs_debug(ps, depth, desc, "net_io_sam_privs_info");
2863 depth++;
2865 if(!prs_align(ps))
2866 return False;
2868 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2869 return False;
2871 if(!prs_uint32("priv_count", ps, depth, &info->priv_count))
2872 return False;
2873 if(!prs_uint32("priv_control", ps, depth, &info->priv_control))
2874 return False;
2876 if(!prs_uint32("priv_attr_ptr", ps, depth, &info->priv_attr_ptr))
2877 return False;
2878 if(!prs_uint32("priv_name_ptr", ps, depth, &info->priv_name_ptr))
2879 return False;
2881 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2882 return False;
2883 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2884 &info->non_paged_pool_limit))
2885 return False;
2886 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2887 return False;
2888 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2889 return False;
2890 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2891 return False;
2892 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2893 return False;
2894 if (!prs_uint32("system_flags", ps, depth, &info->system_flags))
2895 return False;
2896 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2897 return False;
2899 for (i=0; i<4; i++) {
2900 UNIHDR dummy;
2901 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2902 return False;
2905 for (i=0; i<4; i++) {
2906 uint32 reserved;
2907 if (!prs_uint32("reserved", ps, depth, &reserved))
2908 return False;
2911 if(!prs_uint32("attribute_count", ps, depth, &info->attribute_count))
2912 return False;
2914 info->attributes = TALLOC_ARRAY(ps->mem_ctx, uint32, info->attribute_count);
2916 for (i=0; i<info->attribute_count; i++)
2917 if(!prs_uint32("attributes", ps, depth, &info->attributes[i]))
2918 return False;
2920 if(!prs_uint32("privlist_count", ps, depth, &info->privlist_count))
2921 return False;
2923 info->hdr_privslist = TALLOC_ARRAY(ps->mem_ctx, UNIHDR, info->privlist_count);
2924 info->uni_privslist = TALLOC_ARRAY(ps->mem_ctx, UNISTR2, info->privlist_count);
2926 for (i=0; i<info->privlist_count; i++)
2927 if(!smb_io_unihdr("hdr_privslist", &info->hdr_privslist[i], ps, depth))
2928 return False;
2930 for (i=0; i<info->privlist_count; i++)
2931 if (!smb_io_unistr2("uni_privslist", &info->uni_privslist[i], True, ps, depth))
2932 return False;
2934 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2935 return False;
2937 return True;
2940 /*******************************************************************
2941 reads or writes a structure.
2942 ********************************************************************/
2943 static BOOL net_io_sam_delta_ctr(const char *desc,
2944 SAM_DELTA_CTR * delta, uint16 type,
2945 prs_struct *ps, int depth)
2947 prs_debug(ps, depth, desc, "net_io_sam_delta_ctr");
2948 depth++;
2950 switch (type) {
2951 /* Seen in sam deltas */
2952 case SAM_DELTA_MODIFIED_COUNT:
2953 if (!net_io_sam_delta_mod_count("", &delta->mod_count, ps, depth))
2954 return False;
2955 break;
2957 case SAM_DELTA_DOMAIN_INFO:
2958 if (!net_io_sam_domain_info("", &delta->domain_info, ps, depth))
2959 return False;
2960 break;
2962 case SAM_DELTA_GROUP_INFO:
2963 if (!net_io_sam_group_info("", &delta->group_info, ps, depth))
2964 return False;
2965 break;
2967 case SAM_DELTA_ACCOUNT_INFO:
2968 if (!net_io_sam_account_info("", &delta->account_info, ps, depth))
2969 return False;
2970 break;
2972 case SAM_DELTA_GROUP_MEM:
2973 if (!net_io_sam_group_mem_info("", &delta->grp_mem_info, ps, depth))
2974 return False;
2975 break;
2977 case SAM_DELTA_ALIAS_INFO:
2978 if (!net_io_sam_alias_info("", &delta->alias_info, ps, depth))
2979 return False;
2980 break;
2982 case SAM_DELTA_POLICY_INFO:
2983 if (!net_io_sam_policy_info("", &delta->policy_info, ps, depth))
2984 return False;
2985 break;
2987 case SAM_DELTA_ALIAS_MEM:
2988 if (!net_io_sam_alias_mem_info("", &delta->als_mem_info, ps, depth))
2989 return False;
2990 break;
2992 case SAM_DELTA_PRIVS_INFO:
2993 if (!net_io_sam_privs_info("", &delta->privs_info, ps, depth))
2994 return False;
2995 break;
2997 /* These guys are implemented but broken */
2999 case SAM_DELTA_TRUST_DOMS:
3000 case SAM_DELTA_SECRET_INFO:
3001 break;
3003 /* These guys are not implemented yet */
3005 case SAM_DELTA_RENAME_GROUP:
3006 case SAM_DELTA_RENAME_USER:
3007 case SAM_DELTA_RENAME_ALIAS:
3008 case SAM_DELTA_DELETE_GROUP:
3009 case SAM_DELTA_DELETE_USER:
3010 default:
3011 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type));
3012 break;
3015 return True;
3018 /*******************************************************************
3019 reads or writes a structure.
3020 ********************************************************************/
3021 BOOL net_io_r_sam_sync(const char *desc,
3022 NET_R_SAM_SYNC * r_s, prs_struct *ps, int depth)
3024 uint32 i;
3026 prs_debug(ps, depth, desc, "net_io_r_sam_sync");
3027 depth++;
3029 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
3030 return False;
3031 if (!prs_uint32("sync_context", ps, depth, &r_s->sync_context))
3032 return False;
3034 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
3035 return False;
3036 if (r_s->ptr_deltas != 0)
3038 if (!prs_uint32("num_deltas ", ps, depth, &r_s->num_deltas))
3039 return False;
3040 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->ptr_deltas2))
3041 return False;
3042 if (r_s->ptr_deltas2 != 0)
3044 if (!prs_uint32("num_deltas2", ps, depth,
3045 &r_s->num_deltas2))
3046 return False;
3048 if (r_s->num_deltas2 != r_s->num_deltas)
3050 /* RPC fault */
3051 return False;
3054 if (r_s->num_deltas2 > 0) {
3055 r_s->hdr_deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_HDR, r_s->num_deltas2);
3056 if (r_s->hdr_deltas == NULL) {
3057 DEBUG(0, ("error tallocating memory "
3058 "for %d delta headers\n",
3059 r_s->num_deltas2));
3060 return False;
3064 for (i = 0; i < r_s->num_deltas2; i++)
3066 if (!net_io_sam_delta_hdr("",
3067 &r_s->hdr_deltas[i],
3068 ps, depth))
3069 return False;
3072 if (r_s->num_deltas2 > 0) {
3073 r_s->deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_CTR, r_s->num_deltas2);
3074 if (r_s->deltas == NULL) {
3075 DEBUG(0, ("error tallocating memory "
3076 "for %d deltas\n",
3077 r_s->num_deltas2));
3078 return False;
3082 for (i = 0; i < r_s->num_deltas2; i++)
3084 if (!net_io_sam_delta_ctr(
3085 "", &r_s->deltas[i],
3086 r_s->hdr_deltas[i].type3,
3087 ps, depth)) {
3088 DEBUG(0, ("hmm, failed on i=%d\n", i));
3089 return False;
3095 prs_align(ps);
3096 if (!prs_ntstatus("status", ps, depth, &(r_s->status)))
3097 return False;
3099 return True;
3102 /*******************************************************************
3103 makes a NET_Q_SAM_DELTAS structure.
3104 ********************************************************************/
3105 BOOL init_net_q_sam_deltas(NET_Q_SAM_DELTAS *q_s, const char *srv_name,
3106 const char *cli_name, DOM_CRED *cli_creds,
3107 uint32 database_id, uint64 dom_mod_count)
3109 DEBUG(5, ("init_net_q_sam_deltas\n"));
3111 init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
3112 init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
3114 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
3115 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
3117 q_s->database_id = database_id;
3118 q_s->dom_mod_count = dom_mod_count;
3119 q_s->max_size = 0xffff;
3121 return True;
3124 /*******************************************************************
3125 reads or writes a structure.
3126 ********************************************************************/
3127 BOOL net_io_q_sam_deltas(const char *desc, NET_Q_SAM_DELTAS *q_s, prs_struct *ps,
3128 int depth)
3130 prs_debug(ps, depth, desc, "net_io_q_sam_deltas");
3131 depth++;
3133 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
3134 return False;
3135 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
3136 return False;
3138 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
3139 return False;
3140 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
3141 return False;
3143 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
3144 return False;
3145 if (!prs_uint64("dom_mod_count", ps, depth, &q_s->dom_mod_count))
3146 return False;
3147 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
3148 return False;
3150 return True;
3153 /*******************************************************************
3154 reads or writes a structure.
3155 ********************************************************************/
3156 BOOL net_io_r_sam_deltas(const char *desc,
3157 NET_R_SAM_DELTAS *r_s, prs_struct *ps, int depth)
3159 unsigned int i;
3161 prs_debug(ps, depth, desc, "net_io_r_sam_deltas");
3162 depth++;
3164 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
3165 return False;
3166 if (!prs_uint64("dom_mod_count", ps, depth, &r_s->dom_mod_count))
3167 return False;
3169 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
3170 return False;
3171 if (!prs_uint32("num_deltas", ps, depth, &r_s->num_deltas))
3172 return False;
3173 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->num_deltas2))
3174 return False;
3176 if (r_s->num_deltas2 != 0)
3178 if (!prs_uint32("num_deltas2 ", ps, depth, &r_s->num_deltas2))
3179 return False;
3181 if (r_s->ptr_deltas != 0)
3183 if (r_s->num_deltas > 0) {
3184 r_s->hdr_deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_HDR, r_s->num_deltas);
3185 if (r_s->hdr_deltas == NULL) {
3186 DEBUG(0, ("error tallocating memory "
3187 "for %d delta headers\n",
3188 r_s->num_deltas));
3189 return False;
3193 for (i = 0; i < r_s->num_deltas; i++)
3195 net_io_sam_delta_hdr("", &r_s->hdr_deltas[i],
3196 ps, depth);
3199 if (r_s->num_deltas > 0) {
3200 r_s->deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_CTR, r_s->num_deltas);
3201 if (r_s->deltas == NULL) {
3202 DEBUG(0, ("error tallocating memory "
3203 "for %d deltas\n",
3204 r_s->num_deltas));
3205 return False;
3209 for (i = 0; i < r_s->num_deltas; i++)
3211 if (!net_io_sam_delta_ctr(
3213 &r_s->deltas[i],
3214 r_s->hdr_deltas[i].type2,
3215 ps, depth))
3217 return False;
3222 prs_align(ps);
3223 if (!prs_ntstatus("status", ps, depth, &r_s->status))
3224 return False;
3226 return True;
3229 /*******************************************************************
3230 Inits a NET_Q_DSR_GETDCNAME structure.
3231 ********************************************************************/
3233 void init_net_q_dsr_getdcname(NET_Q_DSR_GETDCNAME *r_t, const char *server_unc,
3234 const char *domain_name,
3235 struct GUID *domain_guid,
3236 struct GUID *site_guid,
3237 uint32_t flags)
3239 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3241 r_t->ptr_server_unc = (server_unc != NULL);
3242 init_unistr2(&r_t->uni_server_unc, server_unc, UNI_STR_TERMINATE);
3244 r_t->ptr_domain_name = (domain_name != NULL);
3245 init_unistr2(&r_t->uni_domain_name, domain_name, UNI_STR_TERMINATE);
3247 r_t->ptr_domain_guid = (domain_guid != NULL);
3248 r_t->domain_guid = domain_guid;
3250 r_t->ptr_site_guid = (site_guid != NULL);
3251 r_t->site_guid = site_guid;
3253 r_t->flags = flags;
3256 /*******************************************************************
3257 Reads or writes an NET_Q_DSR_GETDCNAME structure.
3258 ********************************************************************/
3260 BOOL net_io_q_dsr_getdcname(const char *desc, NET_Q_DSR_GETDCNAME *r_t,
3261 prs_struct *ps, int depth)
3263 if (r_t == NULL)
3264 return False;
3266 prs_debug(ps, depth, desc, "net_io_q_dsr_getdcname");
3267 depth++;
3269 if (!prs_uint32("ptr_server_unc", ps, depth, &r_t->ptr_server_unc))
3270 return False;
3272 if (!smb_io_unistr2("server_unc", &r_t->uni_server_unc,
3273 r_t->ptr_server_unc, ps, depth))
3274 return False;
3276 if (!prs_align(ps))
3277 return False;
3279 if (!prs_uint32("ptr_domain_name", ps, depth, &r_t->ptr_domain_name))
3280 return False;
3282 if (!smb_io_unistr2("domain_name", &r_t->uni_domain_name,
3283 r_t->ptr_domain_name, ps, depth))
3284 return False;
3286 if (!prs_align(ps))
3287 return False;
3289 if (!prs_uint32("ptr_domain_guid", ps, depth, &r_t->ptr_domain_guid))
3290 return False;
3292 if (UNMARSHALLING(ps) && (r_t->ptr_domain_guid)) {
3293 r_t->domain_guid = PRS_ALLOC_MEM(ps, struct GUID, 1);
3294 if (r_t->domain_guid == NULL)
3295 return False;
3298 if ((r_t->ptr_domain_guid) &&
3299 (!smb_io_uuid("domain_guid", r_t->domain_guid, ps, depth)))
3300 return False;
3302 if (!prs_align(ps))
3303 return False;
3305 if (!prs_uint32("ptr_site_guid", ps, depth, &r_t->ptr_site_guid))
3306 return False;
3308 if (UNMARSHALLING(ps) && (r_t->ptr_site_guid)) {
3309 r_t->site_guid = PRS_ALLOC_MEM(ps, struct GUID, 1);
3310 if (r_t->site_guid == NULL)
3311 return False;
3314 if ((r_t->ptr_site_guid) &&
3315 (!smb_io_uuid("site_guid", r_t->site_guid, ps, depth)))
3316 return False;
3318 if (!prs_align(ps))
3319 return False;
3321 if (!prs_uint32("flags", ps, depth, &r_t->flags))
3322 return False;
3324 return True;
3327 /*******************************************************************
3328 Inits a NET_R_DSR_GETDCNAME structure.
3329 ********************************************************************/
3330 void init_net_r_dsr_getdcname(NET_R_DSR_GETDCNAME *r_t, const char *dc_unc,
3331 const char *dc_address, int32 dc_address_type,
3332 struct GUID domain_guid, const char *domain_name,
3333 const char *forest_name, uint32 dc_flags,
3334 const char *dc_site_name,
3335 const char *client_site_name)
3337 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3339 r_t->ptr_dc_unc = (dc_unc != NULL);
3340 init_unistr2(&r_t->uni_dc_unc, dc_unc, UNI_STR_TERMINATE);
3342 r_t->ptr_dc_address = (dc_address != NULL);
3343 init_unistr2(&r_t->uni_dc_address, dc_address, UNI_STR_TERMINATE);
3345 r_t->dc_address_type = dc_address_type;
3346 r_t->domain_guid = domain_guid;
3348 r_t->ptr_domain_name = (domain_name != NULL);
3349 init_unistr2(&r_t->uni_domain_name, domain_name, UNI_STR_TERMINATE);
3351 r_t->ptr_forest_name = (forest_name != NULL);
3352 init_unistr2(&r_t->uni_forest_name, forest_name, UNI_STR_TERMINATE);
3354 r_t->dc_flags = dc_flags;
3356 r_t->ptr_dc_site_name = (dc_site_name != NULL);
3357 init_unistr2(&r_t->uni_dc_site_name, dc_site_name, UNI_STR_TERMINATE);
3359 r_t->ptr_client_site_name = (client_site_name != NULL);
3360 init_unistr2(&r_t->uni_client_site_name, client_site_name,
3361 UNI_STR_TERMINATE);
3364 /*******************************************************************
3365 Reads or writes an NET_R_DSR_GETDCNAME structure.
3366 ********************************************************************/
3368 BOOL net_io_r_dsr_getdcname(const char *desc, NET_R_DSR_GETDCNAME *r_t,
3369 prs_struct *ps, int depth)
3371 uint32 info_ptr = 1;
3373 if (r_t == NULL)
3374 return False;
3376 prs_debug(ps, depth, desc, "net_io_r_dsr_getdcname");
3377 depth++;
3379 /* The reply contains *just* an info struct, this is the ptr to it */
3380 if (!prs_uint32("info_ptr", ps, depth, &info_ptr))
3381 return False;
3383 if (info_ptr == 0)
3384 return False;
3386 if (!prs_uint32("ptr_dc_unc", ps, depth, &r_t->ptr_dc_unc))
3387 return False;
3389 if (!prs_uint32("ptr_dc_address", ps, depth, &r_t->ptr_dc_address))
3390 return False;
3392 if (!prs_int32("dc_address_type", ps, depth, &r_t->dc_address_type))
3393 return False;
3395 if (!smb_io_uuid("domain_guid", &r_t->domain_guid, ps, depth))
3396 return False;
3398 if (!prs_uint32("ptr_domain_name", ps, depth, &r_t->ptr_domain_name))
3399 return False;
3401 if (!prs_uint32("ptr_forest_name", ps, depth, &r_t->ptr_forest_name))
3402 return False;
3404 if (!prs_uint32("dc_flags", ps, depth, &r_t->dc_flags))
3405 return False;
3407 if (!prs_uint32("ptr_dc_site_name", ps, depth, &r_t->ptr_dc_site_name))
3408 return False;
3410 if (!prs_uint32("ptr_client_site_name", ps, depth,
3411 &r_t->ptr_client_site_name))
3412 return False;
3414 if (!prs_align(ps))
3415 return False;
3417 if (!smb_io_unistr2("dc_unc", &r_t->uni_dc_unc,
3418 r_t->ptr_dc_unc, ps, depth))
3419 return False;
3421 if (!prs_align(ps))
3422 return False;
3424 if (!smb_io_unistr2("dc_address", &r_t->uni_dc_address,
3425 r_t->ptr_dc_address, ps, depth))
3426 return False;
3428 if (!prs_align(ps))
3429 return False;
3431 if (!smb_io_unistr2("domain_name", &r_t->uni_domain_name,
3432 r_t->ptr_domain_name, ps, depth))
3433 return False;
3435 if (!prs_align(ps))
3436 return False;
3438 if (!smb_io_unistr2("forest_name", &r_t->uni_forest_name,
3439 r_t->ptr_forest_name, ps, depth))
3440 return False;
3442 if (!prs_align(ps))
3443 return False;
3445 if (!smb_io_unistr2("dc_site_name", &r_t->uni_dc_site_name,
3446 r_t->ptr_dc_site_name, ps, depth))
3447 return False;
3449 if (!prs_align(ps))
3450 return False;
3452 if (!smb_io_unistr2("client_site_name", &r_t->uni_client_site_name,
3453 r_t->ptr_client_site_name, ps, depth))
3454 return False;
3456 if (!prs_align(ps))
3457 return False;
3459 if (!prs_werror("result", ps, depth, &r_t->result))
3460 return False;
3462 return True;
3465 /*******************************************************************
3466 Inits a NET_Q_DSR_GETSITENAME structure.
3467 ********************************************************************/
3469 void init_net_q_dsr_getsitename(NET_Q_DSR_GETSITENAME *r_t, const char *computer_name)
3471 DEBUG(5, ("init_net_q_dsr_getsitename\n"));
3473 r_t->ptr_computer_name = (computer_name != NULL);
3474 init_unistr2(&r_t->uni_computer_name, computer_name, UNI_STR_TERMINATE);
3477 /*******************************************************************
3478 Reads or writes an NET_Q_DSR_GETSITENAME structure.
3479 ********************************************************************/
3481 BOOL net_io_q_dsr_getsitename(const char *desc, NET_Q_DSR_GETSITENAME *r_t,
3482 prs_struct *ps, int depth)
3484 if (r_t == NULL)
3485 return False;
3487 prs_debug(ps, depth, desc, "net_io_q_dsr_getsitename");
3488 depth++;
3490 if (!prs_uint32("ptr_computer_name", ps, depth, &r_t->ptr_computer_name))
3491 return False;
3493 if (!smb_io_unistr2("computer_name", &r_t->uni_computer_name,
3494 r_t->ptr_computer_name, ps, depth))
3495 return False;
3497 if (!prs_align(ps))
3498 return False;
3500 return True;
3503 /*******************************************************************
3504 Reads or writes an NET_R_DSR_GETSITENAME structure.
3505 ********************************************************************/
3507 BOOL net_io_r_dsr_getsitename(const char *desc, NET_R_DSR_GETSITENAME *r_t,
3508 prs_struct *ps, int depth)
3510 if (r_t == NULL)
3511 return False;
3513 prs_debug(ps, depth, desc, "net_io_r_dsr_getsitename");
3514 depth++;
3516 if (!prs_uint32("ptr_site_name", ps, depth, &r_t->ptr_site_name))
3517 return False;
3519 if (!prs_align(ps))
3520 return False;
3522 if (!smb_io_unistr2("site_name", &r_t->uni_site_name,
3523 r_t->ptr_site_name, ps, depth))
3524 return False;
3526 if (!prs_align(ps))
3527 return False;
3529 if (!prs_werror("result", ps, depth, &r_t->result))
3530 return False;
3532 return True;