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.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 /*******************************************************************
26 Reads or writes a structure.
27 ********************************************************************/
29 static BOOL net_io_neg_flags(char *desc, NEG_FLAGS *neg, prs_struct *ps, int depth)
34 prs_debug(ps, depth, desc, "net_io_neg_flags");
40 if(!prs_uint32("neg_flags", ps, depth, &neg->neg_flags))
46 /*******************************************************************
47 Inits a NETLOGON_INFO_3 structure.
48 ********************************************************************/
50 static void init_netinfo_3(NETLOGON_INFO_3 *info, uint32 flags, uint32 logon_attempts)
53 info->logon_attempts = logon_attempts;
54 info->reserved_1 = 0x0;
55 info->reserved_2 = 0x0;
56 info->reserved_3 = 0x0;
57 info->reserved_4 = 0x0;
58 info->reserved_5 = 0x0;
61 /*******************************************************************
62 Reads or writes a NETLOGON_INFO_3 structure.
63 ********************************************************************/
65 static BOOL net_io_netinfo_3(char *desc, NETLOGON_INFO_3 *info, prs_struct *ps, int depth)
70 prs_debug(ps, depth, desc, "net_io_netinfo_3");
76 if(!prs_uint32("flags ", ps, depth, &info->flags))
78 if(!prs_uint32("logon_attempts", ps, depth, &info->logon_attempts))
80 if(!prs_uint32("reserved_1 ", ps, depth, &info->reserved_1))
82 if(!prs_uint32("reserved_2 ", ps, depth, &info->reserved_2))
84 if(!prs_uint32("reserved_3 ", ps, depth, &info->reserved_3))
86 if(!prs_uint32("reserved_4 ", ps, depth, &info->reserved_4))
88 if(!prs_uint32("reserved_5 ", ps, depth, &info->reserved_5))
95 /*******************************************************************
96 Inits a NETLOGON_INFO_1 structure.
97 ********************************************************************/
99 static void init_netinfo_1(NETLOGON_INFO_1 *info, uint32 flags, uint32 pdc_status)
102 info->pdc_status = pdc_status;
105 /*******************************************************************
106 Reads or writes a NETLOGON_INFO_1 structure.
107 ********************************************************************/
109 static BOOL net_io_netinfo_1(char *desc, NETLOGON_INFO_1 *info, prs_struct *ps, int depth)
114 prs_debug(ps, depth, desc, "net_io_netinfo_1");
120 if(!prs_uint32("flags ", ps, depth, &info->flags))
122 if(!prs_uint32("pdc_status", ps, depth, &info->pdc_status))
128 /*******************************************************************
129 Inits a NETLOGON_INFO_2 structure.
130 ********************************************************************/
132 static void init_netinfo_2(NETLOGON_INFO_2 *info, uint32 flags, uint32 pdc_status,
133 uint32 tc_status, char *trusted_dc_name)
135 int len_dc_name = strlen(trusted_dc_name);
137 info->pdc_status = pdc_status;
138 info->ptr_trusted_dc_name = 1;
139 info->tc_status = tc_status;
141 if (trusted_dc_name != NULL)
142 init_unistr2(&info->uni_trusted_dc_name, trusted_dc_name, len_dc_name+1);
144 init_unistr2(&info->uni_trusted_dc_name, "", 1);
147 /*******************************************************************
148 Reads or writes a NETLOGON_INFO_2 structure.
149 ********************************************************************/
151 static BOOL net_io_netinfo_2(char *desc, NETLOGON_INFO_2 *info, prs_struct *ps, int depth)
156 prs_debug(ps, depth, desc, "net_io_netinfo_2");
162 if(!prs_uint32("flags ", ps, depth, &info->flags))
164 if(!prs_uint32("pdc_status ", ps, depth, &info->pdc_status))
166 if(!prs_uint32("ptr_trusted_dc_name", ps, depth, &info->ptr_trusted_dc_name))
168 if(!prs_uint32("tc_status ", ps, depth, &info->tc_status))
171 if (info->ptr_trusted_dc_name != 0) {
172 if(!smb_io_unistr2("unistr2", &info->uni_trusted_dc_name, info->ptr_trusted_dc_name, ps, depth))
182 /*******************************************************************
183 Reads or writes an NET_Q_LOGON_CTRL2 structure.
184 ********************************************************************/
186 BOOL net_io_q_logon_ctrl2(char *desc, NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth)
191 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl2");
197 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
200 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
206 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
208 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
210 if(!prs_uint32("switch_value ", ps, depth, &q_l->switch_value))
216 /*******************************************************************
217 Inits an NET_Q_LOGON_CTRL2 structure.
218 ********************************************************************/
220 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l, char *srv_name,
223 DEBUG(5,("init_q_logon_ctrl2\n"));
225 q_l->function_code = 0x01;
226 q_l->query_level = query_level;
227 q_l->switch_value = 0x01;
229 init_unistr2(&q_l->uni_server_name, srv_name, strlen(srv_name) + 1);
232 /*******************************************************************
233 Inits an NET_R_LOGON_CTRL2 structure.
234 ********************************************************************/
236 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l, uint32 query_level,
237 uint32 flags, uint32 pdc_status,
238 uint32 logon_attempts, uint32 tc_status,
239 char *trusted_domain_name)
241 DEBUG(5,("init_r_logon_ctrl2\n"));
243 r_l->switch_value = query_level; /* should only be 0x1 */
245 switch (query_level) {
247 r_l->ptr = 1; /* undocumented pointer */
248 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
249 r_l->status = NT_STATUS_OK;
252 r_l->ptr = 1; /* undocumented pointer */
253 init_netinfo_2(&r_l->logon.info2, flags, pdc_status,
254 tc_status, trusted_domain_name);
255 r_l->status = NT_STATUS_OK;
258 r_l->ptr = 1; /* undocumented pointer */
259 init_netinfo_3(&r_l->logon.info3, flags, logon_attempts);
260 r_l->status = NT_STATUS_OK;
263 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
265 r_l->ptr = 0; /* undocumented pointer */
267 /* take a guess at an error code... */
268 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
273 /*******************************************************************
274 Reads or writes an NET_R_LOGON_CTRL2 structure.
275 ********************************************************************/
277 BOOL net_io_r_logon_ctrl2(char *desc, NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth)
282 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl2");
285 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
287 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
291 switch (r_l->switch_value) {
293 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
297 if(!net_io_netinfo_2("", &r_l->logon.info2, ps, depth))
301 if(!net_io_netinfo_3("", &r_l->logon.info3, ps, depth))
305 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
311 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
317 /*******************************************************************
318 Reads or writes an NET_Q_LOGON_CTRL structure.
319 ********************************************************************/
321 BOOL net_io_q_logon_ctrl(char *desc, NET_Q_LOGON_CTRL *q_l, prs_struct *ps,
324 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl");
330 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
333 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
339 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
341 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
347 /*******************************************************************
348 Inits an NET_Q_LOGON_CTRL structure.
349 ********************************************************************/
351 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL *q_l, char *srv_name,
354 DEBUG(5,("init_q_logon_ctrl\n"));
356 q_l->function_code = 0x01; /* ??? */
357 q_l->query_level = query_level;
359 init_unistr2(&q_l->uni_server_name, srv_name, strlen(srv_name) + 1);
362 /*******************************************************************
363 Inits an NET_R_LOGON_CTRL structure.
364 ********************************************************************/
366 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL *r_l, uint32 query_level,
367 uint32 flags, uint32 pdc_status)
369 DEBUG(5,("init_r_logon_ctrl\n"));
371 r_l->switch_value = query_level; /* should only be 0x1 */
373 switch (query_level) {
375 r_l->ptr = 1; /* undocumented pointer */
376 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
377 r_l->status = NT_STATUS_OK;
380 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
382 r_l->ptr = 0; /* undocumented pointer */
384 /* take a guess at an error code... */
385 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
390 /*******************************************************************
391 Reads or writes an NET_R_LOGON_CTRL structure.
392 ********************************************************************/
394 BOOL net_io_r_logon_ctrl(char *desc, NET_R_LOGON_CTRL *r_l, prs_struct *ps,
397 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl");
400 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
402 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
406 switch (r_l->switch_value) {
408 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
412 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
418 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
424 /*******************************************************************
425 Inits an NET_R_TRUST_DOM_LIST structure.
426 ********************************************************************/
428 void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
429 uint32 num_doms, char *dom_name)
433 DEBUG(5,("init_r_trust_dom\n"));
435 for (i = 0; i < MAX_TRUST_DOMS; i++) {
436 r_t->uni_trust_dom_name[i].uni_str_len = 0;
437 r_t->uni_trust_dom_name[i].uni_max_len = 0;
439 if (num_doms > MAX_TRUST_DOMS)
440 num_doms = MAX_TRUST_DOMS;
442 for (i = 0; i < num_doms; i++) {
444 fstrcpy(domain_name, dom_name);
445 strupper(domain_name);
446 init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, strlen(domain_name)+1);
447 /* the use of UNISTR2 here is non-standard. */
448 r_t->uni_trust_dom_name[i].undoc = 0x1;
451 r_t->status = NT_STATUS_OK;
454 /*******************************************************************
455 Reads or writes an NET_R_TRUST_DOM_LIST structure.
456 ********************************************************************/
458 BOOL net_io_r_trust_dom(char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth)
465 prs_debug(ps, depth, desc, "net_io_r_trust_dom");
468 /* temporary code to give a valid response */
470 if(!prs_uint32("status", ps, depth, &value))
474 if(!prs_uint32("status", ps, depth, &value))
477 if(!prs_uint32("status", ps, depth, &value))
481 if(!prs_uint32("status", ps, depth, &value))
485 if(!prs_uint32("status", ps, depth, &value))
488 /* old non working code */
492 for (i = 0; i < MAX_TRUST_DOMS; i++) {
493 if (r_t->uni_trust_dom_name[i].uni_str_len == 0)
495 if(!smb_io_unistr2("", &r_t->uni_trust_dom_name[i], True, ps, depth))
499 if(!prs_ntstatus("status", ps, depth, &r_t->status))
506 /*******************************************************************
507 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
508 ********************************************************************/
510 BOOL net_io_q_trust_dom(char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth)
515 prs_debug(ps, depth, desc, "net_io_q_trust_dom");
518 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
520 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
526 /*******************************************************************
527 Inits an NET_Q_REQ_CHAL structure.
528 ********************************************************************/
530 void init_q_req_chal(NET_Q_REQ_CHAL *q_c,
531 const char *logon_srv, const char *logon_clnt,
534 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
536 q_c->undoc_buffer = 1; /* don't know what this buffer is */
538 init_unistr2(&q_c->uni_logon_srv, logon_srv , strlen(logon_srv )+1);
539 init_unistr2(&q_c->uni_logon_clnt, logon_clnt, strlen(logon_clnt)+1);
541 memcpy(q_c->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
543 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
546 /*******************************************************************
547 Reads or writes an NET_Q_REQ_CHAL structure.
548 ********************************************************************/
550 BOOL net_io_q_req_chal(char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth)
557 prs_debug(ps, depth, desc, "net_io_q_req_chal");
563 if(!prs_uint32("undoc_buffer", ps, depth, &q_c->undoc_buffer))
566 if(!smb_io_unistr2("", &q_c->uni_logon_srv, True, ps, depth)) /* logon server unicode string */
568 if(!smb_io_unistr2("", &q_c->uni_logon_clnt, True, ps, depth)) /* logon client unicode string */
571 old_align = ps->align;
573 /* client challenge is _not_ aligned after the unicode strings */
574 if(!smb_io_chal("", &q_c->clnt_chal, ps, depth)) {
575 /* client challenge */
576 ps->align = old_align;
579 ps->align = old_align;
584 /*******************************************************************
585 Reads or writes a structure.
586 ********************************************************************/
588 BOOL net_io_r_req_chal(char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth)
593 prs_debug(ps, depth, desc, "net_io_r_req_chal");
599 if(!smb_io_chal("", &r_c->srv_chal, ps, depth)) /* server challenge */
602 if(!prs_ntstatus("status", ps, depth, &r_c->status))
609 /*******************************************************************
610 Reads or writes a structure.
611 ********************************************************************/
613 BOOL net_io_q_auth(char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth)
619 prs_debug(ps, depth, desc, "net_io_q_auth");
625 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
627 /* client challenge is _not_ aligned */
628 old_align = ps->align;
630 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth)) {
631 /* client-calculated credentials */
632 ps->align = old_align;
635 ps->align = old_align;
640 /*******************************************************************
641 Reads or writes a structure.
642 ********************************************************************/
644 BOOL net_io_r_auth(char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth)
649 prs_debug(ps, depth, desc, "net_io_r_auth");
655 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
658 if(!prs_ntstatus("status", ps, depth, &r_a->status))
664 /*******************************************************************
665 Inits a NET_Q_AUTH_2 struct.
666 ********************************************************************/
668 void init_q_auth_2(NET_Q_AUTH_2 *q_a,
669 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
670 DOM_CHAL *clnt_chal, uint32 clnt_flgs)
672 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
674 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
675 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
676 q_a->clnt_flgs.neg_flags = clnt_flgs;
678 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
681 /*******************************************************************
682 Reads or writes a structure.
683 ********************************************************************/
685 BOOL net_io_q_auth_2(char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth)
691 prs_debug(ps, depth, desc, "net_io_q_auth_2");
697 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
699 /* client challenge is _not_ aligned */
700 old_align = ps->align;
702 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth)) {
703 /* client-calculated credentials */
704 ps->align = old_align;
707 ps->align = old_align;
708 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
714 /*******************************************************************
715 Reads or writes a structure.
716 ********************************************************************/
718 BOOL net_io_r_auth_2(char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth)
723 prs_debug(ps, depth, desc, "net_io_r_auth_2");
729 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
731 if(!net_io_neg_flags("", &r_a->srv_flgs, ps, depth))
734 if(!prs_ntstatus("status", ps, depth, &r_a->status))
741 /*******************************************************************
742 Inits a NET_Q_SRV_PWSET.
743 ********************************************************************/
745 void init_q_srv_pwset(NET_Q_SRV_PWSET *q_s, char *logon_srv, char *sess_key, char *acct_name,
746 uint16 sec_chan, char *comp_name, DOM_CRED *cred, uchar hashed_mach_pwd[16])
748 unsigned char nt_cypher[16];
750 DEBUG(5,("init_q_srv_pwset\n"));
752 /* Process the new password. */
753 cred_hash3( nt_cypher, hashed_mach_pwd, sess_key, 1);
755 init_clnt_info(&q_s->clnt_id, logon_srv, acct_name, sec_chan, comp_name, cred);
757 memcpy(q_s->pwd, nt_cypher, sizeof(q_s->pwd));
760 /*******************************************************************
761 Reads or writes a structure.
762 ********************************************************************/
764 BOOL net_io_q_srv_pwset(char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth)
769 prs_debug(ps, depth, desc, "net_io_q_srv_pwset");
775 if(!smb_io_clnt_info("", &q_s->clnt_id, ps, depth)) /* client identification/authentication info */
777 if(!prs_uint8s (False, "pwd", ps, depth, q_s->pwd, 16)) /* new password - undocumented */
783 /*******************************************************************
784 Reads or writes a structure.
785 ********************************************************************/
787 BOOL net_io_r_srv_pwset(char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth)
792 prs_debug(ps, depth, desc, "net_io_r_srv_pwset");
798 if(!smb_io_cred("", &r_s->srv_cred, ps, depth)) /* server challenge */
801 if(!prs_ntstatus("status", ps, depth, &r_s->status))
807 /*************************************************************************
808 Init DOM_SID2 array from a string containing multiple sids
809 *************************************************************************/
811 static int init_dom_sid2s(TALLOC_CTX *ctx, char *sids_str, DOM_SID2 **ppsids)
817 DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
825 /* Count the number of SIDs. */
826 for (count = 0, ptr = sids_str;
827 next_token(&ptr, s2, NULL, sizeof(s2)); count++)
830 /* Now allocate space for them. */
831 *ppsids = (DOM_SID2 *)talloc_zero(ctx, count * sizeof(DOM_SID2));
837 for (number = 0, ptr = sids_str;
838 next_token(&ptr, s2, NULL, sizeof(s2)); number++) {
840 string_to_sid(&tmpsid, s2);
841 init_dom_sid2(&sids[number], &tmpsid);
848 /*******************************************************************
849 Inits a NET_ID_INFO_1 structure.
850 ********************************************************************/
852 void init_id_info1(NET_ID_INFO_1 *id, char *domain_name,
853 uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
854 char *user_name, char *wksta_name,
856 unsigned char lm_cypher[16], unsigned char nt_cypher[16])
858 int len_domain_name = strlen(domain_name);
859 int len_user_name = strlen(user_name );
860 int len_wksta_name = strlen(wksta_name );
862 unsigned char lm_owf[16];
863 unsigned char nt_owf[16];
865 DEBUG(5,("init_id_info1: %d\n", __LINE__));
867 id->ptr_id_info1 = 1;
869 init_uni_hdr(&id->hdr_domain_name, len_domain_name);
871 id->param_ctrl = param_ctrl;
872 init_logon_id(&id->logon_id, log_id_low, log_id_high);
874 init_uni_hdr(&id->hdr_user_name, len_user_name);
875 init_uni_hdr(&id->hdr_wksta_name, len_wksta_name);
877 if (lm_cypher && nt_cypher) {
878 unsigned char key[16];
879 #ifdef DEBUG_PASSWORD
880 DEBUG(100,("lm cypher:"));
881 dump_data(100, (char *)lm_cypher, 16);
883 DEBUG(100,("nt cypher:"));
884 dump_data(100, (char *)nt_cypher, 16);
888 memcpy(key, sess_key, 8);
890 memcpy(lm_owf, lm_cypher, 16);
891 SamOEMhash(lm_owf, key, 16);
892 memcpy(nt_owf, nt_cypher, 16);
893 SamOEMhash(nt_owf, key, 16);
895 #ifdef DEBUG_PASSWORD
896 DEBUG(100,("encrypt of lm owf password:"));
897 dump_data(100, (char *)lm_owf, 16);
899 DEBUG(100,("encrypt of nt owf password:"));
900 dump_data(100, (char *)nt_owf, 16);
902 /* set up pointers to cypher blocks */
907 init_owf_info(&id->lm_owf, lm_cypher);
908 init_owf_info(&id->nt_owf, nt_cypher);
910 init_unistr2(&id->uni_domain_name, domain_name, len_domain_name);
911 init_unistr2(&id->uni_user_name, user_name, len_user_name);
912 init_unistr2(&id->uni_wksta_name, wksta_name, len_wksta_name);
915 /*******************************************************************
916 Reads or writes an NET_ID_INFO_1 structure.
917 ********************************************************************/
919 static BOOL net_io_id_info1(char *desc, NET_ID_INFO_1 *id, prs_struct *ps, int depth)
924 prs_debug(ps, depth, desc, "net_io_id_info1");
930 if(!prs_uint32("ptr_id_info1", ps, depth, &id->ptr_id_info1))
933 if (id->ptr_id_info1 != 0) {
934 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
937 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
939 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
942 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
944 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
947 if(!smb_io_owf_info("", &id->lm_owf, ps, depth))
949 if(!smb_io_owf_info("", &id->nt_owf, ps, depth))
952 if(!smb_io_unistr2("unistr2", &id->uni_domain_name,
953 id->hdr_domain_name.buffer, ps, depth))
955 if(!smb_io_unistr2("unistr2", &id->uni_user_name,
956 id->hdr_user_name.buffer, ps, depth))
958 if(!smb_io_unistr2("unistr2", &id->uni_wksta_name,
959 id->hdr_wksta_name.buffer, ps, depth))
966 /*******************************************************************
967 Inits a NET_ID_INFO_2 structure.
969 This is a network logon packet. The log_id parameters
970 are what an NT server would generate for LUID once the
971 user is logged on. I don't think we care about them.
973 Note that this has no access to the NT and LM hashed passwords,
974 so it forwards the challenge, and the NT and LM responses (24
975 bytes each) over the secure channel to the Domain controller
976 for it to say yea or nay. This is the preferred method of
977 checking for a logon as it doesn't export the password
978 hashes to anyone who has compromised the secure channel. JRA.
979 ********************************************************************/
981 void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
983 uint32 log_id_low, uint32 log_id_high,
984 const char *user_name, const char *wksta_name,
985 const uchar lm_challenge[8],
986 const uchar * lm_chal_resp, int lm_chal_resp_len,
987 const uchar * nt_chal_resp, int nt_chal_resp_len)
989 int len_domain_name = strlen(domain_name);
990 int len_user_name = strlen(user_name );
991 int len_wksta_name = strlen(wksta_name );
992 unsigned char lm_owf[24];
993 unsigned char nt_owf[128];
995 DEBUG(5,("init_id_info2: %d\n", __LINE__));
997 id->ptr_id_info2 = 1;
999 init_uni_hdr(&id->hdr_domain_name, len_domain_name);
1001 id->param_ctrl = param_ctrl;
1002 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1004 init_uni_hdr(&id->hdr_user_name, len_user_name);
1005 init_uni_hdr(&id->hdr_wksta_name, len_wksta_name);
1008 /* oops. can only send what-ever-it-is direct */
1009 memcpy(nt_owf, nt_chal_resp, MIN(sizeof(nt_owf), nt_chal_resp_len));
1010 nt_chal_resp = nt_owf;
1013 /* oops. can only send what-ever-it-is direct */
1014 memcpy(lm_owf, lm_chal_resp, MIN(sizeof(lm_owf), lm_chal_resp_len));
1015 lm_chal_resp = lm_owf;
1018 memcpy(id->lm_chal, lm_challenge, sizeof(id->lm_chal));
1019 init_str_hdr(&id->hdr_nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len, (nt_chal_resp != NULL) ? 1 : 0);
1020 init_str_hdr(&id->hdr_lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len, (lm_chal_resp != NULL) ? 1 : 0);
1022 init_unistr2(&id->uni_domain_name, domain_name, len_domain_name);
1023 init_unistr2(&id->uni_user_name, user_name, len_user_name);
1024 init_unistr2(&id->uni_wksta_name, wksta_name, len_wksta_name);
1026 init_string2(&id->nt_chal_resp, (const char *)nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len);
1027 init_string2(&id->lm_chal_resp, (const char *)lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len);
1031 /*******************************************************************
1032 Reads or writes an NET_ID_INFO_2 structure.
1033 ********************************************************************/
1035 static BOOL net_io_id_info2(char *desc, NET_ID_INFO_2 *id, prs_struct *ps, int depth)
1040 prs_debug(ps, depth, desc, "net_io_id_info2");
1046 if(!prs_uint32("ptr_id_info2", ps, depth, &id->ptr_id_info2))
1049 if (id->ptr_id_info2 != 0) {
1050 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1053 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1055 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1058 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1060 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1063 if(!prs_uint8s (False, "lm_chal", ps, depth, id->lm_chal, 8)) /* lm 8 byte challenge */
1066 if(!smb_io_strhdr("hdr_nt_chal_resp", &id->hdr_nt_chal_resp, ps, depth))
1068 if(!smb_io_strhdr("hdr_lm_chal_resp", &id->hdr_lm_chal_resp, ps, depth))
1071 if(!smb_io_unistr2("uni_domain_name", &id->uni_domain_name,
1072 id->hdr_domain_name.buffer, ps, depth))
1074 if(!smb_io_unistr2("uni_user_name ", &id->uni_user_name,
1075 id->hdr_user_name.buffer, ps, depth))
1077 if(!smb_io_unistr2("uni_wksta_name ", &id->uni_wksta_name,
1078 id->hdr_wksta_name.buffer, ps, depth))
1080 if(!smb_io_string2("nt_chal_resp", &id->nt_chal_resp,
1081 id->hdr_nt_chal_resp.buffer, ps, depth))
1083 if(!smb_io_string2("lm_chal_resp", &id->lm_chal_resp,
1084 id->hdr_lm_chal_resp.buffer, ps, depth))
1092 /*******************************************************************
1093 Inits a DOM_SAM_INFO structure.
1094 ********************************************************************/
1096 void init_sam_info(DOM_SAM_INFO *sam,
1097 char *logon_srv, char *comp_name, DOM_CRED *clnt_cred,
1098 DOM_CRED *rtn_cred, uint16 logon_level,
1099 NET_ID_INFO_CTR *ctr)
1101 DEBUG(5,("init_sam_info: %d\n", __LINE__));
1103 init_clnt_info2(&sam->client, logon_srv, comp_name, clnt_cred);
1105 if (rtn_cred != NULL) {
1106 sam->ptr_rtn_cred = 1;
1107 memcpy(&sam->rtn_cred, rtn_cred, sizeof(sam->rtn_cred));
1109 sam->ptr_rtn_cred = 0;
1112 sam->logon_level = logon_level;
1116 /*******************************************************************
1117 Reads or writes a DOM_SAM_INFO structure.
1118 ********************************************************************/
1120 static BOOL net_io_id_info_ctr(char *desc, NET_ID_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
1122 NET_ID_INFO_CTR *ctr = *pp_ctr;
1124 prs_debug(ps, depth, desc, "smb_io_sam_info");
1127 if (UNMARSHALLING(ps)) {
1128 ctr = *pp_ctr = (NET_ID_INFO_CTR *)prs_alloc_mem(ps, sizeof(NET_ID_INFO_CTR));
1136 /* don't 4-byte align here! */
1138 if(!prs_uint16("switch_value ", ps, depth, &ctr->switch_value))
1141 switch (ctr->switch_value) {
1143 if(!net_io_id_info1("", &ctr->auth.id1, ps, depth))
1147 if(!net_io_id_info2("", &ctr->auth.id2, ps, depth))
1152 DEBUG(4,("smb_io_sam_info: unknown switch_value!\n"));
1159 /*******************************************************************
1160 Reads or writes a DOM_SAM_INFO structure.
1161 ********************************************************************/
1163 static BOOL smb_io_sam_info(char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int depth)
1168 prs_debug(ps, depth, desc, "smb_io_sam_info");
1174 if(!smb_io_clnt_info2("", &sam->client, ps, depth))
1177 if(!prs_uint32("ptr_rtn_cred ", ps, depth, &sam->ptr_rtn_cred))
1179 if(!smb_io_cred("", &sam->rtn_cred, ps, depth))
1182 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1185 if (sam->logon_level != 0) {
1186 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1193 /*************************************************************************
1194 Inits a NET_USER_INFO_3 structure.
1196 This is a network logon reply packet, and contains much information about
1197 the user. This information is passed as a (very long) paramater list
1198 to avoid having to link in the PASSDB code to every program that deals
1200 *************************************************************************/
1202 void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
1206 const char* user_name,
1207 const char* full_name,
1208 const char* home_dir,
1209 const char* dir_drive,
1210 const char* logon_script,
1211 const char* profile_path,
1213 time_t unix_logon_time,
1214 time_t unix_logoff_time,
1215 time_t unix_kickoff_time,
1216 time_t unix_pass_last_set_time,
1217 time_t unix_pass_can_change_time,
1218 time_t unix_pass_must_change_time,
1220 uint16 logon_count, uint16 bad_pw_count,
1221 uint32 num_groups, const DOM_GID *gids,
1222 uint32 user_flgs, uchar *sess_key,
1223 const char *logon_srv, const char *logon_dom,
1224 const DOM_SID *dom_sid, char *other_sids)
1226 /* only cope with one "other" sid, right now. */
1227 /* need to count the number of space-delimited sids */
1229 int num_other_sids = 0;
1231 NTTIME logon_time, logoff_time, kickoff_time,
1232 pass_last_set_time, pass_can_change_time,
1233 pass_must_change_time;
1235 int len_user_name, len_full_name, len_home_dir,
1236 len_dir_drive, len_logon_script, len_profile_path;
1238 int len_logon_srv = strlen(logon_srv);
1239 int len_logon_dom = strlen(logon_dom);
1241 len_user_name = strlen(user_name );
1242 len_full_name = strlen(full_name );
1243 len_home_dir = strlen(home_dir );
1244 len_dir_drive = strlen(dir_drive );
1245 len_logon_script = strlen(logon_script);
1246 len_profile_path = strlen(profile_path);
1251 usr->ptr_user_info = 1; /* yes, we're bothering to put USER_INFO data here */
1254 /* Create NTTIME structs */
1255 unix_to_nt_time (&logon_time, unix_logon_time);
1256 unix_to_nt_time (&logoff_time, unix_logoff_time);
1257 unix_to_nt_time (&kickoff_time, unix_kickoff_time);
1258 unix_to_nt_time (&pass_last_set_time, unix_pass_last_set_time);
1259 unix_to_nt_time (&pass_can_change_time, unix_pass_can_change_time);
1260 unix_to_nt_time (&pass_must_change_time, unix_pass_must_change_time);
1262 usr->logon_time = logon_time;
1263 usr->logoff_time = logoff_time;
1264 usr->kickoff_time = kickoff_time;
1265 usr->pass_last_set_time = pass_last_set_time;
1266 usr->pass_can_change_time = pass_can_change_time;
1267 usr->pass_must_change_time = pass_must_change_time;
1269 init_uni_hdr(&usr->hdr_user_name, len_user_name);
1270 init_uni_hdr(&usr->hdr_full_name, len_full_name);
1271 init_uni_hdr(&usr->hdr_logon_script, len_logon_script);
1272 init_uni_hdr(&usr->hdr_profile_path, len_profile_path);
1273 init_uni_hdr(&usr->hdr_home_dir, len_home_dir);
1274 init_uni_hdr(&usr->hdr_dir_drive, len_dir_drive);
1276 usr->logon_count = logon_count;
1277 usr->bad_pw_count = bad_pw_count;
1279 usr->user_rid = user_rid;
1280 usr->group_rid = group_rid;
1281 usr->num_groups = num_groups;
1283 usr->buffer_groups = 1; /* indicates fill in groups, below, even if there are none */
1284 usr->user_flgs = user_flgs;
1286 if (sess_key != NULL)
1287 memcpy(usr->user_sess_key, sess_key, sizeof(usr->user_sess_key));
1289 memset((char *)usr->user_sess_key, '\0', sizeof(usr->user_sess_key));
1291 init_uni_hdr(&usr->hdr_logon_srv, len_logon_srv);
1292 init_uni_hdr(&usr->hdr_logon_dom, len_logon_dom);
1294 usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
1296 memset((char *)usr->padding, '\0', sizeof(usr->padding));
1298 num_other_sids = init_dom_sid2s(ctx, other_sids, &usr->other_sids);
1300 usr->num_other_sids = num_other_sids;
1301 usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0;
1303 init_unistr2(&usr->uni_user_name, user_name, len_user_name);
1304 init_unistr2(&usr->uni_full_name, full_name, len_full_name);
1305 init_unistr2(&usr->uni_logon_script, logon_script, len_logon_script);
1306 init_unistr2(&usr->uni_profile_path, profile_path, len_profile_path);
1307 init_unistr2(&usr->uni_home_dir, home_dir, len_home_dir);
1308 init_unistr2(&usr->uni_dir_drive, dir_drive, len_dir_drive);
1310 usr->num_groups2 = num_groups;
1312 usr->gids = (DOM_GID *)talloc_zero(ctx,sizeof(DOM_GID) * (num_groups));
1313 if (usr->gids == NULL && num_groups>0)
1316 for (i = 0; i < num_groups; i++)
1317 usr->gids[i] = gids[i];
1319 init_unistr2(&usr->uni_logon_srv, logon_srv, len_logon_srv);
1320 init_unistr2(&usr->uni_logon_dom, logon_dom, len_logon_dom);
1322 init_dom_sid2(&usr->dom_sid, dom_sid);
1323 /* "other" sids are set up above */
1326 /*******************************************************************
1327 This code has been modified to cope with a NET_USER_INFO_2 - which is
1328 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1329 We use validation level to determine if we're marshalling a info 2 or
1330 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1331 Jacobsen at HP. JRA.
1332 ********************************************************************/
1334 BOOL net_io_user_info3(const char *desc, NET_USER_INFO_3 *usr, prs_struct *ps,
1335 int depth, uint16 validation_level)
1342 prs_debug(ps, depth, desc, "net_io_user_info3");
1345 if (UNMARSHALLING(ps))
1351 if(!prs_uint32("ptr_user_info ", ps, depth, &usr->ptr_user_info))
1354 if (usr->ptr_user_info == 0)
1357 if(!smb_io_time("logon time", &usr->logon_time, ps, depth)) /* logon time */
1359 if(!smb_io_time("logoff time", &usr->logoff_time, ps, depth)) /* logoff time */
1361 if(!smb_io_time("kickoff time", &usr->kickoff_time, ps, depth)) /* kickoff time */
1363 if(!smb_io_time("last set time", &usr->pass_last_set_time, ps, depth)) /* password last set time */
1365 if(!smb_io_time("can change time", &usr->pass_can_change_time , ps, depth)) /* password can change time */
1367 if(!smb_io_time("must change time", &usr->pass_must_change_time, ps, depth)) /* password must change time */
1370 if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
1372 if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
1374 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
1376 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
1378 if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
1380 if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive unicode string header */
1383 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count)) /* logon count */
1385 if(!prs_uint16("bad_pw_count ", ps, depth, &usr->bad_pw_count)) /* bad password count */
1388 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User RID */
1390 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group RID */
1392 if(!prs_uint32("num_groups ", ps, depth, &usr->num_groups)) /* num groups */
1394 if(!prs_uint32("buffer_groups ", ps, depth, &usr->buffer_groups)) /* undocumented buffer pointer to groups. */
1396 if(!prs_uint32("user_flgs ", ps, depth, &usr->user_flgs)) /* user flags */
1399 if(!prs_uint8s(False, "user_sess_key", ps, depth, usr->user_sess_key, 16)) /* unused user session key */
1402 if(!smb_io_unihdr("hdr_logon_srv", &usr->hdr_logon_srv, ps, depth)) /* logon server unicode string header */
1404 if(!smb_io_unihdr("hdr_logon_dom", &usr->hdr_logon_dom, ps, depth)) /* logon domain unicode string header */
1407 if(!prs_uint32("buffer_dom_id ", ps, depth, &usr->buffer_dom_id)) /* undocumented logon domain id pointer */
1409 if(!prs_uint8s (False, "padding ", ps, depth, usr->padding, 40)) /* unused padding bytes? */
1412 if (validation_level == 3) {
1413 if(!prs_uint32("num_other_sids", ps, depth, &usr->num_other_sids)) /* 0 - num_sids */
1415 if(!prs_uint32("buffer_other_sids", ps, depth, &usr->buffer_other_sids)) /* NULL - undocumented pointer to SIDs. */
1418 if (UNMARSHALLING(ps)) {
1419 usr->num_other_sids = 0;
1420 usr->buffer_other_sids = 0;
1424 if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
1426 if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
1428 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
1430 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
1432 if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
1434 if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
1439 if(!prs_uint32("num_groups2 ", ps, depth, &usr->num_groups2)) /* num groups */
1442 if (UNMARSHALLING(ps) && usr->num_groups2 > 0) {
1443 usr->gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_groups2);
1444 if (usr->gids == NULL)
1448 for (i = 0; i < usr->num_groups2; i++) {
1449 if(!smb_io_gid("", &usr->gids[i], ps, depth)) /* group info */
1453 if(!smb_io_unistr2("uni_logon_srv", &usr->uni_logon_srv, usr->hdr_logon_srv.buffer, ps, depth)) /* logon server unicode string */
1455 if(!smb_io_unistr2("uni_logon_dom", &usr->uni_logon_dom, usr->hdr_logon_srv.buffer, ps, depth)) /* logon domain unicode string */
1458 if(!smb_io_dom_sid2("", &usr->dom_sid, ps, depth)) /* domain SID */
1461 if (usr->num_other_sids) {
1463 if (UNMARSHALLING(ps)) {
1464 usr->other_sids = (DOM_SID2 *)prs_alloc_mem(ps, sizeof(DOM_SID2)*usr->num_other_sids);
1465 if (usr->other_sids == NULL)
1469 if(!prs_uint32("num_other_groups", ps, depth, &usr->num_other_groups))
1472 if (UNMARSHALLING(ps) && usr->num_other_groups > 0) {
1473 usr->other_gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_other_groups);
1474 if (usr->other_gids == NULL)
1478 for (i = 0; i < usr->num_other_groups; i++) {
1479 if(!smb_io_gid("", &usr->other_gids[i], ps, depth)) /* other GIDs */
1482 for (i = 0; i < usr->num_other_sids; i++) {
1483 if(!smb_io_dom_sid2("", &usr->other_sids[i], ps, depth)) /* other domain SIDs */
1491 /*******************************************************************
1492 Reads or writes a structure.
1493 ********************************************************************/
1495 BOOL net_io_q_sam_logon(char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth)
1500 prs_debug(ps, depth, desc, "net_io_q_sam_logon");
1506 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth))
1509 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1515 /*******************************************************************
1516 Reads or writes a structure.
1517 ********************************************************************/
1519 BOOL net_io_r_sam_logon(char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth)
1524 prs_debug(ps, depth, desc, "net_io_r_sam_logon");
1527 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1529 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1532 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1537 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1538 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1541 if (r_l->switch_value != 0) {
1542 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1547 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1550 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1559 /*******************************************************************
1560 Reads or writes a structure.
1561 ********************************************************************/
1563 BOOL net_io_q_sam_logoff(char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth)
1568 prs_debug(ps, depth, desc, "net_io_q_sam_logoff");
1574 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
1580 /*******************************************************************
1581 Reads or writes a structure.
1582 ********************************************************************/
1584 BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth)
1589 prs_debug(ps, depth, desc, "net_io_r_sam_logoff");
1595 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1597 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1600 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1606 /*******************************************************************
1607 makes a NET_Q_SAM_SYNC structure.
1608 ********************************************************************/
1609 BOOL init_net_q_sam_sync(NET_Q_SAM_SYNC * q_s, const char *srv_name,
1610 const char *cli_name, DOM_CRED *cli_creds,
1611 DOM_CRED *ret_creds, uint32 database_id)
1613 DEBUG(5, ("init_q_sam_sync\n"));
1615 init_unistr2(&q_s->uni_srv_name, srv_name, strlen(srv_name) + 1);
1616 init_unistr2(&q_s->uni_cli_name, cli_name, strlen(cli_name) + 1);
1619 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
1622 memcpy(&q_s->ret_creds, ret_creds, sizeof(q_s->ret_creds));
1624 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
1626 q_s->database_id = database_id;
1627 q_s->restart_state = 0;
1628 q_s->sync_context = 0;
1629 q_s->max_size = 0xffff;
1634 /*******************************************************************
1635 reads or writes a structure.
1636 ********************************************************************/
1637 BOOL net_io_q_sam_sync(char *desc, NET_Q_SAM_SYNC * q_s, prs_struct *ps,
1640 prs_debug(ps, depth, desc, "net_io_q_sam_sync");
1643 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
1645 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
1648 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
1650 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
1653 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
1655 if (!prs_uint32("restart_state", ps, depth, &q_s->restart_state))
1657 if (!prs_uint32("sync_context ", ps, depth, &q_s->sync_context))
1660 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
1666 /*******************************************************************
1667 reads or writes a structure.
1668 ********************************************************************/
1669 static BOOL net_io_sam_delta_hdr(char *desc, SAM_DELTA_HDR * delta,
1670 prs_struct *ps, int depth)
1672 prs_debug(ps, depth, desc, "net_io_sam_delta_hdr");
1675 if (!prs_uint16("type", ps, depth, &delta->type))
1677 if (!prs_uint16("type2", ps, depth, &delta->type2))
1679 if (!prs_uint32("target_rid", ps, depth, &delta->target_rid))
1682 if (!prs_uint32("type3", ps, depth, &delta->type3))
1685 /* Not sure why we need this but it seems to be necessary to get
1686 sam deltas working. */
1688 if (delta->type != 0x16) {
1689 if (!prs_uint32("ptr_delta", ps, depth, &delta->ptr_delta))
1696 /*******************************************************************
1697 reads or writes a structure.
1698 ********************************************************************/
1699 static BOOL net_io_sam_delta_stamp(char *desc, SAM_DELTA_STAMP *info,
1700 prs_struct *ps, int depth)
1702 prs_debug(ps, depth, desc, "net_io_sam_delta_stamp");
1705 if (!prs_uint32("seqnum", ps, depth, &info->seqnum))
1707 if (!prs_uint32("dom_mod_count_ptr", ps, depth,
1708 &info->dom_mod_count_ptr))
1711 if (info->dom_mod_count_ptr) {
1712 if (!prs_uint64("dom_mod_count", ps, depth,
1713 &info->dom_mod_count))
1720 /*******************************************************************
1721 reads or writes a structure.
1722 ********************************************************************/
1723 static BOOL net_io_sam_domain_info(char *desc, SAM_DOMAIN_INFO * info,
1724 prs_struct *ps, int depth)
1726 prs_debug(ps, depth, desc, "net_io_sam_domain_info");
1729 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
1731 if (!smb_io_unihdr("hdr_oem_info", &info->hdr_oem_info, ps, depth))
1734 if (!prs_uint64("force_logoff", ps, depth, &info->force_logoff))
1736 if (!prs_uint16("min_pwd_len", ps, depth, &info->min_pwd_len))
1738 if (!prs_uint16("pwd_history_len", ps, depth, &info->pwd_history_len))
1740 if (!prs_uint64("max_pwd_age", ps, depth, &info->max_pwd_age))
1742 if (!prs_uint64("min_pwd_age", ps, depth, &info->min_pwd_age))
1744 if (!prs_uint64("dom_mod_count", ps, depth, &info->dom_mod_count))
1746 if (!smb_io_time("creation_time", &info->creation_time, ps, depth))
1749 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1751 if (!smb_io_unihdr("hdr_unknown", &info->hdr_unknown, ps, depth))
1754 if (ps->data_offset + 40 > ps->buffer_size)
1756 ps->data_offset += 40;
1758 if (!smb_io_unistr2("uni_dom_name", &info->uni_dom_name,
1759 info->hdr_dom_name.buffer, ps, depth))
1761 if (!smb_io_unistr2("buf_oem_info", &info->buf_oem_info,
1762 info->hdr_oem_info.buffer, ps, depth))
1765 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
1766 info->hdr_sec_desc.buffer, ps, depth))
1768 if (!smb_io_unistr2("buf_unknown", &info->buf_unknown,
1769 info->hdr_unknown.buffer, ps, depth))
1775 /*******************************************************************
1776 reads or writes a structure.
1777 ********************************************************************/
1778 static BOOL net_io_sam_group_info(char *desc, SAM_GROUP_INFO * info,
1779 prs_struct *ps, int depth)
1781 prs_debug(ps, depth, desc, "net_io_sam_group_info");
1784 if (!smb_io_unihdr("hdr_grp_name", &info->hdr_grp_name, ps, depth))
1786 if (!smb_io_gid("gid", &info->gid, ps, depth))
1788 if (!smb_io_unihdr("hdr_grp_desc", &info->hdr_grp_desc, ps, depth))
1790 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1793 if (ps->data_offset + 48 > ps->buffer_size)
1795 ps->data_offset += 48;
1797 if (!smb_io_unistr2("uni_grp_name", &info->uni_grp_name,
1798 info->hdr_grp_name.buffer, ps, depth))
1800 if (!smb_io_unistr2("uni_grp_desc", &info->uni_grp_desc,
1801 info->hdr_grp_desc.buffer, ps, depth))
1803 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
1804 info->hdr_sec_desc.buffer, ps, depth))
1810 /*******************************************************************
1811 reads or writes a structure.
1812 ********************************************************************/
1813 static BOOL net_io_sam_passwd_info(char *desc, SAM_PWD * pwd,
1814 prs_struct *ps, int depth)
1816 prs_debug(ps, depth, desc, "net_io_sam_passwd_info");
1819 if (!prs_uint32("unk_0 ", ps, depth, &pwd->unk_0))
1822 if (!smb_io_unihdr("hdr_lm_pwd", &pwd->hdr_lm_pwd, ps, depth))
1824 if (!prs_uint8s(False, "buf_lm_pwd", ps, depth, pwd->buf_lm_pwd, 16))
1827 if (!smb_io_unihdr("hdr_nt_pwd", &pwd->hdr_nt_pwd, ps, depth))
1829 if (!prs_uint8s(False, "buf_nt_pwd", ps, depth, pwd->buf_nt_pwd, 16))
1832 if (!smb_io_unihdr("", &pwd->hdr_empty_lm, ps, depth))
1834 if (!smb_io_unihdr("", &pwd->hdr_empty_nt, ps, depth))
1840 /*******************************************************************
1841 makes a SAM_ACCOUNT_INFO structure.
1842 ********************************************************************/
1843 BOOL make_sam_account_info(SAM_ACCOUNT_INFO * info,
1844 const UNISTR2 *user_name,
1845 const UNISTR2 *full_name,
1846 uint32 user_rid, uint32 group_rid,
1847 const UNISTR2 *home_dir,
1848 const UNISTR2 *dir_drive,
1849 const UNISTR2 *log_scr,
1850 const UNISTR2 *desc,
1852 const UNISTR2 *prof_path,
1853 const UNISTR2 *wkstas,
1854 const UNISTR2 *unk_str, const UNISTR2 *mung_dial)
1856 int len_user_name = user_name != NULL ? user_name->uni_str_len : 0;
1857 int len_full_name = full_name != NULL ? full_name->uni_str_len : 0;
1858 int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0;
1859 int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0;
1860 int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0;
1861 int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0;
1862 int len_description = desc != NULL ? desc->uni_str_len : 0;
1863 int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0;
1864 int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0;
1865 int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0;
1867 DEBUG(5, ("make_sam_account_info\n"));
1869 make_uni_hdr(&info->hdr_acct_name, len_user_name);
1870 make_uni_hdr(&info->hdr_full_name, len_full_name);
1871 make_uni_hdr(&info->hdr_home_dir, len_home_dir);
1872 make_uni_hdr(&info->hdr_dir_drive, len_dir_drive);
1873 make_uni_hdr(&info->hdr_logon_script, len_logon_script);
1874 make_uni_hdr(&info->hdr_profile, len_profile_path);
1875 make_uni_hdr(&info->hdr_acct_desc, len_description);
1876 make_uni_hdr(&info->hdr_workstations, len_workstations);
1877 make_uni_hdr(&info->hdr_comment, len_unknown_str);
1878 make_uni_hdr(&info->hdr_parameters, len_munged_dial);
1881 make_bufhdr2(&info->hdr_sec_desc, 0, 0, 0);
1883 info->user_rid = user_rid;
1884 info->group_rid = group_rid;
1886 init_nt_time(&info->logon_time);
1887 init_nt_time(&info->logoff_time);
1888 init_nt_time(&info->pwd_last_set_time);
1889 init_nt_time(&info->acct_expiry_time);
1891 info->logon_divs = 0xA8;
1892 info->ptr_logon_hrs = 0; /* Don't care right now */
1894 info->bad_pwd_count = 0;
1895 info->logon_count = 0;
1896 info->acb_info = acb_info;
1897 info->nt_pwd_present = 0;
1898 info->lm_pwd_present = 0;
1899 info->pwd_expired = 0;
1903 info->unknown1 = 0x4EC;
1906 copy_unistr2(&info->uni_acct_name, user_name);
1907 copy_unistr2(&info->uni_full_name, full_name);
1908 copy_unistr2(&info->uni_home_dir, home_dir);
1909 copy_unistr2(&info->uni_dir_drive, dir_drive);
1910 copy_unistr2(&info->uni_logon_script, log_scr);
1911 copy_unistr2(&info->uni_profile, prof_path);
1912 copy_unistr2(&info->uni_acct_desc, desc);
1913 copy_unistr2(&info->uni_workstations, wkstas);
1914 copy_unistr2(&info->uni_comment, unk_str);
1915 copy_unistr2(&info->uni_parameters, mung_dial);
1920 /*******************************************************************
1921 reads or writes a structure.
1922 ********************************************************************/
1923 static BOOL net_io_sam_account_info(char *desc, uint8 sess_key[16],
1924 SAM_ACCOUNT_INFO * info, prs_struct *ps,
1927 BUFHDR2 hdr_priv_data;
1930 prs_debug(ps, depth, desc, "net_io_sam_account_info");
1933 if (!smb_io_unihdr("hdr_acct_name", &info->hdr_acct_name, ps, depth))
1935 if (!smb_io_unihdr("hdr_full_name", &info->hdr_full_name, ps, depth))
1938 if (!prs_uint32("user_rid ", ps, depth, &info->user_rid))
1940 if (!prs_uint32("group_rid", ps, depth, &info->group_rid))
1943 if (!smb_io_unihdr("hdr_home_dir ", &info->hdr_home_dir, ps, depth))
1945 if (!smb_io_unihdr("hdr_dir_drive", &info->hdr_dir_drive, ps, depth))
1947 if (!smb_io_unihdr("hdr_logon_script", &info->hdr_logon_script, ps,
1951 if (!smb_io_unihdr("hdr_acct_desc", &info->hdr_acct_desc, ps, depth))
1953 if (!smb_io_unihdr("hdr_workstations", &info->hdr_workstations, ps,
1957 if (!smb_io_time("logon_time", &info->logon_time, ps, depth))
1959 if (!smb_io_time("logoff_time", &info->logoff_time, ps, depth))
1962 if (!prs_uint32("logon_divs ", ps, depth, &info->logon_divs))
1964 if (!prs_uint32("ptr_logon_hrs", ps, depth, &info->ptr_logon_hrs))
1967 if (!prs_uint16("bad_pwd_count", ps, depth, &info->bad_pwd_count))
1969 if (!prs_uint16("logon_count", ps, depth, &info->logon_count))
1971 if (!smb_io_time("pwd_last_set_time", &info->pwd_last_set_time, ps,
1974 if (!smb_io_time("acct_expiry_time", &info->acct_expiry_time, ps,
1978 if (!prs_uint32("acb_info", ps, depth, &info->acb_info))
1980 if (!prs_uint8s(False, "nt_pwd", ps, depth, info->nt_pwd, 16))
1982 if (!prs_uint8s(False, "lm_pwd", ps, depth, info->lm_pwd, 16))
1984 if (!prs_uint8("lm_pwd_present", ps, depth, &info->lm_pwd_present))
1986 if (!prs_uint8("nt_pwd_present", ps, depth, &info->nt_pwd_present))
1988 if (!prs_uint8("pwd_expired", ps, depth, &info->pwd_expired))
1991 if (!smb_io_unihdr("hdr_comment", &info->hdr_comment, ps, depth))
1993 if (!smb_io_unihdr("hdr_parameters", &info->hdr_parameters, ps,
1996 if (!prs_uint16("country", ps, depth, &info->country))
1998 if (!prs_uint16("codepage", ps, depth, &info->codepage))
2001 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data, ps, depth))
2003 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2005 if (!smb_io_unihdr("hdr_profile", &info->hdr_profile, ps, depth))
2008 for (i = 0; i < 3; i++)
2010 if (!smb_io_unihdr("hdr_reserved", &info->hdr_reserved[i],
2015 for (i = 0; i < 4; i++)
2017 if (!prs_uint32("dw_reserved", ps, depth,
2018 &info->dw_reserved[i]))
2022 if (!smb_io_unistr2("uni_acct_name", &info->uni_acct_name,
2023 info->hdr_acct_name.buffer, ps, depth))
2026 if (!smb_io_unistr2("uni_full_name", &info->uni_full_name,
2027 info->hdr_full_name.buffer, ps, depth))
2030 if (!smb_io_unistr2("uni_home_dir ", &info->uni_home_dir,
2031 info->hdr_home_dir.buffer, ps, depth))
2034 if (!smb_io_unistr2("uni_dir_drive", &info->uni_dir_drive,
2035 info->hdr_dir_drive.buffer, ps, depth))
2038 if (!smb_io_unistr2("uni_logon_script", &info->uni_logon_script,
2039 info->hdr_logon_script.buffer, ps, depth))
2042 if (!smb_io_unistr2("uni_acct_desc", &info->uni_acct_desc,
2043 info->hdr_acct_desc.buffer, ps, depth))
2046 if (!smb_io_unistr2("uni_workstations", &info->uni_workstations,
2047 info->hdr_workstations.buffer, ps, depth))
2051 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2053 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2056 if (!smb_io_buffer4("buf_logon_hrs", &info->buf_logon_hrs,
2057 info->ptr_logon_hrs, ps, depth))
2060 if (!smb_io_unistr2("uni_comment", &info->uni_comment,
2061 info->hdr_comment.buffer, ps, depth))
2064 if (!smb_io_unistr2("uni_parameters", &info->uni_parameters,
2065 info->hdr_parameters.buffer, ps, depth))
2068 if (hdr_priv_data.buffer != 0)
2072 if (!prs_uint32("pwd_len", ps, depth, &len))
2074 old_offset = ps->data_offset;
2080 if (!prs_hash1(ps, ps->data_offset, sess_key))
2083 if (!net_io_sam_passwd_info("pass", &info->pass,
2090 if (!prs_hash1(ps, old_offset, sess_key))
2094 if (old_offset + len > ps->buffer_size)
2096 ps->data_offset = old_offset + len;
2098 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2099 info->hdr_sec_desc.buffer, ps, depth))
2102 if (!smb_io_unistr2("uni_profile", &info->uni_profile,
2103 info->hdr_profile.buffer, ps, depth))
2111 /*******************************************************************
2112 reads or writes a structure.
2113 ********************************************************************/
2114 static BOOL net_io_sam_group_mem_info(char *desc, SAM_GROUP_MEM_INFO * info,
2115 prs_struct *ps, int depth)
2120 prs_debug(ps, depth, desc, "net_io_sam_group_mem_info");
2124 if (!prs_uint32("ptr_rids ", ps, depth, &info->ptr_rids))
2126 if (!prs_uint32("ptr_attribs", ps, depth, &info->ptr_attribs))
2128 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2131 if (ps->data_offset + 16 > ps->buffer_size)
2133 ps->data_offset += 16;
2135 if (info->ptr_rids != 0)
2137 if (!prs_uint32("num_members2", ps, depth,
2138 &info->num_members2))
2141 if (info->num_members2 != info->num_members)
2147 info->rids = talloc(ps->mem_ctx, sizeof(uint32) *
2148 info->num_members2);
2150 if (info->rids == NULL) {
2151 DEBUG(0, ("out of memory allocating %d rids\n",
2152 info->num_members2));
2156 for (i = 0; i < info->num_members2; i++)
2158 slprintf(tmp, sizeof(tmp) - 1, "rids[%02d]", i);
2159 if (!prs_uint32(tmp, ps, depth, &info->rids[i]))
2164 if (info->ptr_attribs != 0)
2166 if (!prs_uint32("num_members3", ps, depth,
2167 &info->num_members3))
2169 if (info->num_members3 != info->num_members)
2175 info->attribs = talloc(ps->mem_ctx, sizeof(uint32) *
2176 info->num_members3);
2178 if (info->attribs == NULL) {
2179 DEBUG(0, ("out of memory allocating %d attribs\n",
2180 info->num_members3));
2184 for (i = 0; i < info->num_members3; i++)
2186 slprintf(tmp, sizeof(tmp) - 1, "attribs[%02d]", i);
2187 if (!prs_uint32(tmp, ps, depth, &info->attribs[i]))
2195 /*******************************************************************
2196 reads or writes a structure.
2197 ********************************************************************/
2198 static BOOL net_io_sam_alias_info(char *desc, SAM_ALIAS_INFO * info,
2199 prs_struct *ps, int depth)
2201 prs_debug(ps, depth, desc, "net_io_sam_alias_info");
2204 if (!smb_io_unihdr("hdr_als_name", &info->hdr_als_name, ps, depth))
2206 if (!prs_uint32("als_rid", ps, depth, &info->als_rid))
2208 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2210 if (!smb_io_unihdr("hdr_als_desc", &info->hdr_als_desc, ps, depth))
2213 if (ps->data_offset + 40 > ps->buffer_size)
2215 ps->data_offset += 40;
2217 if (!smb_io_unistr2("uni_als_name", &info->uni_als_name,
2218 info->hdr_als_name.buffer, ps, depth))
2220 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2221 info->hdr_sec_desc.buffer, ps, depth))
2223 if (!smb_io_unistr2("uni_als_desc", &info->uni_als_desc,
2224 info->hdr_als_name.buffer, ps, depth))
2230 /*******************************************************************
2231 reads or writes a structure.
2232 ********************************************************************/
2233 static BOOL net_io_sam_alias_mem_info(char *desc, SAM_ALIAS_MEM_INFO * info,
2234 prs_struct *ps, int depth)
2239 prs_debug(ps, depth, desc, "net_io_sam_alias_mem_info");
2243 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2245 if (!prs_uint32("ptr_members", ps, depth, &info->ptr_members))
2248 if (info->ptr_members != 0)
2250 if (ps->data_offset + 16 > ps->buffer_size)
2252 ps->data_offset += 16;
2254 if (!prs_uint32("num_sids", ps, depth, &info->num_sids))
2256 if (info->num_sids != info->num_members)
2262 info->ptr_sids = talloc(ps->mem_ctx, sizeof(uint32) *
2265 if (info->ptr_sids == NULL) {
2266 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2271 for (i = 0; i < info->num_sids; i++)
2273 slprintf(tmp, sizeof(tmp) - 1, "ptr_sids[%02d]", i);
2274 if (!prs_uint32(tmp, ps, depth, &info->ptr_sids[i]))
2278 info->sids = talloc(ps->mem_ctx, sizeof(DOM_SID2) *
2281 if (info->sids == NULL) {
2282 DEBUG(0, ("error allocating %d sids\n",
2287 for (i = 0; i < info->num_sids; i++)
2289 if (info->ptr_sids[i] != 0)
2291 slprintf(tmp, sizeof(tmp) - 1, "sids[%02d]",
2293 if (!smb_io_dom_sid2(tmp, &info->sids[i],
2303 /*******************************************************************
2304 reads or writes a structure.
2305 ********************************************************************/
2306 static BOOL net_io_sam_dom_info(char *desc, SAM_DELTA_DOM *info,
2307 prs_struct *ps, int depth)
2311 prs_debug(ps, depth, desc, "net_io_sam_dom_info");
2317 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2319 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2321 if (!prs_uint32("unknown3", ps, depth, &info->unknown3))
2323 if (!prs_uint32("unknown4", ps, depth, &info->unknown4))
2325 if (!prs_uint32("count1", ps, depth, &info->count1))
2327 if (!prs_uint32("ptr1", ps, depth, &info->ptr1))
2330 if (!prs_uint16("count2", ps, depth, &info->count2))
2332 if (!prs_uint16("count3", ps, depth, &info->count3))
2335 if (!prs_uint32("ptr2", ps, depth, &info->ptr2))
2337 if (!prs_uint32("ptr3", ps, depth, &info->ptr3))
2340 if (!prs_uint32("unknown4b", ps, depth, &info->unknown4b))
2342 if (!prs_uint32("unknown5", ps, depth, &info->unknown5))
2344 if (!prs_uint32("unknown6", ps, depth, &info->unknown6))
2346 if (!prs_uint32("unknown7", ps, depth, &info->unknown7))
2348 if (!prs_uint32("unknown8", ps, depth, &info->unknown8))
2350 if (!prs_uint32("unknown9", ps, depth, &info->unknown9))
2352 if (!prs_uint32("unknown10", ps, depth, &info->unknown10))
2354 if (!prs_uint32("unknown11", ps, depth, &info->unknown11))
2356 if (!prs_uint32("unknown12", ps, depth, &info->unknown12))
2359 if (!prs_uint32("unknown13", ps, depth, &info->unknown13))
2361 if (!prs_uint32("unknown14", ps, depth, &info->unknown14))
2363 if (!prs_uint32("unknown15", ps, depth, &info->unknown15))
2365 if (!prs_uint32("unknown16", ps, depth, &info->unknown16))
2367 if (!prs_uint32("unknown17", ps, depth, &info->unknown17))
2370 for (i=0; i<info->count2; i++)
2371 if (!prs_uint32("unknown18", ps, depth, &info->unknown18))
2374 if (!prs_uint32("unknown19", ps, depth, &info->unknown19))
2377 for (i=0; i<info->count1; i++)
2378 if (!prs_uint32("unknown20", ps, depth, &info->unknown20))
2381 if (!prs_uint32("ptr4", ps, depth, &info->ptr4))
2384 if (!smb_io_unistr2("domain_name", &info->domain_name, True, ps, depth))
2387 if(!smb_io_dom_sid2("domain_sid", &info->domain_sid, ps, depth))
2393 /*******************************************************************
2394 reads or writes a structure.
2395 ********************************************************************/
2396 static BOOL net_io_sam_unk0e_info(char *desc, SAM_DELTA_UNK0E *info,
2397 prs_struct *ps, int depth)
2401 prs_debug(ps, depth, desc, "net_io_sam_unk0e_info");
2407 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2410 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2413 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2416 if(!smb_io_unihdr("hdr_domain", &info->hdr_domain, ps, depth))
2419 if(!prs_uint32("unknown0", ps, depth, &info->unknown0))
2421 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2423 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2426 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2428 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2431 for (i=0; i<12; i++)
2432 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2435 if (!smb_io_unistr2("domain", &info->domain, True, ps, depth))
2441 /*******************************************************************
2442 reads or writes a structure.
2443 ********************************************************************/
2444 static BOOL net_io_sam_unk12_info(char *desc, SAM_DELTA_UNK12 *info,
2445 prs_struct *ps, int depth)
2449 prs_debug(ps, depth, desc, "net_io_sam_unk12_info");
2455 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2458 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2461 if (!smb_io_unistr2("secret", &info->secret, True, ps, depth))
2467 if(!prs_uint32("count1", ps, depth, &info->count1))
2469 if(!prs_uint32("count2", ps, depth, &info->count2))
2471 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2475 if(!smb_io_time("time1", &info->time1, ps, depth)) /* logon time */
2477 if(!prs_uint32("count3", ps, depth, &info->count3))
2479 if(!prs_uint32("count4", ps, depth, &info->count4))
2481 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2483 if(!smb_io_time("time2", &info->time2, ps, depth)) /* logon time */
2485 if(!prs_uint32("unknow1", ps, depth, &info->unknow1))
2489 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2491 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2494 if(!prs_uint32("unknow2", ps, depth, &info->unknow2))
2497 if(!prs_uint32("chal_len", ps, depth, &info->chal_len))
2499 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2501 if(!prs_uint32("chal_len2", ps, depth, &info->chal_len2))
2504 if(!prs_uint8s (False, "chal", ps, depth, info->chal, info->chal_len2))
2507 if(!prs_uint32("key_len", ps, depth, &info->key_len))
2509 if(!prs_uint32("reserved2", ps, depth, &info->reserved2))
2511 if(!prs_uint32("key_len2", ps, depth, &info->key_len2))
2514 if(!prs_uint8s (False, "key", ps, depth, info->key, info->key_len2))
2518 if(!prs_uint32("buf_size3", ps, depth, &info->buf_size3))
2521 if(!sec_io_desc("sec_desc2", &info->sec_desc2, ps, depth))
2528 /*******************************************************************
2529 reads or writes a structure.
2530 ********************************************************************/
2531 static BOOL net_io_sam_privs_info(char *desc, SAM_DELTA_PRIVS *info,
2532 prs_struct *ps, int depth)
2536 prs_debug(ps, depth, desc, "net_io_sam_privs_info");
2542 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2545 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2548 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2551 if(!prs_uint32("priv_count", ps, depth, &info->priv_count))
2553 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2556 if(!prs_uint32("ptr1", ps, depth, &info->ptr1))
2558 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2561 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2563 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2565 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2567 if(!prs_uint32("unknown4", ps, depth, &info->unknown4))
2569 if(!prs_uint32("unknown5", ps, depth, &info->unknown5))
2571 if(!prs_uint32("unknown6", ps, depth, &info->unknown6))
2573 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2575 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2577 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2580 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2582 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2585 for (i=0; i<12; i++)
2586 if(!prs_uint32("unknown10", ps, depth, &info->unknown10))
2589 if(!prs_uint32("attribute_count", ps, depth, &info->attribute_count))
2592 info->attributes = talloc(ps->mem_ctx, sizeof(uint32) * info->attribute_count);
2594 for (i=0; i<info->attribute_count; i++)
2595 if(!prs_uint32("attributes", ps, depth, &info->attributes[i]))
2598 if(!prs_uint32("privlist_count", ps, depth, &info->privlist_count))
2601 info->hdr_privslist = talloc(ps->mem_ctx, sizeof(UNIHDR) * info->privlist_count);
2602 info->uni_privslist = talloc(ps->mem_ctx, sizeof(UNISTR2) * info->privlist_count);
2604 for (i=0; i<info->privlist_count; i++)
2605 if(!smb_io_unihdr("hdr_privslist", &info->hdr_privslist[i], ps, depth))
2608 for (i=0; i<info->privlist_count; i++)
2609 if (!smb_io_unistr2("uni_privslist", &info->uni_privslist[i], True, ps, depth))
2615 /*******************************************************************
2616 reads or writes a structure.
2617 ********************************************************************/
2618 static BOOL net_io_sam_delta_ctr(char *desc, uint8 sess_key[16],
2619 SAM_DELTA_CTR * delta, uint16 type,
2620 prs_struct *ps, int depth)
2622 prs_debug(ps, depth, desc, "net_io_sam_delta_ctr");
2626 /* Seen in sam deltas */
2627 case SAM_DELTA_SAM_STAMP:
2628 if (!net_io_sam_delta_stamp("", &delta->stamp, ps, depth))
2632 case SAM_DELTA_DOMAIN_INFO:
2633 if (!net_io_sam_domain_info("", &delta->domain_info, ps, depth))
2637 case SAM_DELTA_GROUP_INFO:
2638 if (!net_io_sam_group_info("", &delta->group_info, ps, depth))
2642 case SAM_DELTA_ACCOUNT_INFO:
2643 if (!net_io_sam_account_info("", sess_key, &delta->account_info, ps, depth))
2647 case SAM_DELTA_GROUP_MEM:
2648 if (!net_io_sam_group_mem_info("", &delta->grp_mem_info, ps, depth))
2652 case SAM_DELTA_ALIAS_INFO:
2653 if (!net_io_sam_alias_info("", &delta->alias_info, ps, depth))
2657 case SAM_DELTA_DOM_INFO:
2658 if (!net_io_sam_dom_info("", &delta->dom_info, ps, depth))
2662 case SAM_DELTA_ALIAS_MEM:
2663 if (!net_io_sam_alias_mem_info("", &delta->als_mem_info, ps, depth))
2667 case SAM_DELTA_PRIVS_INFO:
2668 if (!net_io_sam_privs_info("", &delta->privs_info, ps, depth))
2672 case SAM_DELTA_UNK0E_INFO:
2673 if (!net_io_sam_unk0e_info("", &delta->unk0e_info, ps, depth))
2677 case SAM_DELTA_UNK12_INFO:
2678 if (!net_io_sam_unk12_info("", &delta->unk12_info, ps, depth))
2683 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type));
2690 /*******************************************************************
2691 reads or writes a structure.
2692 ********************************************************************/
2693 BOOL net_io_r_sam_sync(char *desc, uint8 sess_key[16],
2694 NET_R_SAM_SYNC * r_s, prs_struct *ps, int depth)
2698 prs_debug(ps, depth, desc, "net_io_r_sam_sync");
2701 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2703 if (!prs_uint32("sync_context", ps, depth, &r_s->sync_context))
2706 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2708 if (r_s->ptr_deltas != 0)
2710 if (!prs_uint32("num_deltas ", ps, depth, &r_s->num_deltas))
2712 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->ptr_deltas2))
2714 if (r_s->ptr_deltas2 != 0)
2716 if (!prs_uint32("num_deltas2", ps, depth,
2720 if (r_s->num_deltas2 != r_s->num_deltas)
2726 if (r_s->num_deltas2 > 0) {
2727 r_s->hdr_deltas = (SAM_DELTA_HDR *)
2728 talloc(ps->mem_ctx, r_s->num_deltas2 *
2729 sizeof(SAM_DELTA_HDR));
2731 if (r_s->hdr_deltas == NULL) {
2732 DEBUG(0, ("error tallocating memory "
2733 "for %d delta headers\n",
2739 for (i = 0; i < r_s->num_deltas2; i++)
2741 if (!net_io_sam_delta_hdr("",
2742 &r_s->hdr_deltas[i],
2747 if (r_s->num_deltas2 > 0) {
2748 r_s->deltas = (SAM_DELTA_CTR *)
2749 talloc(ps->mem_ctx, r_s->num_deltas2 *
2750 sizeof(SAM_DELTA_CTR));
2752 if (r_s->deltas == NULL) {
2753 DEBUG(0, ("error tallocating memory "
2760 for (i = 0; i < r_s->num_deltas2; i++)
2762 if (!net_io_sam_delta_ctr(
2763 "", sess_key, &r_s->deltas[i],
2764 r_s->hdr_deltas[i].type3,
2766 DEBUG(0, ("hmm, failed on i=%d\n", i));
2774 if (!prs_ntstatus("status", ps, depth, &(r_s->status)))
2780 /*******************************************************************
2781 makes a NET_Q_SAM_DELTAS structure.
2782 ********************************************************************/
2783 BOOL init_net_q_sam_deltas(NET_Q_SAM_DELTAS *q_s, const char *srv_name,
2784 const char *cli_name, DOM_CRED *cli_creds,
2785 uint32 database_id, UINT64_S dom_mod_count)
2787 DEBUG(5, ("init_net_q_sam_deltas\n"));
2789 init_unistr2(&q_s->uni_srv_name, srv_name, strlen(srv_name) + 1);
2790 init_unistr2(&q_s->uni_cli_name, cli_name, strlen(cli_name) + 1);
2792 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
2793 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
2795 q_s->database_id = database_id;
2796 q_s->dom_mod_count.low = dom_mod_count.low;
2797 q_s->dom_mod_count.high = dom_mod_count.high;
2798 q_s->max_size = 0xffff;
2803 /*******************************************************************
2804 reads or writes a structure.
2805 ********************************************************************/
2806 BOOL net_io_q_sam_deltas(char *desc, NET_Q_SAM_DELTAS *q_s, prs_struct *ps,
2809 prs_debug(ps, depth, desc, "net_io_q_sam_deltas");
2812 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
2814 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
2817 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
2819 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
2822 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
2824 if (!prs_uint64("dom_mod_count", ps, depth, &q_s->dom_mod_count))
2826 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
2832 /*******************************************************************
2833 reads or writes a structure.
2834 ********************************************************************/
2835 BOOL net_io_r_sam_deltas(char *desc, uint8 sess_key[16],
2836 NET_R_SAM_DELTAS *r_s, prs_struct *ps, int depth)
2840 prs_debug(ps, depth, desc, "net_io_r_sam_deltas");
2843 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2845 if (!prs_uint64("dom_mod_count", ps, depth, &r_s->dom_mod_count))
2848 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2850 if (!prs_uint32("num_deltas", ps, depth, &r_s->num_deltas))
2852 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->num_deltas2))
2855 if (r_s->num_deltas2 != 0)
2857 if (!prs_uint32("num_deltas2 ", ps, depth, &r_s->num_deltas2))
2860 if (r_s->ptr_deltas != 0)
2862 if (r_s->num_deltas > 0) {
2863 r_s->hdr_deltas = (SAM_DELTA_HDR *)
2864 talloc(ps->mem_ctx, r_s->num_deltas *
2865 sizeof(SAM_DELTA_HDR));
2866 if (r_s->hdr_deltas == NULL) {
2867 DEBUG(0, ("error tallocating memory "
2868 "for %d delta headers\n",
2874 for (i = 0; i < r_s->num_deltas; i++)
2876 net_io_sam_delta_hdr("", &r_s->hdr_deltas[i],
2880 if (r_s->num_deltas > 0) {
2881 r_s->deltas = (SAM_DELTA_CTR *)
2882 talloc(ps->mem_ctx, r_s->num_deltas *
2883 sizeof(SAM_DELTA_CTR));
2885 if (r_s->deltas == NULL) {
2886 DEBUG(0, ("error tallocating memory "
2893 for (i = 0; i < r_s->num_deltas; i++)
2895 if (!net_io_sam_delta_ctr(
2898 r_s->hdr_deltas[i].type2,
2907 if (!prs_ntstatus("status", ps, depth, &r_s->status))