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 Francois 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 3 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, see <http://www.gnu.org/licenses/>.
26 #define DBGC_CLASS DBGC_RPC_PARSE
28 /*******************************************************************
29 Reads or writes a structure.
30 ********************************************************************/
32 static bool net_io_neg_flags(const char *desc
, NEG_FLAGS
*neg
, prs_struct
*ps
, int depth
)
37 prs_debug(ps
, depth
, desc
, "net_io_neg_flags");
43 if(!prs_uint32("neg_flags", ps
, depth
, &neg
->neg_flags
))
49 /*******************************************************************
50 Inits a NETLOGON_INFO_3 structure.
51 ********************************************************************/
53 static void init_netinfo_3(NETLOGON_INFO_3
*info
, uint32 flags
, uint32 logon_attempts
)
56 info
->logon_attempts
= logon_attempts
;
57 info
->reserved_1
= 0x0;
58 info
->reserved_2
= 0x0;
59 info
->reserved_3
= 0x0;
60 info
->reserved_4
= 0x0;
61 info
->reserved_5
= 0x0;
64 /*******************************************************************
65 Reads or writes a NETLOGON_INFO_3 structure.
66 ********************************************************************/
68 static bool net_io_netinfo_3(const char *desc
, NETLOGON_INFO_3
*info
, prs_struct
*ps
, int depth
)
73 prs_debug(ps
, depth
, desc
, "net_io_netinfo_3");
79 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
81 if(!prs_uint32("logon_attempts", ps
, depth
, &info
->logon_attempts
))
83 if(!prs_uint32("reserved_1 ", ps
, depth
, &info
->reserved_1
))
85 if(!prs_uint32("reserved_2 ", ps
, depth
, &info
->reserved_2
))
87 if(!prs_uint32("reserved_3 ", ps
, depth
, &info
->reserved_3
))
89 if(!prs_uint32("reserved_4 ", ps
, depth
, &info
->reserved_4
))
91 if(!prs_uint32("reserved_5 ", ps
, depth
, &info
->reserved_5
))
98 /*******************************************************************
99 Inits a NETLOGON_INFO_1 structure.
100 ********************************************************************/
102 static void init_netinfo_1(NETLOGON_INFO_1
*info
, uint32 flags
, uint32 pdc_status
)
105 info
->pdc_status
= pdc_status
;
108 /*******************************************************************
109 Reads or writes a NETLOGON_INFO_1 structure.
110 ********************************************************************/
112 static bool net_io_netinfo_1(const char *desc
, NETLOGON_INFO_1
*info
, prs_struct
*ps
, int depth
)
117 prs_debug(ps
, depth
, desc
, "net_io_netinfo_1");
123 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
125 if(!prs_uint32("pdc_status", ps
, depth
, &info
->pdc_status
))
131 /*******************************************************************
132 Inits a NETLOGON_INFO_2 structure.
133 ********************************************************************/
135 static void init_netinfo_2(NETLOGON_INFO_2
*info
, uint32 flags
, uint32 pdc_status
,
136 uint32 tc_status
, const char *trusted_dc_name
)
139 info
->pdc_status
= pdc_status
;
140 info
->ptr_trusted_dc_name
= 1;
141 info
->tc_status
= tc_status
;
143 if (trusted_dc_name
!= NULL
)
144 init_unistr2(&info
->uni_trusted_dc_name
, trusted_dc_name
, UNI_STR_TERMINATE
);
146 init_unistr2(&info
->uni_trusted_dc_name
, "", UNI_STR_TERMINATE
);
149 /*******************************************************************
150 Reads or writes a NETLOGON_INFO_2 structure.
151 ********************************************************************/
153 static bool net_io_netinfo_2(const char *desc
, NETLOGON_INFO_2
*info
, prs_struct
*ps
, int depth
)
158 prs_debug(ps
, depth
, desc
, "net_io_netinfo_2");
164 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
166 if(!prs_uint32("pdc_status ", ps
, depth
, &info
->pdc_status
))
168 if(!prs_uint32("ptr_trusted_dc_name", ps
, depth
, &info
->ptr_trusted_dc_name
))
170 if(!prs_uint32("tc_status ", ps
, depth
, &info
->tc_status
))
173 if (info
->ptr_trusted_dc_name
!= 0) {
174 if(!smb_io_unistr2("unistr2", &info
->uni_trusted_dc_name
, info
->ptr_trusted_dc_name
, ps
, depth
))
184 static bool net_io_ctrl_data_info_5(const char *desc
, CTRL_DATA_INFO_5
*info
, prs_struct
*ps
, int depth
)
189 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_5");
192 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
195 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
198 if ( info
->ptr_domain
) {
199 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
206 static bool net_io_ctrl_data_info_6(const char *desc
, CTRL_DATA_INFO_6
*info
, prs_struct
*ps
, int depth
)
211 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_6");
214 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
217 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
220 if ( info
->ptr_domain
) {
221 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
228 /*******************************************************************
229 Reads or writes an NET_Q_LOGON_CTRL2 structure.
230 ********************************************************************/
232 bool net_io_q_logon_ctrl2(const char *desc
, NET_Q_LOGON_CTRL2
*q_l
, prs_struct
*ps
, int depth
)
237 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl2");
243 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
246 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
252 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
254 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
256 switch ( q_l
->function_code
) {
257 case NETLOGON_CONTROL_REDISCOVER
:
258 if ( !net_io_ctrl_data_info_5( "ctrl_data_info5", &q_l
->info
.info5
, ps
, depth
) )
262 case NETLOGON_CONTROL_TC_QUERY
:
263 if ( !net_io_ctrl_data_info_6( "ctrl_data_info6", &q_l
->info
.info6
, ps
, depth
) )
268 DEBUG(0,("net_io_q_logon_ctrl2: unknown function_code [%d]\n",
269 q_l
->function_code
));
276 /*******************************************************************
277 Inits an NET_Q_LOGON_CTRL2 structure.
278 ********************************************************************/
280 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2
*q_l
, const char *srv_name
,
283 DEBUG(5,("init_q_logon_ctrl2\n"));
285 q_l
->function_code
= 0x01;
286 q_l
->query_level
= query_level
;
288 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
291 /*******************************************************************
292 Inits an NET_R_LOGON_CTRL2 structure.
293 ********************************************************************/
295 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2
*r_l
, uint32 query_level
,
296 uint32 flags
, uint32 pdc_status
,
297 uint32 logon_attempts
, uint32 tc_status
,
298 const char *trusted_domain_name
)
300 r_l
->switch_value
= query_level
;
302 switch (query_level
) {
304 r_l
->ptr
= 1; /* undocumented pointer */
305 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
306 r_l
->status
= NT_STATUS_OK
;
309 r_l
->ptr
= 1; /* undocumented pointer */
310 init_netinfo_2(&r_l
->logon
.info2
, flags
, pdc_status
,
311 tc_status
, trusted_domain_name
);
312 r_l
->status
= NT_STATUS_OK
;
315 r_l
->ptr
= 1; /* undocumented pointer */
316 init_netinfo_3(&r_l
->logon
.info3
, flags
, logon_attempts
);
317 r_l
->status
= NT_STATUS_OK
;
320 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
322 r_l
->ptr
= 0; /* undocumented pointer */
324 /* take a guess at an error code... */
325 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
330 /*******************************************************************
331 Reads or writes an NET_R_LOGON_CTRL2 structure.
332 ********************************************************************/
334 bool net_io_r_logon_ctrl2(const char *desc
, NET_R_LOGON_CTRL2
*r_l
, prs_struct
*ps
, int depth
)
339 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl2");
342 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
344 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
348 switch (r_l
->switch_value
) {
350 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
354 if(!net_io_netinfo_2("", &r_l
->logon
.info2
, ps
, depth
))
358 if(!net_io_netinfo_3("", &r_l
->logon
.info3
, ps
, depth
))
362 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
368 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
374 /*******************************************************************
375 Reads or writes an NET_Q_LOGON_CTRL structure.
376 ********************************************************************/
378 bool net_io_q_logon_ctrl(const char *desc
, NET_Q_LOGON_CTRL
*q_l
, prs_struct
*ps
,
381 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl");
387 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
390 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
396 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
398 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
404 /*******************************************************************
405 Inits an NET_Q_LOGON_CTRL structure.
406 ********************************************************************/
408 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL
*q_l
, const char *srv_name
,
411 DEBUG(5,("init_q_logon_ctrl\n"));
413 q_l
->function_code
= 0x01; /* ??? */
414 q_l
->query_level
= query_level
;
416 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
419 /*******************************************************************
420 Inits an NET_R_LOGON_CTRL structure.
421 ********************************************************************/
423 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL
*r_l
, uint32 query_level
,
424 uint32 flags
, uint32 pdc_status
)
426 DEBUG(5,("init_r_logon_ctrl\n"));
428 r_l
->switch_value
= query_level
; /* should only be 0x1 */
430 switch (query_level
) {
432 r_l
->ptr
= 1; /* undocumented pointer */
433 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
434 r_l
->status
= NT_STATUS_OK
;
437 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
439 r_l
->ptr
= 0; /* undocumented pointer */
441 /* take a guess at an error code... */
442 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
447 /*******************************************************************
448 Reads or writes an NET_R_LOGON_CTRL structure.
449 ********************************************************************/
451 bool net_io_r_logon_ctrl(const char *desc
, NET_R_LOGON_CTRL
*r_l
, prs_struct
*ps
,
454 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl");
457 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
459 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
463 switch (r_l
->switch_value
) {
465 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
469 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
475 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
481 /*******************************************************************
482 Inits an NET_R_GETANYDCNAME structure.
483 ********************************************************************/
484 void init_net_q_getanydcname(NET_Q_GETANYDCNAME
*r_t
, const char *logon_server
,
485 const char *domainname
)
487 DEBUG(5,("init_q_getanydcname\n"));
489 r_t
->ptr_logon_server
= (logon_server
!= NULL
);
490 init_unistr2(&r_t
->uni_logon_server
, logon_server
, UNI_STR_TERMINATE
);
491 r_t
->ptr_domainname
= (domainname
!= NULL
);
492 init_unistr2(&r_t
->uni_domainname
, domainname
, UNI_STR_TERMINATE
);
495 /*******************************************************************
496 Reads or writes an NET_Q_GETANYDCNAME structure.
497 ********************************************************************/
499 bool net_io_q_getanydcname(const char *desc
, NET_Q_GETANYDCNAME
*r_t
, prs_struct
*ps
,
505 prs_debug(ps
, depth
, desc
, "net_io_q_getanydcname");
508 if (!prs_uint32("ptr_logon_server", ps
, depth
, &r_t
->ptr_logon_server
))
511 if (!smb_io_unistr2("logon_server", &r_t
->uni_logon_server
,
512 r_t
->ptr_logon_server
, ps
, depth
))
518 if (!prs_uint32("ptr_domainname", ps
, depth
, &r_t
->ptr_domainname
))
521 if (!smb_io_unistr2("domainname", &r_t
->uni_domainname
,
522 r_t
->ptr_domainname
, ps
, depth
))
529 /*******************************************************************
530 Inits an NET_R_GETANYDCNAME structure.
531 ********************************************************************/
532 void init_net_r_getanydcname(NET_R_GETANYDCNAME
*r_t
, const char *dcname
)
534 DEBUG(5,("init_r_getanydcname\n"));
536 init_unistr2(&r_t
->uni_dcname
, dcname
, UNI_STR_TERMINATE
);
539 /*******************************************************************
540 Reads or writes an NET_R_GETANYDCNAME structure.
541 ********************************************************************/
543 bool net_io_r_getanydcname(const char *desc
, NET_R_GETANYDCNAME
*r_t
, prs_struct
*ps
,
549 prs_debug(ps
, depth
, desc
, "net_io_r_getanydcname");
552 if (!prs_uint32("ptr_dcname", ps
, depth
, &r_t
->ptr_dcname
))
555 if (!smb_io_unistr2("dcname", &r_t
->uni_dcname
,
556 r_t
->ptr_dcname
, ps
, depth
))
562 if (!prs_werror("status", ps
, depth
, &r_t
->status
))
569 /*******************************************************************
570 Inits an NET_R_GETDCNAME structure.
571 ********************************************************************/
572 void init_net_q_getdcname(NET_Q_GETDCNAME
*r_t
, const char *logon_server
,
573 const char *domainname
)
575 DEBUG(5,("init_q_getdcname\n"));
577 init_unistr2(&r_t
->uni_logon_server
, logon_server
, UNI_STR_TERMINATE
);
578 r_t
->ptr_domainname
= (domainname
!= NULL
);
579 init_unistr2(&r_t
->uni_domainname
, domainname
, UNI_STR_TERMINATE
);
582 /*******************************************************************
583 Reads or writes an NET_Q_GETDCNAME structure.
584 ********************************************************************/
586 bool net_io_q_getdcname(const char *desc
, NET_Q_GETDCNAME
*r_t
, prs_struct
*ps
,
592 prs_debug(ps
, depth
, desc
, "net_io_q_getdcname");
595 if (!smb_io_unistr2("logon_server", &r_t
->uni_logon_server
,
602 if (!prs_uint32("ptr_domainname", ps
, depth
, &r_t
->ptr_domainname
))
605 if (!smb_io_unistr2("domainname", &r_t
->uni_domainname
,
606 r_t
->ptr_domainname
, ps
, depth
))
613 /*******************************************************************
614 Inits an NET_R_GETDCNAME structure.
615 ********************************************************************/
616 void init_net_r_getdcname(NET_R_GETDCNAME
*r_t
, const char *dcname
)
618 DEBUG(5,("init_r_getdcname\n"));
620 init_unistr2(&r_t
->uni_dcname
, dcname
, UNI_STR_TERMINATE
);
623 /*******************************************************************
624 Reads or writes an NET_R_GETDCNAME structure.
625 ********************************************************************/
627 bool net_io_r_getdcname(const char *desc
, NET_R_GETDCNAME
*r_t
, prs_struct
*ps
,
633 prs_debug(ps
, depth
, desc
, "net_io_r_getdcname");
636 if (!prs_uint32("ptr_dcname", ps
, depth
, &r_t
->ptr_dcname
))
639 if (!smb_io_unistr2("dcname", &r_t
->uni_dcname
,
640 r_t
->ptr_dcname
, ps
, depth
))
646 if (!prs_werror("status", ps
, depth
, &r_t
->status
))
652 /*******************************************************************
653 Inits an NET_R_TRUST_DOM_LIST structure.
654 ********************************************************************/
656 void init_r_trust_dom(NET_R_TRUST_DOM_LIST
*r_t
,
657 uint32 num_doms
, const char *dom_name
)
661 DEBUG(5,("init_r_trust_dom\n"));
663 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
664 r_t
->uni_trust_dom_name
[i
].uni_str_len
= 0;
665 r_t
->uni_trust_dom_name
[i
].uni_max_len
= 0;
667 if (num_doms
> MAX_TRUST_DOMS
)
668 num_doms
= MAX_TRUST_DOMS
;
670 for (i
= 0; i
< num_doms
; i
++) {
672 fstrcpy(domain_name
, dom_name
);
673 strupper_m(domain_name
);
674 init_unistr2(&r_t
->uni_trust_dom_name
[i
], domain_name
, UNI_STR_TERMINATE
);
675 /* the use of UNISTR2 here is non-standard. */
676 r_t
->uni_trust_dom_name
[i
].offset
= 0x1;
679 r_t
->status
= NT_STATUS_OK
;
682 /*******************************************************************
683 Reads or writes an NET_R_TRUST_DOM_LIST structure.
684 ********************************************************************/
686 bool net_io_r_trust_dom(const char *desc
, NET_R_TRUST_DOM_LIST
*r_t
, prs_struct
*ps
, int depth
)
693 prs_debug(ps
, depth
, desc
, "net_io_r_trust_dom");
696 /* temporary code to give a valid response */
698 if(!prs_uint32("status", ps
, depth
, &value
))
702 if(!prs_uint32("status", ps
, depth
, &value
))
705 if(!prs_uint32("status", ps
, depth
, &value
))
709 if(!prs_uint32("status", ps
, depth
, &value
))
713 if(!prs_uint32("status", ps
, depth
, &value
))
716 /* old non working code */
720 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
721 if (r_t
->uni_trust_dom_name
[i
].uni_str_len
== 0)
723 if(!smb_io_unistr2("", &r_t
->uni_trust_dom_name
[i
], True
, ps
, depth
))
727 if(!prs_ntstatus("status", ps
, depth
, &r_t
->status
))
734 /*******************************************************************
735 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
736 ********************************************************************/
738 bool net_io_q_trust_dom(const char *desc
, NET_Q_TRUST_DOM_LIST
*q_l
, prs_struct
*ps
, int depth
)
743 prs_debug(ps
, depth
, desc
, "net_io_q_trust_dom");
746 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
748 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
754 /*******************************************************************
755 Inits an NET_Q_REQ_CHAL structure.
756 ********************************************************************/
758 void init_q_req_chal(NET_Q_REQ_CHAL
*q_c
,
759 const char *logon_srv
, const char *logon_clnt
,
760 const DOM_CHAL
*clnt_chal
)
762 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
764 q_c
->undoc_buffer
= 1; /* don't know what this buffer is */
766 init_unistr2(&q_c
->uni_logon_srv
, logon_srv
, UNI_STR_TERMINATE
);
767 init_unistr2(&q_c
->uni_logon_clnt
, logon_clnt
, UNI_STR_TERMINATE
);
769 memcpy(q_c
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
771 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
774 /*******************************************************************
775 Reads or writes an NET_Q_REQ_CHAL structure.
776 ********************************************************************/
778 bool net_io_q_req_chal(const char *desc
, NET_Q_REQ_CHAL
*q_c
, prs_struct
*ps
, int depth
)
783 prs_debug(ps
, depth
, desc
, "net_io_q_req_chal");
789 if(!prs_uint32("undoc_buffer", ps
, depth
, &q_c
->undoc_buffer
))
792 if(!smb_io_unistr2("", &q_c
->uni_logon_srv
, True
, ps
, depth
)) /* logon server unicode string */
794 if(!smb_io_unistr2("", &q_c
->uni_logon_clnt
, True
, ps
, depth
)) /* logon client unicode string */
797 if(!smb_io_chal("", &q_c
->clnt_chal
, ps
, depth
))
803 /*******************************************************************
804 Reads or writes a structure.
805 ********************************************************************/
807 bool net_io_r_req_chal(const char *desc
, NET_R_REQ_CHAL
*r_c
, prs_struct
*ps
, int depth
)
812 prs_debug(ps
, depth
, desc
, "net_io_r_req_chal");
818 if(!smb_io_chal("", &r_c
->srv_chal
, ps
, depth
)) /* server challenge */
821 if(!prs_ntstatus("status", ps
, depth
, &r_c
->status
))
828 /*******************************************************************
829 Reads or writes a structure.
830 ********************************************************************/
832 bool net_io_q_auth(const char *desc
, NET_Q_AUTH
*q_a
, prs_struct
*ps
, int depth
)
837 prs_debug(ps
, depth
, desc
, "net_io_q_auth");
843 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
845 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
851 /*******************************************************************
852 Reads or writes a structure.
853 ********************************************************************/
855 bool net_io_r_auth(const char *desc
, NET_R_AUTH
*r_a
, prs_struct
*ps
, int depth
)
860 prs_debug(ps
, depth
, desc
, "net_io_r_auth");
866 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
869 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
875 /*******************************************************************
876 Inits a NET_Q_AUTH_2 struct.
877 ********************************************************************/
879 void init_q_auth_2(NET_Q_AUTH_2
*q_a
,
880 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
881 const DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
883 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
885 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
886 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
887 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
889 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
892 /*******************************************************************
893 Reads or writes a structure.
894 ********************************************************************/
896 bool net_io_q_auth_2(const char *desc
, NET_Q_AUTH_2
*q_a
, prs_struct
*ps
, int depth
)
901 prs_debug(ps
, depth
, desc
, "net_io_q_auth_2");
907 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
909 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
911 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
917 /*******************************************************************
918 Reads or writes a structure.
919 ********************************************************************/
921 bool net_io_r_auth_2(const char *desc
, NET_R_AUTH_2
*r_a
, prs_struct
*ps
, int depth
)
926 prs_debug(ps
, depth
, desc
, "net_io_r_auth_2");
932 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
934 if(!net_io_neg_flags("", &r_a
->srv_flgs
, ps
, depth
))
937 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
943 /*******************************************************************
944 Inits a NET_Q_AUTH_3 struct.
945 ********************************************************************/
947 void init_q_auth_3(NET_Q_AUTH_3
*q_a
,
948 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
949 const DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
951 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
953 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
954 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
955 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
957 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
960 /*******************************************************************
961 Reads or writes a structure.
962 ********************************************************************/
964 bool net_io_q_auth_3(const char *desc
, NET_Q_AUTH_3
*q_a
, prs_struct
*ps
, int depth
)
969 prs_debug(ps
, depth
, desc
, "net_io_q_auth_3");
975 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
977 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
979 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
985 /*******************************************************************
986 Reads or writes a structure.
987 ********************************************************************/
989 bool net_io_r_auth_3(const char *desc
, NET_R_AUTH_3
*r_a
, prs_struct
*ps
, int depth
)
994 prs_debug(ps
, depth
, desc
, "net_io_r_auth_3");
1000 if(!smb_io_chal("srv_chal", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
1002 if(!net_io_neg_flags("srv_flgs", &r_a
->srv_flgs
, ps
, depth
))
1004 if (!prs_uint32("unknown", ps
, depth
, &r_a
->unknown
))
1007 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
1014 /*******************************************************************
1015 Inits a NET_Q_SRV_PWSET.
1016 ********************************************************************/
1018 void init_q_srv_pwset(NET_Q_SRV_PWSET
*q_s
,
1019 const char *logon_srv
, const char *sess_key
, const char *acct_name
,
1020 uint16 sec_chan
, const char *comp_name
,
1021 DOM_CRED
*cred
, const uchar hashed_mach_pwd
[16])
1023 unsigned char nt_cypher
[16];
1025 DEBUG(5,("init_q_srv_pwset\n"));
1027 /* Process the new password. */
1028 cred_hash3( nt_cypher
, hashed_mach_pwd
, (const unsigned char *)sess_key
, 1);
1030 init_clnt_info(&q_s
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
, cred
);
1032 memcpy(q_s
->pwd
, nt_cypher
, sizeof(q_s
->pwd
));
1035 /*******************************************************************
1036 Reads or writes a structure.
1037 ********************************************************************/
1039 bool net_io_q_srv_pwset(const char *desc
, NET_Q_SRV_PWSET
*q_s
, prs_struct
*ps
, int depth
)
1044 prs_debug(ps
, depth
, desc
, "net_io_q_srv_pwset");
1050 if(!smb_io_clnt_info("", &q_s
->clnt_id
, ps
, depth
)) /* client identification/authentication info */
1052 if(!prs_uint8s (False
, "pwd", ps
, depth
, q_s
->pwd
, 16)) /* new password - undocumented */
1058 /*******************************************************************
1059 Reads or writes a structure.
1060 ********************************************************************/
1062 bool net_io_r_srv_pwset(const char *desc
, NET_R_SRV_PWSET
*r_s
, prs_struct
*ps
, int depth
)
1067 prs_debug(ps
, depth
, desc
, "net_io_r_srv_pwset");
1073 if(!smb_io_cred("", &r_s
->srv_cred
, ps
, depth
)) /* server challenge */
1076 if(!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
1082 /*************************************************************************
1083 Init DOM_SID2 array from a string containing multiple sids
1084 *************************************************************************/
1086 static int init_dom_sid2s(TALLOC_CTX
*ctx
, const char *sids_str
, DOM_SID2
**ppsids
)
1092 DEBUG(4,("init_dom_sid2s: %s\n", sids_str
? sids_str
:""));
1099 TALLOC_CTX
*frame
= talloc_stackframe();
1101 /* Count the number of valid SIDs. */
1102 for (count
= 0, ptr
= sids_str
;
1103 next_token_talloc(frame
,&ptr
, &s2
, NULL
); ) {
1105 if (string_to_sid(&tmpsid
, s2
))
1109 /* Now allocate space for them. */
1111 *ppsids
= TALLOC_ZERO_ARRAY(ctx
, DOM_SID2
, count
);
1112 if (*ppsids
== NULL
) {
1122 for (number
= 0, ptr
= sids_str
;
1123 next_token_talloc(frame
, &ptr
, &s2
, NULL
); ) {
1125 if (string_to_sid(&tmpsid
, s2
)) {
1126 /* count only valid sids */
1127 init_dom_sid2(&sids
[number
], &tmpsid
);
1137 /*******************************************************************
1138 Inits a NET_ID_INFO_1 structure.
1139 ********************************************************************/
1141 void init_id_info1(NET_ID_INFO_1
*id
, const char *domain_name
,
1142 uint32 param_ctrl
, uint32 log_id_low
, uint32 log_id_high
,
1143 const char *user_name
, const char *wksta_name
,
1144 const char *sess_key
,
1145 unsigned char lm_cypher
[16], unsigned char nt_cypher
[16])
1147 unsigned char lm_owf
[16];
1148 unsigned char nt_owf
[16];
1150 DEBUG(5,("init_id_info1: %d\n", __LINE__
));
1152 id
->ptr_id_info1
= 1;
1154 id
->param_ctrl
= param_ctrl
;
1155 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1158 if (lm_cypher
&& nt_cypher
) {
1159 unsigned char key
[16];
1160 #ifdef DEBUG_PASSWORD
1161 DEBUG(100,("lm cypher:"));
1162 dump_data(100, lm_cypher
, 16);
1164 DEBUG(100,("nt cypher:"));
1165 dump_data(100, nt_cypher
, 16);
1169 memcpy(key
, sess_key
, 8);
1171 memcpy(lm_owf
, lm_cypher
, 16);
1172 SamOEMhash(lm_owf
, key
, 16);
1173 memcpy(nt_owf
, nt_cypher
, 16);
1174 SamOEMhash(nt_owf
, key
, 16);
1176 #ifdef DEBUG_PASSWORD
1177 DEBUG(100,("encrypt of lm owf password:"));
1178 dump_data(100, lm_owf
, 16);
1180 DEBUG(100,("encrypt of nt owf password:"));
1181 dump_data(100, nt_owf
, 16);
1183 /* set up pointers to cypher blocks */
1188 init_owf_info(&id
->lm_owf
, lm_cypher
);
1189 init_owf_info(&id
->nt_owf
, nt_cypher
);
1191 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1192 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1193 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1194 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1195 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1196 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1199 /*******************************************************************
1200 Reads or writes an NET_ID_INFO_1 structure.
1201 ********************************************************************/
1203 static bool net_io_id_info1(const char *desc
, NET_ID_INFO_1
*id
, prs_struct
*ps
, int depth
)
1208 prs_debug(ps
, depth
, desc
, "net_io_id_info1");
1214 if(!prs_uint32("ptr_id_info1", ps
, depth
, &id
->ptr_id_info1
))
1217 if (id
->ptr_id_info1
!= 0) {
1218 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1221 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1223 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1226 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1228 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1231 if(!smb_io_owf_info("", &id
->lm_owf
, ps
, depth
))
1233 if(!smb_io_owf_info("", &id
->nt_owf
, ps
, depth
))
1236 if(!smb_io_unistr2("unistr2", &id
->uni_domain_name
,
1237 id
->hdr_domain_name
.buffer
, ps
, depth
))
1239 if(!smb_io_unistr2("unistr2", &id
->uni_user_name
,
1240 id
->hdr_user_name
.buffer
, ps
, depth
))
1242 if(!smb_io_unistr2("unistr2", &id
->uni_wksta_name
,
1243 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1250 /*******************************************************************
1251 Inits a NET_ID_INFO_2 structure.
1253 This is a network logon packet. The log_id parameters
1254 are what an NT server would generate for LUID once the
1255 user is logged on. I don't think we care about them.
1257 Note that this has no access to the NT and LM hashed passwords,
1258 so it forwards the challenge, and the NT and LM responses (24
1259 bytes each) over the secure channel to the Domain controller
1260 for it to say yea or nay. This is the preferred method of
1261 checking for a logon as it doesn't export the password
1262 hashes to anyone who has compromised the secure channel. JRA.
1263 ********************************************************************/
1265 void init_id_info2(NET_ID_INFO_2
* id
, const char *domain_name
,
1267 uint32 log_id_low
, uint32 log_id_high
,
1268 const char *user_name
, const char *wksta_name
,
1269 const uchar lm_challenge
[8],
1270 const uchar
* lm_chal_resp
, size_t lm_chal_resp_len
,
1271 const uchar
* nt_chal_resp
, size_t nt_chal_resp_len
)
1274 DEBUG(5,("init_id_info2: %d\n", __LINE__
));
1276 id
->ptr_id_info2
= 1;
1278 id
->param_ctrl
= param_ctrl
;
1279 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1281 memcpy(id
->lm_chal
, lm_challenge
, sizeof(id
->lm_chal
));
1282 init_str_hdr(&id
->hdr_nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
, (nt_chal_resp
!= NULL
) ? 1 : 0);
1283 init_str_hdr(&id
->hdr_lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
, (lm_chal_resp
!= NULL
) ? 1 : 0);
1285 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1286 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1287 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1288 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1289 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1290 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1292 init_string2(&id
->nt_chal_resp
, (const char *)nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
);
1293 init_string2(&id
->lm_chal_resp
, (const char *)lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
);
1297 /*******************************************************************
1298 Reads or writes an NET_ID_INFO_2 structure.
1299 ********************************************************************/
1301 static bool net_io_id_info2(const char *desc
, NET_ID_INFO_2
*id
, prs_struct
*ps
, int depth
)
1306 prs_debug(ps
, depth
, desc
, "net_io_id_info2");
1312 if(!prs_uint32("ptr_id_info2", ps
, depth
, &id
->ptr_id_info2
))
1315 if (id
->ptr_id_info2
!= 0) {
1316 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1319 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1321 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1324 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1326 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1329 if(!prs_uint8s (False
, "lm_chal", ps
, depth
, id
->lm_chal
, 8)) /* lm 8 byte challenge */
1332 if(!smb_io_strhdr("hdr_nt_chal_resp", &id
->hdr_nt_chal_resp
, ps
, depth
))
1334 if(!smb_io_strhdr("hdr_lm_chal_resp", &id
->hdr_lm_chal_resp
, ps
, depth
))
1337 if(!smb_io_unistr2("uni_domain_name", &id
->uni_domain_name
,
1338 id
->hdr_domain_name
.buffer
, ps
, depth
))
1340 if(!smb_io_unistr2("uni_user_name ", &id
->uni_user_name
,
1341 id
->hdr_user_name
.buffer
, ps
, depth
))
1343 if(!smb_io_unistr2("uni_wksta_name ", &id
->uni_wksta_name
,
1344 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1346 if(!smb_io_string2("nt_chal_resp", &id
->nt_chal_resp
,
1347 id
->hdr_nt_chal_resp
.buffer
, ps
, depth
))
1349 if(!smb_io_string2("lm_chal_resp", &id
->lm_chal_resp
,
1350 id
->hdr_lm_chal_resp
.buffer
, ps
, depth
))
1358 /*******************************************************************
1359 Inits a DOM_SAM_INFO structure.
1360 ********************************************************************/
1362 void init_sam_info(DOM_SAM_INFO
*sam
,
1363 const char *logon_srv
, const char *comp_name
,
1364 DOM_CRED
*clnt_cred
,
1365 DOM_CRED
*rtn_cred
, uint16 logon_level
,
1366 NET_ID_INFO_CTR
*ctr
)
1368 DEBUG(5,("init_sam_info: %d\n", __LINE__
));
1370 init_clnt_info2(&sam
->client
, logon_srv
, comp_name
, clnt_cred
);
1372 if (rtn_cred
!= NULL
) {
1373 sam
->ptr_rtn_cred
= 1;
1374 memcpy(&sam
->rtn_cred
, rtn_cred
, sizeof(sam
->rtn_cred
));
1376 sam
->ptr_rtn_cred
= 0;
1379 sam
->logon_level
= logon_level
;
1383 /*******************************************************************
1384 Inits a DOM_SAM_INFO structure.
1385 ********************************************************************/
1387 void init_sam_info_ex(DOM_SAM_INFO_EX
*sam
,
1388 const char *logon_srv
, const char *comp_name
,
1389 uint16 logon_level
, NET_ID_INFO_CTR
*ctr
)
1391 DEBUG(5,("init_sam_info_ex: %d\n", __LINE__
));
1393 init_clnt_srv(&sam
->client
, logon_srv
, comp_name
);
1394 sam
->logon_level
= logon_level
;
1398 /*******************************************************************
1399 Reads or writes a DOM_SAM_INFO structure.
1400 ********************************************************************/
1402 static bool net_io_id_info_ctr(const char *desc
, NET_ID_INFO_CTR
**pp_ctr
, prs_struct
*ps
, int depth
)
1404 NET_ID_INFO_CTR
*ctr
= *pp_ctr
;
1406 prs_debug(ps
, depth
, desc
, "smb_io_sam_info_ctr");
1409 if (UNMARSHALLING(ps
)) {
1410 ctr
= *pp_ctr
= PRS_ALLOC_MEM(ps
, NET_ID_INFO_CTR
, 1);
1418 /* don't 4-byte align here! */
1420 if(!prs_uint16("switch_value ", ps
, depth
, &ctr
->switch_value
))
1423 switch (ctr
->switch_value
) {
1425 if(!net_io_id_info1("", &ctr
->auth
.id1
, ps
, depth
))
1429 if(!net_io_id_info2("", &ctr
->auth
.id2
, ps
, depth
))
1434 DEBUG(4,("smb_io_sam_info_ctr: unknown switch_value!\n"));
1441 /*******************************************************************
1442 Reads or writes a DOM_SAM_INFO structure.
1443 ********************************************************************/
1445 static bool smb_io_sam_info(const char *desc
, DOM_SAM_INFO
*sam
, prs_struct
*ps
, int depth
)
1450 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1456 if(!smb_io_clnt_info2("", &sam
->client
, ps
, depth
))
1459 if(!prs_uint32("ptr_rtn_cred ", ps
, depth
, &sam
->ptr_rtn_cred
))
1461 if (sam
->ptr_rtn_cred
) {
1462 if(!smb_io_cred("", &sam
->rtn_cred
, ps
, depth
))
1466 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1469 if (sam
->logon_level
!= 0) {
1470 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1477 /*******************************************************************
1478 Reads or writes a DOM_SAM_INFO_EX structure.
1479 ********************************************************************/
1481 static bool smb_io_sam_info_ex(const char *desc
, DOM_SAM_INFO_EX
*sam
, prs_struct
*ps
, int depth
)
1486 prs_debug(ps
, depth
, desc
, "smb_io_sam_info_ex");
1492 if(!smb_io_clnt_srv("", &sam
->client
, ps
, depth
))
1495 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1498 if (sam
->logon_level
!= 0) {
1499 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1506 /*************************************************************************
1507 Inits a NET_USER_INFO_3 structure.
1509 This is a network logon reply packet, and contains much information about
1510 the user. This information is passed as a (very long) paramater list
1511 to avoid having to link in the PASSDB code to every program that deals
1513 *************************************************************************/
1515 void init_net_user_info3(TALLOC_CTX
*ctx
, NET_USER_INFO_3
*usr
,
1519 const char* user_name
,
1520 const char* full_name
,
1521 const char* home_dir
,
1522 const char* dir_drive
,
1523 const char* logon_script
,
1524 const char* profile_path
,
1526 time_t unix_logon_time
,
1527 time_t unix_logoff_time
,
1528 time_t unix_kickoff_time
,
1529 time_t unix_pass_last_set_time
,
1530 time_t unix_pass_can_change_time
,
1531 time_t unix_pass_must_change_time
,
1533 uint16 logon_count
, uint16 bad_pw_count
,
1534 uint32 num_groups
, const DOM_GID
*gids
,
1535 uint32 user_flgs
, uint32 acct_flags
,
1536 uchar user_session_key
[16],
1537 uchar lm_session_key
[16],
1538 const char *logon_srv
, const char *logon_dom
,
1539 const DOM_SID
*dom_sid
)
1541 /* only cope with one "other" sid, right now. */
1542 /* need to count the number of space-delimited sids */
1544 int num_other_sids
= 0;
1546 NTTIME logon_time
, logoff_time
, kickoff_time
,
1547 pass_last_set_time
, pass_can_change_time
,
1548 pass_must_change_time
;
1552 usr
->ptr_user_info
= 1; /* yes, we're bothering to put USER_INFO data here */
1554 /* Create NTTIME structs */
1555 unix_to_nt_time (&logon_time
, unix_logon_time
);
1556 unix_to_nt_time (&logoff_time
, unix_logoff_time
);
1557 unix_to_nt_time (&kickoff_time
, unix_kickoff_time
);
1558 unix_to_nt_time (&pass_last_set_time
, unix_pass_last_set_time
);
1559 unix_to_nt_time (&pass_can_change_time
, unix_pass_can_change_time
);
1560 unix_to_nt_time (&pass_must_change_time
, unix_pass_must_change_time
);
1562 usr
->logon_time
= logon_time
;
1563 usr
->logoff_time
= logoff_time
;
1564 usr
->kickoff_time
= kickoff_time
;
1565 usr
->pass_last_set_time
= pass_last_set_time
;
1566 usr
->pass_can_change_time
= pass_can_change_time
;
1567 usr
->pass_must_change_time
= pass_must_change_time
;
1569 usr
->logon_count
= logon_count
;
1570 usr
->bad_pw_count
= bad_pw_count
;
1572 usr
->user_rid
= user_rid
;
1573 usr
->group_rid
= group_rid
;
1574 usr
->num_groups
= num_groups
;
1576 usr
->buffer_groups
= 1; /* indicates fill in groups, below, even if there are none */
1577 usr
->user_flgs
= user_flgs
;
1578 usr
->acct_flags
= acct_flags
;
1580 if (user_session_key
!= NULL
)
1581 memcpy(usr
->user_sess_key
, user_session_key
, sizeof(usr
->user_sess_key
));
1583 memset((char *)usr
->user_sess_key
, '\0', sizeof(usr
->user_sess_key
));
1585 usr
->buffer_dom_id
= dom_sid
? 1 : 0; /* yes, we're bothering to put a domain SID in */
1587 memset((char *)usr
->lm_sess_key
, '\0', sizeof(usr
->lm_sess_key
));
1589 for (i
=0; i
<7; i
++) {
1590 memset(&usr
->unknown
[i
], '\0', sizeof(usr
->unknown
));
1593 if (lm_session_key
!= NULL
) {
1594 memcpy(usr
->lm_sess_key
, lm_session_key
, sizeof(usr
->lm_sess_key
));
1597 num_other_sids
= init_dom_sid2s(ctx
, NULL
, &usr
->other_sids
);
1599 usr
->num_other_sids
= num_other_sids
;
1600 usr
->buffer_other_sids
= (num_other_sids
!= 0) ? 1 : 0;
1602 init_unistr2(&usr
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1603 init_uni_hdr(&usr
->hdr_user_name
, &usr
->uni_user_name
);
1604 init_unistr2(&usr
->uni_full_name
, full_name
, UNI_FLAGS_NONE
);
1605 init_uni_hdr(&usr
->hdr_full_name
, &usr
->uni_full_name
);
1606 init_unistr2(&usr
->uni_logon_script
, logon_script
, UNI_FLAGS_NONE
);
1607 init_uni_hdr(&usr
->hdr_logon_script
, &usr
->uni_logon_script
);
1608 init_unistr2(&usr
->uni_profile_path
, profile_path
, UNI_FLAGS_NONE
);
1609 init_uni_hdr(&usr
->hdr_profile_path
, &usr
->uni_profile_path
);
1610 init_unistr2(&usr
->uni_home_dir
, home_dir
, UNI_FLAGS_NONE
);
1611 init_uni_hdr(&usr
->hdr_home_dir
, &usr
->uni_home_dir
);
1612 init_unistr2(&usr
->uni_dir_drive
, dir_drive
, UNI_FLAGS_NONE
);
1613 init_uni_hdr(&usr
->hdr_dir_drive
, &usr
->uni_dir_drive
);
1615 usr
->num_groups2
= num_groups
;
1618 usr
->gids
= TALLOC_ZERO_ARRAY(ctx
,DOM_GID
,num_groups
);
1619 if (usr
->gids
== NULL
)
1625 for (i
= 0; i
< num_groups
; i
++)
1626 usr
->gids
[i
] = gids
[i
];
1628 init_unistr2(&usr
->uni_logon_srv
, logon_srv
, UNI_FLAGS_NONE
);
1629 init_uni_hdr(&usr
->hdr_logon_srv
, &usr
->uni_logon_srv
);
1630 init_unistr2(&usr
->uni_logon_dom
, logon_dom
, UNI_FLAGS_NONE
);
1631 init_uni_hdr(&usr
->hdr_logon_dom
, &usr
->uni_logon_dom
);
1633 init_dom_sid2(&usr
->dom_sid
, dom_sid
);
1634 /* "other" sids are set up above */
1637 static void dump_acct_flags(uint32 acct_flags
) {
1640 DEBUG(lvl
,("dump_acct_flags\n"));
1641 if (acct_flags
& ACB_NORMAL
) {
1642 DEBUGADD(lvl
,("\taccount has ACB_NORMAL\n"));
1644 if (acct_flags
& ACB_PWNOEXP
) {
1645 DEBUGADD(lvl
,("\taccount has ACB_PWNOEXP\n"));
1647 if (acct_flags
& ACB_ENC_TXT_PWD_ALLOWED
) {
1648 DEBUGADD(lvl
,("\taccount has ACB_ENC_TXT_PWD_ALLOWED\n"));
1650 if (acct_flags
& ACB_NOT_DELEGATED
) {
1651 DEBUGADD(lvl
,("\taccount has ACB_NOT_DELEGATED\n"));
1653 if (acct_flags
& ACB_USE_DES_KEY_ONLY
) {
1654 DEBUGADD(lvl
,("\taccount has ACB_USE_DES_KEY_ONLY set, sig verify wont work\n"));
1656 if (acct_flags
& ACB_NO_AUTH_DATA_REQD
) {
1657 DEBUGADD(lvl
,("\taccount has ACB_NO_AUTH_DATA_REQD set\n"));
1659 if (acct_flags
& ACB_PWEXPIRED
) {
1660 DEBUGADD(lvl
,("\taccount has ACB_PWEXPIRED set\n"));
1664 static void dump_user_flgs(uint32 user_flags
) {
1667 DEBUG(lvl
,("dump_user_flgs\n"));
1668 if (user_flags
& LOGON_EXTRA_SIDS
) {
1669 DEBUGADD(lvl
,("\taccount has LOGON_EXTRA_SIDS\n"));
1671 if (user_flags
& LOGON_RESOURCE_GROUPS
) {
1672 DEBUGADD(lvl
,("\taccount has LOGON_RESOURCE_GROUPS\n"));
1674 if (user_flags
& LOGON_NTLMV2_ENABLED
) {
1675 DEBUGADD(lvl
,("\taccount has LOGON_NTLMV2_ENABLED\n"));
1677 if (user_flags
& LOGON_CACHED_ACCOUNT
) {
1678 DEBUGADD(lvl
,("\taccount has LOGON_CACHED_ACCOUNT\n"));
1680 if (user_flags
& LOGON_PROFILE_PATH_RETURNED
) {
1681 DEBUGADD(lvl
,("\taccount has LOGON_PROFILE_PATH_RETURNED\n"));
1683 if (user_flags
& LOGON_SERVER_TRUST_ACCOUNT
) {
1684 DEBUGADD(lvl
,("\taccount has LOGON_SERVER_TRUST_ACCOUNT\n"));
1690 /*******************************************************************
1691 This code has been modified to cope with a NET_USER_INFO_2 - which is
1692 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1693 We use validation level to determine if we're marshalling a info 2 or
1694 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1695 Jacobsen at HP. JRA.
1696 ********************************************************************/
1698 bool net_io_user_info3(const char *desc
, NET_USER_INFO_3
*usr
, prs_struct
*ps
,
1699 int depth
, uint16 validation_level
, bool kerb_validation_level
)
1706 prs_debug(ps
, depth
, desc
, "net_io_user_info3");
1709 if (UNMARSHALLING(ps
))
1715 if(!prs_uint32("ptr_user_info ", ps
, depth
, &usr
->ptr_user_info
))
1718 if (usr
->ptr_user_info
== 0)
1721 if(!smb_io_time("logon time", &usr
->logon_time
, ps
, depth
)) /* logon time */
1723 if(!smb_io_time("logoff time", &usr
->logoff_time
, ps
, depth
)) /* logoff time */
1725 if(!smb_io_time("kickoff time", &usr
->kickoff_time
, ps
, depth
)) /* kickoff time */
1727 if(!smb_io_time("last set time", &usr
->pass_last_set_time
, ps
, depth
)) /* password last set time */
1729 if(!smb_io_time("can change time", &usr
->pass_can_change_time
, ps
, depth
)) /* password can change time */
1731 if(!smb_io_time("must change time", &usr
->pass_must_change_time
, ps
, depth
)) /* password must change time */
1734 if(!smb_io_unihdr("hdr_user_name", &usr
->hdr_user_name
, ps
, depth
)) /* username unicode string header */
1736 if(!smb_io_unihdr("hdr_full_name", &usr
->hdr_full_name
, ps
, depth
)) /* user's full name unicode string header */
1738 if(!smb_io_unihdr("hdr_logon_script", &usr
->hdr_logon_script
, ps
, depth
)) /* logon script unicode string header */
1740 if(!smb_io_unihdr("hdr_profile_path", &usr
->hdr_profile_path
, ps
, depth
)) /* profile path unicode string header */
1742 if(!smb_io_unihdr("hdr_home_dir", &usr
->hdr_home_dir
, ps
, depth
)) /* home directory unicode string header */
1744 if(!smb_io_unihdr("hdr_dir_drive", &usr
->hdr_dir_drive
, ps
, depth
)) /* home directory drive unicode string header */
1747 if(!prs_uint16("logon_count ", ps
, depth
, &usr
->logon_count
)) /* logon count */
1749 if(!prs_uint16("bad_pw_count ", ps
, depth
, &usr
->bad_pw_count
)) /* bad password count */
1752 if(!prs_uint32("user_rid ", ps
, depth
, &usr
->user_rid
)) /* User RID */
1754 if(!prs_uint32("group_rid ", ps
, depth
, &usr
->group_rid
)) /* Group RID */
1756 if(!prs_uint32("num_groups ", ps
, depth
, &usr
->num_groups
)) /* num groups */
1758 if(!prs_uint32("buffer_groups ", ps
, depth
, &usr
->buffer_groups
)) /* undocumented buffer pointer to groups. */
1760 if(!prs_uint32("user_flgs ", ps
, depth
, &usr
->user_flgs
)) /* user flags */
1762 dump_user_flgs(usr
->user_flgs
);
1763 if(!prs_uint8s(False
, "user_sess_key", ps
, depth
, usr
->user_sess_key
, 16)) /* user session key */
1766 if(!smb_io_unihdr("hdr_logon_srv", &usr
->hdr_logon_srv
, ps
, depth
)) /* logon server unicode string header */
1768 if(!smb_io_unihdr("hdr_logon_dom", &usr
->hdr_logon_dom
, ps
, depth
)) /* logon domain unicode string header */
1771 if(!prs_uint32("buffer_dom_id ", ps
, depth
, &usr
->buffer_dom_id
)) /* undocumented logon domain id pointer */
1774 if(!prs_uint8s(False
, "lm_sess_key", ps
, depth
, usr
->lm_sess_key
, 8)) /* lm session key */
1777 if(!prs_uint32("acct_flags ", ps
, depth
, &usr
->acct_flags
)) /* Account flags */
1779 dump_acct_flags(usr
->acct_flags
);
1780 for (i
= 0; i
< 7; i
++)
1782 if (!prs_uint32("unkown", ps
, depth
, &usr
->unknown
[i
])) /* unknown */
1786 if (validation_level
== 3) {
1787 if(!prs_uint32("num_other_sids", ps
, depth
, &usr
->num_other_sids
)) /* 0 - num_sids */
1789 if(!prs_uint32("buffer_other_sids", ps
, depth
, &usr
->buffer_other_sids
)) /* NULL - undocumented pointer to SIDs. */
1792 if (UNMARSHALLING(ps
)) {
1793 usr
->num_other_sids
= 0;
1794 usr
->buffer_other_sids
= 0;
1798 /* get kerb validation info (not really part of user_info_3) - Guenther */
1800 if (kerb_validation_level
) {
1802 if(!prs_uint32("ptr_res_group_dom_sid", ps
, depth
, &usr
->ptr_res_group_dom_sid
))
1804 if(!prs_uint32("res_group_count", ps
, depth
, &usr
->res_group_count
))
1806 if(!prs_uint32("ptr_res_groups", ps
, depth
, &usr
->ptr_res_groups
))
1810 if(!smb_io_unistr2("uni_user_name", &usr
->uni_user_name
, usr
->hdr_user_name
.buffer
, ps
, depth
)) /* username unicode string */
1812 if(!smb_io_unistr2("uni_full_name", &usr
->uni_full_name
, usr
->hdr_full_name
.buffer
, ps
, depth
)) /* user's full name unicode string */
1814 if(!smb_io_unistr2("uni_logon_script", &usr
->uni_logon_script
, usr
->hdr_logon_script
.buffer
, ps
, depth
)) /* logon script unicode string */
1816 if(!smb_io_unistr2("uni_profile_path", &usr
->uni_profile_path
, usr
->hdr_profile_path
.buffer
, ps
, depth
)) /* profile path unicode string */
1818 if(!smb_io_unistr2("uni_home_dir", &usr
->uni_home_dir
, usr
->hdr_home_dir
.buffer
, ps
, depth
)) /* home directory unicode string */
1820 if(!smb_io_unistr2("uni_dir_drive", &usr
->uni_dir_drive
, usr
->hdr_dir_drive
.buffer
, ps
, depth
)) /* home directory drive unicode string */
1826 if(!prs_uint32("num_groups2 ", ps
, depth
, &usr
->num_groups2
)) /* num groups2 */
1829 if (usr
->num_groups
!= usr
->num_groups2
) {
1830 DEBUG(3,("net_io_user_info3: num_groups mismatch! (%d != %d)\n",
1831 usr
->num_groups
, usr
->num_groups2
));
1835 if (UNMARSHALLING(ps
)) {
1836 if (usr
->num_groups
) {
1837 usr
->gids
= PRS_ALLOC_MEM(ps
, DOM_GID
, usr
->num_groups
);
1838 if (usr
->gids
== NULL
)
1845 for (i
= 0; i
< usr
->num_groups
; i
++) {
1846 if(!smb_io_gid("", &usr
->gids
[i
], ps
, depth
)) /* group info */
1850 if(!smb_io_unistr2("uni_logon_srv", &usr
->uni_logon_srv
, usr
->hdr_logon_srv
.buffer
, ps
, depth
)) /* logon server unicode string */
1852 if(!smb_io_unistr2("uni_logon_dom", &usr
->uni_logon_dom
, usr
->hdr_logon_dom
.buffer
, ps
, depth
)) /* logon domain unicode string */
1855 if(!smb_io_dom_sid2("", &usr
->dom_sid
, ps
, depth
)) /* domain SID */
1858 if (validation_level
== 3 && usr
->buffer_other_sids
) {
1860 uint32 num_other_sids
= usr
->num_other_sids
;
1862 if (!(usr
->user_flgs
& LOGON_EXTRA_SIDS
)) {
1863 DEBUG(10,("net_io_user_info3: user_flgs attribute does not have LOGON_EXTRA_SIDS\n"));
1867 if (!prs_uint32("num_other_sids", ps
, depth
,
1871 if (num_other_sids
!= usr
->num_other_sids
)
1874 if (UNMARSHALLING(ps
)) {
1875 if (usr
->num_other_sids
) {
1876 usr
->other_sids
= PRS_ALLOC_MEM(ps
, DOM_SID2
, usr
->num_other_sids
);
1877 usr
->other_sids_attrib
=
1878 PRS_ALLOC_MEM(ps
, uint32
, usr
->num_other_sids
);
1880 usr
->other_sids
= NULL
;
1881 usr
->other_sids_attrib
= NULL
;
1884 if ((num_other_sids
!= 0) &&
1885 ((usr
->other_sids
== NULL
) ||
1886 (usr
->other_sids_attrib
== NULL
)))
1890 /* First the pointers to the SIDS and attributes */
1894 for (i
=0; i
<usr
->num_other_sids
; i
++) {
1897 if (!prs_uint32("sid_ptr", ps
, depth
, &ptr
))
1900 if (UNMARSHALLING(ps
) && (ptr
== 0))
1903 if (!prs_uint32("attribute", ps
, depth
,
1904 &usr
->other_sids_attrib
[i
]))
1908 for (i
= 0; i
< usr
->num_other_sids
; i
++) {
1909 if(!smb_io_dom_sid2("", &usr
->other_sids
[i
], ps
, depth
)) /* other domain SIDs */
1919 /*******************************************************************
1920 Reads or writes a structure.
1921 ********************************************************************/
1923 bool net_io_q_sam_logon(const char *desc
, NET_Q_SAM_LOGON
*q_l
, prs_struct
*ps
, int depth
)
1928 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon");
1934 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
))
1937 if(!prs_align_uint16(ps
))
1940 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
1946 /*******************************************************************
1947 Reads or writes a structure.
1948 ********************************************************************/
1950 bool net_io_r_sam_logon(const char *desc
, NET_R_SAM_LOGON
*r_l
, prs_struct
*ps
, int depth
)
1955 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon");
1958 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1960 if (&r_l
->buffer_creds
) {
1961 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1965 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
1970 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1971 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1974 if (r_l
->switch_value
!= 0) {
1975 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1980 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
1983 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1992 /*******************************************************************
1993 Reads or writes a structure.
1994 ********************************************************************/
1996 bool net_io_q_sam_logon_ex(const char *desc
, NET_Q_SAM_LOGON_EX
*q_l
, prs_struct
*ps
, int depth
)
2001 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon_ex");
2007 if(!smb_io_sam_info_ex("", &q_l
->sam_id
, ps
, depth
))
2010 if(!prs_align_uint16(ps
))
2013 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
2019 if(!prs_uint32("flags ", ps
, depth
, &q_l
->flags
))
2025 /*******************************************************************
2026 Reads or writes a structure.
2027 ********************************************************************/
2029 bool net_io_r_sam_logon_ex(const char *desc
, NET_R_SAM_LOGON_EX
*r_l
, prs_struct
*ps
, int depth
)
2034 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon_ex");
2037 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
2042 #if 1 /* W2k always needs this - even for bad passwd. JRA */
2043 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
2046 if (r_l
->switch_value
!= 0) {
2047 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
2052 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
2055 if(!prs_uint32("flags ", ps
, depth
, &r_l
->flags
))
2058 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
2068 /*******************************************************************
2069 Reads or writes a structure.
2070 ********************************************************************/
2072 bool net_io_q_sam_logoff(const char *desc
, NET_Q_SAM_LOGOFF
*q_l
, prs_struct
*ps
, int depth
)
2077 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logoff");
2083 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
)) /* domain SID */
2089 /*******************************************************************
2090 Reads or writes a structure.
2091 ********************************************************************/
2093 bool net_io_r_sam_logoff(const char *desc
, NET_R_SAM_LOGOFF
*r_l
, prs_struct
*ps
, int depth
)
2098 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logoff");
2104 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
2106 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
2109 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
2115 /*******************************************************************
2116 makes a NET_Q_SAM_SYNC structure.
2117 ********************************************************************/
2118 bool init_net_q_sam_sync(NET_Q_SAM_SYNC
* q_s
, const char *srv_name
,
2119 const char *cli_name
, DOM_CRED
*cli_creds
,
2120 DOM_CRED
*ret_creds
, uint32 database_id
,
2123 DEBUG(5, ("init_q_sam_sync\n"));
2125 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
2126 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
2129 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
2132 memcpy(&q_s
->ret_creds
, ret_creds
, sizeof(q_s
->ret_creds
));
2134 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
2136 q_s
->database_id
= database_id
;
2137 q_s
->restart_state
= 0;
2138 q_s
->sync_context
= next_rid
;
2139 q_s
->max_size
= 0xffff;
2144 /*******************************************************************
2145 reads or writes a structure.
2146 ********************************************************************/
2147 bool net_io_q_sam_sync(const char *desc
, NET_Q_SAM_SYNC
* q_s
, prs_struct
*ps
,
2150 prs_debug(ps
, depth
, desc
, "net_io_q_sam_sync");
2153 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
2155 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
2158 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
2160 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
2163 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
2165 if (!prs_uint32("restart_state", ps
, depth
, &q_s
->restart_state
))
2167 if (!prs_uint32("sync_context ", ps
, depth
, &q_s
->sync_context
))
2170 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
2176 /*******************************************************************
2177 reads or writes a structure.
2178 ********************************************************************/
2179 static bool net_io_sam_delta_hdr(const char *desc
, SAM_DELTA_HDR
* delta
,
2180 prs_struct
*ps
, int depth
)
2182 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_hdr");
2185 if (!prs_uint16("type", ps
, depth
, &delta
->type
))
2187 if (!prs_uint16("type2", ps
, depth
, &delta
->type2
))
2189 if (!prs_uint32("target_rid", ps
, depth
, &delta
->target_rid
))
2192 if (!prs_uint32("type3", ps
, depth
, &delta
->type3
))
2195 /* Not sure why we need this but it seems to be necessary to get
2196 sam deltas working. */
2198 if (delta
->type
!= 0x16) {
2199 if (!prs_uint32("ptr_delta", ps
, depth
, &delta
->ptr_delta
))
2206 /*******************************************************************
2207 reads or writes a structure.
2208 ********************************************************************/
2209 static bool net_io_sam_delta_mod_count(const char *desc
, SAM_DELTA_MOD_COUNT
*info
,
2210 prs_struct
*ps
, int depth
)
2212 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_stamp");
2215 if (!prs_uint32("seqnum", ps
, depth
, &info
->seqnum
))
2217 if (!prs_uint32("dom_mod_count_ptr", ps
, depth
,
2218 &info
->dom_mod_count_ptr
))
2221 if (info
->dom_mod_count_ptr
) {
2222 if (!prs_uint64("dom_mod_count", ps
, depth
,
2223 &info
->dom_mod_count
))
2230 /*******************************************************************
2231 reads or writes a structure.
2232 ********************************************************************/
2233 static bool net_io_sam_domain_info(const char *desc
, SAM_DOMAIN_INFO
* info
,
2234 prs_struct
*ps
, int depth
)
2236 prs_debug(ps
, depth
, desc
, "net_io_sam_domain_info");
2239 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2241 if (!smb_io_unihdr("hdr_oem_info", &info
->hdr_oem_info
, ps
, depth
))
2244 if (!prs_uint64("force_logoff", ps
, depth
, &info
->force_logoff
))
2246 if (!prs_uint16("min_pwd_len", ps
, depth
, &info
->min_pwd_len
))
2248 if (!prs_uint16("pwd_history_len", ps
, depth
, &info
->pwd_history_len
))
2250 if (!prs_uint64("max_pwd_age", ps
, depth
, &info
->max_pwd_age
))
2252 if (!prs_uint64("min_pwd_age", ps
, depth
, &info
->min_pwd_age
))
2254 if (!prs_uint64("dom_mod_count", ps
, depth
, &info
->dom_mod_count
))
2256 if (!smb_io_time("creation_time", &info
->creation_time
, ps
, depth
))
2258 if (!prs_uint32("security_information", ps
, depth
, &info
->security_information
))
2260 if (!smb_io_bufhdr4("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2262 if (!smb_io_lockout_string_hdr("hdr_account_lockout_string", &info
->hdr_account_lockout
, ps
, depth
))
2264 if (!smb_io_unihdr("hdr_unknown2", &info
->hdr_unknown2
, ps
, depth
))
2266 if (!smb_io_unihdr("hdr_unknown3", &info
->hdr_unknown3
, ps
, depth
))
2268 if (!smb_io_unihdr("hdr_unknown4", &info
->hdr_unknown4
, ps
, depth
))
2270 if (!prs_uint32("logon_chgpass", ps
, depth
, &info
->logon_chgpass
))
2272 if (!prs_uint32("unknown6", ps
, depth
, &info
->unknown6
))
2274 if (!prs_uint32("unknown7", ps
, depth
, &info
->unknown7
))
2276 if (!prs_uint32("unknown8", ps
, depth
, &info
->unknown8
))
2279 if (!smb_io_unistr2("uni_dom_name", &info
->uni_dom_name
,
2280 info
->hdr_dom_name
.buffer
, ps
, depth
))
2282 if (!smb_io_unistr2("buf_oem_info", &info
->buf_oem_info
,
2283 info
->hdr_oem_info
.buffer
, ps
, depth
))
2286 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2289 if (!smb_io_account_lockout_str("account_lockout", &info
->account_lockout
,
2290 info
->hdr_account_lockout
.buffer
, ps
, depth
))
2293 if (!smb_io_unistr2("buf_unknown2", &info
->buf_unknown2
,
2294 info
->hdr_unknown2
.buffer
, ps
, depth
))
2296 if (!smb_io_unistr2("buf_unknown3", &info
->buf_unknown3
,
2297 info
->hdr_unknown3
.buffer
, ps
, depth
))
2299 if (!smb_io_unistr2("buf_unknown4", &info
->buf_unknown4
,
2300 info
->hdr_unknown4
.buffer
, ps
, depth
))
2306 /*******************************************************************
2307 reads or writes a structure.
2308 ********************************************************************/
2309 static bool net_io_sam_group_info(const char *desc
, SAM_GROUP_INFO
* info
,
2310 prs_struct
*ps
, int depth
)
2312 prs_debug(ps
, depth
, desc
, "net_io_sam_group_info");
2315 if (!smb_io_unihdr("hdr_grp_name", &info
->hdr_grp_name
, ps
, depth
))
2317 if (!smb_io_gid("gid", &info
->gid
, ps
, depth
))
2319 if (!smb_io_unihdr("hdr_grp_desc", &info
->hdr_grp_desc
, ps
, depth
))
2321 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2324 if (ps
->data_offset
+ 48 > ps
->buffer_size
)
2326 ps
->data_offset
+= 48;
2328 if (!smb_io_unistr2("uni_grp_name", &info
->uni_grp_name
,
2329 info
->hdr_grp_name
.buffer
, ps
, depth
))
2331 if (!smb_io_unistr2("uni_grp_desc", &info
->uni_grp_desc
,
2332 info
->hdr_grp_desc
.buffer
, ps
, depth
))
2334 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2340 /*******************************************************************
2341 reads or writes a structure.
2342 ********************************************************************/
2343 static bool net_io_sam_passwd_info(const char *desc
, SAM_PWD
* pwd
,
2344 prs_struct
*ps
, int depth
)
2346 prs_debug(ps
, depth
, desc
, "net_io_sam_passwd_info");
2349 if (!prs_uint32("unk_0 ", ps
, depth
, &pwd
->unk_0
))
2352 if (!smb_io_unihdr("hdr_lm_pwd", &pwd
->hdr_lm_pwd
, ps
, depth
))
2354 if (!prs_uint8s(False
, "buf_lm_pwd", ps
, depth
, pwd
->buf_lm_pwd
, 16))
2357 if (!smb_io_unihdr("hdr_nt_pwd", &pwd
->hdr_nt_pwd
, ps
, depth
))
2359 if (!prs_uint8s(False
, "buf_nt_pwd", ps
, depth
, pwd
->buf_nt_pwd
, 16))
2362 if (!smb_io_unihdr("", &pwd
->hdr_empty_lm
, ps
, depth
))
2364 if (!smb_io_unihdr("", &pwd
->hdr_empty_nt
, ps
, depth
))
2370 /*******************************************************************
2371 reads or writes a structure.
2372 ********************************************************************/
2373 static bool net_io_sam_account_info(const char *desc
, SAM_ACCOUNT_INFO
*info
,
2374 prs_struct
*ps
, int depth
)
2376 BUFHDR2 hdr_priv_data
;
2379 prs_debug(ps
, depth
, desc
, "net_io_sam_account_info");
2382 if (!smb_io_unihdr("hdr_acct_name", &info
->hdr_acct_name
, ps
, depth
))
2384 if (!smb_io_unihdr("hdr_full_name", &info
->hdr_full_name
, ps
, depth
))
2387 if (!prs_uint32("user_rid ", ps
, depth
, &info
->user_rid
))
2389 if (!prs_uint32("group_rid", ps
, depth
, &info
->group_rid
))
2392 if (!smb_io_unihdr("hdr_home_dir ", &info
->hdr_home_dir
, ps
, depth
))
2394 if (!smb_io_unihdr("hdr_dir_drive", &info
->hdr_dir_drive
, ps
, depth
))
2396 if (!smb_io_unihdr("hdr_logon_script", &info
->hdr_logon_script
, ps
,
2400 if (!smb_io_unihdr("hdr_acct_desc", &info
->hdr_acct_desc
, ps
, depth
))
2402 if (!smb_io_unihdr("hdr_workstations", &info
->hdr_workstations
, ps
,
2406 if (!smb_io_time("logon_time", &info
->logon_time
, ps
, depth
))
2408 if (!smb_io_time("logoff_time", &info
->logoff_time
, ps
, depth
))
2411 if (!prs_uint32("logon_divs ", ps
, depth
, &info
->logon_divs
))
2413 if (!prs_uint32("ptr_logon_hrs", ps
, depth
, &info
->ptr_logon_hrs
))
2416 if (!prs_uint16("bad_pwd_count", ps
, depth
, &info
->bad_pwd_count
))
2418 if (!prs_uint16("logon_count", ps
, depth
, &info
->logon_count
))
2420 if (!smb_io_time("pwd_last_set_time", &info
->pwd_last_set_time
, ps
,
2423 if (!smb_io_time("acct_expiry_time", &info
->acct_expiry_time
, ps
,
2427 if (!prs_uint32("acb_info", ps
, depth
, &info
->acb_info
))
2429 if (!prs_uint8s(False
, "nt_pwd", ps
, depth
, info
->nt_pwd
, 16))
2431 if (!prs_uint8s(False
, "lm_pwd", ps
, depth
, info
->lm_pwd
, 16))
2433 if (!prs_uint8("lm_pwd_present", ps
, depth
, &info
->lm_pwd_present
))
2435 if (!prs_uint8("nt_pwd_present", ps
, depth
, &info
->nt_pwd_present
))
2437 if (!prs_uint8("pwd_expired", ps
, depth
, &info
->pwd_expired
))
2440 if (!smb_io_unihdr("hdr_comment", &info
->hdr_comment
, ps
, depth
))
2442 if (!smb_io_unihdr("hdr_parameters", &info
->hdr_parameters
, ps
,
2445 if (!prs_uint16("country", ps
, depth
, &info
->country
))
2447 if (!prs_uint16("codepage", ps
, depth
, &info
->codepage
))
2450 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data
, ps
, depth
))
2452 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2454 if (!smb_io_unihdr("hdr_profile", &info
->hdr_profile
, ps
, depth
))
2457 for (i
= 0; i
< 3; i
++)
2459 if (!smb_io_unihdr("hdr_reserved", &info
->hdr_reserved
[i
],
2464 for (i
= 0; i
< 4; i
++)
2466 if (!prs_uint32("dw_reserved", ps
, depth
,
2467 &info
->dw_reserved
[i
]))
2471 if (!smb_io_unistr2("uni_acct_name", &info
->uni_acct_name
,
2472 info
->hdr_acct_name
.buffer
, ps
, depth
))
2475 if (!smb_io_unistr2("uni_full_name", &info
->uni_full_name
,
2476 info
->hdr_full_name
.buffer
, ps
, depth
))
2479 if (!smb_io_unistr2("uni_home_dir ", &info
->uni_home_dir
,
2480 info
->hdr_home_dir
.buffer
, ps
, depth
))
2483 if (!smb_io_unistr2("uni_dir_drive", &info
->uni_dir_drive
,
2484 info
->hdr_dir_drive
.buffer
, ps
, depth
))
2487 if (!smb_io_unistr2("uni_logon_script", &info
->uni_logon_script
,
2488 info
->hdr_logon_script
.buffer
, ps
, depth
))
2491 if (!smb_io_unistr2("uni_acct_desc", &info
->uni_acct_desc
,
2492 info
->hdr_acct_desc
.buffer
, ps
, depth
))
2495 if (!smb_io_unistr2("uni_workstations", &info
->uni_workstations
,
2496 info
->hdr_workstations
.buffer
, ps
, depth
))
2500 if (!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2502 if (!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2505 if (!smb_io_rpc_blob("buf_logon_hrs", &info
->buf_logon_hrs
, ps
, depth
))
2508 if (!smb_io_unistr2("uni_comment", &info
->uni_comment
,
2509 info
->hdr_comment
.buffer
, ps
, depth
))
2512 if (!smb_io_unistr2("uni_parameters", &info
->uni_parameters
,
2513 info
->hdr_parameters
.buffer
, ps
, depth
))
2516 if (hdr_priv_data
.buffer
!= 0)
2520 if (!prs_uint32("pwd_len", ps
, depth
, &len
))
2522 old_offset
= ps
->data_offset
;
2528 if (!prs_hash1(ps
, ps
->data_offset
, len
))
2531 if (!net_io_sam_passwd_info("pass", &info
->pass
,
2538 if (!prs_hash1(ps
, old_offset
, len
))
2542 if (old_offset
+ len
> ps
->buffer_size
)
2544 ps
->data_offset
= old_offset
+ len
;
2546 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2549 if (!smb_io_unistr2("uni_profile", &info
->uni_profile
,
2550 info
->hdr_profile
.buffer
, ps
, depth
))
2558 /*******************************************************************
2559 reads or writes a structure.
2560 ********************************************************************/
2561 static bool net_io_sam_group_mem_info(const char *desc
, SAM_GROUP_MEM_INFO
* info
,
2562 prs_struct
*ps
, int depth
)
2567 prs_debug(ps
, depth
, desc
, "net_io_sam_group_mem_info");
2571 if (!prs_uint32("ptr_rids ", ps
, depth
, &info
->ptr_rids
))
2573 if (!prs_uint32("ptr_attribs", ps
, depth
, &info
->ptr_attribs
))
2575 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2578 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2580 ps
->data_offset
+= 16;
2582 if (info
->ptr_rids
!= 0)
2584 if (!prs_uint32("num_members2", ps
, depth
,
2585 &info
->num_members2
))
2588 if (info
->num_members2
!= info
->num_members
)
2594 if (UNMARSHALLING(ps
)) {
2595 if (info
->num_members2
) {
2596 info
->rids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members2
);
2598 if (info
->rids
== NULL
) {
2599 DEBUG(0, ("out of memory allocating %d rids\n",
2600 info
->num_members2
));
2608 for (i
= 0; i
< info
->num_members2
; i
++)
2610 slprintf(tmp
, sizeof(tmp
) - 1, "rids[%02d]", i
);
2611 if (!prs_uint32(tmp
, ps
, depth
, &info
->rids
[i
]))
2616 if (info
->ptr_attribs
!= 0)
2618 if (!prs_uint32("num_members3", ps
, depth
,
2619 &info
->num_members3
))
2621 if (info
->num_members3
!= info
->num_members
)
2627 if (UNMARSHALLING(ps
)) {
2628 if (info
->num_members3
) {
2629 info
->attribs
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members3
);
2631 if (info
->attribs
== NULL
) {
2632 DEBUG(0, ("out of memory allocating %d attribs\n",
2633 info
->num_members3
));
2637 info
->attribs
= NULL
;
2641 for (i
= 0; i
< info
->num_members3
; i
++)
2643 slprintf(tmp
, sizeof(tmp
) - 1, "attribs[%02d]", i
);
2644 if (!prs_uint32(tmp
, ps
, depth
, &info
->attribs
[i
]))
2652 /*******************************************************************
2653 reads or writes a structure.
2654 ********************************************************************/
2655 static bool net_io_sam_alias_info(const char *desc
, SAM_ALIAS_INFO
* info
,
2656 prs_struct
*ps
, int depth
)
2658 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_info");
2661 if (!smb_io_unihdr("hdr_als_name", &info
->hdr_als_name
, ps
, depth
))
2663 if (!prs_uint32("als_rid", ps
, depth
, &info
->als_rid
))
2665 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2667 if (!smb_io_unihdr("hdr_als_desc", &info
->hdr_als_desc
, ps
, depth
))
2670 if (ps
->data_offset
+ 40 > ps
->buffer_size
)
2672 ps
->data_offset
+= 40;
2674 if (!smb_io_unistr2("uni_als_name", &info
->uni_als_name
,
2675 info
->hdr_als_name
.buffer
, ps
, depth
))
2677 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2680 if (!smb_io_unistr2("uni_als_desc", &info
->uni_als_desc
,
2681 info
->hdr_als_desc
.buffer
, ps
, depth
))
2687 /*******************************************************************
2688 reads or writes a structure.
2689 ********************************************************************/
2690 static bool net_io_sam_alias_mem_info(const char *desc
, SAM_ALIAS_MEM_INFO
* info
,
2691 prs_struct
*ps
, int depth
)
2696 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_mem_info");
2700 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2702 if (!prs_uint32("ptr_members", ps
, depth
, &info
->ptr_members
))
2705 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2707 ps
->data_offset
+= 16;
2709 if (info
->ptr_members
!= 0)
2711 if (!prs_uint32("num_sids", ps
, depth
, &info
->num_sids
))
2713 if (info
->num_sids
!= info
->num_members
)
2719 if (UNMARSHALLING(ps
)) {
2720 if (info
->num_sids
) {
2721 info
->ptr_sids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_sids
);
2723 if (info
->ptr_sids
== NULL
) {
2724 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2729 info
->ptr_sids
= NULL
;
2733 for (i
= 0; i
< info
->num_sids
; i
++)
2735 slprintf(tmp
, sizeof(tmp
) - 1, "ptr_sids[%02d]", i
);
2736 if (!prs_uint32(tmp
, ps
, depth
, &info
->ptr_sids
[i
]))
2740 if (UNMARSHALLING(ps
)) {
2741 if (info
->num_sids
) {
2742 info
->sids
= TALLOC_ARRAY(ps
->mem_ctx
, DOM_SID2
, info
->num_sids
);
2744 if (info
->sids
== NULL
) {
2745 DEBUG(0, ("error allocating %d sids\n",
2754 for (i
= 0; i
< info
->num_sids
; i
++)
2756 if (info
->ptr_sids
[i
] != 0)
2758 slprintf(tmp
, sizeof(tmp
) - 1, "sids[%02d]",
2760 if (!smb_io_dom_sid2(tmp
, &info
->sids
[i
],
2770 /*******************************************************************
2771 reads or writes a structure.
2772 ********************************************************************/
2773 static bool net_io_sam_policy_info(const char *desc
, SAM_DELTA_POLICY
*info
,
2774 prs_struct
*ps
, int depth
)
2777 prs_debug(ps
, depth
, desc
, "net_io_sam_policy_info");
2783 if (!prs_uint32("max_log_size", ps
, depth
, &info
->max_log_size
))
2785 if (!prs_uint64("audit_retention_period", ps
, depth
,
2786 &info
->audit_retention_period
))
2788 if (!prs_uint32("auditing_mode", ps
, depth
, &info
->auditing_mode
))
2790 if (!prs_uint32("num_events", ps
, depth
, &info
->num_events
))
2792 if (!prs_uint32("ptr_events", ps
, depth
, &info
->ptr_events
))
2795 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2798 if (!prs_uint32("sid_ptr", ps
, depth
, &info
->sid_ptr
))
2801 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2803 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2804 &info
->non_paged_pool_limit
))
2806 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2808 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2810 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2812 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2814 if (!smb_io_time("modify_time", &info
->modify_time
, ps
, depth
))
2816 if (!smb_io_time("create_time", &info
->create_time
, ps
, depth
))
2818 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2821 for (i
=0; i
<4; i
++) {
2823 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2827 for (i
=0; i
<4; i
++) {
2829 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2833 if (!prs_uint32("num_event_audit_options", ps
, depth
,
2834 &info
->num_event_audit_options
))
2837 for (i
=0; i
<info
->num_event_audit_options
; i
++)
2838 if (!prs_uint32("event_audit_option", ps
, depth
,
2839 &info
->event_audit_option
))
2842 if (!smb_io_unistr2("domain_name", &info
->domain_name
, True
, ps
, depth
))
2845 if(!smb_io_dom_sid2("domain_sid", &info
->domain_sid
, ps
, depth
))
2848 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2857 /* This function is pretty broken - see bug #334 */
2859 /*******************************************************************
2860 reads or writes a structure.
2861 ********************************************************************/
2862 static bool net_io_sam_trustdoms_info(const char *desc
, SAM_DELTA_TRUSTDOMS
*info
,
2863 prs_struct
*ps
, int depth
)
2867 prs_debug(ps
, depth
, desc
, "net_io_sam_trustdoms_info");
2873 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2876 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2879 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2882 if(!smb_io_unihdr("hdr_domain", &info
->hdr_domain
, ps
, depth
))
2885 if(!prs_uint32("unknown0", ps
, depth
, &info
->unknown0
))
2887 if(!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2889 if(!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2892 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2894 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2897 for (i
=0; i
<12; i
++)
2898 if(!prs_uint32("unknown3", ps
, depth
, &info
->unknown3
))
2901 if (!smb_io_unistr2("domain", &info
->domain
, True
, ps
, depth
))
2911 /* This function doesn't work - see bug #334 */
2913 /*******************************************************************
2914 reads or writes a structure.
2915 ********************************************************************/
2916 static bool net_io_sam_secret_info(const char *desc
, SAM_DELTA_SECRET
*info
,
2917 prs_struct
*ps
, int depth
)
2921 prs_debug(ps
, depth
, desc
, "net_io_sam_secret_info");
2927 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2930 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2933 if (!smb_io_unistr2("secret", &info
->secret
, True
, ps
, depth
))
2939 if(!prs_uint32("count1", ps
, depth
, &info
->count1
))
2941 if(!prs_uint32("count2", ps
, depth
, &info
->count2
))
2943 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2947 if(!smb_io_time("time1", &info
->time1
, ps
, depth
)) /* logon time */
2949 if(!prs_uint32("count3", ps
, depth
, &info
->count3
))
2951 if(!prs_uint32("count4", ps
, depth
, &info
->count4
))
2953 if(!prs_uint32("ptr2", ps
, depth
, &info
->ptr2
))
2955 if(!smb_io_time("time2", &info
->time2
, ps
, depth
)) /* logon time */
2957 if(!prs_uint32("unknow1", ps
, depth
, &info
->unknow1
))
2961 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2963 if(!prs_uint32("ptr3", ps
, depth
, &info
->ptr3
))
2966 if(!prs_uint32("unknow2", ps
, depth
, &info
->unknow2
))
2969 if(!prs_uint32("chal_len", ps
, depth
, &info
->chal_len
))
2971 if(!prs_uint32("reserved1", ps
, depth
, &info
->reserved1
))
2973 if(!prs_uint32("chal_len2", ps
, depth
, &info
->chal_len2
))
2976 if(!prs_uint8s (False
, "chal", ps
, depth
, info
->chal
, info
->chal_len2
))
2979 if(!prs_uint32("key_len", ps
, depth
, &info
->key_len
))
2981 if(!prs_uint32("reserved2", ps
, depth
, &info
->reserved2
))
2983 if(!prs_uint32("key_len2", ps
, depth
, &info
->key_len2
))
2986 if(!prs_uint8s (False
, "key", ps
, depth
, info
->key
, info
->key_len2
))
2990 if(!prs_uint32("buf_size3", ps
, depth
, &info
->buf_size3
))
2993 if(!sec_io_desc("sec_desc2", &info
->sec_desc2
, ps
, depth
))
3002 /*******************************************************************
3003 reads or writes a structure.
3004 ********************************************************************/
3005 static bool net_io_sam_privs_info(const char *desc
, SAM_DELTA_PRIVS
*info
,
3006 prs_struct
*ps
, int depth
)
3010 prs_debug(ps
, depth
, desc
, "net_io_sam_privs_info");
3016 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
3019 if(!prs_uint32("priv_count", ps
, depth
, &info
->priv_count
))
3021 if(!prs_uint32("priv_control", ps
, depth
, &info
->priv_control
))
3024 if(!prs_uint32("priv_attr_ptr", ps
, depth
, &info
->priv_attr_ptr
))
3026 if(!prs_uint32("priv_name_ptr", ps
, depth
, &info
->priv_name_ptr
))
3029 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
3031 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
3032 &info
->non_paged_pool_limit
))
3034 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
3036 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
3038 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
3040 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
3042 if (!prs_uint32("system_flags", ps
, depth
, &info
->system_flags
))
3044 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
3047 for (i
=0; i
<4; i
++) {
3049 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
3053 for (i
=0; i
<4; i
++) {
3055 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
3059 if(!prs_uint32("attribute_count", ps
, depth
, &info
->attribute_count
))
3062 if (UNMARSHALLING(ps
)) {
3063 if (info
->attribute_count
) {
3064 info
->attributes
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->attribute_count
);
3065 if (!info
->attributes
) {
3069 info
->attributes
= NULL
;
3073 for (i
=0; i
<info
->attribute_count
; i
++)
3074 if(!prs_uint32("attributes", ps
, depth
, &info
->attributes
[i
]))
3077 if(!prs_uint32("privlist_count", ps
, depth
, &info
->privlist_count
))
3080 if (UNMARSHALLING(ps
)) {
3081 if (info
->privlist_count
) {
3082 info
->hdr_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNIHDR
, info
->privlist_count
);
3083 info
->uni_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNISTR2
, info
->privlist_count
);
3084 if (!info
->hdr_privslist
) {
3087 if (!info
->uni_privslist
) {
3091 info
->hdr_privslist
= NULL
;
3092 info
->uni_privslist
= NULL
;
3096 for (i
=0; i
<info
->privlist_count
; i
++)
3097 if(!smb_io_unihdr("hdr_privslist", &info
->hdr_privslist
[i
], ps
, depth
))
3100 for (i
=0; i
<info
->privlist_count
; i
++)
3101 if (!smb_io_unistr2("uni_privslist", &info
->uni_privslist
[i
], True
, ps
, depth
))
3104 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
3110 /*******************************************************************
3111 reads or writes a structure.
3112 ********************************************************************/
3113 static bool net_io_sam_delta_ctr(const char *desc
,
3114 SAM_DELTA_CTR
* delta
, uint16 type
,
3115 prs_struct
*ps
, int depth
)
3117 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_ctr");
3121 /* Seen in sam deltas */
3122 case SAM_DELTA_MODIFIED_COUNT
:
3123 if (!net_io_sam_delta_mod_count("", &delta
->mod_count
, ps
, depth
))
3127 case SAM_DELTA_DOMAIN_INFO
:
3128 if (!net_io_sam_domain_info("", &delta
->domain_info
, ps
, depth
))
3132 case SAM_DELTA_GROUP_INFO
:
3133 if (!net_io_sam_group_info("", &delta
->group_info
, ps
, depth
))
3137 case SAM_DELTA_ACCOUNT_INFO
:
3138 if (!net_io_sam_account_info("", &delta
->account_info
, ps
, depth
))
3142 case SAM_DELTA_GROUP_MEM
:
3143 if (!net_io_sam_group_mem_info("", &delta
->grp_mem_info
, ps
, depth
))
3147 case SAM_DELTA_ALIAS_INFO
:
3148 if (!net_io_sam_alias_info("", &delta
->alias_info
, ps
, depth
))
3152 case SAM_DELTA_POLICY_INFO
:
3153 if (!net_io_sam_policy_info("", &delta
->policy_info
, ps
, depth
))
3157 case SAM_DELTA_ALIAS_MEM
:
3158 if (!net_io_sam_alias_mem_info("", &delta
->als_mem_info
, ps
, depth
))
3162 case SAM_DELTA_PRIVS_INFO
:
3163 if (!net_io_sam_privs_info("", &delta
->privs_info
, ps
, depth
))
3167 /* These guys are implemented but broken */
3169 case SAM_DELTA_TRUST_DOMS
:
3170 case SAM_DELTA_SECRET_INFO
:
3173 /* These guys are not implemented yet */
3175 case SAM_DELTA_RENAME_GROUP
:
3176 case SAM_DELTA_RENAME_USER
:
3177 case SAM_DELTA_RENAME_ALIAS
:
3178 case SAM_DELTA_DELETE_GROUP
:
3179 case SAM_DELTA_DELETE_USER
:
3181 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type
));
3188 /*******************************************************************
3189 reads or writes a structure.
3190 ********************************************************************/
3191 bool net_io_r_sam_sync(const char *desc
,
3192 NET_R_SAM_SYNC
* r_s
, prs_struct
*ps
, int depth
)
3196 prs_debug(ps
, depth
, desc
, "net_io_r_sam_sync");
3199 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
3201 if (!prs_uint32("sync_context", ps
, depth
, &r_s
->sync_context
))
3204 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
3206 if (r_s
->ptr_deltas
!= 0)
3208 if (!prs_uint32("num_deltas ", ps
, depth
, &r_s
->num_deltas
))
3210 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->ptr_deltas2
))
3212 if (r_s
->ptr_deltas2
!= 0)
3214 if (!prs_uint32("num_deltas2", ps
, depth
,
3218 if (r_s
->num_deltas2
!= r_s
->num_deltas
)
3224 if (UNMARSHALLING(ps
)) {
3225 if (r_s
->num_deltas2
) {
3226 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas2
);
3227 if (r_s
->hdr_deltas
== NULL
) {
3228 DEBUG(0, ("error tallocating memory "
3229 "for %d delta headers\n",
3234 r_s
->hdr_deltas
= NULL
;
3238 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
3240 if (!net_io_sam_delta_hdr("",
3241 &r_s
->hdr_deltas
[i
],
3246 if (UNMARSHALLING(ps
)) {
3247 if (r_s
->num_deltas2
) {
3248 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas2
);
3249 if (r_s
->deltas
== NULL
) {
3250 DEBUG(0, ("error tallocating memory "
3260 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
3262 if (!net_io_sam_delta_ctr(
3263 "", &r_s
->deltas
[i
],
3264 r_s
->hdr_deltas
[i
].type3
,
3266 DEBUG(0, ("hmm, failed on i=%d\n", i
));
3274 if (!prs_ntstatus("status", ps
, depth
, &(r_s
->status
)))
3280 /*******************************************************************
3281 makes a NET_Q_SAM_DELTAS structure.
3282 ********************************************************************/
3283 bool init_net_q_sam_deltas(NET_Q_SAM_DELTAS
*q_s
, const char *srv_name
,
3284 const char *cli_name
, DOM_CRED
*cli_creds
,
3285 uint32 database_id
, uint64 dom_mod_count
)
3287 DEBUG(5, ("init_net_q_sam_deltas\n"));
3289 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
3290 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
3292 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
3293 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
3295 q_s
->database_id
= database_id
;
3296 q_s
->dom_mod_count
= dom_mod_count
;
3297 q_s
->max_size
= 0xffff;
3302 /*******************************************************************
3303 reads or writes a structure.
3304 ********************************************************************/
3305 bool net_io_q_sam_deltas(const char *desc
, NET_Q_SAM_DELTAS
*q_s
, prs_struct
*ps
,
3308 prs_debug(ps
, depth
, desc
, "net_io_q_sam_deltas");
3311 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
3313 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
3316 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
3318 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
3321 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
3323 if (!prs_uint64("dom_mod_count", ps
, depth
, &q_s
->dom_mod_count
))
3325 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
3331 /*******************************************************************
3332 reads or writes a structure.
3333 ********************************************************************/
3334 bool net_io_r_sam_deltas(const char *desc
,
3335 NET_R_SAM_DELTAS
*r_s
, prs_struct
*ps
, int depth
)
3339 prs_debug(ps
, depth
, desc
, "net_io_r_sam_deltas");
3342 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
3344 if (!prs_uint64("dom_mod_count", ps
, depth
, &r_s
->dom_mod_count
))
3347 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
3349 if (!prs_uint32("num_deltas", ps
, depth
, &r_s
->num_deltas
))
3351 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->num_deltas2
))
3354 if (r_s
->num_deltas2
!= 0)
3356 if (!prs_uint32("num_deltas2 ", ps
, depth
, &r_s
->num_deltas2
))
3359 if (r_s
->ptr_deltas
!= 0)
3361 if (UNMARSHALLING(ps
)) {
3362 if (r_s
->num_deltas
) {
3363 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas
);
3364 if (r_s
->hdr_deltas
== NULL
) {
3365 DEBUG(0, ("error tallocating memory "
3366 "for %d delta headers\n",
3371 r_s
->hdr_deltas
= NULL
;
3375 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3377 net_io_sam_delta_hdr("", &r_s
->hdr_deltas
[i
],
3381 if (UNMARSHALLING(ps
)) {
3382 if (r_s
->num_deltas
) {
3383 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas
);
3384 if (r_s
->deltas
== NULL
) {
3385 DEBUG(0, ("error tallocating memory "
3395 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3397 if (!net_io_sam_delta_ctr(
3400 r_s
->hdr_deltas
[i
].type2
,
3409 if (!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
3415 /*******************************************************************
3416 Inits a NET_Q_DSR_GETDCNAME structure.
3417 ********************************************************************/
3419 void init_net_q_dsr_getdcname(NET_Q_DSR_GETDCNAME
*r_t
, const char *server_unc
,
3420 const char *domain_name
,
3421 struct GUID
*domain_guid
,
3422 struct GUID
*site_guid
,
3425 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3427 r_t
->ptr_server_unc
= (server_unc
!= NULL
);
3428 init_unistr2(&r_t
->uni_server_unc
, server_unc
, UNI_STR_TERMINATE
);
3430 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3431 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3433 r_t
->ptr_domain_guid
= (domain_guid
!= NULL
);
3434 r_t
->domain_guid
= domain_guid
;
3436 r_t
->ptr_site_guid
= (site_guid
!= NULL
);
3437 r_t
->site_guid
= site_guid
;
3442 /*******************************************************************
3443 Inits a NET_Q_DSR_GETDCNAMEEX structure.
3444 ********************************************************************/
3446 void init_net_q_dsr_getdcnameex(NET_Q_DSR_GETDCNAMEEX
*r_t
, const char *server_unc
,
3447 const char *domain_name
,
3448 struct GUID
*domain_guid
,
3449 const char *site_name
,
3452 DEBUG(5, ("init_net_q_dsr_getdcnameex\n"));
3454 r_t
->ptr_server_unc
= (server_unc
!= NULL
);
3455 init_unistr2(&r_t
->uni_server_unc
, server_unc
, UNI_STR_TERMINATE
);
3457 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3458 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3460 r_t
->ptr_domain_guid
= (domain_guid
!= NULL
);
3461 r_t
->domain_guid
= domain_guid
;
3463 r_t
->ptr_site_name
= (site_name
!= NULL
);
3464 init_unistr2(&r_t
->uni_site_name
, site_name
, UNI_STR_TERMINATE
);
3469 /*******************************************************************
3470 Inits a NET_Q_DSR_GETDCNAMEEX2 structure.
3471 ********************************************************************/
3473 void init_net_q_dsr_getdcnameex2(NET_Q_DSR_GETDCNAMEEX2
*r_t
, const char *server_unc
,
3474 const char *domain_name
,
3475 const char *client_account
,
3477 struct GUID
*domain_guid
,
3478 const char *site_name
,
3481 DEBUG(5, ("init_net_q_dsr_getdcnameex2\n"));
3483 r_t
->ptr_server_unc
= (server_unc
!= NULL
);
3484 init_unistr2(&r_t
->uni_server_unc
, server_unc
, UNI_STR_TERMINATE
);
3486 r_t
->ptr_client_account
= (client_account
!= NULL
);
3487 init_unistr2(&r_t
->uni_client_account
, client_account
, UNI_STR_TERMINATE
);
3491 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3492 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3494 r_t
->ptr_domain_guid
= (domain_guid
!= NULL
);
3495 r_t
->domain_guid
= domain_guid
;
3497 r_t
->ptr_site_name
= (site_name
!= NULL
);
3498 init_unistr2(&r_t
->uni_site_name
, site_name
, UNI_STR_TERMINATE
);
3503 /*******************************************************************
3504 Reads or writes an NET_Q_DSR_GETDCNAME structure.
3505 ********************************************************************/
3507 bool net_io_q_dsr_getdcname(const char *desc
, NET_Q_DSR_GETDCNAME
*r_t
,
3508 prs_struct
*ps
, int depth
)
3513 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getdcname");
3516 if (!prs_uint32("ptr_server_unc", ps
, depth
, &r_t
->ptr_server_unc
))
3519 if (!smb_io_unistr2("server_unc", &r_t
->uni_server_unc
,
3520 r_t
->ptr_server_unc
, ps
, depth
))
3526 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3529 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3530 r_t
->ptr_domain_name
, ps
, depth
))
3536 if (!prs_uint32("ptr_domain_guid", ps
, depth
, &r_t
->ptr_domain_guid
))
3539 if (UNMARSHALLING(ps
) && (r_t
->ptr_domain_guid
)) {
3540 r_t
->domain_guid
= PRS_ALLOC_MEM(ps
, struct GUID
, 1);
3541 if (r_t
->domain_guid
== NULL
)
3545 if ((r_t
->ptr_domain_guid
) &&
3546 (!smb_io_uuid("domain_guid", r_t
->domain_guid
, ps
, depth
)))
3552 if (!prs_uint32("ptr_site_guid", ps
, depth
, &r_t
->ptr_site_guid
))
3555 if (UNMARSHALLING(ps
) && (r_t
->ptr_site_guid
)) {
3556 r_t
->site_guid
= PRS_ALLOC_MEM(ps
, struct GUID
, 1);
3557 if (r_t
->site_guid
== NULL
)
3561 if ((r_t
->ptr_site_guid
) &&
3562 (!smb_io_uuid("site_guid", r_t
->site_guid
, ps
, depth
)))
3568 if (!prs_uint32("flags", ps
, depth
, &r_t
->flags
))
3574 /*******************************************************************
3575 Reads or writes an NET_Q_DSR_GETDCNAMEEX structure.
3576 ********************************************************************/
3578 bool net_io_q_dsr_getdcnameex(const char *desc
, NET_Q_DSR_GETDCNAMEEX
*r_t
,
3579 prs_struct
*ps
, int depth
)
3584 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getdcnameex");
3587 if (!prs_uint32("ptr_server_unc", ps
, depth
, &r_t
->ptr_server_unc
))
3590 if (!smb_io_unistr2("server_unc", &r_t
->uni_server_unc
,
3591 r_t
->ptr_server_unc
, ps
, depth
))
3597 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3600 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3601 r_t
->ptr_domain_name
, ps
, depth
))
3607 if (!prs_uint32("ptr_domain_guid", ps
, depth
, &r_t
->ptr_domain_guid
))
3610 if (UNMARSHALLING(ps
) && (r_t
->ptr_domain_guid
)) {
3611 r_t
->domain_guid
= PRS_ALLOC_MEM(ps
, struct GUID
, 1);
3612 if (r_t
->domain_guid
== NULL
)
3616 if ((r_t
->ptr_domain_guid
) &&
3617 (!smb_io_uuid("domain_guid", r_t
->domain_guid
, ps
, depth
)))
3623 if (!prs_uint32("ptr_site_name", ps
, depth
, &r_t
->ptr_site_name
))
3626 if (!smb_io_unistr2("site_name", &r_t
->uni_site_name
,
3627 r_t
->ptr_site_name
, ps
, depth
))
3633 if (!prs_uint32("flags", ps
, depth
, &r_t
->flags
))
3639 /*******************************************************************
3640 Reads or writes an NET_Q_DSR_GETDCNAMEEX2 structure.
3641 ********************************************************************/
3643 bool net_io_q_dsr_getdcnameex2(const char *desc
, NET_Q_DSR_GETDCNAMEEX2
*r_t
,
3644 prs_struct
*ps
, int depth
)
3649 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getdcnameex2");
3652 if (!prs_uint32("ptr_server_unc", ps
, depth
, &r_t
->ptr_server_unc
))
3655 if (!smb_io_unistr2("server_unc", &r_t
->uni_server_unc
,
3656 r_t
->ptr_server_unc
, ps
, depth
))
3662 if (!prs_uint32("ptr_client_account", ps
, depth
, &r_t
->ptr_client_account
))
3665 if (!smb_io_unistr2("client_account", &r_t
->uni_client_account
,
3666 r_t
->ptr_client_account
, ps
, depth
))
3672 if (!prs_uint32("mask", ps
, depth
, &r_t
->mask
))
3678 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3681 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3682 r_t
->ptr_domain_name
, ps
, depth
))
3688 if (!prs_uint32("ptr_domain_guid", ps
, depth
, &r_t
->ptr_domain_guid
))
3691 if (UNMARSHALLING(ps
) && (r_t
->ptr_domain_guid
)) {
3692 r_t
->domain_guid
= PRS_ALLOC_MEM(ps
, struct GUID
, 1);
3693 if (r_t
->domain_guid
== NULL
)
3697 if ((r_t
->ptr_domain_guid
) &&
3698 (!smb_io_uuid("domain_guid", r_t
->domain_guid
, ps
, depth
)))
3704 if (!prs_uint32("ptr_site_name", ps
, depth
, &r_t
->ptr_site_name
))
3707 if (!smb_io_unistr2("site_name", &r_t
->uni_site_name
,
3708 r_t
->ptr_site_name
, ps
, depth
))
3714 if (!prs_uint32("flags", ps
, depth
, &r_t
->flags
))
3722 /*******************************************************************
3723 Inits a NET_R_DSR_GETDCNAME structure.
3724 ********************************************************************/
3725 void init_net_r_dsr_getdcname(NET_R_DSR_GETDCNAME
*r_t
, const char *dc_unc
,
3726 const char *dc_address
, int32 dc_address_type
,
3727 struct GUID domain_guid
, const char *domain_name
,
3728 const char *forest_name
, uint32 dc_flags
,
3729 const char *dc_site_name
,
3730 const char *client_site_name
)
3732 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3734 r_t
->ptr_dc_unc
= (dc_unc
!= NULL
);
3735 init_unistr2(&r_t
->uni_dc_unc
, dc_unc
, UNI_STR_TERMINATE
);
3737 r_t
->ptr_dc_address
= (dc_address
!= NULL
);
3738 init_unistr2(&r_t
->uni_dc_address
, dc_address
, UNI_STR_TERMINATE
);
3740 r_t
->dc_address_type
= dc_address_type
;
3741 r_t
->domain_guid
= domain_guid
;
3743 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3744 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3746 r_t
->ptr_forest_name
= (forest_name
!= NULL
);
3747 init_unistr2(&r_t
->uni_forest_name
, forest_name
, UNI_STR_TERMINATE
);
3749 r_t
->dc_flags
= dc_flags
;
3751 r_t
->ptr_dc_site_name
= (dc_site_name
!= NULL
);
3752 init_unistr2(&r_t
->uni_dc_site_name
, dc_site_name
, UNI_STR_TERMINATE
);
3754 r_t
->ptr_client_site_name
= (client_site_name
!= NULL
);
3755 init_unistr2(&r_t
->uni_client_site_name
, client_site_name
,
3759 /*******************************************************************
3760 Reads or writes an NET_R_DSR_GETDCNAME structure.
3761 ********************************************************************/
3763 bool net_io_r_dsr_getdcname(const char *desc
, NET_R_DSR_GETDCNAME
*r_t
,
3764 prs_struct
*ps
, int depth
)
3766 uint32 info_ptr
= 1;
3771 prs_debug(ps
, depth
, desc
, "net_io_r_dsr_getdcname");
3774 /* The reply contains *just* an info struct, this is the ptr to it */
3775 if (!prs_uint32("info_ptr", ps
, depth
, &info_ptr
))
3781 if (!prs_uint32("ptr_dc_unc", ps
, depth
, &r_t
->ptr_dc_unc
))
3784 if (!prs_uint32("ptr_dc_address", ps
, depth
, &r_t
->ptr_dc_address
))
3787 if (!prs_int32("dc_address_type", ps
, depth
, &r_t
->dc_address_type
))
3790 if (!smb_io_uuid("domain_guid", &r_t
->domain_guid
, ps
, depth
))
3793 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3796 if (!prs_uint32("ptr_forest_name", ps
, depth
, &r_t
->ptr_forest_name
))
3799 if (!prs_uint32("dc_flags", ps
, depth
, &r_t
->dc_flags
))
3802 if (!prs_uint32("ptr_dc_site_name", ps
, depth
, &r_t
->ptr_dc_site_name
))
3805 if (!prs_uint32("ptr_client_site_name", ps
, depth
,
3806 &r_t
->ptr_client_site_name
))
3812 if (!smb_io_unistr2("dc_unc", &r_t
->uni_dc_unc
,
3813 r_t
->ptr_dc_unc
, ps
, depth
))
3819 if (!smb_io_unistr2("dc_address", &r_t
->uni_dc_address
,
3820 r_t
->ptr_dc_address
, ps
, depth
))
3826 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3827 r_t
->ptr_domain_name
, ps
, depth
))
3833 if (!smb_io_unistr2("forest_name", &r_t
->uni_forest_name
,
3834 r_t
->ptr_forest_name
, ps
, depth
))
3840 if (!smb_io_unistr2("dc_site_name", &r_t
->uni_dc_site_name
,
3841 r_t
->ptr_dc_site_name
, ps
, depth
))
3847 if (!smb_io_unistr2("client_site_name", &r_t
->uni_client_site_name
,
3848 r_t
->ptr_client_site_name
, ps
, depth
))
3854 if (!prs_werror("result", ps
, depth
, &r_t
->result
))
3860 /*******************************************************************
3861 Inits a NET_Q_DSR_GETSITENAME structure.
3862 ********************************************************************/
3864 void init_net_q_dsr_getsitename(NET_Q_DSR_GETSITENAME
*r_t
, const char *computer_name
)
3866 DEBUG(5, ("init_net_q_dsr_getsitename\n"));
3868 r_t
->ptr_computer_name
= (computer_name
!= NULL
);
3869 init_unistr2(&r_t
->uni_computer_name
, computer_name
, UNI_STR_TERMINATE
);
3872 /*******************************************************************
3873 Reads or writes an NET_Q_DSR_GETSITENAME structure.
3874 ********************************************************************/
3876 bool net_io_q_dsr_getsitename(const char *desc
, NET_Q_DSR_GETSITENAME
*r_t
,
3877 prs_struct
*ps
, int depth
)
3882 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getsitename");
3885 if (!prs_uint32("ptr_computer_name", ps
, depth
, &r_t
->ptr_computer_name
))
3888 if (!smb_io_unistr2("computer_name", &r_t
->uni_computer_name
,
3889 r_t
->ptr_computer_name
, ps
, depth
))
3898 /*******************************************************************
3899 Reads or writes an NET_R_DSR_GETSITENAME structure.
3900 ********************************************************************/
3902 bool net_io_r_dsr_getsitename(const char *desc
, NET_R_DSR_GETSITENAME
*r_t
,
3903 prs_struct
*ps
, int depth
)
3908 prs_debug(ps
, depth
, desc
, "net_io_r_dsr_getsitename");
3911 if (!prs_uint32("ptr_site_name", ps
, depth
, &r_t
->ptr_site_name
))
3917 if (!smb_io_unistr2("site_name", &r_t
->uni_site_name
,
3918 r_t
->ptr_site_name
, ps
, depth
))
3924 if (!prs_werror("result", ps
, depth
, &r_t
->result
))