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.
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)
38 prs_debug(ps, depth, desc, "net_io_neg_flags");
44 if(!prs_uint32("neg_flags", ps, depth, &neg->neg_flags))
50 /*******************************************************************
51 Inits a NETLOGON_INFO_3 structure.
52 ********************************************************************/
54 static void init_netinfo_3(NETLOGON_INFO_3 *info, uint32 flags, uint32 logon_attempts)
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)
74 prs_debug(ps, depth, desc, "net_io_netinfo_3");
80 if(!prs_uint32("flags ", ps, depth, &info->flags))
82 if(!prs_uint32("logon_attempts", ps, depth, &info->logon_attempts))
84 if(!prs_uint32("reserved_1 ", ps, depth, &info->reserved_1))
86 if(!prs_uint32("reserved_2 ", ps, depth, &info->reserved_2))
88 if(!prs_uint32("reserved_3 ", ps, depth, &info->reserved_3))
90 if(!prs_uint32("reserved_4 ", ps, depth, &info->reserved_4))
92 if(!prs_uint32("reserved_5 ", ps, depth, &info->reserved_5))
99 /*******************************************************************
100 Inits a NETLOGON_INFO_1 structure.
101 ********************************************************************/
103 static void init_netinfo_1(NETLOGON_INFO_1 *info, uint32 flags, uint32 pdc_status)
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)
118 prs_debug(ps, depth, desc, "net_io_netinfo_1");
124 if(!prs_uint32("flags ", ps, depth, &info->flags))
126 if(!prs_uint32("pdc_status", ps, depth, &info->pdc_status))
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)
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);
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)
159 prs_debug(ps, depth, desc, "net_io_netinfo_2");
165 if(!prs_uint32("flags ", ps, depth, &info->flags))
167 if(!prs_uint32("pdc_status ", ps, depth, &info->pdc_status))
169 if(!prs_uint32("ptr_trusted_dc_name", ps, depth, &info->ptr_trusted_dc_name))
171 if(!prs_uint32("tc_status ", ps, depth, &info->tc_status))
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))
185 static BOOL net_io_ctrl_data_info_5(const char *desc, CTRL_DATA_INFO_5 *info, prs_struct *ps, int depth)
190 prs_debug(ps, depth, desc, "net_io_ctrl_data_info_5");
193 if ( !prs_uint32( "function_code", ps, depth, &info->function_code ) )
196 if(!prs_uint32("ptr_domain", ps, depth, &info->ptr_domain))
199 if ( info->ptr_domain ) {
200 if(!smb_io_unistr2("domain", &info->domain, info->ptr_domain, ps, depth))
207 static BOOL net_io_ctrl_data_info_6(const char *desc, CTRL_DATA_INFO_6 *info, prs_struct *ps, int depth)
212 prs_debug(ps, depth, desc, "net_io_ctrl_data_info_6");
215 if ( !prs_uint32( "function_code", ps, depth, &info->function_code ) )
218 if(!prs_uint32("ptr_domain", ps, depth, &info->ptr_domain))
221 if ( info->ptr_domain ) {
222 if(!smb_io_unistr2("domain", &info->domain, info->ptr_domain, ps, depth))
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)
238 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl2");
244 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
247 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
253 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
255 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
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) )
263 case NETLOGON_CONTROL_TC_QUERY:
264 if ( !net_io_ctrl_data_info_6( "ctrl_data_info6", &q_l->info.info6, ps, depth) )
269 DEBUG(0,("net_io_q_logon_ctrl2: unknown function_code [%d]\n",
270 q_l->function_code));
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,
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) {
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;
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;
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;
321 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
323 r_l->ptr = 0; /* undocumented pointer */
325 /* take a guess at an error code... */
326 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
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)
340 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl2");
343 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
345 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
349 switch (r_l->switch_value) {
351 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
355 if(!net_io_netinfo_2("", &r_l->logon.info2, ps, depth))
359 if(!net_io_netinfo_3("", &r_l->logon.info3, ps, depth))
363 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
369 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
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,
382 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl");
388 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
391 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
397 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
399 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
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,
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) {
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;
438 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
440 r_l->ptr = 0; /* undocumented pointer */
442 /* take a guess at an error code... */
443 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
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,
455 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl");
458 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
460 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
464 switch (r_l->switch_value) {
466 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
470 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
476 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
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_q_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,
506 prs_debug(ps, depth, desc, "net_io_q_getdcname");
509 if (!prs_uint32("ptr_logon_server", ps, depth, &r_t->ptr_logon_server))
512 if (!smb_io_unistr2("logon_server", &r_t->uni_logon_server,
513 r_t->ptr_logon_server, ps, depth))
519 if (!prs_uint32("ptr_domainname", ps, depth, &r_t->ptr_domainname))
522 if (!smb_io_unistr2("domainname", &r_t->uni_domainname,
523 r_t->ptr_domainname, ps, depth))
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,
550 prs_debug(ps, depth, desc, "net_io_r_getdcname");
553 if (!prs_uint32("ptr_dcname", ps, depth, &r_t->ptr_dcname))
556 if (!smb_io_unistr2("dcname", &r_t->uni_dcname,
557 r_t->ptr_dcname, ps, depth))
563 if (!prs_werror("status", ps, depth, &r_t->status))
570 /*******************************************************************
571 Inits an NET_R_GETANYDCNAME structure.
572 ********************************************************************/
573 void init_net_q_getanydcname(NET_Q_GETANYDCNAME *r_t, const char *logon_server,
574 const char *domainname)
576 DEBUG(5,("init_q_getanydcname\n"));
578 init_unistr2(&r_t->uni_logon_server, logon_server, UNI_STR_TERMINATE);
579 r_t->ptr_domainname = (domainname != NULL);
580 init_unistr2(&r_t->uni_domainname, domainname, UNI_STR_TERMINATE);
583 /*******************************************************************
584 Reads or writes an NET_Q_GETANYDCNAME structure.
585 ********************************************************************/
587 BOOL net_io_q_getanydcname(const char *desc, NET_Q_GETANYDCNAME *r_t, prs_struct *ps,
593 prs_debug(ps, depth, desc, "net_io_q_getanydcname");
596 if (!smb_io_unistr2("logon_server", &r_t->uni_logon_server,
603 if (!prs_uint32("ptr_domainname", ps, depth, &r_t->ptr_domainname))
606 if (!smb_io_unistr2("domainname", &r_t->uni_domainname,
607 r_t->ptr_domainname, ps, depth))
614 /*******************************************************************
615 Inits an NET_R_GETANYDCNAME structure.
616 ********************************************************************/
617 void init_net_r_getanydcname(NET_R_GETANYDCNAME *r_t, const char *dcname)
619 DEBUG(5,("init_r_getanydcname\n"));
621 init_unistr2(&r_t->uni_dcname, dcname, UNI_STR_TERMINATE);
624 /*******************************************************************
625 Reads or writes an NET_R_GETANYDCNAME structure.
626 ********************************************************************/
628 BOOL net_io_r_getanydcname(const char *desc, NET_R_GETANYDCNAME *r_t, prs_struct *ps,
634 prs_debug(ps, depth, desc, "net_io_r_getanydcname");
637 if (!prs_uint32("ptr_dcname", ps, depth, &r_t->ptr_dcname))
640 if (!smb_io_unistr2("dcname", &r_t->uni_dcname,
641 r_t->ptr_dcname, ps, depth))
647 if (!prs_werror("status", ps, depth, &r_t->status))
653 /*******************************************************************
654 Inits an NET_R_TRUST_DOM_LIST structure.
655 ********************************************************************/
657 void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
658 uint32 num_doms, const char *dom_name)
662 DEBUG(5,("init_r_trust_dom\n"));
664 for (i = 0; i < MAX_TRUST_DOMS; i++) {
665 r_t->uni_trust_dom_name[i].uni_str_len = 0;
666 r_t->uni_trust_dom_name[i].uni_max_len = 0;
668 if (num_doms > MAX_TRUST_DOMS)
669 num_doms = MAX_TRUST_DOMS;
671 for (i = 0; i < num_doms; i++) {
673 fstrcpy(domain_name, dom_name);
674 strupper_m(domain_name);
675 init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, UNI_STR_TERMINATE);
676 /* the use of UNISTR2 here is non-standard. */
677 r_t->uni_trust_dom_name[i].offset = 0x1;
680 r_t->status = NT_STATUS_OK;
683 /*******************************************************************
684 Reads or writes an NET_R_TRUST_DOM_LIST structure.
685 ********************************************************************/
687 BOOL net_io_r_trust_dom(const char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth)
694 prs_debug(ps, depth, desc, "net_io_r_trust_dom");
697 /* temporary code to give a valid response */
699 if(!prs_uint32("status", ps, depth, &value))
703 if(!prs_uint32("status", ps, depth, &value))
706 if(!prs_uint32("status", ps, depth, &value))
710 if(!prs_uint32("status", ps, depth, &value))
714 if(!prs_uint32("status", ps, depth, &value))
717 /* old non working code */
721 for (i = 0; i < MAX_TRUST_DOMS; i++) {
722 if (r_t->uni_trust_dom_name[i].uni_str_len == 0)
724 if(!smb_io_unistr2("", &r_t->uni_trust_dom_name[i], True, ps, depth))
728 if(!prs_ntstatus("status", ps, depth, &r_t->status))
735 /*******************************************************************
736 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
737 ********************************************************************/
739 BOOL net_io_q_trust_dom(const char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth)
744 prs_debug(ps, depth, desc, "net_io_q_trust_dom");
747 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
749 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
755 /*******************************************************************
756 Inits an NET_Q_REQ_CHAL structure.
757 ********************************************************************/
759 void init_q_req_chal(NET_Q_REQ_CHAL *q_c,
760 const char *logon_srv, const char *logon_clnt,
761 const DOM_CHAL *clnt_chal)
763 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
765 q_c->undoc_buffer = 1; /* don't know what this buffer is */
767 init_unistr2(&q_c->uni_logon_srv, logon_srv , UNI_STR_TERMINATE);
768 init_unistr2(&q_c->uni_logon_clnt, logon_clnt, UNI_STR_TERMINATE);
770 memcpy(q_c->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
772 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
775 /*******************************************************************
776 Reads or writes an NET_Q_REQ_CHAL structure.
777 ********************************************************************/
779 BOOL net_io_q_req_chal(const char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth)
784 prs_debug(ps, depth, desc, "net_io_q_req_chal");
790 if(!prs_uint32("undoc_buffer", ps, depth, &q_c->undoc_buffer))
793 if(!smb_io_unistr2("", &q_c->uni_logon_srv, True, ps, depth)) /* logon server unicode string */
795 if(!smb_io_unistr2("", &q_c->uni_logon_clnt, True, ps, depth)) /* logon client unicode string */
798 if(!smb_io_chal("", &q_c->clnt_chal, ps, depth))
804 /*******************************************************************
805 Reads or writes a structure.
806 ********************************************************************/
808 BOOL net_io_r_req_chal(const char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth)
813 prs_debug(ps, depth, desc, "net_io_r_req_chal");
819 if(!smb_io_chal("", &r_c->srv_chal, ps, depth)) /* server challenge */
822 if(!prs_ntstatus("status", ps, depth, &r_c->status))
829 /*******************************************************************
830 Reads or writes a structure.
831 ********************************************************************/
833 BOOL net_io_q_auth(const char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth)
838 prs_debug(ps, depth, desc, "net_io_q_auth");
844 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
846 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
852 /*******************************************************************
853 Reads or writes a structure.
854 ********************************************************************/
856 BOOL net_io_r_auth(const char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth)
861 prs_debug(ps, depth, desc, "net_io_r_auth");
867 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
870 if(!prs_ntstatus("status", ps, depth, &r_a->status))
876 /*******************************************************************
877 Inits a NET_Q_AUTH_2 struct.
878 ********************************************************************/
880 void init_q_auth_2(NET_Q_AUTH_2 *q_a,
881 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
882 const DOM_CHAL *clnt_chal, uint32 clnt_flgs)
884 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
886 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
887 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
888 q_a->clnt_flgs.neg_flags = clnt_flgs;
890 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
893 /*******************************************************************
894 Reads or writes a structure.
895 ********************************************************************/
897 BOOL net_io_q_auth_2(const char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth)
902 prs_debug(ps, depth, desc, "net_io_q_auth_2");
908 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
910 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
912 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
918 /*******************************************************************
919 Reads or writes a structure.
920 ********************************************************************/
922 BOOL net_io_r_auth_2(const char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth)
927 prs_debug(ps, depth, desc, "net_io_r_auth_2");
933 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
935 if(!net_io_neg_flags("", &r_a->srv_flgs, ps, depth))
938 if(!prs_ntstatus("status", ps, depth, &r_a->status))
944 /*******************************************************************
945 Inits a NET_Q_AUTH_3 struct.
946 ********************************************************************/
948 void init_q_auth_3(NET_Q_AUTH_3 *q_a,
949 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
950 const DOM_CHAL *clnt_chal, uint32 clnt_flgs)
952 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
954 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
955 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
956 q_a->clnt_flgs.neg_flags = clnt_flgs;
958 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
961 /*******************************************************************
962 Reads or writes a structure.
963 ********************************************************************/
965 BOOL net_io_q_auth_3(const char *desc, NET_Q_AUTH_3 *q_a, prs_struct *ps, int depth)
970 prs_debug(ps, depth, desc, "net_io_q_auth_3");
976 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
978 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
980 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
986 /*******************************************************************
987 Reads or writes a structure.
988 ********************************************************************/
990 BOOL net_io_r_auth_3(const char *desc, NET_R_AUTH_3 *r_a, prs_struct *ps, int depth)
995 prs_debug(ps, depth, desc, "net_io_r_auth_3");
1001 if(!smb_io_chal("srv_chal", &r_a->srv_chal, ps, depth)) /* server challenge */
1003 if(!net_io_neg_flags("srv_flgs", &r_a->srv_flgs, ps, depth))
1005 if (!prs_uint32("unknown", ps, depth, &r_a->unknown))
1008 if(!prs_ntstatus("status", ps, depth, &r_a->status))
1015 /*******************************************************************
1016 Inits a NET_Q_SRV_PWSET.
1017 ********************************************************************/
1019 void init_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
1020 const char *logon_srv, const char *sess_key, const char *acct_name,
1021 uint16 sec_chan, const char *comp_name,
1022 DOM_CRED *cred, const uchar hashed_mach_pwd[16])
1024 unsigned char nt_cypher[16];
1026 DEBUG(5,("init_q_srv_pwset\n"));
1028 /* Process the new password. */
1029 cred_hash3( nt_cypher, hashed_mach_pwd, (const unsigned char *)sess_key, 1);
1031 init_clnt_info(&q_s->clnt_id, logon_srv, acct_name, sec_chan, comp_name, cred);
1033 memcpy(q_s->pwd, nt_cypher, sizeof(q_s->pwd));
1036 /*******************************************************************
1037 Reads or writes a structure.
1038 ********************************************************************/
1040 BOOL net_io_q_srv_pwset(const char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth)
1045 prs_debug(ps, depth, desc, "net_io_q_srv_pwset");
1051 if(!smb_io_clnt_info("", &q_s->clnt_id, ps, depth)) /* client identification/authentication info */
1053 if(!prs_uint8s (False, "pwd", ps, depth, q_s->pwd, 16)) /* new password - undocumented */
1059 /*******************************************************************
1060 Reads or writes a structure.
1061 ********************************************************************/
1063 BOOL net_io_r_srv_pwset(const char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth)
1068 prs_debug(ps, depth, desc, "net_io_r_srv_pwset");
1074 if(!smb_io_cred("", &r_s->srv_cred, ps, depth)) /* server challenge */
1077 if(!prs_ntstatus("status", ps, depth, &r_s->status))
1083 /*************************************************************************
1084 Init DOM_SID2 array from a string containing multiple sids
1085 *************************************************************************/
1087 static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsids)
1093 DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
1101 /* Count the number of valid SIDs. */
1102 for (count = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
1104 if (string_to_sid(&tmpsid, s2))
1108 /* Now allocate space for them. */
1110 *ppsids = TALLOC_ZERO_ARRAY(ctx, DOM_SID2, count);
1111 if (*ppsids == NULL)
1119 for (number = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
1121 if (string_to_sid(&tmpsid, s2)) {
1122 /* count only valid sids */
1123 init_dom_sid2(&sids[number], &tmpsid);
1132 /*******************************************************************
1133 Inits a NET_ID_INFO_1 structure.
1134 ********************************************************************/
1136 void init_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
1137 uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
1138 const char *user_name, const char *wksta_name,
1139 const char *sess_key,
1140 unsigned char lm_cypher[16], unsigned char nt_cypher[16])
1142 unsigned char lm_owf[16];
1143 unsigned char nt_owf[16];
1145 DEBUG(5,("init_id_info1: %d\n", __LINE__));
1147 id->ptr_id_info1 = 1;
1149 id->param_ctrl = param_ctrl;
1150 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1153 if (lm_cypher && nt_cypher) {
1154 unsigned char key[16];
1155 #ifdef DEBUG_PASSWORD
1156 DEBUG(100,("lm cypher:"));
1157 dump_data(100, lm_cypher, 16);
1159 DEBUG(100,("nt cypher:"));
1160 dump_data(100, nt_cypher, 16);
1164 memcpy(key, sess_key, 8);
1166 memcpy(lm_owf, lm_cypher, 16);
1167 SamOEMhash(lm_owf, key, 16);
1168 memcpy(nt_owf, nt_cypher, 16);
1169 SamOEMhash(nt_owf, key, 16);
1171 #ifdef DEBUG_PASSWORD
1172 DEBUG(100,("encrypt of lm owf password:"));
1173 dump_data(100, lm_owf, 16);
1175 DEBUG(100,("encrypt of nt owf password:"));
1176 dump_data(100, nt_owf, 16);
1178 /* set up pointers to cypher blocks */
1183 init_owf_info(&id->lm_owf, lm_cypher);
1184 init_owf_info(&id->nt_owf, nt_cypher);
1186 init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
1187 init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
1188 init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
1189 init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
1190 init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
1191 init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
1194 /*******************************************************************
1195 Reads or writes an NET_ID_INFO_1 structure.
1196 ********************************************************************/
1198 static BOOL net_io_id_info1(const char *desc, NET_ID_INFO_1 *id, prs_struct *ps, int depth)
1203 prs_debug(ps, depth, desc, "net_io_id_info1");
1209 if(!prs_uint32("ptr_id_info1", ps, depth, &id->ptr_id_info1))
1212 if (id->ptr_id_info1 != 0) {
1213 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1216 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1218 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1221 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1223 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1226 if(!smb_io_owf_info("", &id->lm_owf, ps, depth))
1228 if(!smb_io_owf_info("", &id->nt_owf, ps, depth))
1231 if(!smb_io_unistr2("unistr2", &id->uni_domain_name,
1232 id->hdr_domain_name.buffer, ps, depth))
1234 if(!smb_io_unistr2("unistr2", &id->uni_user_name,
1235 id->hdr_user_name.buffer, ps, depth))
1237 if(!smb_io_unistr2("unistr2", &id->uni_wksta_name,
1238 id->hdr_wksta_name.buffer, ps, depth))
1245 /*******************************************************************
1246 Inits a NET_ID_INFO_2 structure.
1248 This is a network logon packet. The log_id parameters
1249 are what an NT server would generate for LUID once the
1250 user is logged on. I don't think we care about them.
1252 Note that this has no access to the NT and LM hashed passwords,
1253 so it forwards the challenge, and the NT and LM responses (24
1254 bytes each) over the secure channel to the Domain controller
1255 for it to say yea or nay. This is the preferred method of
1256 checking for a logon as it doesn't export the password
1257 hashes to anyone who has compromised the secure channel. JRA.
1258 ********************************************************************/
1260 void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
1262 uint32 log_id_low, uint32 log_id_high,
1263 const char *user_name, const char *wksta_name,
1264 const uchar lm_challenge[8],
1265 const uchar * lm_chal_resp, size_t lm_chal_resp_len,
1266 const uchar * nt_chal_resp, size_t nt_chal_resp_len)
1269 DEBUG(5,("init_id_info2: %d\n", __LINE__));
1271 id->ptr_id_info2 = 1;
1273 id->param_ctrl = param_ctrl;
1274 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1276 memcpy(id->lm_chal, lm_challenge, sizeof(id->lm_chal));
1277 init_str_hdr(&id->hdr_nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len, (nt_chal_resp != NULL) ? 1 : 0);
1278 init_str_hdr(&id->hdr_lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len, (lm_chal_resp != NULL) ? 1 : 0);
1280 init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
1281 init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
1282 init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
1283 init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
1284 init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
1285 init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
1287 init_string2(&id->nt_chal_resp, (const char *)nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len);
1288 init_string2(&id->lm_chal_resp, (const char *)lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len);
1292 /*******************************************************************
1293 Reads or writes an NET_ID_INFO_2 structure.
1294 ********************************************************************/
1296 static BOOL net_io_id_info2(const char *desc, NET_ID_INFO_2 *id, prs_struct *ps, int depth)
1301 prs_debug(ps, depth, desc, "net_io_id_info2");
1307 if(!prs_uint32("ptr_id_info2", ps, depth, &id->ptr_id_info2))
1310 if (id->ptr_id_info2 != 0) {
1311 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1314 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1316 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1319 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1321 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1324 if(!prs_uint8s (False, "lm_chal", ps, depth, id->lm_chal, 8)) /* lm 8 byte challenge */
1327 if(!smb_io_strhdr("hdr_nt_chal_resp", &id->hdr_nt_chal_resp, ps, depth))
1329 if(!smb_io_strhdr("hdr_lm_chal_resp", &id->hdr_lm_chal_resp, ps, depth))
1332 if(!smb_io_unistr2("uni_domain_name", &id->uni_domain_name,
1333 id->hdr_domain_name.buffer, ps, depth))
1335 if(!smb_io_unistr2("uni_user_name ", &id->uni_user_name,
1336 id->hdr_user_name.buffer, ps, depth))
1338 if(!smb_io_unistr2("uni_wksta_name ", &id->uni_wksta_name,
1339 id->hdr_wksta_name.buffer, ps, depth))
1341 if(!smb_io_string2("nt_chal_resp", &id->nt_chal_resp,
1342 id->hdr_nt_chal_resp.buffer, ps, depth))
1344 if(!smb_io_string2("lm_chal_resp", &id->lm_chal_resp,
1345 id->hdr_lm_chal_resp.buffer, ps, depth))
1353 /*******************************************************************
1354 Inits a DOM_SAM_INFO structure.
1355 ********************************************************************/
1357 void init_sam_info(DOM_SAM_INFO *sam,
1358 const char *logon_srv, const char *comp_name,
1359 DOM_CRED *clnt_cred,
1360 DOM_CRED *rtn_cred, uint16 logon_level,
1361 NET_ID_INFO_CTR *ctr)
1363 DEBUG(5,("init_sam_info: %d\n", __LINE__));
1365 init_clnt_info2(&sam->client, logon_srv, comp_name, clnt_cred);
1367 if (rtn_cred != NULL) {
1368 sam->ptr_rtn_cred = 1;
1369 memcpy(&sam->rtn_cred, rtn_cred, sizeof(sam->rtn_cred));
1371 sam->ptr_rtn_cred = 0;
1374 sam->logon_level = logon_level;
1378 /*******************************************************************
1379 Inits a DOM_SAM_INFO structure.
1380 ********************************************************************/
1382 void init_sam_info_ex(DOM_SAM_INFO_EX *sam,
1383 const char *logon_srv, const char *comp_name,
1384 uint16 logon_level, NET_ID_INFO_CTR *ctr)
1386 DEBUG(5,("init_sam_info_ex: %d\n", __LINE__));
1388 init_clnt_srv(&sam->client, logon_srv, comp_name);
1389 sam->logon_level = logon_level;
1393 /*******************************************************************
1394 Reads or writes a DOM_SAM_INFO structure.
1395 ********************************************************************/
1397 static BOOL net_io_id_info_ctr(const char *desc, NET_ID_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
1399 NET_ID_INFO_CTR *ctr = *pp_ctr;
1401 prs_debug(ps, depth, desc, "smb_io_sam_info_ctr");
1404 if (UNMARSHALLING(ps)) {
1405 ctr = *pp_ctr = PRS_ALLOC_MEM(ps, NET_ID_INFO_CTR, 1);
1413 /* don't 4-byte align here! */
1415 if(!prs_uint16("switch_value ", ps, depth, &ctr->switch_value))
1418 switch (ctr->switch_value) {
1420 if(!net_io_id_info1("", &ctr->auth.id1, ps, depth))
1424 if(!net_io_id_info2("", &ctr->auth.id2, ps, depth))
1429 DEBUG(4,("smb_io_sam_info_ctr: unknown switch_value!\n"));
1436 /*******************************************************************
1437 Reads or writes a DOM_SAM_INFO structure.
1438 ********************************************************************/
1440 static BOOL smb_io_sam_info(const char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int depth)
1445 prs_debug(ps, depth, desc, "smb_io_sam_info");
1451 if(!smb_io_clnt_info2("", &sam->client, ps, depth))
1454 if(!prs_uint32("ptr_rtn_cred ", ps, depth, &sam->ptr_rtn_cred))
1456 if (sam->ptr_rtn_cred) {
1457 if(!smb_io_cred("", &sam->rtn_cred, ps, depth))
1461 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1464 if (sam->logon_level != 0) {
1465 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1472 /*******************************************************************
1473 Reads or writes a DOM_SAM_INFO_EX structure.
1474 ********************************************************************/
1476 static BOOL smb_io_sam_info_ex(const char *desc, DOM_SAM_INFO_EX *sam, prs_struct *ps, int depth)
1481 prs_debug(ps, depth, desc, "smb_io_sam_info_ex");
1487 if(!smb_io_clnt_srv("", &sam->client, ps, depth))
1490 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1493 if (sam->logon_level != 0) {
1494 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1501 /*************************************************************************
1502 Inits a NET_USER_INFO_3 structure.
1504 This is a network logon reply packet, and contains much information about
1505 the user. This information is passed as a (very long) paramater list
1506 to avoid having to link in the PASSDB code to every program that deals
1508 *************************************************************************/
1510 void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
1514 const char* user_name,
1515 const char* full_name,
1516 const char* home_dir,
1517 const char* dir_drive,
1518 const char* logon_script,
1519 const char* profile_path,
1521 time_t unix_logon_time,
1522 time_t unix_logoff_time,
1523 time_t unix_kickoff_time,
1524 time_t unix_pass_last_set_time,
1525 time_t unix_pass_can_change_time,
1526 time_t unix_pass_must_change_time,
1528 uint16 logon_count, uint16 bad_pw_count,
1529 uint32 num_groups, const DOM_GID *gids,
1530 uint32 user_flgs, uint32 acct_flags,
1531 uchar user_session_key[16],
1532 uchar lm_session_key[16],
1533 const char *logon_srv, const char *logon_dom,
1534 const DOM_SID *dom_sid)
1536 /* only cope with one "other" sid, right now. */
1537 /* need to count the number of space-delimited sids */
1539 int num_other_sids = 0;
1541 NTTIME logon_time, logoff_time, kickoff_time,
1542 pass_last_set_time, pass_can_change_time,
1543 pass_must_change_time;
1547 usr->ptr_user_info = 1; /* yes, we're bothering to put USER_INFO data here */
1549 /* Create NTTIME structs */
1550 unix_to_nt_time (&logon_time, unix_logon_time);
1551 unix_to_nt_time (&logoff_time, unix_logoff_time);
1552 unix_to_nt_time (&kickoff_time, unix_kickoff_time);
1553 unix_to_nt_time (&pass_last_set_time, unix_pass_last_set_time);
1554 unix_to_nt_time (&pass_can_change_time, unix_pass_can_change_time);
1555 unix_to_nt_time (&pass_must_change_time, unix_pass_must_change_time);
1557 usr->logon_time = logon_time;
1558 usr->logoff_time = logoff_time;
1559 usr->kickoff_time = kickoff_time;
1560 usr->pass_last_set_time = pass_last_set_time;
1561 usr->pass_can_change_time = pass_can_change_time;
1562 usr->pass_must_change_time = pass_must_change_time;
1564 usr->logon_count = logon_count;
1565 usr->bad_pw_count = bad_pw_count;
1567 usr->user_rid = user_rid;
1568 usr->group_rid = group_rid;
1569 usr->num_groups = num_groups;
1571 usr->buffer_groups = 1; /* indicates fill in groups, below, even if there are none */
1572 usr->user_flgs = user_flgs;
1573 usr->acct_flags = acct_flags;
1575 if (user_session_key != NULL)
1576 memcpy(usr->user_sess_key, user_session_key, sizeof(usr->user_sess_key));
1578 memset((char *)usr->user_sess_key, '\0', sizeof(usr->user_sess_key));
1580 usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
1582 memset((char *)usr->lm_sess_key, '\0', sizeof(usr->lm_sess_key));
1584 for (i=0; i<7; i++) {
1585 memset(&usr->unknown[i], '\0', sizeof(usr->unknown));
1588 if (lm_session_key != NULL) {
1589 memcpy(usr->lm_sess_key, lm_session_key, sizeof(usr->lm_sess_key));
1592 num_other_sids = init_dom_sid2s(ctx, NULL, &usr->other_sids);
1594 usr->num_other_sids = num_other_sids;
1595 usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0;
1597 init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
1598 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
1599 init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
1600 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
1601 init_unistr2(&usr->uni_logon_script, logon_script, UNI_FLAGS_NONE);
1602 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
1603 init_unistr2(&usr->uni_profile_path, profile_path, UNI_FLAGS_NONE);
1604 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
1605 init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
1606 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
1607 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
1608 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
1610 usr->num_groups2 = num_groups;
1613 usr->gids = TALLOC_ZERO_ARRAY(ctx,DOM_GID,num_groups);
1614 if (usr->gids == NULL)
1620 for (i = 0; i < num_groups; i++)
1621 usr->gids[i] = gids[i];
1623 init_unistr2(&usr->uni_logon_srv, logon_srv, UNI_FLAGS_NONE);
1624 init_uni_hdr(&usr->hdr_logon_srv, &usr->uni_logon_srv);
1625 init_unistr2(&usr->uni_logon_dom, logon_dom, UNI_FLAGS_NONE);
1626 init_uni_hdr(&usr->hdr_logon_dom, &usr->uni_logon_dom);
1628 init_dom_sid2(&usr->dom_sid, dom_sid);
1629 /* "other" sids are set up above */
1632 static void dump_acct_flags(uint32 acct_flags) {
1635 DEBUG(lvl,("dump_acct_flags\n"));
1636 if (acct_flags & ACB_NORMAL) {
1637 DEBUGADD(lvl,("\taccount has ACB_NORMAL\n"));
1639 if (acct_flags & ACB_PWNOEXP) {
1640 DEBUGADD(lvl,("\taccount has ACB_PWNOEXP\n"));
1642 if (acct_flags & ACB_ENC_TXT_PWD_ALLOWED) {
1643 DEBUGADD(lvl,("\taccount has ACB_ENC_TXT_PWD_ALLOWED\n"));
1645 if (acct_flags & ACB_NOT_DELEGATED) {
1646 DEBUGADD(lvl,("\taccount has ACB_NOT_DELEGATED\n"));
1648 if (acct_flags & ACB_USE_DES_KEY_ONLY) {
1649 DEBUGADD(lvl,("\taccount has ACB_USE_DES_KEY_ONLY set, sig verify wont work\n"));
1651 if (acct_flags & ACB_NO_AUTH_DATA_REQD) {
1652 DEBUGADD(lvl,("\taccount has ACB_NO_AUTH_DATA_REQD set\n"));
1654 if (acct_flags & ACB_PWEXPIRED) {
1655 DEBUGADD(lvl,("\taccount has ACB_PWEXPIRED set\n"));
1659 static void dump_user_flgs(uint32 user_flags) {
1662 DEBUG(lvl,("dump_user_flgs\n"));
1663 if (user_flags & LOGON_EXTRA_SIDS) {
1664 DEBUGADD(lvl,("\taccount has LOGON_EXTRA_SIDS\n"));
1666 if (user_flags & LOGON_RESOURCE_GROUPS) {
1667 DEBUGADD(lvl,("\taccount has LOGON_RESOURCE_GROUPS\n"));
1669 if (user_flags & LOGON_NTLMV2_ENABLED) {
1670 DEBUGADD(lvl,("\taccount has LOGON_NTLMV2_ENABLED\n"));
1672 if (user_flags & LOGON_CACHED_ACCOUNT) {
1673 DEBUGADD(lvl,("\taccount has LOGON_CACHED_ACCOUNT\n"));
1675 if (user_flags & LOGON_PROFILE_PATH_RETURNED) {
1676 DEBUGADD(lvl,("\taccount has LOGON_PROFILE_PATH_RETURNED\n"));
1678 if (user_flags & LOGON_SERVER_TRUST_ACCOUNT) {
1679 DEBUGADD(lvl,("\taccount has LOGON_SERVER_TRUST_ACCOUNT\n"));
1685 /*******************************************************************
1686 This code has been modified to cope with a NET_USER_INFO_2 - which is
1687 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1688 We use validation level to determine if we're marshalling a info 2 or
1689 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1690 Jacobsen at HP. JRA.
1691 ********************************************************************/
1693 BOOL net_io_user_info3(const char *desc, NET_USER_INFO_3 *usr, prs_struct *ps,
1694 int depth, uint16 validation_level, BOOL kerb_validation_level)
1701 prs_debug(ps, depth, desc, "net_io_user_info3");
1704 if (UNMARSHALLING(ps))
1710 if(!prs_uint32("ptr_user_info ", ps, depth, &usr->ptr_user_info))
1713 if (usr->ptr_user_info == 0)
1716 if(!smb_io_time("logon time", &usr->logon_time, ps, depth)) /* logon time */
1718 if(!smb_io_time("logoff time", &usr->logoff_time, ps, depth)) /* logoff time */
1720 if(!smb_io_time("kickoff time", &usr->kickoff_time, ps, depth)) /* kickoff time */
1722 if(!smb_io_time("last set time", &usr->pass_last_set_time, ps, depth)) /* password last set time */
1724 if(!smb_io_time("can change time", &usr->pass_can_change_time , ps, depth)) /* password can change time */
1726 if(!smb_io_time("must change time", &usr->pass_must_change_time, ps, depth)) /* password must change time */
1729 if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
1731 if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
1733 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
1735 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
1737 if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
1739 if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive unicode string header */
1742 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count)) /* logon count */
1744 if(!prs_uint16("bad_pw_count ", ps, depth, &usr->bad_pw_count)) /* bad password count */
1747 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User RID */
1749 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group RID */
1751 if(!prs_uint32("num_groups ", ps, depth, &usr->num_groups)) /* num groups */
1753 if(!prs_uint32("buffer_groups ", ps, depth, &usr->buffer_groups)) /* undocumented buffer pointer to groups. */
1755 if(!prs_uint32("user_flgs ", ps, depth, &usr->user_flgs)) /* user flags */
1757 dump_user_flgs(usr->user_flgs);
1758 if(!prs_uint8s(False, "user_sess_key", ps, depth, usr->user_sess_key, 16)) /* user session key */
1761 if(!smb_io_unihdr("hdr_logon_srv", &usr->hdr_logon_srv, ps, depth)) /* logon server unicode string header */
1763 if(!smb_io_unihdr("hdr_logon_dom", &usr->hdr_logon_dom, ps, depth)) /* logon domain unicode string header */
1766 if(!prs_uint32("buffer_dom_id ", ps, depth, &usr->buffer_dom_id)) /* undocumented logon domain id pointer */
1769 if(!prs_uint8s(False, "lm_sess_key", ps, depth, usr->lm_sess_key, 8)) /* lm session key */
1772 if(!prs_uint32("acct_flags ", ps, depth, &usr->acct_flags)) /* Account flags */
1774 dump_acct_flags(usr->acct_flags);
1775 for (i = 0; i < 7; i++)
1777 if (!prs_uint32("unkown", ps, depth, &usr->unknown[i])) /* unknown */
1781 if (validation_level == 3) {
1782 if(!prs_uint32("num_other_sids", ps, depth, &usr->num_other_sids)) /* 0 - num_sids */
1784 if(!prs_uint32("buffer_other_sids", ps, depth, &usr->buffer_other_sids)) /* NULL - undocumented pointer to SIDs. */
1787 if (UNMARSHALLING(ps)) {
1788 usr->num_other_sids = 0;
1789 usr->buffer_other_sids = 0;
1793 /* get kerb validation info (not really part of user_info_3) - Guenther */
1795 if (kerb_validation_level) {
1797 if(!prs_uint32("ptr_res_group_dom_sid", ps, depth, &usr->ptr_res_group_dom_sid))
1799 if(!prs_uint32("res_group_count", ps, depth, &usr->res_group_count))
1801 if(!prs_uint32("ptr_res_groups", ps, depth, &usr->ptr_res_groups))
1805 if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
1807 if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
1809 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
1811 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
1813 if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
1815 if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
1821 if(!prs_uint32("num_groups2 ", ps, depth, &usr->num_groups2)) /* num groups2 */
1824 if (usr->num_groups != usr->num_groups2) {
1825 DEBUG(3,("net_io_user_info3: num_groups mismatch! (%d != %d)\n",
1826 usr->num_groups, usr->num_groups2));
1830 if (UNMARSHALLING(ps)) {
1831 if (usr->num_groups) {
1832 usr->gids = PRS_ALLOC_MEM(ps, DOM_GID, usr->num_groups);
1833 if (usr->gids == NULL)
1840 for (i = 0; i < usr->num_groups; i++) {
1841 if(!smb_io_gid("", &usr->gids[i], ps, depth)) /* group info */
1845 if(!smb_io_unistr2("uni_logon_srv", &usr->uni_logon_srv, usr->hdr_logon_srv.buffer, ps, depth)) /* logon server unicode string */
1847 if(!smb_io_unistr2("uni_logon_dom", &usr->uni_logon_dom, usr->hdr_logon_dom.buffer, ps, depth)) /* logon domain unicode string */
1850 if(!smb_io_dom_sid2("", &usr->dom_sid, ps, depth)) /* domain SID */
1853 if (validation_level == 3 && usr->buffer_other_sids) {
1855 uint32 num_other_sids = usr->num_other_sids;
1857 if (!(usr->user_flgs & LOGON_EXTRA_SIDS)) {
1858 DEBUG(10,("net_io_user_info3: user_flgs attribute does not have LOGON_EXTRA_SIDS\n"));
1862 if (!prs_uint32("num_other_sids", ps, depth,
1866 if (num_other_sids != usr->num_other_sids)
1869 if (UNMARSHALLING(ps)) {
1870 if (usr->num_other_sids) {
1871 usr->other_sids = PRS_ALLOC_MEM(ps, DOM_SID2, usr->num_other_sids);
1872 usr->other_sids_attrib =
1873 PRS_ALLOC_MEM(ps, uint32, usr->num_other_sids);
1875 usr->other_sids = NULL;
1876 usr->other_sids_attrib = NULL;
1879 if ((num_other_sids != 0) &&
1880 ((usr->other_sids == NULL) ||
1881 (usr->other_sids_attrib == NULL)))
1885 /* First the pointers to the SIDS and attributes */
1889 for (i=0; i<usr->num_other_sids; i++) {
1892 if (!prs_uint32("sid_ptr", ps, depth, &ptr))
1895 if (UNMARSHALLING(ps) && (ptr == 0))
1898 if (!prs_uint32("attribute", ps, depth,
1899 &usr->other_sids_attrib[i]))
1903 for (i = 0; i < usr->num_other_sids; i++) {
1904 if(!smb_io_dom_sid2("", &usr->other_sids[i], ps, depth)) /* other domain SIDs */
1914 /*******************************************************************
1915 Reads or writes a structure.
1916 ********************************************************************/
1918 BOOL net_io_q_sam_logon(const char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth)
1923 prs_debug(ps, depth, desc, "net_io_q_sam_logon");
1929 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth))
1932 if(!prs_align_uint16(ps))
1935 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1941 /*******************************************************************
1942 Reads or writes a structure.
1943 ********************************************************************/
1945 BOOL net_io_r_sam_logon(const char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth)
1950 prs_debug(ps, depth, desc, "net_io_r_sam_logon");
1953 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1955 if (&r_l->buffer_creds) {
1956 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1960 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1965 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1966 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
1969 if (r_l->switch_value != 0) {
1970 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
1975 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1978 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1987 /*******************************************************************
1988 Reads or writes a structure.
1989 ********************************************************************/
1991 BOOL net_io_q_sam_logon_ex(const char *desc, NET_Q_SAM_LOGON_EX *q_l, prs_struct *ps, int depth)
1996 prs_debug(ps, depth, desc, "net_io_q_sam_logon_ex");
2002 if(!smb_io_sam_info_ex("", &q_l->sam_id, ps, depth))
2005 if(!prs_align_uint16(ps))
2008 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
2014 if(!prs_uint32("flags ", ps, depth, &q_l->flags))
2020 /*******************************************************************
2021 Reads or writes a structure.
2022 ********************************************************************/
2024 BOOL net_io_r_sam_logon_ex(const char *desc, NET_R_SAM_LOGON_EX *r_l, prs_struct *ps, int depth)
2029 prs_debug(ps, depth, desc, "net_io_r_sam_logon_ex");
2032 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
2037 #if 1 /* W2k always needs this - even for bad passwd. JRA */
2038 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
2041 if (r_l->switch_value != 0) {
2042 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
2047 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
2050 if(!prs_uint32("flags ", ps, depth, &r_l->flags))
2053 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
2063 /*******************************************************************
2064 Reads or writes a structure.
2065 ********************************************************************/
2067 BOOL net_io_q_sam_logoff(const char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth)
2072 prs_debug(ps, depth, desc, "net_io_q_sam_logoff");
2078 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
2084 /*******************************************************************
2085 Reads or writes a structure.
2086 ********************************************************************/
2088 BOOL net_io_r_sam_logoff(const char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth)
2093 prs_debug(ps, depth, desc, "net_io_r_sam_logoff");
2099 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
2101 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
2104 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
2110 /*******************************************************************
2111 makes a NET_Q_SAM_SYNC structure.
2112 ********************************************************************/
2113 BOOL init_net_q_sam_sync(NET_Q_SAM_SYNC * q_s, const char *srv_name,
2114 const char *cli_name, DOM_CRED *cli_creds,
2115 DOM_CRED *ret_creds, uint32 database_id,
2118 DEBUG(5, ("init_q_sam_sync\n"));
2120 init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
2121 init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
2124 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
2127 memcpy(&q_s->ret_creds, ret_creds, sizeof(q_s->ret_creds));
2129 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
2131 q_s->database_id = database_id;
2132 q_s->restart_state = 0;
2133 q_s->sync_context = next_rid;
2134 q_s->max_size = 0xffff;
2139 /*******************************************************************
2140 reads or writes a structure.
2141 ********************************************************************/
2142 BOOL net_io_q_sam_sync(const char *desc, NET_Q_SAM_SYNC * q_s, prs_struct *ps,
2145 prs_debug(ps, depth, desc, "net_io_q_sam_sync");
2148 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
2150 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
2153 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
2155 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
2158 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
2160 if (!prs_uint32("restart_state", ps, depth, &q_s->restart_state))
2162 if (!prs_uint32("sync_context ", ps, depth, &q_s->sync_context))
2165 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
2171 /*******************************************************************
2172 reads or writes a structure.
2173 ********************************************************************/
2174 static BOOL net_io_sam_delta_hdr(const char *desc, SAM_DELTA_HDR * delta,
2175 prs_struct *ps, int depth)
2177 prs_debug(ps, depth, desc, "net_io_sam_delta_hdr");
2180 if (!prs_uint16("type", ps, depth, &delta->type))
2182 if (!prs_uint16("type2", ps, depth, &delta->type2))
2184 if (!prs_uint32("target_rid", ps, depth, &delta->target_rid))
2187 if (!prs_uint32("type3", ps, depth, &delta->type3))
2190 /* Not sure why we need this but it seems to be necessary to get
2191 sam deltas working. */
2193 if (delta->type != 0x16) {
2194 if (!prs_uint32("ptr_delta", ps, depth, &delta->ptr_delta))
2201 /*******************************************************************
2202 reads or writes a structure.
2203 ********************************************************************/
2204 static BOOL net_io_sam_delta_mod_count(const char *desc, SAM_DELTA_MOD_COUNT *info,
2205 prs_struct *ps, int depth)
2207 prs_debug(ps, depth, desc, "net_io_sam_delta_stamp");
2210 if (!prs_uint32("seqnum", ps, depth, &info->seqnum))
2212 if (!prs_uint32("dom_mod_count_ptr", ps, depth,
2213 &info->dom_mod_count_ptr))
2216 if (info->dom_mod_count_ptr) {
2217 if (!prs_uint64("dom_mod_count", ps, depth,
2218 &info->dom_mod_count))
2225 /*******************************************************************
2226 reads or writes a structure.
2227 ********************************************************************/
2228 static BOOL net_io_sam_domain_info(const char *desc, SAM_DOMAIN_INFO * info,
2229 prs_struct *ps, int depth)
2231 prs_debug(ps, depth, desc, "net_io_sam_domain_info");
2234 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
2236 if (!smb_io_unihdr("hdr_oem_info", &info->hdr_oem_info, ps, depth))
2239 if (!prs_uint64("force_logoff", ps, depth, &info->force_logoff))
2241 if (!prs_uint16("min_pwd_len", ps, depth, &info->min_pwd_len))
2243 if (!prs_uint16("pwd_history_len", ps, depth, &info->pwd_history_len))
2245 if (!prs_uint64("max_pwd_age", ps, depth, &info->max_pwd_age))
2247 if (!prs_uint64("min_pwd_age", ps, depth, &info->min_pwd_age))
2249 if (!prs_uint64("dom_mod_count", ps, depth, &info->dom_mod_count))
2251 if (!smb_io_time("creation_time", &info->creation_time, ps, depth))
2253 if (!prs_uint32("security_information", ps, depth, &info->security_information))
2255 if (!smb_io_bufhdr4("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2257 if (!smb_io_lockout_string_hdr("hdr_account_lockout_string", &info->hdr_account_lockout, ps, depth))
2259 if (!smb_io_unihdr("hdr_unknown2", &info->hdr_unknown2, ps, depth))
2261 if (!smb_io_unihdr("hdr_unknown3", &info->hdr_unknown3, ps, depth))
2263 if (!smb_io_unihdr("hdr_unknown4", &info->hdr_unknown4, ps, depth))
2265 if (!prs_uint32("logon_chgpass", ps, depth, &info->logon_chgpass))
2267 if (!prs_uint32("unknown6", ps, depth, &info->unknown6))
2269 if (!prs_uint32("unknown7", ps, depth, &info->unknown7))
2271 if (!prs_uint32("unknown8", ps, depth, &info->unknown8))
2274 if (!smb_io_unistr2("uni_dom_name", &info->uni_dom_name,
2275 info->hdr_dom_name.buffer, ps, depth))
2277 if (!smb_io_unistr2("buf_oem_info", &info->buf_oem_info,
2278 info->hdr_oem_info.buffer, ps, depth))
2281 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2284 if (!smb_io_account_lockout_str("account_lockout", &info->account_lockout,
2285 info->hdr_account_lockout.buffer, ps, depth))
2288 if (!smb_io_unistr2("buf_unknown2", &info->buf_unknown2,
2289 info->hdr_unknown2.buffer, ps, depth))
2291 if (!smb_io_unistr2("buf_unknown3", &info->buf_unknown3,
2292 info->hdr_unknown3.buffer, ps, depth))
2294 if (!smb_io_unistr2("buf_unknown4", &info->buf_unknown4,
2295 info->hdr_unknown4.buffer, ps, depth))
2301 /*******************************************************************
2302 reads or writes a structure.
2303 ********************************************************************/
2304 static BOOL net_io_sam_group_info(const char *desc, SAM_GROUP_INFO * info,
2305 prs_struct *ps, int depth)
2307 prs_debug(ps, depth, desc, "net_io_sam_group_info");
2310 if (!smb_io_unihdr("hdr_grp_name", &info->hdr_grp_name, ps, depth))
2312 if (!smb_io_gid("gid", &info->gid, ps, depth))
2314 if (!smb_io_unihdr("hdr_grp_desc", &info->hdr_grp_desc, ps, depth))
2316 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2319 if (ps->data_offset + 48 > ps->buffer_size)
2321 ps->data_offset += 48;
2323 if (!smb_io_unistr2("uni_grp_name", &info->uni_grp_name,
2324 info->hdr_grp_name.buffer, ps, depth))
2326 if (!smb_io_unistr2("uni_grp_desc", &info->uni_grp_desc,
2327 info->hdr_grp_desc.buffer, ps, depth))
2329 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2335 /*******************************************************************
2336 reads or writes a structure.
2337 ********************************************************************/
2338 static BOOL net_io_sam_passwd_info(const char *desc, SAM_PWD * pwd,
2339 prs_struct *ps, int depth)
2341 prs_debug(ps, depth, desc, "net_io_sam_passwd_info");
2344 if (!prs_uint32("unk_0 ", ps, depth, &pwd->unk_0))
2347 if (!smb_io_unihdr("hdr_lm_pwd", &pwd->hdr_lm_pwd, ps, depth))
2349 if (!prs_uint8s(False, "buf_lm_pwd", ps, depth, pwd->buf_lm_pwd, 16))
2352 if (!smb_io_unihdr("hdr_nt_pwd", &pwd->hdr_nt_pwd, ps, depth))
2354 if (!prs_uint8s(False, "buf_nt_pwd", ps, depth, pwd->buf_nt_pwd, 16))
2357 if (!smb_io_unihdr("", &pwd->hdr_empty_lm, ps, depth))
2359 if (!smb_io_unihdr("", &pwd->hdr_empty_nt, ps, depth))
2365 /*******************************************************************
2366 reads or writes a structure.
2367 ********************************************************************/
2368 static BOOL net_io_sam_account_info(const char *desc, SAM_ACCOUNT_INFO *info,
2369 prs_struct *ps, int depth)
2371 BUFHDR2 hdr_priv_data;
2374 prs_debug(ps, depth, desc, "net_io_sam_account_info");
2377 if (!smb_io_unihdr("hdr_acct_name", &info->hdr_acct_name, ps, depth))
2379 if (!smb_io_unihdr("hdr_full_name", &info->hdr_full_name, ps, depth))
2382 if (!prs_uint32("user_rid ", ps, depth, &info->user_rid))
2384 if (!prs_uint32("group_rid", ps, depth, &info->group_rid))
2387 if (!smb_io_unihdr("hdr_home_dir ", &info->hdr_home_dir, ps, depth))
2389 if (!smb_io_unihdr("hdr_dir_drive", &info->hdr_dir_drive, ps, depth))
2391 if (!smb_io_unihdr("hdr_logon_script", &info->hdr_logon_script, ps,
2395 if (!smb_io_unihdr("hdr_acct_desc", &info->hdr_acct_desc, ps, depth))
2397 if (!smb_io_unihdr("hdr_workstations", &info->hdr_workstations, ps,
2401 if (!smb_io_time("logon_time", &info->logon_time, ps, depth))
2403 if (!smb_io_time("logoff_time", &info->logoff_time, ps, depth))
2406 if (!prs_uint32("logon_divs ", ps, depth, &info->logon_divs))
2408 if (!prs_uint32("ptr_logon_hrs", ps, depth, &info->ptr_logon_hrs))
2411 if (!prs_uint16("bad_pwd_count", ps, depth, &info->bad_pwd_count))
2413 if (!prs_uint16("logon_count", ps, depth, &info->logon_count))
2415 if (!smb_io_time("pwd_last_set_time", &info->pwd_last_set_time, ps,
2418 if (!smb_io_time("acct_expiry_time", &info->acct_expiry_time, ps,
2422 if (!prs_uint32("acb_info", ps, depth, &info->acb_info))
2424 if (!prs_uint8s(False, "nt_pwd", ps, depth, info->nt_pwd, 16))
2426 if (!prs_uint8s(False, "lm_pwd", ps, depth, info->lm_pwd, 16))
2428 if (!prs_uint8("lm_pwd_present", ps, depth, &info->lm_pwd_present))
2430 if (!prs_uint8("nt_pwd_present", ps, depth, &info->nt_pwd_present))
2432 if (!prs_uint8("pwd_expired", ps, depth, &info->pwd_expired))
2435 if (!smb_io_unihdr("hdr_comment", &info->hdr_comment, ps, depth))
2437 if (!smb_io_unihdr("hdr_parameters", &info->hdr_parameters, ps,
2440 if (!prs_uint16("country", ps, depth, &info->country))
2442 if (!prs_uint16("codepage", ps, depth, &info->codepage))
2445 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data, ps, depth))
2447 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2449 if (!smb_io_unihdr("hdr_profile", &info->hdr_profile, ps, depth))
2452 for (i = 0; i < 3; i++)
2454 if (!smb_io_unihdr("hdr_reserved", &info->hdr_reserved[i],
2459 for (i = 0; i < 4; i++)
2461 if (!prs_uint32("dw_reserved", ps, depth,
2462 &info->dw_reserved[i]))
2466 if (!smb_io_unistr2("uni_acct_name", &info->uni_acct_name,
2467 info->hdr_acct_name.buffer, ps, depth))
2470 if (!smb_io_unistr2("uni_full_name", &info->uni_full_name,
2471 info->hdr_full_name.buffer, ps, depth))
2474 if (!smb_io_unistr2("uni_home_dir ", &info->uni_home_dir,
2475 info->hdr_home_dir.buffer, ps, depth))
2478 if (!smb_io_unistr2("uni_dir_drive", &info->uni_dir_drive,
2479 info->hdr_dir_drive.buffer, ps, depth))
2482 if (!smb_io_unistr2("uni_logon_script", &info->uni_logon_script,
2483 info->hdr_logon_script.buffer, ps, depth))
2486 if (!smb_io_unistr2("uni_acct_desc", &info->uni_acct_desc,
2487 info->hdr_acct_desc.buffer, ps, depth))
2490 if (!smb_io_unistr2("uni_workstations", &info->uni_workstations,
2491 info->hdr_workstations.buffer, ps, depth))
2495 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2497 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2500 if (!smb_io_rpc_blob("buf_logon_hrs", &info->buf_logon_hrs, ps, depth))
2503 if (!smb_io_unistr2("uni_comment", &info->uni_comment,
2504 info->hdr_comment.buffer, ps, depth))
2507 if (!smb_io_unistr2("uni_parameters", &info->uni_parameters,
2508 info->hdr_parameters.buffer, ps, depth))
2511 if (hdr_priv_data.buffer != 0)
2515 if (!prs_uint32("pwd_len", ps, depth, &len))
2517 old_offset = ps->data_offset;
2523 if (!prs_hash1(ps, ps->data_offset, len))
2526 if (!net_io_sam_passwd_info("pass", &info->pass,
2533 if (!prs_hash1(ps, old_offset, len))
2537 if (old_offset + len > ps->buffer_size)
2539 ps->data_offset = old_offset + len;
2541 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2544 if (!smb_io_unistr2("uni_profile", &info->uni_profile,
2545 info->hdr_profile.buffer, ps, depth))
2553 /*******************************************************************
2554 reads or writes a structure.
2555 ********************************************************************/
2556 static BOOL net_io_sam_group_mem_info(const char *desc, SAM_GROUP_MEM_INFO * info,
2557 prs_struct *ps, int depth)
2562 prs_debug(ps, depth, desc, "net_io_sam_group_mem_info");
2566 if (!prs_uint32("ptr_rids ", ps, depth, &info->ptr_rids))
2568 if (!prs_uint32("ptr_attribs", ps, depth, &info->ptr_attribs))
2570 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2573 if (ps->data_offset + 16 > ps->buffer_size)
2575 ps->data_offset += 16;
2577 if (info->ptr_rids != 0)
2579 if (!prs_uint32("num_members2", ps, depth,
2580 &info->num_members2))
2583 if (info->num_members2 != info->num_members)
2589 if (UNMARSHALLING(ps)) {
2590 if (info->num_members2) {
2591 info->rids = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_members2);
2593 if (info->rids == NULL) {
2594 DEBUG(0, ("out of memory allocating %d rids\n",
2595 info->num_members2));
2603 for (i = 0; i < info->num_members2; i++)
2605 slprintf(tmp, sizeof(tmp) - 1, "rids[%02d]", i);
2606 if (!prs_uint32(tmp, ps, depth, &info->rids[i]))
2611 if (info->ptr_attribs != 0)
2613 if (!prs_uint32("num_members3", ps, depth,
2614 &info->num_members3))
2616 if (info->num_members3 != info->num_members)
2622 if (UNMARSHALLING(ps)) {
2623 if (info->num_members3) {
2624 info->attribs = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_members3);
2626 if (info->attribs == NULL) {
2627 DEBUG(0, ("out of memory allocating %d attribs\n",
2628 info->num_members3));
2632 info->attribs = NULL;
2636 for (i = 0; i < info->num_members3; i++)
2638 slprintf(tmp, sizeof(tmp) - 1, "attribs[%02d]", i);
2639 if (!prs_uint32(tmp, ps, depth, &info->attribs[i]))
2647 /*******************************************************************
2648 reads or writes a structure.
2649 ********************************************************************/
2650 static BOOL net_io_sam_alias_info(const char *desc, SAM_ALIAS_INFO * info,
2651 prs_struct *ps, int depth)
2653 prs_debug(ps, depth, desc, "net_io_sam_alias_info");
2656 if (!smb_io_unihdr("hdr_als_name", &info->hdr_als_name, ps, depth))
2658 if (!prs_uint32("als_rid", ps, depth, &info->als_rid))
2660 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2662 if (!smb_io_unihdr("hdr_als_desc", &info->hdr_als_desc, ps, depth))
2665 if (ps->data_offset + 40 > ps->buffer_size)
2667 ps->data_offset += 40;
2669 if (!smb_io_unistr2("uni_als_name", &info->uni_als_name,
2670 info->hdr_als_name.buffer, ps, depth))
2672 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2675 if (!smb_io_unistr2("uni_als_desc", &info->uni_als_desc,
2676 info->hdr_als_desc.buffer, ps, depth))
2682 /*******************************************************************
2683 reads or writes a structure.
2684 ********************************************************************/
2685 static BOOL net_io_sam_alias_mem_info(const char *desc, SAM_ALIAS_MEM_INFO * info,
2686 prs_struct *ps, int depth)
2691 prs_debug(ps, depth, desc, "net_io_sam_alias_mem_info");
2695 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2697 if (!prs_uint32("ptr_members", ps, depth, &info->ptr_members))
2700 if (ps->data_offset + 16 > ps->buffer_size)
2702 ps->data_offset += 16;
2704 if (info->ptr_members != 0)
2706 if (!prs_uint32("num_sids", ps, depth, &info->num_sids))
2708 if (info->num_sids != info->num_members)
2714 if (UNMARSHALLING(ps)) {
2715 if (info->num_sids) {
2716 info->ptr_sids = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_sids);
2718 if (info->ptr_sids == NULL) {
2719 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2724 info->ptr_sids = NULL;
2728 for (i = 0; i < info->num_sids; i++)
2730 slprintf(tmp, sizeof(tmp) - 1, "ptr_sids[%02d]", i);
2731 if (!prs_uint32(tmp, ps, depth, &info->ptr_sids[i]))
2735 if (UNMARSHALLING(ps)) {
2736 if (info->num_sids) {
2737 info->sids = TALLOC_ARRAY(ps->mem_ctx, DOM_SID2, info->num_sids);
2739 if (info->sids == NULL) {
2740 DEBUG(0, ("error allocating %d sids\n",
2749 for (i = 0; i < info->num_sids; i++)
2751 if (info->ptr_sids[i] != 0)
2753 slprintf(tmp, sizeof(tmp) - 1, "sids[%02d]",
2755 if (!smb_io_dom_sid2(tmp, &info->sids[i],
2765 /*******************************************************************
2766 reads or writes a structure.
2767 ********************************************************************/
2768 static BOOL net_io_sam_policy_info(const char *desc, SAM_DELTA_POLICY *info,
2769 prs_struct *ps, int depth)
2772 prs_debug(ps, depth, desc, "net_io_sam_policy_info");
2778 if (!prs_uint32("max_log_size", ps, depth, &info->max_log_size))
2780 if (!prs_uint64("audit_retention_period", ps, depth,
2781 &info->audit_retention_period))
2783 if (!prs_uint32("auditing_mode", ps, depth, &info->auditing_mode))
2785 if (!prs_uint32("num_events", ps, depth, &info->num_events))
2787 if (!prs_uint32("ptr_events", ps, depth, &info->ptr_events))
2790 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
2793 if (!prs_uint32("sid_ptr", ps, depth, &info->sid_ptr))
2796 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2798 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2799 &info->non_paged_pool_limit))
2801 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2803 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2805 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2807 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2809 if (!smb_io_time("modify_time", &info->modify_time, ps, depth))
2811 if (!smb_io_time("create_time", &info->create_time, ps, depth))
2813 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2816 for (i=0; i<4; i++) {
2818 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2822 for (i=0; i<4; i++) {
2824 if (!prs_uint32("reserved", ps, depth, &reserved))
2828 if (!prs_uint32("num_event_audit_options", ps, depth,
2829 &info->num_event_audit_options))
2832 for (i=0; i<info->num_event_audit_options; i++)
2833 if (!prs_uint32("event_audit_option", ps, depth,
2834 &info->event_audit_option))
2837 if (!smb_io_unistr2("domain_name", &info->domain_name, True, ps, depth))
2840 if(!smb_io_dom_sid2("domain_sid", &info->domain_sid, ps, depth))
2843 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2852 /* This function is pretty broken - see bug #334 */
2854 /*******************************************************************
2855 reads or writes a structure.
2856 ********************************************************************/
2857 static BOOL net_io_sam_trustdoms_info(const char *desc, SAM_DELTA_TRUSTDOMS *info,
2858 prs_struct *ps, int depth)
2862 prs_debug(ps, depth, desc, "net_io_sam_trustdoms_info");
2868 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2871 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2874 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2877 if(!smb_io_unihdr("hdr_domain", &info->hdr_domain, ps, depth))
2880 if(!prs_uint32("unknown0", ps, depth, &info->unknown0))
2882 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2884 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2887 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2889 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2892 for (i=0; i<12; i++)
2893 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2896 if (!smb_io_unistr2("domain", &info->domain, True, ps, depth))
2906 /* This function doesn't work - see bug #334 */
2908 /*******************************************************************
2909 reads or writes a structure.
2910 ********************************************************************/
2911 static BOOL net_io_sam_secret_info(const char *desc, SAM_DELTA_SECRET *info,
2912 prs_struct *ps, int depth)
2916 prs_debug(ps, depth, desc, "net_io_sam_secret_info");
2922 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2925 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2928 if (!smb_io_unistr2("secret", &info->secret, True, ps, depth))
2934 if(!prs_uint32("count1", ps, depth, &info->count1))
2936 if(!prs_uint32("count2", ps, depth, &info->count2))
2938 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2942 if(!smb_io_time("time1", &info->time1, ps, depth)) /* logon time */
2944 if(!prs_uint32("count3", ps, depth, &info->count3))
2946 if(!prs_uint32("count4", ps, depth, &info->count4))
2948 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2950 if(!smb_io_time("time2", &info->time2, ps, depth)) /* logon time */
2952 if(!prs_uint32("unknow1", ps, depth, &info->unknow1))
2956 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2958 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2961 if(!prs_uint32("unknow2", ps, depth, &info->unknow2))
2964 if(!prs_uint32("chal_len", ps, depth, &info->chal_len))
2966 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2968 if(!prs_uint32("chal_len2", ps, depth, &info->chal_len2))
2971 if(!prs_uint8s (False, "chal", ps, depth, info->chal, info->chal_len2))
2974 if(!prs_uint32("key_len", ps, depth, &info->key_len))
2976 if(!prs_uint32("reserved2", ps, depth, &info->reserved2))
2978 if(!prs_uint32("key_len2", ps, depth, &info->key_len2))
2981 if(!prs_uint8s (False, "key", ps, depth, info->key, info->key_len2))
2985 if(!prs_uint32("buf_size3", ps, depth, &info->buf_size3))
2988 if(!sec_io_desc("sec_desc2", &info->sec_desc2, ps, depth))
2997 /*******************************************************************
2998 reads or writes a structure.
2999 ********************************************************************/
3000 static BOOL net_io_sam_privs_info(const char *desc, SAM_DELTA_PRIVS *info,
3001 prs_struct *ps, int depth)
3005 prs_debug(ps, depth, desc, "net_io_sam_privs_info");
3011 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
3014 if(!prs_uint32("priv_count", ps, depth, &info->priv_count))
3016 if(!prs_uint32("priv_control", ps, depth, &info->priv_control))
3019 if(!prs_uint32("priv_attr_ptr", ps, depth, &info->priv_attr_ptr))
3021 if(!prs_uint32("priv_name_ptr", ps, depth, &info->priv_name_ptr))
3024 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
3026 if (!prs_uint32("non_paged_pool_limit", ps, depth,
3027 &info->non_paged_pool_limit))
3029 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
3031 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
3033 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
3035 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
3037 if (!prs_uint32("system_flags", ps, depth, &info->system_flags))
3039 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
3042 for (i=0; i<4; i++) {
3044 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
3048 for (i=0; i<4; i++) {
3050 if (!prs_uint32("reserved", ps, depth, &reserved))
3054 if(!prs_uint32("attribute_count", ps, depth, &info->attribute_count))
3057 if (UNMARSHALLING(ps)) {
3058 if (info->attribute_count) {
3059 info->attributes = TALLOC_ARRAY(ps->mem_ctx, uint32, info->attribute_count);
3060 if (!info->attributes) {
3064 info->attributes = NULL;
3068 for (i=0; i<info->attribute_count; i++)
3069 if(!prs_uint32("attributes", ps, depth, &info->attributes[i]))
3072 if(!prs_uint32("privlist_count", ps, depth, &info->privlist_count))
3075 if (UNMARSHALLING(ps)) {
3076 if (info->privlist_count) {
3077 info->hdr_privslist = TALLOC_ARRAY(ps->mem_ctx, UNIHDR, info->privlist_count);
3078 info->uni_privslist = TALLOC_ARRAY(ps->mem_ctx, UNISTR2, info->privlist_count);
3079 if (!info->hdr_privslist) {
3082 if (!info->uni_privslist) {
3086 info->hdr_privslist = NULL;
3087 info->uni_privslist = NULL;
3091 for (i=0; i<info->privlist_count; i++)
3092 if(!smb_io_unihdr("hdr_privslist", &info->hdr_privslist[i], ps, depth))
3095 for (i=0; i<info->privlist_count; i++)
3096 if (!smb_io_unistr2("uni_privslist", &info->uni_privslist[i], True, ps, depth))
3099 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
3105 /*******************************************************************
3106 reads or writes a structure.
3107 ********************************************************************/
3108 static BOOL net_io_sam_delta_ctr(const char *desc,
3109 SAM_DELTA_CTR * delta, uint16 type,
3110 prs_struct *ps, int depth)
3112 prs_debug(ps, depth, desc, "net_io_sam_delta_ctr");
3116 /* Seen in sam deltas */
3117 case SAM_DELTA_MODIFIED_COUNT:
3118 if (!net_io_sam_delta_mod_count("", &delta->mod_count, ps, depth))
3122 case SAM_DELTA_DOMAIN_INFO:
3123 if (!net_io_sam_domain_info("", &delta->domain_info, ps, depth))
3127 case SAM_DELTA_GROUP_INFO:
3128 if (!net_io_sam_group_info("", &delta->group_info, ps, depth))
3132 case SAM_DELTA_ACCOUNT_INFO:
3133 if (!net_io_sam_account_info("", &delta->account_info, ps, depth))
3137 case SAM_DELTA_GROUP_MEM:
3138 if (!net_io_sam_group_mem_info("", &delta->grp_mem_info, ps, depth))
3142 case SAM_DELTA_ALIAS_INFO:
3143 if (!net_io_sam_alias_info("", &delta->alias_info, ps, depth))
3147 case SAM_DELTA_POLICY_INFO:
3148 if (!net_io_sam_policy_info("", &delta->policy_info, ps, depth))
3152 case SAM_DELTA_ALIAS_MEM:
3153 if (!net_io_sam_alias_mem_info("", &delta->als_mem_info, ps, depth))
3157 case SAM_DELTA_PRIVS_INFO:
3158 if (!net_io_sam_privs_info("", &delta->privs_info, ps, depth))
3162 /* These guys are implemented but broken */
3164 case SAM_DELTA_TRUST_DOMS:
3165 case SAM_DELTA_SECRET_INFO:
3168 /* These guys are not implemented yet */
3170 case SAM_DELTA_RENAME_GROUP:
3171 case SAM_DELTA_RENAME_USER:
3172 case SAM_DELTA_RENAME_ALIAS:
3173 case SAM_DELTA_DELETE_GROUP:
3174 case SAM_DELTA_DELETE_USER:
3176 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type));
3183 /*******************************************************************
3184 reads or writes a structure.
3185 ********************************************************************/
3186 BOOL net_io_r_sam_sync(const char *desc,
3187 NET_R_SAM_SYNC * r_s, prs_struct *ps, int depth)
3191 prs_debug(ps, depth, desc, "net_io_r_sam_sync");
3194 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
3196 if (!prs_uint32("sync_context", ps, depth, &r_s->sync_context))
3199 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
3201 if (r_s->ptr_deltas != 0)
3203 if (!prs_uint32("num_deltas ", ps, depth, &r_s->num_deltas))
3205 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->ptr_deltas2))
3207 if (r_s->ptr_deltas2 != 0)
3209 if (!prs_uint32("num_deltas2", ps, depth,
3213 if (r_s->num_deltas2 != r_s->num_deltas)
3219 if (UNMARSHALLING(ps)) {
3220 if (r_s->num_deltas2) {
3221 r_s->hdr_deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_HDR, r_s->num_deltas2);
3222 if (r_s->hdr_deltas == NULL) {
3223 DEBUG(0, ("error tallocating memory "
3224 "for %d delta headers\n",
3229 r_s->hdr_deltas = NULL;
3233 for (i = 0; i < r_s->num_deltas2; i++)
3235 if (!net_io_sam_delta_hdr("",
3236 &r_s->hdr_deltas[i],
3241 if (UNMARSHALLING(ps)) {
3242 if (r_s->num_deltas2) {
3243 r_s->deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_CTR, r_s->num_deltas2);
3244 if (r_s->deltas == NULL) {
3245 DEBUG(0, ("error tallocating memory "
3255 for (i = 0; i < r_s->num_deltas2; i++)
3257 if (!net_io_sam_delta_ctr(
3258 "", &r_s->deltas[i],
3259 r_s->hdr_deltas[i].type3,
3261 DEBUG(0, ("hmm, failed on i=%d\n", i));
3269 if (!prs_ntstatus("status", ps, depth, &(r_s->status)))
3275 /*******************************************************************
3276 makes a NET_Q_SAM_DELTAS structure.
3277 ********************************************************************/
3278 BOOL init_net_q_sam_deltas(NET_Q_SAM_DELTAS *q_s, const char *srv_name,
3279 const char *cli_name, DOM_CRED *cli_creds,
3280 uint32 database_id, uint64 dom_mod_count)
3282 DEBUG(5, ("init_net_q_sam_deltas\n"));
3284 init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
3285 init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
3287 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
3288 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
3290 q_s->database_id = database_id;
3291 q_s->dom_mod_count = dom_mod_count;
3292 q_s->max_size = 0xffff;
3297 /*******************************************************************
3298 reads or writes a structure.
3299 ********************************************************************/
3300 BOOL net_io_q_sam_deltas(const char *desc, NET_Q_SAM_DELTAS *q_s, prs_struct *ps,
3303 prs_debug(ps, depth, desc, "net_io_q_sam_deltas");
3306 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
3308 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
3311 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
3313 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
3316 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
3318 if (!prs_uint64("dom_mod_count", ps, depth, &q_s->dom_mod_count))
3320 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
3326 /*******************************************************************
3327 reads or writes a structure.
3328 ********************************************************************/
3329 BOOL net_io_r_sam_deltas(const char *desc,
3330 NET_R_SAM_DELTAS *r_s, prs_struct *ps, int depth)
3334 prs_debug(ps, depth, desc, "net_io_r_sam_deltas");
3337 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
3339 if (!prs_uint64("dom_mod_count", ps, depth, &r_s->dom_mod_count))
3342 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
3344 if (!prs_uint32("num_deltas", ps, depth, &r_s->num_deltas))
3346 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->num_deltas2))
3349 if (r_s->num_deltas2 != 0)
3351 if (!prs_uint32("num_deltas2 ", ps, depth, &r_s->num_deltas2))
3354 if (r_s->ptr_deltas != 0)
3356 if (UNMARSHALLING(ps)) {
3357 if (r_s->num_deltas) {
3358 r_s->hdr_deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_HDR, r_s->num_deltas);
3359 if (r_s->hdr_deltas == NULL) {
3360 DEBUG(0, ("error tallocating memory "
3361 "for %d delta headers\n",
3366 r_s->hdr_deltas = NULL;
3370 for (i = 0; i < r_s->num_deltas; i++)
3372 net_io_sam_delta_hdr("", &r_s->hdr_deltas[i],
3376 if (UNMARSHALLING(ps)) {
3377 if (r_s->num_deltas) {
3378 r_s->deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_CTR, r_s->num_deltas);
3379 if (r_s->deltas == NULL) {
3380 DEBUG(0, ("error tallocating memory "
3390 for (i = 0; i < r_s->num_deltas; i++)
3392 if (!net_io_sam_delta_ctr(
3395 r_s->hdr_deltas[i].type2,
3404 if (!prs_ntstatus("status", ps, depth, &r_s->status))
3410 /*******************************************************************
3411 Inits a NET_Q_DSR_GETDCNAME structure.
3412 ********************************************************************/
3414 void init_net_q_dsr_getdcname(NET_Q_DSR_GETDCNAME *r_t, const char *server_unc,
3415 const char *domain_name,
3416 struct GUID *domain_guid,
3417 struct GUID *site_guid,
3420 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3422 r_t->ptr_server_unc = (server_unc != NULL);
3423 init_unistr2(&r_t->uni_server_unc, server_unc, UNI_STR_TERMINATE);
3425 r_t->ptr_domain_name = (domain_name != NULL);
3426 init_unistr2(&r_t->uni_domain_name, domain_name, UNI_STR_TERMINATE);
3428 r_t->ptr_domain_guid = (domain_guid != NULL);
3429 r_t->domain_guid = domain_guid;
3431 r_t->ptr_site_guid = (site_guid != NULL);
3432 r_t->site_guid = site_guid;
3437 /*******************************************************************
3438 Inits a NET_Q_DSR_GETDCNAMEEX structure.
3439 ********************************************************************/
3441 void init_net_q_dsr_getdcnameex(NET_Q_DSR_GETDCNAMEEX *r_t, const char *server_unc,
3442 const char *domain_name,
3443 struct GUID *domain_guid,
3444 const char *site_name,
3447 DEBUG(5, ("init_net_q_dsr_getdcnameex\n"));
3449 r_t->ptr_server_unc = (server_unc != NULL);
3450 init_unistr2(&r_t->uni_server_unc, server_unc, UNI_STR_TERMINATE);
3452 r_t->ptr_domain_name = (domain_name != NULL);
3453 init_unistr2(&r_t->uni_domain_name, domain_name, UNI_STR_TERMINATE);
3455 r_t->ptr_domain_guid = (domain_guid != NULL);
3456 r_t->domain_guid = domain_guid;
3458 r_t->ptr_site_name = (site_name != NULL);
3459 init_unistr2(&r_t->uni_site_name, site_name, UNI_STR_TERMINATE);
3464 /*******************************************************************
3465 Inits a NET_Q_DSR_GETDCNAMEEX2 structure.
3466 ********************************************************************/
3468 void init_net_q_dsr_getdcnameex2(NET_Q_DSR_GETDCNAMEEX2 *r_t, const char *server_unc,
3469 const char *domain_name,
3470 const char *client_account,
3472 struct GUID *domain_guid,
3473 const char *site_name,
3476 DEBUG(5, ("init_net_q_dsr_getdcnameex2\n"));
3478 r_t->ptr_server_unc = (server_unc != NULL);
3479 init_unistr2(&r_t->uni_server_unc, server_unc, UNI_STR_TERMINATE);
3481 r_t->ptr_client_account = (client_account != NULL);
3482 init_unistr2(&r_t->uni_client_account, client_account, UNI_STR_TERMINATE);
3486 r_t->ptr_domain_name = (domain_name != NULL);
3487 init_unistr2(&r_t->uni_domain_name, domain_name, UNI_STR_TERMINATE);
3489 r_t->ptr_domain_guid = (domain_guid != NULL);
3490 r_t->domain_guid = domain_guid;
3492 r_t->ptr_site_name = (site_name != NULL);
3493 init_unistr2(&r_t->uni_site_name, site_name, UNI_STR_TERMINATE);
3498 /*******************************************************************
3499 Reads or writes an NET_Q_DSR_GETDCNAME structure.
3500 ********************************************************************/
3502 BOOL net_io_q_dsr_getdcname(const char *desc, NET_Q_DSR_GETDCNAME *r_t,
3503 prs_struct *ps, int depth)
3508 prs_debug(ps, depth, desc, "net_io_q_dsr_getdcname");
3511 if (!prs_uint32("ptr_server_unc", ps, depth, &r_t->ptr_server_unc))
3514 if (!smb_io_unistr2("server_unc", &r_t->uni_server_unc,
3515 r_t->ptr_server_unc, ps, depth))
3521 if (!prs_uint32("ptr_domain_name", ps, depth, &r_t->ptr_domain_name))
3524 if (!smb_io_unistr2("domain_name", &r_t->uni_domain_name,
3525 r_t->ptr_domain_name, ps, depth))
3531 if (!prs_uint32("ptr_domain_guid", ps, depth, &r_t->ptr_domain_guid))
3534 if (UNMARSHALLING(ps) && (r_t->ptr_domain_guid)) {
3535 r_t->domain_guid = PRS_ALLOC_MEM(ps, struct GUID, 1);
3536 if (r_t->domain_guid == NULL)
3540 if ((r_t->ptr_domain_guid) &&
3541 (!smb_io_uuid("domain_guid", r_t->domain_guid, ps, depth)))
3547 if (!prs_uint32("ptr_site_guid", ps, depth, &r_t->ptr_site_guid))
3550 if (UNMARSHALLING(ps) && (r_t->ptr_site_guid)) {
3551 r_t->site_guid = PRS_ALLOC_MEM(ps, struct GUID, 1);
3552 if (r_t->site_guid == NULL)
3556 if ((r_t->ptr_site_guid) &&
3557 (!smb_io_uuid("site_guid", r_t->site_guid, ps, depth)))
3563 if (!prs_uint32("flags", ps, depth, &r_t->flags))
3569 /*******************************************************************
3570 Reads or writes an NET_Q_DSR_GETDCNAMEEX structure.
3571 ********************************************************************/
3573 BOOL net_io_q_dsr_getdcnameex(const char *desc, NET_Q_DSR_GETDCNAMEEX *r_t,
3574 prs_struct *ps, int depth)
3579 prs_debug(ps, depth, desc, "net_io_q_dsr_getdcnameex");
3582 if (!prs_uint32("ptr_server_unc", ps, depth, &r_t->ptr_server_unc))
3585 if (!smb_io_unistr2("server_unc", &r_t->uni_server_unc,
3586 r_t->ptr_server_unc, ps, depth))
3592 if (!prs_uint32("ptr_domain_name", ps, depth, &r_t->ptr_domain_name))
3595 if (!smb_io_unistr2("domain_name", &r_t->uni_domain_name,
3596 r_t->ptr_domain_name, ps, depth))
3602 if (!prs_uint32("ptr_domain_guid", ps, depth, &r_t->ptr_domain_guid))
3605 if (UNMARSHALLING(ps) && (r_t->ptr_domain_guid)) {
3606 r_t->domain_guid = PRS_ALLOC_MEM(ps, struct GUID, 1);
3607 if (r_t->domain_guid == NULL)
3611 if ((r_t->ptr_domain_guid) &&
3612 (!smb_io_uuid("domain_guid", r_t->domain_guid, ps, depth)))
3618 if (!prs_uint32("ptr_site_name", ps, depth, &r_t->ptr_site_name))
3621 if (!smb_io_unistr2("site_name", &r_t->uni_site_name,
3622 r_t->ptr_site_name, ps, depth))
3628 if (!prs_uint32("flags", ps, depth, &r_t->flags))
3634 /*******************************************************************
3635 Reads or writes an NET_Q_DSR_GETDCNAMEEX2 structure.
3636 ********************************************************************/
3638 BOOL net_io_q_dsr_getdcnameex2(const char *desc, NET_Q_DSR_GETDCNAMEEX2 *r_t,
3639 prs_struct *ps, int depth)
3644 prs_debug(ps, depth, desc, "net_io_q_dsr_getdcnameex2");
3647 if (!prs_uint32("ptr_server_unc", ps, depth, &r_t->ptr_server_unc))
3650 if (!smb_io_unistr2("server_unc", &r_t->uni_server_unc,
3651 r_t->ptr_server_unc, ps, depth))
3657 if (!prs_uint32("ptr_client_account", ps, depth, &r_t->ptr_client_account))
3660 if (!smb_io_unistr2("client_account", &r_t->uni_client_account,
3661 r_t->ptr_client_account, ps, depth))
3667 if (!prs_uint32("mask", ps, depth, &r_t->mask))
3673 if (!prs_uint32("ptr_domain_name", ps, depth, &r_t->ptr_domain_name))
3676 if (!smb_io_unistr2("domain_name", &r_t->uni_domain_name,
3677 r_t->ptr_domain_name, ps, depth))
3683 if (!prs_uint32("ptr_domain_guid", ps, depth, &r_t->ptr_domain_guid))
3686 if (UNMARSHALLING(ps) && (r_t->ptr_domain_guid)) {
3687 r_t->domain_guid = PRS_ALLOC_MEM(ps, struct GUID, 1);
3688 if (r_t->domain_guid == NULL)
3692 if ((r_t->ptr_domain_guid) &&
3693 (!smb_io_uuid("domain_guid", r_t->domain_guid, ps, depth)))
3699 if (!prs_uint32("ptr_site_name", ps, depth, &r_t->ptr_site_name))
3702 if (!smb_io_unistr2("site_name", &r_t->uni_site_name,
3703 r_t->ptr_site_name, ps, depth))
3709 if (!prs_uint32("flags", ps, depth, &r_t->flags))
3717 /*******************************************************************
3718 Inits a NET_R_DSR_GETDCNAME structure.
3719 ********************************************************************/
3720 void init_net_r_dsr_getdcname(NET_R_DSR_GETDCNAME *r_t, const char *dc_unc,
3721 const char *dc_address, int32 dc_address_type,
3722 struct GUID domain_guid, const char *domain_name,
3723 const char *forest_name, uint32 dc_flags,
3724 const char *dc_site_name,
3725 const char *client_site_name)
3727 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3729 r_t->ptr_dc_unc = (dc_unc != NULL);
3730 init_unistr2(&r_t->uni_dc_unc, dc_unc, UNI_STR_TERMINATE);
3732 r_t->ptr_dc_address = (dc_address != NULL);
3733 init_unistr2(&r_t->uni_dc_address, dc_address, UNI_STR_TERMINATE);
3735 r_t->dc_address_type = dc_address_type;
3736 r_t->domain_guid = domain_guid;
3738 r_t->ptr_domain_name = (domain_name != NULL);
3739 init_unistr2(&r_t->uni_domain_name, domain_name, UNI_STR_TERMINATE);
3741 r_t->ptr_forest_name = (forest_name != NULL);
3742 init_unistr2(&r_t->uni_forest_name, forest_name, UNI_STR_TERMINATE);
3744 r_t->dc_flags = dc_flags;
3746 r_t->ptr_dc_site_name = (dc_site_name != NULL);
3747 init_unistr2(&r_t->uni_dc_site_name, dc_site_name, UNI_STR_TERMINATE);
3749 r_t->ptr_client_site_name = (client_site_name != NULL);
3750 init_unistr2(&r_t->uni_client_site_name, client_site_name,
3754 /*******************************************************************
3755 Reads or writes an NET_R_DSR_GETDCNAME structure.
3756 ********************************************************************/
3758 BOOL net_io_r_dsr_getdcname(const char *desc, NET_R_DSR_GETDCNAME *r_t,
3759 prs_struct *ps, int depth)
3761 uint32 info_ptr = 1;
3766 prs_debug(ps, depth, desc, "net_io_r_dsr_getdcname");
3769 /* The reply contains *just* an info struct, this is the ptr to it */
3770 if (!prs_uint32("info_ptr", ps, depth, &info_ptr))
3776 if (!prs_uint32("ptr_dc_unc", ps, depth, &r_t->ptr_dc_unc))
3779 if (!prs_uint32("ptr_dc_address", ps, depth, &r_t->ptr_dc_address))
3782 if (!prs_int32("dc_address_type", ps, depth, &r_t->dc_address_type))
3785 if (!smb_io_uuid("domain_guid", &r_t->domain_guid, ps, depth))
3788 if (!prs_uint32("ptr_domain_name", ps, depth, &r_t->ptr_domain_name))
3791 if (!prs_uint32("ptr_forest_name", ps, depth, &r_t->ptr_forest_name))
3794 if (!prs_uint32("dc_flags", ps, depth, &r_t->dc_flags))
3797 if (!prs_uint32("ptr_dc_site_name", ps, depth, &r_t->ptr_dc_site_name))
3800 if (!prs_uint32("ptr_client_site_name", ps, depth,
3801 &r_t->ptr_client_site_name))
3807 if (!smb_io_unistr2("dc_unc", &r_t->uni_dc_unc,
3808 r_t->ptr_dc_unc, ps, depth))
3814 if (!smb_io_unistr2("dc_address", &r_t->uni_dc_address,
3815 r_t->ptr_dc_address, ps, depth))
3821 if (!smb_io_unistr2("domain_name", &r_t->uni_domain_name,
3822 r_t->ptr_domain_name, ps, depth))
3828 if (!smb_io_unistr2("forest_name", &r_t->uni_forest_name,
3829 r_t->ptr_forest_name, ps, depth))
3835 if (!smb_io_unistr2("dc_site_name", &r_t->uni_dc_site_name,
3836 r_t->ptr_dc_site_name, ps, depth))
3842 if (!smb_io_unistr2("client_site_name", &r_t->uni_client_site_name,
3843 r_t->ptr_client_site_name, ps, depth))
3849 if (!prs_werror("result", ps, depth, &r_t->result))
3855 /*******************************************************************
3856 Inits a NET_Q_DSR_GETSITENAME structure.
3857 ********************************************************************/
3859 void init_net_q_dsr_getsitename(NET_Q_DSR_GETSITENAME *r_t, const char *computer_name)
3861 DEBUG(5, ("init_net_q_dsr_getsitename\n"));
3863 r_t->ptr_computer_name = (computer_name != NULL);
3864 init_unistr2(&r_t->uni_computer_name, computer_name, UNI_STR_TERMINATE);
3867 /*******************************************************************
3868 Reads or writes an NET_Q_DSR_GETSITENAME structure.
3869 ********************************************************************/
3871 BOOL net_io_q_dsr_getsitename(const char *desc, NET_Q_DSR_GETSITENAME *r_t,
3872 prs_struct *ps, int depth)
3877 prs_debug(ps, depth, desc, "net_io_q_dsr_getsitename");
3880 if (!prs_uint32("ptr_computer_name", ps, depth, &r_t->ptr_computer_name))
3883 if (!smb_io_unistr2("computer_name", &r_t->uni_computer_name,
3884 r_t->ptr_computer_name, ps, depth))
3893 /*******************************************************************
3894 Reads or writes an NET_R_DSR_GETSITENAME structure.
3895 ********************************************************************/
3897 BOOL net_io_r_dsr_getsitename(const char *desc, NET_R_DSR_GETSITENAME *r_t,
3898 prs_struct *ps, int depth)
3903 prs_debug(ps, depth, desc, "net_io_r_dsr_getsitename");
3906 if (!prs_uint32("ptr_site_name", ps, depth, &r_t->ptr_site_name))
3912 if (!smb_io_unistr2("site_name", &r_t->uni_site_name,
3913 r_t->ptr_site_name, ps, depth))
3919 if (!prs_werror("result", ps, depth, &r_t->result))