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
)
139 int len_dc_name
= strlen(trusted_dc_name
);
141 info
->pdc_status
= pdc_status
;
142 info
->ptr_trusted_dc_name
= 1;
143 info
->tc_status
= tc_status
;
145 if (trusted_dc_name
!= NULL
)
146 init_unistr2(&info
->uni_trusted_dc_name
, trusted_dc_name
, len_dc_name
+1);
148 init_unistr2(&info
->uni_trusted_dc_name
, "", 1);
151 /*******************************************************************
152 Reads or writes a NETLOGON_INFO_2 structure.
153 ********************************************************************/
155 static BOOL
net_io_netinfo_2(const char *desc
, NETLOGON_INFO_2
*info
, prs_struct
*ps
, int depth
)
160 prs_debug(ps
, depth
, desc
, "net_io_netinfo_2");
166 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
168 if(!prs_uint32("pdc_status ", ps
, depth
, &info
->pdc_status
))
170 if(!prs_uint32("ptr_trusted_dc_name", ps
, depth
, &info
->ptr_trusted_dc_name
))
172 if(!prs_uint32("tc_status ", ps
, depth
, &info
->tc_status
))
175 if (info
->ptr_trusted_dc_name
!= 0) {
176 if(!smb_io_unistr2("unistr2", &info
->uni_trusted_dc_name
, info
->ptr_trusted_dc_name
, ps
, depth
))
186 /*******************************************************************
187 Reads or writes an NET_Q_LOGON_CTRL2 structure.
188 ********************************************************************/
190 BOOL
net_io_q_logon_ctrl2(const char *desc
, NET_Q_LOGON_CTRL2
*q_l
, prs_struct
*ps
, int depth
)
195 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl2");
201 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
204 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
210 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
212 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
214 if(!prs_uint32("switch_value ", ps
, depth
, &q_l
->switch_value
))
220 /*******************************************************************
221 Inits an NET_Q_LOGON_CTRL2 structure.
222 ********************************************************************/
224 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2
*q_l
, const char *srv_name
,
227 DEBUG(5,("init_q_logon_ctrl2\n"));
229 q_l
->function_code
= 0x01;
230 q_l
->query_level
= query_level
;
231 q_l
->switch_value
= 0x01;
233 init_unistr2(&q_l
->uni_server_name
, srv_name
, strlen(srv_name
) + 1);
236 /*******************************************************************
237 Inits an NET_R_LOGON_CTRL2 structure.
238 ********************************************************************/
240 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2
*r_l
, uint32 query_level
,
241 uint32 flags
, uint32 pdc_status
,
242 uint32 logon_attempts
, uint32 tc_status
,
243 const char *trusted_domain_name
)
245 DEBUG(5,("init_r_logon_ctrl2\n"));
247 r_l
->switch_value
= query_level
; /* should only be 0x1 */
249 switch (query_level
) {
251 r_l
->ptr
= 1; /* undocumented pointer */
252 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
253 r_l
->status
= NT_STATUS_OK
;
256 r_l
->ptr
= 1; /* undocumented pointer */
257 init_netinfo_2(&r_l
->logon
.info2
, flags
, pdc_status
,
258 tc_status
, trusted_domain_name
);
259 r_l
->status
= NT_STATUS_OK
;
262 r_l
->ptr
= 1; /* undocumented pointer */
263 init_netinfo_3(&r_l
->logon
.info3
, flags
, logon_attempts
);
264 r_l
->status
= NT_STATUS_OK
;
267 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
269 r_l
->ptr
= 0; /* undocumented pointer */
271 /* take a guess at an error code... */
272 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
277 /*******************************************************************
278 Reads or writes an NET_R_LOGON_CTRL2 structure.
279 ********************************************************************/
281 BOOL
net_io_r_logon_ctrl2(const char *desc
, NET_R_LOGON_CTRL2
*r_l
, prs_struct
*ps
, int depth
)
286 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl2");
289 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
291 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
295 switch (r_l
->switch_value
) {
297 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
301 if(!net_io_netinfo_2("", &r_l
->logon
.info2
, ps
, depth
))
305 if(!net_io_netinfo_3("", &r_l
->logon
.info3
, ps
, depth
))
309 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
315 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
321 /*******************************************************************
322 Reads or writes an NET_Q_LOGON_CTRL structure.
323 ********************************************************************/
325 BOOL
net_io_q_logon_ctrl(const char *desc
, NET_Q_LOGON_CTRL
*q_l
, prs_struct
*ps
,
328 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl");
334 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
337 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
343 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
345 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
351 /*******************************************************************
352 Inits an NET_Q_LOGON_CTRL structure.
353 ********************************************************************/
355 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL
*q_l
, const char *srv_name
,
358 DEBUG(5,("init_q_logon_ctrl\n"));
360 q_l
->function_code
= 0x01; /* ??? */
361 q_l
->query_level
= query_level
;
363 init_unistr2(&q_l
->uni_server_name
, srv_name
, strlen(srv_name
) + 1);
366 /*******************************************************************
367 Inits an NET_R_LOGON_CTRL structure.
368 ********************************************************************/
370 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL
*r_l
, uint32 query_level
,
371 uint32 flags
, uint32 pdc_status
)
373 DEBUG(5,("init_r_logon_ctrl\n"));
375 r_l
->switch_value
= query_level
; /* should only be 0x1 */
377 switch (query_level
) {
379 r_l
->ptr
= 1; /* undocumented pointer */
380 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
381 r_l
->status
= NT_STATUS_OK
;
384 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
386 r_l
->ptr
= 0; /* undocumented pointer */
388 /* take a guess at an error code... */
389 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
394 /*******************************************************************
395 Reads or writes an NET_R_LOGON_CTRL structure.
396 ********************************************************************/
398 BOOL
net_io_r_logon_ctrl(const char *desc
, NET_R_LOGON_CTRL
*r_l
, prs_struct
*ps
,
401 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl");
404 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
406 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
410 switch (r_l
->switch_value
) {
412 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
416 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
422 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
428 /*******************************************************************
429 Inits an NET_R_TRUST_DOM_LIST structure.
430 ********************************************************************/
432 void init_r_trust_dom(NET_R_TRUST_DOM_LIST
*r_t
,
433 uint32 num_doms
, const char *dom_name
)
437 DEBUG(5,("init_r_trust_dom\n"));
439 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
440 r_t
->uni_trust_dom_name
[i
].uni_str_len
= 0;
441 r_t
->uni_trust_dom_name
[i
].uni_max_len
= 0;
443 if (num_doms
> MAX_TRUST_DOMS
)
444 num_doms
= MAX_TRUST_DOMS
;
446 for (i
= 0; i
< num_doms
; i
++) {
448 fstrcpy(domain_name
, dom_name
);
449 strupper_m(domain_name
);
450 init_unistr2(&r_t
->uni_trust_dom_name
[i
], domain_name
, strlen(domain_name
)+1);
451 /* the use of UNISTR2 here is non-standard. */
452 r_t
->uni_trust_dom_name
[i
].undoc
= 0x1;
455 r_t
->status
= NT_STATUS_OK
;
458 /*******************************************************************
459 Reads or writes an NET_R_TRUST_DOM_LIST structure.
460 ********************************************************************/
462 BOOL
net_io_r_trust_dom(const char *desc
, NET_R_TRUST_DOM_LIST
*r_t
, prs_struct
*ps
, int depth
)
469 prs_debug(ps
, depth
, desc
, "net_io_r_trust_dom");
472 /* temporary code to give a valid response */
474 if(!prs_uint32("status", ps
, depth
, &value
))
478 if(!prs_uint32("status", ps
, depth
, &value
))
481 if(!prs_uint32("status", ps
, depth
, &value
))
485 if(!prs_uint32("status", ps
, depth
, &value
))
489 if(!prs_uint32("status", ps
, depth
, &value
))
492 /* old non working code */
496 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
497 if (r_t
->uni_trust_dom_name
[i
].uni_str_len
== 0)
499 if(!smb_io_unistr2("", &r_t
->uni_trust_dom_name
[i
], True
, ps
, depth
))
503 if(!prs_ntstatus("status", ps
, depth
, &r_t
->status
))
510 /*******************************************************************
511 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
512 ********************************************************************/
514 BOOL
net_io_q_trust_dom(const char *desc
, NET_Q_TRUST_DOM_LIST
*q_l
, prs_struct
*ps
, int depth
)
519 prs_debug(ps
, depth
, desc
, "net_io_q_trust_dom");
522 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
524 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
530 /*******************************************************************
531 Inits an NET_Q_REQ_CHAL structure.
532 ********************************************************************/
534 void init_q_req_chal(NET_Q_REQ_CHAL
*q_c
,
535 const char *logon_srv
, const char *logon_clnt
,
538 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
540 q_c
->undoc_buffer
= 1; /* don't know what this buffer is */
542 init_unistr2(&q_c
->uni_logon_srv
, logon_srv
, strlen(logon_srv
)+1);
543 init_unistr2(&q_c
->uni_logon_clnt
, logon_clnt
, strlen(logon_clnt
)+1);
545 memcpy(q_c
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
547 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
550 /*******************************************************************
551 Reads or writes an NET_Q_REQ_CHAL structure.
552 ********************************************************************/
554 BOOL
net_io_q_req_chal(const char *desc
, NET_Q_REQ_CHAL
*q_c
, prs_struct
*ps
, int depth
)
559 prs_debug(ps
, depth
, desc
, "net_io_q_req_chal");
565 if(!prs_uint32("undoc_buffer", ps
, depth
, &q_c
->undoc_buffer
))
568 if(!smb_io_unistr2("", &q_c
->uni_logon_srv
, True
, ps
, depth
)) /* logon server unicode string */
570 if(!smb_io_unistr2("", &q_c
->uni_logon_clnt
, True
, ps
, depth
)) /* logon client unicode string */
573 if(!smb_io_chal("", &q_c
->clnt_chal
, ps
, depth
))
579 /*******************************************************************
580 Reads or writes a structure.
581 ********************************************************************/
583 BOOL
net_io_r_req_chal(const char *desc
, NET_R_REQ_CHAL
*r_c
, prs_struct
*ps
, int depth
)
588 prs_debug(ps
, depth
, desc
, "net_io_r_req_chal");
594 if(!smb_io_chal("", &r_c
->srv_chal
, ps
, depth
)) /* server challenge */
597 if(!prs_ntstatus("status", ps
, depth
, &r_c
->status
))
604 /*******************************************************************
605 Reads or writes a structure.
606 ********************************************************************/
608 BOOL
net_io_q_auth(const char *desc
, NET_Q_AUTH
*q_a
, prs_struct
*ps
, int depth
)
613 prs_debug(ps
, depth
, desc
, "net_io_q_auth");
619 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
621 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
627 /*******************************************************************
628 Reads or writes a structure.
629 ********************************************************************/
631 BOOL
net_io_r_auth(const char *desc
, NET_R_AUTH
*r_a
, prs_struct
*ps
, int depth
)
636 prs_debug(ps
, depth
, desc
, "net_io_r_auth");
642 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
645 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
651 /*******************************************************************
652 Inits a NET_Q_AUTH_2 struct.
653 ********************************************************************/
655 void init_q_auth_2(NET_Q_AUTH_2
*q_a
,
656 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
657 DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
659 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
661 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
662 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
663 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
665 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
668 /*******************************************************************
669 Reads or writes a structure.
670 ********************************************************************/
672 BOOL
net_io_q_auth_2(const char *desc
, NET_Q_AUTH_2
*q_a
, prs_struct
*ps
, int depth
)
677 prs_debug(ps
, depth
, desc
, "net_io_q_auth_2");
683 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
685 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
687 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
693 /*******************************************************************
694 Reads or writes a structure.
695 ********************************************************************/
697 BOOL
net_io_r_auth_2(const char *desc
, NET_R_AUTH_2
*r_a
, prs_struct
*ps
, int depth
)
702 prs_debug(ps
, depth
, desc
, "net_io_r_auth_2");
708 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
710 if(!net_io_neg_flags("", &r_a
->srv_flgs
, ps
, depth
))
713 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
719 /*******************************************************************
720 Inits a NET_Q_AUTH_3 struct.
721 ********************************************************************/
723 void init_q_auth_3(NET_Q_AUTH_3
*q_a
,
724 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
725 DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
727 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
729 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
730 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
731 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
733 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
736 /*******************************************************************
737 Reads or writes a structure.
738 ********************************************************************/
740 BOOL
net_io_q_auth_3(const char *desc
, NET_Q_AUTH_3
*q_a
, prs_struct
*ps
, int depth
)
745 prs_debug(ps
, depth
, desc
, "net_io_q_auth_3");
751 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
753 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
755 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
761 /*******************************************************************
762 Reads or writes a structure.
763 ********************************************************************/
765 BOOL
net_io_r_auth_3(const char *desc
, NET_R_AUTH_3
*r_a
, prs_struct
*ps
, int depth
)
770 prs_debug(ps
, depth
, desc
, "net_io_r_auth_3");
776 if(!smb_io_chal("srv_chal", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
778 if(!net_io_neg_flags("srv_flgs", &r_a
->srv_flgs
, ps
, depth
))
780 if (!prs_uint32("unknown", ps
, depth
, &r_a
->unknown
))
783 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
790 /*******************************************************************
791 Inits a NET_Q_SRV_PWSET.
792 ********************************************************************/
794 void init_q_srv_pwset(NET_Q_SRV_PWSET
*q_s
,
795 const char *logon_srv
, const char *sess_key
, const char *acct_name
,
796 uint16 sec_chan
, const char *comp_name
,
797 DOM_CRED
*cred
, uchar hashed_mach_pwd
[16])
799 unsigned char nt_cypher
[16];
801 DEBUG(5,("init_q_srv_pwset\n"));
803 /* Process the new password. */
804 cred_hash3( nt_cypher
, hashed_mach_pwd
, (const unsigned char *)sess_key
, 1);
806 init_clnt_info(&q_s
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
, cred
);
808 memcpy(q_s
->pwd
, nt_cypher
, sizeof(q_s
->pwd
));
811 /*******************************************************************
812 Reads or writes a structure.
813 ********************************************************************/
815 BOOL
net_io_q_srv_pwset(const char *desc
, NET_Q_SRV_PWSET
*q_s
, prs_struct
*ps
, int depth
)
820 prs_debug(ps
, depth
, desc
, "net_io_q_srv_pwset");
826 if(!smb_io_clnt_info("", &q_s
->clnt_id
, ps
, depth
)) /* client identification/authentication info */
828 if(!prs_uint8s (False
, "pwd", ps
, depth
, q_s
->pwd
, 16)) /* new password - undocumented */
834 /*******************************************************************
835 Reads or writes a structure.
836 ********************************************************************/
838 BOOL
net_io_r_srv_pwset(const char *desc
, NET_R_SRV_PWSET
*r_s
, prs_struct
*ps
, int depth
)
843 prs_debug(ps
, depth
, desc
, "net_io_r_srv_pwset");
849 if(!smb_io_cred("", &r_s
->srv_cred
, ps
, depth
)) /* server challenge */
852 if(!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
858 /*************************************************************************
859 Init DOM_SID2 array from a string containing multiple sids
860 *************************************************************************/
862 static int init_dom_sid2s(TALLOC_CTX
*ctx
, const char *sids_str
, DOM_SID2
**ppsids
)
868 DEBUG(4,("init_dom_sid2s: %s\n", sids_str
? sids_str
:""));
876 /* Count the number of valid SIDs. */
877 for (count
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
879 if (string_to_sid(&tmpsid
, s2
))
883 /* Now allocate space for them. */
884 *ppsids
= (DOM_SID2
*)talloc_zero(ctx
, count
* sizeof(DOM_SID2
));
890 for (number
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
892 if (string_to_sid(&tmpsid
, s2
)) {
893 /* count only valid sids */
894 init_dom_sid2(&sids
[number
], &tmpsid
);
903 /*******************************************************************
904 Inits a NET_ID_INFO_1 structure.
905 ********************************************************************/
907 void init_id_info1(NET_ID_INFO_1
*id
, const char *domain_name
,
908 uint32 param_ctrl
, uint32 log_id_low
, uint32 log_id_high
,
909 const char *user_name
, const char *wksta_name
,
910 const char *sess_key
,
911 unsigned char lm_cypher
[16], unsigned char nt_cypher
[16])
913 int len_domain_name
= strlen(domain_name
);
914 int len_user_name
= strlen(user_name
);
915 int len_wksta_name
= strlen(wksta_name
);
917 unsigned char lm_owf
[16];
918 unsigned char nt_owf
[16];
920 DEBUG(5,("init_id_info1: %d\n", __LINE__
));
922 id
->ptr_id_info1
= 1;
924 init_uni_hdr(&id
->hdr_domain_name
, len_domain_name
);
926 id
->param_ctrl
= param_ctrl
;
927 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
929 init_uni_hdr(&id
->hdr_user_name
, len_user_name
);
930 init_uni_hdr(&id
->hdr_wksta_name
, len_wksta_name
);
932 if (lm_cypher
&& nt_cypher
) {
933 unsigned char key
[16];
934 #ifdef DEBUG_PASSWORD
935 DEBUG(100,("lm cypher:"));
936 dump_data(100, (char *)lm_cypher
, 16);
938 DEBUG(100,("nt cypher:"));
939 dump_data(100, (char *)nt_cypher
, 16);
943 memcpy(key
, sess_key
, 8);
945 memcpy(lm_owf
, lm_cypher
, 16);
946 SamOEMhash(lm_owf
, key
, 16);
947 memcpy(nt_owf
, nt_cypher
, 16);
948 SamOEMhash(nt_owf
, key
, 16);
950 #ifdef DEBUG_PASSWORD
951 DEBUG(100,("encrypt of lm owf password:"));
952 dump_data(100, (char *)lm_owf
, 16);
954 DEBUG(100,("encrypt of nt owf password:"));
955 dump_data(100, (char *)nt_owf
, 16);
957 /* set up pointers to cypher blocks */
962 init_owf_info(&id
->lm_owf
, lm_cypher
);
963 init_owf_info(&id
->nt_owf
, nt_cypher
);
965 init_unistr2(&id
->uni_domain_name
, domain_name
, len_domain_name
);
966 init_unistr2(&id
->uni_user_name
, user_name
, len_user_name
);
967 init_unistr2(&id
->uni_wksta_name
, wksta_name
, len_wksta_name
);
970 /*******************************************************************
971 Reads or writes an NET_ID_INFO_1 structure.
972 ********************************************************************/
974 static BOOL
net_io_id_info1(const char *desc
, NET_ID_INFO_1
*id
, prs_struct
*ps
, int depth
)
979 prs_debug(ps
, depth
, desc
, "net_io_id_info1");
985 if(!prs_uint32("ptr_id_info1", ps
, depth
, &id
->ptr_id_info1
))
988 if (id
->ptr_id_info1
!= 0) {
989 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
992 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
994 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
997 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
999 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1002 if(!smb_io_owf_info("", &id
->lm_owf
, ps
, depth
))
1004 if(!smb_io_owf_info("", &id
->nt_owf
, ps
, depth
))
1007 if(!smb_io_unistr2("unistr2", &id
->uni_domain_name
,
1008 id
->hdr_domain_name
.buffer
, ps
, depth
))
1010 if(!smb_io_unistr2("unistr2", &id
->uni_user_name
,
1011 id
->hdr_user_name
.buffer
, ps
, depth
))
1013 if(!smb_io_unistr2("unistr2", &id
->uni_wksta_name
,
1014 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1021 /*******************************************************************
1022 Inits a NET_ID_INFO_2 structure.
1024 This is a network logon packet. The log_id parameters
1025 are what an NT server would generate for LUID once the
1026 user is logged on. I don't think we care about them.
1028 Note that this has no access to the NT and LM hashed passwords,
1029 so it forwards the challenge, and the NT and LM responses (24
1030 bytes each) over the secure channel to the Domain controller
1031 for it to say yea or nay. This is the preferred method of
1032 checking for a logon as it doesn't export the password
1033 hashes to anyone who has compromised the secure channel. JRA.
1034 ********************************************************************/
1036 void init_id_info2(NET_ID_INFO_2
* id
, const char *domain_name
,
1038 uint32 log_id_low
, uint32 log_id_high
,
1039 const char *user_name
, const char *wksta_name
,
1040 const uchar lm_challenge
[8],
1041 const uchar
* lm_chal_resp
, size_t lm_chal_resp_len
,
1042 const uchar
* nt_chal_resp
, size_t nt_chal_resp_len
)
1044 size_t len_domain_name
= strlen(domain_name
);
1045 size_t len_user_name
= strlen(user_name
);
1046 size_t len_wksta_name
= strlen(wksta_name
);
1047 unsigned char lm_owf
[24];
1048 unsigned char nt_owf
[128];
1050 DEBUG(5,("init_id_info2: %d\n", __LINE__
));
1052 id
->ptr_id_info2
= 1;
1054 init_uni_hdr(&id
->hdr_domain_name
, len_domain_name
);
1056 id
->param_ctrl
= param_ctrl
;
1057 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1059 init_uni_hdr(&id
->hdr_user_name
, len_user_name
);
1060 init_uni_hdr(&id
->hdr_wksta_name
, len_wksta_name
);
1063 /* oops. can only send what-ever-it-is direct */
1064 memcpy(nt_owf
, nt_chal_resp
, MIN(sizeof(nt_owf
), nt_chal_resp_len
));
1065 nt_chal_resp
= nt_owf
;
1068 /* oops. can only send what-ever-it-is direct */
1069 memcpy(lm_owf
, lm_chal_resp
, MIN(sizeof(lm_owf
), lm_chal_resp_len
));
1070 lm_chal_resp
= lm_owf
;
1073 memcpy(id
->lm_chal
, lm_challenge
, sizeof(id
->lm_chal
));
1074 init_str_hdr(&id
->hdr_nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
, (nt_chal_resp
!= NULL
) ? 1 : 0);
1075 init_str_hdr(&id
->hdr_lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
, (lm_chal_resp
!= NULL
) ? 1 : 0);
1077 init_unistr2(&id
->uni_domain_name
, domain_name
, len_domain_name
);
1078 init_unistr2(&id
->uni_user_name
, user_name
, len_user_name
);
1079 init_unistr2(&id
->uni_wksta_name
, wksta_name
, len_wksta_name
);
1081 init_string2(&id
->nt_chal_resp
, (const char *)nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
);
1082 init_string2(&id
->lm_chal_resp
, (const char *)lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
);
1086 /*******************************************************************
1087 Reads or writes an NET_ID_INFO_2 structure.
1088 ********************************************************************/
1090 static BOOL
net_io_id_info2(const char *desc
, NET_ID_INFO_2
*id
, prs_struct
*ps
, int depth
)
1095 prs_debug(ps
, depth
, desc
, "net_io_id_info2");
1101 if(!prs_uint32("ptr_id_info2", ps
, depth
, &id
->ptr_id_info2
))
1104 if (id
->ptr_id_info2
!= 0) {
1105 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1108 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1110 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1113 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1115 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1118 if(!prs_uint8s (False
, "lm_chal", ps
, depth
, id
->lm_chal
, 8)) /* lm 8 byte challenge */
1121 if(!smb_io_strhdr("hdr_nt_chal_resp", &id
->hdr_nt_chal_resp
, ps
, depth
))
1123 if(!smb_io_strhdr("hdr_lm_chal_resp", &id
->hdr_lm_chal_resp
, ps
, depth
))
1126 if(!smb_io_unistr2("uni_domain_name", &id
->uni_domain_name
,
1127 id
->hdr_domain_name
.buffer
, ps
, depth
))
1129 if(!smb_io_unistr2("uni_user_name ", &id
->uni_user_name
,
1130 id
->hdr_user_name
.buffer
, ps
, depth
))
1132 if(!smb_io_unistr2("uni_wksta_name ", &id
->uni_wksta_name
,
1133 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1135 if(!smb_io_string2("nt_chal_resp", &id
->nt_chal_resp
,
1136 id
->hdr_nt_chal_resp
.buffer
, ps
, depth
))
1138 if(!smb_io_string2("lm_chal_resp", &id
->lm_chal_resp
,
1139 id
->hdr_lm_chal_resp
.buffer
, ps
, depth
))
1147 /*******************************************************************
1148 Inits a DOM_SAM_INFO structure.
1149 ********************************************************************/
1151 void init_sam_info(DOM_SAM_INFO
*sam
,
1152 const char *logon_srv
, const char *comp_name
,
1153 DOM_CRED
*clnt_cred
,
1154 DOM_CRED
*rtn_cred
, uint16 logon_level
,
1155 NET_ID_INFO_CTR
*ctr
)
1157 DEBUG(5,("init_sam_info: %d\n", __LINE__
));
1159 init_clnt_info2(&sam
->client
, logon_srv
, comp_name
, clnt_cred
);
1161 if (rtn_cred
!= NULL
) {
1162 sam
->ptr_rtn_cred
= 1;
1163 memcpy(&sam
->rtn_cred
, rtn_cred
, sizeof(sam
->rtn_cred
));
1165 sam
->ptr_rtn_cred
= 0;
1168 sam
->logon_level
= logon_level
;
1172 /*******************************************************************
1173 Reads or writes a DOM_SAM_INFO structure.
1174 ********************************************************************/
1176 static BOOL
net_io_id_info_ctr(const char *desc
, NET_ID_INFO_CTR
**pp_ctr
, prs_struct
*ps
, int depth
)
1178 NET_ID_INFO_CTR
*ctr
= *pp_ctr
;
1180 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1183 if (UNMARSHALLING(ps
)) {
1184 ctr
= *pp_ctr
= (NET_ID_INFO_CTR
*)prs_alloc_mem(ps
, sizeof(NET_ID_INFO_CTR
));
1192 /* don't 4-byte align here! */
1194 if(!prs_uint16("switch_value ", ps
, depth
, &ctr
->switch_value
))
1197 switch (ctr
->switch_value
) {
1199 if(!net_io_id_info1("", &ctr
->auth
.id1
, ps
, depth
))
1203 if(!net_io_id_info2("", &ctr
->auth
.id2
, ps
, depth
))
1208 DEBUG(4,("smb_io_sam_info: unknown switch_value!\n"));
1215 /*******************************************************************
1216 Reads or writes a DOM_SAM_INFO structure.
1217 ********************************************************************/
1219 static BOOL
smb_io_sam_info(const char *desc
, DOM_SAM_INFO
*sam
, prs_struct
*ps
, int depth
)
1224 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1230 if(!smb_io_clnt_info2("", &sam
->client
, ps
, depth
))
1233 if(!prs_uint32("ptr_rtn_cred ", ps
, depth
, &sam
->ptr_rtn_cred
))
1235 if(!smb_io_cred("", &sam
->rtn_cred
, ps
, depth
))
1238 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1241 if (sam
->logon_level
!= 0) {
1242 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1249 /*************************************************************************
1250 Inits a NET_USER_INFO_3 structure.
1252 This is a network logon reply packet, and contains much information about
1253 the user. This information is passed as a (very long) paramater list
1254 to avoid having to link in the PASSDB code to every program that deals
1256 *************************************************************************/
1258 void init_net_user_info3(TALLOC_CTX
*ctx
, NET_USER_INFO_3
*usr
,
1262 const char* user_name
,
1263 const char* full_name
,
1264 const char* home_dir
,
1265 const char* dir_drive
,
1266 const char* logon_script
,
1267 const char* profile_path
,
1269 time_t unix_logon_time
,
1270 time_t unix_logoff_time
,
1271 time_t unix_kickoff_time
,
1272 time_t unix_pass_last_set_time
,
1273 time_t unix_pass_can_change_time
,
1274 time_t unix_pass_must_change_time
,
1276 uint16 logon_count
, uint16 bad_pw_count
,
1277 uint32 num_groups
, const DOM_GID
*gids
,
1278 uint32 user_flgs
, uchar sess_key
[16],
1279 const char *logon_srv
, const char *logon_dom
,
1280 const DOM_SID
*dom_sid
, const char *other_sids
)
1282 /* only cope with one "other" sid, right now. */
1283 /* need to count the number of space-delimited sids */
1285 int num_other_sids
= 0;
1287 NTTIME logon_time
, logoff_time
, kickoff_time
,
1288 pass_last_set_time
, pass_can_change_time
,
1289 pass_must_change_time
;
1291 int len_user_name
, len_full_name
, len_home_dir
,
1292 len_dir_drive
, len_logon_script
, len_profile_path
;
1294 int len_logon_srv
= strlen(logon_srv
);
1295 int len_logon_dom
= strlen(logon_dom
);
1297 len_user_name
= strlen(user_name
);
1298 len_full_name
= strlen(full_name
);
1299 len_home_dir
= strlen(home_dir
);
1300 len_dir_drive
= strlen(dir_drive
);
1301 len_logon_script
= strlen(logon_script
);
1302 len_profile_path
= strlen(profile_path
);
1307 usr
->ptr_user_info
= 1; /* yes, we're bothering to put USER_INFO data here */
1311 /* Create NTTIME structs */
1312 unix_to_nt_time (&logon_time
, unix_logon_time
);
1313 unix_to_nt_time (&logoff_time
, unix_logoff_time
);
1314 unix_to_nt_time (&kickoff_time
, unix_kickoff_time
);
1315 unix_to_nt_time (&pass_last_set_time
, unix_pass_last_set_time
);
1316 unix_to_nt_time (&pass_can_change_time
, unix_pass_can_change_time
);
1317 unix_to_nt_time (&pass_must_change_time
, unix_pass_must_change_time
);
1319 usr
->logon_time
= logon_time
;
1320 usr
->logoff_time
= logoff_time
;
1321 usr
->kickoff_time
= kickoff_time
;
1322 usr
->pass_last_set_time
= pass_last_set_time
;
1323 usr
->pass_can_change_time
= pass_can_change_time
;
1324 usr
->pass_must_change_time
= pass_must_change_time
;
1326 init_uni_hdr(&usr
->hdr_user_name
, len_user_name
);
1327 init_uni_hdr(&usr
->hdr_full_name
, len_full_name
);
1328 init_uni_hdr(&usr
->hdr_logon_script
, len_logon_script
);
1329 init_uni_hdr(&usr
->hdr_profile_path
, len_profile_path
);
1330 init_uni_hdr(&usr
->hdr_home_dir
, len_home_dir
);
1331 init_uni_hdr(&usr
->hdr_dir_drive
, len_dir_drive
);
1333 usr
->logon_count
= logon_count
;
1334 usr
->bad_pw_count
= bad_pw_count
;
1336 usr
->user_rid
= user_rid
;
1337 usr
->group_rid
= group_rid
;
1338 usr
->num_groups
= num_groups
;
1340 usr
->buffer_groups
= 1; /* indicates fill in groups, below, even if there are none */
1341 usr
->user_flgs
= user_flgs
;
1343 if (sess_key
!= NULL
)
1344 memcpy(usr
->user_sess_key
, sess_key
, sizeof(usr
->user_sess_key
));
1346 memset((char *)usr
->user_sess_key
, '\0', sizeof(usr
->user_sess_key
));
1348 init_uni_hdr(&usr
->hdr_logon_srv
, len_logon_srv
);
1349 init_uni_hdr(&usr
->hdr_logon_dom
, len_logon_dom
);
1351 usr
->buffer_dom_id
= dom_sid
? 1 : 0; /* yes, we're bothering to put a domain SID in */
1353 memset((char *)usr
->padding
, '\0', sizeof(usr
->padding
));
1355 num_other_sids
= init_dom_sid2s(ctx
, other_sids
, &usr
->other_sids
);
1357 usr
->num_other_sids
= num_other_sids
;
1358 usr
->buffer_other_sids
= (num_other_sids
!= 0) ? 1 : 0;
1360 init_unistr2(&usr
->uni_user_name
, user_name
, len_user_name
);
1361 init_unistr2(&usr
->uni_full_name
, full_name
, len_full_name
);
1362 init_unistr2(&usr
->uni_logon_script
, logon_script
, len_logon_script
);
1363 init_unistr2(&usr
->uni_profile_path
, profile_path
, len_profile_path
);
1364 init_unistr2(&usr
->uni_home_dir
, home_dir
, len_home_dir
);
1365 init_unistr2(&usr
->uni_dir_drive
, dir_drive
, len_dir_drive
);
1367 usr
->num_groups2
= num_groups
;
1369 usr
->gids
= (DOM_GID
*)talloc_zero(ctx
,sizeof(DOM_GID
) * (num_groups
));
1370 if (usr
->gids
== NULL
&& num_groups
>0)
1373 for (i
= 0; i
< num_groups
; i
++)
1374 usr
->gids
[i
] = gids
[i
];
1376 init_unistr2(&usr
->uni_logon_srv
, logon_srv
, len_logon_srv
);
1377 init_unistr2(&usr
->uni_logon_dom
, logon_dom
, len_logon_dom
);
1379 init_dom_sid2(&usr
->dom_sid
, dom_sid
);
1380 /* "other" sids are set up above */
1383 /*******************************************************************
1384 This code has been modified to cope with a NET_USER_INFO_2 - which is
1385 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1386 We use validation level to determine if we're marshalling a info 2 or
1387 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1388 Jacobsen at HP. JRA.
1389 ********************************************************************/
1391 BOOL
net_io_user_info3(const char *desc
, NET_USER_INFO_3
*usr
, prs_struct
*ps
,
1392 int depth
, uint16 validation_level
)
1399 prs_debug(ps
, depth
, desc
, "net_io_user_info3");
1402 if (UNMARSHALLING(ps
))
1408 if(!prs_uint32("ptr_user_info ", ps
, depth
, &usr
->ptr_user_info
))
1411 if (usr
->ptr_user_info
== 0)
1414 if(!smb_io_time("logon time", &usr
->logon_time
, ps
, depth
)) /* logon time */
1416 if(!smb_io_time("logoff time", &usr
->logoff_time
, ps
, depth
)) /* logoff time */
1418 if(!smb_io_time("kickoff time", &usr
->kickoff_time
, ps
, depth
)) /* kickoff time */
1420 if(!smb_io_time("last set time", &usr
->pass_last_set_time
, ps
, depth
)) /* password last set time */
1422 if(!smb_io_time("can change time", &usr
->pass_can_change_time
, ps
, depth
)) /* password can change time */
1424 if(!smb_io_time("must change time", &usr
->pass_must_change_time
, ps
, depth
)) /* password must change time */
1427 if(!smb_io_unihdr("hdr_user_name", &usr
->hdr_user_name
, ps
, depth
)) /* username unicode string header */
1429 if(!smb_io_unihdr("hdr_full_name", &usr
->hdr_full_name
, ps
, depth
)) /* user's full name unicode string header */
1431 if(!smb_io_unihdr("hdr_logon_script", &usr
->hdr_logon_script
, ps
, depth
)) /* logon script unicode string header */
1433 if(!smb_io_unihdr("hdr_profile_path", &usr
->hdr_profile_path
, ps
, depth
)) /* profile path unicode string header */
1435 if(!smb_io_unihdr("hdr_home_dir", &usr
->hdr_home_dir
, ps
, depth
)) /* home directory unicode string header */
1437 if(!smb_io_unihdr("hdr_dir_drive", &usr
->hdr_dir_drive
, ps
, depth
)) /* home directory drive unicode string header */
1440 if(!prs_uint16("logon_count ", ps
, depth
, &usr
->logon_count
)) /* logon count */
1442 if(!prs_uint16("bad_pw_count ", ps
, depth
, &usr
->bad_pw_count
)) /* bad password count */
1445 if(!prs_uint32("user_rid ", ps
, depth
, &usr
->user_rid
)) /* User RID */
1447 if(!prs_uint32("group_rid ", ps
, depth
, &usr
->group_rid
)) /* Group RID */
1449 if(!prs_uint32("num_groups ", ps
, depth
, &usr
->num_groups
)) /* num groups */
1451 if(!prs_uint32("buffer_groups ", ps
, depth
, &usr
->buffer_groups
)) /* undocumented buffer pointer to groups. */
1453 if(!prs_uint32("user_flgs ", ps
, depth
, &usr
->user_flgs
)) /* user flags */
1456 if(!prs_uint8s(False
, "user_sess_key", ps
, depth
, usr
->user_sess_key
, 16)) /* user session key */
1459 if(!smb_io_unihdr("hdr_logon_srv", &usr
->hdr_logon_srv
, ps
, depth
)) /* logon server unicode string header */
1461 if(!smb_io_unihdr("hdr_logon_dom", &usr
->hdr_logon_dom
, ps
, depth
)) /* logon domain unicode string header */
1464 if(!prs_uint32("buffer_dom_id ", ps
, depth
, &usr
->buffer_dom_id
)) /* undocumented logon domain id pointer */
1466 if(!prs_uint8s (False
, "padding ", ps
, depth
, usr
->padding
, 40)) /* unused padding bytes? */
1469 if (validation_level
== 3) {
1470 if(!prs_uint32("num_other_sids", ps
, depth
, &usr
->num_other_sids
)) /* 0 - num_sids */
1472 if(!prs_uint32("buffer_other_sids", ps
, depth
, &usr
->buffer_other_sids
)) /* NULL - undocumented pointer to SIDs. */
1475 if (UNMARSHALLING(ps
)) {
1476 usr
->num_other_sids
= 0;
1477 usr
->buffer_other_sids
= 0;
1481 if(!smb_io_unistr2("uni_user_name", &usr
->uni_user_name
, usr
->hdr_user_name
.buffer
, ps
, depth
)) /* username unicode string */
1483 if(!smb_io_unistr2("uni_full_name", &usr
->uni_full_name
, usr
->hdr_full_name
.buffer
, ps
, depth
)) /* user's full name unicode string */
1485 if(!smb_io_unistr2("uni_logon_script", &usr
->uni_logon_script
, usr
->hdr_logon_script
.buffer
, ps
, depth
)) /* logon script unicode string */
1487 if(!smb_io_unistr2("uni_profile_path", &usr
->uni_profile_path
, usr
->hdr_profile_path
.buffer
, ps
, depth
)) /* profile path unicode string */
1489 if(!smb_io_unistr2("uni_home_dir", &usr
->uni_home_dir
, usr
->hdr_home_dir
.buffer
, ps
, depth
)) /* home directory unicode string */
1491 if(!smb_io_unistr2("uni_dir_drive", &usr
->uni_dir_drive
, usr
->hdr_dir_drive
.buffer
, ps
, depth
)) /* home directory drive unicode string */
1496 if(!prs_uint32("num_groups2 ", ps
, depth
, &usr
->num_groups2
)) /* num groups */
1499 if (UNMARSHALLING(ps
) && usr
->num_groups2
> 0) {
1500 usr
->gids
= (DOM_GID
*)prs_alloc_mem(ps
, sizeof(DOM_GID
)*usr
->num_groups2
);
1501 if (usr
->gids
== NULL
)
1505 for (i
= 0; i
< usr
->num_groups2
; i
++) {
1506 if(!smb_io_gid("", &usr
->gids
[i
], ps
, depth
)) /* group info */
1510 if(!smb_io_unistr2("uni_logon_srv", &usr
->uni_logon_srv
, usr
->hdr_logon_srv
.buffer
, ps
, depth
)) /* logon server unicode string */
1512 if(!smb_io_unistr2("uni_logon_dom", &usr
->uni_logon_dom
, usr
->hdr_logon_srv
.buffer
, ps
, depth
)) /* logon domain unicode string */
1515 if(!smb_io_dom_sid2("", &usr
->dom_sid
, ps
, depth
)) /* domain SID */
1518 if (usr
->num_other_sids
) {
1520 if (UNMARSHALLING(ps
)) {
1521 usr
->other_sids
= (DOM_SID2
*)prs_alloc_mem(ps
, sizeof(DOM_SID2
)*usr
->num_other_sids
);
1522 if (usr
->other_sids
== NULL
)
1526 if(!prs_uint32("num_other_groups", ps
, depth
, &usr
->num_other_groups
))
1529 if (UNMARSHALLING(ps
) && usr
->num_other_groups
> 0) {
1530 usr
->other_gids
= (DOM_GID
*)prs_alloc_mem(ps
, sizeof(DOM_GID
)*usr
->num_other_groups
);
1531 if (usr
->other_gids
== NULL
)
1535 for (i
= 0; i
< usr
->num_other_groups
; i
++) {
1536 if(!smb_io_gid("", &usr
->other_gids
[i
], ps
, depth
)) /* other GIDs */
1539 for (i
= 0; i
< usr
->num_other_sids
; i
++) {
1540 if(!smb_io_dom_sid2("", &usr
->other_sids
[i
], ps
, depth
)) /* other domain SIDs */
1548 /*******************************************************************
1549 Reads or writes a structure.
1550 ********************************************************************/
1552 BOOL
net_io_q_sam_logon(const char *desc
, NET_Q_SAM_LOGON
*q_l
, prs_struct
*ps
, int depth
)
1557 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon");
1563 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
))
1566 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
1572 /*******************************************************************
1573 Reads or writes a structure.
1574 ********************************************************************/
1576 BOOL
net_io_r_sam_logon(const char *desc
, NET_R_SAM_LOGON
*r_l
, prs_struct
*ps
, int depth
)
1581 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon");
1584 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1586 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1589 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
1594 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1595 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
))
1598 if (r_l
->switch_value
!= 0) {
1599 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
))
1604 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
1607 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1616 /*******************************************************************
1617 Reads or writes a structure.
1618 ********************************************************************/
1620 BOOL
net_io_q_sam_logoff(const char *desc
, NET_Q_SAM_LOGOFF
*q_l
, prs_struct
*ps
, int depth
)
1625 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logoff");
1631 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
)) /* domain SID */
1637 /*******************************************************************
1638 Reads or writes a structure.
1639 ********************************************************************/
1641 BOOL
net_io_r_sam_logoff(const char *desc
, NET_R_SAM_LOGOFF
*r_l
, prs_struct
*ps
, int depth
)
1646 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logoff");
1652 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1654 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1657 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1663 /*******************************************************************
1664 makes a NET_Q_SAM_SYNC structure.
1665 ********************************************************************/
1666 BOOL
init_net_q_sam_sync(NET_Q_SAM_SYNC
* q_s
, const char *srv_name
,
1667 const char *cli_name
, DOM_CRED
*cli_creds
,
1668 DOM_CRED
*ret_creds
, uint32 database_id
,
1671 DEBUG(5, ("init_q_sam_sync\n"));
1673 init_unistr2(&q_s
->uni_srv_name
, srv_name
, strlen(srv_name
) + 1);
1674 init_unistr2(&q_s
->uni_cli_name
, cli_name
, strlen(cli_name
) + 1);
1677 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
1680 memcpy(&q_s
->ret_creds
, ret_creds
, sizeof(q_s
->ret_creds
));
1682 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
1684 q_s
->database_id
= database_id
;
1685 q_s
->restart_state
= 0;
1686 q_s
->sync_context
= next_rid
;
1687 q_s
->max_size
= 0xffff;
1692 /*******************************************************************
1693 reads or writes a structure.
1694 ********************************************************************/
1695 BOOL
net_io_q_sam_sync(const char *desc
, NET_Q_SAM_SYNC
* q_s
, prs_struct
*ps
,
1698 prs_debug(ps
, depth
, desc
, "net_io_q_sam_sync");
1701 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
1703 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
1706 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
1708 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
1711 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
1713 if (!prs_uint32("restart_state", ps
, depth
, &q_s
->restart_state
))
1715 if (!prs_uint32("sync_context ", ps
, depth
, &q_s
->sync_context
))
1718 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
1724 /*******************************************************************
1725 reads or writes a structure.
1726 ********************************************************************/
1727 static BOOL
net_io_sam_delta_hdr(const char *desc
, SAM_DELTA_HDR
* delta
,
1728 prs_struct
*ps
, int depth
)
1730 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_hdr");
1733 if (!prs_uint16("type", ps
, depth
, &delta
->type
))
1735 if (!prs_uint16("type2", ps
, depth
, &delta
->type2
))
1737 if (!prs_uint32("target_rid", ps
, depth
, &delta
->target_rid
))
1740 if (!prs_uint32("type3", ps
, depth
, &delta
->type3
))
1743 /* Not sure why we need this but it seems to be necessary to get
1744 sam deltas working. */
1746 if (delta
->type
!= 0x16) {
1747 if (!prs_uint32("ptr_delta", ps
, depth
, &delta
->ptr_delta
))
1754 /*******************************************************************
1755 reads or writes a structure.
1756 ********************************************************************/
1757 static BOOL
net_io_sam_delta_mod_count(const char *desc
, SAM_DELTA_MOD_COUNT
*info
,
1758 prs_struct
*ps
, int depth
)
1760 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_stamp");
1763 if (!prs_uint32("seqnum", ps
, depth
, &info
->seqnum
))
1765 if (!prs_uint32("dom_mod_count_ptr", ps
, depth
,
1766 &info
->dom_mod_count_ptr
))
1769 if (info
->dom_mod_count_ptr
) {
1770 if (!prs_uint64("dom_mod_count", ps
, depth
,
1771 &info
->dom_mod_count
))
1778 /*******************************************************************
1779 reads or writes a structure.
1780 ********************************************************************/
1781 static BOOL
net_io_sam_domain_info(const char *desc
, SAM_DOMAIN_INFO
* info
,
1782 prs_struct
*ps
, int depth
)
1784 prs_debug(ps
, depth
, desc
, "net_io_sam_domain_info");
1787 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
1789 if (!smb_io_unihdr("hdr_oem_info", &info
->hdr_oem_info
, ps
, depth
))
1792 if (!prs_uint64("force_logoff", ps
, depth
, &info
->force_logoff
))
1794 if (!prs_uint16("min_pwd_len", ps
, depth
, &info
->min_pwd_len
))
1796 if (!prs_uint16("pwd_history_len", ps
, depth
, &info
->pwd_history_len
))
1798 if (!prs_uint64("max_pwd_age", ps
, depth
, &info
->max_pwd_age
))
1800 if (!prs_uint64("min_pwd_age", ps
, depth
, &info
->min_pwd_age
))
1802 if (!prs_uint64("dom_mod_count", ps
, depth
, &info
->dom_mod_count
))
1804 if (!smb_io_time("creation_time", &info
->creation_time
, ps
, depth
))
1807 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
1809 if (!smb_io_unihdr("hdr_unknown", &info
->hdr_unknown
, ps
, depth
))
1812 if (ps
->data_offset
+ 40 > ps
->buffer_size
)
1814 ps
->data_offset
+= 40;
1816 if (!smb_io_unistr2("uni_dom_name", &info
->uni_dom_name
,
1817 info
->hdr_dom_name
.buffer
, ps
, depth
))
1819 if (!smb_io_unistr2("buf_oem_info", &info
->buf_oem_info
,
1820 info
->hdr_oem_info
.buffer
, ps
, depth
))
1823 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
1824 info
->hdr_sec_desc
.buffer
, ps
, depth
))
1826 if (!smb_io_unistr2("buf_unknown", &info
->buf_unknown
,
1827 info
->hdr_unknown
.buffer
, ps
, depth
))
1833 /*******************************************************************
1834 reads or writes a structure.
1835 ********************************************************************/
1836 static BOOL
net_io_sam_group_info(const char *desc
, SAM_GROUP_INFO
* info
,
1837 prs_struct
*ps
, int depth
)
1839 prs_debug(ps
, depth
, desc
, "net_io_sam_group_info");
1842 if (!smb_io_unihdr("hdr_grp_name", &info
->hdr_grp_name
, ps
, depth
))
1844 if (!smb_io_gid("gid", &info
->gid
, ps
, depth
))
1846 if (!smb_io_unihdr("hdr_grp_desc", &info
->hdr_grp_desc
, ps
, depth
))
1848 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
1851 if (ps
->data_offset
+ 48 > ps
->buffer_size
)
1853 ps
->data_offset
+= 48;
1855 if (!smb_io_unistr2("uni_grp_name", &info
->uni_grp_name
,
1856 info
->hdr_grp_name
.buffer
, ps
, depth
))
1858 if (!smb_io_unistr2("uni_grp_desc", &info
->uni_grp_desc
,
1859 info
->hdr_grp_desc
.buffer
, ps
, depth
))
1861 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
1862 info
->hdr_sec_desc
.buffer
, ps
, depth
))
1868 /*******************************************************************
1869 reads or writes a structure.
1870 ********************************************************************/
1871 static BOOL
net_io_sam_passwd_info(const char *desc
, SAM_PWD
* pwd
,
1872 prs_struct
*ps
, int depth
)
1874 prs_debug(ps
, depth
, desc
, "net_io_sam_passwd_info");
1877 if (!prs_uint32("unk_0 ", ps
, depth
, &pwd
->unk_0
))
1880 if (!smb_io_unihdr("hdr_lm_pwd", &pwd
->hdr_lm_pwd
, ps
, depth
))
1882 if (!prs_uint8s(False
, "buf_lm_pwd", ps
, depth
, pwd
->buf_lm_pwd
, 16))
1885 if (!smb_io_unihdr("hdr_nt_pwd", &pwd
->hdr_nt_pwd
, ps
, depth
))
1887 if (!prs_uint8s(False
, "buf_nt_pwd", ps
, depth
, pwd
->buf_nt_pwd
, 16))
1890 if (!smb_io_unihdr("", &pwd
->hdr_empty_lm
, ps
, depth
))
1892 if (!smb_io_unihdr("", &pwd
->hdr_empty_nt
, ps
, depth
))
1898 /*******************************************************************
1899 makes a SAM_ACCOUNT_INFO structure.
1900 ********************************************************************/
1901 BOOL
make_sam_account_info(SAM_ACCOUNT_INFO
* info
,
1902 const UNISTR2
*user_name
,
1903 const UNISTR2
*full_name
,
1904 uint32 user_rid
, uint32 group_rid
,
1905 const UNISTR2
*home_dir
,
1906 const UNISTR2
*dir_drive
,
1907 const UNISTR2
*log_scr
,
1908 const UNISTR2
*desc
,
1910 const UNISTR2
*prof_path
,
1911 const UNISTR2
*wkstas
,
1912 const UNISTR2
*unk_str
, const UNISTR2
*mung_dial
)
1914 int len_user_name
= user_name
!= NULL
? user_name
->uni_str_len
: 0;
1915 int len_full_name
= full_name
!= NULL
? full_name
->uni_str_len
: 0;
1916 int len_home_dir
= home_dir
!= NULL
? home_dir
->uni_str_len
: 0;
1917 int len_dir_drive
= dir_drive
!= NULL
? dir_drive
->uni_str_len
: 0;
1918 int len_logon_script
= log_scr
!= NULL
? log_scr
->uni_str_len
: 0;
1919 int len_profile_path
= prof_path
!= NULL
? prof_path
->uni_str_len
: 0;
1920 int len_description
= desc
!= NULL
? desc
->uni_str_len
: 0;
1921 int len_workstations
= wkstas
!= NULL
? wkstas
->uni_str_len
: 0;
1922 int len_unknown_str
= unk_str
!= NULL
? unk_str
->uni_str_len
: 0;
1923 int len_munged_dial
= mung_dial
!= NULL
? mung_dial
->uni_str_len
: 0;
1925 DEBUG(5, ("make_sam_account_info\n"));
1927 make_uni_hdr(&info
->hdr_acct_name
, len_user_name
);
1928 make_uni_hdr(&info
->hdr_full_name
, len_full_name
);
1929 make_uni_hdr(&info
->hdr_home_dir
, len_home_dir
);
1930 make_uni_hdr(&info
->hdr_dir_drive
, len_dir_drive
);
1931 make_uni_hdr(&info
->hdr_logon_script
, len_logon_script
);
1932 make_uni_hdr(&info
->hdr_profile
, len_profile_path
);
1933 make_uni_hdr(&info
->hdr_acct_desc
, len_description
);
1934 make_uni_hdr(&info
->hdr_workstations
, len_workstations
);
1935 make_uni_hdr(&info
->hdr_comment
, len_unknown_str
);
1936 make_uni_hdr(&info
->hdr_parameters
, len_munged_dial
);
1939 make_bufhdr2(&info
->hdr_sec_desc
, 0, 0, 0);
1941 info
->user_rid
= user_rid
;
1942 info
->group_rid
= group_rid
;
1944 init_nt_time(&info
->logon_time
);
1945 init_nt_time(&info
->logoff_time
);
1946 init_nt_time(&info
->pwd_last_set_time
);
1947 init_nt_time(&info
->acct_expiry_time
);
1949 info
->logon_divs
= 0xA8;
1950 info
->ptr_logon_hrs
= 0; /* Don't care right now */
1952 info
->bad_pwd_count
= 0;
1953 info
->logon_count
= 0;
1954 info
->acb_info
= acb_info
;
1955 info
->nt_pwd_present
= 0;
1956 info
->lm_pwd_present
= 0;
1957 info
->pwd_expired
= 0;
1961 info
->unknown1
= 0x4EC;
1964 copy_unistr2(&info
->uni_acct_name
, user_name
);
1965 copy_unistr2(&info
->uni_full_name
, full_name
);
1966 copy_unistr2(&info
->uni_home_dir
, home_dir
);
1967 copy_unistr2(&info
->uni_dir_drive
, dir_drive
);
1968 copy_unistr2(&info
->uni_logon_script
, log_scr
);
1969 copy_unistr2(&info
->uni_profile
, prof_path
);
1970 copy_unistr2(&info
->uni_acct_desc
, desc
);
1971 copy_unistr2(&info
->uni_workstations
, wkstas
);
1972 copy_unistr2(&info
->uni_comment
, unk_str
);
1973 copy_unistr2(&info
->uni_parameters
, mung_dial
);
1978 /*******************************************************************
1979 reads or writes a structure.
1980 ********************************************************************/
1981 static BOOL
net_io_sam_account_info(const char *desc
, uint8 sess_key
[16],
1982 SAM_ACCOUNT_INFO
* info
, prs_struct
*ps
,
1985 BUFHDR2 hdr_priv_data
;
1988 prs_debug(ps
, depth
, desc
, "net_io_sam_account_info");
1991 if (!smb_io_unihdr("hdr_acct_name", &info
->hdr_acct_name
, ps
, depth
))
1993 if (!smb_io_unihdr("hdr_full_name", &info
->hdr_full_name
, ps
, depth
))
1996 if (!prs_uint32("user_rid ", ps
, depth
, &info
->user_rid
))
1998 if (!prs_uint32("group_rid", ps
, depth
, &info
->group_rid
))
2001 if (!smb_io_unihdr("hdr_home_dir ", &info
->hdr_home_dir
, ps
, depth
))
2003 if (!smb_io_unihdr("hdr_dir_drive", &info
->hdr_dir_drive
, ps
, depth
))
2005 if (!smb_io_unihdr("hdr_logon_script", &info
->hdr_logon_script
, ps
,
2009 if (!smb_io_unihdr("hdr_acct_desc", &info
->hdr_acct_desc
, ps
, depth
))
2011 if (!smb_io_unihdr("hdr_workstations", &info
->hdr_workstations
, ps
,
2015 if (!smb_io_time("logon_time", &info
->logon_time
, ps
, depth
))
2017 if (!smb_io_time("logoff_time", &info
->logoff_time
, ps
, depth
))
2020 if (!prs_uint32("logon_divs ", ps
, depth
, &info
->logon_divs
))
2022 if (!prs_uint32("ptr_logon_hrs", ps
, depth
, &info
->ptr_logon_hrs
))
2025 if (!prs_uint16("bad_pwd_count", ps
, depth
, &info
->bad_pwd_count
))
2027 if (!prs_uint16("logon_count", ps
, depth
, &info
->logon_count
))
2029 if (!smb_io_time("pwd_last_set_time", &info
->pwd_last_set_time
, ps
,
2032 if (!smb_io_time("acct_expiry_time", &info
->acct_expiry_time
, ps
,
2036 if (!prs_uint32("acb_info", ps
, depth
, &info
->acb_info
))
2038 if (!prs_uint8s(False
, "nt_pwd", ps
, depth
, info
->nt_pwd
, 16))
2040 if (!prs_uint8s(False
, "lm_pwd", ps
, depth
, info
->lm_pwd
, 16))
2042 if (!prs_uint8("lm_pwd_present", ps
, depth
, &info
->lm_pwd_present
))
2044 if (!prs_uint8("nt_pwd_present", ps
, depth
, &info
->nt_pwd_present
))
2046 if (!prs_uint8("pwd_expired", ps
, depth
, &info
->pwd_expired
))
2049 if (!smb_io_unihdr("hdr_comment", &info
->hdr_comment
, ps
, depth
))
2051 if (!smb_io_unihdr("hdr_parameters", &info
->hdr_parameters
, ps
,
2054 if (!prs_uint16("country", ps
, depth
, &info
->country
))
2056 if (!prs_uint16("codepage", ps
, depth
, &info
->codepage
))
2059 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data
, ps
, depth
))
2061 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2063 if (!smb_io_unihdr("hdr_profile", &info
->hdr_profile
, ps
, depth
))
2066 for (i
= 0; i
< 3; i
++)
2068 if (!smb_io_unihdr("hdr_reserved", &info
->hdr_reserved
[i
],
2073 for (i
= 0; i
< 4; i
++)
2075 if (!prs_uint32("dw_reserved", ps
, depth
,
2076 &info
->dw_reserved
[i
]))
2080 if (!smb_io_unistr2("uni_acct_name", &info
->uni_acct_name
,
2081 info
->hdr_acct_name
.buffer
, ps
, depth
))
2084 if (!smb_io_unistr2("uni_full_name", &info
->uni_full_name
,
2085 info
->hdr_full_name
.buffer
, ps
, depth
))
2088 if (!smb_io_unistr2("uni_home_dir ", &info
->uni_home_dir
,
2089 info
->hdr_home_dir
.buffer
, ps
, depth
))
2092 if (!smb_io_unistr2("uni_dir_drive", &info
->uni_dir_drive
,
2093 info
->hdr_dir_drive
.buffer
, ps
, depth
))
2096 if (!smb_io_unistr2("uni_logon_script", &info
->uni_logon_script
,
2097 info
->hdr_logon_script
.buffer
, ps
, depth
))
2100 if (!smb_io_unistr2("uni_acct_desc", &info
->uni_acct_desc
,
2101 info
->hdr_acct_desc
.buffer
, ps
, depth
))
2104 if (!smb_io_unistr2("uni_workstations", &info
->uni_workstations
,
2105 info
->hdr_workstations
.buffer
, ps
, depth
))
2109 if (!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2111 if (!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2114 if (!smb_io_buffer4("buf_logon_hrs", &info
->buf_logon_hrs
,
2115 info
->ptr_logon_hrs
, ps
, depth
))
2118 if (!smb_io_unistr2("uni_comment", &info
->uni_comment
,
2119 info
->hdr_comment
.buffer
, ps
, depth
))
2122 if (!smb_io_unistr2("uni_parameters", &info
->uni_parameters
,
2123 info
->hdr_parameters
.buffer
, ps
, depth
))
2126 if (hdr_priv_data
.buffer
!= 0)
2130 if (!prs_uint32("pwd_len", ps
, depth
, &len
))
2132 old_offset
= ps
->data_offset
;
2138 if (!prs_hash1(ps
, ps
->data_offset
, sess_key
, len
))
2141 if (!net_io_sam_passwd_info("pass", &info
->pass
,
2148 if (!prs_hash1(ps
, old_offset
, sess_key
, len
))
2152 if (old_offset
+ len
> ps
->buffer_size
)
2154 ps
->data_offset
= old_offset
+ len
;
2156 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2157 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2160 if (!smb_io_unistr2("uni_profile", &info
->uni_profile
,
2161 info
->hdr_profile
.buffer
, ps
, depth
))
2169 /*******************************************************************
2170 reads or writes a structure.
2171 ********************************************************************/
2172 static BOOL
net_io_sam_group_mem_info(const char *desc
, SAM_GROUP_MEM_INFO
* info
,
2173 prs_struct
*ps
, int depth
)
2178 prs_debug(ps
, depth
, desc
, "net_io_sam_group_mem_info");
2182 if (!prs_uint32("ptr_rids ", ps
, depth
, &info
->ptr_rids
))
2184 if (!prs_uint32("ptr_attribs", ps
, depth
, &info
->ptr_attribs
))
2186 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2189 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2191 ps
->data_offset
+= 16;
2193 if (info
->ptr_rids
!= 0)
2195 if (!prs_uint32("num_members2", ps
, depth
,
2196 &info
->num_members2
))
2199 if (info
->num_members2
!= info
->num_members
)
2205 info
->rids
= talloc(ps
->mem_ctx
, sizeof(uint32
) *
2206 info
->num_members2
);
2208 if (info
->rids
== NULL
) {
2209 DEBUG(0, ("out of memory allocating %d rids\n",
2210 info
->num_members2
));
2214 for (i
= 0; i
< info
->num_members2
; i
++)
2216 slprintf(tmp
, sizeof(tmp
) - 1, "rids[%02d]", i
);
2217 if (!prs_uint32(tmp
, ps
, depth
, &info
->rids
[i
]))
2222 if (info
->ptr_attribs
!= 0)
2224 if (!prs_uint32("num_members3", ps
, depth
,
2225 &info
->num_members3
))
2227 if (info
->num_members3
!= info
->num_members
)
2233 info
->attribs
= talloc(ps
->mem_ctx
, sizeof(uint32
) *
2234 info
->num_members3
);
2236 if (info
->attribs
== NULL
) {
2237 DEBUG(0, ("out of memory allocating %d attribs\n",
2238 info
->num_members3
));
2242 for (i
= 0; i
< info
->num_members3
; i
++)
2244 slprintf(tmp
, sizeof(tmp
) - 1, "attribs[%02d]", i
);
2245 if (!prs_uint32(tmp
, ps
, depth
, &info
->attribs
[i
]))
2253 /*******************************************************************
2254 reads or writes a structure.
2255 ********************************************************************/
2256 static BOOL
net_io_sam_alias_info(const char *desc
, SAM_ALIAS_INFO
* info
,
2257 prs_struct
*ps
, int depth
)
2259 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_info");
2262 if (!smb_io_unihdr("hdr_als_name", &info
->hdr_als_name
, ps
, depth
))
2264 if (!prs_uint32("als_rid", ps
, depth
, &info
->als_rid
))
2266 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2268 if (!smb_io_unihdr("hdr_als_desc", &info
->hdr_als_desc
, ps
, depth
))
2271 if (ps
->data_offset
+ 40 > ps
->buffer_size
)
2273 ps
->data_offset
+= 40;
2275 if (!smb_io_unistr2("uni_als_name", &info
->uni_als_name
,
2276 info
->hdr_als_name
.buffer
, ps
, depth
))
2278 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2279 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2282 if (info
->hdr_als_desc
.buffer
!= 0) {
2283 if (!smb_io_unistr2("uni_als_desc", &info
->uni_als_desc
,
2284 info
->hdr_als_name
.buffer
, ps
, depth
))
2291 /*******************************************************************
2292 reads or writes a structure.
2293 ********************************************************************/
2294 static BOOL
net_io_sam_alias_mem_info(const char *desc
, SAM_ALIAS_MEM_INFO
* info
,
2295 prs_struct
*ps
, int depth
)
2300 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_mem_info");
2304 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2306 if (!prs_uint32("ptr_members", ps
, depth
, &info
->ptr_members
))
2309 if (info
->ptr_members
!= 0)
2311 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2313 ps
->data_offset
+= 16;
2315 if (!prs_uint32("num_sids", ps
, depth
, &info
->num_sids
))
2317 if (info
->num_sids
!= info
->num_members
)
2323 info
->ptr_sids
= talloc(ps
->mem_ctx
, sizeof(uint32
) *
2326 if (info
->ptr_sids
== NULL
) {
2327 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2332 for (i
= 0; i
< info
->num_sids
; i
++)
2334 slprintf(tmp
, sizeof(tmp
) - 1, "ptr_sids[%02d]", i
);
2335 if (!prs_uint32(tmp
, ps
, depth
, &info
->ptr_sids
[i
]))
2339 info
->sids
= talloc(ps
->mem_ctx
, sizeof(DOM_SID2
) *
2342 if (info
->sids
== NULL
) {
2343 DEBUG(0, ("error allocating %d sids\n",
2348 for (i
= 0; i
< info
->num_sids
; i
++)
2350 if (info
->ptr_sids
[i
] != 0)
2352 slprintf(tmp
, sizeof(tmp
) - 1, "sids[%02d]",
2354 if (!smb_io_dom_sid2(tmp
, &info
->sids
[i
],
2364 /*******************************************************************
2365 reads or writes a structure.
2366 ********************************************************************/
2367 static BOOL
net_io_sam_policy_info(const char *desc
, SAM_DELTA_POLICY
*info
,
2368 prs_struct
*ps
, int depth
)
2371 prs_debug(ps
, depth
, desc
, "net_io_sam_policy_info");
2377 if (!prs_uint32("max_log_size", ps
, depth
, &info
->max_log_size
))
2379 if (!prs_uint64("audit_retention_period", ps
, depth
,
2380 &info
->audit_retention_period
))
2382 if (!prs_uint32("auditing_mode", ps
, depth
, &info
->auditing_mode
))
2384 if (!prs_uint32("num_events", ps
, depth
, &info
->num_events
))
2386 if (!prs_uint32("ptr_events", ps
, depth
, &info
->ptr_events
))
2389 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2392 if (!prs_uint32("sid_ptr", ps
, depth
, &info
->sid_ptr
))
2395 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2397 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2398 &info
->non_paged_pool_limit
))
2400 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2402 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2404 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2406 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2408 if (!smb_io_time("modify_time", &info
->modify_time
, ps
, depth
))
2410 if (!smb_io_time("create_time", &info
->create_time
, ps
, depth
))
2412 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2415 for (i
=0; i
<4; i
++) {
2417 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2421 for (i
=0; i
<4; i
++) {
2423 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2427 if (!prs_uint32("num_event_audit_options", ps
, depth
,
2428 &info
->num_event_audit_options
))
2431 for (i
=0; i
<info
->num_event_audit_options
; i
++)
2432 if (!prs_uint32("event_audit_option", ps
, depth
,
2433 &info
->event_audit_option
))
2436 if (!smb_io_unistr2("domain_name", &info
->domain_name
, True
, ps
, depth
))
2439 if(!smb_io_dom_sid2("domain_sid", &info
->domain_sid
, ps
, depth
))
2442 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2443 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2452 /* This function is pretty broken - see bug #334 */
2454 /*******************************************************************
2455 reads or writes a structure.
2456 ********************************************************************/
2457 static BOOL
net_io_sam_trustdoms_info(const char *desc
, SAM_DELTA_TRUSTDOMS
*info
,
2458 prs_struct
*ps
, int depth
)
2462 prs_debug(ps
, depth
, desc
, "net_io_sam_trustdoms_info");
2468 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2471 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2474 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2477 if(!smb_io_unihdr("hdr_domain", &info
->hdr_domain
, ps
, depth
))
2480 if(!prs_uint32("unknown0", ps
, depth
, &info
->unknown0
))
2482 if(!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2484 if(!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2487 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2489 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2492 for (i
=0; i
<12; i
++)
2493 if(!prs_uint32("unknown3", ps
, depth
, &info
->unknown3
))
2496 if (!smb_io_unistr2("domain", &info
->domain
, True
, ps
, depth
))
2506 /* This function doesn't work - see bug #334 */
2508 /*******************************************************************
2509 reads or writes a structure.
2510 ********************************************************************/
2511 static BOOL
net_io_sam_secret_info(const char *desc
, SAM_DELTA_SECRET
*info
,
2512 prs_struct
*ps
, int depth
)
2516 prs_debug(ps
, depth
, desc
, "net_io_sam_secret_info");
2522 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2525 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2528 if (!smb_io_unistr2("secret", &info
->secret
, True
, ps
, depth
))
2534 if(!prs_uint32("count1", ps
, depth
, &info
->count1
))
2536 if(!prs_uint32("count2", ps
, depth
, &info
->count2
))
2538 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2542 if(!smb_io_time("time1", &info
->time1
, ps
, depth
)) /* logon time */
2544 if(!prs_uint32("count3", ps
, depth
, &info
->count3
))
2546 if(!prs_uint32("count4", ps
, depth
, &info
->count4
))
2548 if(!prs_uint32("ptr2", ps
, depth
, &info
->ptr2
))
2550 if(!smb_io_time("time2", &info
->time2
, ps
, depth
)) /* logon time */
2552 if(!prs_uint32("unknow1", ps
, depth
, &info
->unknow1
))
2556 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2558 if(!prs_uint32("ptr3", ps
, depth
, &info
->ptr3
))
2561 if(!prs_uint32("unknow2", ps
, depth
, &info
->unknow2
))
2564 if(!prs_uint32("chal_len", ps
, depth
, &info
->chal_len
))
2566 if(!prs_uint32("reserved1", ps
, depth
, &info
->reserved1
))
2568 if(!prs_uint32("chal_len2", ps
, depth
, &info
->chal_len2
))
2571 if(!prs_uint8s (False
, "chal", ps
, depth
, info
->chal
, info
->chal_len2
))
2574 if(!prs_uint32("key_len", ps
, depth
, &info
->key_len
))
2576 if(!prs_uint32("reserved2", ps
, depth
, &info
->reserved2
))
2578 if(!prs_uint32("key_len2", ps
, depth
, &info
->key_len2
))
2581 if(!prs_uint8s (False
, "key", ps
, depth
, info
->key
, info
->key_len2
))
2585 if(!prs_uint32("buf_size3", ps
, depth
, &info
->buf_size3
))
2588 if(!sec_io_desc("sec_desc2", &info
->sec_desc2
, ps
, depth
))
2597 /*******************************************************************
2598 reads or writes a structure.
2599 ********************************************************************/
2600 static BOOL
net_io_sam_privs_info(const char *desc
, SAM_DELTA_PRIVS
*info
,
2601 prs_struct
*ps
, int depth
)
2605 prs_debug(ps
, depth
, desc
, "net_io_sam_privs_info");
2611 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2614 if(!prs_uint32("priv_count", ps
, depth
, &info
->priv_count
))
2616 if(!prs_uint32("priv_control", ps
, depth
, &info
->priv_control
))
2619 if(!prs_uint32("priv_attr_ptr", ps
, depth
, &info
->priv_attr_ptr
))
2621 if(!prs_uint32("priv_name_ptr", ps
, depth
, &info
->priv_name_ptr
))
2624 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2626 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2627 &info
->non_paged_pool_limit
))
2629 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2631 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2633 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2635 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2637 if (!prs_uint32("system_flags", ps
, depth
, &info
->system_flags
))
2639 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2642 for (i
=0; i
<4; i
++) {
2644 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2648 for (i
=0; i
<4; i
++) {
2650 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2654 if(!prs_uint32("attribute_count", ps
, depth
, &info
->attribute_count
))
2657 info
->attributes
= talloc(ps
->mem_ctx
, sizeof(uint32
) * info
->attribute_count
);
2659 for (i
=0; i
<info
->attribute_count
; i
++)
2660 if(!prs_uint32("attributes", ps
, depth
, &info
->attributes
[i
]))
2663 if(!prs_uint32("privlist_count", ps
, depth
, &info
->privlist_count
))
2666 info
->hdr_privslist
= talloc(ps
->mem_ctx
, sizeof(UNIHDR
) * info
->privlist_count
);
2667 info
->uni_privslist
= talloc(ps
->mem_ctx
, sizeof(UNISTR2
) * info
->privlist_count
);
2669 for (i
=0; i
<info
->privlist_count
; i
++)
2670 if(!smb_io_unihdr("hdr_privslist", &info
->hdr_privslist
[i
], ps
, depth
))
2673 for (i
=0; i
<info
->privlist_count
; i
++)
2674 if (!smb_io_unistr2("uni_privslist", &info
->uni_privslist
[i
], True
, ps
, depth
))
2677 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2678 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2684 /*******************************************************************
2685 reads or writes a structure.
2686 ********************************************************************/
2687 static BOOL
net_io_sam_delta_ctr(const char *desc
, uint8 sess_key
[16],
2688 SAM_DELTA_CTR
* delta
, uint16 type
,
2689 prs_struct
*ps
, int depth
)
2691 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_ctr");
2695 /* Seen in sam deltas */
2696 case SAM_DELTA_MODIFIED_COUNT
:
2697 if (!net_io_sam_delta_mod_count("", &delta
->mod_count
, ps
, depth
))
2701 case SAM_DELTA_DOMAIN_INFO
:
2702 if (!net_io_sam_domain_info("", &delta
->domain_info
, ps
, depth
))
2706 case SAM_DELTA_GROUP_INFO
:
2707 if (!net_io_sam_group_info("", &delta
->group_info
, ps
, depth
))
2711 case SAM_DELTA_ACCOUNT_INFO
:
2712 if (!net_io_sam_account_info("", sess_key
, &delta
->account_info
, ps
, depth
))
2716 case SAM_DELTA_GROUP_MEM
:
2717 if (!net_io_sam_group_mem_info("", &delta
->grp_mem_info
, ps
, depth
))
2721 case SAM_DELTA_ALIAS_INFO
:
2722 if (!net_io_sam_alias_info("", &delta
->alias_info
, ps
, depth
))
2726 case SAM_DELTA_POLICY_INFO
:
2727 if (!net_io_sam_policy_info("", &delta
->policy_info
, ps
, depth
))
2731 case SAM_DELTA_ALIAS_MEM
:
2732 if (!net_io_sam_alias_mem_info("", &delta
->als_mem_info
, ps
, depth
))
2736 case SAM_DELTA_PRIVS_INFO
:
2737 if (!net_io_sam_privs_info("", &delta
->privs_info
, ps
, depth
))
2741 /* These guys are implemented but broken */
2743 case SAM_DELTA_TRUST_DOMS
:
2744 case SAM_DELTA_SECRET_INFO
:
2747 /* These guys are not implemented yet */
2749 case SAM_DELTA_RENAME_GROUP
:
2750 case SAM_DELTA_RENAME_USER
:
2751 case SAM_DELTA_RENAME_ALIAS
:
2752 case SAM_DELTA_DELETE_GROUP
:
2753 case SAM_DELTA_DELETE_USER
:
2755 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type
));
2762 /*******************************************************************
2763 reads or writes a structure.
2764 ********************************************************************/
2765 BOOL
net_io_r_sam_sync(const char *desc
, uint8 sess_key
[16],
2766 NET_R_SAM_SYNC
* r_s
, prs_struct
*ps
, int depth
)
2770 prs_debug(ps
, depth
, desc
, "net_io_r_sam_sync");
2773 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
2775 if (!prs_uint32("sync_context", ps
, depth
, &r_s
->sync_context
))
2778 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
2780 if (r_s
->ptr_deltas
!= 0)
2782 if (!prs_uint32("num_deltas ", ps
, depth
, &r_s
->num_deltas
))
2784 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->ptr_deltas2
))
2786 if (r_s
->ptr_deltas2
!= 0)
2788 if (!prs_uint32("num_deltas2", ps
, depth
,
2792 if (r_s
->num_deltas2
!= r_s
->num_deltas
)
2798 if (r_s
->num_deltas2
> 0) {
2799 r_s
->hdr_deltas
= (SAM_DELTA_HDR
*)
2800 talloc(ps
->mem_ctx
, r_s
->num_deltas2
*
2801 sizeof(SAM_DELTA_HDR
));
2803 if (r_s
->hdr_deltas
== NULL
) {
2804 DEBUG(0, ("error tallocating memory "
2805 "for %d delta headers\n",
2811 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
2813 if (!net_io_sam_delta_hdr("",
2814 &r_s
->hdr_deltas
[i
],
2819 if (r_s
->num_deltas2
> 0) {
2820 r_s
->deltas
= (SAM_DELTA_CTR
*)
2821 talloc(ps
->mem_ctx
, r_s
->num_deltas2
*
2822 sizeof(SAM_DELTA_CTR
));
2824 if (r_s
->deltas
== NULL
) {
2825 DEBUG(0, ("error tallocating memory "
2832 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
2834 if (!net_io_sam_delta_ctr(
2835 "", sess_key
, &r_s
->deltas
[i
],
2836 r_s
->hdr_deltas
[i
].type3
,
2838 DEBUG(0, ("hmm, failed on i=%d\n", i
));
2846 if (!prs_ntstatus("status", ps
, depth
, &(r_s
->status
)))
2852 /*******************************************************************
2853 makes a NET_Q_SAM_DELTAS structure.
2854 ********************************************************************/
2855 BOOL
init_net_q_sam_deltas(NET_Q_SAM_DELTAS
*q_s
, const char *srv_name
,
2856 const char *cli_name
, DOM_CRED
*cli_creds
,
2857 uint32 database_id
, UINT64_S dom_mod_count
)
2859 DEBUG(5, ("init_net_q_sam_deltas\n"));
2861 init_unistr2(&q_s
->uni_srv_name
, srv_name
, strlen(srv_name
) + 1);
2862 init_unistr2(&q_s
->uni_cli_name
, cli_name
, strlen(cli_name
) + 1);
2864 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
2865 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
2867 q_s
->database_id
= database_id
;
2868 q_s
->dom_mod_count
.low
= dom_mod_count
.low
;
2869 q_s
->dom_mod_count
.high
= dom_mod_count
.high
;
2870 q_s
->max_size
= 0xffff;
2875 /*******************************************************************
2876 reads or writes a structure.
2877 ********************************************************************/
2878 BOOL
net_io_q_sam_deltas(const char *desc
, NET_Q_SAM_DELTAS
*q_s
, prs_struct
*ps
,
2881 prs_debug(ps
, depth
, desc
, "net_io_q_sam_deltas");
2884 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
2886 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
2889 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
2891 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
2894 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
2896 if (!prs_uint64("dom_mod_count", ps
, depth
, &q_s
->dom_mod_count
))
2898 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
2904 /*******************************************************************
2905 reads or writes a structure.
2906 ********************************************************************/
2907 BOOL
net_io_r_sam_deltas(const char *desc
, uint8 sess_key
[16],
2908 NET_R_SAM_DELTAS
*r_s
, prs_struct
*ps
, int depth
)
2912 prs_debug(ps
, depth
, desc
, "net_io_r_sam_deltas");
2915 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
2917 if (!prs_uint64("dom_mod_count", ps
, depth
, &r_s
->dom_mod_count
))
2920 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
2922 if (!prs_uint32("num_deltas", ps
, depth
, &r_s
->num_deltas
))
2924 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->num_deltas2
))
2927 if (r_s
->num_deltas2
!= 0)
2929 if (!prs_uint32("num_deltas2 ", ps
, depth
, &r_s
->num_deltas2
))
2932 if (r_s
->ptr_deltas
!= 0)
2934 if (r_s
->num_deltas
> 0) {
2935 r_s
->hdr_deltas
= (SAM_DELTA_HDR
*)
2936 talloc(ps
->mem_ctx
, r_s
->num_deltas
*
2937 sizeof(SAM_DELTA_HDR
));
2938 if (r_s
->hdr_deltas
== NULL
) {
2939 DEBUG(0, ("error tallocating memory "
2940 "for %d delta headers\n",
2946 for (i
= 0; i
< r_s
->num_deltas
; i
++)
2948 net_io_sam_delta_hdr("", &r_s
->hdr_deltas
[i
],
2952 if (r_s
->num_deltas
> 0) {
2953 r_s
->deltas
= (SAM_DELTA_CTR
*)
2954 talloc(ps
->mem_ctx
, r_s
->num_deltas
*
2955 sizeof(SAM_DELTA_CTR
));
2957 if (r_s
->deltas
== NULL
) {
2958 DEBUG(0, ("error tallocating memory "
2965 for (i
= 0; i
< r_s
->num_deltas
; i
++)
2967 if (!net_io_sam_delta_ctr(
2970 r_s
->hdr_deltas
[i
].type2
,
2979 if (!prs_ntstatus("status", ps
, depth
, &r_s
->status
))