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 François 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_r_getdcname\n"));
490 r_t->ptr_logon_server = (logon_server != NULL);
491 init_unistr2(&r_t->uni_logon_server, logon_server, UNI_STR_TERMINATE);
492 r_t->ptr_domainname = (domainname != NULL);
493 init_unistr2(&r_t->uni_domainname, domainname, UNI_STR_TERMINATE);
496 /*******************************************************************
497 Reads or writes an NET_Q_GETDCNAME structure.
498 ********************************************************************/
500 BOOL net_io_q_getdcname(const char *desc, NET_Q_GETDCNAME *r_t, prs_struct *ps,
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))
560 if (!prs_ntstatus("status", ps, depth, &r_t->status))
566 /*******************************************************************
567 Inits an NET_R_TRUST_DOM_LIST structure.
568 ********************************************************************/
570 void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
571 uint32 num_doms, const char *dom_name)
575 DEBUG(5,("init_r_trust_dom\n"));
577 for (i = 0; i < MAX_TRUST_DOMS; i++) {
578 r_t->uni_trust_dom_name[i].uni_str_len = 0;
579 r_t->uni_trust_dom_name[i].uni_max_len = 0;
581 if (num_doms > MAX_TRUST_DOMS)
582 num_doms = MAX_TRUST_DOMS;
584 for (i = 0; i < num_doms; i++) {
586 fstrcpy(domain_name, dom_name);
587 strupper_m(domain_name);
588 init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, UNI_STR_TERMINATE);
589 /* the use of UNISTR2 here is non-standard. */
590 r_t->uni_trust_dom_name[i].offset = 0x1;
593 r_t->status = NT_STATUS_OK;
596 /*******************************************************************
597 Reads or writes an NET_R_TRUST_DOM_LIST structure.
598 ********************************************************************/
600 BOOL net_io_r_trust_dom(const char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth)
607 prs_debug(ps, depth, desc, "net_io_r_trust_dom");
610 /* temporary code to give a valid response */
612 if(!prs_uint32("status", ps, depth, &value))
616 if(!prs_uint32("status", ps, depth, &value))
619 if(!prs_uint32("status", ps, depth, &value))
623 if(!prs_uint32("status", ps, depth, &value))
627 if(!prs_uint32("status", ps, depth, &value))
630 /* old non working code */
634 for (i = 0; i < MAX_TRUST_DOMS; i++) {
635 if (r_t->uni_trust_dom_name[i].uni_str_len == 0)
637 if(!smb_io_unistr2("", &r_t->uni_trust_dom_name[i], True, ps, depth))
641 if(!prs_ntstatus("status", ps, depth, &r_t->status))
648 /*******************************************************************
649 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
650 ********************************************************************/
652 BOOL net_io_q_trust_dom(const char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth)
657 prs_debug(ps, depth, desc, "net_io_q_trust_dom");
660 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
662 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
668 /*******************************************************************
669 Inits an NET_Q_REQ_CHAL structure.
670 ********************************************************************/
672 void init_q_req_chal(NET_Q_REQ_CHAL *q_c,
673 const char *logon_srv, const char *logon_clnt,
674 const DOM_CHAL *clnt_chal)
676 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
678 q_c->undoc_buffer = 1; /* don't know what this buffer is */
680 init_unistr2(&q_c->uni_logon_srv, logon_srv , UNI_STR_TERMINATE);
681 init_unistr2(&q_c->uni_logon_clnt, logon_clnt, UNI_STR_TERMINATE);
683 memcpy(q_c->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
685 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
688 /*******************************************************************
689 Reads or writes an NET_Q_REQ_CHAL structure.
690 ********************************************************************/
692 BOOL net_io_q_req_chal(const char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth)
697 prs_debug(ps, depth, desc, "net_io_q_req_chal");
703 if(!prs_uint32("undoc_buffer", ps, depth, &q_c->undoc_buffer))
706 if(!smb_io_unistr2("", &q_c->uni_logon_srv, True, ps, depth)) /* logon server unicode string */
708 if(!smb_io_unistr2("", &q_c->uni_logon_clnt, True, ps, depth)) /* logon client unicode string */
711 if(!smb_io_chal("", &q_c->clnt_chal, ps, depth))
717 /*******************************************************************
718 Reads or writes a structure.
719 ********************************************************************/
721 BOOL net_io_r_req_chal(const char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth)
726 prs_debug(ps, depth, desc, "net_io_r_req_chal");
732 if(!smb_io_chal("", &r_c->srv_chal, ps, depth)) /* server challenge */
735 if(!prs_ntstatus("status", ps, depth, &r_c->status))
742 /*******************************************************************
743 Reads or writes a structure.
744 ********************************************************************/
746 BOOL net_io_q_auth(const char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth)
751 prs_debug(ps, depth, desc, "net_io_q_auth");
757 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
759 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
765 /*******************************************************************
766 Reads or writes a structure.
767 ********************************************************************/
769 BOOL net_io_r_auth(const char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth)
774 prs_debug(ps, depth, desc, "net_io_r_auth");
780 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
783 if(!prs_ntstatus("status", ps, depth, &r_a->status))
789 /*******************************************************************
790 Inits a NET_Q_AUTH_2 struct.
791 ********************************************************************/
793 void init_q_auth_2(NET_Q_AUTH_2 *q_a,
794 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
795 const DOM_CHAL *clnt_chal, uint32 clnt_flgs)
797 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
799 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
800 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
801 q_a->clnt_flgs.neg_flags = clnt_flgs;
803 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
806 /*******************************************************************
807 Reads or writes a structure.
808 ********************************************************************/
810 BOOL net_io_q_auth_2(const char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth)
815 prs_debug(ps, depth, desc, "net_io_q_auth_2");
821 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
823 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
825 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
831 /*******************************************************************
832 Reads or writes a structure.
833 ********************************************************************/
835 BOOL net_io_r_auth_2(const char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth)
840 prs_debug(ps, depth, desc, "net_io_r_auth_2");
846 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
848 if(!net_io_neg_flags("", &r_a->srv_flgs, ps, depth))
851 if(!prs_ntstatus("status", ps, depth, &r_a->status))
857 /*******************************************************************
858 Inits a NET_Q_AUTH_3 struct.
859 ********************************************************************/
861 void init_q_auth_3(NET_Q_AUTH_3 *q_a,
862 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
863 const DOM_CHAL *clnt_chal, uint32 clnt_flgs)
865 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
867 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
868 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
869 q_a->clnt_flgs.neg_flags = clnt_flgs;
871 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
874 /*******************************************************************
875 Reads or writes a structure.
876 ********************************************************************/
878 BOOL net_io_q_auth_3(const char *desc, NET_Q_AUTH_3 *q_a, prs_struct *ps, int depth)
883 prs_debug(ps, depth, desc, "net_io_q_auth_3");
889 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
891 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
893 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
899 /*******************************************************************
900 Reads or writes a structure.
901 ********************************************************************/
903 BOOL net_io_r_auth_3(const char *desc, NET_R_AUTH_3 *r_a, prs_struct *ps, int depth)
908 prs_debug(ps, depth, desc, "net_io_r_auth_3");
914 if(!smb_io_chal("srv_chal", &r_a->srv_chal, ps, depth)) /* server challenge */
916 if(!net_io_neg_flags("srv_flgs", &r_a->srv_flgs, ps, depth))
918 if (!prs_uint32("unknown", ps, depth, &r_a->unknown))
921 if(!prs_ntstatus("status", ps, depth, &r_a->status))
928 /*******************************************************************
929 Inits a NET_Q_SRV_PWSET.
930 ********************************************************************/
932 void init_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
933 const char *logon_srv, const char *sess_key, const char *acct_name,
934 uint16 sec_chan, const char *comp_name,
935 DOM_CRED *cred, uchar hashed_mach_pwd[16])
937 unsigned char nt_cypher[16];
939 DEBUG(5,("init_q_srv_pwset\n"));
941 /* Process the new password. */
942 cred_hash3( nt_cypher, hashed_mach_pwd, (const unsigned char *)sess_key, 1);
944 init_clnt_info(&q_s->clnt_id, logon_srv, acct_name, sec_chan, comp_name, cred);
946 memcpy(q_s->pwd, nt_cypher, sizeof(q_s->pwd));
949 /*******************************************************************
950 Reads or writes a structure.
951 ********************************************************************/
953 BOOL net_io_q_srv_pwset(const char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth)
958 prs_debug(ps, depth, desc, "net_io_q_srv_pwset");
964 if(!smb_io_clnt_info("", &q_s->clnt_id, ps, depth)) /* client identification/authentication info */
966 if(!prs_uint8s (False, "pwd", ps, depth, q_s->pwd, 16)) /* new password - undocumented */
972 /*******************************************************************
973 Reads or writes a structure.
974 ********************************************************************/
976 BOOL net_io_r_srv_pwset(const char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth)
981 prs_debug(ps, depth, desc, "net_io_r_srv_pwset");
987 if(!smb_io_cred("", &r_s->srv_cred, ps, depth)) /* server challenge */
990 if(!prs_ntstatus("status", ps, depth, &r_s->status))
996 /*************************************************************************
997 Init DOM_SID2 array from a string containing multiple sids
998 *************************************************************************/
1000 static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsids)
1006 DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
1014 /* Count the number of valid SIDs. */
1015 for (count = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
1017 if (string_to_sid(&tmpsid, s2))
1021 /* Now allocate space for them. */
1022 *ppsids = TALLOC_ZERO_ARRAY(ctx, DOM_SID2, count);
1023 if (*ppsids == NULL)
1028 for (number = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
1030 if (string_to_sid(&tmpsid, s2)) {
1031 /* count only valid sids */
1032 init_dom_sid2(&sids[number], &tmpsid);
1041 /*******************************************************************
1042 Inits a NET_ID_INFO_1 structure.
1043 ********************************************************************/
1045 void init_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
1046 uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
1047 const char *user_name, const char *wksta_name,
1048 const char *sess_key,
1049 unsigned char lm_cypher[16], unsigned char nt_cypher[16])
1051 unsigned char lm_owf[16];
1052 unsigned char nt_owf[16];
1054 DEBUG(5,("init_id_info1: %d\n", __LINE__));
1056 id->ptr_id_info1 = 1;
1058 id->param_ctrl = param_ctrl;
1059 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1062 if (lm_cypher && nt_cypher) {
1063 unsigned char key[16];
1064 #ifdef DEBUG_PASSWORD
1065 DEBUG(100,("lm cypher:"));
1066 dump_data(100, (char *)lm_cypher, 16);
1068 DEBUG(100,("nt cypher:"));
1069 dump_data(100, (char *)nt_cypher, 16);
1073 memcpy(key, sess_key, 8);
1075 memcpy(lm_owf, lm_cypher, 16);
1076 SamOEMhash(lm_owf, key, 16);
1077 memcpy(nt_owf, nt_cypher, 16);
1078 SamOEMhash(nt_owf, key, 16);
1080 #ifdef DEBUG_PASSWORD
1081 DEBUG(100,("encrypt of lm owf password:"));
1082 dump_data(100, (char *)lm_owf, 16);
1084 DEBUG(100,("encrypt of nt owf password:"));
1085 dump_data(100, (char *)nt_owf, 16);
1087 /* set up pointers to cypher blocks */
1092 init_owf_info(&id->lm_owf, lm_cypher);
1093 init_owf_info(&id->nt_owf, nt_cypher);
1095 init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
1096 init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
1097 init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
1098 init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
1099 init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
1100 init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
1103 /*******************************************************************
1104 Reads or writes an NET_ID_INFO_1 structure.
1105 ********************************************************************/
1107 static BOOL net_io_id_info1(const char *desc, NET_ID_INFO_1 *id, prs_struct *ps, int depth)
1112 prs_debug(ps, depth, desc, "net_io_id_info1");
1118 if(!prs_uint32("ptr_id_info1", ps, depth, &id->ptr_id_info1))
1121 if (id->ptr_id_info1 != 0) {
1122 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1125 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1127 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1130 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1132 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1135 if(!smb_io_owf_info("", &id->lm_owf, ps, depth))
1137 if(!smb_io_owf_info("", &id->nt_owf, ps, depth))
1140 if(!smb_io_unistr2("unistr2", &id->uni_domain_name,
1141 id->hdr_domain_name.buffer, ps, depth))
1143 if(!smb_io_unistr2("unistr2", &id->uni_user_name,
1144 id->hdr_user_name.buffer, ps, depth))
1146 if(!smb_io_unistr2("unistr2", &id->uni_wksta_name,
1147 id->hdr_wksta_name.buffer, ps, depth))
1154 /*******************************************************************
1155 Inits a NET_ID_INFO_2 structure.
1157 This is a network logon packet. The log_id parameters
1158 are what an NT server would generate for LUID once the
1159 user is logged on. I don't think we care about them.
1161 Note that this has no access to the NT and LM hashed passwords,
1162 so it forwards the challenge, and the NT and LM responses (24
1163 bytes each) over the secure channel to the Domain controller
1164 for it to say yea or nay. This is the preferred method of
1165 checking for a logon as it doesn't export the password
1166 hashes to anyone who has compromised the secure channel. JRA.
1167 ********************************************************************/
1169 void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
1171 uint32 log_id_low, uint32 log_id_high,
1172 const char *user_name, const char *wksta_name,
1173 const uchar lm_challenge[8],
1174 const uchar * lm_chal_resp, size_t lm_chal_resp_len,
1175 const uchar * nt_chal_resp, size_t nt_chal_resp_len)
1178 DEBUG(5,("init_id_info2: %d\n", __LINE__));
1180 id->ptr_id_info2 = 1;
1182 id->param_ctrl = param_ctrl;
1183 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1185 memcpy(id->lm_chal, lm_challenge, sizeof(id->lm_chal));
1186 init_str_hdr(&id->hdr_nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len, (nt_chal_resp != NULL) ? 1 : 0);
1187 init_str_hdr(&id->hdr_lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len, (lm_chal_resp != NULL) ? 1 : 0);
1189 init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
1190 init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
1191 init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
1192 init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
1193 init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
1194 init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
1196 init_string2(&id->nt_chal_resp, (const char *)nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len);
1197 init_string2(&id->lm_chal_resp, (const char *)lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len);
1201 /*******************************************************************
1202 Reads or writes an NET_ID_INFO_2 structure.
1203 ********************************************************************/
1205 static BOOL net_io_id_info2(const char *desc, NET_ID_INFO_2 *id, prs_struct *ps, int depth)
1210 prs_debug(ps, depth, desc, "net_io_id_info2");
1216 if(!prs_uint32("ptr_id_info2", ps, depth, &id->ptr_id_info2))
1219 if (id->ptr_id_info2 != 0) {
1220 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1223 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1225 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1228 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1230 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1233 if(!prs_uint8s (False, "lm_chal", ps, depth, id->lm_chal, 8)) /* lm 8 byte challenge */
1236 if(!smb_io_strhdr("hdr_nt_chal_resp", &id->hdr_nt_chal_resp, ps, depth))
1238 if(!smb_io_strhdr("hdr_lm_chal_resp", &id->hdr_lm_chal_resp, ps, depth))
1241 if(!smb_io_unistr2("uni_domain_name", &id->uni_domain_name,
1242 id->hdr_domain_name.buffer, ps, depth))
1244 if(!smb_io_unistr2("uni_user_name ", &id->uni_user_name,
1245 id->hdr_user_name.buffer, ps, depth))
1247 if(!smb_io_unistr2("uni_wksta_name ", &id->uni_wksta_name,
1248 id->hdr_wksta_name.buffer, ps, depth))
1250 if(!smb_io_string2("nt_chal_resp", &id->nt_chal_resp,
1251 id->hdr_nt_chal_resp.buffer, ps, depth))
1253 if(!smb_io_string2("lm_chal_resp", &id->lm_chal_resp,
1254 id->hdr_lm_chal_resp.buffer, ps, depth))
1262 /*******************************************************************
1263 Inits a DOM_SAM_INFO structure.
1264 ********************************************************************/
1266 void init_sam_info(DOM_SAM_INFO *sam,
1267 const char *logon_srv, const char *comp_name,
1268 DOM_CRED *clnt_cred,
1269 DOM_CRED *rtn_cred, uint16 logon_level,
1270 NET_ID_INFO_CTR *ctr)
1272 DEBUG(5,("init_sam_info: %d\n", __LINE__));
1274 init_clnt_info2(&sam->client, logon_srv, comp_name, clnt_cred);
1276 if (rtn_cred != NULL) {
1277 sam->ptr_rtn_cred = 1;
1278 memcpy(&sam->rtn_cred, rtn_cred, sizeof(sam->rtn_cred));
1280 sam->ptr_rtn_cred = 0;
1283 sam->logon_level = logon_level;
1287 /*******************************************************************
1288 Reads or writes a DOM_SAM_INFO structure.
1289 ********************************************************************/
1291 static BOOL net_io_id_info_ctr(const char *desc, NET_ID_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
1293 NET_ID_INFO_CTR *ctr = *pp_ctr;
1295 prs_debug(ps, depth, desc, "smb_io_sam_info");
1298 if (UNMARSHALLING(ps)) {
1299 ctr = *pp_ctr = PRS_ALLOC_MEM(ps, NET_ID_INFO_CTR, 1);
1307 /* don't 4-byte align here! */
1309 if(!prs_uint16("switch_value ", ps, depth, &ctr->switch_value))
1312 switch (ctr->switch_value) {
1314 if(!net_io_id_info1("", &ctr->auth.id1, ps, depth))
1318 if(!net_io_id_info2("", &ctr->auth.id2, ps, depth))
1323 DEBUG(4,("smb_io_sam_info: unknown switch_value!\n"));
1330 /*******************************************************************
1331 Reads or writes a DOM_SAM_INFO structure.
1332 ********************************************************************/
1334 static BOOL smb_io_sam_info(const char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int depth)
1339 prs_debug(ps, depth, desc, "smb_io_sam_info");
1345 if(!smb_io_clnt_info2("", &sam->client, ps, depth))
1348 if(!prs_uint32("ptr_rtn_cred ", ps, depth, &sam->ptr_rtn_cred))
1350 if(!smb_io_cred("", &sam->rtn_cred, ps, depth))
1353 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1356 if (sam->logon_level != 0) {
1357 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1364 /*************************************************************************
1365 Inits a NET_USER_INFO_3 structure.
1367 This is a network logon reply packet, and contains much information about
1368 the user. This information is passed as a (very long) paramater list
1369 to avoid having to link in the PASSDB code to every program that deals
1371 *************************************************************************/
1373 void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
1377 const char* user_name,
1378 const char* full_name,
1379 const char* home_dir,
1380 const char* dir_drive,
1381 const char* logon_script,
1382 const char* profile_path,
1384 time_t unix_logon_time,
1385 time_t unix_logoff_time,
1386 time_t unix_kickoff_time,
1387 time_t unix_pass_last_set_time,
1388 time_t unix_pass_can_change_time,
1389 time_t unix_pass_must_change_time,
1391 uint16 logon_count, uint16 bad_pw_count,
1392 uint32 num_groups, const DOM_GID *gids,
1393 uint32 user_flgs, uchar user_session_key[16],
1394 uchar lm_session_key[16],
1395 const char *logon_srv, const char *logon_dom,
1396 const DOM_SID *dom_sid, const char *other_sids)
1398 /* only cope with one "other" sid, right now. */
1399 /* need to count the number of space-delimited sids */
1401 int num_other_sids = 0;
1403 NTTIME logon_time, logoff_time, kickoff_time,
1404 pass_last_set_time, pass_can_change_time,
1405 pass_must_change_time;
1409 usr->ptr_user_info = 1; /* yes, we're bothering to put USER_INFO data here */
1411 /* Create NTTIME structs */
1412 unix_to_nt_time (&logon_time, unix_logon_time);
1413 unix_to_nt_time (&logoff_time, unix_logoff_time);
1414 unix_to_nt_time (&kickoff_time, unix_kickoff_time);
1415 unix_to_nt_time (&pass_last_set_time, unix_pass_last_set_time);
1416 unix_to_nt_time (&pass_can_change_time, unix_pass_can_change_time);
1417 unix_to_nt_time (&pass_must_change_time, unix_pass_must_change_time);
1419 usr->logon_time = logon_time;
1420 usr->logoff_time = logoff_time;
1421 usr->kickoff_time = kickoff_time;
1422 usr->pass_last_set_time = pass_last_set_time;
1423 usr->pass_can_change_time = pass_can_change_time;
1424 usr->pass_must_change_time = pass_must_change_time;
1426 usr->logon_count = logon_count;
1427 usr->bad_pw_count = bad_pw_count;
1429 usr->user_rid = user_rid;
1430 usr->group_rid = group_rid;
1431 usr->num_groups = num_groups;
1433 usr->buffer_groups = 1; /* indicates fill in groups, below, even if there are none */
1434 usr->user_flgs = user_flgs;
1436 if (user_session_key != NULL)
1437 memcpy(usr->user_sess_key, user_session_key, sizeof(usr->user_sess_key));
1439 memset((char *)usr->user_sess_key, '\0', sizeof(usr->user_sess_key));
1441 usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
1443 memset((char *)usr->lm_sess_key, '\0', sizeof(usr->lm_sess_key));
1444 memset(&usr->acct_flags, '\0', sizeof(usr->acct_flags));
1446 for (i=0; i<7; i++) {
1447 memset(&usr->unknown[i], '\0', sizeof(usr->unknown));
1450 if (lm_session_key != NULL) {
1451 memcpy(usr->lm_sess_key, lm_session_key, sizeof(usr->lm_sess_key));
1454 num_other_sids = init_dom_sid2s(ctx, other_sids, &usr->other_sids);
1456 usr->num_other_sids = num_other_sids;
1457 usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0;
1459 init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
1460 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
1461 init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
1462 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
1463 init_unistr2(&usr->uni_logon_script, logon_script, UNI_FLAGS_NONE);
1464 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
1465 init_unistr2(&usr->uni_profile_path, profile_path, UNI_FLAGS_NONE);
1466 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
1467 init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
1468 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
1469 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
1470 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
1472 usr->num_groups2 = num_groups;
1474 usr->gids = TALLOC_ZERO_ARRAY(ctx,DOM_GID,num_groups);
1475 if (usr->gids == NULL && num_groups>0)
1478 for (i = 0; i < num_groups; i++)
1479 usr->gids[i] = gids[i];
1481 init_unistr2(&usr->uni_logon_srv, logon_srv, UNI_FLAGS_NONE);
1482 init_uni_hdr(&usr->hdr_logon_srv, &usr->uni_logon_srv);
1483 init_unistr2(&usr->uni_logon_dom, logon_dom, UNI_FLAGS_NONE);
1484 init_uni_hdr(&usr->hdr_logon_dom, &usr->uni_logon_dom);
1486 init_dom_sid2(&usr->dom_sid, dom_sid);
1487 /* "other" sids are set up above */
1490 /*******************************************************************
1491 This code has been modified to cope with a NET_USER_INFO_2 - which is
1492 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1493 We use validation level to determine if we're marshalling a info 2 or
1494 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1495 Jacobsen at HP. JRA.
1496 ********************************************************************/
1498 BOOL net_io_user_info3(const char *desc, NET_USER_INFO_3 *usr, prs_struct *ps,
1499 int depth, uint16 validation_level, BOOL kerb_validation_level)
1506 prs_debug(ps, depth, desc, "net_io_user_info3");
1509 if (UNMARSHALLING(ps))
1515 if(!prs_uint32("ptr_user_info ", ps, depth, &usr->ptr_user_info))
1518 if (usr->ptr_user_info == 0)
1521 if(!smb_io_time("logon time", &usr->logon_time, ps, depth)) /* logon time */
1523 if(!smb_io_time("logoff time", &usr->logoff_time, ps, depth)) /* logoff time */
1525 if(!smb_io_time("kickoff time", &usr->kickoff_time, ps, depth)) /* kickoff time */
1527 if(!smb_io_time("last set time", &usr->pass_last_set_time, ps, depth)) /* password last set time */
1529 if(!smb_io_time("can change time", &usr->pass_can_change_time , ps, depth)) /* password can change time */
1531 if(!smb_io_time("must change time", &usr->pass_must_change_time, ps, depth)) /* password must change time */
1534 if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
1536 if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
1538 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
1540 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
1542 if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
1544 if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive unicode string header */
1547 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count)) /* logon count */
1549 if(!prs_uint16("bad_pw_count ", ps, depth, &usr->bad_pw_count)) /* bad password count */
1552 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User RID */
1554 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group RID */
1556 if(!prs_uint32("num_groups ", ps, depth, &usr->num_groups)) /* num groups */
1558 if(!prs_uint32("buffer_groups ", ps, depth, &usr->buffer_groups)) /* undocumented buffer pointer to groups. */
1560 if(!prs_uint32("user_flgs ", ps, depth, &usr->user_flgs)) /* user flags */
1563 if(!prs_uint8s(False, "user_sess_key", ps, depth, usr->user_sess_key, 16)) /* user session key */
1566 if(!smb_io_unihdr("hdr_logon_srv", &usr->hdr_logon_srv, ps, depth)) /* logon server unicode string header */
1568 if(!smb_io_unihdr("hdr_logon_dom", &usr->hdr_logon_dom, ps, depth)) /* logon domain unicode string header */
1571 if(!prs_uint32("buffer_dom_id ", ps, depth, &usr->buffer_dom_id)) /* undocumented logon domain id pointer */
1574 if(!prs_uint8s(False, "lm_sess_key", ps, depth, usr->lm_sess_key, 8)) /* lm session key */
1577 if(!prs_uint32("acct_flags ", ps, depth, &usr->acct_flags)) /* Account flags */
1580 for (i = 0; i < 7; i++)
1582 if (!prs_uint32("unkown", ps, depth, &usr->unknown[i])) /* unknown */
1586 if (validation_level == 3) {
1587 if(!prs_uint32("num_other_sids", ps, depth, &usr->num_other_sids)) /* 0 - num_sids */
1589 if(!prs_uint32("buffer_other_sids", ps, depth, &usr->buffer_other_sids)) /* NULL - undocumented pointer to SIDs. */
1592 if (UNMARSHALLING(ps)) {
1593 usr->num_other_sids = 0;
1594 usr->buffer_other_sids = 0;
1598 /* get kerb validation info (not really part of user_info_3) - Guenther */
1600 if (kerb_validation_level) {
1602 if(!prs_uint32("ptr_res_group_dom_sid", ps, depth, &usr->ptr_res_group_dom_sid))
1604 if(!prs_uint32("res_group_count", ps, depth, &usr->res_group_count))
1606 if(!prs_uint32("ptr_res_groups", ps, depth, &usr->ptr_res_groups))
1610 if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
1612 if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
1614 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
1616 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
1618 if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
1620 if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
1626 if (usr->num_groups > 0) {
1628 if(!prs_uint32("num_groups2 ", ps, depth, &usr->num_groups2)) /* num groups2 */
1631 if (usr->num_groups != usr->num_groups2) {
1632 DEBUG(3,("net_io_user_info3: num_groups mismatch! (%d != %d)\n",
1633 usr->num_groups, usr->num_groups2));
1638 if (UNMARSHALLING(ps)) {
1639 usr->gids = PRS_ALLOC_MEM(ps, DOM_GID, usr->num_groups);
1640 if (usr->gids == NULL)
1644 for (i = 0; i < usr->num_groups; i++) {
1645 if(!smb_io_gid("", &usr->gids[i], ps, depth)) /* group info */
1651 if(!smb_io_unistr2("uni_logon_srv", &usr->uni_logon_srv, usr->hdr_logon_srv.buffer, ps, depth)) /* logon server unicode string */
1653 if(!smb_io_unistr2("uni_logon_dom", &usr->uni_logon_dom, usr->hdr_logon_dom.buffer, ps, depth)) /* logon domain unicode string */
1656 if(!smb_io_dom_sid2("", &usr->dom_sid, ps, depth)) /* domain SID */
1659 if (usr->buffer_other_sids) {
1661 uint32 num_other_sids = usr->num_other_sids;
1663 if (!(usr->user_flgs & LOGON_EXTRA_SIDS)) {
1664 DEBUG(10,("net_io_user_info3: user_flgs attribute does not have LOGON_EXTRA_SIDS\n"));
1668 if (!prs_uint32("num_other_sids", ps, depth,
1672 if (num_other_sids != usr->num_other_sids)
1675 if (UNMARSHALLING(ps)) {
1676 usr->other_sids = PRS_ALLOC_MEM(ps, DOM_SID2, usr->num_other_sids);
1677 usr->other_sids_attrib =
1678 PRS_ALLOC_MEM(ps, uint32, usr->num_other_sids);
1680 if ((num_other_sids != 0) &&
1681 ((usr->other_sids == NULL) ||
1682 (usr->other_sids_attrib == NULL)))
1686 /* First the pointers to the SIDS and attributes */
1690 for (i=0; i<usr->num_other_sids; i++) {
1693 if (!prs_uint32("sid_ptr", ps, depth, &ptr))
1696 if (UNMARSHALLING(ps) && (ptr == 0))
1699 if (!prs_uint32("attribute", ps, depth,
1700 &usr->other_sids_attrib[i]))
1704 for (i = 0; i < usr->num_other_sids; i++) {
1705 if(!smb_io_dom_sid2("", &usr->other_sids[i], ps, depth)) /* other domain SIDs */
1715 /*******************************************************************
1716 Reads or writes a structure.
1717 ********************************************************************/
1719 BOOL net_io_q_sam_logon(const char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth)
1724 prs_debug(ps, depth, desc, "net_io_q_sam_logon");
1730 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth))
1733 if(!prs_align_uint16(ps))
1736 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1742 /*******************************************************************
1743 Reads or writes a structure.
1744 ********************************************************************/
1746 BOOL net_io_r_sam_logon(const char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth)
1751 prs_debug(ps, depth, desc, "net_io_r_sam_logon");
1754 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1756 if (&r_l->buffer_creds) {
1757 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1761 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1766 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1767 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
1770 if (r_l->switch_value != 0) {
1771 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value, False))
1776 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1779 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1788 /*******************************************************************
1789 Reads or writes a structure.
1790 ********************************************************************/
1792 BOOL net_io_q_sam_logoff(const char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth)
1797 prs_debug(ps, depth, desc, "net_io_q_sam_logoff");
1803 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
1809 /*******************************************************************
1810 Reads or writes a structure.
1811 ********************************************************************/
1813 BOOL net_io_r_sam_logoff(const char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth)
1818 prs_debug(ps, depth, desc, "net_io_r_sam_logoff");
1824 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1826 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1829 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1835 /*******************************************************************
1836 makes a NET_Q_SAM_SYNC structure.
1837 ********************************************************************/
1838 BOOL init_net_q_sam_sync(NET_Q_SAM_SYNC * q_s, const char *srv_name,
1839 const char *cli_name, DOM_CRED *cli_creds,
1840 DOM_CRED *ret_creds, uint32 database_id,
1843 DEBUG(5, ("init_q_sam_sync\n"));
1845 init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
1846 init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
1849 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
1852 memcpy(&q_s->ret_creds, ret_creds, sizeof(q_s->ret_creds));
1854 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
1856 q_s->database_id = database_id;
1857 q_s->restart_state = 0;
1858 q_s->sync_context = next_rid;
1859 q_s->max_size = 0xffff;
1864 /*******************************************************************
1865 reads or writes a structure.
1866 ********************************************************************/
1867 BOOL net_io_q_sam_sync(const char *desc, NET_Q_SAM_SYNC * q_s, prs_struct *ps,
1870 prs_debug(ps, depth, desc, "net_io_q_sam_sync");
1873 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
1875 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
1878 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
1880 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
1883 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
1885 if (!prs_uint32("restart_state", ps, depth, &q_s->restart_state))
1887 if (!prs_uint32("sync_context ", ps, depth, &q_s->sync_context))
1890 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
1896 /*******************************************************************
1897 reads or writes a structure.
1898 ********************************************************************/
1899 static BOOL net_io_sam_delta_hdr(const char *desc, SAM_DELTA_HDR * delta,
1900 prs_struct *ps, int depth)
1902 prs_debug(ps, depth, desc, "net_io_sam_delta_hdr");
1905 if (!prs_uint16("type", ps, depth, &delta->type))
1907 if (!prs_uint16("type2", ps, depth, &delta->type2))
1909 if (!prs_uint32("target_rid", ps, depth, &delta->target_rid))
1912 if (!prs_uint32("type3", ps, depth, &delta->type3))
1915 /* Not sure why we need this but it seems to be necessary to get
1916 sam deltas working. */
1918 if (delta->type != 0x16) {
1919 if (!prs_uint32("ptr_delta", ps, depth, &delta->ptr_delta))
1926 /*******************************************************************
1927 reads or writes a structure.
1928 ********************************************************************/
1929 static BOOL net_io_sam_delta_mod_count(const char *desc, SAM_DELTA_MOD_COUNT *info,
1930 prs_struct *ps, int depth)
1932 prs_debug(ps, depth, desc, "net_io_sam_delta_stamp");
1935 if (!prs_uint32("seqnum", ps, depth, &info->seqnum))
1937 if (!prs_uint32("dom_mod_count_ptr", ps, depth,
1938 &info->dom_mod_count_ptr))
1941 if (info->dom_mod_count_ptr) {
1942 if (!prs_uint64("dom_mod_count", ps, depth,
1943 &info->dom_mod_count))
1950 /*******************************************************************
1951 reads or writes a structure.
1952 ********************************************************************/
1953 static BOOL net_io_sam_domain_info(const char *desc, SAM_DOMAIN_INFO * info,
1954 prs_struct *ps, int depth)
1956 prs_debug(ps, depth, desc, "net_io_sam_domain_info");
1959 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
1961 if (!smb_io_unihdr("hdr_oem_info", &info->hdr_oem_info, ps, depth))
1964 if (!prs_uint64("force_logoff", ps, depth, &info->force_logoff))
1966 if (!prs_uint16("min_pwd_len", ps, depth, &info->min_pwd_len))
1968 if (!prs_uint16("pwd_history_len", ps, depth, &info->pwd_history_len))
1970 if (!prs_uint64("max_pwd_age", ps, depth, &info->max_pwd_age))
1972 if (!prs_uint64("min_pwd_age", ps, depth, &info->min_pwd_age))
1974 if (!prs_uint64("dom_mod_count", ps, depth, &info->dom_mod_count))
1976 if (!smb_io_time("creation_time", &info->creation_time, ps, depth))
1978 if (!prs_uint32("security_information", ps, depth, &info->security_information))
1980 if (!smb_io_bufhdr4("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1982 if (!smb_io_lockout_string_hdr("hdr_account_lockout_string", &info->hdr_account_lockout, ps, depth))
1984 if (!smb_io_unihdr("hdr_unknown2", &info->hdr_unknown2, ps, depth))
1986 if (!smb_io_unihdr("hdr_unknown3", &info->hdr_unknown3, ps, depth))
1988 if (!smb_io_unihdr("hdr_unknown4", &info->hdr_unknown4, ps, depth))
1990 if (!prs_uint32("logon_chgpass", ps, depth, &info->logon_chgpass))
1992 if (!prs_uint32("unknown6", ps, depth, &info->unknown6))
1994 if (!prs_uint32("unknown7", ps, depth, &info->unknown7))
1996 if (!prs_uint32("unknown8", ps, depth, &info->unknown8))
1999 if (!smb_io_unistr2("uni_dom_name", &info->uni_dom_name,
2000 info->hdr_dom_name.buffer, ps, depth))
2002 if (!smb_io_unistr2("buf_oem_info", &info->buf_oem_info,
2003 info->hdr_oem_info.buffer, ps, depth))
2006 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2009 if (!smb_io_account_lockout_str("account_lockout", &info->account_lockout,
2010 info->hdr_account_lockout.buffer, ps, depth))
2013 if (!smb_io_unistr2("buf_unknown2", &info->buf_unknown2,
2014 info->hdr_unknown2.buffer, ps, depth))
2016 if (!smb_io_unistr2("buf_unknown3", &info->buf_unknown3,
2017 info->hdr_unknown3.buffer, ps, depth))
2019 if (!smb_io_unistr2("buf_unknown4", &info->buf_unknown4,
2020 info->hdr_unknown4.buffer, ps, depth))
2026 /*******************************************************************
2027 reads or writes a structure.
2028 ********************************************************************/
2029 static BOOL net_io_sam_group_info(const char *desc, SAM_GROUP_INFO * info,
2030 prs_struct *ps, int depth)
2032 prs_debug(ps, depth, desc, "net_io_sam_group_info");
2035 if (!smb_io_unihdr("hdr_grp_name", &info->hdr_grp_name, ps, depth))
2037 if (!smb_io_gid("gid", &info->gid, ps, depth))
2039 if (!smb_io_unihdr("hdr_grp_desc", &info->hdr_grp_desc, ps, depth))
2041 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2044 if (ps->data_offset + 48 > ps->buffer_size)
2046 ps->data_offset += 48;
2048 if (!smb_io_unistr2("uni_grp_name", &info->uni_grp_name,
2049 info->hdr_grp_name.buffer, ps, depth))
2051 if (!smb_io_unistr2("uni_grp_desc", &info->uni_grp_desc,
2052 info->hdr_grp_desc.buffer, ps, depth))
2054 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2060 /*******************************************************************
2061 reads or writes a structure.
2062 ********************************************************************/
2063 static BOOL net_io_sam_passwd_info(const char *desc, SAM_PWD * pwd,
2064 prs_struct *ps, int depth)
2066 prs_debug(ps, depth, desc, "net_io_sam_passwd_info");
2069 if (!prs_uint32("unk_0 ", ps, depth, &pwd->unk_0))
2072 if (!smb_io_unihdr("hdr_lm_pwd", &pwd->hdr_lm_pwd, ps, depth))
2074 if (!prs_uint8s(False, "buf_lm_pwd", ps, depth, pwd->buf_lm_pwd, 16))
2077 if (!smb_io_unihdr("hdr_nt_pwd", &pwd->hdr_nt_pwd, ps, depth))
2079 if (!prs_uint8s(False, "buf_nt_pwd", ps, depth, pwd->buf_nt_pwd, 16))
2082 if (!smb_io_unihdr("", &pwd->hdr_empty_lm, ps, depth))
2084 if (!smb_io_unihdr("", &pwd->hdr_empty_nt, ps, depth))
2090 /*******************************************************************
2091 makes a SAM_ACCOUNT_INFO structure.
2092 ********************************************************************/
2093 BOOL make_sam_account_info(SAM_ACCOUNT_INFO * info,
2094 const UNISTR2 *user_name,
2095 const UNISTR2 *full_name,
2096 uint32 user_rid, uint32 group_rid,
2097 const UNISTR2 *home_dir,
2098 const UNISTR2 *dir_drive,
2099 const UNISTR2 *log_scr,
2100 const UNISTR2 *desc,
2102 const UNISTR2 *prof_path,
2103 const UNISTR2 *wkstas,
2104 const UNISTR2 *unk_str, const UNISTR2 *mung_dial)
2106 int len_user_name = user_name != NULL ? user_name->uni_str_len : 0;
2107 int len_full_name = full_name != NULL ? full_name->uni_str_len : 0;
2108 int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0;
2109 int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0;
2110 int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0;
2111 int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0;
2112 int len_description = desc != NULL ? desc->uni_str_len : 0;
2113 int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0;
2114 int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0;
2115 int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0;
2117 DEBUG(5, ("make_sam_account_info\n"));
2119 make_uni_hdr(&info->hdr_acct_name, len_user_name);
2120 make_uni_hdr(&info->hdr_full_name, len_full_name);
2121 make_uni_hdr(&info->hdr_home_dir, len_home_dir);
2122 make_uni_hdr(&info->hdr_dir_drive, len_dir_drive);
2123 make_uni_hdr(&info->hdr_logon_script, len_logon_script);
2124 make_uni_hdr(&info->hdr_profile, len_profile_path);
2125 make_uni_hdr(&info->hdr_acct_desc, len_description);
2126 make_uni_hdr(&info->hdr_workstations, len_workstations);
2127 make_uni_hdr(&info->hdr_comment, len_unknown_str);
2128 make_uni_hdr(&info->hdr_parameters, len_munged_dial);
2131 make_bufhdr2(&info->hdr_sec_desc, 0, 0, 0);
2133 info->user_rid = user_rid;
2134 info->group_rid = group_rid;
2136 init_nt_time(&info->logon_time);
2137 init_nt_time(&info->logoff_time);
2138 init_nt_time(&info->pwd_last_set_time);
2139 init_nt_time(&info->acct_expiry_time);
2141 info->logon_divs = 0xA8;
2142 info->ptr_logon_hrs = 0; /* Don't care right now */
2144 info->bad_pwd_count = 0;
2145 info->logon_count = 0;
2146 info->acb_info = acb_info;
2147 info->nt_pwd_present = 0;
2148 info->lm_pwd_present = 0;
2149 info->pwd_expired = 0;
2153 info->unknown1 = 0x4EC;
2156 copy_unistr2(&info->uni_acct_name, user_name);
2157 copy_unistr2(&info->uni_full_name, full_name);
2158 copy_unistr2(&info->uni_home_dir, home_dir);
2159 copy_unistr2(&info->uni_dir_drive, dir_drive);
2160 copy_unistr2(&info->uni_logon_script, log_scr);
2161 copy_unistr2(&info->uni_profile, prof_path);
2162 copy_unistr2(&info->uni_acct_desc, desc);
2163 copy_unistr2(&info->uni_workstations, wkstas);
2164 copy_unistr2(&info->uni_comment, unk_str);
2165 copy_unistr2(&info->uni_parameters, mung_dial);
2170 /*******************************************************************
2171 reads or writes a structure.
2172 ********************************************************************/
2173 static BOOL net_io_sam_account_info(const char *desc, SAM_ACCOUNT_INFO *info,
2174 prs_struct *ps, int depth)
2176 BUFHDR2 hdr_priv_data;
2179 prs_debug(ps, depth, desc, "net_io_sam_account_info");
2182 if (!smb_io_unihdr("hdr_acct_name", &info->hdr_acct_name, ps, depth))
2184 if (!smb_io_unihdr("hdr_full_name", &info->hdr_full_name, ps, depth))
2187 if (!prs_uint32("user_rid ", ps, depth, &info->user_rid))
2189 if (!prs_uint32("group_rid", ps, depth, &info->group_rid))
2192 if (!smb_io_unihdr("hdr_home_dir ", &info->hdr_home_dir, ps, depth))
2194 if (!smb_io_unihdr("hdr_dir_drive", &info->hdr_dir_drive, ps, depth))
2196 if (!smb_io_unihdr("hdr_logon_script", &info->hdr_logon_script, ps,
2200 if (!smb_io_unihdr("hdr_acct_desc", &info->hdr_acct_desc, ps, depth))
2202 if (!smb_io_unihdr("hdr_workstations", &info->hdr_workstations, ps,
2206 if (!smb_io_time("logon_time", &info->logon_time, ps, depth))
2208 if (!smb_io_time("logoff_time", &info->logoff_time, ps, depth))
2211 if (!prs_uint32("logon_divs ", ps, depth, &info->logon_divs))
2213 if (!prs_uint32("ptr_logon_hrs", ps, depth, &info->ptr_logon_hrs))
2216 if (!prs_uint16("bad_pwd_count", ps, depth, &info->bad_pwd_count))
2218 if (!prs_uint16("logon_count", ps, depth, &info->logon_count))
2220 if (!smb_io_time("pwd_last_set_time", &info->pwd_last_set_time, ps,
2223 if (!smb_io_time("acct_expiry_time", &info->acct_expiry_time, ps,
2227 if (!prs_uint32("acb_info", ps, depth, &info->acb_info))
2229 if (!prs_uint8s(False, "nt_pwd", ps, depth, info->nt_pwd, 16))
2231 if (!prs_uint8s(False, "lm_pwd", ps, depth, info->lm_pwd, 16))
2233 if (!prs_uint8("lm_pwd_present", ps, depth, &info->lm_pwd_present))
2235 if (!prs_uint8("nt_pwd_present", ps, depth, &info->nt_pwd_present))
2237 if (!prs_uint8("pwd_expired", ps, depth, &info->pwd_expired))
2240 if (!smb_io_unihdr("hdr_comment", &info->hdr_comment, ps, depth))
2242 if (!smb_io_unihdr("hdr_parameters", &info->hdr_parameters, ps,
2245 if (!prs_uint16("country", ps, depth, &info->country))
2247 if (!prs_uint16("codepage", ps, depth, &info->codepage))
2250 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data, ps, depth))
2252 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2254 if (!smb_io_unihdr("hdr_profile", &info->hdr_profile, ps, depth))
2257 for (i = 0; i < 3; i++)
2259 if (!smb_io_unihdr("hdr_reserved", &info->hdr_reserved[i],
2264 for (i = 0; i < 4; i++)
2266 if (!prs_uint32("dw_reserved", ps, depth,
2267 &info->dw_reserved[i]))
2271 if (!smb_io_unistr2("uni_acct_name", &info->uni_acct_name,
2272 info->hdr_acct_name.buffer, ps, depth))
2275 if (!smb_io_unistr2("uni_full_name", &info->uni_full_name,
2276 info->hdr_full_name.buffer, ps, depth))
2279 if (!smb_io_unistr2("uni_home_dir ", &info->uni_home_dir,
2280 info->hdr_home_dir.buffer, ps, depth))
2283 if (!smb_io_unistr2("uni_dir_drive", &info->uni_dir_drive,
2284 info->hdr_dir_drive.buffer, ps, depth))
2287 if (!smb_io_unistr2("uni_logon_script", &info->uni_logon_script,
2288 info->hdr_logon_script.buffer, ps, depth))
2291 if (!smb_io_unistr2("uni_acct_desc", &info->uni_acct_desc,
2292 info->hdr_acct_desc.buffer, ps, depth))
2295 if (!smb_io_unistr2("uni_workstations", &info->uni_workstations,
2296 info->hdr_workstations.buffer, ps, depth))
2300 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2302 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2305 if (!smb_io_rpc_blob("buf_logon_hrs", &info->buf_logon_hrs, ps, depth))
2308 if (!smb_io_unistr2("uni_comment", &info->uni_comment,
2309 info->hdr_comment.buffer, ps, depth))
2312 if (!smb_io_unistr2("uni_parameters", &info->uni_parameters,
2313 info->hdr_parameters.buffer, ps, depth))
2316 if (hdr_priv_data.buffer != 0)
2320 if (!prs_uint32("pwd_len", ps, depth, &len))
2322 old_offset = ps->data_offset;
2328 if (!prs_hash1(ps, ps->data_offset, len))
2331 if (!net_io_sam_passwd_info("pass", &info->pass,
2338 if (!prs_hash1(ps, old_offset, len))
2342 if (old_offset + len > ps->buffer_size)
2344 ps->data_offset = old_offset + len;
2346 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2349 if (!smb_io_unistr2("uni_profile", &info->uni_profile,
2350 info->hdr_profile.buffer, ps, depth))
2358 /*******************************************************************
2359 reads or writes a structure.
2360 ********************************************************************/
2361 static BOOL net_io_sam_group_mem_info(const char *desc, SAM_GROUP_MEM_INFO * info,
2362 prs_struct *ps, int depth)
2367 prs_debug(ps, depth, desc, "net_io_sam_group_mem_info");
2371 if (!prs_uint32("ptr_rids ", ps, depth, &info->ptr_rids))
2373 if (!prs_uint32("ptr_attribs", ps, depth, &info->ptr_attribs))
2375 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2378 if (ps->data_offset + 16 > ps->buffer_size)
2380 ps->data_offset += 16;
2382 if (info->ptr_rids != 0)
2384 if (!prs_uint32("num_members2", ps, depth,
2385 &info->num_members2))
2388 if (info->num_members2 != info->num_members)
2394 info->rids = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_members2);
2396 if (info->rids == NULL) {
2397 DEBUG(0, ("out of memory allocating %d rids\n",
2398 info->num_members2));
2402 for (i = 0; i < info->num_members2; i++)
2404 slprintf(tmp, sizeof(tmp) - 1, "rids[%02d]", i);
2405 if (!prs_uint32(tmp, ps, depth, &info->rids[i]))
2410 if (info->ptr_attribs != 0)
2412 if (!prs_uint32("num_members3", ps, depth,
2413 &info->num_members3))
2415 if (info->num_members3 != info->num_members)
2421 info->attribs = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_members3);
2423 if (info->attribs == NULL) {
2424 DEBUG(0, ("out of memory allocating %d attribs\n",
2425 info->num_members3));
2429 for (i = 0; i < info->num_members3; i++)
2431 slprintf(tmp, sizeof(tmp) - 1, "attribs[%02d]", i);
2432 if (!prs_uint32(tmp, ps, depth, &info->attribs[i]))
2440 /*******************************************************************
2441 reads or writes a structure.
2442 ********************************************************************/
2443 static BOOL net_io_sam_alias_info(const char *desc, SAM_ALIAS_INFO * info,
2444 prs_struct *ps, int depth)
2446 prs_debug(ps, depth, desc, "net_io_sam_alias_info");
2449 if (!smb_io_unihdr("hdr_als_name", &info->hdr_als_name, ps, depth))
2451 if (!prs_uint32("als_rid", ps, depth, &info->als_rid))
2453 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2455 if (!smb_io_unihdr("hdr_als_desc", &info->hdr_als_desc, ps, depth))
2458 if (ps->data_offset + 40 > ps->buffer_size)
2460 ps->data_offset += 40;
2462 if (!smb_io_unistr2("uni_als_name", &info->uni_als_name,
2463 info->hdr_als_name.buffer, ps, depth))
2465 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2468 if (!smb_io_unistr2("uni_als_desc", &info->uni_als_desc,
2469 info->hdr_als_desc.buffer, ps, depth))
2475 /*******************************************************************
2476 reads or writes a structure.
2477 ********************************************************************/
2478 static BOOL net_io_sam_alias_mem_info(const char *desc, SAM_ALIAS_MEM_INFO * info,
2479 prs_struct *ps, int depth)
2484 prs_debug(ps, depth, desc, "net_io_sam_alias_mem_info");
2488 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2490 if (!prs_uint32("ptr_members", ps, depth, &info->ptr_members))
2493 if (ps->data_offset + 16 > ps->buffer_size)
2495 ps->data_offset += 16;
2497 if (info->ptr_members != 0)
2499 if (!prs_uint32("num_sids", ps, depth, &info->num_sids))
2501 if (info->num_sids != info->num_members)
2507 info->ptr_sids = TALLOC_ARRAY(ps->mem_ctx, uint32, info->num_sids);
2509 if (info->ptr_sids == NULL) {
2510 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2515 for (i = 0; i < info->num_sids; i++)
2517 slprintf(tmp, sizeof(tmp) - 1, "ptr_sids[%02d]", i);
2518 if (!prs_uint32(tmp, ps, depth, &info->ptr_sids[i]))
2522 info->sids = TALLOC_ARRAY(ps->mem_ctx, DOM_SID2, info->num_sids);
2524 if (info->sids == NULL) {
2525 DEBUG(0, ("error allocating %d sids\n",
2530 for (i = 0; i < info->num_sids; i++)
2532 if (info->ptr_sids[i] != 0)
2534 slprintf(tmp, sizeof(tmp) - 1, "sids[%02d]",
2536 if (!smb_io_dom_sid2(tmp, &info->sids[i],
2546 /*******************************************************************
2547 reads or writes a structure.
2548 ********************************************************************/
2549 static BOOL net_io_sam_policy_info(const char *desc, SAM_DELTA_POLICY *info,
2550 prs_struct *ps, int depth)
2553 prs_debug(ps, depth, desc, "net_io_sam_policy_info");
2559 if (!prs_uint32("max_log_size", ps, depth, &info->max_log_size))
2561 if (!prs_uint64("audit_retention_period", ps, depth,
2562 &info->audit_retention_period))
2564 if (!prs_uint32("auditing_mode", ps, depth, &info->auditing_mode))
2566 if (!prs_uint32("num_events", ps, depth, &info->num_events))
2568 if (!prs_uint32("ptr_events", ps, depth, &info->ptr_events))
2571 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
2574 if (!prs_uint32("sid_ptr", ps, depth, &info->sid_ptr))
2577 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2579 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2580 &info->non_paged_pool_limit))
2582 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2584 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2586 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2588 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2590 if (!smb_io_time("modify_time", &info->modify_time, ps, depth))
2592 if (!smb_io_time("create_time", &info->create_time, ps, depth))
2594 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2597 for (i=0; i<4; i++) {
2599 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2603 for (i=0; i<4; i++) {
2605 if (!prs_uint32("reserved", ps, depth, &reserved))
2609 if (!prs_uint32("num_event_audit_options", ps, depth,
2610 &info->num_event_audit_options))
2613 for (i=0; i<info->num_event_audit_options; i++)
2614 if (!prs_uint32("event_audit_option", ps, depth,
2615 &info->event_audit_option))
2618 if (!smb_io_unistr2("domain_name", &info->domain_name, True, ps, depth))
2621 if(!smb_io_dom_sid2("domain_sid", &info->domain_sid, ps, depth))
2624 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2633 /* This function is pretty broken - see bug #334 */
2635 /*******************************************************************
2636 reads or writes a structure.
2637 ********************************************************************/
2638 static BOOL net_io_sam_trustdoms_info(const char *desc, SAM_DELTA_TRUSTDOMS *info,
2639 prs_struct *ps, int depth)
2643 prs_debug(ps, depth, desc, "net_io_sam_trustdoms_info");
2649 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2652 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2655 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2658 if(!smb_io_unihdr("hdr_domain", &info->hdr_domain, ps, depth))
2661 if(!prs_uint32("unknown0", ps, depth, &info->unknown0))
2663 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2665 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2668 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2670 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2673 for (i=0; i<12; i++)
2674 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2677 if (!smb_io_unistr2("domain", &info->domain, True, ps, depth))
2687 /* This function doesn't work - see bug #334 */
2689 /*******************************************************************
2690 reads or writes a structure.
2691 ********************************************************************/
2692 static BOOL net_io_sam_secret_info(const char *desc, SAM_DELTA_SECRET *info,
2693 prs_struct *ps, int depth)
2697 prs_debug(ps, depth, desc, "net_io_sam_secret_info");
2703 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2706 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2709 if (!smb_io_unistr2("secret", &info->secret, True, ps, depth))
2715 if(!prs_uint32("count1", ps, depth, &info->count1))
2717 if(!prs_uint32("count2", ps, depth, &info->count2))
2719 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2723 if(!smb_io_time("time1", &info->time1, ps, depth)) /* logon time */
2725 if(!prs_uint32("count3", ps, depth, &info->count3))
2727 if(!prs_uint32("count4", ps, depth, &info->count4))
2729 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2731 if(!smb_io_time("time2", &info->time2, ps, depth)) /* logon time */
2733 if(!prs_uint32("unknow1", ps, depth, &info->unknow1))
2737 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2739 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2742 if(!prs_uint32("unknow2", ps, depth, &info->unknow2))
2745 if(!prs_uint32("chal_len", ps, depth, &info->chal_len))
2747 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2749 if(!prs_uint32("chal_len2", ps, depth, &info->chal_len2))
2752 if(!prs_uint8s (False, "chal", ps, depth, info->chal, info->chal_len2))
2755 if(!prs_uint32("key_len", ps, depth, &info->key_len))
2757 if(!prs_uint32("reserved2", ps, depth, &info->reserved2))
2759 if(!prs_uint32("key_len2", ps, depth, &info->key_len2))
2762 if(!prs_uint8s (False, "key", ps, depth, info->key, info->key_len2))
2766 if(!prs_uint32("buf_size3", ps, depth, &info->buf_size3))
2769 if(!sec_io_desc("sec_desc2", &info->sec_desc2, ps, depth))
2778 /*******************************************************************
2779 reads or writes a structure.
2780 ********************************************************************/
2781 static BOOL net_io_sam_privs_info(const char *desc, SAM_DELTA_PRIVS *info,
2782 prs_struct *ps, int depth)
2786 prs_debug(ps, depth, desc, "net_io_sam_privs_info");
2792 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2795 if(!prs_uint32("priv_count", ps, depth, &info->priv_count))
2797 if(!prs_uint32("priv_control", ps, depth, &info->priv_control))
2800 if(!prs_uint32("priv_attr_ptr", ps, depth, &info->priv_attr_ptr))
2802 if(!prs_uint32("priv_name_ptr", ps, depth, &info->priv_name_ptr))
2805 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2807 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2808 &info->non_paged_pool_limit))
2810 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2812 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2814 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2816 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2818 if (!prs_uint32("system_flags", ps, depth, &info->system_flags))
2820 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2823 for (i=0; i<4; i++) {
2825 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2829 for (i=0; i<4; i++) {
2831 if (!prs_uint32("reserved", ps, depth, &reserved))
2835 if(!prs_uint32("attribute_count", ps, depth, &info->attribute_count))
2838 info->attributes = TALLOC_ARRAY(ps->mem_ctx, uint32, info->attribute_count);
2840 for (i=0; i<info->attribute_count; i++)
2841 if(!prs_uint32("attributes", ps, depth, &info->attributes[i]))
2844 if(!prs_uint32("privlist_count", ps, depth, &info->privlist_count))
2847 info->hdr_privslist = TALLOC_ARRAY(ps->mem_ctx, UNIHDR, info->privlist_count);
2848 info->uni_privslist = TALLOC_ARRAY(ps->mem_ctx, UNISTR2, info->privlist_count);
2850 for (i=0; i<info->privlist_count; i++)
2851 if(!smb_io_unihdr("hdr_privslist", &info->hdr_privslist[i], ps, depth))
2854 for (i=0; i<info->privlist_count; i++)
2855 if (!smb_io_unistr2("uni_privslist", &info->uni_privslist[i], True, ps, depth))
2858 if (!smb_io_rpc_blob("buf_sec_desc", &info->buf_sec_desc, ps, depth))
2864 /*******************************************************************
2865 reads or writes a structure.
2866 ********************************************************************/
2867 static BOOL net_io_sam_delta_ctr(const char *desc,
2868 SAM_DELTA_CTR * delta, uint16 type,
2869 prs_struct *ps, int depth)
2871 prs_debug(ps, depth, desc, "net_io_sam_delta_ctr");
2875 /* Seen in sam deltas */
2876 case SAM_DELTA_MODIFIED_COUNT:
2877 if (!net_io_sam_delta_mod_count("", &delta->mod_count, ps, depth))
2881 case SAM_DELTA_DOMAIN_INFO:
2882 if (!net_io_sam_domain_info("", &delta->domain_info, ps, depth))
2886 case SAM_DELTA_GROUP_INFO:
2887 if (!net_io_sam_group_info("", &delta->group_info, ps, depth))
2891 case SAM_DELTA_ACCOUNT_INFO:
2892 if (!net_io_sam_account_info("", &delta->account_info, ps, depth))
2896 case SAM_DELTA_GROUP_MEM:
2897 if (!net_io_sam_group_mem_info("", &delta->grp_mem_info, ps, depth))
2901 case SAM_DELTA_ALIAS_INFO:
2902 if (!net_io_sam_alias_info("", &delta->alias_info, ps, depth))
2906 case SAM_DELTA_POLICY_INFO:
2907 if (!net_io_sam_policy_info("", &delta->policy_info, ps, depth))
2911 case SAM_DELTA_ALIAS_MEM:
2912 if (!net_io_sam_alias_mem_info("", &delta->als_mem_info, ps, depth))
2916 case SAM_DELTA_PRIVS_INFO:
2917 if (!net_io_sam_privs_info("", &delta->privs_info, ps, depth))
2921 /* These guys are implemented but broken */
2923 case SAM_DELTA_TRUST_DOMS:
2924 case SAM_DELTA_SECRET_INFO:
2927 /* These guys are not implemented yet */
2929 case SAM_DELTA_RENAME_GROUP:
2930 case SAM_DELTA_RENAME_USER:
2931 case SAM_DELTA_RENAME_ALIAS:
2932 case SAM_DELTA_DELETE_GROUP:
2933 case SAM_DELTA_DELETE_USER:
2935 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type));
2942 /*******************************************************************
2943 reads or writes a structure.
2944 ********************************************************************/
2945 BOOL net_io_r_sam_sync(const char *desc,
2946 NET_R_SAM_SYNC * r_s, prs_struct *ps, int depth)
2950 prs_debug(ps, depth, desc, "net_io_r_sam_sync");
2953 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2955 if (!prs_uint32("sync_context", ps, depth, &r_s->sync_context))
2958 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2960 if (r_s->ptr_deltas != 0)
2962 if (!prs_uint32("num_deltas ", ps, depth, &r_s->num_deltas))
2964 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->ptr_deltas2))
2966 if (r_s->ptr_deltas2 != 0)
2968 if (!prs_uint32("num_deltas2", ps, depth,
2972 if (r_s->num_deltas2 != r_s->num_deltas)
2978 if (r_s->num_deltas2 > 0) {
2979 r_s->hdr_deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_HDR, r_s->num_deltas2);
2980 if (r_s->hdr_deltas == NULL) {
2981 DEBUG(0, ("error tallocating memory "
2982 "for %d delta headers\n",
2988 for (i = 0; i < r_s->num_deltas2; i++)
2990 if (!net_io_sam_delta_hdr("",
2991 &r_s->hdr_deltas[i],
2996 if (r_s->num_deltas2 > 0) {
2997 r_s->deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_CTR, r_s->num_deltas2);
2998 if (r_s->deltas == NULL) {
2999 DEBUG(0, ("error tallocating memory "
3006 for (i = 0; i < r_s->num_deltas2; i++)
3008 if (!net_io_sam_delta_ctr(
3009 "", &r_s->deltas[i],
3010 r_s->hdr_deltas[i].type3,
3012 DEBUG(0, ("hmm, failed on i=%d\n", i));
3020 if (!prs_ntstatus("status", ps, depth, &(r_s->status)))
3026 /*******************************************************************
3027 makes a NET_Q_SAM_DELTAS structure.
3028 ********************************************************************/
3029 BOOL init_net_q_sam_deltas(NET_Q_SAM_DELTAS *q_s, const char *srv_name,
3030 const char *cli_name, DOM_CRED *cli_creds,
3031 uint32 database_id, UINT64_S dom_mod_count)
3033 DEBUG(5, ("init_net_q_sam_deltas\n"));
3035 init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
3036 init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
3038 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
3039 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
3041 q_s->database_id = database_id;
3042 q_s->dom_mod_count.low = dom_mod_count.low;
3043 q_s->dom_mod_count.high = dom_mod_count.high;
3044 q_s->max_size = 0xffff;
3049 /*******************************************************************
3050 reads or writes a structure.
3051 ********************************************************************/
3052 BOOL net_io_q_sam_deltas(const char *desc, NET_Q_SAM_DELTAS *q_s, prs_struct *ps,
3055 prs_debug(ps, depth, desc, "net_io_q_sam_deltas");
3058 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
3060 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
3063 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
3065 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
3068 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
3070 if (!prs_uint64("dom_mod_count", ps, depth, &q_s->dom_mod_count))
3072 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
3078 /*******************************************************************
3079 reads or writes a structure.
3080 ********************************************************************/
3081 BOOL net_io_r_sam_deltas(const char *desc,
3082 NET_R_SAM_DELTAS *r_s, prs_struct *ps, int depth)
3086 prs_debug(ps, depth, desc, "net_io_r_sam_deltas");
3089 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
3091 if (!prs_uint64("dom_mod_count", ps, depth, &r_s->dom_mod_count))
3094 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
3096 if (!prs_uint32("num_deltas", ps, depth, &r_s->num_deltas))
3098 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->num_deltas2))
3101 if (r_s->num_deltas2 != 0)
3103 if (!prs_uint32("num_deltas2 ", ps, depth, &r_s->num_deltas2))
3106 if (r_s->ptr_deltas != 0)
3108 if (r_s->num_deltas > 0) {
3109 r_s->hdr_deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_HDR, r_s->num_deltas);
3110 if (r_s->hdr_deltas == NULL) {
3111 DEBUG(0, ("error tallocating memory "
3112 "for %d delta headers\n",
3118 for (i = 0; i < r_s->num_deltas; i++)
3120 net_io_sam_delta_hdr("", &r_s->hdr_deltas[i],
3124 if (r_s->num_deltas > 0) {
3125 r_s->deltas = TALLOC_ARRAY(ps->mem_ctx, SAM_DELTA_CTR, r_s->num_deltas);
3126 if (r_s->deltas == NULL) {
3127 DEBUG(0, ("error tallocating memory "
3134 for (i = 0; i < r_s->num_deltas; i++)
3136 if (!net_io_sam_delta_ctr(
3139 r_s->hdr_deltas[i].type2,
3148 if (!prs_ntstatus("status", ps, depth, &r_s->status))