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 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #define DBGC_CLASS DBGC_RPC_PARSE
29 /*******************************************************************
30 Reads or writes a structure.
31 ********************************************************************/
33 static BOOL
net_io_neg_flags(const char *desc
, NEG_FLAGS
*neg
, prs_struct
*ps
, int depth
)
38 prs_debug(ps
, depth
, desc
, "net_io_neg_flags");
44 if(!prs_uint32("neg_flags", ps
, depth
, &neg
->neg_flags
))
50 /*******************************************************************
51 Inits a NETLOGON_INFO_3 structure.
52 ********************************************************************/
54 static void init_netinfo_3(NETLOGON_INFO_3
*info
, uint32 flags
, uint32 logon_attempts
)
57 info
->logon_attempts
= logon_attempts
;
58 info
->reserved_1
= 0x0;
59 info
->reserved_2
= 0x0;
60 info
->reserved_3
= 0x0;
61 info
->reserved_4
= 0x0;
62 info
->reserved_5
= 0x0;
65 /*******************************************************************
66 Reads or writes a NETLOGON_INFO_3 structure.
67 ********************************************************************/
69 static BOOL
net_io_netinfo_3(const char *desc
, NETLOGON_INFO_3
*info
, prs_struct
*ps
, int depth
)
74 prs_debug(ps
, depth
, desc
, "net_io_netinfo_3");
80 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
82 if(!prs_uint32("logon_attempts", ps
, depth
, &info
->logon_attempts
))
84 if(!prs_uint32("reserved_1 ", ps
, depth
, &info
->reserved_1
))
86 if(!prs_uint32("reserved_2 ", ps
, depth
, &info
->reserved_2
))
88 if(!prs_uint32("reserved_3 ", ps
, depth
, &info
->reserved_3
))
90 if(!prs_uint32("reserved_4 ", ps
, depth
, &info
->reserved_4
))
92 if(!prs_uint32("reserved_5 ", ps
, depth
, &info
->reserved_5
))
99 /*******************************************************************
100 Inits a NETLOGON_INFO_1 structure.
101 ********************************************************************/
103 static void init_netinfo_1(NETLOGON_INFO_1
*info
, uint32 flags
, uint32 pdc_status
)
106 info
->pdc_status
= pdc_status
;
109 /*******************************************************************
110 Reads or writes a NETLOGON_INFO_1 structure.
111 ********************************************************************/
113 static BOOL
net_io_netinfo_1(const char *desc
, NETLOGON_INFO_1
*info
, prs_struct
*ps
, int depth
)
118 prs_debug(ps
, depth
, desc
, "net_io_netinfo_1");
124 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
126 if(!prs_uint32("pdc_status", ps
, depth
, &info
->pdc_status
))
132 /*******************************************************************
133 Inits a NETLOGON_INFO_2 structure.
134 ********************************************************************/
136 static void init_netinfo_2(NETLOGON_INFO_2
*info
, uint32 flags
, uint32 pdc_status
,
137 uint32 tc_status
, const char *trusted_dc_name
)
140 info
->pdc_status
= pdc_status
;
141 info
->ptr_trusted_dc_name
= 1;
142 info
->tc_status
= tc_status
;
144 if (trusted_dc_name
!= NULL
)
145 init_unistr2(&info
->uni_trusted_dc_name
, trusted_dc_name
, UNI_STR_TERMINATE
);
147 init_unistr2(&info
->uni_trusted_dc_name
, "", UNI_STR_TERMINATE
);
150 /*******************************************************************
151 Reads or writes a NETLOGON_INFO_2 structure.
152 ********************************************************************/
154 static BOOL
net_io_netinfo_2(const char *desc
, NETLOGON_INFO_2
*info
, prs_struct
*ps
, int depth
)
159 prs_debug(ps
, depth
, desc
, "net_io_netinfo_2");
165 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
167 if(!prs_uint32("pdc_status ", ps
, depth
, &info
->pdc_status
))
169 if(!prs_uint32("ptr_trusted_dc_name", ps
, depth
, &info
->ptr_trusted_dc_name
))
171 if(!prs_uint32("tc_status ", ps
, depth
, &info
->tc_status
))
174 if (info
->ptr_trusted_dc_name
!= 0) {
175 if(!smb_io_unistr2("unistr2", &info
->uni_trusted_dc_name
, info
->ptr_trusted_dc_name
, ps
, depth
))
185 static BOOL
net_io_ctrl_data_info_5(const char *desc
, CTRL_DATA_INFO_5
*info
, prs_struct
*ps
, int depth
)
190 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_5");
193 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
196 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
199 if ( info
->ptr_domain
) {
200 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
207 static BOOL
net_io_ctrl_data_info_6(const char *desc
, CTRL_DATA_INFO_6
*info
, prs_struct
*ps
, int depth
)
212 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_6");
215 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
218 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
221 if ( info
->ptr_domain
) {
222 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
229 /*******************************************************************
230 Reads or writes an NET_Q_LOGON_CTRL2 structure.
231 ********************************************************************/
233 BOOL
net_io_q_logon_ctrl2(const char *desc
, NET_Q_LOGON_CTRL2
*q_l
, prs_struct
*ps
, int depth
)
238 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl2");
244 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
247 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
253 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
255 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
257 switch ( q_l
->function_code
) {
258 case NETLOGON_CONTROL_REDISCOVER
:
259 if ( !net_io_ctrl_data_info_5( "ctrl_data_info5", &q_l
->info
.info5
, ps
, depth
) )
263 case NETLOGON_CONTROL_TC_QUERY
:
264 if ( !net_io_ctrl_data_info_6( "ctrl_data_info6", &q_l
->info
.info6
, ps
, depth
) )
269 DEBUG(0,("net_io_q_logon_ctrl2: unknown function_code [%d]\n",
270 q_l
->function_code
));
277 /*******************************************************************
278 Inits an NET_Q_LOGON_CTRL2 structure.
279 ********************************************************************/
281 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2
*q_l
, const char *srv_name
,
284 DEBUG(5,("init_q_logon_ctrl2\n"));
286 q_l
->function_code
= 0x01;
287 q_l
->query_level
= query_level
;
289 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
292 /*******************************************************************
293 Inits an NET_R_LOGON_CTRL2 structure.
294 ********************************************************************/
296 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2
*r_l
, uint32 query_level
,
297 uint32 flags
, uint32 pdc_status
,
298 uint32 logon_attempts
, uint32 tc_status
,
299 const char *trusted_domain_name
)
301 r_l
->switch_value
= query_level
;
303 switch (query_level
) {
305 r_l
->ptr
= 1; /* undocumented pointer */
306 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
307 r_l
->status
= NT_STATUS_OK
;
310 r_l
->ptr
= 1; /* undocumented pointer */
311 init_netinfo_2(&r_l
->logon
.info2
, flags
, pdc_status
,
312 tc_status
, trusted_domain_name
);
313 r_l
->status
= NT_STATUS_OK
;
316 r_l
->ptr
= 1; /* undocumented pointer */
317 init_netinfo_3(&r_l
->logon
.info3
, flags
, logon_attempts
);
318 r_l
->status
= NT_STATUS_OK
;
321 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
323 r_l
->ptr
= 0; /* undocumented pointer */
325 /* take a guess at an error code... */
326 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
331 /*******************************************************************
332 Reads or writes an NET_R_LOGON_CTRL2 structure.
333 ********************************************************************/
335 BOOL
net_io_r_logon_ctrl2(const char *desc
, NET_R_LOGON_CTRL2
*r_l
, prs_struct
*ps
, int depth
)
340 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl2");
343 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
345 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
349 switch (r_l
->switch_value
) {
351 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
355 if(!net_io_netinfo_2("", &r_l
->logon
.info2
, ps
, depth
))
359 if(!net_io_netinfo_3("", &r_l
->logon
.info3
, ps
, depth
))
363 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
369 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
375 /*******************************************************************
376 Reads or writes an NET_Q_LOGON_CTRL structure.
377 ********************************************************************/
379 BOOL
net_io_q_logon_ctrl(const char *desc
, NET_Q_LOGON_CTRL
*q_l
, prs_struct
*ps
,
382 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl");
388 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
391 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
397 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
399 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
405 /*******************************************************************
406 Inits an NET_Q_LOGON_CTRL structure.
407 ********************************************************************/
409 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL
*q_l
, const char *srv_name
,
412 DEBUG(5,("init_q_logon_ctrl\n"));
414 q_l
->function_code
= 0x01; /* ??? */
415 q_l
->query_level
= query_level
;
417 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
420 /*******************************************************************
421 Inits an NET_R_LOGON_CTRL structure.
422 ********************************************************************/
424 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL
*r_l
, uint32 query_level
,
425 uint32 flags
, uint32 pdc_status
)
427 DEBUG(5,("init_r_logon_ctrl\n"));
429 r_l
->switch_value
= query_level
; /* should only be 0x1 */
431 switch (query_level
) {
433 r_l
->ptr
= 1; /* undocumented pointer */
434 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
435 r_l
->status
= NT_STATUS_OK
;
438 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
440 r_l
->ptr
= 0; /* undocumented pointer */
442 /* take a guess at an error code... */
443 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
448 /*******************************************************************
449 Reads or writes an NET_R_LOGON_CTRL structure.
450 ********************************************************************/
452 BOOL
net_io_r_logon_ctrl(const char *desc
, NET_R_LOGON_CTRL
*r_l
, prs_struct
*ps
,
455 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl");
458 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
460 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
464 switch (r_l
->switch_value
) {
466 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
470 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
476 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
482 /*******************************************************************
483 Inits an NET_R_GETANYDCNAME structure.
484 ********************************************************************/
485 void init_net_q_getanydcname(NET_Q_GETANYDCNAME
*r_t
, const char *logon_server
,
486 const char *domainname
)
488 DEBUG(5,("init_q_getanydcname\n"));
490 r_t
->ptr_logon_server
= (logon_server
!= NULL
);
491 init_unistr2(&r_t
->uni_logon_server
, logon_server
, UNI_STR_TERMINATE
);
492 r_t
->ptr_domainname
= (domainname
!= NULL
);
493 init_unistr2(&r_t
->uni_domainname
, domainname
, UNI_STR_TERMINATE
);
496 /*******************************************************************
497 Reads or writes an NET_Q_GETANYDCNAME structure.
498 ********************************************************************/
500 BOOL
net_io_q_getanydcname(const char *desc
, NET_Q_GETANYDCNAME
*r_t
, prs_struct
*ps
,
506 prs_debug(ps
, depth
, desc
, "net_io_q_getanydcname");
509 if (!prs_uint32("ptr_logon_server", ps
, depth
, &r_t
->ptr_logon_server
))
512 if (!smb_io_unistr2("logon_server", &r_t
->uni_logon_server
,
513 r_t
->ptr_logon_server
, ps
, depth
))
519 if (!prs_uint32("ptr_domainname", ps
, depth
, &r_t
->ptr_domainname
))
522 if (!smb_io_unistr2("domainname", &r_t
->uni_domainname
,
523 r_t
->ptr_domainname
, ps
, depth
))
530 /*******************************************************************
531 Inits an NET_R_GETANYDCNAME structure.
532 ********************************************************************/
533 void init_net_r_getanydcname(NET_R_GETANYDCNAME
*r_t
, const char *dcname
)
535 DEBUG(5,("init_r_getanydcname\n"));
537 init_unistr2(&r_t
->uni_dcname
, dcname
, UNI_STR_TERMINATE
);
540 /*******************************************************************
541 Reads or writes an NET_R_GETANYDCNAME structure.
542 ********************************************************************/
544 BOOL
net_io_r_getanydcname(const char *desc
, NET_R_GETANYDCNAME
*r_t
, prs_struct
*ps
,
550 prs_debug(ps
, depth
, desc
, "net_io_r_getanydcname");
553 if (!prs_uint32("ptr_dcname", ps
, depth
, &r_t
->ptr_dcname
))
556 if (!smb_io_unistr2("dcname", &r_t
->uni_dcname
,
557 r_t
->ptr_dcname
, ps
, depth
))
563 if (!prs_werror("status", ps
, depth
, &r_t
->status
))
569 /*******************************************************************
570 Inits an NET_R_TRUST_DOM_LIST structure.
571 ********************************************************************/
573 void init_r_trust_dom(NET_R_TRUST_DOM_LIST
*r_t
,
574 uint32 num_doms
, const char *dom_name
)
578 DEBUG(5,("init_r_trust_dom\n"));
580 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
581 r_t
->uni_trust_dom_name
[i
].uni_str_len
= 0;
582 r_t
->uni_trust_dom_name
[i
].uni_max_len
= 0;
584 if (num_doms
> MAX_TRUST_DOMS
)
585 num_doms
= MAX_TRUST_DOMS
;
587 for (i
= 0; i
< num_doms
; i
++) {
589 fstrcpy(domain_name
, dom_name
);
590 strupper_m(domain_name
);
591 init_unistr2(&r_t
->uni_trust_dom_name
[i
], domain_name
, UNI_STR_TERMINATE
);
592 /* the use of UNISTR2 here is non-standard. */
593 r_t
->uni_trust_dom_name
[i
].offset
= 0x1;
596 r_t
->status
= NT_STATUS_OK
;
599 /*******************************************************************
600 Reads or writes an NET_R_TRUST_DOM_LIST structure.
601 ********************************************************************/
603 BOOL
net_io_r_trust_dom(const char *desc
, NET_R_TRUST_DOM_LIST
*r_t
, prs_struct
*ps
, int depth
)
610 prs_debug(ps
, depth
, desc
, "net_io_r_trust_dom");
613 /* temporary code to give a valid response */
615 if(!prs_uint32("status", ps
, depth
, &value
))
619 if(!prs_uint32("status", ps
, depth
, &value
))
622 if(!prs_uint32("status", ps
, depth
, &value
))
626 if(!prs_uint32("status", ps
, depth
, &value
))
630 if(!prs_uint32("status", ps
, depth
, &value
))
633 /* old non working code */
637 for (i
= 0; i
< MAX_TRUST_DOMS
; i
++) {
638 if (r_t
->uni_trust_dom_name
[i
].uni_str_len
== 0)
640 if(!smb_io_unistr2("", &r_t
->uni_trust_dom_name
[i
], True
, ps
, depth
))
644 if(!prs_ntstatus("status", ps
, depth
, &r_t
->status
))
651 /*******************************************************************
652 Reads or writes an NET_Q_TRUST_DOM_LIST structure.
653 ********************************************************************/
655 BOOL
net_io_q_trust_dom(const char *desc
, NET_Q_TRUST_DOM_LIST
*q_l
, prs_struct
*ps
, int depth
)
660 prs_debug(ps
, depth
, desc
, "net_io_q_trust_dom");
663 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
665 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
671 /*******************************************************************
672 Inits an NET_Q_REQ_CHAL structure.
673 ********************************************************************/
675 void init_q_req_chal(NET_Q_REQ_CHAL
*q_c
,
676 const char *logon_srv
, const char *logon_clnt
,
677 const DOM_CHAL
*clnt_chal
)
679 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
681 q_c
->undoc_buffer
= 1; /* don't know what this buffer is */
683 init_unistr2(&q_c
->uni_logon_srv
, logon_srv
, UNI_STR_TERMINATE
);
684 init_unistr2(&q_c
->uni_logon_clnt
, logon_clnt
, UNI_STR_TERMINATE
);
686 memcpy(q_c
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
688 DEBUG(5,("init_q_req_chal: %d\n", __LINE__
));
691 /*******************************************************************
692 Reads or writes an NET_Q_REQ_CHAL structure.
693 ********************************************************************/
695 BOOL
net_io_q_req_chal(const char *desc
, NET_Q_REQ_CHAL
*q_c
, prs_struct
*ps
, int depth
)
700 prs_debug(ps
, depth
, desc
, "net_io_q_req_chal");
706 if(!prs_uint32("undoc_buffer", ps
, depth
, &q_c
->undoc_buffer
))
709 if(!smb_io_unistr2("", &q_c
->uni_logon_srv
, True
, ps
, depth
)) /* logon server unicode string */
711 if(!smb_io_unistr2("", &q_c
->uni_logon_clnt
, True
, ps
, depth
)) /* logon client unicode string */
714 if(!smb_io_chal("", &q_c
->clnt_chal
, ps
, depth
))
720 /*******************************************************************
721 Reads or writes a structure.
722 ********************************************************************/
724 BOOL
net_io_r_req_chal(const char *desc
, NET_R_REQ_CHAL
*r_c
, prs_struct
*ps
, int depth
)
729 prs_debug(ps
, depth
, desc
, "net_io_r_req_chal");
735 if(!smb_io_chal("", &r_c
->srv_chal
, ps
, depth
)) /* server challenge */
738 if(!prs_ntstatus("status", ps
, depth
, &r_c
->status
))
745 /*******************************************************************
746 Reads or writes a structure.
747 ********************************************************************/
749 BOOL
net_io_q_auth(const char *desc
, NET_Q_AUTH
*q_a
, prs_struct
*ps
, int depth
)
754 prs_debug(ps
, depth
, desc
, "net_io_q_auth");
760 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
762 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
768 /*******************************************************************
769 Reads or writes a structure.
770 ********************************************************************/
772 BOOL
net_io_r_auth(const char *desc
, NET_R_AUTH
*r_a
, prs_struct
*ps
, int depth
)
777 prs_debug(ps
, depth
, desc
, "net_io_r_auth");
783 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
786 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
792 /*******************************************************************
793 Inits a NET_Q_AUTH_2 struct.
794 ********************************************************************/
796 void init_q_auth_2(NET_Q_AUTH_2
*q_a
,
797 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
798 const DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
800 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
802 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
803 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
804 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
806 DEBUG(5,("init_q_auth_2: %d\n", __LINE__
));
809 /*******************************************************************
810 Reads or writes a structure.
811 ********************************************************************/
813 BOOL
net_io_q_auth_2(const char *desc
, NET_Q_AUTH_2
*q_a
, prs_struct
*ps
, int depth
)
818 prs_debug(ps
, depth
, desc
, "net_io_q_auth_2");
824 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
826 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
828 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
834 /*******************************************************************
835 Reads or writes a structure.
836 ********************************************************************/
838 BOOL
net_io_r_auth_2(const char *desc
, NET_R_AUTH_2
*r_a
, prs_struct
*ps
, int depth
)
843 prs_debug(ps
, depth
, desc
, "net_io_r_auth_2");
849 if(!smb_io_chal("", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
851 if(!net_io_neg_flags("", &r_a
->srv_flgs
, ps
, depth
))
854 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
860 /*******************************************************************
861 Inits a NET_Q_AUTH_3 struct.
862 ********************************************************************/
864 void init_q_auth_3(NET_Q_AUTH_3
*q_a
,
865 const char *logon_srv
, const char *acct_name
, uint16 sec_chan
, const char *comp_name
,
866 const DOM_CHAL
*clnt_chal
, uint32 clnt_flgs
)
868 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
870 init_log_info(&q_a
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
);
871 memcpy(q_a
->clnt_chal
.data
, clnt_chal
->data
, sizeof(clnt_chal
->data
));
872 q_a
->clnt_flgs
.neg_flags
= clnt_flgs
;
874 DEBUG(5,("init_q_auth_3: %d\n", __LINE__
));
877 /*******************************************************************
878 Reads or writes a structure.
879 ********************************************************************/
881 BOOL
net_io_q_auth_3(const char *desc
, NET_Q_AUTH_3
*q_a
, prs_struct
*ps
, int depth
)
886 prs_debug(ps
, depth
, desc
, "net_io_q_auth_3");
892 if(!smb_io_log_info ("", &q_a
->clnt_id
, ps
, depth
)) /* client identification info */
894 if(!smb_io_chal("", &q_a
->clnt_chal
, ps
, depth
))
896 if(!net_io_neg_flags("", &q_a
->clnt_flgs
, ps
, depth
))
902 /*******************************************************************
903 Reads or writes a structure.
904 ********************************************************************/
906 BOOL
net_io_r_auth_3(const char *desc
, NET_R_AUTH_3
*r_a
, prs_struct
*ps
, int depth
)
911 prs_debug(ps
, depth
, desc
, "net_io_r_auth_3");
917 if(!smb_io_chal("srv_chal", &r_a
->srv_chal
, ps
, depth
)) /* server challenge */
919 if(!net_io_neg_flags("srv_flgs", &r_a
->srv_flgs
, ps
, depth
))
921 if (!prs_uint32("unknown", ps
, depth
, &r_a
->unknown
))
924 if(!prs_ntstatus("status", ps
, depth
, &r_a
->status
))
931 /*******************************************************************
932 Inits a NET_Q_SRV_PWSET.
933 ********************************************************************/
935 void init_q_srv_pwset(NET_Q_SRV_PWSET
*q_s
,
936 const char *logon_srv
, const char *sess_key
, const char *acct_name
,
937 uint16 sec_chan
, const char *comp_name
,
938 DOM_CRED
*cred
, const uchar hashed_mach_pwd
[16])
940 unsigned char nt_cypher
[16];
942 DEBUG(5,("init_q_srv_pwset\n"));
944 /* Process the new password. */
945 cred_hash3( nt_cypher
, hashed_mach_pwd
, (const unsigned char *)sess_key
, 1);
947 init_clnt_info(&q_s
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
, cred
);
949 memcpy(q_s
->pwd
, nt_cypher
, sizeof(q_s
->pwd
));
952 /*******************************************************************
953 Reads or writes a structure.
954 ********************************************************************/
956 BOOL
net_io_q_srv_pwset(const char *desc
, NET_Q_SRV_PWSET
*q_s
, prs_struct
*ps
, int depth
)
961 prs_debug(ps
, depth
, desc
, "net_io_q_srv_pwset");
967 if(!smb_io_clnt_info("", &q_s
->clnt_id
, ps
, depth
)) /* client identification/authentication info */
969 if(!prs_uint8s (False
, "pwd", ps
, depth
, q_s
->pwd
, 16)) /* new password - undocumented */
975 /*******************************************************************
976 Reads or writes a structure.
977 ********************************************************************/
979 BOOL
net_io_r_srv_pwset(const char *desc
, NET_R_SRV_PWSET
*r_s
, prs_struct
*ps
, int depth
)
984 prs_debug(ps
, depth
, desc
, "net_io_r_srv_pwset");
990 if(!smb_io_cred("", &r_s
->srv_cred
, ps
, depth
)) /* server challenge */
993 if(!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
999 /*******************************************************************
1000 Inits a NET_Q_SRV_PWSET2.
1001 ********************************************************************/
1003 void init_q_srv_pwset2(NET_Q_SRV_PWSET2
*q_s
,
1004 const char *logon_srv
,
1005 const char *sess_key
,
1006 const char *acct_name
,
1008 const char *comp_name
,
1010 const char *clear_text_mach_pwd
)
1012 uint8_t password_buf
[516];
1013 NET_CRYPT_PWD new_password
;
1015 DEBUG(5,("init_q_srv_pwset2\n"));
1017 /* Process the new password. */
1019 encode_pw_buffer(password_buf
, clear_text_mach_pwd
, STR_UNICODE
);
1021 SamOEMhash(password_buf
, (const unsigned char *)sess_key
, 516);
1022 memcpy(new_password
.data
, password_buf
, 512);
1023 new_password
.length
= IVAL(password_buf
, 512);
1025 init_clnt_info(&q_s
->clnt_id
, logon_srv
, acct_name
, sec_chan
, comp_name
, cred
);
1027 memcpy(&q_s
->pwd
, &new_password
, sizeof(q_s
->pwd
));
1030 /*******************************************************************
1031 Reads or writes a structure.
1032 ********************************************************************/
1034 BOOL
net_io_q_srv_pwset2(const char *desc
, NET_Q_SRV_PWSET2
*q_s
, prs_struct
*ps
, int depth
)
1039 prs_debug(ps
, depth
, desc
, "net_io_q_srv_pwset2");
1045 if(!smb_io_clnt_info("", &q_s
->clnt_id
, ps
, depth
)) /* client identification/authentication info */
1047 if(!prs_uint8s(False
, "pwd.data", ps
, depth
, q_s
->pwd
.data
, 512)) /* new password - undocumented */
1049 if(!prs_uint32("pwd.length", ps
, depth
, &q_s
->pwd
.length
)) /* new password - undocumented */
1055 /*******************************************************************
1056 Reads or writes a structure.
1057 ********************************************************************/
1059 BOOL
net_io_r_srv_pwset2(const char *desc
, NET_R_SRV_PWSET2
*r_s
, prs_struct
*ps
, int depth
)
1064 prs_debug(ps
, depth
, desc
, "net_io_r_srv_pwset2");
1070 if(!smb_io_cred("", &r_s
->srv_cred
, ps
, depth
)) /* server challenge */
1073 if(!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
1079 /*************************************************************************
1080 Init DOM_SID2 array from a string containing multiple sids
1081 *************************************************************************/
1083 static int init_dom_sid2s(TALLOC_CTX
*ctx
, const char *sids_str
, DOM_SID2
**ppsids
)
1089 DEBUG(4,("init_dom_sid2s: %s\n", sids_str
? sids_str
:""));
1097 /* Count the number of valid SIDs. */
1098 for (count
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
1100 if (string_to_sid(&tmpsid
, s2
))
1104 /* Now allocate space for them. */
1106 *ppsids
= TALLOC_ZERO_ARRAY(ctx
, DOM_SID2
, count
);
1107 if (*ppsids
== NULL
)
1115 for (number
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
1117 if (string_to_sid(&tmpsid
, s2
)) {
1118 /* count only valid sids */
1119 init_dom_sid2(&sids
[number
], &tmpsid
);
1128 /*******************************************************************
1129 Inits a NET_ID_INFO_1 structure.
1130 ********************************************************************/
1132 void init_id_info1(NET_ID_INFO_1
*id
, const char *domain_name
,
1133 uint32 param_ctrl
, uint32 log_id_low
, uint32 log_id_high
,
1134 const char *user_name
, const char *wksta_name
,
1135 const char *sess_key
,
1136 unsigned char lm_cypher
[16], unsigned char nt_cypher
[16])
1138 unsigned char lm_owf
[16];
1139 unsigned char nt_owf
[16];
1141 DEBUG(5,("init_id_info1: %d\n", __LINE__
));
1143 id
->ptr_id_info1
= 1;
1145 id
->param_ctrl
= param_ctrl
;
1146 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1149 if (lm_cypher
&& nt_cypher
) {
1150 unsigned char key
[16];
1151 #ifdef DEBUG_PASSWORD
1152 DEBUG(100,("lm cypher:"));
1153 dump_data(100, (char *)lm_cypher
, 16);
1155 DEBUG(100,("nt cypher:"));
1156 dump_data(100, (char *)nt_cypher
, 16);
1160 memcpy(key
, sess_key
, 8);
1162 memcpy(lm_owf
, lm_cypher
, 16);
1163 SamOEMhash(lm_owf
, key
, 16);
1164 memcpy(nt_owf
, nt_cypher
, 16);
1165 SamOEMhash(nt_owf
, key
, 16);
1167 #ifdef DEBUG_PASSWORD
1168 DEBUG(100,("encrypt of lm owf password:"));
1169 dump_data(100, (char *)lm_owf
, 16);
1171 DEBUG(100,("encrypt of nt owf password:"));
1172 dump_data(100, (char *)nt_owf
, 16);
1174 /* set up pointers to cypher blocks */
1179 init_owf_info(&id
->lm_owf
, lm_cypher
);
1180 init_owf_info(&id
->nt_owf
, nt_cypher
);
1182 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1183 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1184 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1185 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1186 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1187 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1190 /*******************************************************************
1191 Reads or writes an NET_ID_INFO_1 structure.
1192 ********************************************************************/
1194 static BOOL
net_io_id_info1(const char *desc
, NET_ID_INFO_1
*id
, prs_struct
*ps
, int depth
)
1199 prs_debug(ps
, depth
, desc
, "net_io_id_info1");
1205 if(!prs_uint32("ptr_id_info1", ps
, depth
, &id
->ptr_id_info1
))
1208 if (id
->ptr_id_info1
!= 0) {
1209 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1212 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1214 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1217 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1219 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1222 if(!smb_io_owf_info("", &id
->lm_owf
, ps
, depth
))
1224 if(!smb_io_owf_info("", &id
->nt_owf
, ps
, depth
))
1227 if(!smb_io_unistr2("unistr2", &id
->uni_domain_name
,
1228 id
->hdr_domain_name
.buffer
, ps
, depth
))
1230 if(!smb_io_unistr2("unistr2", &id
->uni_user_name
,
1231 id
->hdr_user_name
.buffer
, ps
, depth
))
1233 if(!smb_io_unistr2("unistr2", &id
->uni_wksta_name
,
1234 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1241 /*******************************************************************
1242 Inits a NET_ID_INFO_2 structure.
1244 This is a network logon packet. The log_id parameters
1245 are what an NT server would generate for LUID once the
1246 user is logged on. I don't think we care about them.
1248 Note that this has no access to the NT and LM hashed passwords,
1249 so it forwards the challenge, and the NT and LM responses (24
1250 bytes each) over the secure channel to the Domain controller
1251 for it to say yea or nay. This is the preferred method of
1252 checking for a logon as it doesn't export the password
1253 hashes to anyone who has compromised the secure channel. JRA.
1254 ********************************************************************/
1256 void init_id_info2(NET_ID_INFO_2
* id
, const char *domain_name
,
1258 uint32 log_id_low
, uint32 log_id_high
,
1259 const char *user_name
, const char *wksta_name
,
1260 const uchar lm_challenge
[8],
1261 const uchar
* lm_chal_resp
, size_t lm_chal_resp_len
,
1262 const uchar
* nt_chal_resp
, size_t nt_chal_resp_len
)
1265 DEBUG(5,("init_id_info2: %d\n", __LINE__
));
1267 id
->ptr_id_info2
= 1;
1269 id
->param_ctrl
= param_ctrl
;
1270 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1272 memcpy(id
->lm_chal
, lm_challenge
, sizeof(id
->lm_chal
));
1273 init_str_hdr(&id
->hdr_nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
, (nt_chal_resp
!= NULL
) ? 1 : 0);
1274 init_str_hdr(&id
->hdr_lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
, (lm_chal_resp
!= NULL
) ? 1 : 0);
1276 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1277 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1278 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1279 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1280 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1281 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1283 init_string2(&id
->nt_chal_resp
, (const char *)nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
);
1284 init_string2(&id
->lm_chal_resp
, (const char *)lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
);
1288 /*******************************************************************
1289 Reads or writes an NET_ID_INFO_2 structure.
1290 ********************************************************************/
1292 static BOOL
net_io_id_info2(const char *desc
, NET_ID_INFO_2
*id
, prs_struct
*ps
, int depth
)
1297 prs_debug(ps
, depth
, desc
, "net_io_id_info2");
1303 if(!prs_uint32("ptr_id_info2", ps
, depth
, &id
->ptr_id_info2
))
1306 if (id
->ptr_id_info2
!= 0) {
1307 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1310 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1312 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1315 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1317 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1320 if(!prs_uint8s (False
, "lm_chal", ps
, depth
, id
->lm_chal
, 8)) /* lm 8 byte challenge */
1323 if(!smb_io_strhdr("hdr_nt_chal_resp", &id
->hdr_nt_chal_resp
, ps
, depth
))
1325 if(!smb_io_strhdr("hdr_lm_chal_resp", &id
->hdr_lm_chal_resp
, ps
, depth
))
1328 if(!smb_io_unistr2("uni_domain_name", &id
->uni_domain_name
,
1329 id
->hdr_domain_name
.buffer
, ps
, depth
))
1331 if(!smb_io_unistr2("uni_user_name ", &id
->uni_user_name
,
1332 id
->hdr_user_name
.buffer
, ps
, depth
))
1334 if(!smb_io_unistr2("uni_wksta_name ", &id
->uni_wksta_name
,
1335 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1337 if(!smb_io_string2("nt_chal_resp", &id
->nt_chal_resp
,
1338 id
->hdr_nt_chal_resp
.buffer
, ps
, depth
))
1340 if(!smb_io_string2("lm_chal_resp", &id
->lm_chal_resp
,
1341 id
->hdr_lm_chal_resp
.buffer
, ps
, depth
))
1349 /*******************************************************************
1350 Inits a DOM_SAM_INFO structure.
1351 ********************************************************************/
1353 void init_sam_info(DOM_SAM_INFO
*sam
,
1354 const char *logon_srv
, const char *comp_name
,
1355 DOM_CRED
*clnt_cred
,
1356 DOM_CRED
*rtn_cred
, uint16 logon_level
,
1357 NET_ID_INFO_CTR
*ctr
)
1359 DEBUG(5,("init_sam_info: %d\n", __LINE__
));
1361 init_clnt_info2(&sam
->client
, logon_srv
, comp_name
, clnt_cred
);
1363 if (rtn_cred
!= NULL
) {
1364 sam
->ptr_rtn_cred
= 1;
1365 memcpy(&sam
->rtn_cred
, rtn_cred
, sizeof(sam
->rtn_cred
));
1367 sam
->ptr_rtn_cred
= 0;
1370 sam
->logon_level
= logon_level
;
1374 /*******************************************************************
1375 Reads or writes a DOM_SAM_INFO structure.
1376 ********************************************************************/
1378 static BOOL
net_io_id_info_ctr(const char *desc
, NET_ID_INFO_CTR
**pp_ctr
, prs_struct
*ps
, int depth
)
1380 NET_ID_INFO_CTR
*ctr
= *pp_ctr
;
1382 prs_debug(ps
, depth
, desc
, "smb_io_sam_info_ctr");
1385 if (UNMARSHALLING(ps
)) {
1386 ctr
= *pp_ctr
= PRS_ALLOC_MEM(ps
, NET_ID_INFO_CTR
, 1);
1394 /* don't 4-byte align here! */
1396 if(!prs_uint16("switch_value ", ps
, depth
, &ctr
->switch_value
))
1399 switch (ctr
->switch_value
) {
1401 if(!net_io_id_info1("", &ctr
->auth
.id1
, ps
, depth
))
1405 if(!net_io_id_info2("", &ctr
->auth
.id2
, ps
, depth
))
1410 DEBUG(4,("smb_io_sam_info_ctr: unknown switch_value!\n"));
1417 /*******************************************************************
1418 Reads or writes a DOM_SAM_INFO structure.
1419 ********************************************************************/
1421 static BOOL
smb_io_sam_info(const char *desc
, DOM_SAM_INFO
*sam
, prs_struct
*ps
, int depth
)
1426 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1432 if(!smb_io_clnt_info2("", &sam
->client
, ps
, depth
))
1435 if(!prs_uint32("ptr_rtn_cred ", ps
, depth
, &sam
->ptr_rtn_cred
))
1437 if (sam
->ptr_rtn_cred
) {
1438 if(!smb_io_cred("", &sam
->rtn_cred
, ps
, depth
))
1442 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1445 if (sam
->logon_level
!= 0) {
1446 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1453 /*******************************************************************
1454 Reads or writes a DOM_SAM_INFO_EX structure.
1455 ********************************************************************/
1457 static BOOL
smb_io_sam_info_ex(const char *desc
, DOM_SAM_INFO_EX
*sam
, prs_struct
*ps
, int depth
)
1462 prs_debug(ps
, depth
, desc
, "smb_io_sam_info_ex");
1468 if(!smb_io_clnt_srv("", &sam
->client
, ps
, depth
))
1471 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1474 if (sam
->logon_level
!= 0) {
1475 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1482 /*************************************************************************
1483 Inits a NET_USER_INFO_3 structure.
1485 This is a network logon reply packet, and contains much information about
1486 the user. This information is passed as a (very long) paramater list
1487 to avoid having to link in the PASSDB code to every program that deals
1489 *************************************************************************/
1491 void init_net_user_info3(TALLOC_CTX
*ctx
, NET_USER_INFO_3
*usr
,
1495 const char* user_name
,
1496 const char* full_name
,
1497 const char* home_dir
,
1498 const char* dir_drive
,
1499 const char* logon_script
,
1500 const char* profile_path
,
1502 time_t unix_logon_time
,
1503 time_t unix_logoff_time
,
1504 time_t unix_kickoff_time
,
1505 time_t unix_pass_last_set_time
,
1506 time_t unix_pass_can_change_time
,
1507 time_t unix_pass_must_change_time
,
1509 uint16 logon_count
, uint16 bad_pw_count
,
1510 uint32 num_groups
, const DOM_GID
*gids
,
1511 uint32 user_flgs
, uint32 acct_flags
,
1512 uchar user_session_key
[16],
1513 uchar lm_session_key
[8],
1514 const char *logon_srv
, const char *logon_dom
,
1515 const DOM_SID
*dom_sid
)
1517 /* only cope with one "other" sid, right now. */
1518 /* need to count the number of space-delimited sids */
1520 int num_other_sids
= 0;
1522 NTTIME logon_time
, logoff_time
, kickoff_time
,
1523 pass_last_set_time
, pass_can_change_time
,
1524 pass_must_change_time
;
1528 usr
->ptr_user_info
= 1; /* yes, we're bothering to put USER_INFO data here */
1530 /* Create NTTIME structs */
1531 unix_to_nt_time (&logon_time
, unix_logon_time
);
1532 unix_to_nt_time (&logoff_time
, unix_logoff_time
);
1533 unix_to_nt_time (&kickoff_time
, unix_kickoff_time
);
1534 unix_to_nt_time (&pass_last_set_time
, unix_pass_last_set_time
);
1535 unix_to_nt_time (&pass_can_change_time
, unix_pass_can_change_time
);
1536 unix_to_nt_time (&pass_must_change_time
, unix_pass_must_change_time
);
1538 usr
->logon_time
= logon_time
;
1539 usr
->logoff_time
= logoff_time
;
1540 usr
->kickoff_time
= kickoff_time
;
1541 usr
->pass_last_set_time
= pass_last_set_time
;
1542 usr
->pass_can_change_time
= pass_can_change_time
;
1543 usr
->pass_must_change_time
= pass_must_change_time
;
1545 usr
->logon_count
= logon_count
;
1546 usr
->bad_pw_count
= bad_pw_count
;
1548 usr
->user_rid
= user_rid
;
1549 usr
->group_rid
= group_rid
;
1550 usr
->num_groups
= num_groups
;
1552 usr
->buffer_groups
= 1; /* indicates fill in groups, below, even if there are none */
1553 usr
->user_flgs
= user_flgs
;
1554 usr
->acct_flags
= acct_flags
;
1556 if (user_session_key
!= NULL
)
1557 memcpy(usr
->user_sess_key
, user_session_key
, sizeof(usr
->user_sess_key
));
1559 memset((char *)usr
->user_sess_key
, '\0', sizeof(usr
->user_sess_key
));
1561 usr
->buffer_dom_id
= dom_sid
? 1 : 0; /* yes, we're bothering to put a domain SID in */
1563 memset((char *)usr
->lm_sess_key
, '\0', sizeof(usr
->lm_sess_key
));
1565 for (i
=0; i
<7; i
++) {
1566 memset(&usr
->unknown
[i
], '\0', sizeof(usr
->unknown
));
1569 if (lm_session_key
!= NULL
) {
1570 memcpy(usr
->lm_sess_key
, lm_session_key
, sizeof(usr
->lm_sess_key
));
1573 num_other_sids
= init_dom_sid2s(ctx
, NULL
, &usr
->other_sids
);
1575 usr
->num_other_sids
= num_other_sids
;
1576 usr
->buffer_other_sids
= (num_other_sids
!= 0) ? 1 : 0;
1578 init_unistr2(&usr
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1579 init_uni_hdr(&usr
->hdr_user_name
, &usr
->uni_user_name
);
1580 init_unistr2(&usr
->uni_full_name
, full_name
, UNI_FLAGS_NONE
);
1581 init_uni_hdr(&usr
->hdr_full_name
, &usr
->uni_full_name
);
1582 init_unistr2(&usr
->uni_logon_script
, logon_script
, UNI_FLAGS_NONE
);
1583 init_uni_hdr(&usr
->hdr_logon_script
, &usr
->uni_logon_script
);
1584 init_unistr2(&usr
->uni_profile_path
, profile_path
, UNI_FLAGS_NONE
);
1585 init_uni_hdr(&usr
->hdr_profile_path
, &usr
->uni_profile_path
);
1586 init_unistr2(&usr
->uni_home_dir
, home_dir
, UNI_FLAGS_NONE
);
1587 init_uni_hdr(&usr
->hdr_home_dir
, &usr
->uni_home_dir
);
1588 init_unistr2(&usr
->uni_dir_drive
, dir_drive
, UNI_FLAGS_NONE
);
1589 init_uni_hdr(&usr
->hdr_dir_drive
, &usr
->uni_dir_drive
);
1591 usr
->num_groups2
= num_groups
;
1594 usr
->gids
= TALLOC_ZERO_ARRAY(ctx
,DOM_GID
,num_groups
);
1595 if (usr
->gids
== NULL
)
1601 for (i
= 0; i
< num_groups
; i
++)
1602 usr
->gids
[i
] = gids
[i
];
1604 init_unistr2(&usr
->uni_logon_srv
, logon_srv
, UNI_FLAGS_NONE
);
1605 init_uni_hdr(&usr
->hdr_logon_srv
, &usr
->uni_logon_srv
);
1606 init_unistr2(&usr
->uni_logon_dom
, logon_dom
, UNI_FLAGS_NONE
);
1607 init_uni_hdr(&usr
->hdr_logon_dom
, &usr
->uni_logon_dom
);
1609 init_dom_sid2(&usr
->dom_sid
, dom_sid
);
1610 /* "other" sids are set up above */
1613 static void dump_acct_flags(uint32 acct_flags
) {
1616 DEBUG(lvl
,("dump_acct_flags\n"));
1617 if (acct_flags
& ACB_NORMAL
) {
1618 DEBUGADD(lvl
,("\taccount has ACB_NORMAL\n"));
1620 if (acct_flags
& ACB_PWNOEXP
) {
1621 DEBUGADD(lvl
,("\taccount has ACB_PWNOEXP\n"));
1623 if (acct_flags
& ACB_ENC_TXT_PWD_ALLOWED
) {
1624 DEBUGADD(lvl
,("\taccount has ACB_ENC_TXT_PWD_ALLOWED\n"));
1626 if (acct_flags
& ACB_NOT_DELEGATED
) {
1627 DEBUGADD(lvl
,("\taccount has ACB_NOT_DELEGATED\n"));
1629 if (acct_flags
& ACB_USE_DES_KEY_ONLY
) {
1630 DEBUGADD(lvl
,("\taccount has ACB_USE_DES_KEY_ONLY set, sig verify wont work\n"));
1632 if (acct_flags
& ACB_NO_AUTH_DATA_REQD
) {
1633 DEBUGADD(lvl
,("\taccount has ACB_NO_AUTH_DATA_REQD set\n"));
1635 if (acct_flags
& ACB_PWEXPIRED
) {
1636 DEBUGADD(lvl
,("\taccount has ACB_PWEXPIRED set\n"));
1640 static void dump_user_flgs(uint32 user_flags
) {
1643 DEBUG(lvl
,("dump_user_flgs\n"));
1644 if (user_flags
& LOGON_EXTRA_SIDS
) {
1645 DEBUGADD(lvl
,("\taccount has LOGON_EXTRA_SIDS\n"));
1647 if (user_flags
& LOGON_RESOURCE_GROUPS
) {
1648 DEBUGADD(lvl
,("\taccount has LOGON_RESOURCE_GROUPS\n"));
1650 if (user_flags
& LOGON_NTLMV2_ENABLED
) {
1651 DEBUGADD(lvl
,("\taccount has LOGON_NTLMV2_ENABLED\n"));
1653 if (user_flags
& LOGON_CACHED_ACCOUNT
) {
1654 DEBUGADD(lvl
,("\taccount has LOGON_CACHED_ACCOUNT\n"));
1656 if (user_flags
& LOGON_PROFILE_PATH_RETURNED
) {
1657 DEBUGADD(lvl
,("\taccount has LOGON_PROFILE_PATH_RETURNED\n"));
1659 if (user_flags
& LOGON_SERVER_TRUST_ACCOUNT
) {
1660 DEBUGADD(lvl
,("\taccount has LOGON_SERVER_TRUST_ACCOUNT\n"));
1666 /*******************************************************************
1667 This code has been modified to cope with a NET_USER_INFO_2 - which is
1668 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1669 We use validation level to determine if we're marshalling a info 2 or
1670 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1671 Jacobsen at HP. JRA.
1672 ********************************************************************/
1674 BOOL
net_io_user_info3(const char *desc
, NET_USER_INFO_3
*usr
, prs_struct
*ps
,
1675 int depth
, uint16 validation_level
, BOOL kerb_validation_level
)
1682 prs_debug(ps
, depth
, desc
, "net_io_user_info3");
1685 if (UNMARSHALLING(ps
))
1691 if(!prs_uint32("ptr_user_info ", ps
, depth
, &usr
->ptr_user_info
))
1694 if (usr
->ptr_user_info
== 0)
1697 if(!smb_io_time("logon time", &usr
->logon_time
, ps
, depth
)) /* logon time */
1699 if(!smb_io_time("logoff time", &usr
->logoff_time
, ps
, depth
)) /* logoff time */
1701 if(!smb_io_time("kickoff time", &usr
->kickoff_time
, ps
, depth
)) /* kickoff time */
1703 if(!smb_io_time("last set time", &usr
->pass_last_set_time
, ps
, depth
)) /* password last set time */
1705 if(!smb_io_time("can change time", &usr
->pass_can_change_time
, ps
, depth
)) /* password can change time */
1707 if(!smb_io_time("must change time", &usr
->pass_must_change_time
, ps
, depth
)) /* password must change time */
1710 if(!smb_io_unihdr("hdr_user_name", &usr
->hdr_user_name
, ps
, depth
)) /* username unicode string header */
1712 if(!smb_io_unihdr("hdr_full_name", &usr
->hdr_full_name
, ps
, depth
)) /* user's full name unicode string header */
1714 if(!smb_io_unihdr("hdr_logon_script", &usr
->hdr_logon_script
, ps
, depth
)) /* logon script unicode string header */
1716 if(!smb_io_unihdr("hdr_profile_path", &usr
->hdr_profile_path
, ps
, depth
)) /* profile path unicode string header */
1718 if(!smb_io_unihdr("hdr_home_dir", &usr
->hdr_home_dir
, ps
, depth
)) /* home directory unicode string header */
1720 if(!smb_io_unihdr("hdr_dir_drive", &usr
->hdr_dir_drive
, ps
, depth
)) /* home directory drive unicode string header */
1723 if(!prs_uint16("logon_count ", ps
, depth
, &usr
->logon_count
)) /* logon count */
1725 if(!prs_uint16("bad_pw_count ", ps
, depth
, &usr
->bad_pw_count
)) /* bad password count */
1728 if(!prs_uint32("user_rid ", ps
, depth
, &usr
->user_rid
)) /* User RID */
1730 if(!prs_uint32("group_rid ", ps
, depth
, &usr
->group_rid
)) /* Group RID */
1732 if(!prs_uint32("num_groups ", ps
, depth
, &usr
->num_groups
)) /* num groups */
1734 if(!prs_uint32("buffer_groups ", ps
, depth
, &usr
->buffer_groups
)) /* undocumented buffer pointer to groups. */
1736 if(!prs_uint32("user_flgs ", ps
, depth
, &usr
->user_flgs
)) /* user flags */
1738 dump_user_flgs(usr
->user_flgs
);
1739 if(!prs_uint8s(False
, "user_sess_key", ps
, depth
, usr
->user_sess_key
, 16)) /* user session key */
1742 if(!smb_io_unihdr("hdr_logon_srv", &usr
->hdr_logon_srv
, ps
, depth
)) /* logon server unicode string header */
1744 if(!smb_io_unihdr("hdr_logon_dom", &usr
->hdr_logon_dom
, ps
, depth
)) /* logon domain unicode string header */
1747 if(!prs_uint32("buffer_dom_id ", ps
, depth
, &usr
->buffer_dom_id
)) /* undocumented logon domain id pointer */
1750 if(!prs_uint8s(False
, "lm_sess_key", ps
, depth
, usr
->lm_sess_key
, 8)) /* lm session key */
1753 if(!prs_uint32("acct_flags ", ps
, depth
, &usr
->acct_flags
)) /* Account flags */
1755 dump_acct_flags(usr
->acct_flags
);
1756 for (i
= 0; i
< 7; i
++)
1758 if (!prs_uint32("unkown", ps
, depth
, &usr
->unknown
[i
])) /* unknown */
1762 if (validation_level
== 3) {
1763 if(!prs_uint32("num_other_sids", ps
, depth
, &usr
->num_other_sids
)) /* 0 - num_sids */
1765 if(!prs_uint32("buffer_other_sids", ps
, depth
, &usr
->buffer_other_sids
)) /* NULL - undocumented pointer to SIDs. */
1768 if (UNMARSHALLING(ps
)) {
1769 usr
->num_other_sids
= 0;
1770 usr
->buffer_other_sids
= 0;
1774 /* get kerb validation info (not really part of user_info_3) - Guenther */
1776 if (kerb_validation_level
) {
1778 if(!prs_uint32("ptr_res_group_dom_sid", ps
, depth
, &usr
->ptr_res_group_dom_sid
))
1780 if(!prs_uint32("res_group_count", ps
, depth
, &usr
->res_group_count
))
1782 if(!prs_uint32("ptr_res_groups", ps
, depth
, &usr
->ptr_res_groups
))
1786 if(!smb_io_unistr2("uni_user_name", &usr
->uni_user_name
, usr
->hdr_user_name
.buffer
, ps
, depth
)) /* username unicode string */
1788 if(!smb_io_unistr2("uni_full_name", &usr
->uni_full_name
, usr
->hdr_full_name
.buffer
, ps
, depth
)) /* user's full name unicode string */
1790 if(!smb_io_unistr2("uni_logon_script", &usr
->uni_logon_script
, usr
->hdr_logon_script
.buffer
, ps
, depth
)) /* logon script unicode string */
1792 if(!smb_io_unistr2("uni_profile_path", &usr
->uni_profile_path
, usr
->hdr_profile_path
.buffer
, ps
, depth
)) /* profile path unicode string */
1794 if(!smb_io_unistr2("uni_home_dir", &usr
->uni_home_dir
, usr
->hdr_home_dir
.buffer
, ps
, depth
)) /* home directory unicode string */
1796 if(!smb_io_unistr2("uni_dir_drive", &usr
->uni_dir_drive
, usr
->hdr_dir_drive
.buffer
, ps
, depth
)) /* home directory drive unicode string */
1802 if(!prs_uint32("num_groups2 ", ps
, depth
, &usr
->num_groups2
)) /* num groups2 */
1805 if (usr
->num_groups
!= usr
->num_groups2
) {
1806 DEBUG(3,("net_io_user_info3: num_groups mismatch! (%d != %d)\n",
1807 usr
->num_groups
, usr
->num_groups2
));
1811 if (UNMARSHALLING(ps
)) {
1812 if (usr
->num_groups
) {
1813 usr
->gids
= PRS_ALLOC_MEM(ps
, DOM_GID
, usr
->num_groups
);
1814 if (usr
->gids
== NULL
)
1821 for (i
= 0; i
< usr
->num_groups
; i
++) {
1822 if(!smb_io_gid("", &usr
->gids
[i
], ps
, depth
)) /* group info */
1826 if(!smb_io_unistr2("uni_logon_srv", &usr
->uni_logon_srv
, usr
->hdr_logon_srv
.buffer
, ps
, depth
)) /* logon server unicode string */
1828 if(!smb_io_unistr2("uni_logon_dom", &usr
->uni_logon_dom
, usr
->hdr_logon_dom
.buffer
, ps
, depth
)) /* logon domain unicode string */
1831 if(!smb_io_dom_sid2("", &usr
->dom_sid
, ps
, depth
)) /* domain SID */
1834 if (validation_level
== 3 && usr
->buffer_other_sids
) {
1836 uint32 num_other_sids
= usr
->num_other_sids
;
1838 if (!(usr
->user_flgs
& LOGON_EXTRA_SIDS
)) {
1839 DEBUG(10,("net_io_user_info3: user_flgs attribute does not have LOGON_EXTRA_SIDS\n"));
1843 if (!prs_uint32("num_other_sids", ps
, depth
,
1847 if (num_other_sids
!= usr
->num_other_sids
)
1850 if (UNMARSHALLING(ps
)) {
1851 if (usr
->num_other_sids
) {
1852 usr
->other_sids
= PRS_ALLOC_MEM(ps
, DOM_SID2
, usr
->num_other_sids
);
1853 usr
->other_sids_attrib
=
1854 PRS_ALLOC_MEM(ps
, uint32
, usr
->num_other_sids
);
1856 usr
->other_sids
= NULL
;
1857 usr
->other_sids_attrib
= NULL
;
1860 if ((num_other_sids
!= 0) &&
1861 ((usr
->other_sids
== NULL
) ||
1862 (usr
->other_sids_attrib
== NULL
)))
1866 /* First the pointers to the SIDS and attributes */
1870 for (i
=0; i
<usr
->num_other_sids
; i
++) {
1873 if (!prs_uint32("sid_ptr", ps
, depth
, &ptr
))
1876 if (UNMARSHALLING(ps
) && (ptr
== 0))
1879 if (!prs_uint32("attribute", ps
, depth
,
1880 &usr
->other_sids_attrib
[i
]))
1884 for (i
= 0; i
< usr
->num_other_sids
; i
++) {
1885 if(!smb_io_dom_sid2("", &usr
->other_sids
[i
], ps
, depth
)) /* other domain SIDs */
1895 /*******************************************************************
1896 Reads or writes a structure.
1897 ********************************************************************/
1899 BOOL
net_io_q_sam_logon(const char *desc
, NET_Q_SAM_LOGON
*q_l
, prs_struct
*ps
, int depth
)
1904 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon");
1910 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
))
1913 if(!prs_align_uint16(ps
))
1916 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
1922 /*******************************************************************
1923 Reads or writes a structure.
1924 ********************************************************************/
1926 BOOL
net_io_r_sam_logon(const char *desc
, NET_R_SAM_LOGON
*r_l
, prs_struct
*ps
, int depth
)
1931 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon");
1934 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1936 if (&r_l
->buffer_creds
) {
1937 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1941 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
1946 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1947 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1950 if (r_l
->switch_value
!= 0) {
1951 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1956 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
1959 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1968 /*******************************************************************
1969 Reads or writes a structure.
1970 ********************************************************************/
1972 BOOL
net_io_q_sam_logon_ex(const char *desc
, NET_Q_SAM_LOGON_EX
*q_l
, prs_struct
*ps
, int depth
)
1977 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon_ex");
1983 if(!smb_io_sam_info_ex("", &q_l
->sam_id
, ps
, depth
))
1986 if(!prs_align_uint16(ps
))
1989 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
1992 if(!prs_uint32("flags ", ps
, depth
, &q_l
->flags
))
1998 /*******************************************************************
1999 Reads or writes a structure.
2000 ********************************************************************/
2002 BOOL
net_io_r_sam_logon_ex(const char *desc
, NET_R_SAM_LOGON_EX
*r_l
, prs_struct
*ps
, int depth
)
2007 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon_ex");
2010 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
2015 #if 1 /* W2k always needs this - even for bad passwd. JRA */
2016 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
2019 if (r_l
->switch_value
!= 0) {
2020 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
2025 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
2028 if(!prs_uint32("flags ", ps
, depth
, &r_l
->flags
))
2031 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
2041 /*******************************************************************
2042 Reads or writes a structure.
2043 ********************************************************************/
2045 BOOL
net_io_q_sam_logoff(const char *desc
, NET_Q_SAM_LOGOFF
*q_l
, prs_struct
*ps
, int depth
)
2050 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logoff");
2056 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
)) /* domain SID */
2062 /*******************************************************************
2063 Reads or writes a structure.
2064 ********************************************************************/
2066 BOOL
net_io_r_sam_logoff(const char *desc
, NET_R_SAM_LOGOFF
*r_l
, prs_struct
*ps
, int depth
)
2071 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logoff");
2077 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
2079 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
2082 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
2088 /*******************************************************************
2089 makes a NET_Q_SAM_SYNC structure.
2090 ********************************************************************/
2091 BOOL
init_net_q_sam_sync(NET_Q_SAM_SYNC
* q_s
, const char *srv_name
,
2092 const char *cli_name
, DOM_CRED
*cli_creds
,
2093 DOM_CRED
*ret_creds
, uint32 database_id
,
2096 DEBUG(5, ("init_q_sam_sync\n"));
2098 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
2099 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
2102 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
2105 memcpy(&q_s
->ret_creds
, ret_creds
, sizeof(q_s
->ret_creds
));
2107 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
2109 q_s
->database_id
= database_id
;
2110 q_s
->restart_state
= 0;
2111 q_s
->sync_context
= next_rid
;
2112 q_s
->max_size
= 0xffff;
2117 /*******************************************************************
2118 reads or writes a structure.
2119 ********************************************************************/
2120 BOOL
net_io_q_sam_sync(const char *desc
, NET_Q_SAM_SYNC
* q_s
, prs_struct
*ps
,
2123 prs_debug(ps
, depth
, desc
, "net_io_q_sam_sync");
2126 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
2128 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
2131 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
2133 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
2136 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
2138 if (!prs_uint32("restart_state", ps
, depth
, &q_s
->restart_state
))
2140 if (!prs_uint32("sync_context ", ps
, depth
, &q_s
->sync_context
))
2143 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
2149 /*******************************************************************
2150 reads or writes a structure.
2151 ********************************************************************/
2152 static BOOL
net_io_sam_delta_hdr(const char *desc
, SAM_DELTA_HDR
* delta
,
2153 prs_struct
*ps
, int depth
)
2155 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_hdr");
2158 if (!prs_uint16("type", ps
, depth
, &delta
->type
))
2160 if (!prs_uint16("type2", ps
, depth
, &delta
->type2
))
2162 if (!prs_uint32("target_rid", ps
, depth
, &delta
->target_rid
))
2165 if (!prs_uint32("type3", ps
, depth
, &delta
->type3
))
2168 /* Not sure why we need this but it seems to be necessary to get
2169 sam deltas working. */
2171 if (delta
->type
!= 0x16) {
2172 if (!prs_uint32("ptr_delta", ps
, depth
, &delta
->ptr_delta
))
2179 /*******************************************************************
2180 reads or writes a structure.
2181 ********************************************************************/
2182 static BOOL
net_io_sam_delta_mod_count(const char *desc
, SAM_DELTA_MOD_COUNT
*info
,
2183 prs_struct
*ps
, int depth
)
2185 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_stamp");
2188 if (!prs_uint32("seqnum", ps
, depth
, &info
->seqnum
))
2190 if (!prs_uint32("dom_mod_count_ptr", ps
, depth
,
2191 &info
->dom_mod_count_ptr
))
2194 if (info
->dom_mod_count_ptr
) {
2195 if (!prs_uint64("dom_mod_count", ps
, depth
,
2196 &info
->dom_mod_count
))
2203 /*******************************************************************
2204 reads or writes a structure.
2205 ********************************************************************/
2206 static BOOL
net_io_sam_domain_info(const char *desc
, SAM_DOMAIN_INFO
* info
,
2207 prs_struct
*ps
, int depth
)
2209 prs_debug(ps
, depth
, desc
, "net_io_sam_domain_info");
2212 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2214 if (!smb_io_unihdr("hdr_oem_info", &info
->hdr_oem_info
, ps
, depth
))
2217 if (!prs_uint64("force_logoff", ps
, depth
, &info
->force_logoff
))
2219 if (!prs_uint16("min_pwd_len", ps
, depth
, &info
->min_pwd_len
))
2221 if (!prs_uint16("pwd_history_len", ps
, depth
, &info
->pwd_history_len
))
2223 if (!prs_uint64("max_pwd_age", ps
, depth
, &info
->max_pwd_age
))
2225 if (!prs_uint64("min_pwd_age", ps
, depth
, &info
->min_pwd_age
))
2227 if (!prs_uint64("dom_mod_count", ps
, depth
, &info
->dom_mod_count
))
2229 if (!smb_io_time("creation_time", &info
->creation_time
, ps
, depth
))
2231 if (!prs_uint32("security_information", ps
, depth
, &info
->security_information
))
2233 if (!smb_io_bufhdr4("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2235 if (!smb_io_lockout_string_hdr("hdr_account_lockout_string", &info
->hdr_account_lockout
, ps
, depth
))
2237 if (!smb_io_unihdr("hdr_unknown2", &info
->hdr_unknown2
, ps
, depth
))
2239 if (!smb_io_unihdr("hdr_unknown3", &info
->hdr_unknown3
, ps
, depth
))
2241 if (!smb_io_unihdr("hdr_unknown4", &info
->hdr_unknown4
, ps
, depth
))
2243 if (!prs_uint32("logon_chgpass", ps
, depth
, &info
->logon_chgpass
))
2245 if (!prs_uint32("unknown6", ps
, depth
, &info
->unknown6
))
2247 if (!prs_uint32("unknown7", ps
, depth
, &info
->unknown7
))
2249 if (!prs_uint32("unknown8", ps
, depth
, &info
->unknown8
))
2252 if (!smb_io_unistr2("uni_dom_name", &info
->uni_dom_name
,
2253 info
->hdr_dom_name
.buffer
, ps
, depth
))
2255 if (!smb_io_unistr2("buf_oem_info", &info
->buf_oem_info
,
2256 info
->hdr_oem_info
.buffer
, ps
, depth
))
2259 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2262 if (!smb_io_account_lockout_str("account_lockout", &info
->account_lockout
,
2263 info
->hdr_account_lockout
.buffer
, ps
, depth
))
2266 if (!smb_io_unistr2("buf_unknown2", &info
->buf_unknown2
,
2267 info
->hdr_unknown2
.buffer
, ps
, depth
))
2269 if (!smb_io_unistr2("buf_unknown3", &info
->buf_unknown3
,
2270 info
->hdr_unknown3
.buffer
, ps
, depth
))
2272 if (!smb_io_unistr2("buf_unknown4", &info
->buf_unknown4
,
2273 info
->hdr_unknown4
.buffer
, ps
, depth
))
2279 /*******************************************************************
2280 reads or writes a structure.
2281 ********************************************************************/
2282 static BOOL
net_io_sam_group_info(const char *desc
, SAM_GROUP_INFO
* info
,
2283 prs_struct
*ps
, int depth
)
2285 prs_debug(ps
, depth
, desc
, "net_io_sam_group_info");
2288 if (!smb_io_unihdr("hdr_grp_name", &info
->hdr_grp_name
, ps
, depth
))
2290 if (!smb_io_gid("gid", &info
->gid
, ps
, depth
))
2292 if (!smb_io_unihdr("hdr_grp_desc", &info
->hdr_grp_desc
, ps
, depth
))
2294 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2297 if (ps
->data_offset
+ 48 > ps
->buffer_size
)
2299 ps
->data_offset
+= 48;
2301 if (!smb_io_unistr2("uni_grp_name", &info
->uni_grp_name
,
2302 info
->hdr_grp_name
.buffer
, ps
, depth
))
2304 if (!smb_io_unistr2("uni_grp_desc", &info
->uni_grp_desc
,
2305 info
->hdr_grp_desc
.buffer
, ps
, depth
))
2307 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2313 /*******************************************************************
2314 reads or writes a structure.
2315 ********************************************************************/
2316 static BOOL
net_io_sam_passwd_info(const char *desc
, SAM_PWD
* pwd
,
2317 prs_struct
*ps
, int depth
)
2319 prs_debug(ps
, depth
, desc
, "net_io_sam_passwd_info");
2322 if (!prs_uint32("unk_0 ", ps
, depth
, &pwd
->unk_0
))
2325 if (!smb_io_unihdr("hdr_lm_pwd", &pwd
->hdr_lm_pwd
, ps
, depth
))
2327 if (!prs_uint8s(False
, "buf_lm_pwd", ps
, depth
, pwd
->buf_lm_pwd
, 16))
2330 if (!smb_io_unihdr("hdr_nt_pwd", &pwd
->hdr_nt_pwd
, ps
, depth
))
2332 if (!prs_uint8s(False
, "buf_nt_pwd", ps
, depth
, pwd
->buf_nt_pwd
, 16))
2335 if (!smb_io_unihdr("", &pwd
->hdr_empty_lm
, ps
, depth
))
2337 if (!smb_io_unihdr("", &pwd
->hdr_empty_nt
, ps
, depth
))
2343 /*******************************************************************
2344 reads or writes a structure.
2345 ********************************************************************/
2346 static BOOL
net_io_sam_account_info(const char *desc
, SAM_ACCOUNT_INFO
*info
,
2347 prs_struct
*ps
, int depth
)
2349 BUFHDR2 hdr_priv_data
;
2352 prs_debug(ps
, depth
, desc
, "net_io_sam_account_info");
2355 if (!smb_io_unihdr("hdr_acct_name", &info
->hdr_acct_name
, ps
, depth
))
2357 if (!smb_io_unihdr("hdr_full_name", &info
->hdr_full_name
, ps
, depth
))
2360 if (!prs_uint32("user_rid ", ps
, depth
, &info
->user_rid
))
2362 if (!prs_uint32("group_rid", ps
, depth
, &info
->group_rid
))
2365 if (!smb_io_unihdr("hdr_home_dir ", &info
->hdr_home_dir
, ps
, depth
))
2367 if (!smb_io_unihdr("hdr_dir_drive", &info
->hdr_dir_drive
, ps
, depth
))
2369 if (!smb_io_unihdr("hdr_logon_script", &info
->hdr_logon_script
, ps
,
2373 if (!smb_io_unihdr("hdr_acct_desc", &info
->hdr_acct_desc
, ps
, depth
))
2375 if (!smb_io_unihdr("hdr_workstations", &info
->hdr_workstations
, ps
,
2379 if (!smb_io_time("logon_time", &info
->logon_time
, ps
, depth
))
2381 if (!smb_io_time("logoff_time", &info
->logoff_time
, ps
, depth
))
2384 if (!prs_uint32("logon_divs ", ps
, depth
, &info
->logon_divs
))
2386 if (!prs_uint32("ptr_logon_hrs", ps
, depth
, &info
->ptr_logon_hrs
))
2389 if (!prs_uint16("bad_pwd_count", ps
, depth
, &info
->bad_pwd_count
))
2391 if (!prs_uint16("logon_count", ps
, depth
, &info
->logon_count
))
2393 if (!smb_io_time("pwd_last_set_time", &info
->pwd_last_set_time
, ps
,
2396 if (!smb_io_time("acct_expiry_time", &info
->acct_expiry_time
, ps
,
2400 if (!prs_uint32("acb_info", ps
, depth
, &info
->acb_info
))
2402 if (!prs_uint8s(False
, "nt_pwd", ps
, depth
, info
->nt_pwd
, 16))
2404 if (!prs_uint8s(False
, "lm_pwd", ps
, depth
, info
->lm_pwd
, 16))
2406 if (!prs_uint8("lm_pwd_present", ps
, depth
, &info
->lm_pwd_present
))
2408 if (!prs_uint8("nt_pwd_present", ps
, depth
, &info
->nt_pwd_present
))
2410 if (!prs_uint8("pwd_expired", ps
, depth
, &info
->pwd_expired
))
2413 if (!smb_io_unihdr("hdr_comment", &info
->hdr_comment
, ps
, depth
))
2415 if (!smb_io_unihdr("hdr_parameters", &info
->hdr_parameters
, ps
,
2418 if (!prs_uint16("country", ps
, depth
, &info
->country
))
2420 if (!prs_uint16("codepage", ps
, depth
, &info
->codepage
))
2423 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data
, ps
, depth
))
2425 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2427 if (!smb_io_unihdr("hdr_profile", &info
->hdr_profile
, ps
, depth
))
2430 for (i
= 0; i
< 3; i
++)
2432 if (!smb_io_unihdr("hdr_reserved", &info
->hdr_reserved
[i
],
2437 for (i
= 0; i
< 4; i
++)
2439 if (!prs_uint32("dw_reserved", ps
, depth
,
2440 &info
->dw_reserved
[i
]))
2444 if (!smb_io_unistr2("uni_acct_name", &info
->uni_acct_name
,
2445 info
->hdr_acct_name
.buffer
, ps
, depth
))
2448 if (!smb_io_unistr2("uni_full_name", &info
->uni_full_name
,
2449 info
->hdr_full_name
.buffer
, ps
, depth
))
2452 if (!smb_io_unistr2("uni_home_dir ", &info
->uni_home_dir
,
2453 info
->hdr_home_dir
.buffer
, ps
, depth
))
2456 if (!smb_io_unistr2("uni_dir_drive", &info
->uni_dir_drive
,
2457 info
->hdr_dir_drive
.buffer
, ps
, depth
))
2460 if (!smb_io_unistr2("uni_logon_script", &info
->uni_logon_script
,
2461 info
->hdr_logon_script
.buffer
, ps
, depth
))
2464 if (!smb_io_unistr2("uni_acct_desc", &info
->uni_acct_desc
,
2465 info
->hdr_acct_desc
.buffer
, ps
, depth
))
2468 if (!smb_io_unistr2("uni_workstations", &info
->uni_workstations
,
2469 info
->hdr_workstations
.buffer
, ps
, depth
))
2473 if (!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2475 if (!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2478 if (!smb_io_rpc_blob("buf_logon_hrs", &info
->buf_logon_hrs
, ps
, depth
))
2481 if (!smb_io_unistr2("uni_comment", &info
->uni_comment
,
2482 info
->hdr_comment
.buffer
, ps
, depth
))
2485 if (!smb_io_unistr2("uni_parameters", &info
->uni_parameters
,
2486 info
->hdr_parameters
.buffer
, ps
, depth
))
2489 if (hdr_priv_data
.buffer
!= 0)
2493 if (!prs_uint32("pwd_len", ps
, depth
, &len
))
2495 old_offset
= ps
->data_offset
;
2501 if (!prs_hash1(ps
, ps
->data_offset
, len
))
2504 if (!net_io_sam_passwd_info("pass", &info
->pass
,
2511 if (!prs_hash1(ps
, old_offset
, len
))
2515 if (old_offset
+ len
> ps
->buffer_size
)
2517 ps
->data_offset
= old_offset
+ len
;
2519 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2522 if (!smb_io_unistr2("uni_profile", &info
->uni_profile
,
2523 info
->hdr_profile
.buffer
, ps
, depth
))
2531 /*******************************************************************
2532 reads or writes a structure.
2533 ********************************************************************/
2534 static BOOL
net_io_sam_group_mem_info(const char *desc
, SAM_GROUP_MEM_INFO
* info
,
2535 prs_struct
*ps
, int depth
)
2540 prs_debug(ps
, depth
, desc
, "net_io_sam_group_mem_info");
2544 if (!prs_uint32("ptr_rids ", ps
, depth
, &info
->ptr_rids
))
2546 if (!prs_uint32("ptr_attribs", ps
, depth
, &info
->ptr_attribs
))
2548 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2551 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2553 ps
->data_offset
+= 16;
2555 if (info
->ptr_rids
!= 0)
2557 if (!prs_uint32("num_members2", ps
, depth
,
2558 &info
->num_members2
))
2561 if (info
->num_members2
!= info
->num_members
)
2567 if (UNMARSHALLING(ps
)) {
2568 if (info
->num_members2
) {
2569 info
->rids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members2
);
2571 if (info
->rids
== NULL
) {
2572 DEBUG(0, ("out of memory allocating %d rids\n",
2573 info
->num_members2
));
2581 for (i
= 0; i
< info
->num_members2
; i
++)
2583 slprintf(tmp
, sizeof(tmp
) - 1, "rids[%02d]", i
);
2584 if (!prs_uint32(tmp
, ps
, depth
, &info
->rids
[i
]))
2589 if (info
->ptr_attribs
!= 0)
2591 if (!prs_uint32("num_members3", ps
, depth
,
2592 &info
->num_members3
))
2594 if (info
->num_members3
!= info
->num_members
)
2600 if (UNMARSHALLING(ps
)) {
2601 if (info
->num_members3
) {
2602 info
->attribs
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members3
);
2604 if (info
->attribs
== NULL
) {
2605 DEBUG(0, ("out of memory allocating %d attribs\n",
2606 info
->num_members3
));
2610 info
->attribs
= NULL
;
2614 for (i
= 0; i
< info
->num_members3
; i
++)
2616 slprintf(tmp
, sizeof(tmp
) - 1, "attribs[%02d]", i
);
2617 if (!prs_uint32(tmp
, ps
, depth
, &info
->attribs
[i
]))
2625 /*******************************************************************
2626 reads or writes a structure.
2627 ********************************************************************/
2628 static BOOL
net_io_sam_alias_info(const char *desc
, SAM_ALIAS_INFO
* info
,
2629 prs_struct
*ps
, int depth
)
2631 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_info");
2634 if (!smb_io_unihdr("hdr_als_name", &info
->hdr_als_name
, ps
, depth
))
2636 if (!prs_uint32("als_rid", ps
, depth
, &info
->als_rid
))
2638 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2640 if (!smb_io_unihdr("hdr_als_desc", &info
->hdr_als_desc
, ps
, depth
))
2643 if (ps
->data_offset
+ 40 > ps
->buffer_size
)
2645 ps
->data_offset
+= 40;
2647 if (!smb_io_unistr2("uni_als_name", &info
->uni_als_name
,
2648 info
->hdr_als_name
.buffer
, ps
, depth
))
2650 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2653 if (!smb_io_unistr2("uni_als_desc", &info
->uni_als_desc
,
2654 info
->hdr_als_desc
.buffer
, ps
, depth
))
2660 /*******************************************************************
2661 reads or writes a structure.
2662 ********************************************************************/
2663 static BOOL
net_io_sam_alias_mem_info(const char *desc
, SAM_ALIAS_MEM_INFO
* info
,
2664 prs_struct
*ps
, int depth
)
2669 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_mem_info");
2673 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2675 if (!prs_uint32("ptr_members", ps
, depth
, &info
->ptr_members
))
2678 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2680 ps
->data_offset
+= 16;
2682 if (info
->ptr_members
!= 0)
2684 if (!prs_uint32("num_sids", ps
, depth
, &info
->num_sids
))
2686 if (info
->num_sids
!= info
->num_members
)
2692 if (UNMARSHALLING(ps
)) {
2693 if (info
->num_sids
) {
2694 info
->ptr_sids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_sids
);
2696 if (info
->ptr_sids
== NULL
) {
2697 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2702 info
->ptr_sids
= NULL
;
2706 for (i
= 0; i
< info
->num_sids
; i
++)
2708 slprintf(tmp
, sizeof(tmp
) - 1, "ptr_sids[%02d]", i
);
2709 if (!prs_uint32(tmp
, ps
, depth
, &info
->ptr_sids
[i
]))
2713 if (UNMARSHALLING(ps
)) {
2714 if (info
->num_sids
) {
2715 info
->sids
= TALLOC_ARRAY(ps
->mem_ctx
, DOM_SID2
, info
->num_sids
);
2717 if (info
->sids
== NULL
) {
2718 DEBUG(0, ("error allocating %d sids\n",
2727 for (i
= 0; i
< info
->num_sids
; i
++)
2729 if (info
->ptr_sids
[i
] != 0)
2731 slprintf(tmp
, sizeof(tmp
) - 1, "sids[%02d]",
2733 if (!smb_io_dom_sid2(tmp
, &info
->sids
[i
],
2743 /*******************************************************************
2744 reads or writes a structure.
2745 ********************************************************************/
2746 static BOOL
net_io_sam_policy_info(const char *desc
, SAM_DELTA_POLICY
*info
,
2747 prs_struct
*ps
, int depth
)
2750 prs_debug(ps
, depth
, desc
, "net_io_sam_policy_info");
2756 if (!prs_uint32("max_log_size", ps
, depth
, &info
->max_log_size
))
2758 if (!prs_uint64("audit_retention_period", ps
, depth
,
2759 &info
->audit_retention_period
))
2761 if (!prs_uint32("auditing_mode", ps
, depth
, &info
->auditing_mode
))
2763 if (!prs_uint32("num_events", ps
, depth
, &info
->num_events
))
2765 if (!prs_uint32("ptr_events", ps
, depth
, &info
->ptr_events
))
2768 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2771 if (!prs_uint32("sid_ptr", ps
, depth
, &info
->sid_ptr
))
2774 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2776 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2777 &info
->non_paged_pool_limit
))
2779 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2781 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2783 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2785 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2787 if (!smb_io_time("modify_time", &info
->modify_time
, ps
, depth
))
2789 if (!smb_io_time("create_time", &info
->create_time
, ps
, depth
))
2791 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2794 for (i
=0; i
<4; i
++) {
2796 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2800 for (i
=0; i
<4; i
++) {
2802 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2806 if (!prs_uint32("num_event_audit_options", ps
, depth
,
2807 &info
->num_event_audit_options
))
2810 for (i
=0; i
<info
->num_event_audit_options
; i
++)
2811 if (!prs_uint32("event_audit_option", ps
, depth
,
2812 &info
->event_audit_option
))
2815 if (!smb_io_unistr2("domain_name", &info
->domain_name
, True
, ps
, depth
))
2818 if(!smb_io_dom_sid2("domain_sid", &info
->domain_sid
, ps
, depth
))
2821 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2830 /* This function is pretty broken - see bug #334 */
2832 /*******************************************************************
2833 reads or writes a structure.
2834 ********************************************************************/
2835 static BOOL
net_io_sam_trustdoms_info(const char *desc
, SAM_DELTA_TRUSTDOMS
*info
,
2836 prs_struct
*ps
, int depth
)
2840 prs_debug(ps
, depth
, desc
, "net_io_sam_trustdoms_info");
2846 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2849 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2852 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2855 if(!smb_io_unihdr("hdr_domain", &info
->hdr_domain
, ps
, depth
))
2858 if(!prs_uint32("unknown0", ps
, depth
, &info
->unknown0
))
2860 if(!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2862 if(!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2865 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2867 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2870 for (i
=0; i
<12; i
++)
2871 if(!prs_uint32("unknown3", ps
, depth
, &info
->unknown3
))
2874 if (!smb_io_unistr2("domain", &info
->domain
, True
, ps
, depth
))
2884 /* This function doesn't work - see bug #334 */
2886 /*******************************************************************
2887 reads or writes a structure.
2888 ********************************************************************/
2889 static BOOL
net_io_sam_secret_info(const char *desc
, SAM_DELTA_SECRET
*info
,
2890 prs_struct
*ps
, int depth
)
2894 prs_debug(ps
, depth
, desc
, "net_io_sam_secret_info");
2900 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2903 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2906 if (!smb_io_unistr2("secret", &info
->secret
, True
, ps
, depth
))
2912 if(!prs_uint32("count1", ps
, depth
, &info
->count1
))
2914 if(!prs_uint32("count2", ps
, depth
, &info
->count2
))
2916 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2920 if(!smb_io_time("time1", &info
->time1
, ps
, depth
)) /* logon time */
2922 if(!prs_uint32("count3", ps
, depth
, &info
->count3
))
2924 if(!prs_uint32("count4", ps
, depth
, &info
->count4
))
2926 if(!prs_uint32("ptr2", ps
, depth
, &info
->ptr2
))
2928 if(!smb_io_time("time2", &info
->time2
, ps
, depth
)) /* logon time */
2930 if(!prs_uint32("unknow1", ps
, depth
, &info
->unknow1
))
2934 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2936 if(!prs_uint32("ptr3", ps
, depth
, &info
->ptr3
))
2939 if(!prs_uint32("unknow2", ps
, depth
, &info
->unknow2
))
2942 if(!prs_uint32("chal_len", ps
, depth
, &info
->chal_len
))
2944 if(!prs_uint32("reserved1", ps
, depth
, &info
->reserved1
))
2946 if(!prs_uint32("chal_len2", ps
, depth
, &info
->chal_len2
))
2949 if(!prs_uint8s (False
, "chal", ps
, depth
, info
->chal
, info
->chal_len2
))
2952 if(!prs_uint32("key_len", ps
, depth
, &info
->key_len
))
2954 if(!prs_uint32("reserved2", ps
, depth
, &info
->reserved2
))
2956 if(!prs_uint32("key_len2", ps
, depth
, &info
->key_len2
))
2959 if(!prs_uint8s (False
, "key", ps
, depth
, info
->key
, info
->key_len2
))
2963 if(!prs_uint32("buf_size3", ps
, depth
, &info
->buf_size3
))
2966 if(!sec_io_desc("sec_desc2", &info
->sec_desc2
, ps
, depth
))
2975 /*******************************************************************
2976 reads or writes a structure.
2977 ********************************************************************/
2978 static BOOL
net_io_sam_privs_info(const char *desc
, SAM_DELTA_PRIVS
*info
,
2979 prs_struct
*ps
, int depth
)
2983 prs_debug(ps
, depth
, desc
, "net_io_sam_privs_info");
2989 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2992 if(!prs_uint32("priv_count", ps
, depth
, &info
->priv_count
))
2994 if(!prs_uint32("priv_control", ps
, depth
, &info
->priv_control
))
2997 if(!prs_uint32("priv_attr_ptr", ps
, depth
, &info
->priv_attr_ptr
))
2999 if(!prs_uint32("priv_name_ptr", ps
, depth
, &info
->priv_name_ptr
))
3002 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
3004 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
3005 &info
->non_paged_pool_limit
))
3007 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
3009 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
3011 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
3013 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
3015 if (!prs_uint32("system_flags", ps
, depth
, &info
->system_flags
))
3017 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
3020 for (i
=0; i
<4; i
++) {
3022 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
3026 for (i
=0; i
<4; i
++) {
3028 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
3032 if(!prs_uint32("attribute_count", ps
, depth
, &info
->attribute_count
))
3035 if (UNMARSHALLING(ps
)) {
3036 if (info
->attribute_count
) {
3037 info
->attributes
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->attribute_count
);
3038 if (!info
->attributes
) {
3042 info
->attributes
= NULL
;
3046 for (i
=0; i
<info
->attribute_count
; i
++)
3047 if(!prs_uint32("attributes", ps
, depth
, &info
->attributes
[i
]))
3050 if(!prs_uint32("privlist_count", ps
, depth
, &info
->privlist_count
))
3053 if (UNMARSHALLING(ps
)) {
3054 if (info
->privlist_count
) {
3055 info
->hdr_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNIHDR
, info
->privlist_count
);
3056 info
->uni_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNISTR2
, info
->privlist_count
);
3057 if (!info
->hdr_privslist
) {
3060 if (!info
->uni_privslist
) {
3064 info
->hdr_privslist
= NULL
;
3065 info
->uni_privslist
= NULL
;
3069 for (i
=0; i
<info
->privlist_count
; i
++)
3070 if(!smb_io_unihdr("hdr_privslist", &info
->hdr_privslist
[i
], ps
, depth
))
3073 for (i
=0; i
<info
->privlist_count
; i
++)
3074 if (!smb_io_unistr2("uni_privslist", &info
->uni_privslist
[i
], True
, ps
, depth
))
3077 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
3083 /*******************************************************************
3084 reads or writes a structure.
3085 ********************************************************************/
3086 static BOOL
net_io_sam_delta_ctr(const char *desc
,
3087 SAM_DELTA_CTR
* delta
, uint16 type
,
3088 prs_struct
*ps
, int depth
)
3090 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_ctr");
3094 /* Seen in sam deltas */
3095 case SAM_DELTA_MODIFIED_COUNT
:
3096 if (!net_io_sam_delta_mod_count("", &delta
->mod_count
, ps
, depth
))
3100 case SAM_DELTA_DOMAIN_INFO
:
3101 if (!net_io_sam_domain_info("", &delta
->domain_info
, ps
, depth
))
3105 case SAM_DELTA_GROUP_INFO
:
3106 if (!net_io_sam_group_info("", &delta
->group_info
, ps
, depth
))
3110 case SAM_DELTA_ACCOUNT_INFO
:
3111 if (!net_io_sam_account_info("", &delta
->account_info
, ps
, depth
))
3115 case SAM_DELTA_GROUP_MEM
:
3116 if (!net_io_sam_group_mem_info("", &delta
->grp_mem_info
, ps
, depth
))
3120 case SAM_DELTA_ALIAS_INFO
:
3121 if (!net_io_sam_alias_info("", &delta
->alias_info
, ps
, depth
))
3125 case SAM_DELTA_POLICY_INFO
:
3126 if (!net_io_sam_policy_info("", &delta
->policy_info
, ps
, depth
))
3130 case SAM_DELTA_ALIAS_MEM
:
3131 if (!net_io_sam_alias_mem_info("", &delta
->als_mem_info
, ps
, depth
))
3135 case SAM_DELTA_PRIVS_INFO
:
3136 if (!net_io_sam_privs_info("", &delta
->privs_info
, ps
, depth
))
3140 /* These guys are implemented but broken */
3142 case SAM_DELTA_TRUST_DOMS
:
3143 case SAM_DELTA_SECRET_INFO
:
3146 /* These guys are not implemented yet */
3148 case SAM_DELTA_RENAME_GROUP
:
3149 case SAM_DELTA_RENAME_USER
:
3150 case SAM_DELTA_RENAME_ALIAS
:
3151 case SAM_DELTA_DELETE_GROUP
:
3152 case SAM_DELTA_DELETE_USER
:
3154 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type
));
3161 /*******************************************************************
3162 reads or writes a structure.
3163 ********************************************************************/
3164 BOOL
net_io_r_sam_sync(const char *desc
,
3165 NET_R_SAM_SYNC
* r_s
, prs_struct
*ps
, int depth
)
3169 prs_debug(ps
, depth
, desc
, "net_io_r_sam_sync");
3172 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
3174 if (!prs_uint32("sync_context", ps
, depth
, &r_s
->sync_context
))
3177 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
3179 if (r_s
->ptr_deltas
!= 0)
3181 if (!prs_uint32("num_deltas ", ps
, depth
, &r_s
->num_deltas
))
3183 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->ptr_deltas2
))
3185 if (r_s
->ptr_deltas2
!= 0)
3187 if (!prs_uint32("num_deltas2", ps
, depth
,
3191 if (r_s
->num_deltas2
!= r_s
->num_deltas
)
3197 if (UNMARSHALLING(ps
)) {
3198 if (r_s
->num_deltas2
) {
3199 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas2
);
3200 if (r_s
->hdr_deltas
== NULL
) {
3201 DEBUG(0, ("error tallocating memory "
3202 "for %d delta headers\n",
3207 r_s
->hdr_deltas
= NULL
;
3211 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
3213 if (!net_io_sam_delta_hdr("",
3214 &r_s
->hdr_deltas
[i
],
3219 if (UNMARSHALLING(ps
)) {
3220 if (r_s
->num_deltas2
) {
3221 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas2
);
3222 if (r_s
->deltas
== NULL
) {
3223 DEBUG(0, ("error tallocating memory "
3233 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
3235 if (!net_io_sam_delta_ctr(
3236 "", &r_s
->deltas
[i
],
3237 r_s
->hdr_deltas
[i
].type3
,
3239 DEBUG(0, ("hmm, failed on i=%d\n", i
));
3247 if (!prs_ntstatus("status", ps
, depth
, &(r_s
->status
)))
3253 /*******************************************************************
3254 makes a NET_Q_SAM_DELTAS structure.
3255 ********************************************************************/
3256 BOOL
init_net_q_sam_deltas(NET_Q_SAM_DELTAS
*q_s
, const char *srv_name
,
3257 const char *cli_name
, DOM_CRED
*cli_creds
,
3258 uint32 database_id
, uint64 dom_mod_count
)
3260 DEBUG(5, ("init_net_q_sam_deltas\n"));
3262 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
3263 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
3265 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
3266 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
3268 q_s
->database_id
= database_id
;
3269 q_s
->dom_mod_count
= dom_mod_count
;
3270 q_s
->max_size
= 0xffff;
3275 /*******************************************************************
3276 reads or writes a structure.
3277 ********************************************************************/
3278 BOOL
net_io_q_sam_deltas(const char *desc
, NET_Q_SAM_DELTAS
*q_s
, prs_struct
*ps
,
3281 prs_debug(ps
, depth
, desc
, "net_io_q_sam_deltas");
3284 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
3286 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
3289 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
3291 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
3294 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
3296 if (!prs_uint64("dom_mod_count", ps
, depth
, &q_s
->dom_mod_count
))
3298 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
3304 /*******************************************************************
3305 reads or writes a structure.
3306 ********************************************************************/
3307 BOOL
net_io_r_sam_deltas(const char *desc
,
3308 NET_R_SAM_DELTAS
*r_s
, prs_struct
*ps
, int depth
)
3312 prs_debug(ps
, depth
, desc
, "net_io_r_sam_deltas");
3315 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
3317 if (!prs_uint64("dom_mod_count", ps
, depth
, &r_s
->dom_mod_count
))
3320 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
3322 if (!prs_uint32("num_deltas", ps
, depth
, &r_s
->num_deltas
))
3324 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->num_deltas2
))
3327 if (r_s
->num_deltas2
!= 0)
3329 if (!prs_uint32("num_deltas2 ", ps
, depth
, &r_s
->num_deltas2
))
3332 if (r_s
->ptr_deltas
!= 0)
3334 if (UNMARSHALLING(ps
)) {
3335 if (r_s
->num_deltas
) {
3336 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas
);
3337 if (r_s
->hdr_deltas
== NULL
) {
3338 DEBUG(0, ("error tallocating memory "
3339 "for %d delta headers\n",
3344 r_s
->hdr_deltas
= NULL
;
3348 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3350 net_io_sam_delta_hdr("", &r_s
->hdr_deltas
[i
],
3354 if (UNMARSHALLING(ps
)) {
3355 if (r_s
->num_deltas
) {
3356 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas
);
3357 if (r_s
->deltas
== NULL
) {
3358 DEBUG(0, ("error tallocating memory "
3368 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3370 if (!net_io_sam_delta_ctr(
3373 r_s
->hdr_deltas
[i
].type2
,
3382 if (!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
3388 /*******************************************************************
3389 Inits a NET_Q_DSR_GETDCNAME structure.
3390 ********************************************************************/
3392 void init_net_q_dsr_getdcname(NET_Q_DSR_GETDCNAME
*r_t
, const char *server_unc
,
3393 const char *domain_name
,
3394 struct GUID
*domain_guid
,
3395 struct GUID
*site_guid
,
3398 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3400 r_t
->ptr_server_unc
= (server_unc
!= NULL
);
3401 init_unistr2(&r_t
->uni_server_unc
, server_unc
, UNI_STR_TERMINATE
);
3403 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3404 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3406 r_t
->ptr_domain_guid
= (domain_guid
!= NULL
);
3407 r_t
->domain_guid
= domain_guid
;
3409 r_t
->ptr_site_guid
= (site_guid
!= NULL
);
3410 r_t
->site_guid
= site_guid
;
3415 /*******************************************************************
3416 Inits a NET_Q_DSR_GETDCNAMEEX structure.
3417 ********************************************************************/
3419 void init_net_q_dsr_getdcnameex(NET_Q_DSR_GETDCNAMEEX
*r_t
, const char *server_unc
,
3420 const char *domain_name
,
3421 struct GUID
*domain_guid
,
3422 const char *site_name
,
3425 DEBUG(5, ("init_net_q_dsr_getdcnameex\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_name
= (site_name
!= NULL
);
3437 init_unistr2(&r_t
->uni_site_name
, site_name
, UNI_STR_TERMINATE
);
3442 /*******************************************************************
3443 Inits a NET_Q_DSR_GETDCNAMEEX2 structure.
3444 ********************************************************************/
3446 void init_net_q_dsr_getdcnameex2(NET_Q_DSR_GETDCNAMEEX2
*r_t
, const char *server_unc
,
3447 const char *domain_name
,
3448 const char *client_account
,
3450 struct GUID
*domain_guid
,
3451 const char *site_name
,
3454 DEBUG(5, ("init_net_q_dsr_getdcnameex2\n"));
3456 r_t
->ptr_server_unc
= (server_unc
!= NULL
);
3457 init_unistr2(&r_t
->uni_server_unc
, server_unc
, UNI_STR_TERMINATE
);
3459 r_t
->ptr_client_account
= (client_account
!= NULL
);
3460 init_unistr2(&r_t
->uni_client_account
, client_account
, UNI_STR_TERMINATE
);
3464 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3465 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3467 r_t
->ptr_domain_guid
= (domain_guid
!= NULL
);
3468 r_t
->domain_guid
= domain_guid
;
3470 r_t
->ptr_site_name
= (site_name
!= NULL
);
3471 init_unistr2(&r_t
->uni_site_name
, site_name
, UNI_STR_TERMINATE
);
3476 /*******************************************************************
3477 Reads or writes an NET_Q_DSR_GETDCNAME structure.
3478 ********************************************************************/
3480 BOOL
net_io_q_dsr_getdcname(const char *desc
, NET_Q_DSR_GETDCNAME
*r_t
,
3481 prs_struct
*ps
, int depth
)
3486 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getdcname");
3489 if (!prs_uint32("ptr_server_unc", ps
, depth
, &r_t
->ptr_server_unc
))
3492 if (!smb_io_unistr2("server_unc", &r_t
->uni_server_unc
,
3493 r_t
->ptr_server_unc
, ps
, depth
))
3499 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3502 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3503 r_t
->ptr_domain_name
, ps
, depth
))
3509 if (!prs_uint32("ptr_domain_guid", ps
, depth
, &r_t
->ptr_domain_guid
))
3512 if (UNMARSHALLING(ps
) && (r_t
->ptr_domain_guid
)) {
3513 r_t
->domain_guid
= PRS_ALLOC_MEM(ps
, struct GUID
, 1);
3514 if (r_t
->domain_guid
== NULL
)
3518 if ((r_t
->ptr_domain_guid
) &&
3519 (!smb_io_uuid("domain_guid", r_t
->domain_guid
, ps
, depth
)))
3525 if (!prs_uint32("ptr_site_guid", ps
, depth
, &r_t
->ptr_site_guid
))
3528 if (UNMARSHALLING(ps
) && (r_t
->ptr_site_guid
)) {
3529 r_t
->site_guid
= PRS_ALLOC_MEM(ps
, struct GUID
, 1);
3530 if (r_t
->site_guid
== NULL
)
3534 if ((r_t
->ptr_site_guid
) &&
3535 (!smb_io_uuid("site_guid", r_t
->site_guid
, ps
, depth
)))
3541 if (!prs_uint32("flags", ps
, depth
, &r_t
->flags
))
3547 /*******************************************************************
3548 Reads or writes an NET_Q_DSR_GETDCNAMEEX structure.
3549 ********************************************************************/
3551 BOOL
net_io_q_dsr_getdcnameex(const char *desc
, NET_Q_DSR_GETDCNAMEEX
*r_t
,
3552 prs_struct
*ps
, int depth
)
3557 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getdcnameex");
3560 if (!prs_uint32("ptr_server_unc", ps
, depth
, &r_t
->ptr_server_unc
))
3563 if (!smb_io_unistr2("server_unc", &r_t
->uni_server_unc
,
3564 r_t
->ptr_server_unc
, ps
, depth
))
3570 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3573 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3574 r_t
->ptr_domain_name
, ps
, depth
))
3580 if (!prs_uint32("ptr_domain_guid", ps
, depth
, &r_t
->ptr_domain_guid
))
3583 if (UNMARSHALLING(ps
) && (r_t
->ptr_domain_guid
)) {
3584 r_t
->domain_guid
= PRS_ALLOC_MEM(ps
, struct GUID
, 1);
3585 if (r_t
->domain_guid
== NULL
)
3589 if ((r_t
->ptr_domain_guid
) &&
3590 (!smb_io_uuid("domain_guid", r_t
->domain_guid
, ps
, depth
)))
3596 if (!prs_uint32("ptr_site_name", ps
, depth
, &r_t
->ptr_site_name
))
3599 if (!smb_io_unistr2("site_name", &r_t
->uni_site_name
,
3600 r_t
->ptr_site_name
, ps
, depth
))
3606 if (!prs_uint32("flags", ps
, depth
, &r_t
->flags
))
3612 /*******************************************************************
3613 Reads or writes an NET_Q_DSR_GETDCNAMEEX2 structure.
3614 ********************************************************************/
3616 BOOL
net_io_q_dsr_getdcnameex2(const char *desc
, NET_Q_DSR_GETDCNAMEEX2
*r_t
,
3617 prs_struct
*ps
, int depth
)
3622 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getdcnameex2");
3625 if (!prs_uint32("ptr_server_unc", ps
, depth
, &r_t
->ptr_server_unc
))
3628 if (!smb_io_unistr2("server_unc", &r_t
->uni_server_unc
,
3629 r_t
->ptr_server_unc
, ps
, depth
))
3635 if (!prs_uint32("ptr_client_account", ps
, depth
, &r_t
->ptr_client_account
))
3638 if (!smb_io_unistr2("client_account", &r_t
->uni_client_account
,
3639 r_t
->ptr_client_account
, ps
, depth
))
3645 if (!prs_uint32("mask", ps
, depth
, &r_t
->mask
))
3651 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3654 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3655 r_t
->ptr_domain_name
, ps
, depth
))
3661 if (!prs_uint32("ptr_domain_guid", ps
, depth
, &r_t
->ptr_domain_guid
))
3664 if (UNMARSHALLING(ps
) && (r_t
->ptr_domain_guid
)) {
3665 r_t
->domain_guid
= PRS_ALLOC_MEM(ps
, struct GUID
, 1);
3666 if (r_t
->domain_guid
== NULL
)
3670 if ((r_t
->ptr_domain_guid
) &&
3671 (!smb_io_uuid("domain_guid", r_t
->domain_guid
, ps
, depth
)))
3677 if (!prs_uint32("ptr_site_name", ps
, depth
, &r_t
->ptr_site_name
))
3680 if (!smb_io_unistr2("site_name", &r_t
->uni_site_name
,
3681 r_t
->ptr_site_name
, ps
, depth
))
3687 if (!prs_uint32("flags", ps
, depth
, &r_t
->flags
))
3695 /*******************************************************************
3696 Inits a NET_R_DSR_GETDCNAME structure.
3697 ********************************************************************/
3698 void init_net_r_dsr_getdcname(NET_R_DSR_GETDCNAME
*r_t
, const char *dc_unc
,
3699 const char *dc_address
, int32 dc_address_type
,
3700 struct GUID domain_guid
, const char *domain_name
,
3701 const char *forest_name
, uint32 dc_flags
,
3702 const char *dc_site_name
,
3703 const char *client_site_name
)
3705 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3707 r_t
->ptr_dc_unc
= (dc_unc
!= NULL
);
3708 init_unistr2(&r_t
->uni_dc_unc
, dc_unc
, UNI_STR_TERMINATE
);
3710 r_t
->ptr_dc_address
= (dc_address
!= NULL
);
3711 init_unistr2(&r_t
->uni_dc_address
, dc_address
, UNI_STR_TERMINATE
);
3713 r_t
->dc_address_type
= dc_address_type
;
3714 r_t
->domain_guid
= domain_guid
;
3716 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3717 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3719 r_t
->ptr_forest_name
= (forest_name
!= NULL
);
3720 init_unistr2(&r_t
->uni_forest_name
, forest_name
, UNI_STR_TERMINATE
);
3722 r_t
->dc_flags
= dc_flags
;
3724 r_t
->ptr_dc_site_name
= (dc_site_name
!= NULL
);
3725 init_unistr2(&r_t
->uni_dc_site_name
, dc_site_name
, UNI_STR_TERMINATE
);
3727 r_t
->ptr_client_site_name
= (client_site_name
!= NULL
);
3728 init_unistr2(&r_t
->uni_client_site_name
, client_site_name
,
3732 /*******************************************************************
3733 Reads or writes an NET_R_DSR_GETDCNAME structure.
3734 ********************************************************************/
3736 BOOL
net_io_r_dsr_getdcname(const char *desc
, NET_R_DSR_GETDCNAME
*r_t
,
3737 prs_struct
*ps
, int depth
)
3739 uint32 info_ptr
= 1;
3744 prs_debug(ps
, depth
, desc
, "net_io_r_dsr_getdcname");
3747 /* The reply contains *just* an info struct, this is the ptr to it */
3748 if (!prs_uint32("info_ptr", ps
, depth
, &info_ptr
))
3754 if (!prs_uint32("ptr_dc_unc", ps
, depth
, &r_t
->ptr_dc_unc
))
3757 if (!prs_uint32("ptr_dc_address", ps
, depth
, &r_t
->ptr_dc_address
))
3760 if (!prs_int32("dc_address_type", ps
, depth
, &r_t
->dc_address_type
))
3763 if (!smb_io_uuid("domain_guid", &r_t
->domain_guid
, ps
, depth
))
3766 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3769 if (!prs_uint32("ptr_forest_name", ps
, depth
, &r_t
->ptr_forest_name
))
3772 if (!prs_uint32("dc_flags", ps
, depth
, &r_t
->dc_flags
))
3775 if (!prs_uint32("ptr_dc_site_name", ps
, depth
, &r_t
->ptr_dc_site_name
))
3778 if (!prs_uint32("ptr_client_site_name", ps
, depth
,
3779 &r_t
->ptr_client_site_name
))
3785 if (!smb_io_unistr2("dc_unc", &r_t
->uni_dc_unc
,
3786 r_t
->ptr_dc_unc
, ps
, depth
))
3792 if (!smb_io_unistr2("dc_address", &r_t
->uni_dc_address
,
3793 r_t
->ptr_dc_address
, ps
, depth
))
3799 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3800 r_t
->ptr_domain_name
, ps
, depth
))
3806 if (!smb_io_unistr2("forest_name", &r_t
->uni_forest_name
,
3807 r_t
->ptr_forest_name
, ps
, depth
))
3813 if (!smb_io_unistr2("dc_site_name", &r_t
->uni_dc_site_name
,
3814 r_t
->ptr_dc_site_name
, ps
, depth
))
3820 if (!smb_io_unistr2("client_site_name", &r_t
->uni_client_site_name
,
3821 r_t
->ptr_client_site_name
, ps
, depth
))
3827 if (!prs_werror("result", ps
, depth
, &r_t
->result
))
3833 /*******************************************************************
3834 Inits a NET_Q_DSR_GETSITENAME structure.
3835 ********************************************************************/
3837 void init_net_q_dsr_getsitename(NET_Q_DSR_GETSITENAME
*r_t
, const char *computer_name
)
3839 DEBUG(5, ("init_net_q_dsr_getsitename\n"));
3841 r_t
->ptr_computer_name
= (computer_name
!= NULL
);
3842 init_unistr2(&r_t
->uni_computer_name
, computer_name
, UNI_STR_TERMINATE
);
3845 /*******************************************************************
3846 Reads or writes an NET_Q_DSR_GETSITENAME structure.
3847 ********************************************************************/
3849 BOOL
net_io_q_dsr_getsitename(const char *desc
, NET_Q_DSR_GETSITENAME
*r_t
,
3850 prs_struct
*ps
, int depth
)
3855 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getsitename");
3858 if (!prs_uint32("ptr_computer_name", ps
, depth
, &r_t
->ptr_computer_name
))
3861 if (!smb_io_unistr2("computer_name", &r_t
->uni_computer_name
,
3862 r_t
->ptr_computer_name
, ps
, depth
))
3871 /*******************************************************************
3872 Reads or writes an NET_R_DSR_GETSITENAME structure.
3873 ********************************************************************/
3875 BOOL
net_io_r_dsr_getsitename(const char *desc
, NET_R_DSR_GETSITENAME
*r_t
,
3876 prs_struct
*ps
, int depth
)
3881 prs_debug(ps
, depth
, desc
, "net_io_r_dsr_getsitename");
3884 if (!prs_uint32("ptr_site_name", ps
, depth
, &r_t
->ptr_site_name
))
3890 if (!smb_io_unistr2("site_name", &r_t
->uni_site_name
,
3891 r_t
->ptr_site_name
, ps
, depth
))
3897 if (!prs_werror("result", ps
, depth
, &r_t
->result
))