2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997.
7 * Copyright (C) Jean François Micouleau 2002.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #define DBGC_CLASS DBGC_RPC_PARSE
29 /*******************************************************************
30 Reads or writes a structure.
31 ********************************************************************/
33 static BOOL
net_io_neg_flags(const char *desc
, NEG_FLAGS
*neg
, prs_struct
*ps
, int depth
)
38 prs_debug(ps
, depth
, desc
, "net_io_neg_flags");
44 if(!prs_uint32("neg_flags", ps
, depth
, &neg
->neg_flags
))
50 /*******************************************************************
51 Inits a NETLOGON_INFO_3 structure.
52 ********************************************************************/
54 static void init_netinfo_3(NETLOGON_INFO_3
*info
, uint32 flags
, uint32 logon_attempts
)
57 info
->logon_attempts
= logon_attempts
;
58 info
->reserved_1
= 0x0;
59 info
->reserved_2
= 0x0;
60 info
->reserved_3
= 0x0;
61 info
->reserved_4
= 0x0;
62 info
->reserved_5
= 0x0;
65 /*******************************************************************
66 Reads or writes a NETLOGON_INFO_3 structure.
67 ********************************************************************/
69 static BOOL
net_io_netinfo_3(const char *desc
, NETLOGON_INFO_3
*info
, prs_struct
*ps
, int depth
)
74 prs_debug(ps
, depth
, desc
, "net_io_netinfo_3");
80 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
82 if(!prs_uint32("logon_attempts", ps
, depth
, &info
->logon_attempts
))
84 if(!prs_uint32("reserved_1 ", ps
, depth
, &info
->reserved_1
))
86 if(!prs_uint32("reserved_2 ", ps
, depth
, &info
->reserved_2
))
88 if(!prs_uint32("reserved_3 ", ps
, depth
, &info
->reserved_3
))
90 if(!prs_uint32("reserved_4 ", ps
, depth
, &info
->reserved_4
))
92 if(!prs_uint32("reserved_5 ", ps
, depth
, &info
->reserved_5
))
99 /*******************************************************************
100 Inits a NETLOGON_INFO_1 structure.
101 ********************************************************************/
103 static void init_netinfo_1(NETLOGON_INFO_1
*info
, uint32 flags
, uint32 pdc_status
)
106 info
->pdc_status
= pdc_status
;
109 /*******************************************************************
110 Reads or writes a NETLOGON_INFO_1 structure.
111 ********************************************************************/
113 static BOOL
net_io_netinfo_1(const char *desc
, NETLOGON_INFO_1
*info
, prs_struct
*ps
, int depth
)
118 prs_debug(ps
, depth
, desc
, "net_io_netinfo_1");
124 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
126 if(!prs_uint32("pdc_status", ps
, depth
, &info
->pdc_status
))
132 /*******************************************************************
133 Inits a NETLOGON_INFO_2 structure.
134 ********************************************************************/
136 static void init_netinfo_2(NETLOGON_INFO_2
*info
, uint32 flags
, uint32 pdc_status
,
137 uint32 tc_status
, const char *trusted_dc_name
)
140 info
->pdc_status
= pdc_status
;
141 info
->ptr_trusted_dc_name
= 1;
142 info
->tc_status
= tc_status
;
144 if (trusted_dc_name
!= NULL
)
145 init_unistr2(&info
->uni_trusted_dc_name
, trusted_dc_name
, UNI_STR_TERMINATE
);
147 init_unistr2(&info
->uni_trusted_dc_name
, "", UNI_STR_TERMINATE
);
150 /*******************************************************************
151 Reads or writes a NETLOGON_INFO_2 structure.
152 ********************************************************************/
154 static BOOL
net_io_netinfo_2(const char *desc
, NETLOGON_INFO_2
*info
, prs_struct
*ps
, int depth
)
159 prs_debug(ps
, depth
, desc
, "net_io_netinfo_2");
165 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
167 if(!prs_uint32("pdc_status ", ps
, depth
, &info
->pdc_status
))
169 if(!prs_uint32("ptr_trusted_dc_name", ps
, depth
, &info
->ptr_trusted_dc_name
))
171 if(!prs_uint32("tc_status ", ps
, depth
, &info
->tc_status
))
174 if (info
->ptr_trusted_dc_name
!= 0) {
175 if(!smb_io_unistr2("unistr2", &info
->uni_trusted_dc_name
, info
->ptr_trusted_dc_name
, ps
, depth
))
185 static BOOL
net_io_ctrl_data_info_5(const char *desc
, CTRL_DATA_INFO_5
*info
, prs_struct
*ps
, int depth
)
190 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_5");
193 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
196 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
199 if ( info
->ptr_domain
) {
200 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
207 static BOOL
net_io_ctrl_data_info_6(const char *desc
, CTRL_DATA_INFO_6
*info
, prs_struct
*ps
, int depth
)
212 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_6");
215 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
218 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
221 if ( info
->ptr_domain
) {
222 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
229 /*******************************************************************
230 Reads or writes an NET_Q_LOGON_CTRL2 structure.
231 ********************************************************************/
233 BOOL
net_io_q_logon_ctrl2(const char *desc
, NET_Q_LOGON_CTRL2
*q_l
, prs_struct
*ps
, int depth
)
238 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl2");
244 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
247 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
253 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
255 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
257 switch ( q_l
->function_code
) {
258 case NETLOGON_CONTROL_REDISCOVER
:
259 if ( !net_io_ctrl_data_info_5( "ctrl_data_info5", &q_l
->info
.info5
, ps
, depth
) )
263 case NETLOGON_CONTROL_TC_QUERY
:
264 if ( !net_io_ctrl_data_info_6( "ctrl_data_info6", &q_l
->info
.info6
, ps
, depth
) )
269 DEBUG(0,("net_io_q_logon_ctrl2: unknown function_code [%d]\n",
270 q_l
->function_code
));
277 /*******************************************************************
278 Inits an NET_Q_LOGON_CTRL2 structure.
279 ********************************************************************/
281 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2
*q_l
, const char *srv_name
,
284 DEBUG(5,("init_q_logon_ctrl2\n"));
286 q_l
->function_code
= 0x01;
287 q_l
->query_level
= query_level
;
289 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
292 /*******************************************************************
293 Inits an NET_R_LOGON_CTRL2 structure.
294 ********************************************************************/
296 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2
*r_l
, uint32 query_level
,
297 uint32 flags
, uint32 pdc_status
,
298 uint32 logon_attempts
, uint32 tc_status
,
299 const char *trusted_domain_name
)
301 r_l
->switch_value
= query_level
;
303 switch (query_level
) {
305 r_l
->ptr
= 1; /* undocumented pointer */
306 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
307 r_l
->status
= NT_STATUS_OK
;
310 r_l
->ptr
= 1; /* undocumented pointer */
311 init_netinfo_2(&r_l
->logon
.info2
, flags
, pdc_status
,
312 tc_status
, trusted_domain_name
);
313 r_l
->status
= NT_STATUS_OK
;
316 r_l
->ptr
= 1; /* undocumented pointer */
317 init_netinfo_3(&r_l
->logon
.info3
, flags
, logon_attempts
);
318 r_l
->status
= NT_STATUS_OK
;
321 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
323 r_l
->ptr
= 0; /* undocumented pointer */
325 /* take a guess at an error code... */
326 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
331 /*******************************************************************
332 Reads or writes an NET_R_LOGON_CTRL2 structure.
333 ********************************************************************/
335 BOOL
net_io_r_logon_ctrl2(const char *desc
, NET_R_LOGON_CTRL2
*r_l
, prs_struct
*ps
, int depth
)
340 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl2");
343 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
345 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
349 switch (r_l
->switch_value
) {
351 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
355 if(!net_io_netinfo_2("", &r_l
->logon
.info2
, ps
, depth
))
359 if(!net_io_netinfo_3("", &r_l
->logon
.info3
, ps
, depth
))
363 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
369 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
375 /*******************************************************************
376 Reads or writes an NET_Q_LOGON_CTRL structure.
377 ********************************************************************/
379 BOOL
net_io_q_logon_ctrl(const char *desc
, NET_Q_LOGON_CTRL
*q_l
, prs_struct
*ps
,
382 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl");
388 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
391 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
397 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
399 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
405 /*******************************************************************
406 Inits an NET_Q_LOGON_CTRL structure.
407 ********************************************************************/
409 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL
*q_l
, const char *srv_name
,
412 DEBUG(5,("init_q_logon_ctrl\n"));
414 q_l
->function_code
= 0x01; /* ??? */
415 q_l
->query_level
= query_level
;
417 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
420 /*******************************************************************
421 Inits an NET_R_LOGON_CTRL structure.
422 ********************************************************************/
424 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL
*r_l
, uint32 query_level
,
425 uint32 flags
, uint32 pdc_status
)
427 DEBUG(5,("init_r_logon_ctrl\n"));
429 r_l
->switch_value
= query_level
; /* should only be 0x1 */
431 switch (query_level
) {
433 r_l
->ptr
= 1; /* undocumented pointer */
434 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
435 r_l
->status
= NT_STATUS_OK
;
438 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
440 r_l
->ptr
= 0; /* undocumented pointer */
442 /* take a guess at an error code... */
443 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
448 /*******************************************************************
449 Reads or writes an NET_R_LOGON_CTRL structure.
450 ********************************************************************/
452 BOOL
net_io_r_logon_ctrl(const char *desc
, NET_R_LOGON_CTRL
*r_l
, prs_struct
*ps
,
455 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl");
458 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
460 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
464 switch (r_l
->switch_value
) {
466 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
470 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
476 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
482 /*******************************************************************
483 Inits an NET_R_GETDCNAME structure.
484 ********************************************************************/
485 void init_net_q_getdcname(NET_Q_GETDCNAME
*r_t
, const char *logon_server
,
486 const char *domainname
)
488 DEBUG(5,("init_r_getdcname\n"));
490 r_t
->ptr_logon_server
= (logon_server
!= NULL
);
491 init_unistr2(&r_t
->uni_logon_server
, logon_server
, UNI_STR_TERMINATE
);
492 r_t
->ptr_domainname
= (domainname
!= NULL
);
493 init_unistr2(&r_t
->uni_domainname
, domainname
, UNI_STR_TERMINATE
);
496 /*******************************************************************
497 Reads or writes an NET_Q_GETDCNAME structure.
498 ********************************************************************/
500 BOOL
net_io_q_getdcname(const char *desc
, NET_Q_GETDCNAME
*r_t
, prs_struct
*ps
,
506 prs_debug(ps
, depth
, desc
, "net_io_q_getdcname");
509 if (!prs_uint32("ptr_logon_server", ps
, depth
, &r_t
->ptr_logon_server
))
512 if (!smb_io_unistr2("logon_server", &r_t
->uni_logon_server
,
513 r_t
->ptr_logon_server
, ps
, depth
))
519 if (!prs_uint32("ptr_domainname", ps
, depth
, &r_t
->ptr_domainname
))
522 if (!smb_io_unistr2("domainname", &r_t
->uni_domainname
,
523 r_t
->ptr_domainname
, ps
, depth
))
530 /*******************************************************************
531 Inits an NET_R_GETDCNAME structure.
532 ********************************************************************/
533 void init_net_r_getdcname(NET_R_GETDCNAME
*r_t
, const char *dcname
)
535 DEBUG(5,("init_r_getdcname\n"));
537 init_unistr2(&r_t
->uni_dcname
, dcname
, UNI_STR_TERMINATE
);
540 /*******************************************************************
541 Reads or writes an NET_R_GETDCNAME structure.
542 ********************************************************************/
544 BOOL
net_io_r_getdcname(const char *desc
, NET_R_GETDCNAME
*r_t
, prs_struct
*ps
,
550 prs_debug(ps
, depth
, desc
, "net_io_r_getdcname");
553 if (!prs_uint32("ptr_dcname", ps
, depth
, &r_t
->ptr_dcname
))
556 if (!smb_io_unistr2("dcname", &r_t
->uni_dcname
,
557 r_t
->ptr_dcname
, ps
, depth
))
560 if (!prs_ntstatus("status", ps
, depth
, &r_t
->status
))
566 /*******************************************************************
567 Inits an NET_R_TRUST_DOM_LIST structure.
568 ********************************************************************/
570 void init_r_trust_dom(NET_R_TRUST_DOM_LIST
*r_t
,
571 uint32 num_doms
, const char *dom_name
)
575 DEBUG(5,("init_r_trust_dom\n"));
577 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
578 r_t
->uni_trust_dom_name
[i
].uni_str_len
= 0;
579 r_t
->uni_trust_dom_name
[i
].uni_max_len
= 0;
581 if (num_doms
> MAX_TRUST_DOMS
)
582 num_doms
= MAX_TRUST_DOMS
;
584 for (i
= 0; i
< num_doms
; i
++) {
586 fstrcpy(domain_name
, dom_name
);
587 strupper_m(domain_name
);
588 init_unistr2(&r_t
->uni_trust_dom_name
[i
], domain_name
, UNI_STR_TERMINATE
);
589 /* the use of UNISTR2 here is non-standard. */
590 r_t
->uni_trust_dom_name
[i
].offset
= 0x1;
593 r_t
->status
= NT_STATUS_OK
;
596 /*******************************************************************
597 Reads or writes an NET_R_TRUST_DOM_LIST structure.
598 ********************************************************************/
600 BOOL
net_io_r_trust_dom(const char *desc
, NET_R_TRUST_DOM_LIST
*r_t
, prs_struct
*ps
, int depth
)
607 prs_debug(ps
, depth
, desc
, "net_io_r_trust_dom");
610 /* temporary code to give a valid response */
612 if(!prs_uint32("status", ps
, depth
, &value
))
616 if(!prs_uint32("status", ps
, depth
, &value
))
619 if(!prs_uint32("status", ps
, depth
, &value
))
623 if(!prs_uint32("status", ps
, depth
, &value
))
627 if(!prs_uint32("status", ps
, depth
, &value
))
630 /* old non working code */
634 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
635 if (r_t
->uni_trust_dom_name
[i
].uni_str_len
== 0)
637 if(!smb_io_unistr2("", &r_t
->uni_trust_dom_name
[i
], True
, ps
, depth
))
641 if(!prs_ntstatus("status", ps
, depth
, &r_t
->status
))
648 /*******************************************************************
649 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
650 ********************************************************************/
652 BOOL
net_io_q_trust_dom(const char *desc
, NET_Q_TRUST_DOM_LIST
*q_l
, prs_struct
*ps
, int depth
)
657 prs_debug(ps
, depth
, desc
, "net_io_q_trust_dom");
660 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
662 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
668 /*******************************************************************
669 Inits an NET_Q_REQ_CHAL structure.
670 ********************************************************************/
672 void init_q_req_chal(NET_Q_REQ_CHAL
*q_c
,
673 const char *logon_srv
, const char *logon_clnt
,
676 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
678 q_c
->undoc_buffer
= 1; /* don't know what this buffer is */
680 init_unistr2(&q_c
->uni_logon_srv
, logon_srv
, UNI_STR_TERMINATE
);
681 init_unistr2(&q_c
->uni_logon_clnt
, logon_clnt
, UNI_STR_TERMINATE
);
683 memcpy(q_c
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
685 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
688 /*******************************************************************
689 Reads or writes an NET_Q_REQ_CHAL structure.
690 ********************************************************************/
692 BOOL
net_io_q_req_chal(const char *desc
, NET_Q_REQ_CHAL
*q_c
, prs_struct
*ps
, int depth
)
697 prs_debug(ps
, depth
, desc
, "net_io_q_req_chal");
703 if(!prs_uint32("undoc_buffer", ps
, depth
, &q_c
->undoc_buffer
))
706 if(!smb_io_unistr2("", &q_c
->uni_logon_srv
, True
, ps
, depth
)) /* logon server unicode string */
708 if(!smb_io_unistr2("", &q_c
->uni_logon_clnt
, True
, ps
, depth
)) /* logon client unicode string */
711 if(!smb_io_chal("", &q_c
->clnt_chal
, ps
, depth
))
717 /*******************************************************************
718 Reads or writes a structure.
719 ********************************************************************/
721 BOOL
net_io_r_req_chal(const char *desc
, NET_R_REQ_CHAL
*r_c
, prs_struct
*ps
, int depth
)
726 prs_debug(ps
, depth
, desc
, "net_io_r_req_chal");
732 if(!smb_io_chal("", &r_c
->srv_chal
, ps
, depth
)) /* server challenge */
735 if(!prs_ntstatus("status", ps
, depth
, &r_c
->status
))
742 /*******************************************************************
743 Reads or writes a structure.
744 ********************************************************************/
746 BOOL
net_io_q_auth(const char *desc
, NET_Q_AUTH
*q_a
, prs_struct
*ps
, int depth
)
751 prs_debug(ps
, depth
, desc
, "net_io_q_auth");
757 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
759 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
765 /*******************************************************************
766 Reads or writes a structure.
767 ********************************************************************/
769 BOOL
net_io_r_auth(const char *desc
, NET_R_AUTH
*r_a
, prs_struct
*ps
, int depth
)
774 prs_debug(ps
, depth
, desc
, "net_io_r_auth");
780 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
783 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
789 /*******************************************************************
790 Inits a NET_Q_AUTH_2 struct.
791 ********************************************************************/
793 void init_q_auth_2(NET_Q_AUTH_2
*q_a
,
794 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
795 DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
797 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
799 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
800 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
801 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
803 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
806 /*******************************************************************
807 Reads or writes a structure.
808 ********************************************************************/
810 BOOL
net_io_q_auth_2(const char *desc
, NET_Q_AUTH_2
*q_a
, prs_struct
*ps
, int depth
)
815 prs_debug(ps
, depth
, desc
, "net_io_q_auth_2");
821 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
823 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
825 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
831 /*******************************************************************
832 Reads or writes a structure.
833 ********************************************************************/
835 BOOL
net_io_r_auth_2(const char *desc
, NET_R_AUTH_2
*r_a
, prs_struct
*ps
, int depth
)
840 prs_debug(ps
, depth
, desc
, "net_io_r_auth_2");
846 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
848 if(!net_io_neg_flags("", &r_a
->srv_flgs
, ps
, depth
))
851 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
857 /*******************************************************************
858 Inits a NET_Q_AUTH_3 struct.
859 ********************************************************************/
861 void init_q_auth_3(NET_Q_AUTH_3
*q_a
,
862 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
863 DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
865 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
867 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
868 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
869 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
871 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
874 /*******************************************************************
875 Reads or writes a structure.
876 ********************************************************************/
878 BOOL
net_io_q_auth_3(const char *desc
, NET_Q_AUTH_3
*q_a
, prs_struct
*ps
, int depth
)
883 prs_debug(ps
, depth
, desc
, "net_io_q_auth_3");
889 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
891 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
893 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
899 /*******************************************************************
900 Reads or writes a structure.
901 ********************************************************************/
903 BOOL
net_io_r_auth_3(const char *desc
, NET_R_AUTH_3
*r_a
, prs_struct
*ps
, int depth
)
908 prs_debug(ps
, depth
, desc
, "net_io_r_auth_3");
914 if(!smb_io_chal("srv_chal", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
916 if(!net_io_neg_flags("srv_flgs", &r_a
->srv_flgs
, ps
, depth
))
918 if (!prs_uint32("unknown", ps
, depth
, &r_a
->unknown
))
921 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
928 /*******************************************************************
929 Inits a NET_Q_SRV_PWSET.
930 ********************************************************************/
932 void init_q_srv_pwset(NET_Q_SRV_PWSET
*q_s
,
933 const char *logon_srv
, const char *sess_key
, const char *acct_name
,
934 uint16 sec_chan
, const char *comp_name
,
935 DOM_CRED
*cred
, uchar hashed_mach_pwd
[16])
937 unsigned char nt_cypher
[16];
939 DEBUG(5,("init_q_srv_pwset\n"));
941 /* Process the new password. */
942 cred_hash3( nt_cypher
, hashed_mach_pwd
, (const unsigned char *)sess_key
, 1);
944 init_clnt_info(&q_s
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
, cred
);
946 memcpy(q_s
->pwd
, nt_cypher
, sizeof(q_s
->pwd
));
949 /*******************************************************************
950 Reads or writes a structure.
951 ********************************************************************/
953 BOOL
net_io_q_srv_pwset(const char *desc
, NET_Q_SRV_PWSET
*q_s
, prs_struct
*ps
, int depth
)
958 prs_debug(ps
, depth
, desc
, "net_io_q_srv_pwset");
964 if(!smb_io_clnt_info("", &q_s
->clnt_id
, ps
, depth
)) /* client identification/authentication info */
966 if(!prs_uint8s (False
, "pwd", ps
, depth
, q_s
->pwd
, 16)) /* new password - undocumented */
972 /*******************************************************************
973 Reads or writes a structure.
974 ********************************************************************/
976 BOOL
net_io_r_srv_pwset(const char *desc
, NET_R_SRV_PWSET
*r_s
, prs_struct
*ps
, int depth
)
981 prs_debug(ps
, depth
, desc
, "net_io_r_srv_pwset");
987 if(!smb_io_cred("", &r_s
->srv_cred
, ps
, depth
)) /* server challenge */
990 if(!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
996 /*************************************************************************
997 Init DOM_SID2 array from a string containing multiple sids
998 *************************************************************************/
1000 static int init_dom_sid2s(TALLOC_CTX
*ctx
, const char *sids_str
, DOM_SID2
**ppsids
)
1006 DEBUG(4,("init_dom_sid2s: %s\n", sids_str
? sids_str
:""));
1014 /* Count the number of valid SIDs. */
1015 for (count
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
1017 if (string_to_sid(&tmpsid
, s2
))
1021 /* Now allocate space for them. */
1022 *ppsids
= TALLOC_ZERO_ARRAY(ctx
, DOM_SID2
, count
);
1023 if (*ppsids
== NULL
)
1028 for (number
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
1030 if (string_to_sid(&tmpsid
, s2
)) {
1031 /* count only valid sids */
1032 init_dom_sid2(&sids
[number
], &tmpsid
);
1041 /*******************************************************************
1042 Inits a NET_ID_INFO_1 structure.
1043 ********************************************************************/
1045 void init_id_info1(NET_ID_INFO_1
*id
, const char *domain_name
,
1046 uint32 param_ctrl
, uint32 log_id_low
, uint32 log_id_high
,
1047 const char *user_name
, const char *wksta_name
,
1048 const char *sess_key
,
1049 unsigned char lm_cypher
[16], unsigned char nt_cypher
[16])
1051 unsigned char lm_owf
[16];
1052 unsigned char nt_owf
[16];
1054 DEBUG(5,("init_id_info1: %d\n", __LINE__
));
1056 id
->ptr_id_info1
= 1;
1058 id
->param_ctrl
= param_ctrl
;
1059 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1062 if (lm_cypher
&& nt_cypher
) {
1063 unsigned char key
[16];
1064 #ifdef DEBUG_PASSWORD
1065 DEBUG(100,("lm cypher:"));
1066 dump_data(100, (char *)lm_cypher
, 16);
1068 DEBUG(100,("nt cypher:"));
1069 dump_data(100, (char *)nt_cypher
, 16);
1073 memcpy(key
, sess_key
, 8);
1075 memcpy(lm_owf
, lm_cypher
, 16);
1076 SamOEMhash(lm_owf
, key
, 16);
1077 memcpy(nt_owf
, nt_cypher
, 16);
1078 SamOEMhash(nt_owf
, key
, 16);
1080 #ifdef DEBUG_PASSWORD
1081 DEBUG(100,("encrypt of lm owf password:"));
1082 dump_data(100, (char *)lm_owf
, 16);
1084 DEBUG(100,("encrypt of nt owf password:"));
1085 dump_data(100, (char *)nt_owf
, 16);
1087 /* set up pointers to cypher blocks */
1092 init_owf_info(&id
->lm_owf
, lm_cypher
);
1093 init_owf_info(&id
->nt_owf
, nt_cypher
);
1095 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1096 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1097 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1098 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1099 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1100 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1103 /*******************************************************************
1104 Reads or writes an NET_ID_INFO_1 structure.
1105 ********************************************************************/
1107 static BOOL
net_io_id_info1(const char *desc
, NET_ID_INFO_1
*id
, prs_struct
*ps
, int depth
)
1112 prs_debug(ps
, depth
, desc
, "net_io_id_info1");
1118 if(!prs_uint32("ptr_id_info1", ps
, depth
, &id
->ptr_id_info1
))
1121 if (id
->ptr_id_info1
!= 0) {
1122 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1125 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1127 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1130 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1132 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1135 if(!smb_io_owf_info("", &id
->lm_owf
, ps
, depth
))
1137 if(!smb_io_owf_info("", &id
->nt_owf
, ps
, depth
))
1140 if(!smb_io_unistr2("unistr2", &id
->uni_domain_name
,
1141 id
->hdr_domain_name
.buffer
, ps
, depth
))
1143 if(!smb_io_unistr2("unistr2", &id
->uni_user_name
,
1144 id
->hdr_user_name
.buffer
, ps
, depth
))
1146 if(!smb_io_unistr2("unistr2", &id
->uni_wksta_name
,
1147 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1154 /*******************************************************************
1155 Inits a NET_ID_INFO_2 structure.
1157 This is a network logon packet. The log_id parameters
1158 are what an NT server would generate for LUID once the
1159 user is logged on. I don't think we care about them.
1161 Note that this has no access to the NT and LM hashed passwords,
1162 so it forwards the challenge, and the NT and LM responses (24
1163 bytes each) over the secure channel to the Domain controller
1164 for it to say yea or nay. This is the preferred method of
1165 checking for a logon as it doesn't export the password
1166 hashes to anyone who has compromised the secure channel. JRA.
1167 ********************************************************************/
1169 void init_id_info2(NET_ID_INFO_2
* id
, const char *domain_name
,
1171 uint32 log_id_low
, uint32 log_id_high
,
1172 const char *user_name
, const char *wksta_name
,
1173 const uchar lm_challenge
[8],
1174 const uchar
* lm_chal_resp
, size_t lm_chal_resp_len
,
1175 const uchar
* nt_chal_resp
, size_t nt_chal_resp_len
)
1177 unsigned char lm_owf
[24];
1178 unsigned char nt_owf
[128];
1180 DEBUG(5,("init_id_info2: %d\n", __LINE__
));
1182 id
->ptr_id_info2
= 1;
1185 id
->param_ctrl
= param_ctrl
;
1186 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1189 /* oops. can only send what-ever-it-is direct */
1190 memcpy(nt_owf
, nt_chal_resp
, MIN(sizeof(nt_owf
), nt_chal_resp_len
));
1191 nt_chal_resp
= nt_owf
;
1194 /* oops. can only send what-ever-it-is direct */
1195 memcpy(lm_owf
, lm_chal_resp
, MIN(sizeof(lm_owf
), lm_chal_resp_len
));
1196 lm_chal_resp
= lm_owf
;
1199 memcpy(id
->lm_chal
, lm_challenge
, sizeof(id
->lm_chal
));
1200 init_str_hdr(&id
->hdr_nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
, (nt_chal_resp
!= NULL
) ? 1 : 0);
1201 init_str_hdr(&id
->hdr_lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
, (lm_chal_resp
!= NULL
) ? 1 : 0);
1203 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1204 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1205 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1206 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1207 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1208 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1210 init_string2(&id
->nt_chal_resp
, (const char *)nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
);
1211 init_string2(&id
->lm_chal_resp
, (const char *)lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
);
1215 /*******************************************************************
1216 Reads or writes an NET_ID_INFO_2 structure.
1217 ********************************************************************/
1219 static BOOL
net_io_id_info2(const char *desc
, NET_ID_INFO_2
*id
, prs_struct
*ps
, int depth
)
1224 prs_debug(ps
, depth
, desc
, "net_io_id_info2");
1230 if(!prs_uint32("ptr_id_info2", ps
, depth
, &id
->ptr_id_info2
))
1233 if (id
->ptr_id_info2
!= 0) {
1234 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1237 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1239 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1242 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1244 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1247 if(!prs_uint8s (False
, "lm_chal", ps
, depth
, id
->lm_chal
, 8)) /* lm 8 byte challenge */
1250 if(!smb_io_strhdr("hdr_nt_chal_resp", &id
->hdr_nt_chal_resp
, ps
, depth
))
1252 if(!smb_io_strhdr("hdr_lm_chal_resp", &id
->hdr_lm_chal_resp
, ps
, depth
))
1255 if(!smb_io_unistr2("uni_domain_name", &id
->uni_domain_name
,
1256 id
->hdr_domain_name
.buffer
, ps
, depth
))
1258 if(!smb_io_unistr2("uni_user_name ", &id
->uni_user_name
,
1259 id
->hdr_user_name
.buffer
, ps
, depth
))
1261 if(!smb_io_unistr2("uni_wksta_name ", &id
->uni_wksta_name
,
1262 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1264 if(!smb_io_string2("nt_chal_resp", &id
->nt_chal_resp
,
1265 id
->hdr_nt_chal_resp
.buffer
, ps
, depth
))
1267 if(!smb_io_string2("lm_chal_resp", &id
->lm_chal_resp
,
1268 id
->hdr_lm_chal_resp
.buffer
, ps
, depth
))
1276 /*******************************************************************
1277 Inits a DOM_SAM_INFO structure.
1278 ********************************************************************/
1280 void init_sam_info(DOM_SAM_INFO
*sam
,
1281 const char *logon_srv
, const char *comp_name
,
1282 DOM_CRED
*clnt_cred
,
1283 DOM_CRED
*rtn_cred
, uint16 logon_level
,
1284 NET_ID_INFO_CTR
*ctr
)
1286 DEBUG(5,("init_sam_info: %d\n", __LINE__
));
1288 init_clnt_info2(&sam
->client
, logon_srv
, comp_name
, clnt_cred
);
1290 if (rtn_cred
!= NULL
) {
1291 sam
->ptr_rtn_cred
= 1;
1292 memcpy(&sam
->rtn_cred
, rtn_cred
, sizeof(sam
->rtn_cred
));
1294 sam
->ptr_rtn_cred
= 0;
1297 sam
->logon_level
= logon_level
;
1301 /*******************************************************************
1302 Reads or writes a DOM_SAM_INFO structure.
1303 ********************************************************************/
1305 static BOOL
net_io_id_info_ctr(const char *desc
, NET_ID_INFO_CTR
**pp_ctr
, prs_struct
*ps
, int depth
)
1307 NET_ID_INFO_CTR
*ctr
= *pp_ctr
;
1309 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1312 if (UNMARSHALLING(ps
)) {
1313 ctr
= *pp_ctr
= PRS_ALLOC_MEM(ps
, NET_ID_INFO_CTR
, 1);
1321 /* don't 4-byte align here! */
1323 if(!prs_uint16("switch_value ", ps
, depth
, &ctr
->switch_value
))
1326 switch (ctr
->switch_value
) {
1328 if(!net_io_id_info1("", &ctr
->auth
.id1
, ps
, depth
))
1332 if(!net_io_id_info2("", &ctr
->auth
.id2
, ps
, depth
))
1337 DEBUG(4,("smb_io_sam_info: unknown switch_value!\n"));
1344 /*******************************************************************
1345 Reads or writes a DOM_SAM_INFO structure.
1346 ********************************************************************/
1348 static BOOL
smb_io_sam_info(const char *desc
, DOM_SAM_INFO
*sam
, prs_struct
*ps
, int depth
)
1353 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1359 if(!smb_io_clnt_info2("", &sam
->client
, ps
, depth
))
1362 if(!prs_uint32("ptr_rtn_cred ", ps
, depth
, &sam
->ptr_rtn_cred
))
1364 if(!smb_io_cred("", &sam
->rtn_cred
, ps
, depth
))
1367 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1370 if (sam
->logon_level
!= 0) {
1371 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1378 /*************************************************************************
1379 Inits a NET_USER_INFO_3 structure.
1381 This is a network logon reply packet, and contains much information about
1382 the user. This information is passed as a (very long) paramater list
1383 to avoid having to link in the PASSDB code to every program that deals
1385 *************************************************************************/
1387 void init_net_user_info3(TALLOC_CTX
*ctx
, NET_USER_INFO_3
*usr
,
1391 const char* user_name
,
1392 const char* full_name
,
1393 const char* home_dir
,
1394 const char* dir_drive
,
1395 const char* logon_script
,
1396 const char* profile_path
,
1398 time_t unix_logon_time
,
1399 time_t unix_logoff_time
,
1400 time_t unix_kickoff_time
,
1401 time_t unix_pass_last_set_time
,
1402 time_t unix_pass_can_change_time
,
1403 time_t unix_pass_must_change_time
,
1405 uint16 logon_count
, uint16 bad_pw_count
,
1406 uint32 num_groups
, const DOM_GID
*gids
,
1407 uint32 user_flgs
, uchar user_session_key
[16],
1408 uchar lm_session_key
[16],
1409 const char *logon_srv
, const char *logon_dom
,
1410 const DOM_SID
*dom_sid
, const char *other_sids
)
1412 /* only cope with one "other" sid, right now. */
1413 /* need to count the number of space-delimited sids */
1415 int num_other_sids
= 0;
1417 NTTIME logon_time
, logoff_time
, kickoff_time
,
1418 pass_last_set_time
, pass_can_change_time
,
1419 pass_must_change_time
;
1423 usr
->ptr_user_info
= 1; /* yes, we're bothering to put USER_INFO data here */
1425 /* Create NTTIME structs */
1426 unix_to_nt_time (&logon_time
, unix_logon_time
);
1427 unix_to_nt_time (&logoff_time
, unix_logoff_time
);
1428 unix_to_nt_time (&kickoff_time
, unix_kickoff_time
);
1429 unix_to_nt_time (&pass_last_set_time
, unix_pass_last_set_time
);
1430 unix_to_nt_time (&pass_can_change_time
, unix_pass_can_change_time
);
1431 unix_to_nt_time (&pass_must_change_time
, unix_pass_must_change_time
);
1433 usr
->logon_time
= logon_time
;
1434 usr
->logoff_time
= logoff_time
;
1435 usr
->kickoff_time
= kickoff_time
;
1436 usr
->pass_last_set_time
= pass_last_set_time
;
1437 usr
->pass_can_change_time
= pass_can_change_time
;
1438 usr
->pass_must_change_time
= pass_must_change_time
;
1440 usr
->logon_count
= logon_count
;
1441 usr
->bad_pw_count
= bad_pw_count
;
1443 usr
->user_rid
= user_rid
;
1444 usr
->group_rid
= group_rid
;
1445 usr
->num_groups
= num_groups
;
1447 usr
->buffer_groups
= 1; /* indicates fill in groups, below, even if there are none */
1448 usr
->user_flgs
= user_flgs
;
1450 if (user_session_key
!= NULL
)
1451 memcpy(usr
->user_sess_key
, user_session_key
, sizeof(usr
->user_sess_key
));
1453 memset((char *)usr
->user_sess_key
, '\0', sizeof(usr
->user_sess_key
));
1455 usr
->buffer_dom_id
= dom_sid
? 1 : 0; /* yes, we're bothering to put a domain SID in */
1457 memset((char *)usr
->lm_sess_key
, '\0', sizeof(usr
->lm_sess_key
));
1458 memset(&usr
->acct_flags
, '\0', sizeof(usr
->acct_flags
));
1460 for (i
=0; i
<7; i
++) {
1461 memset(&usr
->unknown
[i
], '\0', sizeof(usr
->unknown
));
1464 if (lm_session_key
!= NULL
) {
1465 memcpy(usr
->lm_sess_key
, lm_session_key
, sizeof(usr
->lm_sess_key
));
1468 num_other_sids
= init_dom_sid2s(ctx
, other_sids
, &usr
->other_sids
);
1470 usr
->num_other_sids
= num_other_sids
;
1471 usr
->buffer_other_sids
= (num_other_sids
!= 0) ? 1 : 0;
1473 init_unistr2(&usr
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1474 init_uni_hdr(&usr
->hdr_user_name
, &usr
->uni_user_name
);
1475 init_unistr2(&usr
->uni_full_name
, full_name
, UNI_FLAGS_NONE
);
1476 init_uni_hdr(&usr
->hdr_full_name
, &usr
->uni_full_name
);
1477 init_unistr2(&usr
->uni_logon_script
, logon_script
, UNI_FLAGS_NONE
);
1478 init_uni_hdr(&usr
->hdr_logon_script
, &usr
->uni_logon_script
);
1479 init_unistr2(&usr
->uni_profile_path
, profile_path
, UNI_FLAGS_NONE
);
1480 init_uni_hdr(&usr
->hdr_profile_path
, &usr
->uni_profile_path
);
1481 init_unistr2(&usr
->uni_home_dir
, home_dir
, UNI_FLAGS_NONE
);
1482 init_uni_hdr(&usr
->hdr_home_dir
, &usr
->uni_home_dir
);
1483 init_unistr2(&usr
->uni_dir_drive
, dir_drive
, UNI_FLAGS_NONE
);
1484 init_uni_hdr(&usr
->hdr_dir_drive
, &usr
->uni_dir_drive
);
1486 usr
->num_groups2
= num_groups
;
1488 usr
->gids
= TALLOC_ZERO_ARRAY(ctx
,DOM_GID
,num_groups
);
1489 if (usr
->gids
== NULL
&& num_groups
>0)
1492 for (i
= 0; i
< num_groups
; i
++)
1493 usr
->gids
[i
] = gids
[i
];
1495 init_unistr2(&usr
->uni_logon_srv
, logon_srv
, UNI_FLAGS_NONE
);
1496 init_uni_hdr(&usr
->hdr_logon_srv
, &usr
->uni_logon_srv
);
1497 init_unistr2(&usr
->uni_logon_dom
, logon_dom
, UNI_FLAGS_NONE
);
1498 init_uni_hdr(&usr
->hdr_logon_dom
, &usr
->uni_logon_dom
);
1500 init_dom_sid2(&usr
->dom_sid
, dom_sid
);
1501 /* "other" sids are set up above */
1504 /*******************************************************************
1505 This code has been modified to cope with a NET_USER_INFO_2 - which is
1506 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1507 We use validation level to determine if we're marshalling a info 2 or
1508 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1509 Jacobsen at HP. JRA.
1510 ********************************************************************/
1512 BOOL
net_io_user_info3(const char *desc
, NET_USER_INFO_3
*usr
, prs_struct
*ps
,
1513 int depth
, uint16 validation_level
)
1520 prs_debug(ps
, depth
, desc
, "net_io_user_info3");
1523 if (UNMARSHALLING(ps
))
1529 if(!prs_uint32("ptr_user_info ", ps
, depth
, &usr
->ptr_user_info
))
1532 if (usr
->ptr_user_info
== 0)
1535 if(!smb_io_time("logon time", &usr
->logon_time
, ps
, depth
)) /* logon time */
1537 if(!smb_io_time("logoff time", &usr
->logoff_time
, ps
, depth
)) /* logoff time */
1539 if(!smb_io_time("kickoff time", &usr
->kickoff_time
, ps
, depth
)) /* kickoff time */
1541 if(!smb_io_time("last set time", &usr
->pass_last_set_time
, ps
, depth
)) /* password last set time */
1543 if(!smb_io_time("can change time", &usr
->pass_can_change_time
, ps
, depth
)) /* password can change time */
1545 if(!smb_io_time("must change time", &usr
->pass_must_change_time
, ps
, depth
)) /* password must change time */
1548 if(!smb_io_unihdr("hdr_user_name", &usr
->hdr_user_name
, ps
, depth
)) /* username unicode string header */
1550 if(!smb_io_unihdr("hdr_full_name", &usr
->hdr_full_name
, ps
, depth
)) /* user's full name unicode string header */
1552 if(!smb_io_unihdr("hdr_logon_script", &usr
->hdr_logon_script
, ps
, depth
)) /* logon script unicode string header */
1554 if(!smb_io_unihdr("hdr_profile_path", &usr
->hdr_profile_path
, ps
, depth
)) /* profile path unicode string header */
1556 if(!smb_io_unihdr("hdr_home_dir", &usr
->hdr_home_dir
, ps
, depth
)) /* home directory unicode string header */
1558 if(!smb_io_unihdr("hdr_dir_drive", &usr
->hdr_dir_drive
, ps
, depth
)) /* home directory drive unicode string header */
1561 if(!prs_uint16("logon_count ", ps
, depth
, &usr
->logon_count
)) /* logon count */
1563 if(!prs_uint16("bad_pw_count ", ps
, depth
, &usr
->bad_pw_count
)) /* bad password count */
1566 if(!prs_uint32("user_rid ", ps
, depth
, &usr
->user_rid
)) /* User RID */
1568 if(!prs_uint32("group_rid ", ps
, depth
, &usr
->group_rid
)) /* Group RID */
1570 if(!prs_uint32("num_groups ", ps
, depth
, &usr
->num_groups
)) /* num groups */
1572 if(!prs_uint32("buffer_groups ", ps
, depth
, &usr
->buffer_groups
)) /* undocumented buffer pointer to groups. */
1574 if(!prs_uint32("user_flgs ", ps
, depth
, &usr
->user_flgs
)) /* user flags */
1577 if(!prs_uint8s(False
, "user_sess_key", ps
, depth
, usr
->user_sess_key
, 16)) /* user session key */
1580 if(!smb_io_unihdr("hdr_logon_srv", &usr
->hdr_logon_srv
, ps
, depth
)) /* logon server unicode string header */
1582 if(!smb_io_unihdr("hdr_logon_dom", &usr
->hdr_logon_dom
, ps
, depth
)) /* logon domain unicode string header */
1585 if(!prs_uint32("buffer_dom_id ", ps
, depth
, &usr
->buffer_dom_id
)) /* undocumented logon domain id pointer */
1588 if(!prs_uint8s(False
, "lm_sess_key", ps
, depth
, usr
->lm_sess_key
, 8)) /* lm session key */
1591 if(!prs_uint32("acct_flags ", ps
, depth
, &usr
->acct_flags
)) /* Account flags */
1594 for (i
= 0; i
< 7; i
++)
1596 if (!prs_uint32("unkown", ps
, depth
, &usr
->unknown
[i
])) /* unknown */
1600 if (validation_level
== 3) {
1601 if(!prs_uint32("num_other_sids", ps
, depth
, &usr
->num_other_sids
)) /* 0 - num_sids */
1603 if(!prs_uint32("buffer_other_sids", ps
, depth
, &usr
->buffer_other_sids
)) /* NULL - undocumented pointer to SIDs. */
1606 if (UNMARSHALLING(ps
)) {
1607 usr
->num_other_sids
= 0;
1608 usr
->buffer_other_sids
= 0;
1612 if(!smb_io_unistr2("uni_user_name", &usr
->uni_user_name
, usr
->hdr_user_name
.buffer
, ps
, depth
)) /* username unicode string */
1614 if(!smb_io_unistr2("uni_full_name", &usr
->uni_full_name
, usr
->hdr_full_name
.buffer
, ps
, depth
)) /* user's full name unicode string */
1616 if(!smb_io_unistr2("uni_logon_script", &usr
->uni_logon_script
, usr
->hdr_logon_script
.buffer
, ps
, depth
)) /* logon script unicode string */
1618 if(!smb_io_unistr2("uni_profile_path", &usr
->uni_profile_path
, usr
->hdr_profile_path
.buffer
, ps
, depth
)) /* profile path unicode string */
1620 if(!smb_io_unistr2("uni_home_dir", &usr
->uni_home_dir
, usr
->hdr_home_dir
.buffer
, ps
, depth
)) /* home directory unicode string */
1622 if(!smb_io_unistr2("uni_dir_drive", &usr
->uni_dir_drive
, usr
->hdr_dir_drive
.buffer
, ps
, depth
)) /* home directory drive unicode string */
1627 if(!prs_uint32("num_groups2 ", ps
, depth
, &usr
->num_groups2
)) /* num groups */
1630 if (UNMARSHALLING(ps
) && usr
->num_groups2
> 0) {
1631 usr
->gids
= PRS_ALLOC_MEM(ps
, DOM_GID
, usr
->num_groups2
);
1632 if (usr
->gids
== NULL
)
1636 for (i
= 0; i
< usr
->num_groups2
; i
++) {
1637 if(!smb_io_gid("", &usr
->gids
[i
], ps
, depth
)) /* group info */
1641 if(!smb_io_unistr2("uni_logon_srv", &usr
->uni_logon_srv
, usr
->hdr_logon_srv
.buffer
, ps
, depth
)) /* logon server unicode string */
1643 if(!smb_io_unistr2("uni_logon_dom", &usr
->uni_logon_dom
, usr
->hdr_logon_srv
.buffer
, ps
, depth
)) /* logon domain unicode string */
1646 if(!smb_io_dom_sid2("", &usr
->dom_sid
, ps
, depth
)) /* domain SID */
1649 if (usr
->num_other_sids
) {
1651 if (UNMARSHALLING(ps
)) {
1652 usr
->other_sids
= PRS_ALLOC_MEM(ps
, DOM_SID2
, usr
->num_other_sids
);
1653 if (usr
->other_sids
== NULL
)
1657 if(!prs_uint32("num_other_groups", ps
, depth
, &usr
->num_other_groups
))
1660 if (UNMARSHALLING(ps
) && usr
->num_other_groups
> 0) {
1661 usr
->other_gids
= PRS_ALLOC_MEM(ps
, DOM_GID
, usr
->num_other_groups
);
1662 if (usr
->other_gids
== NULL
)
1666 for (i
= 0; i
< usr
->num_other_groups
; i
++) {
1667 if(!smb_io_gid("", &usr
->other_gids
[i
], ps
, depth
)) /* other GIDs */
1670 for (i
= 0; i
< usr
->num_other_sids
; i
++) {
1671 if(!smb_io_dom_sid2("", &usr
->other_sids
[i
], ps
, depth
)) /* other domain SIDs */
1679 /*******************************************************************
1680 Reads or writes a structure.
1681 ********************************************************************/
1683 BOOL
net_io_q_sam_logon(const char *desc
, NET_Q_SAM_LOGON
*q_l
, prs_struct
*ps
, int depth
)
1688 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon");
1694 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
))
1697 if(!prs_align_uint16(ps
))
1700 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
1706 /*******************************************************************
1707 Reads or writes a structure.
1708 ********************************************************************/
1710 BOOL
net_io_r_sam_logon(const char *desc
, NET_R_SAM_LOGON
*r_l
, prs_struct
*ps
, int depth
)
1715 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon");
1718 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1720 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1723 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
1728 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1729 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
))
1732 if (r_l
->switch_value
!= 0) {
1733 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
))
1738 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
1741 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1750 /*******************************************************************
1751 Reads or writes a structure.
1752 ********************************************************************/
1754 BOOL
net_io_q_sam_logoff(const char *desc
, NET_Q_SAM_LOGOFF
*q_l
, prs_struct
*ps
, int depth
)
1759 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logoff");
1765 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
)) /* domain SID */
1771 /*******************************************************************
1772 Reads or writes a structure.
1773 ********************************************************************/
1775 BOOL
net_io_r_sam_logoff(const char *desc
, NET_R_SAM_LOGOFF
*r_l
, prs_struct
*ps
, int depth
)
1780 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logoff");
1786 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1788 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1791 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1797 /*******************************************************************
1798 makes a NET_Q_SAM_SYNC structure.
1799 ********************************************************************/
1800 BOOL
init_net_q_sam_sync(NET_Q_SAM_SYNC
* q_s
, const char *srv_name
,
1801 const char *cli_name
, DOM_CRED
*cli_creds
,
1802 DOM_CRED
*ret_creds
, uint32 database_id
,
1805 DEBUG(5, ("init_q_sam_sync\n"));
1807 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
1808 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
1811 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
1814 memcpy(&q_s
->ret_creds
, ret_creds
, sizeof(q_s
->ret_creds
));
1816 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
1818 q_s
->database_id
= database_id
;
1819 q_s
->restart_state
= 0;
1820 q_s
->sync_context
= next_rid
;
1821 q_s
->max_size
= 0xffff;
1826 /*******************************************************************
1827 reads or writes a structure.
1828 ********************************************************************/
1829 BOOL
net_io_q_sam_sync(const char *desc
, NET_Q_SAM_SYNC
* q_s
, prs_struct
*ps
,
1832 prs_debug(ps
, depth
, desc
, "net_io_q_sam_sync");
1835 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
1837 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
1840 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
1842 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
1845 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
1847 if (!prs_uint32("restart_state", ps
, depth
, &q_s
->restart_state
))
1849 if (!prs_uint32("sync_context ", ps
, depth
, &q_s
->sync_context
))
1852 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
1858 /*******************************************************************
1859 reads or writes a structure.
1860 ********************************************************************/
1861 static BOOL
net_io_sam_delta_hdr(const char *desc
, SAM_DELTA_HDR
* delta
,
1862 prs_struct
*ps
, int depth
)
1864 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_hdr");
1867 if (!prs_uint16("type", ps
, depth
, &delta
->type
))
1869 if (!prs_uint16("type2", ps
, depth
, &delta
->type2
))
1871 if (!prs_uint32("target_rid", ps
, depth
, &delta
->target_rid
))
1874 if (!prs_uint32("type3", ps
, depth
, &delta
->type3
))
1877 /* Not sure why we need this but it seems to be necessary to get
1878 sam deltas working. */
1880 if (delta
->type
!= 0x16) {
1881 if (!prs_uint32("ptr_delta", ps
, depth
, &delta
->ptr_delta
))
1888 /*******************************************************************
1889 reads or writes a structure.
1890 ********************************************************************/
1891 static BOOL
net_io_sam_delta_mod_count(const char *desc
, SAM_DELTA_MOD_COUNT
*info
,
1892 prs_struct
*ps
, int depth
)
1894 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_stamp");
1897 if (!prs_uint32("seqnum", ps
, depth
, &info
->seqnum
))
1899 if (!prs_uint32("dom_mod_count_ptr", ps
, depth
,
1900 &info
->dom_mod_count_ptr
))
1903 if (info
->dom_mod_count_ptr
) {
1904 if (!prs_uint64("dom_mod_count", ps
, depth
,
1905 &info
->dom_mod_count
))
1912 /*******************************************************************
1913 reads or writes a structure.
1914 ********************************************************************/
1915 static BOOL
net_io_sam_domain_info(const char *desc
, SAM_DOMAIN_INFO
* info
,
1916 prs_struct
*ps
, int depth
)
1918 prs_debug(ps
, depth
, desc
, "net_io_sam_domain_info");
1921 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
1923 if (!smb_io_unihdr("hdr_oem_info", &info
->hdr_oem_info
, ps
, depth
))
1926 if (!prs_uint64("force_logoff", ps
, depth
, &info
->force_logoff
))
1928 if (!prs_uint16("min_pwd_len", ps
, depth
, &info
->min_pwd_len
))
1930 if (!prs_uint16("pwd_history_len", ps
, depth
, &info
->pwd_history_len
))
1932 if (!prs_uint64("max_pwd_age", ps
, depth
, &info
->max_pwd_age
))
1934 if (!prs_uint64("min_pwd_age", ps
, depth
, &info
->min_pwd_age
))
1936 if (!prs_uint64("dom_mod_count", ps
, depth
, &info
->dom_mod_count
))
1938 if (!smb_io_time("creation_time", &info
->creation_time
, ps
, depth
))
1940 if (!prs_uint32("security_information", ps
, depth
, &info
->security_information
))
1942 if (!smb_io_bufhdr4("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
1944 if (!smb_io_lockout_string_hdr("hdr_account_lockout_string", &info
->hdr_account_lockout
, ps
, depth
))
1946 if (!smb_io_unihdr("hdr_unknown2", &info
->hdr_unknown2
, ps
, depth
))
1948 if (!smb_io_unihdr("hdr_unknown3", &info
->hdr_unknown3
, ps
, depth
))
1950 if (!smb_io_unihdr("hdr_unknown4", &info
->hdr_unknown4
, ps
, depth
))
1952 if (!prs_uint32("logon_chgpass", ps
, depth
, &info
->logon_chgpass
))
1954 if (!prs_uint32("unknown6", ps
, depth
, &info
->unknown6
))
1956 if (!prs_uint32("unknown7", ps
, depth
, &info
->unknown7
))
1958 if (!prs_uint32("unknown8", ps
, depth
, &info
->unknown8
))
1961 if (!smb_io_unistr2("uni_dom_name", &info
->uni_dom_name
,
1962 info
->hdr_dom_name
.buffer
, ps
, depth
))
1964 if (!smb_io_unistr2("buf_oem_info", &info
->buf_oem_info
,
1965 info
->hdr_oem_info
.buffer
, ps
, depth
))
1968 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
1969 info
->hdr_sec_desc
.buffer
, ps
, depth
))
1972 if (!smb_io_account_lockout_str("account_lockout", &info
->account_lockout
,
1973 info
->hdr_account_lockout
.buffer
, ps
, depth
))
1976 if (!smb_io_unistr2("buf_unknown2", &info
->buf_unknown2
,
1977 info
->hdr_unknown2
.buffer
, ps
, depth
))
1979 if (!smb_io_unistr2("buf_unknown3", &info
->buf_unknown3
,
1980 info
->hdr_unknown3
.buffer
, ps
, depth
))
1982 if (!smb_io_unistr2("buf_unknown4", &info
->buf_unknown4
,
1983 info
->hdr_unknown4
.buffer
, ps
, depth
))
1989 /*******************************************************************
1990 reads or writes a structure.
1991 ********************************************************************/
1992 static BOOL
net_io_sam_group_info(const char *desc
, SAM_GROUP_INFO
* info
,
1993 prs_struct
*ps
, int depth
)
1995 prs_debug(ps
, depth
, desc
, "net_io_sam_group_info");
1998 if (!smb_io_unihdr("hdr_grp_name", &info
->hdr_grp_name
, ps
, depth
))
2000 if (!smb_io_gid("gid", &info
->gid
, ps
, depth
))
2002 if (!smb_io_unihdr("hdr_grp_desc", &info
->hdr_grp_desc
, ps
, depth
))
2004 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2007 if (ps
->data_offset
+ 48 > ps
->buffer_size
)
2009 ps
->data_offset
+= 48;
2011 if (!smb_io_unistr2("uni_grp_name", &info
->uni_grp_name
,
2012 info
->hdr_grp_name
.buffer
, ps
, depth
))
2014 if (!smb_io_unistr2("uni_grp_desc", &info
->uni_grp_desc
,
2015 info
->hdr_grp_desc
.buffer
, ps
, depth
))
2017 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2018 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2024 /*******************************************************************
2025 reads or writes a structure.
2026 ********************************************************************/
2027 static BOOL
net_io_sam_passwd_info(const char *desc
, SAM_PWD
* pwd
,
2028 prs_struct
*ps
, int depth
)
2030 prs_debug(ps
, depth
, desc
, "net_io_sam_passwd_info");
2033 if (!prs_uint32("unk_0 ", ps
, depth
, &pwd
->unk_0
))
2036 if (!smb_io_unihdr("hdr_lm_pwd", &pwd
->hdr_lm_pwd
, ps
, depth
))
2038 if (!prs_uint8s(False
, "buf_lm_pwd", ps
, depth
, pwd
->buf_lm_pwd
, 16))
2041 if (!smb_io_unihdr("hdr_nt_pwd", &pwd
->hdr_nt_pwd
, ps
, depth
))
2043 if (!prs_uint8s(False
, "buf_nt_pwd", ps
, depth
, pwd
->buf_nt_pwd
, 16))
2046 if (!smb_io_unihdr("", &pwd
->hdr_empty_lm
, ps
, depth
))
2048 if (!smb_io_unihdr("", &pwd
->hdr_empty_nt
, ps
, depth
))
2054 /*******************************************************************
2055 makes a SAM_ACCOUNT_INFO structure.
2056 ********************************************************************/
2057 BOOL
make_sam_account_info(SAM_ACCOUNT_INFO
* info
,
2058 const UNISTR2
*user_name
,
2059 const UNISTR2
*full_name
,
2060 uint32 user_rid
, uint32 group_rid
,
2061 const UNISTR2
*home_dir
,
2062 const UNISTR2
*dir_drive
,
2063 const UNISTR2
*log_scr
,
2064 const UNISTR2
*desc
,
2066 const UNISTR2
*prof_path
,
2067 const UNISTR2
*wkstas
,
2068 const UNISTR2
*unk_str
, const UNISTR2
*mung_dial
)
2070 int len_user_name
= user_name
!= NULL
? user_name
->uni_str_len
: 0;
2071 int len_full_name
= full_name
!= NULL
? full_name
->uni_str_len
: 0;
2072 int len_home_dir
= home_dir
!= NULL
? home_dir
->uni_str_len
: 0;
2073 int len_dir_drive
= dir_drive
!= NULL
? dir_drive
->uni_str_len
: 0;
2074 int len_logon_script
= log_scr
!= NULL
? log_scr
->uni_str_len
: 0;
2075 int len_profile_path
= prof_path
!= NULL
? prof_path
->uni_str_len
: 0;
2076 int len_description
= desc
!= NULL
? desc
->uni_str_len
: 0;
2077 int len_workstations
= wkstas
!= NULL
? wkstas
->uni_str_len
: 0;
2078 int len_unknown_str
= unk_str
!= NULL
? unk_str
->uni_str_len
: 0;
2079 int len_munged_dial
= mung_dial
!= NULL
? mung_dial
->uni_str_len
: 0;
2081 DEBUG(5, ("make_sam_account_info\n"));
2083 make_uni_hdr(&info
->hdr_acct_name
, len_user_name
);
2084 make_uni_hdr(&info
->hdr_full_name
, len_full_name
);
2085 make_uni_hdr(&info
->hdr_home_dir
, len_home_dir
);
2086 make_uni_hdr(&info
->hdr_dir_drive
, len_dir_drive
);
2087 make_uni_hdr(&info
->hdr_logon_script
, len_logon_script
);
2088 make_uni_hdr(&info
->hdr_profile
, len_profile_path
);
2089 make_uni_hdr(&info
->hdr_acct_desc
, len_description
);
2090 make_uni_hdr(&info
->hdr_workstations
, len_workstations
);
2091 make_uni_hdr(&info
->hdr_comment
, len_unknown_str
);
2092 make_uni_hdr(&info
->hdr_parameters
, len_munged_dial
);
2095 make_bufhdr2(&info
->hdr_sec_desc
, 0, 0, 0);
2097 info
->user_rid
= user_rid
;
2098 info
->group_rid
= group_rid
;
2100 init_nt_time(&info
->logon_time
);
2101 init_nt_time(&info
->logoff_time
);
2102 init_nt_time(&info
->pwd_last_set_time
);
2103 init_nt_time(&info
->acct_expiry_time
);
2105 info
->logon_divs
= 0xA8;
2106 info
->ptr_logon_hrs
= 0; /* Don't care right now */
2108 info
->bad_pwd_count
= 0;
2109 info
->logon_count
= 0;
2110 info
->acb_info
= acb_info
;
2111 info
->nt_pwd_present
= 0;
2112 info
->lm_pwd_present
= 0;
2113 info
->pwd_expired
= 0;
2117 info
->unknown1
= 0x4EC;
2120 copy_unistr2(&info
->uni_acct_name
, user_name
);
2121 copy_unistr2(&info
->uni_full_name
, full_name
);
2122 copy_unistr2(&info
->uni_home_dir
, home_dir
);
2123 copy_unistr2(&info
->uni_dir_drive
, dir_drive
);
2124 copy_unistr2(&info
->uni_logon_script
, log_scr
);
2125 copy_unistr2(&info
->uni_profile
, prof_path
);
2126 copy_unistr2(&info
->uni_acct_desc
, desc
);
2127 copy_unistr2(&info
->uni_workstations
, wkstas
);
2128 copy_unistr2(&info
->uni_comment
, unk_str
);
2129 copy_unistr2(&info
->uni_parameters
, mung_dial
);
2134 /*******************************************************************
2135 reads or writes a structure.
2136 ********************************************************************/
2137 static BOOL
net_io_sam_account_info(const char *desc
, uint8 sess_key
[16],
2138 SAM_ACCOUNT_INFO
* info
, prs_struct
*ps
,
2141 BUFHDR2 hdr_priv_data
;
2144 prs_debug(ps
, depth
, desc
, "net_io_sam_account_info");
2147 if (!smb_io_unihdr("hdr_acct_name", &info
->hdr_acct_name
, ps
, depth
))
2149 if (!smb_io_unihdr("hdr_full_name", &info
->hdr_full_name
, ps
, depth
))
2152 if (!prs_uint32("user_rid ", ps
, depth
, &info
->user_rid
))
2154 if (!prs_uint32("group_rid", ps
, depth
, &info
->group_rid
))
2157 if (!smb_io_unihdr("hdr_home_dir ", &info
->hdr_home_dir
, ps
, depth
))
2159 if (!smb_io_unihdr("hdr_dir_drive", &info
->hdr_dir_drive
, ps
, depth
))
2161 if (!smb_io_unihdr("hdr_logon_script", &info
->hdr_logon_script
, ps
,
2165 if (!smb_io_unihdr("hdr_acct_desc", &info
->hdr_acct_desc
, ps
, depth
))
2167 if (!smb_io_unihdr("hdr_workstations", &info
->hdr_workstations
, ps
,
2171 if (!smb_io_time("logon_time", &info
->logon_time
, ps
, depth
))
2173 if (!smb_io_time("logoff_time", &info
->logoff_time
, ps
, depth
))
2176 if (!prs_uint32("logon_divs ", ps
, depth
, &info
->logon_divs
))
2178 if (!prs_uint32("ptr_logon_hrs", ps
, depth
, &info
->ptr_logon_hrs
))
2181 if (!prs_uint16("bad_pwd_count", ps
, depth
, &info
->bad_pwd_count
))
2183 if (!prs_uint16("logon_count", ps
, depth
, &info
->logon_count
))
2185 if (!smb_io_time("pwd_last_set_time", &info
->pwd_last_set_time
, ps
,
2188 if (!smb_io_time("acct_expiry_time", &info
->acct_expiry_time
, ps
,
2192 if (!prs_uint32("acb_info", ps
, depth
, &info
->acb_info
))
2194 if (!prs_uint8s(False
, "nt_pwd", ps
, depth
, info
->nt_pwd
, 16))
2196 if (!prs_uint8s(False
, "lm_pwd", ps
, depth
, info
->lm_pwd
, 16))
2198 if (!prs_uint8("lm_pwd_present", ps
, depth
, &info
->lm_pwd_present
))
2200 if (!prs_uint8("nt_pwd_present", ps
, depth
, &info
->nt_pwd_present
))
2202 if (!prs_uint8("pwd_expired", ps
, depth
, &info
->pwd_expired
))
2205 if (!smb_io_unihdr("hdr_comment", &info
->hdr_comment
, ps
, depth
))
2207 if (!smb_io_unihdr("hdr_parameters", &info
->hdr_parameters
, ps
,
2210 if (!prs_uint16("country", ps
, depth
, &info
->country
))
2212 if (!prs_uint16("codepage", ps
, depth
, &info
->codepage
))
2215 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data
, ps
, depth
))
2217 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2219 if (!smb_io_unihdr("hdr_profile", &info
->hdr_profile
, ps
, depth
))
2222 for (i
= 0; i
< 3; i
++)
2224 if (!smb_io_unihdr("hdr_reserved", &info
->hdr_reserved
[i
],
2229 for (i
= 0; i
< 4; i
++)
2231 if (!prs_uint32("dw_reserved", ps
, depth
,
2232 &info
->dw_reserved
[i
]))
2236 if (!smb_io_unistr2("uni_acct_name", &info
->uni_acct_name
,
2237 info
->hdr_acct_name
.buffer
, ps
, depth
))
2240 if (!smb_io_unistr2("uni_full_name", &info
->uni_full_name
,
2241 info
->hdr_full_name
.buffer
, ps
, depth
))
2244 if (!smb_io_unistr2("uni_home_dir ", &info
->uni_home_dir
,
2245 info
->hdr_home_dir
.buffer
, ps
, depth
))
2248 if (!smb_io_unistr2("uni_dir_drive", &info
->uni_dir_drive
,
2249 info
->hdr_dir_drive
.buffer
, ps
, depth
))
2252 if (!smb_io_unistr2("uni_logon_script", &info
->uni_logon_script
,
2253 info
->hdr_logon_script
.buffer
, ps
, depth
))
2256 if (!smb_io_unistr2("uni_acct_desc", &info
->uni_acct_desc
,
2257 info
->hdr_acct_desc
.buffer
, ps
, depth
))
2260 if (!smb_io_unistr2("uni_workstations", &info
->uni_workstations
,
2261 info
->hdr_workstations
.buffer
, ps
, depth
))
2265 if (!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2267 if (!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2270 if (!smb_io_buffer4("buf_logon_hrs", &info
->buf_logon_hrs
,
2271 info
->ptr_logon_hrs
, ps
, depth
))
2274 if (!smb_io_unistr2("uni_comment", &info
->uni_comment
,
2275 info
->hdr_comment
.buffer
, ps
, depth
))
2278 if (!smb_io_unistr2("uni_parameters", &info
->uni_parameters
,
2279 info
->hdr_parameters
.buffer
, ps
, depth
))
2282 if (hdr_priv_data
.buffer
!= 0)
2286 if (!prs_uint32("pwd_len", ps
, depth
, &len
))
2288 old_offset
= ps
->data_offset
;
2294 if (!prs_hash1(ps
, ps
->data_offset
, sess_key
, len
))
2297 if (!net_io_sam_passwd_info("pass", &info
->pass
,
2304 if (!prs_hash1(ps
, old_offset
, sess_key
, len
))
2308 if (old_offset
+ len
> ps
->buffer_size
)
2310 ps
->data_offset
= old_offset
+ len
;
2312 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2313 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2316 if (!smb_io_unistr2("uni_profile", &info
->uni_profile
,
2317 info
->hdr_profile
.buffer
, ps
, depth
))
2325 /*******************************************************************
2326 reads or writes a structure.
2327 ********************************************************************/
2328 static BOOL
net_io_sam_group_mem_info(const char *desc
, SAM_GROUP_MEM_INFO
* info
,
2329 prs_struct
*ps
, int depth
)
2334 prs_debug(ps
, depth
, desc
, "net_io_sam_group_mem_info");
2338 if (!prs_uint32("ptr_rids ", ps
, depth
, &info
->ptr_rids
))
2340 if (!prs_uint32("ptr_attribs", ps
, depth
, &info
->ptr_attribs
))
2342 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2345 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2347 ps
->data_offset
+= 16;
2349 if (info
->ptr_rids
!= 0)
2351 if (!prs_uint32("num_members2", ps
, depth
,
2352 &info
->num_members2
))
2355 if (info
->num_members2
!= info
->num_members
)
2361 info
->rids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members2
);
2363 if (info
->rids
== NULL
) {
2364 DEBUG(0, ("out of memory allocating %d rids\n",
2365 info
->num_members2
));
2369 for (i
= 0; i
< info
->num_members2
; i
++)
2371 slprintf(tmp
, sizeof(tmp
) - 1, "rids[%02d]", i
);
2372 if (!prs_uint32(tmp
, ps
, depth
, &info
->rids
[i
]))
2377 if (info
->ptr_attribs
!= 0)
2379 if (!prs_uint32("num_members3", ps
, depth
,
2380 &info
->num_members3
))
2382 if (info
->num_members3
!= info
->num_members
)
2388 info
->attribs
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members3
);
2390 if (info
->attribs
== NULL
) {
2391 DEBUG(0, ("out of memory allocating %d attribs\n",
2392 info
->num_members3
));
2396 for (i
= 0; i
< info
->num_members3
; i
++)
2398 slprintf(tmp
, sizeof(tmp
) - 1, "attribs[%02d]", i
);
2399 if (!prs_uint32(tmp
, ps
, depth
, &info
->attribs
[i
]))
2407 /*******************************************************************
2408 reads or writes a structure.
2409 ********************************************************************/
2410 static BOOL
net_io_sam_alias_info(const char *desc
, SAM_ALIAS_INFO
* info
,
2411 prs_struct
*ps
, int depth
)
2413 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_info");
2416 if (!smb_io_unihdr("hdr_als_name", &info
->hdr_als_name
, ps
, depth
))
2418 if (!prs_uint32("als_rid", ps
, depth
, &info
->als_rid
))
2420 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2422 if (!smb_io_unihdr("hdr_als_desc", &info
->hdr_als_desc
, ps
, depth
))
2425 if (ps
->data_offset
+ 40 > ps
->buffer_size
)
2427 ps
->data_offset
+= 40;
2429 if (!smb_io_unistr2("uni_als_name", &info
->uni_als_name
,
2430 info
->hdr_als_name
.buffer
, ps
, depth
))
2432 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2433 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2436 if (!smb_io_unistr2("uni_als_desc", &info
->uni_als_desc
,
2437 info
->hdr_als_desc
.buffer
, ps
, depth
))
2443 /*******************************************************************
2444 reads or writes a structure.
2445 ********************************************************************/
2446 static BOOL
net_io_sam_alias_mem_info(const char *desc
, SAM_ALIAS_MEM_INFO
* info
,
2447 prs_struct
*ps
, int depth
)
2452 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_mem_info");
2456 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2458 if (!prs_uint32("ptr_members", ps
, depth
, &info
->ptr_members
))
2461 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2463 ps
->data_offset
+= 16;
2465 if (info
->ptr_members
!= 0)
2467 if (!prs_uint32("num_sids", ps
, depth
, &info
->num_sids
))
2469 if (info
->num_sids
!= info
->num_members
)
2475 info
->ptr_sids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_sids
);
2477 if (info
->ptr_sids
== NULL
) {
2478 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2483 for (i
= 0; i
< info
->num_sids
; i
++)
2485 slprintf(tmp
, sizeof(tmp
) - 1, "ptr_sids[%02d]", i
);
2486 if (!prs_uint32(tmp
, ps
, depth
, &info
->ptr_sids
[i
]))
2490 info
->sids
= TALLOC_ARRAY(ps
->mem_ctx
, DOM_SID2
, info
->num_sids
);
2492 if (info
->sids
== NULL
) {
2493 DEBUG(0, ("error allocating %d sids\n",
2498 for (i
= 0; i
< info
->num_sids
; i
++)
2500 if (info
->ptr_sids
[i
] != 0)
2502 slprintf(tmp
, sizeof(tmp
) - 1, "sids[%02d]",
2504 if (!smb_io_dom_sid2(tmp
, &info
->sids
[i
],
2514 /*******************************************************************
2515 reads or writes a structure.
2516 ********************************************************************/
2517 static BOOL
net_io_sam_policy_info(const char *desc
, SAM_DELTA_POLICY
*info
,
2518 prs_struct
*ps
, int depth
)
2521 prs_debug(ps
, depth
, desc
, "net_io_sam_policy_info");
2527 if (!prs_uint32("max_log_size", ps
, depth
, &info
->max_log_size
))
2529 if (!prs_uint64("audit_retention_period", ps
, depth
,
2530 &info
->audit_retention_period
))
2532 if (!prs_uint32("auditing_mode", ps
, depth
, &info
->auditing_mode
))
2534 if (!prs_uint32("num_events", ps
, depth
, &info
->num_events
))
2536 if (!prs_uint32("ptr_events", ps
, depth
, &info
->ptr_events
))
2539 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2542 if (!prs_uint32("sid_ptr", ps
, depth
, &info
->sid_ptr
))
2545 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2547 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2548 &info
->non_paged_pool_limit
))
2550 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2552 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2554 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2556 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2558 if (!smb_io_time("modify_time", &info
->modify_time
, ps
, depth
))
2560 if (!smb_io_time("create_time", &info
->create_time
, ps
, depth
))
2562 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2565 for (i
=0; i
<4; i
++) {
2567 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2571 for (i
=0; i
<4; i
++) {
2573 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2577 if (!prs_uint32("num_event_audit_options", ps
, depth
,
2578 &info
->num_event_audit_options
))
2581 for (i
=0; i
<info
->num_event_audit_options
; i
++)
2582 if (!prs_uint32("event_audit_option", ps
, depth
,
2583 &info
->event_audit_option
))
2586 if (!smb_io_unistr2("domain_name", &info
->domain_name
, True
, ps
, depth
))
2589 if(!smb_io_dom_sid2("domain_sid", &info
->domain_sid
, ps
, depth
))
2592 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2593 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2602 /* This function is pretty broken - see bug #334 */
2604 /*******************************************************************
2605 reads or writes a structure.
2606 ********************************************************************/
2607 static BOOL
net_io_sam_trustdoms_info(const char *desc
, SAM_DELTA_TRUSTDOMS
*info
,
2608 prs_struct
*ps
, int depth
)
2612 prs_debug(ps
, depth
, desc
, "net_io_sam_trustdoms_info");
2618 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2621 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2624 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2627 if(!smb_io_unihdr("hdr_domain", &info
->hdr_domain
, ps
, depth
))
2630 if(!prs_uint32("unknown0", ps
, depth
, &info
->unknown0
))
2632 if(!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2634 if(!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2637 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2639 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2642 for (i
=0; i
<12; i
++)
2643 if(!prs_uint32("unknown3", ps
, depth
, &info
->unknown3
))
2646 if (!smb_io_unistr2("domain", &info
->domain
, True
, ps
, depth
))
2656 /* This function doesn't work - see bug #334 */
2658 /*******************************************************************
2659 reads or writes a structure.
2660 ********************************************************************/
2661 static BOOL
net_io_sam_secret_info(const char *desc
, SAM_DELTA_SECRET
*info
,
2662 prs_struct
*ps
, int depth
)
2666 prs_debug(ps
, depth
, desc
, "net_io_sam_secret_info");
2672 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2675 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2678 if (!smb_io_unistr2("secret", &info
->secret
, True
, ps
, depth
))
2684 if(!prs_uint32("count1", ps
, depth
, &info
->count1
))
2686 if(!prs_uint32("count2", ps
, depth
, &info
->count2
))
2688 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2692 if(!smb_io_time("time1", &info
->time1
, ps
, depth
)) /* logon time */
2694 if(!prs_uint32("count3", ps
, depth
, &info
->count3
))
2696 if(!prs_uint32("count4", ps
, depth
, &info
->count4
))
2698 if(!prs_uint32("ptr2", ps
, depth
, &info
->ptr2
))
2700 if(!smb_io_time("time2", &info
->time2
, ps
, depth
)) /* logon time */
2702 if(!prs_uint32("unknow1", ps
, depth
, &info
->unknow1
))
2706 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2708 if(!prs_uint32("ptr3", ps
, depth
, &info
->ptr3
))
2711 if(!prs_uint32("unknow2", ps
, depth
, &info
->unknow2
))
2714 if(!prs_uint32("chal_len", ps
, depth
, &info
->chal_len
))
2716 if(!prs_uint32("reserved1", ps
, depth
, &info
->reserved1
))
2718 if(!prs_uint32("chal_len2", ps
, depth
, &info
->chal_len2
))
2721 if(!prs_uint8s (False
, "chal", ps
, depth
, info
->chal
, info
->chal_len2
))
2724 if(!prs_uint32("key_len", ps
, depth
, &info
->key_len
))
2726 if(!prs_uint32("reserved2", ps
, depth
, &info
->reserved2
))
2728 if(!prs_uint32("key_len2", ps
, depth
, &info
->key_len2
))
2731 if(!prs_uint8s (False
, "key", ps
, depth
, info
->key
, info
->key_len2
))
2735 if(!prs_uint32("buf_size3", ps
, depth
, &info
->buf_size3
))
2738 if(!sec_io_desc("sec_desc2", &info
->sec_desc2
, ps
, depth
))
2747 /*******************************************************************
2748 reads or writes a structure.
2749 ********************************************************************/
2750 static BOOL
net_io_sam_privs_info(const char *desc
, SAM_DELTA_PRIVS
*info
,
2751 prs_struct
*ps
, int depth
)
2755 prs_debug(ps
, depth
, desc
, "net_io_sam_privs_info");
2761 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2764 if(!prs_uint32("priv_count", ps
, depth
, &info
->priv_count
))
2766 if(!prs_uint32("priv_control", ps
, depth
, &info
->priv_control
))
2769 if(!prs_uint32("priv_attr_ptr", ps
, depth
, &info
->priv_attr_ptr
))
2771 if(!prs_uint32("priv_name_ptr", ps
, depth
, &info
->priv_name_ptr
))
2774 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2776 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2777 &info
->non_paged_pool_limit
))
2779 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2781 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2783 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2785 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2787 if (!prs_uint32("system_flags", ps
, depth
, &info
->system_flags
))
2789 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2792 for (i
=0; i
<4; i
++) {
2794 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2798 for (i
=0; i
<4; i
++) {
2800 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2804 if(!prs_uint32("attribute_count", ps
, depth
, &info
->attribute_count
))
2807 info
->attributes
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->attribute_count
);
2809 for (i
=0; i
<info
->attribute_count
; i
++)
2810 if(!prs_uint32("attributes", ps
, depth
, &info
->attributes
[i
]))
2813 if(!prs_uint32("privlist_count", ps
, depth
, &info
->privlist_count
))
2816 info
->hdr_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNIHDR
, info
->privlist_count
);
2817 info
->uni_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNISTR2
, info
->privlist_count
);
2819 for (i
=0; i
<info
->privlist_count
; i
++)
2820 if(!smb_io_unihdr("hdr_privslist", &info
->hdr_privslist
[i
], ps
, depth
))
2823 for (i
=0; i
<info
->privlist_count
; i
++)
2824 if (!smb_io_unistr2("uni_privslist", &info
->uni_privslist
[i
], True
, ps
, depth
))
2827 if (!smb_io_buffer4("buf_sec_desc", &info
->buf_sec_desc
,
2828 info
->hdr_sec_desc
.buffer
, ps
, depth
))
2834 /*******************************************************************
2835 reads or writes a structure.
2836 ********************************************************************/
2837 static BOOL
net_io_sam_delta_ctr(const char *desc
, uint8 sess_key
[16],
2838 SAM_DELTA_CTR
* delta
, uint16 type
,
2839 prs_struct
*ps
, int depth
)
2841 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_ctr");
2845 /* Seen in sam deltas */
2846 case SAM_DELTA_MODIFIED_COUNT
:
2847 if (!net_io_sam_delta_mod_count("", &delta
->mod_count
, ps
, depth
))
2851 case SAM_DELTA_DOMAIN_INFO
:
2852 if (!net_io_sam_domain_info("", &delta
->domain_info
, ps
, depth
))
2856 case SAM_DELTA_GROUP_INFO
:
2857 if (!net_io_sam_group_info("", &delta
->group_info
, ps
, depth
))
2861 case SAM_DELTA_ACCOUNT_INFO
:
2862 if (!net_io_sam_account_info("", sess_key
, &delta
->account_info
, ps
, depth
))
2866 case SAM_DELTA_GROUP_MEM
:
2867 if (!net_io_sam_group_mem_info("", &delta
->grp_mem_info
, ps
, depth
))
2871 case SAM_DELTA_ALIAS_INFO
:
2872 if (!net_io_sam_alias_info("", &delta
->alias_info
, ps
, depth
))
2876 case SAM_DELTA_POLICY_INFO
:
2877 if (!net_io_sam_policy_info("", &delta
->policy_info
, ps
, depth
))
2881 case SAM_DELTA_ALIAS_MEM
:
2882 if (!net_io_sam_alias_mem_info("", &delta
->als_mem_info
, ps
, depth
))
2886 case SAM_DELTA_PRIVS_INFO
:
2887 if (!net_io_sam_privs_info("", &delta
->privs_info
, ps
, depth
))
2891 /* These guys are implemented but broken */
2893 case SAM_DELTA_TRUST_DOMS
:
2894 case SAM_DELTA_SECRET_INFO
:
2897 /* These guys are not implemented yet */
2899 case SAM_DELTA_RENAME_GROUP
:
2900 case SAM_DELTA_RENAME_USER
:
2901 case SAM_DELTA_RENAME_ALIAS
:
2902 case SAM_DELTA_DELETE_GROUP
:
2903 case SAM_DELTA_DELETE_USER
:
2905 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type
));
2912 /*******************************************************************
2913 reads or writes a structure.
2914 ********************************************************************/
2915 BOOL
net_io_r_sam_sync(const char *desc
, uint8 sess_key
[16],
2916 NET_R_SAM_SYNC
* r_s
, prs_struct
*ps
, int depth
)
2920 prs_debug(ps
, depth
, desc
, "net_io_r_sam_sync");
2923 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
2925 if (!prs_uint32("sync_context", ps
, depth
, &r_s
->sync_context
))
2928 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
2930 if (r_s
->ptr_deltas
!= 0)
2932 if (!prs_uint32("num_deltas ", ps
, depth
, &r_s
->num_deltas
))
2934 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->ptr_deltas2
))
2936 if (r_s
->ptr_deltas2
!= 0)
2938 if (!prs_uint32("num_deltas2", ps
, depth
,
2942 if (r_s
->num_deltas2
!= r_s
->num_deltas
)
2948 if (r_s
->num_deltas2
> 0) {
2949 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas2
);
2950 if (r_s
->hdr_deltas
== NULL
) {
2951 DEBUG(0, ("error tallocating memory "
2952 "for %d delta headers\n",
2958 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
2960 if (!net_io_sam_delta_hdr("",
2961 &r_s
->hdr_deltas
[i
],
2966 if (r_s
->num_deltas2
> 0) {
2967 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas2
);
2968 if (r_s
->deltas
== NULL
) {
2969 DEBUG(0, ("error tallocating memory "
2976 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
2978 if (!net_io_sam_delta_ctr(
2979 "", sess_key
, &r_s
->deltas
[i
],
2980 r_s
->hdr_deltas
[i
].type3
,
2982 DEBUG(0, ("hmm, failed on i=%d\n", i
));
2990 if (!prs_ntstatus("status", ps
, depth
, &(r_s
->status
)))
2996 /*******************************************************************
2997 makes a NET_Q_SAM_DELTAS structure.
2998 ********************************************************************/
2999 BOOL
init_net_q_sam_deltas(NET_Q_SAM_DELTAS
*q_s
, const char *srv_name
,
3000 const char *cli_name
, DOM_CRED
*cli_creds
,
3001 uint32 database_id
, UINT64_S dom_mod_count
)
3003 DEBUG(5, ("init_net_q_sam_deltas\n"));
3005 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
3006 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
3008 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
3009 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
3011 q_s
->database_id
= database_id
;
3012 q_s
->dom_mod_count
.low
= dom_mod_count
.low
;
3013 q_s
->dom_mod_count
.high
= dom_mod_count
.high
;
3014 q_s
->max_size
= 0xffff;
3019 /*******************************************************************
3020 reads or writes a structure.
3021 ********************************************************************/
3022 BOOL
net_io_q_sam_deltas(const char *desc
, NET_Q_SAM_DELTAS
*q_s
, prs_struct
*ps
,
3025 prs_debug(ps
, depth
, desc
, "net_io_q_sam_deltas");
3028 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
3030 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
3033 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
3035 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
3038 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
3040 if (!prs_uint64("dom_mod_count", ps
, depth
, &q_s
->dom_mod_count
))
3042 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
3048 /*******************************************************************
3049 reads or writes a structure.
3050 ********************************************************************/
3051 BOOL
net_io_r_sam_deltas(const char *desc
, uint8 sess_key
[16],
3052 NET_R_SAM_DELTAS
*r_s
, prs_struct
*ps
, int depth
)
3056 prs_debug(ps
, depth
, desc
, "net_io_r_sam_deltas");
3059 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
3061 if (!prs_uint64("dom_mod_count", ps
, depth
, &r_s
->dom_mod_count
))
3064 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
3066 if (!prs_uint32("num_deltas", ps
, depth
, &r_s
->num_deltas
))
3068 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->num_deltas2
))
3071 if (r_s
->num_deltas2
!= 0)
3073 if (!prs_uint32("num_deltas2 ", ps
, depth
, &r_s
->num_deltas2
))
3076 if (r_s
->ptr_deltas
!= 0)
3078 if (r_s
->num_deltas
> 0) {
3079 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas
);
3080 if (r_s
->hdr_deltas
== NULL
) {
3081 DEBUG(0, ("error tallocating memory "
3082 "for %d delta headers\n",
3088 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3090 net_io_sam_delta_hdr("", &r_s
->hdr_deltas
[i
],
3094 if (r_s
->num_deltas
> 0) {
3095 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas
);
3096 if (r_s
->deltas
== NULL
) {
3097 DEBUG(0, ("error tallocating memory "
3104 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3106 if (!net_io_sam_delta_ctr(
3109 r_s
->hdr_deltas
[i
].type2
,
3118 if (!prs_ntstatus("status", ps
, depth
, &r_s
->status
))