2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997.
7 * Copyright (C) Jean François Micouleau 2002.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #define DBGC_CLASS DBGC_RPC_PARSE
29 /*******************************************************************
30 Reads or writes a structure.
31 ********************************************************************/
33 static BOOL net_io_neg_flags(const char *desc, NEG_FLAGS *neg, prs_struct *ps, int depth)
38 prs_debug(ps, depth, desc, "net_io_neg_flags");
44 if(!prs_uint32("neg_flags", ps, depth, &neg->neg_flags))
50 /*******************************************************************
51 Inits a NETLOGON_INFO_3 structure.
52 ********************************************************************/
54 static void init_netinfo_3(NETLOGON_INFO_3 *info, uint32 flags, uint32 logon_attempts)
57 info->logon_attempts = logon_attempts;
58 info->reserved_1 = 0x0;
59 info->reserved_2 = 0x0;
60 info->reserved_3 = 0x0;
61 info->reserved_4 = 0x0;
62 info->reserved_5 = 0x0;
65 /*******************************************************************
66 Reads or writes a NETLOGON_INFO_3 structure.
67 ********************************************************************/
69 static BOOL net_io_netinfo_3(const char *desc, NETLOGON_INFO_3 *info, prs_struct *ps, int depth)
74 prs_debug(ps, depth, desc, "net_io_netinfo_3");
80 if(!prs_uint32("flags ", ps, depth, &info->flags))
82 if(!prs_uint32("logon_attempts", ps, depth, &info->logon_attempts))
84 if(!prs_uint32("reserved_1 ", ps, depth, &info->reserved_1))
86 if(!prs_uint32("reserved_2 ", ps, depth, &info->reserved_2))
88 if(!prs_uint32("reserved_3 ", ps, depth, &info->reserved_3))
90 if(!prs_uint32("reserved_4 ", ps, depth, &info->reserved_4))
92 if(!prs_uint32("reserved_5 ", ps, depth, &info->reserved_5))
99 /*******************************************************************
100 Inits a NETLOGON_INFO_1 structure.
101 ********************************************************************/
103 static void init_netinfo_1(NETLOGON_INFO_1 *info, uint32 flags, uint32 pdc_status)
106 info->pdc_status = pdc_status;
109 /*******************************************************************
110 Reads or writes a NETLOGON_INFO_1 structure.
111 ********************************************************************/
113 static BOOL net_io_netinfo_1(const char *desc, NETLOGON_INFO_1 *info, prs_struct *ps, int depth)
118 prs_debug(ps, depth, desc, "net_io_netinfo_1");
124 if(!prs_uint32("flags ", ps, depth, &info->flags))
126 if(!prs_uint32("pdc_status", ps, depth, &info->pdc_status))
132 /*******************************************************************
133 Inits a NETLOGON_INFO_2 structure.
134 ********************************************************************/
136 static void init_netinfo_2(NETLOGON_INFO_2 *info, uint32 flags, uint32 pdc_status,
137 uint32 tc_status, const char *trusted_dc_name)
140 info->pdc_status = pdc_status;
141 info->ptr_trusted_dc_name = 1;
142 info->tc_status = tc_status;
144 if (trusted_dc_name != NULL)
145 init_unistr2(&info->uni_trusted_dc_name, trusted_dc_name, UNI_STR_TERMINATE);
147 init_unistr2(&info->uni_trusted_dc_name, "", UNI_STR_TERMINATE);
150 /*******************************************************************
151 Reads or writes a NETLOGON_INFO_2 structure.
152 ********************************************************************/
154 static BOOL net_io_netinfo_2(const char *desc, NETLOGON_INFO_2 *info, prs_struct *ps, int depth)
159 prs_debug(ps, depth, desc, "net_io_netinfo_2");
165 if(!prs_uint32("flags ", ps, depth, &info->flags))
167 if(!prs_uint32("pdc_status ", ps, depth, &info->pdc_status))
169 if(!prs_uint32("ptr_trusted_dc_name", ps, depth, &info->ptr_trusted_dc_name))
171 if(!prs_uint32("tc_status ", ps, depth, &info->tc_status))
174 if (info->ptr_trusted_dc_name != 0) {
175 if(!smb_io_unistr2("unistr2", &info->uni_trusted_dc_name, info->ptr_trusted_dc_name, ps, depth))
185 /*******************************************************************
186 Reads or writes an NET_Q_LOGON_CTRL2 structure.
187 ********************************************************************/
189 BOOL net_io_q_logon_ctrl2(const char *desc, NET_Q_LOGON_CTRL2 *q_l, prs_struct *ps, int depth)
194 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl2");
200 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
203 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
209 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
211 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
213 if(!prs_uint32("switch_value ", ps, depth, &q_l->switch_value))
219 /*******************************************************************
220 Inits an NET_Q_LOGON_CTRL2 structure.
221 ********************************************************************/
223 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2 *q_l, const char *srv_name,
226 DEBUG(5,("init_q_logon_ctrl2\n"));
228 q_l->function_code = 0x01;
229 q_l->query_level = query_level;
230 q_l->switch_value = 0x01;
232 init_unistr2(&q_l->uni_server_name, srv_name, UNI_STR_TERMINATE);
235 /*******************************************************************
236 Inits an NET_R_LOGON_CTRL2 structure.
237 ********************************************************************/
239 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2 *r_l, uint32 query_level,
240 uint32 flags, uint32 pdc_status,
241 uint32 logon_attempts, uint32 tc_status,
242 const char *trusted_domain_name)
244 DEBUG(5,("init_r_logon_ctrl2\n"));
246 r_l->switch_value = query_level; /* should only be 0x1 */
248 switch (query_level) {
250 r_l->ptr = 1; /* undocumented pointer */
251 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
252 r_l->status = NT_STATUS_OK;
255 r_l->ptr = 1; /* undocumented pointer */
256 init_netinfo_2(&r_l->logon.info2, flags, pdc_status,
257 tc_status, trusted_domain_name);
258 r_l->status = NT_STATUS_OK;
261 r_l->ptr = 1; /* undocumented pointer */
262 init_netinfo_3(&r_l->logon.info3, flags, logon_attempts);
263 r_l->status = NT_STATUS_OK;
266 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
268 r_l->ptr = 0; /* undocumented pointer */
270 /* take a guess at an error code... */
271 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
276 /*******************************************************************
277 Reads or writes an NET_R_LOGON_CTRL2 structure.
278 ********************************************************************/
280 BOOL net_io_r_logon_ctrl2(const char *desc, NET_R_LOGON_CTRL2 *r_l, prs_struct *ps, int depth)
285 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl2");
288 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
290 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
294 switch (r_l->switch_value) {
296 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
300 if(!net_io_netinfo_2("", &r_l->logon.info2, ps, depth))
304 if(!net_io_netinfo_3("", &r_l->logon.info3, ps, depth))
308 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
314 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
320 /*******************************************************************
321 Reads or writes an NET_Q_LOGON_CTRL structure.
322 ********************************************************************/
324 BOOL net_io_q_logon_ctrl(const char *desc, NET_Q_LOGON_CTRL *q_l, prs_struct *ps,
327 prs_debug(ps, depth, desc, "net_io_q_logon_ctrl");
333 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
336 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
342 if(!prs_uint32("function_code", ps, depth, &q_l->function_code))
344 if(!prs_uint32("query_level ", ps, depth, &q_l->query_level))
350 /*******************************************************************
351 Inits an NET_Q_LOGON_CTRL structure.
352 ********************************************************************/
354 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL *q_l, const char *srv_name,
357 DEBUG(5,("init_q_logon_ctrl\n"));
359 q_l->function_code = 0x01; /* ??? */
360 q_l->query_level = query_level;
362 init_unistr2(&q_l->uni_server_name, srv_name, UNI_STR_TERMINATE);
365 /*******************************************************************
366 Inits an NET_R_LOGON_CTRL structure.
367 ********************************************************************/
369 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL *r_l, uint32 query_level,
370 uint32 flags, uint32 pdc_status)
372 DEBUG(5,("init_r_logon_ctrl\n"));
374 r_l->switch_value = query_level; /* should only be 0x1 */
376 switch (query_level) {
378 r_l->ptr = 1; /* undocumented pointer */
379 init_netinfo_1(&r_l->logon.info1, flags, pdc_status);
380 r_l->status = NT_STATUS_OK;
383 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
385 r_l->ptr = 0; /* undocumented pointer */
387 /* take a guess at an error code... */
388 r_l->status = NT_STATUS_INVALID_INFO_CLASS;
393 /*******************************************************************
394 Reads or writes an NET_R_LOGON_CTRL structure.
395 ********************************************************************/
397 BOOL net_io_r_logon_ctrl(const char *desc, NET_R_LOGON_CTRL *r_l, prs_struct *ps,
400 prs_debug(ps, depth, desc, "net_io_r_logon_ctrl");
403 if(!prs_uint32("switch_value ", ps, depth, &r_l->switch_value))
405 if(!prs_uint32("ptr ", ps, depth, &r_l->ptr))
409 switch (r_l->switch_value) {
411 if(!net_io_netinfo_1("", &r_l->logon.info1, ps, depth))
415 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
421 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
427 /*******************************************************************
428 Inits an NET_R_TRUST_DOM_LIST structure.
429 ********************************************************************/
431 void init_r_trust_dom(NET_R_TRUST_DOM_LIST *r_t,
432 uint32 num_doms, const char *dom_name)
436 DEBUG(5,("init_r_trust_dom\n"));
438 for (i = 0; i < MAX_TRUST_DOMS; i++) {
439 r_t->uni_trust_dom_name[i].uni_str_len = 0;
440 r_t->uni_trust_dom_name[i].uni_max_len = 0;
442 if (num_doms > MAX_TRUST_DOMS)
443 num_doms = MAX_TRUST_DOMS;
445 for (i = 0; i < num_doms; i++) {
447 fstrcpy(domain_name, dom_name);
448 strupper_m(domain_name);
449 init_unistr2(&r_t->uni_trust_dom_name[i], domain_name, UNI_STR_TERMINATE);
450 /* the use of UNISTR2 here is non-standard. */
451 r_t->uni_trust_dom_name[i].offset = 0x1;
454 r_t->status = NT_STATUS_OK;
457 /*******************************************************************
458 Reads or writes an NET_R_TRUST_DOM_LIST structure.
459 ********************************************************************/
461 BOOL net_io_r_trust_dom(const char *desc, NET_R_TRUST_DOM_LIST *r_t, prs_struct *ps, int depth)
468 prs_debug(ps, depth, desc, "net_io_r_trust_dom");
471 /* temporary code to give a valid response */
473 if(!prs_uint32("status", ps, depth, &value))
477 if(!prs_uint32("status", ps, depth, &value))
480 if(!prs_uint32("status", ps, depth, &value))
484 if(!prs_uint32("status", ps, depth, &value))
488 if(!prs_uint32("status", ps, depth, &value))
491 /* old non working code */
495 for (i = 0; i < MAX_TRUST_DOMS; i++) {
496 if (r_t->uni_trust_dom_name[i].uni_str_len == 0)
498 if(!smb_io_unistr2("", &r_t->uni_trust_dom_name[i], True, ps, depth))
502 if(!prs_ntstatus("status", ps, depth, &r_t->status))
509 /*******************************************************************
510 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
511 ********************************************************************/
513 BOOL net_io_q_trust_dom(const char *desc, NET_Q_TRUST_DOM_LIST *q_l, prs_struct *ps, int depth)
518 prs_debug(ps, depth, desc, "net_io_q_trust_dom");
521 if(!prs_uint32("ptr ", ps, depth, &q_l->ptr))
523 if(!smb_io_unistr2 ("", &q_l->uni_server_name, q_l->ptr, ps, depth))
529 /*******************************************************************
530 Inits an NET_Q_REQ_CHAL structure.
531 ********************************************************************/
533 void init_q_req_chal(NET_Q_REQ_CHAL *q_c,
534 const char *logon_srv, const char *logon_clnt,
537 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
539 q_c->undoc_buffer = 1; /* don't know what this buffer is */
541 init_unistr2(&q_c->uni_logon_srv, logon_srv , UNI_STR_TERMINATE);
542 init_unistr2(&q_c->uni_logon_clnt, logon_clnt, UNI_STR_TERMINATE);
544 memcpy(q_c->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
546 DEBUG(5,("init_q_req_chal: %d\n", __LINE__));
549 /*******************************************************************
550 Reads or writes an NET_Q_REQ_CHAL structure.
551 ********************************************************************/
553 BOOL net_io_q_req_chal(const char *desc, NET_Q_REQ_CHAL *q_c, prs_struct *ps, int depth)
558 prs_debug(ps, depth, desc, "net_io_q_req_chal");
564 if(!prs_uint32("undoc_buffer", ps, depth, &q_c->undoc_buffer))
567 if(!smb_io_unistr2("", &q_c->uni_logon_srv, True, ps, depth)) /* logon server unicode string */
569 if(!smb_io_unistr2("", &q_c->uni_logon_clnt, True, ps, depth)) /* logon client unicode string */
572 if(!smb_io_chal("", &q_c->clnt_chal, ps, depth))
578 /*******************************************************************
579 Reads or writes a structure.
580 ********************************************************************/
582 BOOL net_io_r_req_chal(const char *desc, NET_R_REQ_CHAL *r_c, prs_struct *ps, int depth)
587 prs_debug(ps, depth, desc, "net_io_r_req_chal");
593 if(!smb_io_chal("", &r_c->srv_chal, ps, depth)) /* server challenge */
596 if(!prs_ntstatus("status", ps, depth, &r_c->status))
603 /*******************************************************************
604 Reads or writes a structure.
605 ********************************************************************/
607 BOOL net_io_q_auth(const char *desc, NET_Q_AUTH *q_a, prs_struct *ps, int depth)
612 prs_debug(ps, depth, desc, "net_io_q_auth");
618 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
620 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
626 /*******************************************************************
627 Reads or writes a structure.
628 ********************************************************************/
630 BOOL net_io_r_auth(const char *desc, NET_R_AUTH *r_a, prs_struct *ps, int depth)
635 prs_debug(ps, depth, desc, "net_io_r_auth");
641 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
644 if(!prs_ntstatus("status", ps, depth, &r_a->status))
650 /*******************************************************************
651 Inits a NET_Q_AUTH_2 struct.
652 ********************************************************************/
654 void init_q_auth_2(NET_Q_AUTH_2 *q_a,
655 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
656 DOM_CHAL *clnt_chal, uint32 clnt_flgs)
658 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
660 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
661 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
662 q_a->clnt_flgs.neg_flags = clnt_flgs;
664 DEBUG(5,("init_q_auth_2: %d\n", __LINE__));
667 /*******************************************************************
668 Reads or writes a structure.
669 ********************************************************************/
671 BOOL net_io_q_auth_2(const char *desc, NET_Q_AUTH_2 *q_a, prs_struct *ps, int depth)
676 prs_debug(ps, depth, desc, "net_io_q_auth_2");
682 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
684 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
686 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
692 /*******************************************************************
693 Reads or writes a structure.
694 ********************************************************************/
696 BOOL net_io_r_auth_2(const char *desc, NET_R_AUTH_2 *r_a, prs_struct *ps, int depth)
701 prs_debug(ps, depth, desc, "net_io_r_auth_2");
707 if(!smb_io_chal("", &r_a->srv_chal, ps, depth)) /* server challenge */
709 if(!net_io_neg_flags("", &r_a->srv_flgs, ps, depth))
712 if(!prs_ntstatus("status", ps, depth, &r_a->status))
718 /*******************************************************************
719 Inits a NET_Q_AUTH_3 struct.
720 ********************************************************************/
722 void init_q_auth_3(NET_Q_AUTH_3 *q_a,
723 const char *logon_srv, const char *acct_name, uint16 sec_chan, const char *comp_name,
724 DOM_CHAL *clnt_chal, uint32 clnt_flgs)
726 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
728 init_log_info(&q_a->clnt_id, logon_srv, acct_name, sec_chan, comp_name);
729 memcpy(q_a->clnt_chal.data, clnt_chal->data, sizeof(clnt_chal->data));
730 q_a->clnt_flgs.neg_flags = clnt_flgs;
732 DEBUG(5,("init_q_auth_3: %d\n", __LINE__));
735 /*******************************************************************
736 Reads or writes a structure.
737 ********************************************************************/
739 BOOL net_io_q_auth_3(const char *desc, NET_Q_AUTH_3 *q_a, prs_struct *ps, int depth)
744 prs_debug(ps, depth, desc, "net_io_q_auth_3");
750 if(!smb_io_log_info ("", &q_a->clnt_id, ps, depth)) /* client identification info */
752 if(!smb_io_chal("", &q_a->clnt_chal, ps, depth))
754 if(!net_io_neg_flags("", &q_a->clnt_flgs, ps, depth))
760 /*******************************************************************
761 Reads or writes a structure.
762 ********************************************************************/
764 BOOL net_io_r_auth_3(const char *desc, NET_R_AUTH_3 *r_a, prs_struct *ps, int depth)
769 prs_debug(ps, depth, desc, "net_io_r_auth_3");
775 if(!smb_io_chal("srv_chal", &r_a->srv_chal, ps, depth)) /* server challenge */
777 if(!net_io_neg_flags("srv_flgs", &r_a->srv_flgs, ps, depth))
779 if (!prs_uint32("unknown", ps, depth, &r_a->unknown))
782 if(!prs_ntstatus("status", ps, depth, &r_a->status))
789 /*******************************************************************
790 Inits a NET_Q_SRV_PWSET.
791 ********************************************************************/
793 void init_q_srv_pwset(NET_Q_SRV_PWSET *q_s,
794 const char *logon_srv, const char *sess_key, const char *acct_name,
795 uint16 sec_chan, const char *comp_name,
796 DOM_CRED *cred, uchar hashed_mach_pwd[16])
798 unsigned char nt_cypher[16];
800 DEBUG(5,("init_q_srv_pwset\n"));
802 /* Process the new password. */
803 cred_hash3( nt_cypher, hashed_mach_pwd, (const unsigned char *)sess_key, 1);
805 init_clnt_info(&q_s->clnt_id, logon_srv, acct_name, sec_chan, comp_name, cred);
807 memcpy(q_s->pwd, nt_cypher, sizeof(q_s->pwd));
810 /*******************************************************************
811 Reads or writes a structure.
812 ********************************************************************/
814 BOOL net_io_q_srv_pwset(const char *desc, NET_Q_SRV_PWSET *q_s, prs_struct *ps, int depth)
819 prs_debug(ps, depth, desc, "net_io_q_srv_pwset");
825 if(!smb_io_clnt_info("", &q_s->clnt_id, ps, depth)) /* client identification/authentication info */
827 if(!prs_uint8s (False, "pwd", ps, depth, q_s->pwd, 16)) /* new password - undocumented */
833 /*******************************************************************
834 Reads or writes a structure.
835 ********************************************************************/
837 BOOL net_io_r_srv_pwset(const char *desc, NET_R_SRV_PWSET *r_s, prs_struct *ps, int depth)
842 prs_debug(ps, depth, desc, "net_io_r_srv_pwset");
848 if(!smb_io_cred("", &r_s->srv_cred, ps, depth)) /* server challenge */
851 if(!prs_ntstatus("status", ps, depth, &r_s->status))
857 /*************************************************************************
858 Init DOM_SID2 array from a string containing multiple sids
859 *************************************************************************/
861 static int init_dom_sid2s(TALLOC_CTX *ctx, const char *sids_str, DOM_SID2 **ppsids)
867 DEBUG(4,("init_dom_sid2s: %s\n", sids_str ? sids_str:""));
875 /* Count the number of valid SIDs. */
876 for (count = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
878 if (string_to_sid(&tmpsid, s2))
882 /* Now allocate space for them. */
883 *ppsids = (DOM_SID2 *)talloc_zero(ctx, count * sizeof(DOM_SID2));
889 for (number = 0, ptr = sids_str; next_token(&ptr, s2, NULL, sizeof(s2)); ) {
891 if (string_to_sid(&tmpsid, s2)) {
892 /* count only valid sids */
893 init_dom_sid2(&sids[number], &tmpsid);
902 /*******************************************************************
903 Inits a NET_ID_INFO_1 structure.
904 ********************************************************************/
906 void init_id_info1(NET_ID_INFO_1 *id, const char *domain_name,
907 uint32 param_ctrl, uint32 log_id_low, uint32 log_id_high,
908 const char *user_name, const char *wksta_name,
909 const char *sess_key,
910 unsigned char lm_cypher[16], unsigned char nt_cypher[16])
912 unsigned char lm_owf[16];
913 unsigned char nt_owf[16];
915 DEBUG(5,("init_id_info1: %d\n", __LINE__));
917 id->ptr_id_info1 = 1;
919 id->param_ctrl = param_ctrl;
920 init_logon_id(&id->logon_id, log_id_low, log_id_high);
923 if (lm_cypher && nt_cypher) {
924 unsigned char key[16];
925 #ifdef DEBUG_PASSWORD
926 DEBUG(100,("lm cypher:"));
927 dump_data(100, (char *)lm_cypher, 16);
929 DEBUG(100,("nt cypher:"));
930 dump_data(100, (char *)nt_cypher, 16);
934 memcpy(key, sess_key, 8);
936 memcpy(lm_owf, lm_cypher, 16);
937 SamOEMhash(lm_owf, key, 16);
938 memcpy(nt_owf, nt_cypher, 16);
939 SamOEMhash(nt_owf, key, 16);
941 #ifdef DEBUG_PASSWORD
942 DEBUG(100,("encrypt of lm owf password:"));
943 dump_data(100, (char *)lm_owf, 16);
945 DEBUG(100,("encrypt of nt owf password:"));
946 dump_data(100, (char *)nt_owf, 16);
948 /* set up pointers to cypher blocks */
953 init_owf_info(&id->lm_owf, lm_cypher);
954 init_owf_info(&id->nt_owf, nt_cypher);
956 init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
957 init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
958 init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
959 init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
960 init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
961 init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
964 /*******************************************************************
965 Reads or writes an NET_ID_INFO_1 structure.
966 ********************************************************************/
968 static BOOL net_io_id_info1(const char *desc, NET_ID_INFO_1 *id, prs_struct *ps, int depth)
973 prs_debug(ps, depth, desc, "net_io_id_info1");
979 if(!prs_uint32("ptr_id_info1", ps, depth, &id->ptr_id_info1))
982 if (id->ptr_id_info1 != 0) {
983 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
986 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
988 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
991 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
993 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
996 if(!smb_io_owf_info("", &id->lm_owf, ps, depth))
998 if(!smb_io_owf_info("", &id->nt_owf, ps, depth))
1001 if(!smb_io_unistr2("unistr2", &id->uni_domain_name,
1002 id->hdr_domain_name.buffer, ps, depth))
1004 if(!smb_io_unistr2("unistr2", &id->uni_user_name,
1005 id->hdr_user_name.buffer, ps, depth))
1007 if(!smb_io_unistr2("unistr2", &id->uni_wksta_name,
1008 id->hdr_wksta_name.buffer, ps, depth))
1015 /*******************************************************************
1016 Inits a NET_ID_INFO_2 structure.
1018 This is a network logon packet. The log_id parameters
1019 are what an NT server would generate for LUID once the
1020 user is logged on. I don't think we care about them.
1022 Note that this has no access to the NT and LM hashed passwords,
1023 so it forwards the challenge, and the NT and LM responses (24
1024 bytes each) over the secure channel to the Domain controller
1025 for it to say yea or nay. This is the preferred method of
1026 checking for a logon as it doesn't export the password
1027 hashes to anyone who has compromised the secure channel. JRA.
1028 ********************************************************************/
1030 void init_id_info2(NET_ID_INFO_2 * id, const char *domain_name,
1032 uint32 log_id_low, uint32 log_id_high,
1033 const char *user_name, const char *wksta_name,
1034 const uchar lm_challenge[8],
1035 const uchar * lm_chal_resp, size_t lm_chal_resp_len,
1036 const uchar * nt_chal_resp, size_t nt_chal_resp_len)
1038 unsigned char lm_owf[24];
1039 unsigned char nt_owf[128];
1041 DEBUG(5,("init_id_info2: %d\n", __LINE__));
1043 id->ptr_id_info2 = 1;
1046 id->param_ctrl = param_ctrl;
1047 init_logon_id(&id->logon_id, log_id_low, log_id_high);
1050 /* oops. can only send what-ever-it-is direct */
1051 memcpy(nt_owf, nt_chal_resp, MIN(sizeof(nt_owf), nt_chal_resp_len));
1052 nt_chal_resp = nt_owf;
1055 /* oops. can only send what-ever-it-is direct */
1056 memcpy(lm_owf, lm_chal_resp, MIN(sizeof(lm_owf), lm_chal_resp_len));
1057 lm_chal_resp = lm_owf;
1060 memcpy(id->lm_chal, lm_challenge, sizeof(id->lm_chal));
1061 init_str_hdr(&id->hdr_nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len, (nt_chal_resp != NULL) ? 1 : 0);
1062 init_str_hdr(&id->hdr_lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len, (lm_chal_resp != NULL) ? 1 : 0);
1064 init_unistr2(&id->uni_domain_name, domain_name, UNI_FLAGS_NONE);
1065 init_uni_hdr(&id->hdr_domain_name, &id->uni_domain_name);
1066 init_unistr2(&id->uni_user_name, user_name, UNI_FLAGS_NONE);
1067 init_uni_hdr(&id->hdr_user_name, &id->uni_user_name);
1068 init_unistr2(&id->uni_wksta_name, wksta_name, UNI_FLAGS_NONE);
1069 init_uni_hdr(&id->hdr_wksta_name, &id->uni_wksta_name);
1071 init_string2(&id->nt_chal_resp, (const char *)nt_chal_resp, nt_chal_resp_len, nt_chal_resp_len);
1072 init_string2(&id->lm_chal_resp, (const char *)lm_chal_resp, lm_chal_resp_len, lm_chal_resp_len);
1076 /*******************************************************************
1077 Reads or writes an NET_ID_INFO_2 structure.
1078 ********************************************************************/
1080 static BOOL net_io_id_info2(const char *desc, NET_ID_INFO_2 *id, prs_struct *ps, int depth)
1085 prs_debug(ps, depth, desc, "net_io_id_info2");
1091 if(!prs_uint32("ptr_id_info2", ps, depth, &id->ptr_id_info2))
1094 if (id->ptr_id_info2 != 0) {
1095 if(!smb_io_unihdr("unihdr", &id->hdr_domain_name, ps, depth))
1098 if(!prs_uint32("param_ctrl", ps, depth, &id->param_ctrl))
1100 if(!smb_io_logon_id("", &id->logon_id, ps, depth))
1103 if(!smb_io_unihdr("unihdr", &id->hdr_user_name, ps, depth))
1105 if(!smb_io_unihdr("unihdr", &id->hdr_wksta_name, ps, depth))
1108 if(!prs_uint8s (False, "lm_chal", ps, depth, id->lm_chal, 8)) /* lm 8 byte challenge */
1111 if(!smb_io_strhdr("hdr_nt_chal_resp", &id->hdr_nt_chal_resp, ps, depth))
1113 if(!smb_io_strhdr("hdr_lm_chal_resp", &id->hdr_lm_chal_resp, ps, depth))
1116 if(!smb_io_unistr2("uni_domain_name", &id->uni_domain_name,
1117 id->hdr_domain_name.buffer, ps, depth))
1119 if(!smb_io_unistr2("uni_user_name ", &id->uni_user_name,
1120 id->hdr_user_name.buffer, ps, depth))
1122 if(!smb_io_unistr2("uni_wksta_name ", &id->uni_wksta_name,
1123 id->hdr_wksta_name.buffer, ps, depth))
1125 if(!smb_io_string2("nt_chal_resp", &id->nt_chal_resp,
1126 id->hdr_nt_chal_resp.buffer, ps, depth))
1128 if(!smb_io_string2("lm_chal_resp", &id->lm_chal_resp,
1129 id->hdr_lm_chal_resp.buffer, ps, depth))
1137 /*******************************************************************
1138 Inits a DOM_SAM_INFO structure.
1139 ********************************************************************/
1141 void init_sam_info(DOM_SAM_INFO *sam,
1142 const char *logon_srv, const char *comp_name,
1143 DOM_CRED *clnt_cred,
1144 DOM_CRED *rtn_cred, uint16 logon_level,
1145 NET_ID_INFO_CTR *ctr)
1147 DEBUG(5,("init_sam_info: %d\n", __LINE__));
1149 init_clnt_info2(&sam->client, logon_srv, comp_name, clnt_cred);
1151 if (rtn_cred != NULL) {
1152 sam->ptr_rtn_cred = 1;
1153 memcpy(&sam->rtn_cred, rtn_cred, sizeof(sam->rtn_cred));
1155 sam->ptr_rtn_cred = 0;
1158 sam->logon_level = logon_level;
1162 /*******************************************************************
1163 Reads or writes a DOM_SAM_INFO structure.
1164 ********************************************************************/
1166 static BOOL net_io_id_info_ctr(const char *desc, NET_ID_INFO_CTR **pp_ctr, prs_struct *ps, int depth)
1168 NET_ID_INFO_CTR *ctr = *pp_ctr;
1170 prs_debug(ps, depth, desc, "smb_io_sam_info");
1173 if (UNMARSHALLING(ps)) {
1174 ctr = *pp_ctr = (NET_ID_INFO_CTR *)prs_alloc_mem(ps, sizeof(NET_ID_INFO_CTR));
1182 /* don't 4-byte align here! */
1184 if(!prs_uint16("switch_value ", ps, depth, &ctr->switch_value))
1187 switch (ctr->switch_value) {
1189 if(!net_io_id_info1("", &ctr->auth.id1, ps, depth))
1193 if(!net_io_id_info2("", &ctr->auth.id2, ps, depth))
1198 DEBUG(4,("smb_io_sam_info: unknown switch_value!\n"));
1205 /*******************************************************************
1206 Reads or writes a DOM_SAM_INFO structure.
1207 ********************************************************************/
1209 static BOOL smb_io_sam_info(const char *desc, DOM_SAM_INFO *sam, prs_struct *ps, int depth)
1214 prs_debug(ps, depth, desc, "smb_io_sam_info");
1220 if(!smb_io_clnt_info2("", &sam->client, ps, depth))
1223 if(!prs_uint32("ptr_rtn_cred ", ps, depth, &sam->ptr_rtn_cred))
1225 if(!smb_io_cred("", &sam->rtn_cred, ps, depth))
1228 if(!prs_uint16("logon_level ", ps, depth, &sam->logon_level))
1231 if (sam->logon_level != 0) {
1232 if(!net_io_id_info_ctr("logon_info", &sam->ctr, ps, depth))
1239 /*************************************************************************
1240 Inits a NET_USER_INFO_3 structure.
1242 This is a network logon reply packet, and contains much information about
1243 the user. This information is passed as a (very long) paramater list
1244 to avoid having to link in the PASSDB code to every program that deals
1246 *************************************************************************/
1248 void init_net_user_info3(TALLOC_CTX *ctx, NET_USER_INFO_3 *usr,
1252 const char* user_name,
1253 const char* full_name,
1254 const char* home_dir,
1255 const char* dir_drive,
1256 const char* logon_script,
1257 const char* profile_path,
1259 time_t unix_logon_time,
1260 time_t unix_logoff_time,
1261 time_t unix_kickoff_time,
1262 time_t unix_pass_last_set_time,
1263 time_t unix_pass_can_change_time,
1264 time_t unix_pass_must_change_time,
1266 uint16 logon_count, uint16 bad_pw_count,
1267 uint32 num_groups, const DOM_GID *gids,
1268 uint32 user_flgs, uchar nt_session_key[16],
1269 uchar lm_session_key[16],
1270 const char *logon_srv, const char *logon_dom,
1271 const DOM_SID *dom_sid, const char *other_sids)
1273 /* only cope with one "other" sid, right now. */
1274 /* need to count the number of space-delimited sids */
1276 int num_other_sids = 0;
1278 NTTIME logon_time, logoff_time, kickoff_time,
1279 pass_last_set_time, pass_can_change_time,
1280 pass_must_change_time;
1284 usr->ptr_user_info = 1; /* yes, we're bothering to put USER_INFO data here */
1286 /* Create NTTIME structs */
1287 unix_to_nt_time (&logon_time, unix_logon_time);
1288 unix_to_nt_time (&logoff_time, unix_logoff_time);
1289 unix_to_nt_time (&kickoff_time, unix_kickoff_time);
1290 unix_to_nt_time (&pass_last_set_time, unix_pass_last_set_time);
1291 unix_to_nt_time (&pass_can_change_time, unix_pass_can_change_time);
1292 unix_to_nt_time (&pass_must_change_time, unix_pass_must_change_time);
1294 usr->logon_time = logon_time;
1295 usr->logoff_time = logoff_time;
1296 usr->kickoff_time = kickoff_time;
1297 usr->pass_last_set_time = pass_last_set_time;
1298 usr->pass_can_change_time = pass_can_change_time;
1299 usr->pass_must_change_time = pass_must_change_time;
1301 usr->logon_count = logon_count;
1302 usr->bad_pw_count = bad_pw_count;
1304 usr->user_rid = user_rid;
1305 usr->group_rid = group_rid;
1306 usr->num_groups = num_groups;
1308 usr->buffer_groups = 1; /* indicates fill in groups, below, even if there are none */
1309 usr->user_flgs = user_flgs;
1311 if (nt_session_key != NULL)
1312 memcpy(usr->user_sess_key, nt_session_key, sizeof(usr->user_sess_key));
1314 memset((char *)usr->user_sess_key, '\0', sizeof(usr->user_sess_key));
1316 usr->buffer_dom_id = dom_sid ? 1 : 0; /* yes, we're bothering to put a domain SID in */
1318 memset((char *)usr->padding, '\0', sizeof(usr->padding));
1320 if (lm_session_key != NULL)
1321 memcpy(usr->padding, lm_session_key, sizeof(usr->user_sess_key));
1324 num_other_sids = init_dom_sid2s(ctx, other_sids, &usr->other_sids);
1326 usr->num_other_sids = num_other_sids;
1327 usr->buffer_other_sids = (num_other_sids != 0) ? 1 : 0;
1329 init_unistr2(&usr->uni_user_name, user_name, UNI_FLAGS_NONE);
1330 init_uni_hdr(&usr->hdr_user_name, &usr->uni_user_name);
1331 init_unistr2(&usr->uni_full_name, full_name, UNI_FLAGS_NONE);
1332 init_uni_hdr(&usr->hdr_full_name, &usr->uni_full_name);
1333 init_unistr2(&usr->uni_logon_script, logon_script, UNI_FLAGS_NONE);
1334 init_uni_hdr(&usr->hdr_logon_script, &usr->uni_logon_script);
1335 init_unistr2(&usr->uni_profile_path, profile_path, UNI_FLAGS_NONE);
1336 init_uni_hdr(&usr->hdr_profile_path, &usr->uni_profile_path);
1337 init_unistr2(&usr->uni_home_dir, home_dir, UNI_FLAGS_NONE);
1338 init_uni_hdr(&usr->hdr_home_dir, &usr->uni_home_dir);
1339 init_unistr2(&usr->uni_dir_drive, dir_drive, UNI_FLAGS_NONE);
1340 init_uni_hdr(&usr->hdr_dir_drive, &usr->uni_dir_drive);
1342 usr->num_groups2 = num_groups;
1344 usr->gids = (DOM_GID *)talloc_zero(ctx,sizeof(DOM_GID) * (num_groups));
1345 if (usr->gids == NULL && num_groups>0)
1348 for (i = 0; i < num_groups; i++)
1349 usr->gids[i] = gids[i];
1351 init_unistr2(&usr->uni_logon_srv, logon_srv, UNI_FLAGS_NONE);
1352 init_uni_hdr(&usr->hdr_logon_srv, &usr->uni_logon_srv);
1353 init_unistr2(&usr->uni_logon_dom, logon_dom, UNI_FLAGS_NONE);
1354 init_uni_hdr(&usr->hdr_logon_dom, &usr->uni_logon_dom);
1356 init_dom_sid2(&usr->dom_sid, dom_sid);
1357 /* "other" sids are set up above */
1360 /*******************************************************************
1361 This code has been modified to cope with a NET_USER_INFO_2 - which is
1362 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1363 We use validation level to determine if we're marshalling a info 2 or
1364 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1365 Jacobsen at HP. JRA.
1366 ********************************************************************/
1368 BOOL net_io_user_info3(const char *desc, NET_USER_INFO_3 *usr, prs_struct *ps,
1369 int depth, uint16 validation_level)
1376 prs_debug(ps, depth, desc, "net_io_user_info3");
1379 if (UNMARSHALLING(ps))
1385 if(!prs_uint32("ptr_user_info ", ps, depth, &usr->ptr_user_info))
1388 if (usr->ptr_user_info == 0)
1391 if(!smb_io_time("logon time", &usr->logon_time, ps, depth)) /* logon time */
1393 if(!smb_io_time("logoff time", &usr->logoff_time, ps, depth)) /* logoff time */
1395 if(!smb_io_time("kickoff time", &usr->kickoff_time, ps, depth)) /* kickoff time */
1397 if(!smb_io_time("last set time", &usr->pass_last_set_time, ps, depth)) /* password last set time */
1399 if(!smb_io_time("can change time", &usr->pass_can_change_time , ps, depth)) /* password can change time */
1401 if(!smb_io_time("must change time", &usr->pass_must_change_time, ps, depth)) /* password must change time */
1404 if(!smb_io_unihdr("hdr_user_name", &usr->hdr_user_name, ps, depth)) /* username unicode string header */
1406 if(!smb_io_unihdr("hdr_full_name", &usr->hdr_full_name, ps, depth)) /* user's full name unicode string header */
1408 if(!smb_io_unihdr("hdr_logon_script", &usr->hdr_logon_script, ps, depth)) /* logon script unicode string header */
1410 if(!smb_io_unihdr("hdr_profile_path", &usr->hdr_profile_path, ps, depth)) /* profile path unicode string header */
1412 if(!smb_io_unihdr("hdr_home_dir", &usr->hdr_home_dir, ps, depth)) /* home directory unicode string header */
1414 if(!smb_io_unihdr("hdr_dir_drive", &usr->hdr_dir_drive, ps, depth)) /* home directory drive unicode string header */
1417 if(!prs_uint16("logon_count ", ps, depth, &usr->logon_count)) /* logon count */
1419 if(!prs_uint16("bad_pw_count ", ps, depth, &usr->bad_pw_count)) /* bad password count */
1422 if(!prs_uint32("user_rid ", ps, depth, &usr->user_rid)) /* User RID */
1424 if(!prs_uint32("group_rid ", ps, depth, &usr->group_rid)) /* Group RID */
1426 if(!prs_uint32("num_groups ", ps, depth, &usr->num_groups)) /* num groups */
1428 if(!prs_uint32("buffer_groups ", ps, depth, &usr->buffer_groups)) /* undocumented buffer pointer to groups. */
1430 if(!prs_uint32("user_flgs ", ps, depth, &usr->user_flgs)) /* user flags */
1433 if(!prs_uint8s(False, "user_sess_key", ps, depth, usr->user_sess_key, 16)) /* user session key */
1436 if(!smb_io_unihdr("hdr_logon_srv", &usr->hdr_logon_srv, ps, depth)) /* logon server unicode string header */
1438 if(!smb_io_unihdr("hdr_logon_dom", &usr->hdr_logon_dom, ps, depth)) /* logon domain unicode string header */
1441 if(!prs_uint32("buffer_dom_id ", ps, depth, &usr->buffer_dom_id)) /* undocumented logon domain id pointer */
1443 if(!prs_uint8s (False, "padding ", ps, depth, usr->padding, 40)) /* unused padding bytes? */
1446 if (validation_level == 3) {
1447 if(!prs_uint32("num_other_sids", ps, depth, &usr->num_other_sids)) /* 0 - num_sids */
1449 if(!prs_uint32("buffer_other_sids", ps, depth, &usr->buffer_other_sids)) /* NULL - undocumented pointer to SIDs. */
1452 if (UNMARSHALLING(ps)) {
1453 usr->num_other_sids = 0;
1454 usr->buffer_other_sids = 0;
1458 if(!smb_io_unistr2("uni_user_name", &usr->uni_user_name, usr->hdr_user_name.buffer, ps, depth)) /* username unicode string */
1460 if(!smb_io_unistr2("uni_full_name", &usr->uni_full_name, usr->hdr_full_name.buffer, ps, depth)) /* user's full name unicode string */
1462 if(!smb_io_unistr2("uni_logon_script", &usr->uni_logon_script, usr->hdr_logon_script.buffer, ps, depth)) /* logon script unicode string */
1464 if(!smb_io_unistr2("uni_profile_path", &usr->uni_profile_path, usr->hdr_profile_path.buffer, ps, depth)) /* profile path unicode string */
1466 if(!smb_io_unistr2("uni_home_dir", &usr->uni_home_dir, usr->hdr_home_dir.buffer, ps, depth)) /* home directory unicode string */
1468 if(!smb_io_unistr2("uni_dir_drive", &usr->uni_dir_drive, usr->hdr_dir_drive.buffer, ps, depth)) /* home directory drive unicode string */
1473 if(!prs_uint32("num_groups2 ", ps, depth, &usr->num_groups2)) /* num groups */
1476 if (UNMARSHALLING(ps) && usr->num_groups2 > 0) {
1477 usr->gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_groups2);
1478 if (usr->gids == NULL)
1482 for (i = 0; i < usr->num_groups2; i++) {
1483 if(!smb_io_gid("", &usr->gids[i], ps, depth)) /* group info */
1487 if(!smb_io_unistr2("uni_logon_srv", &usr->uni_logon_srv, usr->hdr_logon_srv.buffer, ps, depth)) /* logon server unicode string */
1489 if(!smb_io_unistr2("uni_logon_dom", &usr->uni_logon_dom, usr->hdr_logon_srv.buffer, ps, depth)) /* logon domain unicode string */
1492 if(!smb_io_dom_sid2("", &usr->dom_sid, ps, depth)) /* domain SID */
1495 if (usr->num_other_sids) {
1497 if (UNMARSHALLING(ps)) {
1498 usr->other_sids = (DOM_SID2 *)prs_alloc_mem(ps, sizeof(DOM_SID2)*usr->num_other_sids);
1499 if (usr->other_sids == NULL)
1503 if(!prs_uint32("num_other_groups", ps, depth, &usr->num_other_groups))
1506 if (UNMARSHALLING(ps) && usr->num_other_groups > 0) {
1507 usr->other_gids = (DOM_GID *)prs_alloc_mem(ps, sizeof(DOM_GID)*usr->num_other_groups);
1508 if (usr->other_gids == NULL)
1512 for (i = 0; i < usr->num_other_groups; i++) {
1513 if(!smb_io_gid("", &usr->other_gids[i], ps, depth)) /* other GIDs */
1516 for (i = 0; i < usr->num_other_sids; i++) {
1517 if(!smb_io_dom_sid2("", &usr->other_sids[i], ps, depth)) /* other domain SIDs */
1525 /*******************************************************************
1526 Reads or writes a structure.
1527 ********************************************************************/
1529 BOOL net_io_q_sam_logon(const char *desc, NET_Q_SAM_LOGON *q_l, prs_struct *ps, int depth)
1534 prs_debug(ps, depth, desc, "net_io_q_sam_logon");
1540 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth))
1543 if(!prs_uint16("validation_level", ps, depth, &q_l->validation_level))
1549 /*******************************************************************
1550 Reads or writes a structure.
1551 ********************************************************************/
1553 BOOL net_io_r_sam_logon(const char *desc, NET_R_SAM_LOGON *r_l, prs_struct *ps, int depth)
1558 prs_debug(ps, depth, desc, "net_io_r_sam_logon");
1561 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1563 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1566 if(!prs_uint16("switch_value", ps, depth, &r_l->switch_value))
1571 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1572 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1575 if (r_l->switch_value != 0) {
1576 if(!net_io_user_info3("", r_l->user, ps, depth, r_l->switch_value))
1581 if(!prs_uint32("auth_resp ", ps, depth, &r_l->auth_resp)) /* 1 - Authoritative response; 0 - Non-Auth? */
1584 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1593 /*******************************************************************
1594 Reads or writes a structure.
1595 ********************************************************************/
1597 BOOL net_io_q_sam_logoff(const char *desc, NET_Q_SAM_LOGOFF *q_l, prs_struct *ps, int depth)
1602 prs_debug(ps, depth, desc, "net_io_q_sam_logoff");
1608 if(!smb_io_sam_info("", &q_l->sam_id, ps, depth)) /* domain SID */
1614 /*******************************************************************
1615 Reads or writes a structure.
1616 ********************************************************************/
1618 BOOL net_io_r_sam_logoff(const char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int depth)
1623 prs_debug(ps, depth, desc, "net_io_r_sam_logoff");
1629 if(!prs_uint32("buffer_creds", ps, depth, &r_l->buffer_creds)) /* undocumented buffer pointer */
1631 if(!smb_io_cred("", &r_l->srv_creds, ps, depth)) /* server credentials. server time stamp appears to be ignored. */
1634 if(!prs_ntstatus("status ", ps, depth, &r_l->status))
1640 /*******************************************************************
1641 makes a NET_Q_SAM_SYNC structure.
1642 ********************************************************************/
1643 BOOL init_net_q_sam_sync(NET_Q_SAM_SYNC * q_s, const char *srv_name,
1644 const char *cli_name, DOM_CRED *cli_creds,
1645 DOM_CRED *ret_creds, uint32 database_id,
1648 DEBUG(5, ("init_q_sam_sync\n"));
1650 init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
1651 init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
1654 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
1657 memcpy(&q_s->ret_creds, ret_creds, sizeof(q_s->ret_creds));
1659 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
1661 q_s->database_id = database_id;
1662 q_s->restart_state = 0;
1663 q_s->sync_context = next_rid;
1664 q_s->max_size = 0xffff;
1669 /*******************************************************************
1670 reads or writes a structure.
1671 ********************************************************************/
1672 BOOL net_io_q_sam_sync(const char *desc, NET_Q_SAM_SYNC * q_s, prs_struct *ps,
1675 prs_debug(ps, depth, desc, "net_io_q_sam_sync");
1678 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
1680 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
1683 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
1685 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
1688 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
1690 if (!prs_uint32("restart_state", ps, depth, &q_s->restart_state))
1692 if (!prs_uint32("sync_context ", ps, depth, &q_s->sync_context))
1695 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
1701 /*******************************************************************
1702 reads or writes a structure.
1703 ********************************************************************/
1704 static BOOL net_io_sam_delta_hdr(const char *desc, SAM_DELTA_HDR * delta,
1705 prs_struct *ps, int depth)
1707 prs_debug(ps, depth, desc, "net_io_sam_delta_hdr");
1710 if (!prs_uint16("type", ps, depth, &delta->type))
1712 if (!prs_uint16("type2", ps, depth, &delta->type2))
1714 if (!prs_uint32("target_rid", ps, depth, &delta->target_rid))
1717 if (!prs_uint32("type3", ps, depth, &delta->type3))
1720 /* Not sure why we need this but it seems to be necessary to get
1721 sam deltas working. */
1723 if (delta->type != 0x16) {
1724 if (!prs_uint32("ptr_delta", ps, depth, &delta->ptr_delta))
1731 /*******************************************************************
1732 reads or writes a structure.
1733 ********************************************************************/
1734 static BOOL net_io_sam_delta_mod_count(const char *desc, SAM_DELTA_MOD_COUNT *info,
1735 prs_struct *ps, int depth)
1737 prs_debug(ps, depth, desc, "net_io_sam_delta_stamp");
1740 if (!prs_uint32("seqnum", ps, depth, &info->seqnum))
1742 if (!prs_uint32("dom_mod_count_ptr", ps, depth,
1743 &info->dom_mod_count_ptr))
1746 if (info->dom_mod_count_ptr) {
1747 if (!prs_uint64("dom_mod_count", ps, depth,
1748 &info->dom_mod_count))
1755 /*******************************************************************
1756 reads or writes a structure.
1757 ********************************************************************/
1758 static BOOL net_io_sam_domain_info(const char *desc, SAM_DOMAIN_INFO * info,
1759 prs_struct *ps, int depth)
1761 prs_debug(ps, depth, desc, "net_io_sam_domain_info");
1764 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
1766 if (!smb_io_unihdr("hdr_oem_info", &info->hdr_oem_info, ps, depth))
1769 if (!prs_uint64("force_logoff", ps, depth, &info->force_logoff))
1771 if (!prs_uint16("min_pwd_len", ps, depth, &info->min_pwd_len))
1773 if (!prs_uint16("pwd_history_len", ps, depth, &info->pwd_history_len))
1775 if (!prs_uint64("max_pwd_age", ps, depth, &info->max_pwd_age))
1777 if (!prs_uint64("min_pwd_age", ps, depth, &info->min_pwd_age))
1779 if (!prs_uint64("dom_mod_count", ps, depth, &info->dom_mod_count))
1781 if (!smb_io_time("creation_time", &info->creation_time, ps, depth))
1784 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1786 if (!smb_io_unihdr("hdr_unknown", &info->hdr_unknown, ps, depth))
1789 if (ps->data_offset + 40 > ps->buffer_size)
1791 ps->data_offset += 40;
1793 if (!smb_io_unistr2("uni_dom_name", &info->uni_dom_name,
1794 info->hdr_dom_name.buffer, ps, depth))
1796 if (!smb_io_unistr2("buf_oem_info", &info->buf_oem_info,
1797 info->hdr_oem_info.buffer, ps, depth))
1800 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
1801 info->hdr_sec_desc.buffer, ps, depth))
1803 if (!smb_io_unistr2("buf_unknown", &info->buf_unknown,
1804 info->hdr_unknown.buffer, ps, depth))
1810 /*******************************************************************
1811 reads or writes a structure.
1812 ********************************************************************/
1813 static BOOL net_io_sam_group_info(const char *desc, SAM_GROUP_INFO * info,
1814 prs_struct *ps, int depth)
1816 prs_debug(ps, depth, desc, "net_io_sam_group_info");
1819 if (!smb_io_unihdr("hdr_grp_name", &info->hdr_grp_name, ps, depth))
1821 if (!smb_io_gid("gid", &info->gid, ps, depth))
1823 if (!smb_io_unihdr("hdr_grp_desc", &info->hdr_grp_desc, ps, depth))
1825 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
1828 if (ps->data_offset + 48 > ps->buffer_size)
1830 ps->data_offset += 48;
1832 if (!smb_io_unistr2("uni_grp_name", &info->uni_grp_name,
1833 info->hdr_grp_name.buffer, ps, depth))
1835 if (!smb_io_unistr2("uni_grp_desc", &info->uni_grp_desc,
1836 info->hdr_grp_desc.buffer, ps, depth))
1838 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
1839 info->hdr_sec_desc.buffer, ps, depth))
1845 /*******************************************************************
1846 reads or writes a structure.
1847 ********************************************************************/
1848 static BOOL net_io_sam_passwd_info(const char *desc, SAM_PWD * pwd,
1849 prs_struct *ps, int depth)
1851 prs_debug(ps, depth, desc, "net_io_sam_passwd_info");
1854 if (!prs_uint32("unk_0 ", ps, depth, &pwd->unk_0))
1857 if (!smb_io_unihdr("hdr_lm_pwd", &pwd->hdr_lm_pwd, ps, depth))
1859 if (!prs_uint8s(False, "buf_lm_pwd", ps, depth, pwd->buf_lm_pwd, 16))
1862 if (!smb_io_unihdr("hdr_nt_pwd", &pwd->hdr_nt_pwd, ps, depth))
1864 if (!prs_uint8s(False, "buf_nt_pwd", ps, depth, pwd->buf_nt_pwd, 16))
1867 if (!smb_io_unihdr("", &pwd->hdr_empty_lm, ps, depth))
1869 if (!smb_io_unihdr("", &pwd->hdr_empty_nt, ps, depth))
1875 /*******************************************************************
1876 makes a SAM_ACCOUNT_INFO structure.
1877 ********************************************************************/
1878 BOOL make_sam_account_info(SAM_ACCOUNT_INFO * info,
1879 const UNISTR2 *user_name,
1880 const UNISTR2 *full_name,
1881 uint32 user_rid, uint32 group_rid,
1882 const UNISTR2 *home_dir,
1883 const UNISTR2 *dir_drive,
1884 const UNISTR2 *log_scr,
1885 const UNISTR2 *desc,
1887 const UNISTR2 *prof_path,
1888 const UNISTR2 *wkstas,
1889 const UNISTR2 *unk_str, const UNISTR2 *mung_dial)
1891 int len_user_name = user_name != NULL ? user_name->uni_str_len : 0;
1892 int len_full_name = full_name != NULL ? full_name->uni_str_len : 0;
1893 int len_home_dir = home_dir != NULL ? home_dir->uni_str_len : 0;
1894 int len_dir_drive = dir_drive != NULL ? dir_drive->uni_str_len : 0;
1895 int len_logon_script = log_scr != NULL ? log_scr->uni_str_len : 0;
1896 int len_profile_path = prof_path != NULL ? prof_path->uni_str_len : 0;
1897 int len_description = desc != NULL ? desc->uni_str_len : 0;
1898 int len_workstations = wkstas != NULL ? wkstas->uni_str_len : 0;
1899 int len_unknown_str = unk_str != NULL ? unk_str->uni_str_len : 0;
1900 int len_munged_dial = mung_dial != NULL ? mung_dial->uni_str_len : 0;
1902 DEBUG(5, ("make_sam_account_info\n"));
1904 make_uni_hdr(&info->hdr_acct_name, len_user_name);
1905 make_uni_hdr(&info->hdr_full_name, len_full_name);
1906 make_uni_hdr(&info->hdr_home_dir, len_home_dir);
1907 make_uni_hdr(&info->hdr_dir_drive, len_dir_drive);
1908 make_uni_hdr(&info->hdr_logon_script, len_logon_script);
1909 make_uni_hdr(&info->hdr_profile, len_profile_path);
1910 make_uni_hdr(&info->hdr_acct_desc, len_description);
1911 make_uni_hdr(&info->hdr_workstations, len_workstations);
1912 make_uni_hdr(&info->hdr_comment, len_unknown_str);
1913 make_uni_hdr(&info->hdr_parameters, len_munged_dial);
1916 make_bufhdr2(&info->hdr_sec_desc, 0, 0, 0);
1918 info->user_rid = user_rid;
1919 info->group_rid = group_rid;
1921 init_nt_time(&info->logon_time);
1922 init_nt_time(&info->logoff_time);
1923 init_nt_time(&info->pwd_last_set_time);
1924 init_nt_time(&info->acct_expiry_time);
1926 info->logon_divs = 0xA8;
1927 info->ptr_logon_hrs = 0; /* Don't care right now */
1929 info->bad_pwd_count = 0;
1930 info->logon_count = 0;
1931 info->acb_info = acb_info;
1932 info->nt_pwd_present = 0;
1933 info->lm_pwd_present = 0;
1934 info->pwd_expired = 0;
1938 info->unknown1 = 0x4EC;
1941 copy_unistr2(&info->uni_acct_name, user_name);
1942 copy_unistr2(&info->uni_full_name, full_name);
1943 copy_unistr2(&info->uni_home_dir, home_dir);
1944 copy_unistr2(&info->uni_dir_drive, dir_drive);
1945 copy_unistr2(&info->uni_logon_script, log_scr);
1946 copy_unistr2(&info->uni_profile, prof_path);
1947 copy_unistr2(&info->uni_acct_desc, desc);
1948 copy_unistr2(&info->uni_workstations, wkstas);
1949 copy_unistr2(&info->uni_comment, unk_str);
1950 copy_unistr2(&info->uni_parameters, mung_dial);
1955 /*******************************************************************
1956 reads or writes a structure.
1957 ********************************************************************/
1958 static BOOL net_io_sam_account_info(const char *desc, uint8 sess_key[16],
1959 SAM_ACCOUNT_INFO * info, prs_struct *ps,
1962 BUFHDR2 hdr_priv_data;
1965 prs_debug(ps, depth, desc, "net_io_sam_account_info");
1968 if (!smb_io_unihdr("hdr_acct_name", &info->hdr_acct_name, ps, depth))
1970 if (!smb_io_unihdr("hdr_full_name", &info->hdr_full_name, ps, depth))
1973 if (!prs_uint32("user_rid ", ps, depth, &info->user_rid))
1975 if (!prs_uint32("group_rid", ps, depth, &info->group_rid))
1978 if (!smb_io_unihdr("hdr_home_dir ", &info->hdr_home_dir, ps, depth))
1980 if (!smb_io_unihdr("hdr_dir_drive", &info->hdr_dir_drive, ps, depth))
1982 if (!smb_io_unihdr("hdr_logon_script", &info->hdr_logon_script, ps,
1986 if (!smb_io_unihdr("hdr_acct_desc", &info->hdr_acct_desc, ps, depth))
1988 if (!smb_io_unihdr("hdr_workstations", &info->hdr_workstations, ps,
1992 if (!smb_io_time("logon_time", &info->logon_time, ps, depth))
1994 if (!smb_io_time("logoff_time", &info->logoff_time, ps, depth))
1997 if (!prs_uint32("logon_divs ", ps, depth, &info->logon_divs))
1999 if (!prs_uint32("ptr_logon_hrs", ps, depth, &info->ptr_logon_hrs))
2002 if (!prs_uint16("bad_pwd_count", ps, depth, &info->bad_pwd_count))
2004 if (!prs_uint16("logon_count", ps, depth, &info->logon_count))
2006 if (!smb_io_time("pwd_last_set_time", &info->pwd_last_set_time, ps,
2009 if (!smb_io_time("acct_expiry_time", &info->acct_expiry_time, ps,
2013 if (!prs_uint32("acb_info", ps, depth, &info->acb_info))
2015 if (!prs_uint8s(False, "nt_pwd", ps, depth, info->nt_pwd, 16))
2017 if (!prs_uint8s(False, "lm_pwd", ps, depth, info->lm_pwd, 16))
2019 if (!prs_uint8("lm_pwd_present", ps, depth, &info->lm_pwd_present))
2021 if (!prs_uint8("nt_pwd_present", ps, depth, &info->nt_pwd_present))
2023 if (!prs_uint8("pwd_expired", ps, depth, &info->pwd_expired))
2026 if (!smb_io_unihdr("hdr_comment", &info->hdr_comment, ps, depth))
2028 if (!smb_io_unihdr("hdr_parameters", &info->hdr_parameters, ps,
2031 if (!prs_uint16("country", ps, depth, &info->country))
2033 if (!prs_uint16("codepage", ps, depth, &info->codepage))
2036 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data, ps, depth))
2038 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2040 if (!smb_io_unihdr("hdr_profile", &info->hdr_profile, ps, depth))
2043 for (i = 0; i < 3; i++)
2045 if (!smb_io_unihdr("hdr_reserved", &info->hdr_reserved[i],
2050 for (i = 0; i < 4; i++)
2052 if (!prs_uint32("dw_reserved", ps, depth,
2053 &info->dw_reserved[i]))
2057 if (!smb_io_unistr2("uni_acct_name", &info->uni_acct_name,
2058 info->hdr_acct_name.buffer, ps, depth))
2061 if (!smb_io_unistr2("uni_full_name", &info->uni_full_name,
2062 info->hdr_full_name.buffer, ps, depth))
2065 if (!smb_io_unistr2("uni_home_dir ", &info->uni_home_dir,
2066 info->hdr_home_dir.buffer, ps, depth))
2069 if (!smb_io_unistr2("uni_dir_drive", &info->uni_dir_drive,
2070 info->hdr_dir_drive.buffer, ps, depth))
2073 if (!smb_io_unistr2("uni_logon_script", &info->uni_logon_script,
2074 info->hdr_logon_script.buffer, ps, depth))
2077 if (!smb_io_unistr2("uni_acct_desc", &info->uni_acct_desc,
2078 info->hdr_acct_desc.buffer, ps, depth))
2081 if (!smb_io_unistr2("uni_workstations", &info->uni_workstations,
2082 info->hdr_workstations.buffer, ps, depth))
2086 if (!prs_uint32("unknown1", ps, depth, &info->unknown1))
2088 if (!prs_uint32("unknown2", ps, depth, &info->unknown2))
2091 if (!smb_io_buffer4("buf_logon_hrs", &info->buf_logon_hrs,
2092 info->ptr_logon_hrs, ps, depth))
2095 if (!smb_io_unistr2("uni_comment", &info->uni_comment,
2096 info->hdr_comment.buffer, ps, depth))
2099 if (!smb_io_unistr2("uni_parameters", &info->uni_parameters,
2100 info->hdr_parameters.buffer, ps, depth))
2103 if (hdr_priv_data.buffer != 0)
2107 if (!prs_uint32("pwd_len", ps, depth, &len))
2109 old_offset = ps->data_offset;
2115 if (!prs_hash1(ps, ps->data_offset, sess_key, len))
2118 if (!net_io_sam_passwd_info("pass", &info->pass,
2125 if (!prs_hash1(ps, old_offset, sess_key, len))
2129 if (old_offset + len > ps->buffer_size)
2131 ps->data_offset = old_offset + len;
2133 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2134 info->hdr_sec_desc.buffer, ps, depth))
2137 if (!smb_io_unistr2("uni_profile", &info->uni_profile,
2138 info->hdr_profile.buffer, ps, depth))
2146 /*******************************************************************
2147 reads or writes a structure.
2148 ********************************************************************/
2149 static BOOL net_io_sam_group_mem_info(const char *desc, SAM_GROUP_MEM_INFO * info,
2150 prs_struct *ps, int depth)
2155 prs_debug(ps, depth, desc, "net_io_sam_group_mem_info");
2159 if (!prs_uint32("ptr_rids ", ps, depth, &info->ptr_rids))
2161 if (!prs_uint32("ptr_attribs", ps, depth, &info->ptr_attribs))
2163 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2166 if (ps->data_offset + 16 > ps->buffer_size)
2168 ps->data_offset += 16;
2170 if (info->ptr_rids != 0)
2172 if (!prs_uint32("num_members2", ps, depth,
2173 &info->num_members2))
2176 if (info->num_members2 != info->num_members)
2182 info->rids = talloc(ps->mem_ctx, sizeof(uint32) *
2183 info->num_members2);
2185 if (info->rids == NULL) {
2186 DEBUG(0, ("out of memory allocating %d rids\n",
2187 info->num_members2));
2191 for (i = 0; i < info->num_members2; i++)
2193 slprintf(tmp, sizeof(tmp) - 1, "rids[%02d]", i);
2194 if (!prs_uint32(tmp, ps, depth, &info->rids[i]))
2199 if (info->ptr_attribs != 0)
2201 if (!prs_uint32("num_members3", ps, depth,
2202 &info->num_members3))
2204 if (info->num_members3 != info->num_members)
2210 info->attribs = talloc(ps->mem_ctx, sizeof(uint32) *
2211 info->num_members3);
2213 if (info->attribs == NULL) {
2214 DEBUG(0, ("out of memory allocating %d attribs\n",
2215 info->num_members3));
2219 for (i = 0; i < info->num_members3; i++)
2221 slprintf(tmp, sizeof(tmp) - 1, "attribs[%02d]", i);
2222 if (!prs_uint32(tmp, ps, depth, &info->attribs[i]))
2230 /*******************************************************************
2231 reads or writes a structure.
2232 ********************************************************************/
2233 static BOOL net_io_sam_alias_info(const char *desc, SAM_ALIAS_INFO * info,
2234 prs_struct *ps, int depth)
2236 prs_debug(ps, depth, desc, "net_io_sam_alias_info");
2239 if (!smb_io_unihdr("hdr_als_name", &info->hdr_als_name, ps, depth))
2241 if (!prs_uint32("als_rid", ps, depth, &info->als_rid))
2243 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2245 if (!smb_io_unihdr("hdr_als_desc", &info->hdr_als_desc, ps, depth))
2248 if (ps->data_offset + 40 > ps->buffer_size)
2250 ps->data_offset += 40;
2252 if (!smb_io_unistr2("uni_als_name", &info->uni_als_name,
2253 info->hdr_als_name.buffer, ps, depth))
2255 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2256 info->hdr_sec_desc.buffer, ps, depth))
2259 if (info->hdr_als_desc.buffer != 0) {
2260 if (!smb_io_unistr2("uni_als_desc", &info->uni_als_desc,
2261 info->hdr_als_name.buffer, ps, depth))
2268 /*******************************************************************
2269 reads or writes a structure.
2270 ********************************************************************/
2271 static BOOL net_io_sam_alias_mem_info(const char *desc, SAM_ALIAS_MEM_INFO * info,
2272 prs_struct *ps, int depth)
2277 prs_debug(ps, depth, desc, "net_io_sam_alias_mem_info");
2281 if (!prs_uint32("num_members", ps, depth, &info->num_members))
2283 if (!prs_uint32("ptr_members", ps, depth, &info->ptr_members))
2286 if (info->ptr_members != 0)
2288 if (ps->data_offset + 16 > ps->buffer_size)
2290 ps->data_offset += 16;
2292 if (!prs_uint32("num_sids", ps, depth, &info->num_sids))
2294 if (info->num_sids != info->num_members)
2300 info->ptr_sids = talloc(ps->mem_ctx, sizeof(uint32) *
2303 if (info->ptr_sids == NULL) {
2304 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2309 for (i = 0; i < info->num_sids; i++)
2311 slprintf(tmp, sizeof(tmp) - 1, "ptr_sids[%02d]", i);
2312 if (!prs_uint32(tmp, ps, depth, &info->ptr_sids[i]))
2316 info->sids = talloc(ps->mem_ctx, sizeof(DOM_SID2) *
2319 if (info->sids == NULL) {
2320 DEBUG(0, ("error allocating %d sids\n",
2325 for (i = 0; i < info->num_sids; i++)
2327 if (info->ptr_sids[i] != 0)
2329 slprintf(tmp, sizeof(tmp) - 1, "sids[%02d]",
2331 if (!smb_io_dom_sid2(tmp, &info->sids[i],
2341 /*******************************************************************
2342 reads or writes a structure.
2343 ********************************************************************/
2344 static BOOL net_io_sam_policy_info(const char *desc, SAM_DELTA_POLICY *info,
2345 prs_struct *ps, int depth)
2348 prs_debug(ps, depth, desc, "net_io_sam_policy_info");
2354 if (!prs_uint32("max_log_size", ps, depth, &info->max_log_size))
2356 if (!prs_uint64("audit_retention_period", ps, depth,
2357 &info->audit_retention_period))
2359 if (!prs_uint32("auditing_mode", ps, depth, &info->auditing_mode))
2361 if (!prs_uint32("num_events", ps, depth, &info->num_events))
2363 if (!prs_uint32("ptr_events", ps, depth, &info->ptr_events))
2366 if (!smb_io_unihdr("hdr_dom_name", &info->hdr_dom_name, ps, depth))
2369 if (!prs_uint32("sid_ptr", ps, depth, &info->sid_ptr))
2372 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2374 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2375 &info->non_paged_pool_limit))
2377 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2379 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2381 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2383 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2385 if (!smb_io_time("modify_time", &info->modify_time, ps, depth))
2387 if (!smb_io_time("create_time", &info->create_time, ps, depth))
2389 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2392 for (i=0; i<4; i++) {
2394 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2398 for (i=0; i<4; i++) {
2400 if (!prs_uint32("reserved", ps, depth, &reserved))
2404 if (!prs_uint32("num_event_audit_options", ps, depth,
2405 &info->num_event_audit_options))
2408 for (i=0; i<info->num_event_audit_options; i++)
2409 if (!prs_uint32("event_audit_option", ps, depth,
2410 &info->event_audit_option))
2413 if (!smb_io_unistr2("domain_name", &info->domain_name, True, ps, depth))
2416 if(!smb_io_dom_sid2("domain_sid", &info->domain_sid, ps, depth))
2419 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2420 info->hdr_sec_desc.buffer, ps, depth))
2429 /* This function is pretty broken - see bug #334 */
2431 /*******************************************************************
2432 reads or writes a structure.
2433 ********************************************************************/
2434 static BOOL net_io_sam_trustdoms_info(const char *desc, SAM_DELTA_TRUSTDOMS *info,
2435 prs_struct *ps, int depth)
2439 prs_debug(ps, depth, desc, "net_io_sam_trustdoms_info");
2445 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2448 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2451 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2454 if(!smb_io_unihdr("hdr_domain", &info->hdr_domain, ps, depth))
2457 if(!prs_uint32("unknown0", ps, depth, &info->unknown0))
2459 if(!prs_uint32("unknown1", ps, depth, &info->unknown1))
2461 if(!prs_uint32("unknown2", ps, depth, &info->unknown2))
2464 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2466 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2469 for (i=0; i<12; i++)
2470 if(!prs_uint32("unknown3", ps, depth, &info->unknown3))
2473 if (!smb_io_unistr2("domain", &info->domain, True, ps, depth))
2483 /* This function doesn't work - see bug #334 */
2485 /*******************************************************************
2486 reads or writes a structure.
2487 ********************************************************************/
2488 static BOOL net_io_sam_secret_info(const char *desc, SAM_DELTA_SECRET *info,
2489 prs_struct *ps, int depth)
2493 prs_debug(ps, depth, desc, "net_io_sam_secret_info");
2499 if(!prs_uint32("buf_size", ps, depth, &info->buf_size))
2502 if(!sec_io_desc("sec_desc", &info->sec_desc, ps, depth))
2505 if (!smb_io_unistr2("secret", &info->secret, True, ps, depth))
2511 if(!prs_uint32("count1", ps, depth, &info->count1))
2513 if(!prs_uint32("count2", ps, depth, &info->count2))
2515 if(!prs_uint32("ptr", ps, depth, &info->ptr))
2519 if(!smb_io_time("time1", &info->time1, ps, depth)) /* logon time */
2521 if(!prs_uint32("count3", ps, depth, &info->count3))
2523 if(!prs_uint32("count4", ps, depth, &info->count4))
2525 if(!prs_uint32("ptr2", ps, depth, &info->ptr2))
2527 if(!smb_io_time("time2", &info->time2, ps, depth)) /* logon time */
2529 if(!prs_uint32("unknow1", ps, depth, &info->unknow1))
2533 if(!prs_uint32("buf_size2", ps, depth, &info->buf_size2))
2535 if(!prs_uint32("ptr3", ps, depth, &info->ptr3))
2538 if(!prs_uint32("unknow2", ps, depth, &info->unknow2))
2541 if(!prs_uint32("chal_len", ps, depth, &info->chal_len))
2543 if(!prs_uint32("reserved1", ps, depth, &info->reserved1))
2545 if(!prs_uint32("chal_len2", ps, depth, &info->chal_len2))
2548 if(!prs_uint8s (False, "chal", ps, depth, info->chal, info->chal_len2))
2551 if(!prs_uint32("key_len", ps, depth, &info->key_len))
2553 if(!prs_uint32("reserved2", ps, depth, &info->reserved2))
2555 if(!prs_uint32("key_len2", ps, depth, &info->key_len2))
2558 if(!prs_uint8s (False, "key", ps, depth, info->key, info->key_len2))
2562 if(!prs_uint32("buf_size3", ps, depth, &info->buf_size3))
2565 if(!sec_io_desc("sec_desc2", &info->sec_desc2, ps, depth))
2574 /*******************************************************************
2575 reads or writes a structure.
2576 ********************************************************************/
2577 static BOOL net_io_sam_privs_info(const char *desc, SAM_DELTA_PRIVS *info,
2578 prs_struct *ps, int depth)
2582 prs_debug(ps, depth, desc, "net_io_sam_privs_info");
2588 if(!smb_io_dom_sid2("sid", &info->sid, ps, depth))
2591 if(!prs_uint32("priv_count", ps, depth, &info->priv_count))
2593 if(!prs_uint32("priv_control", ps, depth, &info->priv_control))
2596 if(!prs_uint32("priv_attr_ptr", ps, depth, &info->priv_attr_ptr))
2598 if(!prs_uint32("priv_name_ptr", ps, depth, &info->priv_name_ptr))
2601 if (!prs_uint32("paged_pool_limit", ps, depth, &info->paged_pool_limit))
2603 if (!prs_uint32("non_paged_pool_limit", ps, depth,
2604 &info->non_paged_pool_limit))
2606 if (!prs_uint32("min_workset_size", ps, depth, &info->min_workset_size))
2608 if (!prs_uint32("max_workset_size", ps, depth, &info->max_workset_size))
2610 if (!prs_uint32("page_file_limit", ps, depth, &info->page_file_limit))
2612 if (!prs_uint64("time_limit", ps, depth, &info->time_limit))
2614 if (!prs_uint32("system_flags", ps, depth, &info->system_flags))
2616 if (!smb_io_bufhdr2("hdr_sec_desc", &info->hdr_sec_desc, ps, depth))
2619 for (i=0; i<4; i++) {
2621 if (!smb_io_unihdr("dummy", &dummy, ps, depth))
2625 for (i=0; i<4; i++) {
2627 if (!prs_uint32("reserved", ps, depth, &reserved))
2631 if(!prs_uint32("attribute_count", ps, depth, &info->attribute_count))
2634 info->attributes = talloc(ps->mem_ctx, sizeof(uint32) * info->attribute_count);
2636 for (i=0; i<info->attribute_count; i++)
2637 if(!prs_uint32("attributes", ps, depth, &info->attributes[i]))
2640 if(!prs_uint32("privlist_count", ps, depth, &info->privlist_count))
2643 info->hdr_privslist = talloc(ps->mem_ctx, sizeof(UNIHDR) * info->privlist_count);
2644 info->uni_privslist = talloc(ps->mem_ctx, sizeof(UNISTR2) * info->privlist_count);
2646 for (i=0; i<info->privlist_count; i++)
2647 if(!smb_io_unihdr("hdr_privslist", &info->hdr_privslist[i], ps, depth))
2650 for (i=0; i<info->privlist_count; i++)
2651 if (!smb_io_unistr2("uni_privslist", &info->uni_privslist[i], True, ps, depth))
2654 if (!smb_io_buffer4("buf_sec_desc", &info->buf_sec_desc,
2655 info->hdr_sec_desc.buffer, ps, depth))
2661 /*******************************************************************
2662 reads or writes a structure.
2663 ********************************************************************/
2664 static BOOL net_io_sam_delta_ctr(const char *desc, uint8 sess_key[16],
2665 SAM_DELTA_CTR * delta, uint16 type,
2666 prs_struct *ps, int depth)
2668 prs_debug(ps, depth, desc, "net_io_sam_delta_ctr");
2672 /* Seen in sam deltas */
2673 case SAM_DELTA_MODIFIED_COUNT:
2674 if (!net_io_sam_delta_mod_count("", &delta->mod_count, ps, depth))
2678 case SAM_DELTA_DOMAIN_INFO:
2679 if (!net_io_sam_domain_info("", &delta->domain_info, ps, depth))
2683 case SAM_DELTA_GROUP_INFO:
2684 if (!net_io_sam_group_info("", &delta->group_info, ps, depth))
2688 case SAM_DELTA_ACCOUNT_INFO:
2689 if (!net_io_sam_account_info("", sess_key, &delta->account_info, ps, depth))
2693 case SAM_DELTA_GROUP_MEM:
2694 if (!net_io_sam_group_mem_info("", &delta->grp_mem_info, ps, depth))
2698 case SAM_DELTA_ALIAS_INFO:
2699 if (!net_io_sam_alias_info("", &delta->alias_info, ps, depth))
2703 case SAM_DELTA_POLICY_INFO:
2704 if (!net_io_sam_policy_info("", &delta->policy_info, ps, depth))
2708 case SAM_DELTA_ALIAS_MEM:
2709 if (!net_io_sam_alias_mem_info("", &delta->als_mem_info, ps, depth))
2713 case SAM_DELTA_PRIVS_INFO:
2714 if (!net_io_sam_privs_info("", &delta->privs_info, ps, depth))
2718 /* These guys are implemented but broken */
2720 case SAM_DELTA_TRUST_DOMS:
2721 case SAM_DELTA_SECRET_INFO:
2724 /* These guys are not implemented yet */
2726 case SAM_DELTA_RENAME_GROUP:
2727 case SAM_DELTA_RENAME_USER:
2728 case SAM_DELTA_RENAME_ALIAS:
2729 case SAM_DELTA_DELETE_GROUP:
2730 case SAM_DELTA_DELETE_USER:
2732 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type));
2739 /*******************************************************************
2740 reads or writes a structure.
2741 ********************************************************************/
2742 BOOL net_io_r_sam_sync(const char *desc, uint8 sess_key[16],
2743 NET_R_SAM_SYNC * r_s, prs_struct *ps, int depth)
2747 prs_debug(ps, depth, desc, "net_io_r_sam_sync");
2750 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2752 if (!prs_uint32("sync_context", ps, depth, &r_s->sync_context))
2755 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2757 if (r_s->ptr_deltas != 0)
2759 if (!prs_uint32("num_deltas ", ps, depth, &r_s->num_deltas))
2761 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->ptr_deltas2))
2763 if (r_s->ptr_deltas2 != 0)
2765 if (!prs_uint32("num_deltas2", ps, depth,
2769 if (r_s->num_deltas2 != r_s->num_deltas)
2775 if (r_s->num_deltas2 > 0) {
2776 r_s->hdr_deltas = (SAM_DELTA_HDR *)
2777 talloc(ps->mem_ctx, r_s->num_deltas2 *
2778 sizeof(SAM_DELTA_HDR));
2780 if (r_s->hdr_deltas == NULL) {
2781 DEBUG(0, ("error tallocating memory "
2782 "for %d delta headers\n",
2788 for (i = 0; i < r_s->num_deltas2; i++)
2790 if (!net_io_sam_delta_hdr("",
2791 &r_s->hdr_deltas[i],
2796 if (r_s->num_deltas2 > 0) {
2797 r_s->deltas = (SAM_DELTA_CTR *)
2798 talloc(ps->mem_ctx, r_s->num_deltas2 *
2799 sizeof(SAM_DELTA_CTR));
2801 if (r_s->deltas == NULL) {
2802 DEBUG(0, ("error tallocating memory "
2809 for (i = 0; i < r_s->num_deltas2; i++)
2811 if (!net_io_sam_delta_ctr(
2812 "", sess_key, &r_s->deltas[i],
2813 r_s->hdr_deltas[i].type3,
2815 DEBUG(0, ("hmm, failed on i=%d\n", i));
2823 if (!prs_ntstatus("status", ps, depth, &(r_s->status)))
2829 /*******************************************************************
2830 makes a NET_Q_SAM_DELTAS structure.
2831 ********************************************************************/
2832 BOOL init_net_q_sam_deltas(NET_Q_SAM_DELTAS *q_s, const char *srv_name,
2833 const char *cli_name, DOM_CRED *cli_creds,
2834 uint32 database_id, UINT64_S dom_mod_count)
2836 DEBUG(5, ("init_net_q_sam_deltas\n"));
2838 init_unistr2(&q_s->uni_srv_name, srv_name, UNI_STR_TERMINATE);
2839 init_unistr2(&q_s->uni_cli_name, cli_name, UNI_STR_TERMINATE);
2841 memcpy(&q_s->cli_creds, cli_creds, sizeof(q_s->cli_creds));
2842 memset(&q_s->ret_creds, 0, sizeof(q_s->ret_creds));
2844 q_s->database_id = database_id;
2845 q_s->dom_mod_count.low = dom_mod_count.low;
2846 q_s->dom_mod_count.high = dom_mod_count.high;
2847 q_s->max_size = 0xffff;
2852 /*******************************************************************
2853 reads or writes a structure.
2854 ********************************************************************/
2855 BOOL net_io_q_sam_deltas(const char *desc, NET_Q_SAM_DELTAS *q_s, prs_struct *ps,
2858 prs_debug(ps, depth, desc, "net_io_q_sam_deltas");
2861 if (!smb_io_unistr2("", &q_s->uni_srv_name, True, ps, depth))
2863 if (!smb_io_unistr2("", &q_s->uni_cli_name, True, ps, depth))
2866 if (!smb_io_cred("", &q_s->cli_creds, ps, depth))
2868 if (!smb_io_cred("", &q_s->ret_creds, ps, depth))
2871 if (!prs_uint32("database_id ", ps, depth, &q_s->database_id))
2873 if (!prs_uint64("dom_mod_count", ps, depth, &q_s->dom_mod_count))
2875 if (!prs_uint32("max_size", ps, depth, &q_s->max_size))
2881 /*******************************************************************
2882 reads or writes a structure.
2883 ********************************************************************/
2884 BOOL net_io_r_sam_deltas(const char *desc, uint8 sess_key[16],
2885 NET_R_SAM_DELTAS *r_s, prs_struct *ps, int depth)
2889 prs_debug(ps, depth, desc, "net_io_r_sam_deltas");
2892 if (!smb_io_cred("srv_creds", &r_s->srv_creds, ps, depth))
2894 if (!prs_uint64("dom_mod_count", ps, depth, &r_s->dom_mod_count))
2897 if (!prs_uint32("ptr_deltas", ps, depth, &r_s->ptr_deltas))
2899 if (!prs_uint32("num_deltas", ps, depth, &r_s->num_deltas))
2901 if (!prs_uint32("ptr_deltas2", ps, depth, &r_s->num_deltas2))
2904 if (r_s->num_deltas2 != 0)
2906 if (!prs_uint32("num_deltas2 ", ps, depth, &r_s->num_deltas2))
2909 if (r_s->ptr_deltas != 0)
2911 if (r_s->num_deltas > 0) {
2912 r_s->hdr_deltas = (SAM_DELTA_HDR *)
2913 talloc(ps->mem_ctx, r_s->num_deltas *
2914 sizeof(SAM_DELTA_HDR));
2915 if (r_s->hdr_deltas == NULL) {
2916 DEBUG(0, ("error tallocating memory "
2917 "for %d delta headers\n",
2923 for (i = 0; i < r_s->num_deltas; i++)
2925 net_io_sam_delta_hdr("", &r_s->hdr_deltas[i],
2929 if (r_s->num_deltas > 0) {
2930 r_s->deltas = (SAM_DELTA_CTR *)
2931 talloc(ps->mem_ctx, r_s->num_deltas *
2932 sizeof(SAM_DELTA_CTR));
2934 if (r_s->deltas == NULL) {
2935 DEBUG(0, ("error tallocating memory "
2942 for (i = 0; i < r_s->num_deltas; i++)
2944 if (!net_io_sam_delta_ctr(
2947 r_s->hdr_deltas[i].type2,
2956 if (!prs_ntstatus("status", ps, depth, &r_s->status))