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 char *logon_srv, 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 char *logon_srv, char *acct_name, uint16 sec_chan, 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, DOM_GID *gids,
1222 uint32 user_flgs, uchar *sess_key,
1223 char *logon_srv, char *logon_dom,
1224 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 static BOOL net_io_user_info3(char *desc, NET_USER_INFO_3 *usr, prs_struct *ps, int depth, uint16 validation_level)
1341 prs_debug(ps, depth, desc, "lsa_io_lsa_user_info");
1344 if (UNMARSHALLING(ps))
1350 if(!prs_uint32("ptr_user_info ", ps, depth, &usr->ptr_user_info))
1353 if (usr->ptr_user_info == 0)
1356 if(!smb_io_time("logon time", &usr->logon_time, ps, depth)) /* logon time */
1358 if(!smb_io_time("logoff time", &usr->logoff_time, ps, depth)) /* logoff time */
1360 if(!smb_io_time("kickoff time", &usr->kickoff_time, ps, depth)) /* kickoff time */
1362 if(!smb_io_time("last set time", &usr->pass_last_set_time, ps, depth)) /* password last set time */
1364 if(!smb_io_time("can change time", &usr->pass_can_change_time , ps, depth)) /* password can change time */
1366 if(!smb_io_time("must change time", &usr->pass_must_change_time, ps, depth)) /* password must change time */
1369 if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
1371 if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
1373 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
1375 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
1377 if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
1379 if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive unicode string header */
1382 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count)) /* logon count */
1384 if(!prs_uint16("bad_pw_count ", ps, depth, &usr->bad_pw_count)) /* bad password count */
1387 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User RID */
1389 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group RID */
1391 if(!prs_uint32("num_groups ", ps, depth, &usr->num_groups)) /* num groups */
1393 if(!prs_uint32("buffer_groups ", ps, depth, &usr->buffer_groups)) /* undocumented buffer pointer to groups. */
1395 if(!prs_uint32("user_flgs ", ps, depth, &usr->user_flgs)) /* user flags */
1398 if(!prs_uint8s(False, "user_sess_key", ps, depth, usr->user_sess_key, 16)) /* unused user session key */
1401 if(!smb_io_unihdr("hdr_logon_srv", &usr->hdr_logon_srv, ps, depth)) /* logon server unicode string header */
1403 if(!smb_io_unihdr("hdr_logon_dom", &usr->hdr_logon_dom, ps, depth)) /* logon domain unicode string header */
1406 if(!prs_uint32("buffer_dom_id ", ps, depth, &usr->buffer_dom_id)) /* undocumented logon domain id pointer */
1408 if(!prs_uint8s (False, "padding ", ps, depth, usr->padding, 40)) /* unused padding bytes? */
1411 if (validation_level == 3) {
1412 if(!prs_uint32("num_other_sids", ps, depth, &usr->num_other_sids)) /* 0 - num_sids */
1414 if(!prs_uint32("buffer_other_sids", ps, depth, &usr->buffer_other_sids)) /* NULL - undocumented pointer to SIDs. */
1417 if (UNMARSHALLING(ps)) {
1418 usr->num_other_sids = 0;
1419 usr->buffer_other_sids = 0;
1423 if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
1425 if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
1427 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
1429 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
1431 if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
1433 if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
1438 if(!prs_uint32("num_groups2 ", ps, depth, &usr->num_groups2)) /* num groups */
1441 if (UNMARSHALLING(ps) && usr->num_groups2 > 0) {
1442 usr->gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_groups2);
1443 if (usr->gids == NULL)
1447 for (i = 0; i < usr->num_groups2; i++) {
1448 if(!smb_io_gid("", &usr->gids[i], ps, depth)) /* group info */
1452 if(!smb_io_unistr2("uni_logon_srv", &usr->uni_logon_srv, usr->hdr_logon_srv.buffer, ps, depth)) /* logon server unicode string */
1454 if(!smb_io_unistr2("uni_logon_dom", &usr->uni_logon_dom, usr->hdr_logon_srv.buffer, ps, depth)) /* logon domain unicode string */
1457 if(!smb_io_dom_sid2("", &usr->dom_sid, ps, depth)) /* domain SID */
1460 if (usr->num_other_sids) {
1462 if (UNMARSHALLING(ps)) {
1463 usr->other_sids = (DOM_SID2 *)prs_alloc_mem(ps, sizeof(DOM_SID2)*usr->num_other_sids);
1464 if (usr->other_sids == NULL)
1468 if(!prs_uint32("num_other_groups", ps, depth, &usr->num_other_groups))
1471 if (UNMARSHALLING(ps) && usr->num_other_groups > 0) {
1472 usr->other_gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_other_groups);
1473 if (usr->other_gids == NULL)
1477 for (i = 0; i < usr->num_other_groups; i++) {
1478 if(!smb_io_gid("", &usr->other_gids[i], ps, depth)) /* other GIDs */
1481 for (i = 0; i < usr->num_other_sids; i++) {
1482 if(!smb_io_dom_sid2("", &usr->other_sids[i], ps, depth)) /* other domain SIDs */
1490 /*******************************************************************
1491 Reads or writes a structure.
1492 ********************************************************************/
1494 BOOL net_io_q_sam_logon(char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth)
1499 prs_debug(ps, depth, desc, "net_io_q_sam_logon");
1505 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth))
1508 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1514 /*******************************************************************
1515 Reads or writes a structure.
1516 ********************************************************************/
1518 BOOL net_io_r_sam_logon(char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth)
1523 prs_debug(ps, depth, desc, "net_io_r_sam_logon");
1526 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1528 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1531 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1536 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1537 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1540 if (r_l->switch_value != 0) {
1541 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1546 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1549 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1558 /*******************************************************************
1559 Reads or writes a structure.
1560 ********************************************************************/
1562 BOOL net_io_q_sam_logoff(char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth)
1567 prs_debug(ps, depth, desc, "net_io_q_sam_logoff");
1573 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
1579 /*******************************************************************
1580 Reads or writes a structure.
1581 ********************************************************************/
1583 BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth)
1588 prs_debug(ps, depth, desc, "net_io_r_sam_logoff");
1594 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1596 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1599 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1605 /*******************************************************************
1606 makes a NET_Q_SAM_SYNC structure.
1607 ********************************************************************/
1608 BOOL init_net_q_sam_sync(NET_Q_SAM_SYNC * q_s, const char *srv_name,
1609 const char *cli_name, DOM_CRED *cli_creds,
1610 DOM_CRED *ret_creds, uint32 database_id)
1612 DEBUG(5, ("init_q_sam_sync\n"));
1614 init_unistr2(&q_s->uni_srv_name, srv_name, strlen(srv_name) + 1);
1615 init_unistr2(&q_s->uni_cli_name, cli_name, strlen(cli_name) + 1);
1618 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
1621 memcpy(&q_s->ret_creds, ret_creds, sizeof(q_s->ret_creds));
1623 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
1625 q_s->database_id = database_id;
1626 q_s->restart_state = 0;
1627 q_s->sync_context = 0;
1628 q_s->max_size = 0xffff;
1633 /*******************************************************************
1634 reads or writes a structure.
1635 ********************************************************************/
1636 BOOL net_io_q_sam_sync(char *desc, NET_Q_SAM_SYNC * q_s, prs_struct *ps,
1639 prs_debug(ps, depth, desc, "net_io_q_sam_sync");
1642 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
1644 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
1647 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
1649 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
1652 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
1654 if (!prs_uint32("restart_state", ps, depth, &q_s->restart_state))
1656 if (!prs_uint32("sync_context ", ps, depth, &q_s->sync_context))
1659 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
1665 /*******************************************************************
1666 reads or writes a structure.
1667 ********************************************************************/
1668 static BOOL net_io_sam_delta_hdr(char *desc, SAM_DELTA_HDR * delta,
1669 prs_struct *ps, int depth)
1671 prs_debug(ps, depth, desc, "net_io_sam_delta_hdr");
1674 if (!prs_uint16("type", ps, depth, &delta->type))
1676 if (!prs_uint16("type2", ps, depth, &delta->type2))
1678 if (!prs_uint32("target_rid", ps, depth, &delta->target_rid))
1681 if (!prs_uint32("type3", ps, depth, &delta->type3))
1684 /* Not sure why we need this but it seems to be necessary to get
1685 sam deltas working. */
1687 if (delta->type != 0x16) {
1688 if (!prs_uint32("ptr_delta", ps, depth, &delta->ptr_delta))
1695 /*******************************************************************
1696 reads or writes a structure.
1697 ********************************************************************/
1698 static BOOL net_io_sam_delta_stamp(char *desc, SAM_DELTA_STAMP *info,
1699 prs_struct *ps, int depth)
1701 prs_debug(ps, depth, desc, "net_io_sam_delta_stamp");
1704 if (!prs_uint32("seqnum", ps, depth, &info->seqnum))
1706 if (!prs_uint32("dom_mod_count_ptr", ps, depth,
1707 &info->dom_mod_count_ptr))
1710 if (info->dom_mod_count_ptr) {
1711 if (!prs_uint64("dom_mod_count", ps, depth,
1712 &info->dom_mod_count))
1719 /*******************************************************************
1720 reads or writes a structure.
1721 ********************************************************************/
1722 static BOOL net_io_sam_domain_info(char *desc, SAM_DOMAIN_INFO * info,
1723 prs_struct *ps, int depth)
1725 prs_debug(ps, depth, desc, "net_io_sam_domain_info");
1728 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
1730 if (!smb_io_unihdr("hdr_oem_info", &info->hdr_oem_info, ps, depth))
1733 if (!prs_uint64("force_logoff", ps, depth, &info->force_logoff))
1735 if (!prs_uint16("min_pwd_len", ps, depth, &info->min_pwd_len))
1737 if (!prs_uint16("pwd_history_len", ps, depth, &info->pwd_history_len))
1739 if (!prs_uint64("max_pwd_age", ps, depth, &info->max_pwd_age))
1741 if (!prs_uint64("min_pwd_age", ps, depth, &info->min_pwd_age))
1743 if (!prs_uint64("dom_mod_count", ps, depth, &info->dom_mod_count))
1745 if (!smb_io_time("creation_time", &info->creation_time, ps, depth))
1748 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1750 if (!smb_io_unihdr("hdr_unknown", &info->hdr_unknown, ps, depth))
1753 if (ps->data_offset + 40 > ps->buffer_size)
1755 ps->data_offset += 40;
1757 if (!smb_io_unistr2("uni_dom_name", &info->uni_dom_name,
1758 info->hdr_dom_name.buffer, ps, depth))
1760 if (!smb_io_unistr2("buf_oem_info", &info->buf_oem_info,
1761 info->hdr_oem_info.buffer, ps, depth))
1764 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
1765 info->hdr_sec_desc.buffer, ps, depth))
1767 if (!smb_io_unistr2("buf_unknown", &info->buf_unknown,
1768 info->hdr_unknown.buffer, ps, depth))
1774 /*******************************************************************
1775 reads or writes a structure.
1776 ********************************************************************/
1777 static BOOL net_io_sam_group_info(char *desc, SAM_GROUP_INFO * info,
1778 prs_struct *ps, int depth)
1780 prs_debug(ps, depth, desc, "net_io_sam_group_info");
1783 if (!smb_io_unihdr("hdr_grp_name", &info->hdr_grp_name, ps, depth))
1785 if (!smb_io_gid("gid", &info->gid, ps, depth))
1787 if (!smb_io_unihdr("hdr_grp_desc", &info->hdr_grp_desc, ps, depth))
1789 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1792 if (ps->data_offset + 48 > ps->buffer_size)
1794 ps->data_offset += 48;
1796 if (!smb_io_unistr2("uni_grp_name", &info->uni_grp_name,
1797 info->hdr_grp_name.buffer, ps, depth))
1799 if (!smb_io_unistr2("uni_grp_desc", &info->uni_grp_desc,
1800 info->hdr_grp_desc.buffer, ps, depth))
1802 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
1803 info->hdr_sec_desc.buffer, ps, depth))
1809 /*******************************************************************
1810 reads or writes a structure.
1811 ********************************************************************/
1812 static BOOL net_io_sam_passwd_info(char *desc, SAM_PWD * pwd,
1813 prs_struct *ps, int depth)
1815 prs_debug(ps, depth, desc, "net_io_sam_passwd_info");
1818 if (!prs_uint32("unk_0 ", ps, depth, &pwd->unk_0))
1821 if (!smb_io_unihdr("hdr_lm_pwd", &pwd->hdr_lm_pwd, ps, depth))
1823 if (!prs_uint8s(False, "buf_lm_pwd", ps, depth, pwd->buf_lm_pwd, 16))
1826 if (!smb_io_unihdr("hdr_nt_pwd", &pwd->hdr_nt_pwd, ps, depth))
1828 if (!prs_uint8s(False, "buf_nt_pwd", ps, depth, pwd->buf_nt_pwd, 16))
1831 if (!smb_io_unihdr("", &pwd->hdr_empty_lm, ps, depth))
1833 if (!smb_io_unihdr("", &pwd->hdr_empty_nt, ps, depth))
1839 /*******************************************************************
1840 makes a SAM_ACCOUNT_INFO structure.
1841 ********************************************************************/
1842 BOOL make_sam_account_info(SAM_ACCOUNT_INFO * info,
1843 const UNISTR2 *user_name,
1844 const UNISTR2 *full_name,
1845 uint32 user_rid, uint32 group_rid,
1846 const UNISTR2 *home_dir,
1847 const UNISTR2 *dir_drive,
1848 const UNISTR2 *log_scr,
1849 const UNISTR2 *desc,
1851 const UNISTR2 *prof_path,
1852 const UNISTR2 *wkstas,
1853 const UNISTR2 *unk_str, const UNISTR2 *mung_dial)
1855 int len_user_name = user_name != NULL ? user_name->uni_str_len : 0;
1856 int len_full_name = full_name != NULL ? full_name->uni_str_len : 0;
1857 int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0;
1858 int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0;
1859 int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0;
1860 int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0;
1861 int len_description = desc != NULL ? desc->uni_str_len : 0;
1862 int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0;
1863 int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0;
1864 int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0;
1866 DEBUG(5, ("make_sam_account_info\n"));
1868 make_uni_hdr(&info->hdr_acct_name, len_user_name);
1869 make_uni_hdr(&info->hdr_full_name, len_full_name);
1870 make_uni_hdr(&info->hdr_home_dir, len_home_dir);
1871 make_uni_hdr(&info->hdr_dir_drive, len_dir_drive);
1872 make_uni_hdr(&info->hdr_logon_script, len_logon_script);
1873 make_uni_hdr(&info->hdr_profile, len_profile_path);
1874 make_uni_hdr(&info->hdr_acct_desc, len_description);
1875 make_uni_hdr(&info->hdr_workstations, len_workstations);
1876 make_uni_hdr(&info->hdr_comment, len_unknown_str);
1877 make_uni_hdr(&info->hdr_parameters, len_munged_dial);
1880 make_bufhdr2(&info->hdr_sec_desc, 0, 0, 0);
1882 info->user_rid = user_rid;
1883 info->group_rid = group_rid;
1885 init_nt_time(&info->logon_time);
1886 init_nt_time(&info->logoff_time);
1887 init_nt_time(&info->pwd_last_set_time);
1888 init_nt_time(&info->acct_expiry_time);
1890 info->logon_divs = 0xA8;
1891 info->ptr_logon_hrs = 0; /* Don't care right now */
1893 info->bad_pwd_count = 0;
1894 info->logon_count = 0;
1895 info->acb_info = acb_info;
1896 info->nt_pwd_present = 0;
1897 info->lm_pwd_present = 0;
1898 info->pwd_expired = 0;
1902 info->unknown1 = 0x4EC;
1905 copy_unistr2(&info->uni_acct_name, user_name);
1906 copy_unistr2(&info->uni_full_name, full_name);
1907 copy_unistr2(&info->uni_home_dir, home_dir);
1908 copy_unistr2(&info->uni_dir_drive, dir_drive);
1909 copy_unistr2(&info->uni_logon_script, log_scr);
1910 copy_unistr2(&info->uni_profile, prof_path);
1911 copy_unistr2(&info->uni_acct_desc, desc);
1912 copy_unistr2(&info->uni_workstations, wkstas);
1913 copy_unistr2(&info->uni_comment, unk_str);
1914 copy_unistr2(&info->uni_parameters, mung_dial);
1919 /*******************************************************************
1920 reads or writes a structure.
1921 ********************************************************************/
1922 static BOOL net_io_sam_account_info(char *desc, uint8 sess_key[16],
1923 SAM_ACCOUNT_INFO * info, prs_struct *ps,
1926 BUFHDR2 hdr_priv_data;
1929 prs_debug(ps, depth, desc, "net_io_sam_account_info");
1932 if (!smb_io_unihdr("hdr_acct_name", &info->hdr_acct_name, ps, depth))
1934 if (!smb_io_unihdr("hdr_full_name", &info->hdr_full_name, ps, depth))
1937 if (!prs_uint32("user_rid ", ps, depth, &info->user_rid))
1939 if (!prs_uint32("group_rid", ps, depth, &info->group_rid))
1942 if (!smb_io_unihdr("hdr_home_dir ", &info->hdr_home_dir, ps, depth))
1944 if (!smb_io_unihdr("hdr_dir_drive", &info->hdr_dir_drive, ps, depth))
1946 if (!smb_io_unihdr("hdr_logon_script", &info->hdr_logon_script, ps,
1950 if (!smb_io_unihdr("hdr_acct_desc", &info->hdr_acct_desc, ps, depth))
1952 if (!smb_io_unihdr("hdr_workstations", &info->hdr_workstations, ps,
1956 if (!smb_io_time("logon_time", &info->logon_time, ps, depth))
1958 if (!smb_io_time("logoff_time", &info->logoff_time, ps, depth))
1961 if (!prs_uint32("logon_divs ", ps, depth, &info->logon_divs))
1963 if (!prs_uint32("ptr_logon_hrs", ps, depth, &info->ptr_logon_hrs))
1966 if (!prs_uint16("bad_pwd_count", ps, depth, &info->bad_pwd_count))
1968 if (!prs_uint16("logon_count", ps, depth, &info->logon_count))
1970 if (!smb_io_time("pwd_last_set_time", &info->pwd_last_set_time, ps,
1973 if (!smb_io_time("acct_expiry_time", &info->acct_expiry_time, ps,
1977 if (!prs_uint32("acb_info", ps, depth, &info->acb_info))
1979 if (!prs_uint8s(False, "nt_pwd", ps, depth, info->nt_pwd, 16))
1981 if (!prs_uint8s(False, "lm_pwd", ps, depth, info->lm_pwd, 16))
1983 if (!prs_uint8("lm_pwd_present", ps, depth, &info->lm_pwd_present))
1985 if (!prs_uint8("nt_pwd_present", ps, depth, &info->nt_pwd_present))
1987 if (!prs_uint8("pwd_expired", ps, depth, &info->pwd_expired))
1990 if (!smb_io_unihdr("hdr_comment", &info->hdr_comment, ps, depth))
1992 if (!smb_io_unihdr("hdr_parameters", &info->hdr_parameters, ps,
1995 if (!prs_uint16("country", ps, depth, &info->country))
1997 if (!prs_uint16("codepage", ps, depth, &info->codepage))
2000 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data, ps, depth))
2002 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2004 if (!smb_io_unihdr("hdr_profile", &info->hdr_profile, ps, depth))
2007 for (i = 0; i < 3; i++)
2009 if (!smb_io_unihdr("hdr_reserved", &info->hdr_reserved[i],
2014 for (i = 0; i < 4; i++)
2016 if (!prs_uint32("dw_reserved", ps, depth,
2017 &info->dw_reserved[i]))
2021 if (!smb_io_unistr2("uni_acct_name", &info->uni_acct_name,
2022 info->hdr_acct_name.buffer, ps, depth))
2025 if (!smb_io_unistr2("uni_full_name", &info->uni_full_name,
2026 info->hdr_full_name.buffer, ps, depth))
2029 if (!smb_io_unistr2("uni_home_dir ", &info->uni_home_dir,
2030 info->hdr_home_dir.buffer, ps, depth))
2033 if (!smb_io_unistr2("uni_dir_drive", &info->uni_dir_drive,
2034 info->hdr_dir_drive.buffer, ps, depth))
2037 if (!smb_io_unistr2("uni_logon_script", &info->uni_logon_script,
2038 info->hdr_logon_script.buffer, ps, depth))
2041 if (!smb_io_unistr2("uni_acct_desc", &info->uni_acct_desc,
2042 info->hdr_acct_desc.buffer, ps, depth))
2045 if (!smb_io_unistr2("uni_workstations", &info->uni_workstations,
2046 info->hdr_workstations.buffer, ps, depth))
2050 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2052 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2055 if (!smb_io_buffer4("buf_logon_hrs", &info->buf_logon_hrs,
2056 info->ptr_logon_hrs, ps, depth))
2059 if (!smb_io_unistr2("uni_comment", &info->uni_comment,
2060 info->hdr_comment.buffer, ps, depth))
2063 if (!smb_io_unistr2("uni_parameters", &info->uni_parameters,
2064 info->hdr_parameters.buffer, ps, depth))
2067 if (hdr_priv_data.buffer != 0)
2071 if (!prs_uint32("pwd_len", ps, depth, &len))
2073 old_offset = ps->data_offset;
2079 if (!prs_hash1(ps, ps->data_offset, sess_key))
2082 if (!net_io_sam_passwd_info("pass", &info->pass,
2089 if (!prs_hash1(ps, old_offset, sess_key))
2093 if (old_offset + len > ps->buffer_size)
2095 ps->data_offset = old_offset + len;
2097 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2098 info->hdr_sec_desc.buffer, ps, depth))
2101 if (!smb_io_unistr2("uni_profile", &info->uni_profile,
2102 info->hdr_profile.buffer, ps, depth))
2110 /*******************************************************************
2111 reads or writes a structure.
2112 ********************************************************************/
2113 static BOOL net_io_sam_group_mem_info(char *desc, SAM_GROUP_MEM_INFO * info,
2114 prs_struct *ps, int depth)
2119 prs_debug(ps, depth, desc, "net_io_sam_group_mem_info");
2123 if (!prs_uint32("ptr_rids ", ps, depth, &info->ptr_rids))
2125 if (!prs_uint32("ptr_attribs", ps, depth, &info->ptr_attribs))
2127 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2130 if (ps->data_offset + 16 > ps->buffer_size)
2132 ps->data_offset += 16;
2134 if (info->ptr_rids != 0)
2136 if (!prs_uint32("num_members2", ps, depth,
2137 &info->num_members2))
2140 if (info->num_members2 != info->num_members)
2146 info->rids = talloc(ps->mem_ctx, sizeof(uint32) *
2147 info->num_members2);
2149 if (info->rids == NULL) {
2150 DEBUG(0, ("out of memory allocating %d rids\n",
2151 info->num_members2));
2155 for (i = 0; i < info->num_members2; i++)
2157 slprintf(tmp, sizeof(tmp) - 1, "rids[%02d]", i);
2158 if (!prs_uint32(tmp, ps, depth, &info->rids[i]))
2163 if (info->ptr_attribs != 0)
2165 if (!prs_uint32("num_members3", ps, depth,
2166 &info->num_members3))
2168 if (info->num_members3 != info->num_members)
2174 info->attribs = talloc(ps->mem_ctx, sizeof(uint32) *
2175 info->num_members3);
2177 if (info->attribs == NULL) {
2178 DEBUG(0, ("out of memory allocating %d attribs\n",
2179 info->num_members3));
2183 for (i = 0; i < info->num_members3; i++)
2185 slprintf(tmp, sizeof(tmp) - 1, "attribs[%02d]", i);
2186 if (!prs_uint32(tmp, ps, depth, &info->attribs[i]))
2194 /*******************************************************************
2195 reads or writes a structure.
2196 ********************************************************************/
2197 static BOOL net_io_sam_alias_info(char *desc, SAM_ALIAS_INFO * info,
2198 prs_struct *ps, int depth)
2200 prs_debug(ps, depth, desc, "net_io_sam_alias_info");
2203 if (!smb_io_unihdr("hdr_als_name", &info->hdr_als_name, ps, depth))
2205 if (!prs_uint32("als_rid", ps, depth, &info->als_rid))
2207 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2209 if (!smb_io_unihdr("hdr_als_desc", &info->hdr_als_desc, ps, depth))
2212 if (ps->data_offset + 40 > ps->buffer_size)
2214 ps->data_offset += 40;
2216 if (!smb_io_unistr2("uni_als_name", &info->uni_als_name,
2217 info->hdr_als_name.buffer, ps, depth))
2219 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2220 info->hdr_sec_desc.buffer, ps, depth))
2222 if (!smb_io_unistr2("uni_als_desc", &info->uni_als_desc,
2223 info->hdr_als_name.buffer, ps, depth))
2229 /*******************************************************************
2230 reads or writes a structure.
2231 ********************************************************************/
2232 static BOOL net_io_sam_alias_mem_info(char *desc, SAM_ALIAS_MEM_INFO * info,
2233 prs_struct *ps, int depth)
2238 prs_debug(ps, depth, desc, "net_io_sam_alias_mem_info");
2242 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2244 if (!prs_uint32("ptr_members", ps, depth, &info->ptr_members))
2247 if (info->ptr_members != 0)
2249 if (ps->data_offset + 16 > ps->buffer_size)
2251 ps->data_offset += 16;
2253 if (!prs_uint32("num_sids", ps, depth, &info->num_sids))
2255 if (info->num_sids != info->num_members)
2261 info->ptr_sids = talloc(ps->mem_ctx, sizeof(uint32) *
2264 if (info->ptr_sids == NULL) {
2265 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2270 for (i = 0; i < info->num_sids; i++)
2272 slprintf(tmp, sizeof(tmp) - 1, "ptr_sids[%02d]", i);
2273 if (!prs_uint32(tmp, ps, depth, &info->ptr_sids[i]))
2277 info->sids = talloc(ps->mem_ctx, sizeof(DOM_SID2) *
2280 if (info->sids == NULL) {
2281 DEBUG(0, ("error allocating %d sids\n",
2286 for (i = 0; i < info->num_sids; i++)
2288 if (info->ptr_sids[i] != 0)
2290 slprintf(tmp, sizeof(tmp) - 1, "sids[%02d]",
2292 if (!smb_io_dom_sid2(tmp, &info->sids[i],
2302 /*******************************************************************
2303 reads or writes a structure.
2304 ********************************************************************/
2305 static BOOL net_io_sam_dom_info(char *desc, SAM_DELTA_DOM *info,
2306 prs_struct *ps, int depth)
2310 prs_debug(ps, depth, desc, "net_io_sam_dom_info");
2316 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2318 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2320 if (!prs_uint32("unknown3", ps, depth, &info->unknown3))
2322 if (!prs_uint32("unknown4", ps, depth, &info->unknown4))
2324 if (!prs_uint32("count1", ps, depth, &info->count1))
2326 if (!prs_uint32("ptr1", ps, depth, &info->ptr1))
2329 if (!prs_uint16("count2", ps, depth, &info->count2))
2331 if (!prs_uint16("count3", ps, depth, &info->count3))
2334 if (!prs_uint32("ptr2", ps, depth, &info->ptr2))
2336 if (!prs_uint32("ptr3", ps, depth, &info->ptr3))
2339 if (!prs_uint32("unknown4b", ps, depth, &info->unknown4b))
2341 if (!prs_uint32("unknown5", ps, depth, &info->unknown5))
2343 if (!prs_uint32("unknown6", ps, depth, &info->unknown6))
2345 if (!prs_uint32("unknown7", ps, depth, &info->unknown7))
2347 if (!prs_uint32("unknown8", ps, depth, &info->unknown8))
2349 if (!prs_uint32("unknown9", ps, depth, &info->unknown9))
2351 if (!prs_uint32("unknown10", ps, depth, &info->unknown10))
2353 if (!prs_uint32("unknown11", ps, depth, &info->unknown11))
2355 if (!prs_uint32("unknown12", ps, depth, &info->unknown12))
2358 if (!prs_uint32("unknown13", ps, depth, &info->unknown13))
2360 if (!prs_uint32("unknown14", ps, depth, &info->unknown14))
2362 if (!prs_uint32("unknown15", ps, depth, &info->unknown15))
2364 if (!prs_uint32("unknown16", ps, depth, &info->unknown16))
2366 if (!prs_uint32("unknown17", ps, depth, &info->unknown17))
2369 for (i=0; i<info->count2; i++)
2370 if (!prs_uint32("unknown18", ps, depth, &info->unknown18))
2373 if (!prs_uint32("unknown19", ps, depth, &info->unknown19))
2376 for (i=0; i<info->count1; i++)
2377 if (!prs_uint32("unknown20", ps, depth, &info->unknown20))
2380 if (!prs_uint32("ptr4", ps, depth, &info->ptr4))
2383 if (!smb_io_unistr2("domain_name", &info->domain_name, True, ps, depth))
2386 if(!smb_io_dom_sid2("domain_sid", &info->domain_sid, ps, depth))
2392 /*******************************************************************
2393 reads or writes a structure.
2394 ********************************************************************/
2395 static BOOL net_io_sam_unk0e_info(char *desc, SAM_DELTA_UNK0E *info,
2396 prs_struct *ps, int depth)
2400 prs_debug(ps, depth, desc, "net_io_sam_unk0e_info");
2406 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2409 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2412 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2415 if(!smb_io_unihdr("hdr_domain", &info->hdr_domain, ps, depth))
2418 if(!prs_uint32("unknown0", ps, depth, &info->unknown0))
2420 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2422 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2425 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2427 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2430 for (i=0; i<12; i++)
2431 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2434 if (!smb_io_unistr2("domain", &info->domain, True, ps, depth))
2440 /*******************************************************************
2441 reads or writes a structure.
2442 ********************************************************************/
2443 static BOOL net_io_sam_unk12_info(char *desc, SAM_DELTA_UNK12 *info,
2444 prs_struct *ps, int depth)
2448 prs_debug(ps, depth, desc, "net_io_sam_unk12_info");
2454 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2457 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2460 if (!smb_io_unistr2("secret", &info->secret, True, ps, depth))
2466 if(!prs_uint32("count1", ps, depth, &info->count1))
2468 if(!prs_uint32("count2", ps, depth, &info->count2))
2470 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2474 if(!smb_io_time("time1", &info->time1, ps, depth)) /* logon time */
2476 if(!prs_uint32("count3", ps, depth, &info->count3))
2478 if(!prs_uint32("count4", ps, depth, &info->count4))
2480 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2482 if(!smb_io_time("time2", &info->time2, ps, depth)) /* logon time */
2484 if(!prs_uint32("unknow1", ps, depth, &info->unknow1))
2488 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2490 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2493 if(!prs_uint32("unknow2", ps, depth, &info->unknow2))
2496 if(!prs_uint32("chal_len", ps, depth, &info->chal_len))
2498 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2500 if(!prs_uint32("chal_len2", ps, depth, &info->chal_len2))
2503 if(!prs_uint8s (False, "chal", ps, depth, info->chal, info->chal_len2))
2506 if(!prs_uint32("key_len", ps, depth, &info->key_len))
2508 if(!prs_uint32("reserved2", ps, depth, &info->reserved2))
2510 if(!prs_uint32("key_len2", ps, depth, &info->key_len2))
2513 if(!prs_uint8s (False, "key", ps, depth, info->key, info->key_len2))
2517 if(!prs_uint32("buf_size3", ps, depth, &info->buf_size3))
2520 if(!sec_io_desc("sec_desc2", &info->sec_desc2, ps, depth))
2527 /*******************************************************************
2528 reads or writes a structure.
2529 ********************************************************************/
2530 static BOOL net_io_sam_privs_info(char *desc, SAM_DELTA_PRIVS *info,
2531 prs_struct *ps, int depth)
2535 prs_debug(ps, depth, desc, "net_io_sam_privs_info");
2541 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2544 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2547 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2550 if(!prs_uint32("priv_count", ps, depth, &info->priv_count))
2552 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2555 if(!prs_uint32("ptr1", ps, depth, &info->ptr1))
2557 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2560 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2562 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2564 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2566 if(!prs_uint32("unknown4", ps, depth, &info->unknown4))
2568 if(!prs_uint32("unknown5", ps, depth, &info->unknown5))
2570 if(!prs_uint32("unknown6", ps, depth, &info->unknown6))
2572 if(!prs_uint32("unknown7", ps, depth, &info->unknown7))
2574 if(!prs_uint32("unknown8", ps, depth, &info->unknown8))
2576 if(!prs_uint32("unknown9", ps, depth, &info->unknown9))
2579 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2581 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2584 for (i=0; i<12; i++)
2585 if(!prs_uint32("unknown10", ps, depth, &info->unknown10))
2588 if(!prs_uint32("attribute_count", ps, depth, &info->attribute_count))
2591 info->attributes = talloc(ps->mem_ctx, sizeof(uint32) * info->attribute_count);
2593 for (i=0; i<info->attribute_count; i++)
2594 if(!prs_uint32("attributes", ps, depth, &info->attributes[i]))
2597 if(!prs_uint32("privlist_count", ps, depth, &info->privlist_count))
2600 info->hdr_privslist = talloc(ps->mem_ctx, sizeof(UNIHDR) * info->privlist_count);
2601 info->uni_privslist = talloc(ps->mem_ctx, sizeof(UNISTR2) * info->privlist_count);
2603 for (i=0; i<info->privlist_count; i++)
2604 if(!smb_io_unihdr("hdr_privslist", &info->hdr_privslist[i], ps, depth))
2607 for (i=0; i<info->privlist_count; i++)
2608 if (!smb_io_unistr2("uni_privslist", &info->uni_privslist[i], True, ps, depth))
2614 /*******************************************************************
2615 reads or writes a structure.
2616 ********************************************************************/
2617 static BOOL net_io_sam_delta_ctr(char *desc, uint8 sess_key[16],
2618 SAM_DELTA_CTR * delta, uint16 type,
2619 prs_struct *ps, int depth)
2621 prs_debug(ps, depth, desc, "net_io_sam_delta_ctr");
2625 /* Seen in sam deltas */
2626 case SAM_DELTA_SAM_STAMP:
2627 if (!net_io_sam_delta_stamp("", &delta->stamp, ps, depth))
2631 case SAM_DELTA_DOMAIN_INFO:
2632 if (!net_io_sam_domain_info("", &delta->domain_info, ps, depth))
2636 case SAM_DELTA_GROUP_INFO:
2637 if (!net_io_sam_group_info("", &delta->group_info, ps, depth))
2641 case SAM_DELTA_ACCOUNT_INFO:
2642 if (!net_io_sam_account_info("", sess_key, &delta->account_info, ps, depth))
2646 case SAM_DELTA_GROUP_MEM:
2647 if (!net_io_sam_group_mem_info("", &delta->grp_mem_info, ps, depth))
2651 case SAM_DELTA_ALIAS_INFO:
2652 if (!net_io_sam_alias_info("", &delta->alias_info, ps, depth))
2656 case SAM_DELTA_DOM_INFO:
2657 if (!net_io_sam_dom_info("", &delta->dom_info, ps, depth))
2661 case SAM_DELTA_ALIAS_MEM:
2662 if (!net_io_sam_alias_mem_info("", &delta->als_mem_info, ps, depth))
2666 case SAM_DELTA_PRIVS_INFO:
2667 if (!net_io_sam_privs_info("", &delta->privs_info, ps, depth))
2671 case SAM_DELTA_UNK0E_INFO:
2672 if (!net_io_sam_unk0e_info("", &delta->unk0e_info, ps, depth))
2676 case SAM_DELTA_UNK12_INFO:
2677 if (!net_io_sam_unk12_info("", &delta->unk12_info, ps, depth))
2682 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type));
2689 /*******************************************************************
2690 reads or writes a structure.
2691 ********************************************************************/
2692 BOOL net_io_r_sam_sync(char *desc, uint8 sess_key[16],
2693 NET_R_SAM_SYNC * r_s, prs_struct *ps, int depth)
2697 prs_debug(ps, depth, desc, "net_io_r_sam_sync");
2700 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2702 if (!prs_uint32("sync_context", ps, depth, &r_s->sync_context))
2705 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2707 if (r_s->ptr_deltas != 0)
2709 if (!prs_uint32("num_deltas ", ps, depth, &r_s->num_deltas))
2711 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->ptr_deltas2))
2713 if (r_s->ptr_deltas2 != 0)
2715 if (!prs_uint32("num_deltas2", ps, depth,
2719 if (r_s->num_deltas2 != r_s->num_deltas)
2725 if (r_s->num_deltas2 > 0) {
2726 r_s->hdr_deltas = (SAM_DELTA_HDR *)
2727 talloc(ps->mem_ctx, r_s->num_deltas2 *
2728 sizeof(SAM_DELTA_HDR));
2730 if (r_s->hdr_deltas == NULL) {
2731 DEBUG(0, ("error tallocating memory "
2732 "for %d delta headers\n",
2738 for (i = 0; i < r_s->num_deltas2; i++)
2740 if (!net_io_sam_delta_hdr("",
2741 &r_s->hdr_deltas[i],
2746 if (r_s->num_deltas2 > 0) {
2747 r_s->deltas = (SAM_DELTA_CTR *)
2748 talloc(ps->mem_ctx, r_s->num_deltas2 *
2749 sizeof(SAM_DELTA_CTR));
2751 if (r_s->deltas == NULL) {
2752 DEBUG(0, ("error tallocating memory "
2759 for (i = 0; i < r_s->num_deltas2; i++)
2761 if (!net_io_sam_delta_ctr(
2762 "", sess_key, &r_s->deltas[i],
2763 r_s->hdr_deltas[i].type3,
2765 DEBUG(0, ("hmm, failed on i=%d\n", i));
2773 if (!prs_ntstatus("status", ps, depth, &(r_s->status)))
2779 /*******************************************************************
2780 makes a NET_Q_SAM_DELTAS structure.
2781 ********************************************************************/
2782 BOOL init_net_q_sam_deltas(NET_Q_SAM_DELTAS *q_s, const char *srv_name,
2783 const char *cli_name, DOM_CRED *cli_creds,
2784 uint32 database_id, UINT64_S dom_mod_count)
2786 DEBUG(5, ("init_net_q_sam_deltas\n"));
2788 init_unistr2(&q_s->uni_srv_name, srv_name, strlen(srv_name) + 1);
2789 init_unistr2(&q_s->uni_cli_name, cli_name, strlen(cli_name) + 1);
2791 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
2792 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
2794 q_s->database_id = database_id;
2795 q_s->dom_mod_count.low = dom_mod_count.low;
2796 q_s->dom_mod_count.high = dom_mod_count.high;
2797 q_s->max_size = 0xffff;
2802 /*******************************************************************
2803 reads or writes a structure.
2804 ********************************************************************/
2805 BOOL net_io_q_sam_deltas(char *desc, NET_Q_SAM_DELTAS *q_s, prs_struct *ps,
2808 prs_debug(ps, depth, desc, "net_io_q_sam_deltas");
2811 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
2813 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
2816 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
2818 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
2821 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
2823 if (!prs_uint64("dom_mod_count", ps, depth, &q_s->dom_mod_count))
2825 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
2831 /*******************************************************************
2832 reads or writes a structure.
2833 ********************************************************************/
2834 BOOL net_io_r_sam_deltas(char *desc, uint8 sess_key[16],
2835 NET_R_SAM_DELTAS *r_s, prs_struct *ps, int depth)
2839 prs_debug(ps, depth, desc, "net_io_r_sam_deltas");
2842 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2844 if (!prs_uint64("dom_mod_count", ps, depth, &r_s->dom_mod_count))
2847 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2849 if (!prs_uint32("num_deltas", ps, depth, &r_s->num_deltas))
2851 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->num_deltas2))
2854 if (r_s->num_deltas2 != 0)
2856 if (!prs_uint32("num_deltas2 ", ps, depth, &r_s->num_deltas2))
2859 if (r_s->ptr_deltas != 0)
2861 if (r_s->num_deltas > 0) {
2862 r_s->hdr_deltas = (SAM_DELTA_HDR *)
2863 talloc(ps->mem_ctx, r_s->num_deltas *
2864 sizeof(SAM_DELTA_HDR));
2865 if (r_s->hdr_deltas == NULL) {
2866 DEBUG(0, ("error tallocating memory "
2867 "for %d delta headers\n",
2873 for (i = 0; i < r_s->num_deltas; i++)
2875 net_io_sam_delta_hdr("", &r_s->hdr_deltas[i],
2879 if (r_s->num_deltas > 0) {
2880 r_s->deltas = (SAM_DELTA_CTR *)
2881 talloc(ps->mem_ctx, r_s->num_deltas *
2882 sizeof(SAM_DELTA_CTR));
2884 if (r_s->deltas == NULL) {
2885 DEBUG(0, ("error tallocating memory "
2892 for (i = 0; i < r_s->num_deltas; i++)
2894 if (!net_io_sam_delta_ctr(
2897 r_s->hdr_deltas[i].type2,
2906 if (!prs_ntstatus("status", ps, depth, &r_s->status))