2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997.
7 * Copyright (C) Jean François Micouleau 2002.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #define DBGC_CLASS DBGC_RPC_PARSE
29 /*******************************************************************
30 Reads or writes a structure.
31 ********************************************************************/
33 static BOOL
net_io_neg_flags(const char *desc
, NEG_FLAGS
*neg
, prs_struct
*ps
, int depth
)
38 prs_debug(ps
, depth
, desc
, "net_io_neg_flags");
44 if(!prs_uint32("neg_flags", ps
, depth
, &neg
->neg_flags
))
50 /*******************************************************************
51 Inits a NETLOGON_INFO_3 structure.
52 ********************************************************************/
54 static void init_netinfo_3(NETLOGON_INFO_3
*info
, uint32 flags
, uint32 logon_attempts
)
57 info
->logon_attempts
= logon_attempts
;
58 info
->reserved_1
= 0x0;
59 info
->reserved_2
= 0x0;
60 info
->reserved_3
= 0x0;
61 info
->reserved_4
= 0x0;
62 info
->reserved_5
= 0x0;
65 /*******************************************************************
66 Reads or writes a NETLOGON_INFO_3 structure.
67 ********************************************************************/
69 static BOOL
net_io_netinfo_3(const char *desc
, NETLOGON_INFO_3
*info
, prs_struct
*ps
, int depth
)
74 prs_debug(ps
, depth
, desc
, "net_io_netinfo_3");
80 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
82 if(!prs_uint32("logon_attempts", ps
, depth
, &info
->logon_attempts
))
84 if(!prs_uint32("reserved_1 ", ps
, depth
, &info
->reserved_1
))
86 if(!prs_uint32("reserved_2 ", ps
, depth
, &info
->reserved_2
))
88 if(!prs_uint32("reserved_3 ", ps
, depth
, &info
->reserved_3
))
90 if(!prs_uint32("reserved_4 ", ps
, depth
, &info
->reserved_4
))
92 if(!prs_uint32("reserved_5 ", ps
, depth
, &info
->reserved_5
))
99 /*******************************************************************
100 Inits a NETLOGON_INFO_1 structure.
101 ********************************************************************/
103 static void init_netinfo_1(NETLOGON_INFO_1
*info
, uint32 flags
, uint32 pdc_status
)
106 info
->pdc_status
= pdc_status
;
109 /*******************************************************************
110 Reads or writes a NETLOGON_INFO_1 structure.
111 ********************************************************************/
113 static BOOL
net_io_netinfo_1(const char *desc
, NETLOGON_INFO_1
*info
, prs_struct
*ps
, int depth
)
118 prs_debug(ps
, depth
, desc
, "net_io_netinfo_1");
124 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
126 if(!prs_uint32("pdc_status", ps
, depth
, &info
->pdc_status
))
132 /*******************************************************************
133 Inits a NETLOGON_INFO_2 structure.
134 ********************************************************************/
136 static void init_netinfo_2(NETLOGON_INFO_2
*info
, uint32 flags
, uint32 pdc_status
,
137 uint32 tc_status
, const char *trusted_dc_name
)
140 info
->pdc_status
= pdc_status
;
141 info
->ptr_trusted_dc_name
= 1;
142 info
->tc_status
= tc_status
;
144 if (trusted_dc_name
!= NULL
)
145 init_unistr2(&info
->uni_trusted_dc_name
, trusted_dc_name
, UNI_STR_TERMINATE
);
147 init_unistr2(&info
->uni_trusted_dc_name
, "", UNI_STR_TERMINATE
);
150 /*******************************************************************
151 Reads or writes a NETLOGON_INFO_2 structure.
152 ********************************************************************/
154 static BOOL
net_io_netinfo_2(const char *desc
, NETLOGON_INFO_2
*info
, prs_struct
*ps
, int depth
)
159 prs_debug(ps
, depth
, desc
, "net_io_netinfo_2");
165 if(!prs_uint32("flags ", ps
, depth
, &info
->flags
))
167 if(!prs_uint32("pdc_status ", ps
, depth
, &info
->pdc_status
))
169 if(!prs_uint32("ptr_trusted_dc_name", ps
, depth
, &info
->ptr_trusted_dc_name
))
171 if(!prs_uint32("tc_status ", ps
, depth
, &info
->tc_status
))
174 if (info
->ptr_trusted_dc_name
!= 0) {
175 if(!smb_io_unistr2("unistr2", &info
->uni_trusted_dc_name
, info
->ptr_trusted_dc_name
, ps
, depth
))
185 static BOOL
net_io_ctrl_data_info_5(const char *desc
, CTRL_DATA_INFO_5
*info
, prs_struct
*ps
, int depth
)
190 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_5");
193 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
196 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
199 if ( info
->ptr_domain
) {
200 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
207 static BOOL
net_io_ctrl_data_info_6(const char *desc
, CTRL_DATA_INFO_6
*info
, prs_struct
*ps
, int depth
)
212 prs_debug(ps
, depth
, desc
, "net_io_ctrl_data_info_6");
215 if ( !prs_uint32( "function_code", ps
, depth
, &info
->function_code
) )
218 if(!prs_uint32("ptr_domain", ps
, depth
, &info
->ptr_domain
))
221 if ( info
->ptr_domain
) {
222 if(!smb_io_unistr2("domain", &info
->domain
, info
->ptr_domain
, ps
, depth
))
229 /*******************************************************************
230 Reads or writes an NET_Q_LOGON_CTRL2 structure.
231 ********************************************************************/
233 BOOL
net_io_q_logon_ctrl2(const char *desc
, NET_Q_LOGON_CTRL2
*q_l
, prs_struct
*ps
, int depth
)
238 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl2");
244 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
247 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
253 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
255 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
257 switch ( q_l
->function_code
) {
258 case NETLOGON_CONTROL_REDISCOVER
:
259 if ( !net_io_ctrl_data_info_5( "ctrl_data_info5", &q_l
->info
.info5
, ps
, depth
) )
263 case NETLOGON_CONTROL_TC_QUERY
:
264 if ( !net_io_ctrl_data_info_6( "ctrl_data_info6", &q_l
->info
.info6
, ps
, depth
) )
269 DEBUG(0,("net_io_q_logon_ctrl2: unknown function_code [%d]\n",
270 q_l
->function_code
));
277 /*******************************************************************
278 Inits an NET_Q_LOGON_CTRL2 structure.
279 ********************************************************************/
281 void init_net_q_logon_ctrl2(NET_Q_LOGON_CTRL2
*q_l
, const char *srv_name
,
284 DEBUG(5,("init_q_logon_ctrl2\n"));
286 q_l
->function_code
= 0x01;
287 q_l
->query_level
= query_level
;
289 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
292 /*******************************************************************
293 Inits an NET_R_LOGON_CTRL2 structure.
294 ********************************************************************/
296 void init_net_r_logon_ctrl2(NET_R_LOGON_CTRL2
*r_l
, uint32 query_level
,
297 uint32 flags
, uint32 pdc_status
,
298 uint32 logon_attempts
, uint32 tc_status
,
299 const char *trusted_domain_name
)
301 r_l
->switch_value
= query_level
;
303 switch (query_level
) {
305 r_l
->ptr
= 1; /* undocumented pointer */
306 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
307 r_l
->status
= NT_STATUS_OK
;
310 r_l
->ptr
= 1; /* undocumented pointer */
311 init_netinfo_2(&r_l
->logon
.info2
, flags
, pdc_status
,
312 tc_status
, trusted_domain_name
);
313 r_l
->status
= NT_STATUS_OK
;
316 r_l
->ptr
= 1; /* undocumented pointer */
317 init_netinfo_3(&r_l
->logon
.info3
, flags
, logon_attempts
);
318 r_l
->status
= NT_STATUS_OK
;
321 DEBUG(2,("init_r_logon_ctrl2: unsupported switch value %d\n",
323 r_l
->ptr
= 0; /* undocumented pointer */
325 /* take a guess at an error code... */
326 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
331 /*******************************************************************
332 Reads or writes an NET_R_LOGON_CTRL2 structure.
333 ********************************************************************/
335 BOOL
net_io_r_logon_ctrl2(const char *desc
, NET_R_LOGON_CTRL2
*r_l
, prs_struct
*ps
, int depth
)
340 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl2");
343 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
345 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
349 switch (r_l
->switch_value
) {
351 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
355 if(!net_io_netinfo_2("", &r_l
->logon
.info2
, ps
, depth
))
359 if(!net_io_netinfo_3("", &r_l
->logon
.info3
, ps
, depth
))
363 DEBUG(2,("net_io_r_logon_ctrl2: unsupported switch value %d\n",
369 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
375 /*******************************************************************
376 Reads or writes an NET_Q_LOGON_CTRL structure.
377 ********************************************************************/
379 BOOL
net_io_q_logon_ctrl(const char *desc
, NET_Q_LOGON_CTRL
*q_l
, prs_struct
*ps
,
382 prs_debug(ps
, depth
, desc
, "net_io_q_logon_ctrl");
388 if(!prs_uint32("ptr ", ps
, depth
, &q_l
->ptr
))
391 if(!smb_io_unistr2 ("", &q_l
->uni_server_name
, q_l
->ptr
, ps
, depth
))
397 if(!prs_uint32("function_code", ps
, depth
, &q_l
->function_code
))
399 if(!prs_uint32("query_level ", ps
, depth
, &q_l
->query_level
))
405 /*******************************************************************
406 Inits an NET_Q_LOGON_CTRL structure.
407 ********************************************************************/
409 void init_net_q_logon_ctrl(NET_Q_LOGON_CTRL
*q_l
, const char *srv_name
,
412 DEBUG(5,("init_q_logon_ctrl\n"));
414 q_l
->function_code
= 0x01; /* ??? */
415 q_l
->query_level
= query_level
;
417 init_unistr2(&q_l
->uni_server_name
, srv_name
, UNI_STR_TERMINATE
);
420 /*******************************************************************
421 Inits an NET_R_LOGON_CTRL structure.
422 ********************************************************************/
424 void init_net_r_logon_ctrl(NET_R_LOGON_CTRL
*r_l
, uint32 query_level
,
425 uint32 flags
, uint32 pdc_status
)
427 DEBUG(5,("init_r_logon_ctrl\n"));
429 r_l
->switch_value
= query_level
; /* should only be 0x1 */
431 switch (query_level
) {
433 r_l
->ptr
= 1; /* undocumented pointer */
434 init_netinfo_1(&r_l
->logon
.info1
, flags
, pdc_status
);
435 r_l
->status
= NT_STATUS_OK
;
438 DEBUG(2,("init_r_logon_ctrl: unsupported switch value %d\n",
440 r_l
->ptr
= 0; /* undocumented pointer */
442 /* take a guess at an error code... */
443 r_l
->status
= NT_STATUS_INVALID_INFO_CLASS
;
448 /*******************************************************************
449 Reads or writes an NET_R_LOGON_CTRL structure.
450 ********************************************************************/
452 BOOL
net_io_r_logon_ctrl(const char *desc
, NET_R_LOGON_CTRL
*r_l
, prs_struct
*ps
,
455 prs_debug(ps
, depth
, desc
, "net_io_r_logon_ctrl");
458 if(!prs_uint32("switch_value ", ps
, depth
, &r_l
->switch_value
))
460 if(!prs_uint32("ptr ", ps
, depth
, &r_l
->ptr
))
464 switch (r_l
->switch_value
) {
466 if(!net_io_netinfo_1("", &r_l
->logon
.info1
, ps
, depth
))
470 DEBUG(2,("net_io_r_logon_ctrl: unsupported switch value %d\n",
476 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
482 /*******************************************************************
483 Inits an NET_R_GETDCNAME structure.
484 ********************************************************************/
485 void init_net_q_getdcname(NET_Q_GETDCNAME
*r_t
, const char *logon_server
,
486 const char *domainname
)
488 DEBUG(5,("init_r_getdcname\n"));
490 r_t
->ptr_logon_server
= (logon_server
!= NULL
);
491 init_unistr2(&r_t
->uni_logon_server
, logon_server
, UNI_STR_TERMINATE
);
492 r_t
->ptr_domainname
= (domainname
!= NULL
);
493 init_unistr2(&r_t
->uni_domainname
, domainname
, UNI_STR_TERMINATE
);
496 /*******************************************************************
497 Reads or writes an NET_Q_GETDCNAME structure.
498 ********************************************************************/
500 BOOL
net_io_q_getdcname(const char *desc
, NET_Q_GETDCNAME
*r_t
, prs_struct
*ps
,
506 prs_debug(ps
, depth
, desc
, "net_io_q_getdcname");
509 if (!prs_uint32("ptr_logon_server", ps
, depth
, &r_t
->ptr_logon_server
))
512 if (!smb_io_unistr2("logon_server", &r_t
->uni_logon_server
,
513 r_t
->ptr_logon_server
, ps
, depth
))
519 if (!prs_uint32("ptr_domainname", ps
, depth
, &r_t
->ptr_domainname
))
522 if (!smb_io_unistr2("domainname", &r_t
->uni_domainname
,
523 r_t
->ptr_domainname
, ps
, depth
))
530 /*******************************************************************
531 Inits an NET_R_GETDCNAME structure.
532 ********************************************************************/
533 void init_net_r_getdcname(NET_R_GETDCNAME
*r_t
, const char *dcname
)
535 DEBUG(5,("init_r_getdcname\n"));
537 init_unistr2(&r_t
->uni_dcname
, dcname
, UNI_STR_TERMINATE
);
540 /*******************************************************************
541 Reads or writes an NET_R_GETDCNAME structure.
542 ********************************************************************/
544 BOOL
net_io_r_getdcname(const char *desc
, NET_R_GETDCNAME
*r_t
, prs_struct
*ps
,
550 prs_debug(ps
, depth
, desc
, "net_io_r_getdcname");
553 if (!prs_uint32("ptr_dcname", ps
, depth
, &r_t
->ptr_dcname
))
556 if (!smb_io_unistr2("dcname", &r_t
->uni_dcname
,
557 r_t
->ptr_dcname
, ps
, depth
))
563 if (!prs_ntstatus("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 Init DOM_SID2 array from a string containing multiple sids
1001 *************************************************************************/
1003 static int init_dom_sid2s(TALLOC_CTX
*ctx
, const char *sids_str
, DOM_SID2
**ppsids
)
1009 DEBUG(4,("init_dom_sid2s: %s\n", sids_str
? sids_str
:""));
1017 /* Count the number of valid SIDs. */
1018 for (count
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
1020 if (string_to_sid(&tmpsid
, s2
))
1024 /* Now allocate space for them. */
1025 *ppsids
= TALLOC_ZERO_ARRAY(ctx
, DOM_SID2
, count
);
1026 if (*ppsids
== NULL
)
1031 for (number
= 0, ptr
= sids_str
; next_token(&ptr
, s2
, NULL
, sizeof(s2
)); ) {
1033 if (string_to_sid(&tmpsid
, s2
)) {
1034 /* count only valid sids */
1035 init_dom_sid2(&sids
[number
], &tmpsid
);
1044 /*******************************************************************
1045 Inits a NET_ID_INFO_1 structure.
1046 ********************************************************************/
1048 void init_id_info1(NET_ID_INFO_1
*id
, const char *domain_name
,
1049 uint32 param_ctrl
, uint32 log_id_low
, uint32 log_id_high
,
1050 const char *user_name
, const char *wksta_name
,
1051 const char *sess_key
,
1052 unsigned char lm_cypher
[16], unsigned char nt_cypher
[16])
1054 unsigned char lm_owf
[16];
1055 unsigned char nt_owf
[16];
1057 DEBUG(5,("init_id_info1: %d\n", __LINE__
));
1059 id
->ptr_id_info1
= 1;
1061 id
->param_ctrl
= param_ctrl
;
1062 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1065 if (lm_cypher
&& nt_cypher
) {
1066 unsigned char key
[16];
1067 #ifdef DEBUG_PASSWORD
1068 DEBUG(100,("lm cypher:"));
1069 dump_data(100, (char *)lm_cypher
, 16);
1071 DEBUG(100,("nt cypher:"));
1072 dump_data(100, (char *)nt_cypher
, 16);
1076 memcpy(key
, sess_key
, 8);
1078 memcpy(lm_owf
, lm_cypher
, 16);
1079 SamOEMhash(lm_owf
, key
, 16);
1080 memcpy(nt_owf
, nt_cypher
, 16);
1081 SamOEMhash(nt_owf
, key
, 16);
1083 #ifdef DEBUG_PASSWORD
1084 DEBUG(100,("encrypt of lm owf password:"));
1085 dump_data(100, (char *)lm_owf
, 16);
1087 DEBUG(100,("encrypt of nt owf password:"));
1088 dump_data(100, (char *)nt_owf
, 16);
1090 /* set up pointers to cypher blocks */
1095 init_owf_info(&id
->lm_owf
, lm_cypher
);
1096 init_owf_info(&id
->nt_owf
, nt_cypher
);
1098 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1099 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1100 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1101 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1102 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1103 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1106 /*******************************************************************
1107 Reads or writes an NET_ID_INFO_1 structure.
1108 ********************************************************************/
1110 static BOOL
net_io_id_info1(const char *desc
, NET_ID_INFO_1
*id
, prs_struct
*ps
, int depth
)
1115 prs_debug(ps
, depth
, desc
, "net_io_id_info1");
1121 if(!prs_uint32("ptr_id_info1", ps
, depth
, &id
->ptr_id_info1
))
1124 if (id
->ptr_id_info1
!= 0) {
1125 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1128 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1130 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1133 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1135 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1138 if(!smb_io_owf_info("", &id
->lm_owf
, ps
, depth
))
1140 if(!smb_io_owf_info("", &id
->nt_owf
, ps
, depth
))
1143 if(!smb_io_unistr2("unistr2", &id
->uni_domain_name
,
1144 id
->hdr_domain_name
.buffer
, ps
, depth
))
1146 if(!smb_io_unistr2("unistr2", &id
->uni_user_name
,
1147 id
->hdr_user_name
.buffer
, ps
, depth
))
1149 if(!smb_io_unistr2("unistr2", &id
->uni_wksta_name
,
1150 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1157 /*******************************************************************
1158 Inits a NET_ID_INFO_2 structure.
1160 This is a network logon packet. The log_id parameters
1161 are what an NT server would generate for LUID once the
1162 user is logged on. I don't think we care about them.
1164 Note that this has no access to the NT and LM hashed passwords,
1165 so it forwards the challenge, and the NT and LM responses (24
1166 bytes each) over the secure channel to the Domain controller
1167 for it to say yea or nay. This is the preferred method of
1168 checking for a logon as it doesn't export the password
1169 hashes to anyone who has compromised the secure channel. JRA.
1170 ********************************************************************/
1172 void init_id_info2(NET_ID_INFO_2
* id
, const char *domain_name
,
1174 uint32 log_id_low
, uint32 log_id_high
,
1175 const char *user_name
, const char *wksta_name
,
1176 const uchar lm_challenge
[8],
1177 const uchar
* lm_chal_resp
, size_t lm_chal_resp_len
,
1178 const uchar
* nt_chal_resp
, size_t nt_chal_resp_len
)
1181 DEBUG(5,("init_id_info2: %d\n", __LINE__
));
1183 id
->ptr_id_info2
= 1;
1185 id
->param_ctrl
= param_ctrl
;
1186 init_logon_id(&id
->logon_id
, log_id_low
, log_id_high
);
1188 memcpy(id
->lm_chal
, lm_challenge
, sizeof(id
->lm_chal
));
1189 init_str_hdr(&id
->hdr_nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
, (nt_chal_resp
!= NULL
) ? 1 : 0);
1190 init_str_hdr(&id
->hdr_lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
, (lm_chal_resp
!= NULL
) ? 1 : 0);
1192 init_unistr2(&id
->uni_domain_name
, domain_name
, UNI_FLAGS_NONE
);
1193 init_uni_hdr(&id
->hdr_domain_name
, &id
->uni_domain_name
);
1194 init_unistr2(&id
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1195 init_uni_hdr(&id
->hdr_user_name
, &id
->uni_user_name
);
1196 init_unistr2(&id
->uni_wksta_name
, wksta_name
, UNI_FLAGS_NONE
);
1197 init_uni_hdr(&id
->hdr_wksta_name
, &id
->uni_wksta_name
);
1199 init_string2(&id
->nt_chal_resp
, (const char *)nt_chal_resp
, nt_chal_resp_len
, nt_chal_resp_len
);
1200 init_string2(&id
->lm_chal_resp
, (const char *)lm_chal_resp
, lm_chal_resp_len
, lm_chal_resp_len
);
1204 /*******************************************************************
1205 Reads or writes an NET_ID_INFO_2 structure.
1206 ********************************************************************/
1208 static BOOL
net_io_id_info2(const char *desc
, NET_ID_INFO_2
*id
, prs_struct
*ps
, int depth
)
1213 prs_debug(ps
, depth
, desc
, "net_io_id_info2");
1219 if(!prs_uint32("ptr_id_info2", ps
, depth
, &id
->ptr_id_info2
))
1222 if (id
->ptr_id_info2
!= 0) {
1223 if(!smb_io_unihdr("unihdr", &id
->hdr_domain_name
, ps
, depth
))
1226 if(!prs_uint32("param_ctrl", ps
, depth
, &id
->param_ctrl
))
1228 if(!smb_io_logon_id("", &id
->logon_id
, ps
, depth
))
1231 if(!smb_io_unihdr("unihdr", &id
->hdr_user_name
, ps
, depth
))
1233 if(!smb_io_unihdr("unihdr", &id
->hdr_wksta_name
, ps
, depth
))
1236 if(!prs_uint8s (False
, "lm_chal", ps
, depth
, id
->lm_chal
, 8)) /* lm 8 byte challenge */
1239 if(!smb_io_strhdr("hdr_nt_chal_resp", &id
->hdr_nt_chal_resp
, ps
, depth
))
1241 if(!smb_io_strhdr("hdr_lm_chal_resp", &id
->hdr_lm_chal_resp
, ps
, depth
))
1244 if(!smb_io_unistr2("uni_domain_name", &id
->uni_domain_name
,
1245 id
->hdr_domain_name
.buffer
, ps
, depth
))
1247 if(!smb_io_unistr2("uni_user_name ", &id
->uni_user_name
,
1248 id
->hdr_user_name
.buffer
, ps
, depth
))
1250 if(!smb_io_unistr2("uni_wksta_name ", &id
->uni_wksta_name
,
1251 id
->hdr_wksta_name
.buffer
, ps
, depth
))
1253 if(!smb_io_string2("nt_chal_resp", &id
->nt_chal_resp
,
1254 id
->hdr_nt_chal_resp
.buffer
, ps
, depth
))
1256 if(!smb_io_string2("lm_chal_resp", &id
->lm_chal_resp
,
1257 id
->hdr_lm_chal_resp
.buffer
, ps
, depth
))
1265 /*******************************************************************
1266 Inits a DOM_SAM_INFO structure.
1267 ********************************************************************/
1269 void init_sam_info(DOM_SAM_INFO
*sam
,
1270 const char *logon_srv
, const char *comp_name
,
1271 DOM_CRED
*clnt_cred
,
1272 DOM_CRED
*rtn_cred
, uint16 logon_level
,
1273 NET_ID_INFO_CTR
*ctr
)
1275 DEBUG(5,("init_sam_info: %d\n", __LINE__
));
1277 init_clnt_info2(&sam
->client
, logon_srv
, comp_name
, clnt_cred
);
1279 if (rtn_cred
!= NULL
) {
1280 sam
->ptr_rtn_cred
= 1;
1281 memcpy(&sam
->rtn_cred
, rtn_cred
, sizeof(sam
->rtn_cred
));
1283 sam
->ptr_rtn_cred
= 0;
1286 sam
->logon_level
= logon_level
;
1290 /*******************************************************************
1291 Reads or writes a DOM_SAM_INFO structure.
1292 ********************************************************************/
1294 static BOOL
net_io_id_info_ctr(const char *desc
, NET_ID_INFO_CTR
**pp_ctr
, prs_struct
*ps
, int depth
)
1296 NET_ID_INFO_CTR
*ctr
= *pp_ctr
;
1298 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1301 if (UNMARSHALLING(ps
)) {
1302 ctr
= *pp_ctr
= PRS_ALLOC_MEM(ps
, NET_ID_INFO_CTR
, 1);
1310 /* don't 4-byte align here! */
1312 if(!prs_uint16("switch_value ", ps
, depth
, &ctr
->switch_value
))
1315 switch (ctr
->switch_value
) {
1317 if(!net_io_id_info1("", &ctr
->auth
.id1
, ps
, depth
))
1321 if(!net_io_id_info2("", &ctr
->auth
.id2
, ps
, depth
))
1326 DEBUG(4,("smb_io_sam_info: unknown switch_value!\n"));
1333 /*******************************************************************
1334 Reads or writes a DOM_SAM_INFO structure.
1335 ********************************************************************/
1337 static BOOL
smb_io_sam_info(const char *desc
, DOM_SAM_INFO
*sam
, prs_struct
*ps
, int depth
)
1342 prs_debug(ps
, depth
, desc
, "smb_io_sam_info");
1348 if(!smb_io_clnt_info2("", &sam
->client
, ps
, depth
))
1351 if(!prs_uint32("ptr_rtn_cred ", ps
, depth
, &sam
->ptr_rtn_cred
))
1353 if(!smb_io_cred("", &sam
->rtn_cred
, ps
, depth
))
1356 if(!prs_uint16("logon_level ", ps
, depth
, &sam
->logon_level
))
1359 if (sam
->logon_level
!= 0) {
1360 if(!net_io_id_info_ctr("logon_info", &sam
->ctr
, ps
, depth
))
1367 /*************************************************************************
1368 Inits a NET_USER_INFO_3 structure.
1370 This is a network logon reply packet, and contains much information about
1371 the user. This information is passed as a (very long) paramater list
1372 to avoid having to link in the PASSDB code to every program that deals
1374 *************************************************************************/
1376 void init_net_user_info3(TALLOC_CTX
*ctx
, NET_USER_INFO_3
*usr
,
1380 const char* user_name
,
1381 const char* full_name
,
1382 const char* home_dir
,
1383 const char* dir_drive
,
1384 const char* logon_script
,
1385 const char* profile_path
,
1387 time_t unix_logon_time
,
1388 time_t unix_logoff_time
,
1389 time_t unix_kickoff_time
,
1390 time_t unix_pass_last_set_time
,
1391 time_t unix_pass_can_change_time
,
1392 time_t unix_pass_must_change_time
,
1394 uint16 logon_count
, uint16 bad_pw_count
,
1395 uint32 num_groups
, const DOM_GID
*gids
,
1396 uint32 user_flgs
, uchar user_session_key
[16],
1397 uchar lm_session_key
[16],
1398 const char *logon_srv
, const char *logon_dom
,
1399 const DOM_SID
*dom_sid
, const char *other_sids
)
1401 /* only cope with one "other" sid, right now. */
1402 /* need to count the number of space-delimited sids */
1404 int num_other_sids
= 0;
1406 NTTIME logon_time
, logoff_time
, kickoff_time
,
1407 pass_last_set_time
, pass_can_change_time
,
1408 pass_must_change_time
;
1412 usr
->ptr_user_info
= 1; /* yes, we're bothering to put USER_INFO data here */
1414 /* Create NTTIME structs */
1415 unix_to_nt_time (&logon_time
, unix_logon_time
);
1416 unix_to_nt_time (&logoff_time
, unix_logoff_time
);
1417 unix_to_nt_time (&kickoff_time
, unix_kickoff_time
);
1418 unix_to_nt_time (&pass_last_set_time
, unix_pass_last_set_time
);
1419 unix_to_nt_time (&pass_can_change_time
, unix_pass_can_change_time
);
1420 unix_to_nt_time (&pass_must_change_time
, unix_pass_must_change_time
);
1422 usr
->logon_time
= logon_time
;
1423 usr
->logoff_time
= logoff_time
;
1424 usr
->kickoff_time
= kickoff_time
;
1425 usr
->pass_last_set_time
= pass_last_set_time
;
1426 usr
->pass_can_change_time
= pass_can_change_time
;
1427 usr
->pass_must_change_time
= pass_must_change_time
;
1429 usr
->logon_count
= logon_count
;
1430 usr
->bad_pw_count
= bad_pw_count
;
1432 usr
->user_rid
= user_rid
;
1433 usr
->group_rid
= group_rid
;
1434 usr
->num_groups
= num_groups
;
1436 usr
->buffer_groups
= 1; /* indicates fill in groups, below, even if there are none */
1437 usr
->user_flgs
= user_flgs
;
1439 if (user_session_key
!= NULL
)
1440 memcpy(usr
->user_sess_key
, user_session_key
, sizeof(usr
->user_sess_key
));
1442 memset((char *)usr
->user_sess_key
, '\0', sizeof(usr
->user_sess_key
));
1444 usr
->buffer_dom_id
= dom_sid
? 1 : 0; /* yes, we're bothering to put a domain SID in */
1446 memset((char *)usr
->lm_sess_key
, '\0', sizeof(usr
->lm_sess_key
));
1447 memset(&usr
->acct_flags
, '\0', sizeof(usr
->acct_flags
));
1449 for (i
=0; i
<7; i
++) {
1450 memset(&usr
->unknown
[i
], '\0', sizeof(usr
->unknown
));
1453 if (lm_session_key
!= NULL
) {
1454 memcpy(usr
->lm_sess_key
, lm_session_key
, sizeof(usr
->lm_sess_key
));
1457 num_other_sids
= init_dom_sid2s(ctx
, other_sids
, &usr
->other_sids
);
1459 usr
->num_other_sids
= num_other_sids
;
1460 usr
->buffer_other_sids
= (num_other_sids
!= 0) ? 1 : 0;
1462 init_unistr2(&usr
->uni_user_name
, user_name
, UNI_FLAGS_NONE
);
1463 init_uni_hdr(&usr
->hdr_user_name
, &usr
->uni_user_name
);
1464 init_unistr2(&usr
->uni_full_name
, full_name
, UNI_FLAGS_NONE
);
1465 init_uni_hdr(&usr
->hdr_full_name
, &usr
->uni_full_name
);
1466 init_unistr2(&usr
->uni_logon_script
, logon_script
, UNI_FLAGS_NONE
);
1467 init_uni_hdr(&usr
->hdr_logon_script
, &usr
->uni_logon_script
);
1468 init_unistr2(&usr
->uni_profile_path
, profile_path
, UNI_FLAGS_NONE
);
1469 init_uni_hdr(&usr
->hdr_profile_path
, &usr
->uni_profile_path
);
1470 init_unistr2(&usr
->uni_home_dir
, home_dir
, UNI_FLAGS_NONE
);
1471 init_uni_hdr(&usr
->hdr_home_dir
, &usr
->uni_home_dir
);
1472 init_unistr2(&usr
->uni_dir_drive
, dir_drive
, UNI_FLAGS_NONE
);
1473 init_uni_hdr(&usr
->hdr_dir_drive
, &usr
->uni_dir_drive
);
1475 usr
->num_groups2
= num_groups
;
1477 usr
->gids
= TALLOC_ZERO_ARRAY(ctx
,DOM_GID
,num_groups
);
1478 if (usr
->gids
== NULL
&& num_groups
>0)
1481 for (i
= 0; i
< num_groups
; i
++)
1482 usr
->gids
[i
] = gids
[i
];
1484 init_unistr2(&usr
->uni_logon_srv
, logon_srv
, UNI_FLAGS_NONE
);
1485 init_uni_hdr(&usr
->hdr_logon_srv
, &usr
->uni_logon_srv
);
1486 init_unistr2(&usr
->uni_logon_dom
, logon_dom
, UNI_FLAGS_NONE
);
1487 init_uni_hdr(&usr
->hdr_logon_dom
, &usr
->uni_logon_dom
);
1489 init_dom_sid2(&usr
->dom_sid
, dom_sid
);
1490 /* "other" sids are set up above */
1493 /*******************************************************************
1494 This code has been modified to cope with a NET_USER_INFO_2 - which is
1495 exactly the same as a NET_USER_INFO_3, minus the other sids parameters.
1496 We use validation level to determine if we're marshalling a info 2 or
1497 INFO_3 - be we always return an INFO_3. Based on code donated by Marc
1498 Jacobsen at HP. JRA.
1499 ********************************************************************/
1501 BOOL
net_io_user_info3(const char *desc
, NET_USER_INFO_3
*usr
, prs_struct
*ps
,
1502 int depth
, uint16 validation_level
, BOOL kerb_validation_level
)
1509 prs_debug(ps
, depth
, desc
, "net_io_user_info3");
1512 if (UNMARSHALLING(ps
))
1518 if(!prs_uint32("ptr_user_info ", ps
, depth
, &usr
->ptr_user_info
))
1521 if (usr
->ptr_user_info
== 0)
1524 if(!smb_io_time("logon time", &usr
->logon_time
, ps
, depth
)) /* logon time */
1526 if(!smb_io_time("logoff time", &usr
->logoff_time
, ps
, depth
)) /* logoff time */
1528 if(!smb_io_time("kickoff time", &usr
->kickoff_time
, ps
, depth
)) /* kickoff time */
1530 if(!smb_io_time("last set time", &usr
->pass_last_set_time
, ps
, depth
)) /* password last set time */
1532 if(!smb_io_time("can change time", &usr
->pass_can_change_time
, ps
, depth
)) /* password can change time */
1534 if(!smb_io_time("must change time", &usr
->pass_must_change_time
, ps
, depth
)) /* password must change time */
1537 if(!smb_io_unihdr("hdr_user_name", &usr
->hdr_user_name
, ps
, depth
)) /* username unicode string header */
1539 if(!smb_io_unihdr("hdr_full_name", &usr
->hdr_full_name
, ps
, depth
)) /* user's full name unicode string header */
1541 if(!smb_io_unihdr("hdr_logon_script", &usr
->hdr_logon_script
, ps
, depth
)) /* logon script unicode string header */
1543 if(!smb_io_unihdr("hdr_profile_path", &usr
->hdr_profile_path
, ps
, depth
)) /* profile path unicode string header */
1545 if(!smb_io_unihdr("hdr_home_dir", &usr
->hdr_home_dir
, ps
, depth
)) /* home directory unicode string header */
1547 if(!smb_io_unihdr("hdr_dir_drive", &usr
->hdr_dir_drive
, ps
, depth
)) /* home directory drive unicode string header */
1550 if(!prs_uint16("logon_count ", ps
, depth
, &usr
->logon_count
)) /* logon count */
1552 if(!prs_uint16("bad_pw_count ", ps
, depth
, &usr
->bad_pw_count
)) /* bad password count */
1555 if(!prs_uint32("user_rid ", ps
, depth
, &usr
->user_rid
)) /* User RID */
1557 if(!prs_uint32("group_rid ", ps
, depth
, &usr
->group_rid
)) /* Group RID */
1559 if(!prs_uint32("num_groups ", ps
, depth
, &usr
->num_groups
)) /* num groups */
1561 if(!prs_uint32("buffer_groups ", ps
, depth
, &usr
->buffer_groups
)) /* undocumented buffer pointer to groups. */
1563 if(!prs_uint32("user_flgs ", ps
, depth
, &usr
->user_flgs
)) /* user flags */
1566 if(!prs_uint8s(False
, "user_sess_key", ps
, depth
, usr
->user_sess_key
, 16)) /* user session key */
1569 if(!smb_io_unihdr("hdr_logon_srv", &usr
->hdr_logon_srv
, ps
, depth
)) /* logon server unicode string header */
1571 if(!smb_io_unihdr("hdr_logon_dom", &usr
->hdr_logon_dom
, ps
, depth
)) /* logon domain unicode string header */
1574 if(!prs_uint32("buffer_dom_id ", ps
, depth
, &usr
->buffer_dom_id
)) /* undocumented logon domain id pointer */
1577 if(!prs_uint8s(False
, "lm_sess_key", ps
, depth
, usr
->lm_sess_key
, 8)) /* lm session key */
1580 if(!prs_uint32("acct_flags ", ps
, depth
, &usr
->acct_flags
)) /* Account flags */
1583 for (i
= 0; i
< 7; i
++)
1585 if (!prs_uint32("unkown", ps
, depth
, &usr
->unknown
[i
])) /* unknown */
1589 if (validation_level
== 3) {
1590 if(!prs_uint32("num_other_sids", ps
, depth
, &usr
->num_other_sids
)) /* 0 - num_sids */
1592 if(!prs_uint32("buffer_other_sids", ps
, depth
, &usr
->buffer_other_sids
)) /* NULL - undocumented pointer to SIDs. */
1595 if (UNMARSHALLING(ps
)) {
1596 usr
->num_other_sids
= 0;
1597 usr
->buffer_other_sids
= 0;
1601 /* get kerb validation info (not really part of user_info_3) - Guenther */
1603 if (kerb_validation_level
) {
1605 if(!prs_uint32("ptr_res_group_dom_sid", ps
, depth
, &usr
->ptr_res_group_dom_sid
))
1607 if(!prs_uint32("res_group_count", ps
, depth
, &usr
->res_group_count
))
1609 if(!prs_uint32("ptr_res_groups", ps
, depth
, &usr
->ptr_res_groups
))
1613 if(!smb_io_unistr2("uni_user_name", &usr
->uni_user_name
, usr
->hdr_user_name
.buffer
, ps
, depth
)) /* username unicode string */
1615 if(!smb_io_unistr2("uni_full_name", &usr
->uni_full_name
, usr
->hdr_full_name
.buffer
, ps
, depth
)) /* user's full name unicode string */
1617 if(!smb_io_unistr2("uni_logon_script", &usr
->uni_logon_script
, usr
->hdr_logon_script
.buffer
, ps
, depth
)) /* logon script unicode string */
1619 if(!smb_io_unistr2("uni_profile_path", &usr
->uni_profile_path
, usr
->hdr_profile_path
.buffer
, ps
, depth
)) /* profile path unicode string */
1621 if(!smb_io_unistr2("uni_home_dir", &usr
->uni_home_dir
, usr
->hdr_home_dir
.buffer
, ps
, depth
)) /* home directory unicode string */
1623 if(!smb_io_unistr2("uni_dir_drive", &usr
->uni_dir_drive
, usr
->hdr_dir_drive
.buffer
, ps
, depth
)) /* home directory drive unicode string */
1629 if (usr
->num_groups
> 0) {
1631 if(!prs_uint32("num_groups2 ", ps
, depth
, &usr
->num_groups2
)) /* num groups2 */
1634 if (usr
->num_groups
!= usr
->num_groups2
) {
1635 DEBUG(3,("net_io_user_info3: num_groups mismatch! (%d != %d)\n",
1636 usr
->num_groups
, usr
->num_groups2
));
1641 if (UNMARSHALLING(ps
)) {
1642 usr
->gids
= PRS_ALLOC_MEM(ps
, DOM_GID
, usr
->num_groups
);
1643 if (usr
->gids
== NULL
)
1647 for (i
= 0; i
< usr
->num_groups
; i
++) {
1648 if(!smb_io_gid("", &usr
->gids
[i
], ps
, depth
)) /* group info */
1654 if(!smb_io_unistr2("uni_logon_srv", &usr
->uni_logon_srv
, usr
->hdr_logon_srv
.buffer
, ps
, depth
)) /* logon server unicode string */
1656 if(!smb_io_unistr2("uni_logon_dom", &usr
->uni_logon_dom
, usr
->hdr_logon_dom
.buffer
, ps
, depth
)) /* logon domain unicode string */
1659 if(!smb_io_dom_sid2("", &usr
->dom_sid
, ps
, depth
)) /* domain SID */
1662 if (usr
->buffer_other_sids
) {
1664 uint32 num_other_sids
= usr
->num_other_sids
;
1666 if (!(usr
->user_flgs
& LOGON_EXTRA_SIDS
)) {
1667 DEBUG(10,("net_io_user_info3: user_flgs attribute does not have LOGON_EXTRA_SIDS\n"));
1671 if (!prs_uint32("num_other_sids", ps
, depth
,
1675 if (num_other_sids
!= usr
->num_other_sids
)
1678 if (UNMARSHALLING(ps
)) {
1679 usr
->other_sids
= PRS_ALLOC_MEM(ps
, DOM_SID2
, usr
->num_other_sids
);
1680 usr
->other_sids_attrib
=
1681 PRS_ALLOC_MEM(ps
, uint32
, usr
->num_other_sids
);
1683 if ((num_other_sids
!= 0) &&
1684 ((usr
->other_sids
== NULL
) ||
1685 (usr
->other_sids_attrib
== NULL
)))
1689 /* First the pointers to the SIDS and attributes */
1693 for (i
=0; i
<usr
->num_other_sids
; i
++) {
1696 if (!prs_uint32("sid_ptr", ps
, depth
, &ptr
))
1699 if (UNMARSHALLING(ps
) && (ptr
== 0))
1702 if (!prs_uint32("attribute", ps
, depth
,
1703 &usr
->other_sids_attrib
[i
]))
1707 for (i
= 0; i
< usr
->num_other_sids
; i
++) {
1708 if(!smb_io_dom_sid2("", &usr
->other_sids
[i
], ps
, depth
)) /* other domain SIDs */
1718 /*******************************************************************
1719 Reads or writes a structure.
1720 ********************************************************************/
1722 BOOL
net_io_q_sam_logon(const char *desc
, NET_Q_SAM_LOGON
*q_l
, prs_struct
*ps
, int depth
)
1727 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logon");
1733 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
))
1736 if(!prs_align_uint16(ps
))
1739 if(!prs_uint16("validation_level", ps
, depth
, &q_l
->validation_level
))
1745 /*******************************************************************
1746 Reads or writes a structure.
1747 ********************************************************************/
1749 BOOL
net_io_r_sam_logon(const char *desc
, NET_R_SAM_LOGON
*r_l
, prs_struct
*ps
, int depth
)
1754 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logon");
1757 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1759 if (&r_l
->buffer_creds
) {
1760 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1764 if(!prs_uint16("switch_value", ps
, depth
, &r_l
->switch_value
))
1769 #if 1 /* W2k always needs this - even for bad passwd. JRA */
1770 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1773 if (r_l
->switch_value
!= 0) {
1774 if(!net_io_user_info3("", r_l
->user
, ps
, depth
, r_l
->switch_value
, False
))
1779 if(!prs_uint32("auth_resp ", ps
, depth
, &r_l
->auth_resp
)) /* 1 - Authoritative response; 0 - Non-Auth? */
1782 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1791 /*******************************************************************
1792 Reads or writes a structure.
1793 ********************************************************************/
1795 BOOL
net_io_q_sam_logoff(const char *desc
, NET_Q_SAM_LOGOFF
*q_l
, prs_struct
*ps
, int depth
)
1800 prs_debug(ps
, depth
, desc
, "net_io_q_sam_logoff");
1806 if(!smb_io_sam_info("", &q_l
->sam_id
, ps
, depth
)) /* domain SID */
1812 /*******************************************************************
1813 Reads or writes a structure.
1814 ********************************************************************/
1816 BOOL
net_io_r_sam_logoff(const char *desc
, NET_R_SAM_LOGOFF
*r_l
, prs_struct
*ps
, int depth
)
1821 prs_debug(ps
, depth
, desc
, "net_io_r_sam_logoff");
1827 if(!prs_uint32("buffer_creds", ps
, depth
, &r_l
->buffer_creds
)) /* undocumented buffer pointer */
1829 if(!smb_io_cred("", &r_l
->srv_creds
, ps
, depth
)) /* server credentials. server time stamp appears to be ignored. */
1832 if(!prs_ntstatus("status ", ps
, depth
, &r_l
->status
))
1838 /*******************************************************************
1839 makes a NET_Q_SAM_SYNC structure.
1840 ********************************************************************/
1841 BOOL
init_net_q_sam_sync(NET_Q_SAM_SYNC
* q_s
, const char *srv_name
,
1842 const char *cli_name
, DOM_CRED
*cli_creds
,
1843 DOM_CRED
*ret_creds
, uint32 database_id
,
1846 DEBUG(5, ("init_q_sam_sync\n"));
1848 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
1849 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
1852 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
1855 memcpy(&q_s
->ret_creds
, ret_creds
, sizeof(q_s
->ret_creds
));
1857 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
1859 q_s
->database_id
= database_id
;
1860 q_s
->restart_state
= 0;
1861 q_s
->sync_context
= next_rid
;
1862 q_s
->max_size
= 0xffff;
1867 /*******************************************************************
1868 reads or writes a structure.
1869 ********************************************************************/
1870 BOOL
net_io_q_sam_sync(const char *desc
, NET_Q_SAM_SYNC
* q_s
, prs_struct
*ps
,
1873 prs_debug(ps
, depth
, desc
, "net_io_q_sam_sync");
1876 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
1878 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
1881 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
1883 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
1886 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
1888 if (!prs_uint32("restart_state", ps
, depth
, &q_s
->restart_state
))
1890 if (!prs_uint32("sync_context ", ps
, depth
, &q_s
->sync_context
))
1893 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
1899 /*******************************************************************
1900 reads or writes a structure.
1901 ********************************************************************/
1902 static BOOL
net_io_sam_delta_hdr(const char *desc
, SAM_DELTA_HDR
* delta
,
1903 prs_struct
*ps
, int depth
)
1905 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_hdr");
1908 if (!prs_uint16("type", ps
, depth
, &delta
->type
))
1910 if (!prs_uint16("type2", ps
, depth
, &delta
->type2
))
1912 if (!prs_uint32("target_rid", ps
, depth
, &delta
->target_rid
))
1915 if (!prs_uint32("type3", ps
, depth
, &delta
->type3
))
1918 /* Not sure why we need this but it seems to be necessary to get
1919 sam deltas working. */
1921 if (delta
->type
!= 0x16) {
1922 if (!prs_uint32("ptr_delta", ps
, depth
, &delta
->ptr_delta
))
1929 /*******************************************************************
1930 reads or writes a structure.
1931 ********************************************************************/
1932 static BOOL
net_io_sam_delta_mod_count(const char *desc
, SAM_DELTA_MOD_COUNT
*info
,
1933 prs_struct
*ps
, int depth
)
1935 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_stamp");
1938 if (!prs_uint32("seqnum", ps
, depth
, &info
->seqnum
))
1940 if (!prs_uint32("dom_mod_count_ptr", ps
, depth
,
1941 &info
->dom_mod_count_ptr
))
1944 if (info
->dom_mod_count_ptr
) {
1945 if (!prs_uint64("dom_mod_count", ps
, depth
,
1946 &info
->dom_mod_count
))
1953 /*******************************************************************
1954 reads or writes a structure.
1955 ********************************************************************/
1956 static BOOL
net_io_sam_domain_info(const char *desc
, SAM_DOMAIN_INFO
* info
,
1957 prs_struct
*ps
, int depth
)
1959 prs_debug(ps
, depth
, desc
, "net_io_sam_domain_info");
1962 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
1964 if (!smb_io_unihdr("hdr_oem_info", &info
->hdr_oem_info
, ps
, depth
))
1967 if (!prs_uint64("force_logoff", ps
, depth
, &info
->force_logoff
))
1969 if (!prs_uint16("min_pwd_len", ps
, depth
, &info
->min_pwd_len
))
1971 if (!prs_uint16("pwd_history_len", ps
, depth
, &info
->pwd_history_len
))
1973 if (!prs_uint64("max_pwd_age", ps
, depth
, &info
->max_pwd_age
))
1975 if (!prs_uint64("min_pwd_age", ps
, depth
, &info
->min_pwd_age
))
1977 if (!prs_uint64("dom_mod_count", ps
, depth
, &info
->dom_mod_count
))
1979 if (!smb_io_time("creation_time", &info
->creation_time
, ps
, depth
))
1981 if (!prs_uint32("security_information", ps
, depth
, &info
->security_information
))
1983 if (!smb_io_bufhdr4("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
1985 if (!smb_io_lockout_string_hdr("hdr_account_lockout_string", &info
->hdr_account_lockout
, ps
, depth
))
1987 if (!smb_io_unihdr("hdr_unknown2", &info
->hdr_unknown2
, ps
, depth
))
1989 if (!smb_io_unihdr("hdr_unknown3", &info
->hdr_unknown3
, ps
, depth
))
1991 if (!smb_io_unihdr("hdr_unknown4", &info
->hdr_unknown4
, ps
, depth
))
1993 if (!prs_uint32("logon_chgpass", ps
, depth
, &info
->logon_chgpass
))
1995 if (!prs_uint32("unknown6", ps
, depth
, &info
->unknown6
))
1997 if (!prs_uint32("unknown7", ps
, depth
, &info
->unknown7
))
1999 if (!prs_uint32("unknown8", ps
, depth
, &info
->unknown8
))
2002 if (!smb_io_unistr2("uni_dom_name", &info
->uni_dom_name
,
2003 info
->hdr_dom_name
.buffer
, ps
, depth
))
2005 if (!smb_io_unistr2("buf_oem_info", &info
->buf_oem_info
,
2006 info
->hdr_oem_info
.buffer
, ps
, depth
))
2009 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2012 if (!smb_io_account_lockout_str("account_lockout", &info
->account_lockout
,
2013 info
->hdr_account_lockout
.buffer
, ps
, depth
))
2016 if (!smb_io_unistr2("buf_unknown2", &info
->buf_unknown2
,
2017 info
->hdr_unknown2
.buffer
, ps
, depth
))
2019 if (!smb_io_unistr2("buf_unknown3", &info
->buf_unknown3
,
2020 info
->hdr_unknown3
.buffer
, ps
, depth
))
2022 if (!smb_io_unistr2("buf_unknown4", &info
->buf_unknown4
,
2023 info
->hdr_unknown4
.buffer
, ps
, depth
))
2029 /*******************************************************************
2030 reads or writes a structure.
2031 ********************************************************************/
2032 static BOOL
net_io_sam_group_info(const char *desc
, SAM_GROUP_INFO
* info
,
2033 prs_struct
*ps
, int depth
)
2035 prs_debug(ps
, depth
, desc
, "net_io_sam_group_info");
2038 if (!smb_io_unihdr("hdr_grp_name", &info
->hdr_grp_name
, ps
, depth
))
2040 if (!smb_io_gid("gid", &info
->gid
, ps
, depth
))
2042 if (!smb_io_unihdr("hdr_grp_desc", &info
->hdr_grp_desc
, ps
, depth
))
2044 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2047 if (ps
->data_offset
+ 48 > ps
->buffer_size
)
2049 ps
->data_offset
+= 48;
2051 if (!smb_io_unistr2("uni_grp_name", &info
->uni_grp_name
,
2052 info
->hdr_grp_name
.buffer
, ps
, depth
))
2054 if (!smb_io_unistr2("uni_grp_desc", &info
->uni_grp_desc
,
2055 info
->hdr_grp_desc
.buffer
, ps
, depth
))
2057 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2063 /*******************************************************************
2064 reads or writes a structure.
2065 ********************************************************************/
2066 static BOOL
net_io_sam_passwd_info(const char *desc
, SAM_PWD
* pwd
,
2067 prs_struct
*ps
, int depth
)
2069 prs_debug(ps
, depth
, desc
, "net_io_sam_passwd_info");
2072 if (!prs_uint32("unk_0 ", ps
, depth
, &pwd
->unk_0
))
2075 if (!smb_io_unihdr("hdr_lm_pwd", &pwd
->hdr_lm_pwd
, ps
, depth
))
2077 if (!prs_uint8s(False
, "buf_lm_pwd", ps
, depth
, pwd
->buf_lm_pwd
, 16))
2080 if (!smb_io_unihdr("hdr_nt_pwd", &pwd
->hdr_nt_pwd
, ps
, depth
))
2082 if (!prs_uint8s(False
, "buf_nt_pwd", ps
, depth
, pwd
->buf_nt_pwd
, 16))
2085 if (!smb_io_unihdr("", &pwd
->hdr_empty_lm
, ps
, depth
))
2087 if (!smb_io_unihdr("", &pwd
->hdr_empty_nt
, ps
, depth
))
2093 /*******************************************************************
2094 makes a SAM_ACCOUNT_INFO structure.
2095 ********************************************************************/
2096 BOOL
make_sam_account_info(SAM_ACCOUNT_INFO
* info
,
2097 const UNISTR2
*user_name
,
2098 const UNISTR2
*full_name
,
2099 uint32 user_rid
, uint32 group_rid
,
2100 const UNISTR2
*home_dir
,
2101 const UNISTR2
*dir_drive
,
2102 const UNISTR2
*log_scr
,
2103 const UNISTR2
*desc
,
2105 const UNISTR2
*prof_path
,
2106 const UNISTR2
*wkstas
,
2107 const UNISTR2
*unk_str
, const UNISTR2
*mung_dial
)
2109 int len_user_name
= user_name
!= NULL
? user_name
->uni_str_len
: 0;
2110 int len_full_name
= full_name
!= NULL
? full_name
->uni_str_len
: 0;
2111 int len_home_dir
= home_dir
!= NULL
? home_dir
->uni_str_len
: 0;
2112 int len_dir_drive
= dir_drive
!= NULL
? dir_drive
->uni_str_len
: 0;
2113 int len_logon_script
= log_scr
!= NULL
? log_scr
->uni_str_len
: 0;
2114 int len_profile_path
= prof_path
!= NULL
? prof_path
->uni_str_len
: 0;
2115 int len_description
= desc
!= NULL
? desc
->uni_str_len
: 0;
2116 int len_workstations
= wkstas
!= NULL
? wkstas
->uni_str_len
: 0;
2117 int len_unknown_str
= unk_str
!= NULL
? unk_str
->uni_str_len
: 0;
2118 int len_munged_dial
= mung_dial
!= NULL
? mung_dial
->uni_str_len
: 0;
2120 DEBUG(5, ("make_sam_account_info\n"));
2122 make_uni_hdr(&info
->hdr_acct_name
, len_user_name
);
2123 make_uni_hdr(&info
->hdr_full_name
, len_full_name
);
2124 make_uni_hdr(&info
->hdr_home_dir
, len_home_dir
);
2125 make_uni_hdr(&info
->hdr_dir_drive
, len_dir_drive
);
2126 make_uni_hdr(&info
->hdr_logon_script
, len_logon_script
);
2127 make_uni_hdr(&info
->hdr_profile
, len_profile_path
);
2128 make_uni_hdr(&info
->hdr_acct_desc
, len_description
);
2129 make_uni_hdr(&info
->hdr_workstations
, len_workstations
);
2130 make_uni_hdr(&info
->hdr_comment
, len_unknown_str
);
2131 make_uni_hdr(&info
->hdr_parameters
, len_munged_dial
);
2134 make_bufhdr2(&info
->hdr_sec_desc
, 0, 0, 0);
2136 info
->user_rid
= user_rid
;
2137 info
->group_rid
= group_rid
;
2139 init_nt_time(&info
->logon_time
);
2140 init_nt_time(&info
->logoff_time
);
2141 init_nt_time(&info
->pwd_last_set_time
);
2142 init_nt_time(&info
->acct_expiry_time
);
2144 info
->logon_divs
= 0xA8;
2145 info
->ptr_logon_hrs
= 0; /* Don't care right now */
2147 info
->bad_pwd_count
= 0;
2148 info
->logon_count
= 0;
2149 info
->acb_info
= acb_info
;
2150 info
->nt_pwd_present
= 0;
2151 info
->lm_pwd_present
= 0;
2152 info
->pwd_expired
= 0;
2156 info
->unknown1
= 0x4EC;
2159 copy_unistr2(&info
->uni_acct_name
, user_name
);
2160 copy_unistr2(&info
->uni_full_name
, full_name
);
2161 copy_unistr2(&info
->uni_home_dir
, home_dir
);
2162 copy_unistr2(&info
->uni_dir_drive
, dir_drive
);
2163 copy_unistr2(&info
->uni_logon_script
, log_scr
);
2164 copy_unistr2(&info
->uni_profile
, prof_path
);
2165 copy_unistr2(&info
->uni_acct_desc
, desc
);
2166 copy_unistr2(&info
->uni_workstations
, wkstas
);
2167 copy_unistr2(&info
->uni_comment
, unk_str
);
2168 copy_unistr2(&info
->uni_parameters
, mung_dial
);
2173 /*******************************************************************
2174 reads or writes a structure.
2175 ********************************************************************/
2176 static BOOL
net_io_sam_account_info(const char *desc
, SAM_ACCOUNT_INFO
*info
,
2177 prs_struct
*ps
, int depth
)
2179 BUFHDR2 hdr_priv_data
;
2182 prs_debug(ps
, depth
, desc
, "net_io_sam_account_info");
2185 if (!smb_io_unihdr("hdr_acct_name", &info
->hdr_acct_name
, ps
, depth
))
2187 if (!smb_io_unihdr("hdr_full_name", &info
->hdr_full_name
, ps
, depth
))
2190 if (!prs_uint32("user_rid ", ps
, depth
, &info
->user_rid
))
2192 if (!prs_uint32("group_rid", ps
, depth
, &info
->group_rid
))
2195 if (!smb_io_unihdr("hdr_home_dir ", &info
->hdr_home_dir
, ps
, depth
))
2197 if (!smb_io_unihdr("hdr_dir_drive", &info
->hdr_dir_drive
, ps
, depth
))
2199 if (!smb_io_unihdr("hdr_logon_script", &info
->hdr_logon_script
, ps
,
2203 if (!smb_io_unihdr("hdr_acct_desc", &info
->hdr_acct_desc
, ps
, depth
))
2205 if (!smb_io_unihdr("hdr_workstations", &info
->hdr_workstations
, ps
,
2209 if (!smb_io_time("logon_time", &info
->logon_time
, ps
, depth
))
2211 if (!smb_io_time("logoff_time", &info
->logoff_time
, ps
, depth
))
2214 if (!prs_uint32("logon_divs ", ps
, depth
, &info
->logon_divs
))
2216 if (!prs_uint32("ptr_logon_hrs", ps
, depth
, &info
->ptr_logon_hrs
))
2219 if (!prs_uint16("bad_pwd_count", ps
, depth
, &info
->bad_pwd_count
))
2221 if (!prs_uint16("logon_count", ps
, depth
, &info
->logon_count
))
2223 if (!smb_io_time("pwd_last_set_time", &info
->pwd_last_set_time
, ps
,
2226 if (!smb_io_time("acct_expiry_time", &info
->acct_expiry_time
, ps
,
2230 if (!prs_uint32("acb_info", ps
, depth
, &info
->acb_info
))
2232 if (!prs_uint8s(False
, "nt_pwd", ps
, depth
, info
->nt_pwd
, 16))
2234 if (!prs_uint8s(False
, "lm_pwd", ps
, depth
, info
->lm_pwd
, 16))
2236 if (!prs_uint8("lm_pwd_present", ps
, depth
, &info
->lm_pwd_present
))
2238 if (!prs_uint8("nt_pwd_present", ps
, depth
, &info
->nt_pwd_present
))
2240 if (!prs_uint8("pwd_expired", ps
, depth
, &info
->pwd_expired
))
2243 if (!smb_io_unihdr("hdr_comment", &info
->hdr_comment
, ps
, depth
))
2245 if (!smb_io_unihdr("hdr_parameters", &info
->hdr_parameters
, ps
,
2248 if (!prs_uint16("country", ps
, depth
, &info
->country
))
2250 if (!prs_uint16("codepage", ps
, depth
, &info
->codepage
))
2253 if (!smb_io_bufhdr2("hdr_priv_data", &hdr_priv_data
, ps
, depth
))
2255 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2257 if (!smb_io_unihdr("hdr_profile", &info
->hdr_profile
, ps
, depth
))
2260 for (i
= 0; i
< 3; i
++)
2262 if (!smb_io_unihdr("hdr_reserved", &info
->hdr_reserved
[i
],
2267 for (i
= 0; i
< 4; i
++)
2269 if (!prs_uint32("dw_reserved", ps
, depth
,
2270 &info
->dw_reserved
[i
]))
2274 if (!smb_io_unistr2("uni_acct_name", &info
->uni_acct_name
,
2275 info
->hdr_acct_name
.buffer
, ps
, depth
))
2278 if (!smb_io_unistr2("uni_full_name", &info
->uni_full_name
,
2279 info
->hdr_full_name
.buffer
, ps
, depth
))
2282 if (!smb_io_unistr2("uni_home_dir ", &info
->uni_home_dir
,
2283 info
->hdr_home_dir
.buffer
, ps
, depth
))
2286 if (!smb_io_unistr2("uni_dir_drive", &info
->uni_dir_drive
,
2287 info
->hdr_dir_drive
.buffer
, ps
, depth
))
2290 if (!smb_io_unistr2("uni_logon_script", &info
->uni_logon_script
,
2291 info
->hdr_logon_script
.buffer
, ps
, depth
))
2294 if (!smb_io_unistr2("uni_acct_desc", &info
->uni_acct_desc
,
2295 info
->hdr_acct_desc
.buffer
, ps
, depth
))
2298 if (!smb_io_unistr2("uni_workstations", &info
->uni_workstations
,
2299 info
->hdr_workstations
.buffer
, ps
, depth
))
2303 if (!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2305 if (!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2308 if (!smb_io_rpc_blob("buf_logon_hrs", &info
->buf_logon_hrs
, ps
, depth
))
2311 if (!smb_io_unistr2("uni_comment", &info
->uni_comment
,
2312 info
->hdr_comment
.buffer
, ps
, depth
))
2315 if (!smb_io_unistr2("uni_parameters", &info
->uni_parameters
,
2316 info
->hdr_parameters
.buffer
, ps
, depth
))
2319 if (hdr_priv_data
.buffer
!= 0)
2323 if (!prs_uint32("pwd_len", ps
, depth
, &len
))
2325 old_offset
= ps
->data_offset
;
2331 if (!prs_hash1(ps
, ps
->data_offset
, len
))
2334 if (!net_io_sam_passwd_info("pass", &info
->pass
,
2341 if (!prs_hash1(ps
, old_offset
, len
))
2345 if (old_offset
+ len
> ps
->buffer_size
)
2347 ps
->data_offset
= old_offset
+ len
;
2349 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2352 if (!smb_io_unistr2("uni_profile", &info
->uni_profile
,
2353 info
->hdr_profile
.buffer
, ps
, depth
))
2361 /*******************************************************************
2362 reads or writes a structure.
2363 ********************************************************************/
2364 static BOOL
net_io_sam_group_mem_info(const char *desc
, SAM_GROUP_MEM_INFO
* info
,
2365 prs_struct
*ps
, int depth
)
2370 prs_debug(ps
, depth
, desc
, "net_io_sam_group_mem_info");
2374 if (!prs_uint32("ptr_rids ", ps
, depth
, &info
->ptr_rids
))
2376 if (!prs_uint32("ptr_attribs", ps
, depth
, &info
->ptr_attribs
))
2378 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2381 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2383 ps
->data_offset
+= 16;
2385 if (info
->ptr_rids
!= 0)
2387 if (!prs_uint32("num_members2", ps
, depth
,
2388 &info
->num_members2
))
2391 if (info
->num_members2
!= info
->num_members
)
2397 info
->rids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members2
);
2399 if (info
->rids
== NULL
) {
2400 DEBUG(0, ("out of memory allocating %d rids\n",
2401 info
->num_members2
));
2405 for (i
= 0; i
< info
->num_members2
; i
++)
2407 slprintf(tmp
, sizeof(tmp
) - 1, "rids[%02d]", i
);
2408 if (!prs_uint32(tmp
, ps
, depth
, &info
->rids
[i
]))
2413 if (info
->ptr_attribs
!= 0)
2415 if (!prs_uint32("num_members3", ps
, depth
,
2416 &info
->num_members3
))
2418 if (info
->num_members3
!= info
->num_members
)
2424 info
->attribs
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_members3
);
2426 if (info
->attribs
== NULL
) {
2427 DEBUG(0, ("out of memory allocating %d attribs\n",
2428 info
->num_members3
));
2432 for (i
= 0; i
< info
->num_members3
; i
++)
2434 slprintf(tmp
, sizeof(tmp
) - 1, "attribs[%02d]", i
);
2435 if (!prs_uint32(tmp
, ps
, depth
, &info
->attribs
[i
]))
2443 /*******************************************************************
2444 reads or writes a structure.
2445 ********************************************************************/
2446 static BOOL
net_io_sam_alias_info(const char *desc
, SAM_ALIAS_INFO
* info
,
2447 prs_struct
*ps
, int depth
)
2449 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_info");
2452 if (!smb_io_unihdr("hdr_als_name", &info
->hdr_als_name
, ps
, depth
))
2454 if (!prs_uint32("als_rid", ps
, depth
, &info
->als_rid
))
2456 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2458 if (!smb_io_unihdr("hdr_als_desc", &info
->hdr_als_desc
, ps
, depth
))
2461 if (ps
->data_offset
+ 40 > ps
->buffer_size
)
2463 ps
->data_offset
+= 40;
2465 if (!smb_io_unistr2("uni_als_name", &info
->uni_als_name
,
2466 info
->hdr_als_name
.buffer
, ps
, depth
))
2468 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2471 if (!smb_io_unistr2("uni_als_desc", &info
->uni_als_desc
,
2472 info
->hdr_als_desc
.buffer
, ps
, depth
))
2478 /*******************************************************************
2479 reads or writes a structure.
2480 ********************************************************************/
2481 static BOOL
net_io_sam_alias_mem_info(const char *desc
, SAM_ALIAS_MEM_INFO
* info
,
2482 prs_struct
*ps
, int depth
)
2487 prs_debug(ps
, depth
, desc
, "net_io_sam_alias_mem_info");
2491 if (!prs_uint32("num_members", ps
, depth
, &info
->num_members
))
2493 if (!prs_uint32("ptr_members", ps
, depth
, &info
->ptr_members
))
2496 if (ps
->data_offset
+ 16 > ps
->buffer_size
)
2498 ps
->data_offset
+= 16;
2500 if (info
->ptr_members
!= 0)
2502 if (!prs_uint32("num_sids", ps
, depth
, &info
->num_sids
))
2504 if (info
->num_sids
!= info
->num_members
)
2510 info
->ptr_sids
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->num_sids
);
2512 if (info
->ptr_sids
== NULL
) {
2513 DEBUG(0, ("out of memory allocating %d ptr_sids\n",
2518 for (i
= 0; i
< info
->num_sids
; i
++)
2520 slprintf(tmp
, sizeof(tmp
) - 1, "ptr_sids[%02d]", i
);
2521 if (!prs_uint32(tmp
, ps
, depth
, &info
->ptr_sids
[i
]))
2525 info
->sids
= TALLOC_ARRAY(ps
->mem_ctx
, DOM_SID2
, info
->num_sids
);
2527 if (info
->sids
== NULL
) {
2528 DEBUG(0, ("error allocating %d sids\n",
2533 for (i
= 0; i
< info
->num_sids
; i
++)
2535 if (info
->ptr_sids
[i
] != 0)
2537 slprintf(tmp
, sizeof(tmp
) - 1, "sids[%02d]",
2539 if (!smb_io_dom_sid2(tmp
, &info
->sids
[i
],
2549 /*******************************************************************
2550 reads or writes a structure.
2551 ********************************************************************/
2552 static BOOL
net_io_sam_policy_info(const char *desc
, SAM_DELTA_POLICY
*info
,
2553 prs_struct
*ps
, int depth
)
2556 prs_debug(ps
, depth
, desc
, "net_io_sam_policy_info");
2562 if (!prs_uint32("max_log_size", ps
, depth
, &info
->max_log_size
))
2564 if (!prs_uint64("audit_retention_period", ps
, depth
,
2565 &info
->audit_retention_period
))
2567 if (!prs_uint32("auditing_mode", ps
, depth
, &info
->auditing_mode
))
2569 if (!prs_uint32("num_events", ps
, depth
, &info
->num_events
))
2571 if (!prs_uint32("ptr_events", ps
, depth
, &info
->ptr_events
))
2574 if (!smb_io_unihdr("hdr_dom_name", &info
->hdr_dom_name
, ps
, depth
))
2577 if (!prs_uint32("sid_ptr", ps
, depth
, &info
->sid_ptr
))
2580 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2582 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2583 &info
->non_paged_pool_limit
))
2585 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2587 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2589 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2591 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2593 if (!smb_io_time("modify_time", &info
->modify_time
, ps
, depth
))
2595 if (!smb_io_time("create_time", &info
->create_time
, ps
, depth
))
2597 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2600 for (i
=0; i
<4; i
++) {
2602 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2606 for (i
=0; i
<4; i
++) {
2608 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2612 if (!prs_uint32("num_event_audit_options", ps
, depth
,
2613 &info
->num_event_audit_options
))
2616 for (i
=0; i
<info
->num_event_audit_options
; i
++)
2617 if (!prs_uint32("event_audit_option", ps
, depth
,
2618 &info
->event_audit_option
))
2621 if (!smb_io_unistr2("domain_name", &info
->domain_name
, True
, ps
, depth
))
2624 if(!smb_io_dom_sid2("domain_sid", &info
->domain_sid
, ps
, depth
))
2627 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2636 /* This function is pretty broken - see bug #334 */
2638 /*******************************************************************
2639 reads or writes a structure.
2640 ********************************************************************/
2641 static BOOL
net_io_sam_trustdoms_info(const char *desc
, SAM_DELTA_TRUSTDOMS
*info
,
2642 prs_struct
*ps
, int depth
)
2646 prs_debug(ps
, depth
, desc
, "net_io_sam_trustdoms_info");
2652 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2655 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2658 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2661 if(!smb_io_unihdr("hdr_domain", &info
->hdr_domain
, ps
, depth
))
2664 if(!prs_uint32("unknown0", ps
, depth
, &info
->unknown0
))
2666 if(!prs_uint32("unknown1", ps
, depth
, &info
->unknown1
))
2668 if(!prs_uint32("unknown2", ps
, depth
, &info
->unknown2
))
2671 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2673 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2676 for (i
=0; i
<12; i
++)
2677 if(!prs_uint32("unknown3", ps
, depth
, &info
->unknown3
))
2680 if (!smb_io_unistr2("domain", &info
->domain
, True
, ps
, depth
))
2690 /* This function doesn't work - see bug #334 */
2692 /*******************************************************************
2693 reads or writes a structure.
2694 ********************************************************************/
2695 static BOOL
net_io_sam_secret_info(const char *desc
, SAM_DELTA_SECRET
*info
,
2696 prs_struct
*ps
, int depth
)
2700 prs_debug(ps
, depth
, desc
, "net_io_sam_secret_info");
2706 if(!prs_uint32("buf_size", ps
, depth
, &info
->buf_size
))
2709 if(!sec_io_desc("sec_desc", &info
->sec_desc
, ps
, depth
))
2712 if (!smb_io_unistr2("secret", &info
->secret
, True
, ps
, depth
))
2718 if(!prs_uint32("count1", ps
, depth
, &info
->count1
))
2720 if(!prs_uint32("count2", ps
, depth
, &info
->count2
))
2722 if(!prs_uint32("ptr", ps
, depth
, &info
->ptr
))
2726 if(!smb_io_time("time1", &info
->time1
, ps
, depth
)) /* logon time */
2728 if(!prs_uint32("count3", ps
, depth
, &info
->count3
))
2730 if(!prs_uint32("count4", ps
, depth
, &info
->count4
))
2732 if(!prs_uint32("ptr2", ps
, depth
, &info
->ptr2
))
2734 if(!smb_io_time("time2", &info
->time2
, ps
, depth
)) /* logon time */
2736 if(!prs_uint32("unknow1", ps
, depth
, &info
->unknow1
))
2740 if(!prs_uint32("buf_size2", ps
, depth
, &info
->buf_size2
))
2742 if(!prs_uint32("ptr3", ps
, depth
, &info
->ptr3
))
2745 if(!prs_uint32("unknow2", ps
, depth
, &info
->unknow2
))
2748 if(!prs_uint32("chal_len", ps
, depth
, &info
->chal_len
))
2750 if(!prs_uint32("reserved1", ps
, depth
, &info
->reserved1
))
2752 if(!prs_uint32("chal_len2", ps
, depth
, &info
->chal_len2
))
2755 if(!prs_uint8s (False
, "chal", ps
, depth
, info
->chal
, info
->chal_len2
))
2758 if(!prs_uint32("key_len", ps
, depth
, &info
->key_len
))
2760 if(!prs_uint32("reserved2", ps
, depth
, &info
->reserved2
))
2762 if(!prs_uint32("key_len2", ps
, depth
, &info
->key_len2
))
2765 if(!prs_uint8s (False
, "key", ps
, depth
, info
->key
, info
->key_len2
))
2769 if(!prs_uint32("buf_size3", ps
, depth
, &info
->buf_size3
))
2772 if(!sec_io_desc("sec_desc2", &info
->sec_desc2
, ps
, depth
))
2781 /*******************************************************************
2782 reads or writes a structure.
2783 ********************************************************************/
2784 static BOOL
net_io_sam_privs_info(const char *desc
, SAM_DELTA_PRIVS
*info
,
2785 prs_struct
*ps
, int depth
)
2789 prs_debug(ps
, depth
, desc
, "net_io_sam_privs_info");
2795 if(!smb_io_dom_sid2("sid", &info
->sid
, ps
, depth
))
2798 if(!prs_uint32("priv_count", ps
, depth
, &info
->priv_count
))
2800 if(!prs_uint32("priv_control", ps
, depth
, &info
->priv_control
))
2803 if(!prs_uint32("priv_attr_ptr", ps
, depth
, &info
->priv_attr_ptr
))
2805 if(!prs_uint32("priv_name_ptr", ps
, depth
, &info
->priv_name_ptr
))
2808 if (!prs_uint32("paged_pool_limit", ps
, depth
, &info
->paged_pool_limit
))
2810 if (!prs_uint32("non_paged_pool_limit", ps
, depth
,
2811 &info
->non_paged_pool_limit
))
2813 if (!prs_uint32("min_workset_size", ps
, depth
, &info
->min_workset_size
))
2815 if (!prs_uint32("max_workset_size", ps
, depth
, &info
->max_workset_size
))
2817 if (!prs_uint32("page_file_limit", ps
, depth
, &info
->page_file_limit
))
2819 if (!prs_uint64("time_limit", ps
, depth
, &info
->time_limit
))
2821 if (!prs_uint32("system_flags", ps
, depth
, &info
->system_flags
))
2823 if (!smb_io_bufhdr2("hdr_sec_desc", &info
->hdr_sec_desc
, ps
, depth
))
2826 for (i
=0; i
<4; i
++) {
2828 if (!smb_io_unihdr("dummy", &dummy
, ps
, depth
))
2832 for (i
=0; i
<4; i
++) {
2834 if (!prs_uint32("reserved", ps
, depth
, &reserved
))
2838 if(!prs_uint32("attribute_count", ps
, depth
, &info
->attribute_count
))
2841 info
->attributes
= TALLOC_ARRAY(ps
->mem_ctx
, uint32
, info
->attribute_count
);
2843 for (i
=0; i
<info
->attribute_count
; i
++)
2844 if(!prs_uint32("attributes", ps
, depth
, &info
->attributes
[i
]))
2847 if(!prs_uint32("privlist_count", ps
, depth
, &info
->privlist_count
))
2850 info
->hdr_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNIHDR
, info
->privlist_count
);
2851 info
->uni_privslist
= TALLOC_ARRAY(ps
->mem_ctx
, UNISTR2
, info
->privlist_count
);
2853 for (i
=0; i
<info
->privlist_count
; i
++)
2854 if(!smb_io_unihdr("hdr_privslist", &info
->hdr_privslist
[i
], ps
, depth
))
2857 for (i
=0; i
<info
->privlist_count
; i
++)
2858 if (!smb_io_unistr2("uni_privslist", &info
->uni_privslist
[i
], True
, ps
, depth
))
2861 if (!smb_io_rpc_blob("buf_sec_desc", &info
->buf_sec_desc
, ps
, depth
))
2867 /*******************************************************************
2868 reads or writes a structure.
2869 ********************************************************************/
2870 static BOOL
net_io_sam_delta_ctr(const char *desc
,
2871 SAM_DELTA_CTR
* delta
, uint16 type
,
2872 prs_struct
*ps
, int depth
)
2874 prs_debug(ps
, depth
, desc
, "net_io_sam_delta_ctr");
2878 /* Seen in sam deltas */
2879 case SAM_DELTA_MODIFIED_COUNT
:
2880 if (!net_io_sam_delta_mod_count("", &delta
->mod_count
, ps
, depth
))
2884 case SAM_DELTA_DOMAIN_INFO
:
2885 if (!net_io_sam_domain_info("", &delta
->domain_info
, ps
, depth
))
2889 case SAM_DELTA_GROUP_INFO
:
2890 if (!net_io_sam_group_info("", &delta
->group_info
, ps
, depth
))
2894 case SAM_DELTA_ACCOUNT_INFO
:
2895 if (!net_io_sam_account_info("", &delta
->account_info
, ps
, depth
))
2899 case SAM_DELTA_GROUP_MEM
:
2900 if (!net_io_sam_group_mem_info("", &delta
->grp_mem_info
, ps
, depth
))
2904 case SAM_DELTA_ALIAS_INFO
:
2905 if (!net_io_sam_alias_info("", &delta
->alias_info
, ps
, depth
))
2909 case SAM_DELTA_POLICY_INFO
:
2910 if (!net_io_sam_policy_info("", &delta
->policy_info
, ps
, depth
))
2914 case SAM_DELTA_ALIAS_MEM
:
2915 if (!net_io_sam_alias_mem_info("", &delta
->als_mem_info
, ps
, depth
))
2919 case SAM_DELTA_PRIVS_INFO
:
2920 if (!net_io_sam_privs_info("", &delta
->privs_info
, ps
, depth
))
2924 /* These guys are implemented but broken */
2926 case SAM_DELTA_TRUST_DOMS
:
2927 case SAM_DELTA_SECRET_INFO
:
2930 /* These guys are not implemented yet */
2932 case SAM_DELTA_RENAME_GROUP
:
2933 case SAM_DELTA_RENAME_USER
:
2934 case SAM_DELTA_RENAME_ALIAS
:
2935 case SAM_DELTA_DELETE_GROUP
:
2936 case SAM_DELTA_DELETE_USER
:
2938 DEBUG(0, ("Replication error: Unknown delta type 0x%x\n", type
));
2945 /*******************************************************************
2946 reads or writes a structure.
2947 ********************************************************************/
2948 BOOL
net_io_r_sam_sync(const char *desc
,
2949 NET_R_SAM_SYNC
* r_s
, prs_struct
*ps
, int depth
)
2953 prs_debug(ps
, depth
, desc
, "net_io_r_sam_sync");
2956 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
2958 if (!prs_uint32("sync_context", ps
, depth
, &r_s
->sync_context
))
2961 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
2963 if (r_s
->ptr_deltas
!= 0)
2965 if (!prs_uint32("num_deltas ", ps
, depth
, &r_s
->num_deltas
))
2967 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->ptr_deltas2
))
2969 if (r_s
->ptr_deltas2
!= 0)
2971 if (!prs_uint32("num_deltas2", ps
, depth
,
2975 if (r_s
->num_deltas2
!= r_s
->num_deltas
)
2981 if (r_s
->num_deltas2
> 0) {
2982 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas2
);
2983 if (r_s
->hdr_deltas
== NULL
) {
2984 DEBUG(0, ("error tallocating memory "
2985 "for %d delta headers\n",
2991 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
2993 if (!net_io_sam_delta_hdr("",
2994 &r_s
->hdr_deltas
[i
],
2999 if (r_s
->num_deltas2
> 0) {
3000 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas2
);
3001 if (r_s
->deltas
== NULL
) {
3002 DEBUG(0, ("error tallocating memory "
3009 for (i
= 0; i
< r_s
->num_deltas2
; i
++)
3011 if (!net_io_sam_delta_ctr(
3012 "", &r_s
->deltas
[i
],
3013 r_s
->hdr_deltas
[i
].type3
,
3015 DEBUG(0, ("hmm, failed on i=%d\n", i
));
3023 if (!prs_ntstatus("status", ps
, depth
, &(r_s
->status
)))
3029 /*******************************************************************
3030 makes a NET_Q_SAM_DELTAS structure.
3031 ********************************************************************/
3032 BOOL
init_net_q_sam_deltas(NET_Q_SAM_DELTAS
*q_s
, const char *srv_name
,
3033 const char *cli_name
, DOM_CRED
*cli_creds
,
3034 uint32 database_id
, UINT64_S dom_mod_count
)
3036 DEBUG(5, ("init_net_q_sam_deltas\n"));
3038 init_unistr2(&q_s
->uni_srv_name
, srv_name
, UNI_STR_TERMINATE
);
3039 init_unistr2(&q_s
->uni_cli_name
, cli_name
, UNI_STR_TERMINATE
);
3041 memcpy(&q_s
->cli_creds
, cli_creds
, sizeof(q_s
->cli_creds
));
3042 memset(&q_s
->ret_creds
, 0, sizeof(q_s
->ret_creds
));
3044 q_s
->database_id
= database_id
;
3045 q_s
->dom_mod_count
.low
= dom_mod_count
.low
;
3046 q_s
->dom_mod_count
.high
= dom_mod_count
.high
;
3047 q_s
->max_size
= 0xffff;
3052 /*******************************************************************
3053 reads or writes a structure.
3054 ********************************************************************/
3055 BOOL
net_io_q_sam_deltas(const char *desc
, NET_Q_SAM_DELTAS
*q_s
, prs_struct
*ps
,
3058 prs_debug(ps
, depth
, desc
, "net_io_q_sam_deltas");
3061 if (!smb_io_unistr2("", &q_s
->uni_srv_name
, True
, ps
, depth
))
3063 if (!smb_io_unistr2("", &q_s
->uni_cli_name
, True
, ps
, depth
))
3066 if (!smb_io_cred("", &q_s
->cli_creds
, ps
, depth
))
3068 if (!smb_io_cred("", &q_s
->ret_creds
, ps
, depth
))
3071 if (!prs_uint32("database_id ", ps
, depth
, &q_s
->database_id
))
3073 if (!prs_uint64("dom_mod_count", ps
, depth
, &q_s
->dom_mod_count
))
3075 if (!prs_uint32("max_size", ps
, depth
, &q_s
->max_size
))
3081 /*******************************************************************
3082 reads or writes a structure.
3083 ********************************************************************/
3084 BOOL
net_io_r_sam_deltas(const char *desc
,
3085 NET_R_SAM_DELTAS
*r_s
, prs_struct
*ps
, int depth
)
3089 prs_debug(ps
, depth
, desc
, "net_io_r_sam_deltas");
3092 if (!smb_io_cred("srv_creds", &r_s
->srv_creds
, ps
, depth
))
3094 if (!prs_uint64("dom_mod_count", ps
, depth
, &r_s
->dom_mod_count
))
3097 if (!prs_uint32("ptr_deltas", ps
, depth
, &r_s
->ptr_deltas
))
3099 if (!prs_uint32("num_deltas", ps
, depth
, &r_s
->num_deltas
))
3101 if (!prs_uint32("ptr_deltas2", ps
, depth
, &r_s
->num_deltas2
))
3104 if (r_s
->num_deltas2
!= 0)
3106 if (!prs_uint32("num_deltas2 ", ps
, depth
, &r_s
->num_deltas2
))
3109 if (r_s
->ptr_deltas
!= 0)
3111 if (r_s
->num_deltas
> 0) {
3112 r_s
->hdr_deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_HDR
, r_s
->num_deltas
);
3113 if (r_s
->hdr_deltas
== NULL
) {
3114 DEBUG(0, ("error tallocating memory "
3115 "for %d delta headers\n",
3121 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3123 net_io_sam_delta_hdr("", &r_s
->hdr_deltas
[i
],
3127 if (r_s
->num_deltas
> 0) {
3128 r_s
->deltas
= TALLOC_ARRAY(ps
->mem_ctx
, SAM_DELTA_CTR
, r_s
->num_deltas
);
3129 if (r_s
->deltas
== NULL
) {
3130 DEBUG(0, ("error tallocating memory "
3137 for (i
= 0; i
< r_s
->num_deltas
; i
++)
3139 if (!net_io_sam_delta_ctr(
3142 r_s
->hdr_deltas
[i
].type2
,
3151 if (!prs_ntstatus("status", ps
, depth
, &r_s
->status
))
3157 /*******************************************************************
3158 Inits a NET_Q_DSR_GETDCNAME structure.
3159 ********************************************************************/
3161 void init_net_q_dsr_getdcname(NET_Q_DSR_GETDCNAME
*r_t
, const char *server_unc
,
3162 const char *domain_name
,
3163 struct uuid
*domain_guid
,
3164 struct uuid
*site_guid
,
3167 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3169 r_t
->ptr_server_unc
= (server_unc
!= NULL
);
3170 init_unistr2(&r_t
->uni_server_unc
, server_unc
, UNI_STR_TERMINATE
);
3172 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3173 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3175 r_t
->ptr_domain_guid
= (domain_guid
!= NULL
);
3176 r_t
->domain_guid
= domain_guid
;
3178 r_t
->ptr_site_guid
= (site_guid
!= NULL
);
3179 r_t
->site_guid
= site_guid
;
3184 /*******************************************************************
3185 Reads or writes an NET_Q_DSR_GETDCNAME structure.
3186 ********************************************************************/
3188 BOOL
net_io_q_dsr_getdcname(const char *desc
, NET_Q_DSR_GETDCNAME
*r_t
,
3189 prs_struct
*ps
, int depth
)
3194 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getdcname");
3197 if (!prs_uint32("ptr_server_unc", ps
, depth
, &r_t
->ptr_server_unc
))
3200 if (!smb_io_unistr2("server_unc", &r_t
->uni_server_unc
,
3201 r_t
->ptr_server_unc
, ps
, depth
))
3207 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3210 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3211 r_t
->ptr_domain_name
, ps
, depth
))
3217 if (!prs_uint32("ptr_domain_guid", ps
, depth
, &r_t
->ptr_domain_guid
))
3220 if (UNMARSHALLING(ps
) && (r_t
->ptr_domain_guid
)) {
3221 r_t
->domain_guid
= PRS_ALLOC_MEM(ps
, struct uuid
, 1);
3222 if (r_t
->domain_guid
== NULL
)
3226 if ((r_t
->ptr_domain_guid
) &&
3227 (!smb_io_uuid("domain_guid", r_t
->domain_guid
, ps
, depth
)))
3233 if (!prs_uint32("ptr_site_guid", ps
, depth
, &r_t
->ptr_site_guid
))
3236 if (UNMARSHALLING(ps
) && (r_t
->ptr_site_guid
)) {
3237 r_t
->site_guid
= PRS_ALLOC_MEM(ps
, struct uuid
, 1);
3238 if (r_t
->site_guid
== NULL
)
3242 if ((r_t
->ptr_site_guid
) &&
3243 (!smb_io_uuid("site_guid", r_t
->site_guid
, ps
, depth
)))
3249 if (!prs_uint32("flags", ps
, depth
, &r_t
->flags
))
3255 /*******************************************************************
3256 Inits a NET_R_DSR_GETDCNAME structure.
3257 ********************************************************************/
3258 void init_net_r_dsr_getdcname(NET_R_DSR_GETDCNAME
*r_t
, const char *dc_unc
,
3259 const char *dc_address
, int32 dc_address_type
,
3260 struct uuid domain_guid
, const char *domain_name
,
3261 const char *forest_name
, uint32 dc_flags
,
3262 const char *dc_site_name
,
3263 const char *client_site_name
)
3265 DEBUG(5, ("init_net_q_dsr_getdcname\n"));
3267 r_t
->ptr_dc_unc
= (dc_unc
!= NULL
);
3268 init_unistr2(&r_t
->uni_dc_unc
, dc_unc
, UNI_STR_TERMINATE
);
3270 r_t
->ptr_dc_address
= (dc_address
!= NULL
);
3271 init_unistr2(&r_t
->uni_dc_address
, dc_address
, UNI_STR_TERMINATE
);
3273 r_t
->dc_address_type
= dc_address_type
;
3274 r_t
->domain_guid
= domain_guid
;
3276 r_t
->ptr_domain_name
= (domain_name
!= NULL
);
3277 init_unistr2(&r_t
->uni_domain_name
, domain_name
, UNI_STR_TERMINATE
);
3279 r_t
->ptr_forest_name
= (forest_name
!= NULL
);
3280 init_unistr2(&r_t
->uni_forest_name
, forest_name
, UNI_STR_TERMINATE
);
3282 r_t
->dc_flags
= dc_flags
;
3284 r_t
->ptr_dc_site_name
= (dc_site_name
!= NULL
);
3285 init_unistr2(&r_t
->uni_dc_site_name
, dc_site_name
, UNI_STR_TERMINATE
);
3287 r_t
->ptr_client_site_name
= (client_site_name
!= NULL
);
3288 init_unistr2(&r_t
->uni_client_site_name
, client_site_name
,
3292 /*******************************************************************
3293 Reads or writes an NET_R_DSR_GETDCNAME structure.
3294 ********************************************************************/
3296 BOOL
net_io_r_dsr_getdcname(const char *desc
, NET_R_DSR_GETDCNAME
*r_t
,
3297 prs_struct
*ps
, int depth
)
3299 uint32 info_ptr
= 1;
3304 prs_debug(ps
, depth
, desc
, "net_io_r_dsr_getdcname");
3307 /* The reply contains *just* an info struct, this is the ptr to it */
3308 if (!prs_uint32("info_ptr", ps
, depth
, &info_ptr
))
3314 if (!prs_uint32("ptr_dc_unc", ps
, depth
, &r_t
->ptr_dc_unc
))
3317 if (!prs_uint32("ptr_dc_address", ps
, depth
, &r_t
->ptr_dc_address
))
3320 if (!prs_uint32("dc_address_type", ps
, depth
, &r_t
->dc_address_type
))
3323 if (!smb_io_uuid("domain_guid", &r_t
->domain_guid
, ps
, depth
))
3326 if (!prs_uint32("ptr_domain_name", ps
, depth
, &r_t
->ptr_domain_name
))
3329 if (!prs_uint32("ptr_forest_name", ps
, depth
, &r_t
->ptr_forest_name
))
3332 if (!prs_uint32("dc_flags", ps
, depth
, &r_t
->dc_flags
))
3335 if (!prs_uint32("ptr_dc_site_name", ps
, depth
, &r_t
->ptr_dc_site_name
))
3338 if (!prs_uint32("ptr_client_site_name", ps
, depth
,
3339 &r_t
->ptr_client_site_name
))
3345 if (!smb_io_unistr2("dc_unc", &r_t
->uni_dc_unc
,
3346 r_t
->ptr_dc_unc
, ps
, depth
))
3352 if (!smb_io_unistr2("dc_address", &r_t
->uni_dc_address
,
3353 r_t
->ptr_dc_address
, ps
, depth
))
3359 if (!smb_io_unistr2("domain_name", &r_t
->uni_domain_name
,
3360 r_t
->ptr_domain_name
, ps
, depth
))
3366 if (!smb_io_unistr2("forest_name", &r_t
->uni_forest_name
,
3367 r_t
->ptr_forest_name
, ps
, depth
))
3373 if (!smb_io_unistr2("dc_site_name", &r_t
->uni_dc_site_name
,
3374 r_t
->ptr_dc_site_name
, ps
, depth
))
3380 if (!smb_io_unistr2("client_site_name", &r_t
->uni_client_site_name
,
3381 r_t
->ptr_client_site_name
, ps
, depth
))
3387 if (!prs_werror("result", ps
, depth
, &r_t
->result
))
3393 /*******************************************************************
3394 Inits a NET_Q_DSR_GETSITENAME structure.
3395 ********************************************************************/
3397 void init_net_q_dsr_getsitename(NET_Q_DSR_GETSITENAME
*r_t
, const char *computer_name
)
3399 DEBUG(5, ("init_net_q_dsr_getsitename\n"));
3401 r_t
->ptr_computer_name
= (computer_name
!= NULL
);
3402 init_unistr2(&r_t
->uni_computer_name
, computer_name
, UNI_STR_TERMINATE
);
3405 /*******************************************************************
3406 Reads or writes an NET_Q_DSR_GETSITENAME structure.
3407 ********************************************************************/
3409 BOOL
net_io_q_dsr_getsitename(const char *desc
, NET_Q_DSR_GETSITENAME
*r_t
,
3410 prs_struct
*ps
, int depth
)
3415 prs_debug(ps
, depth
, desc
, "net_io_q_dsr_getsitename");
3418 if (!prs_uint32("ptr_computer_name", ps
, depth
, &r_t
->ptr_computer_name
))
3421 if (!smb_io_unistr2("computer_name", &r_t
->uni_computer_name
,
3422 r_t
->ptr_computer_name
, ps
, depth
))
3431 /*******************************************************************
3432 Reads or writes an NET_R_DSR_GETSITENAME structure.
3433 ********************************************************************/
3435 BOOL
net_io_r_dsr_getsitename(const char *desc
, NET_R_DSR_GETSITENAME
*r_t
,
3436 prs_struct
*ps
, int depth
)
3441 prs_debug(ps
, depth
, desc
, "net_io_r_dsr_getsitename");
3444 if (!prs_uint32("ptr_site_name", ps
, depth
, &r_t
->ptr_site_name
))
3450 if (!smb_io_unistr2("site_name", &r_t
->uni_site_name
,
3451 r_t
->ptr_site_name
, ps
, depth
))
3457 if (!prs_werror("result", ps
, depth
, &r_t
->result
))