2 * Unix SMB/Netbios implementation.
4 * RPC Pipe client / server routines
5 * Copyright (C) Andrew Tridgell 1992-1999,
6 * Copyright (C) Luke Kenneth Casson Leighton 1996-1999,
7 * Copyright (C) Paul Ashton 1997-1999.
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.
25 #include "rpc_parse.h"
28 extern int DEBUGLEVEL
;
30 /*******************************************************************
31 creates a LSA_TRANS_NAME structure.
32 ********************************************************************/
33 BOOL
make_lsa_trans_name(LSA_TRANS_NAME
* trn
, UNISTR2
* uni_name
,
34 uint32 sid_name_use
, char *name
, uint32 idx
)
36 int len_name
= strlen(name
);
38 trn
->sid_name_use
= sid_name_use
;
39 make_uni_hdr(&(trn
->hdr_name
), len_name
);
40 make_unistr2(uni_name
, name
, len_name
);
41 trn
->domain_idx
= idx
;
46 /*******************************************************************
47 reads or writes a LSA_TRANS_NAME structure.
48 ********************************************************************/
49 static BOOL
lsa_io_trans_name(char *desc
, LSA_TRANS_NAME
* trn
,
50 prs_struct
* ps
, int depth
)
55 prs_debug(ps
, depth
, desc
, "lsa_io_trans_name");
60 prs_uint32("sid_name_use", ps
, depth
, &(trn
->sid_name_use
));
61 smb_io_unihdr("hdr_name", &(trn
->hdr_name
), ps
, depth
);
62 prs_uint32("domain_idx ", ps
, depth
, &(trn
->domain_idx
));
67 /***************************************************************************
68 make_dom_ref - adds a domain if it's not already in, returns the index
69 ***************************************************************************/
70 int make_dom_ref_uni(DOM_R_REF
* ref
, const UNISTR2
* uni_domname
,
71 const DOM_SID
* dom_sid
)
81 if (uni_domname
== NULL
)
83 uni_domname
= &uni_tmp
;
84 make_unistr2(&uni_tmp
, NULL
, 0);
87 for (num
= 0; num
< ref
->num_ref_doms_1
; num
++)
89 if (unistr2equal(uni_domname
,
90 &ref
->ref_dom
[num
].uni_dom_name
))
96 if (num
>= MAX_REF_DOMAINS
)
98 /* index not found, already at maximum domain limit */
102 ref
->num_ref_doms_1
= num
+ 1;
103 ref
->ptr_ref_dom
= 1;
104 ref
->max_entries
= MAX_REF_DOMAINS
;
105 ref
->num_ref_doms_2
= num
+ 1;
107 make_unihdr_from_unistr2(&(ref
->hdr_ref_dom
[num
].hdr_dom_name
),
109 copy_unistr2(&(ref
->ref_dom
[num
].uni_dom_name
), uni_domname
);
111 ref
->hdr_ref_dom
[num
].ptr_dom_sid
= dom_sid
!= NULL
? 1 : 0;
112 make_dom_sid2(&(ref
->ref_dom
[num
].ref_dom
), dom_sid
);
117 int make_dom_ref(DOM_R_REF
* ref
, const char *domname
,
118 const DOM_SID
* dom_sid
)
120 UNISTR2
*uni_domname
;
123 uni_domname
= unistr2_new(domname
);
124 ret
= make_dom_ref_uni(ref
, uni_domname
, dom_sid
);
125 unistr2_free(uni_domname
);
129 /*******************************************************************
130 reads or writes a DOM_R_REF structure.
131 ********************************************************************/
132 static BOOL
lsa_io_dom_r_ref(char *desc
, DOM_R_REF
* r_r
, prs_struct
* ps
,
137 prs_debug(ps
, depth
, desc
, "smb_io_dom_r_ref");
145 prs_uint32("num_ref_doms_1", ps
, depth
, &(r_r
->num_ref_doms_1
)); /* num referenced domains? */
146 prs_uint32("ptr_ref_dom ", ps
, depth
, &(r_r
->ptr_ref_dom
)); /* undocumented buffer pointer. */
147 prs_uint32("max_entries ", ps
, depth
, &(r_r
->max_entries
)); /* 32 - max number of entries */
149 SMB_ASSERT_ARRAY(r_r
->hdr_ref_dom
, r_r
->num_ref_doms_1
);
151 if (r_r
->ptr_ref_dom
!= 0)
153 prs_uint32("num_ref_doms_2", ps
, depth
, &(r_r
->num_ref_doms_2
)); /* 4 - num referenced domains? */
154 SMB_ASSERT_ARRAY(r_r
->ref_dom
, r_r
->num_ref_doms_2
);
156 for (i
= 0; i
< r_r
->num_ref_doms_1
; i
++)
160 slprintf(t
, sizeof(t
) - 1, "dom_ref[%d] ", i
);
161 smb_io_unihdr(t
, &(r_r
->hdr_ref_dom
[i
].hdr_dom_name
),
164 slprintf(t
, sizeof(t
) - 1, "sid_ptr[%d] ", i
);
165 prs_uint32(t
, ps
, depth
,
166 &(r_r
->hdr_ref_dom
[i
].ptr_dom_sid
));
169 for (i
= 0, n
= 0, s
= 0; i
< r_r
->num_ref_doms_2
; i
++)
173 if (r_r
->hdr_ref_dom
[i
].hdr_dom_name
.buffer
!= 0)
175 slprintf(t
, sizeof(t
) - 1, "dom_ref[%d] ", i
);
178 uni_dom_name
), True
, ps
, depth
); /* domain name unicode string */
183 if (r_r
->hdr_ref_dom
[i
].ptr_dom_sid
!= 0)
185 slprintf(t
, sizeof(t
) - 1, "sid_ptr[%d] ", i
);
187 &(r_r
->ref_dom
[s
].ref_dom
),
188 ps
, depth
); /* referenced domain SIDs */
198 /*******************************************************************
199 makes an LSA_SEC_QOS structure.
200 ********************************************************************/
201 BOOL
make_lsa_sec_qos(LSA_SEC_QOS
* qos
, uint16 imp_lev
, uint8 ctxt
,
202 uint8 eff
, uint32 unknown
)
207 DEBUG(5, ("make_lsa_sec_qos\n"));
209 qos
->len
= 0x0c; /* length of quality of service block, in bytes */
210 qos
->sec_imp_level
= imp_lev
;
211 qos
->sec_ctxt_mode
= ctxt
;
212 qos
->effective_only
= eff
;
213 qos
->unknown
= unknown
;
218 /*******************************************************************
219 reads or writes an LSA_SEC_QOS structure.
220 ********************************************************************/
221 static BOOL
lsa_io_sec_qos(char *desc
, LSA_SEC_QOS
* qos
, prs_struct
* ps
,
229 prs_debug(ps
, depth
, desc
, "lsa_io_obj_qos");
236 /* these pointers had _better_ be zero, because we don't know
239 prs_uint32("len ", ps
, depth
, &(qos
->len
)); /* 0x18 - length (in bytes) inc. the length field. */
240 prs_uint16("sec_imp_level ", ps
, depth
, &(qos
->sec_imp_level
));
241 prs_uint8("sec_ctxt_mode ", ps
, depth
, &(qos
->sec_ctxt_mode
));
242 prs_uint8("effective_only", ps
, depth
, &(qos
->effective_only
));
243 prs_uint32("unknown ", ps
, depth
, &(qos
->unknown
));
245 if (qos
->len
!= ps
->offset
- start
)
248 ("lsa_io_sec_qos: length %x does not match size %x\n",
249 qos
->len
, ps
->offset
- start
));
256 /*******************************************************************
257 makes an LSA_OBJ_ATTR structure.
258 ********************************************************************/
259 BOOL
make_lsa_obj_attr(LSA_OBJ_ATTR
* attr
, uint32 attributes
,
265 DEBUG(5, ("make_lsa_obj_attr\n"));
267 attr
->len
= 0x18; /* length of object attribute block, in bytes */
268 attr
->ptr_root_dir
= 0;
269 attr
->ptr_obj_name
= 0;
270 attr
->attributes
= attributes
;
271 attr
->ptr_sec_desc
= 0;
275 attr
->ptr_sec_qos
= 1;
280 attr
->ptr_sec_qos
= 0;
281 attr
->sec_qos
= NULL
;
287 /*******************************************************************
288 reads or writes an LSA_OBJ_ATTR structure.
289 ********************************************************************/
290 static BOOL
lsa_io_obj_attr(char *desc
, LSA_OBJ_ATTR
* attr
, prs_struct
* ps
,
298 prs_debug(ps
, depth
, desc
, "lsa_io_obj_attr");
305 /* these pointers had _better_ be zero, because we don't know
308 prs_uint32("len ", ps
, depth
, &(attr
->len
)); /* 0x18 - length (in bytes) inc. the length field. */
309 prs_uint32("ptr_root_dir", ps
, depth
, &(attr
->ptr_root_dir
)); /* 0 - root directory (pointer) */
310 prs_uint32("ptr_obj_name", ps
, depth
, &(attr
->ptr_obj_name
)); /* 0 - object name (pointer) */
311 prs_uint32("attributes ", ps
, depth
, &(attr
->attributes
)); /* 0 - attributes (undocumented) */
312 prs_uint32("ptr_sec_desc", ps
, depth
, &(attr
->ptr_sec_desc
)); /* 0 - security descriptior (pointer) */
313 prs_uint32("ptr_sec_qos ", ps
, depth
, &(attr
->ptr_sec_qos
)); /* security quality of service (pointer) */
315 if (attr
->len
!= ps
->offset
- start
)
318 ("lsa_io_obj_attr: length %x does not match size %x\n",
319 attr
->len
, ps
->offset
- start
));
322 if (attr
->ptr_sec_qos
!= 0 && attr
->sec_qos
!= NULL
)
324 lsa_io_sec_qos("sec_qos", attr
->sec_qos
, ps
, depth
);
331 /*******************************************************************
332 makes an LSA_Q_OPEN_POL structure.
333 ********************************************************************/
334 BOOL
make_q_open_pol(LSA_Q_OPEN_POL
* r_q
, uint16 system_name
,
336 uint32 desired_access
, LSA_SEC_QOS
* qos
)
342 ("make_open_pol: attr:%d da:%d\n", attributes
, desired_access
));
344 r_q
->ptr
= 1; /* undocumented pointer */
348 r_q
->des_access
= desired_access
;
351 r_q
->system_name
= system_name
;
352 make_lsa_obj_attr(&(r_q
->attr
), attributes
, qos
);
357 /*******************************************************************
358 reads or writes an LSA_Q_OPEN_POL structure.
359 ********************************************************************/
360 BOOL
lsa_io_q_open_pol(char *desc
, LSA_Q_OPEN_POL
* r_q
, prs_struct
* ps
,
366 prs_debug(ps
, depth
, desc
, "lsa_io_q_open_pol");
369 prs_uint32("ptr ", ps
, depth
, &(r_q
->ptr
));
370 prs_uint16("system_name", ps
, depth
, &(r_q
->system_name
));
373 lsa_io_obj_attr("", &(r_q
->attr
), ps
, depth
);
375 if (r_q
->attr
.ptr_sec_qos
== 0)
377 prs_uint32("des_access", ps
, depth
, &(r_q
->des_access
));
383 /*******************************************************************
384 reads or writes an LSA_R_OPEN_POL structure.
385 ********************************************************************/
386 BOOL
lsa_io_r_open_pol(char *desc
, LSA_R_OPEN_POL
* r_p
, prs_struct
* ps
,
392 prs_debug(ps
, depth
, desc
, "lsa_io_r_open_pol");
395 smb_io_pol_hnd("", &(r_p
->pol
), ps
, depth
);
397 prs_uint32("status", ps
, depth
, &(r_p
->status
));
402 /*******************************************************************
403 makes an LSA_Q_OPEN_POL2 structure.
404 ********************************************************************/
405 BOOL
make_q_open_pol2(LSA_Q_OPEN_POL2
* r_q
, const char *server_name
,
407 uint32 desired_access
, LSA_SEC_QOS
* qos
)
413 ("make_open_pol2: attr:%d da:%d\n", attributes
,
416 r_q
->ptr
= 1; /* undocumented pointer */
420 r_q
->des_access
= desired_access
;
423 make_unistr2(&(r_q
->uni_server_name
), server_name
,
424 strlen(server_name
));
425 make_lsa_obj_attr(&(r_q
->attr
), attributes
, qos
);
430 /*******************************************************************
431 reads or writes an LSA_Q_OPEN_POL2 structure.
432 ********************************************************************/
433 BOOL
lsa_io_q_open_pol2(char *desc
, LSA_Q_OPEN_POL2
* r_q
, prs_struct
* ps
,
439 prs_debug(ps
, depth
, desc
, "lsa_io_q_open_pol2");
442 prs_uint32("ptr ", ps
, depth
, &(r_q
->ptr
));
444 smb_io_unistr2("", &(r_q
->uni_server_name
), r_q
->ptr
, ps
, depth
);
447 lsa_io_obj_attr("", &(r_q
->attr
), ps
, depth
);
449 if (r_q
->attr
.ptr_sec_qos
== 0)
451 prs_uint32("des_access", ps
, depth
, &(r_q
->des_access
));
457 /*******************************************************************
458 reads or writes an LSA_R_OPEN_POL2 structure.
459 ********************************************************************/
460 BOOL
lsa_io_r_open_pol2(char *desc
, LSA_R_OPEN_POL2
* r_p
, prs_struct
* ps
,
466 prs_debug(ps
, depth
, desc
, "lsa_io_r_open_pol2");
469 smb_io_pol_hnd("", &(r_p
->pol
), ps
, depth
);
471 prs_uint32("status", ps
, depth
, &(r_p
->status
));
478 /*******************************************************************
479 makes an LSA_Q_QUERY_SEC_OBJ structure.
480 ********************************************************************/
481 BOOL
make_q_query_sec_obj(LSA_Q_QUERY_SEC_OBJ
* q_q
, const POLICY_HND
*hnd
,
484 if (q_q
== NULL
|| hnd
== NULL
)
487 DEBUG(5, ("make_q_query_sec_obj\n"));
490 q_q
->sec_info
= sec_info
;
495 /*******************************************************************
496 reads or writes an LSA_Q_QUERY_SEC_OBJ structure.
497 ********************************************************************/
498 BOOL
lsa_io_q_query_sec_obj(char *desc
, LSA_Q_QUERY_SEC_OBJ
* q_q
, prs_struct
* ps
,
504 prs_debug(ps
, depth
, desc
, "lsa_io_q_query_sec_obj");
507 smb_io_pol_hnd("", &(q_q
->pol
), ps
, depth
);
508 prs_uint32("sec_info", ps
, depth
, &(q_q
->sec_info
));
513 /*******************************************************************
514 reads or writes a LSA_R_QUERY_SEC_OBJ structure.
515 ********************************************************************/
516 BOOL
lsa_io_r_query_sec_obj(char *desc
, LSA_R_QUERY_SEC_OBJ
*r_u
, prs_struct
*ps
, int depth
)
518 if (r_u
== NULL
) return False
;
520 prs_debug(ps
, depth
, desc
, "lsa_io_r_query_sec_obj");
525 prs_uint32("ptr", ps
, depth
, &(r_u
->ptr
));
528 sec_io_desc_buf("sec", &r_u
->buf
, ps
, depth
);
530 prs_uint32("status", ps
, depth
, &(r_u
->status
));
534 /*******************************************************************
535 makes an LSA_Q_QUERY_INFO structure.
536 ********************************************************************/
537 BOOL
make_q_query(LSA_Q_QUERY_INFO
* q_q
, POLICY_HND
*hnd
, uint16 info_class
)
539 if (q_q
== NULL
|| hnd
== NULL
)
542 DEBUG(5, ("make_q_query\n"));
544 memcpy(&(q_q
->pol
), hnd
, sizeof(q_q
->pol
));
546 q_q
->info_class
= info_class
;
551 /*******************************************************************
552 reads or writes an LSA_Q_QUERY_INFO structure.
553 ********************************************************************/
554 BOOL
lsa_io_q_query(char *desc
, LSA_Q_QUERY_INFO
* q_q
, prs_struct
* ps
,
560 prs_debug(ps
, depth
, desc
, "lsa_io_q_query");
563 smb_io_pol_hnd("", &(q_q
->pol
), ps
, depth
);
565 prs_uint16("info_class", ps
, depth
, &(q_q
->info_class
));
570 /*******************************************************************
571 makes an LSA_Q_CREATE_SECRET structure.
572 ********************************************************************/
573 BOOL
make_q_create_secret(LSA_Q_CREATE_SECRET
* q_o
,
574 const POLICY_HND
*pol_hnd
, const char *secret_name
,
575 uint32 desired_access
)
577 int len
= strlen(secret_name
);
582 DEBUG(5, ("make_q_create_secret"));
584 memcpy(&(q_o
->pol
), pol_hnd
, sizeof(q_o
->pol
));
586 make_uni_hdr(&(q_o
->hdr_secret
), len
);
587 make_unistr2(&(q_o
->uni_secret
), secret_name
, len
);
589 q_o
->des_access
= desired_access
;
594 /*******************************************************************
595 reads or writes an LSA_Q_CREATE_SECRET structure.
596 ********************************************************************/
597 BOOL
lsa_io_q_create_secret(char *desc
, LSA_Q_CREATE_SECRET
* q_o
,
598 prs_struct
* ps
, int depth
)
603 prs_debug(ps
, depth
, desc
, "lsa_io_q_create_secret");
606 smb_io_pol_hnd("", &(q_o
->pol
), ps
, depth
);
609 smb_io_unihdr("", &(q_o
->hdr_secret
), ps
, depth
);
610 smb_io_unistr2("", &(q_o
->uni_secret
), 1, ps
, depth
);
613 prs_uint32("des_access", ps
, depth
, &(q_o
->des_access
));
618 /*******************************************************************
619 reads or writes an LSA_R_CREATE_SECRET structure.
620 ********************************************************************/
621 BOOL
lsa_io_r_create_secret(char *desc
, LSA_R_CREATE_SECRET
* r_o
,
622 prs_struct
* ps
, int depth
)
627 prs_debug(ps
, depth
, desc
, "lsa_io_r_create_secret");
630 smb_io_pol_hnd("", &(r_o
->pol
), ps
, depth
);
632 prs_uint32("status", ps
, depth
, &(r_o
->status
));
637 /*******************************************************************
638 makes an LSA_Q_OPEN_SECRET structure.
639 ********************************************************************/
640 BOOL
make_q_open_secret(LSA_Q_OPEN_SECRET
* q_o
, const POLICY_HND
*pol_hnd
,
641 const char *secret_name
, uint32 desired_access
)
643 int len
= strlen(secret_name
);
648 DEBUG(5, ("make_q_open_secret"));
650 memcpy(&(q_o
->pol
), pol_hnd
, sizeof(q_o
->pol
));
652 make_uni_hdr(&(q_o
->hdr_secret
), len
);
653 make_unistr2(&(q_o
->uni_secret
), secret_name
, len
);
655 q_o
->des_access
= desired_access
;
660 /*******************************************************************
661 reads or writes an LSA_Q_OPEN_SECRET structure.
662 ********************************************************************/
663 BOOL
lsa_io_q_open_secret(char *desc
, LSA_Q_OPEN_SECRET
* q_o
,
664 prs_struct
* ps
, int depth
)
669 prs_debug(ps
, depth
, desc
, "lsa_io_q_open_secret");
672 smb_io_pol_hnd("", &(q_o
->pol
), ps
, depth
);
675 smb_io_unihdr("", &(q_o
->hdr_secret
), ps
, depth
);
676 smb_io_unistr2("", &(q_o
->uni_secret
), 1, ps
, depth
);
679 prs_uint32("des_access", ps
, depth
, &(q_o
->des_access
));
684 /*******************************************************************
685 reads or writes an LSA_R_OPEN_SECRET structure.
686 ********************************************************************/
687 BOOL
lsa_io_r_open_secret(char *desc
, LSA_R_OPEN_SECRET
* r_o
,
688 prs_struct
* ps
, int depth
)
693 prs_debug(ps
, depth
, desc
, "lsa_io_r_open_secret");
696 smb_io_pol_hnd("", &(r_o
->pol
), ps
, depth
);
698 prs_uint32("status", ps
, depth
, &(r_o
->status
));
703 /*******************************************************************
704 reads or writes an LSA_SECRET_VALUE structure.
705 ********************************************************************/
706 BOOL
lsa_io_secret_value(char *desc
, LSA_SECRET_VALUE
* value
,
707 prs_struct
* ps
, int depth
)
712 prs_debug(ps
, depth
, desc
, "lsa_io_secret_value");
716 prs_uint32("ptr_secret", ps
, depth
, &(value
->ptr_secret
));
718 if (value
->ptr_secret
!= 0)
720 smb_io_strhdr2("hdr_secret", &(value
->hdr_secret
), ps
, depth
);
721 smb_io_string2("secret", &(value
->enc_secret
),
722 value
->hdr_secret
.buffer
, ps
, depth
);
730 /*******************************************************************
731 reads or writes an LSA_SECRET_INFO structure.
732 ********************************************************************/
733 BOOL
lsa_io_secret_info(char *desc
, LSA_SECRET_INFO
* info
, prs_struct
* ps
,
739 prs_debug(ps
, depth
, desc
, "lsa_io_secret_info");
743 prs_uint32("ptr_value ", ps
, depth
, &(info
->ptr_value
));
745 if (info
->ptr_value
!= 0)
747 lsa_io_secret_value("", &(info
->value
), ps
, depth
);
751 prs_uint32("ptr_update", ps
, depth
, &(info
->ptr_update
));
753 if (info
->ptr_update
!= 0)
759 smb_io_time("last_update", &(info
->last_update
), ps
, depth
);
767 /*******************************************************************
768 reads or writes an LSA_SECRET structure.
769 ********************************************************************/
770 BOOL
lsa_io_secret(char *desc
, LSA_SECRET
* q_q
, prs_struct
* ps
, int depth
)
775 prs_debug(ps
, depth
, desc
, "lsa_io_secret");
778 lsa_io_secret_info("", &(q_q
->curinfo
), ps
, depth
);
779 lsa_io_secret_info("", &(q_q
->oldinfo
), ps
, depth
);
784 /*******************************************************************
785 makes an LSA_Q_QUERY_SECRET structure.
786 ********************************************************************/
787 BOOL
make_q_query_secret(LSA_Q_QUERY_SECRET
* q_q
, POLICY_HND
*pol
,
788 const STRING2
*secret
, const NTTIME
* update
)
793 DEBUG(5, ("make_q_query_secret\n"));
795 memcpy(&(q_q
->pol
), pol
, sizeof(q_q
->pol
));
798 q_q
->sec
.curinfo
.ptr_value
= secret
!= NULL
? 1 : 0;
799 q_q
->sec
.curinfo
.value
.ptr_secret
= 0;
801 /* Want last change time */
802 q_q
->sec
.curinfo
.ptr_update
= update
!= NULL
? 1 : 0;
804 /* Don't care about old info */
805 q_q
->sec
.oldinfo
.ptr_value
= 0;
806 q_q
->sec
.oldinfo
.ptr_update
= 0;
811 /*******************************************************************
812 reads or writes an LSA_Q_QUERY_SECRET structure.
813 ********************************************************************/
814 BOOL
lsa_io_q_query_secret(char *desc
, LSA_Q_QUERY_SECRET
* q_q
,
815 prs_struct
* ps
, int depth
)
820 prs_debug(ps
, depth
, desc
, "lsa_io_q_query_secret");
823 smb_io_pol_hnd("", &(q_q
->pol
), ps
, depth
);
824 lsa_io_secret("", &(q_q
->sec
), ps
, depth
);
829 /*******************************************************************
830 reads or writes an LSA_Q_QUERY_SECRET structure.
831 ********************************************************************/
832 BOOL
lsa_io_r_query_secret(char *desc
, LSA_R_QUERY_SECRET
* r_q
,
833 prs_struct
* ps
, int depth
)
838 prs_debug(ps
, depth
, desc
, "lsa_io_r_query_secret");
841 lsa_io_secret("", &(r_q
->sec
), ps
, depth
);
843 prs_uint32("status", ps
, depth
, &(r_q
->status
));
848 /*******************************************************************
849 reads or writes an LSA_Q_SET_SECRET structure.
850 ********************************************************************/
851 BOOL
lsa_io_q_set_secret(char *desc
, LSA_Q_SET_SECRET
* q_q
, prs_struct
* ps
,
857 prs_debug(ps
, depth
, desc
, "lsa_io_q_set_secret");
860 smb_io_pol_hnd("", &(q_q
->pol
), ps
, depth
);
862 lsa_io_secret_value("", &(q_q
->value
), ps
, depth
);
863 prs_uint32("unknown", ps
, depth
, &(q_q
->unknown
));
868 /*******************************************************************
869 reads or writes an LSA_Q_SET_SECRET structure.
870 ********************************************************************/
871 BOOL
lsa_io_r_set_secret(char *desc
, LSA_R_SET_SECRET
* r_q
, prs_struct
* ps
,
877 prs_debug(ps
, depth
, desc
, "lsa_io_r_set_secret");
881 prs_uint32("status", ps
, depth
, &(r_q
->status
));
886 /*******************************************************************
887 makes an LSA_Q_ENUM_TRUST_DOM structure.
888 ********************************************************************/
889 BOOL
make_q_enum_trust_dom(LSA_Q_ENUM_TRUST_DOM
* q_e
,
891 uint32 enum_context
, uint32 preferred_len
)
896 DEBUG(5, ("make_q_enum_trust_dom\n"));
898 memcpy(&(q_e
->pol
), pol
, sizeof(q_e
->pol
));
899 q_e
->enum_context
= enum_context
;
900 q_e
->preferred_len
= preferred_len
;
905 /*******************************************************************
906 reads or writes an LSA_Q_ENUM_TRUST_DOM structure.
907 ********************************************************************/
908 BOOL
lsa_io_q_enum_trust_dom(char *desc
, LSA_Q_ENUM_TRUST_DOM
* q_e
,
909 prs_struct
* ps
, int depth
)
914 prs_debug(ps
, depth
, desc
, "lsa_io_q_enum_trust_dom");
918 smb_io_pol_hnd("", &(q_e
->pol
), ps
, depth
);
920 prs_uint32("enum_context ", ps
, depth
, &(q_e
->enum_context
));
921 prs_uint32("preferred_len", ps
, depth
, &(q_e
->preferred_len
));
926 /*******************************************************************
927 makes an LSA_R_ENUM_TRUST_DOM structure.
928 ********************************************************************/
929 BOOL
make_r_enum_trust_dom(LSA_R_ENUM_TRUST_DOM
* r_e
, int32 enum_context
,
931 UNISTR2
* domain_names
, DOM_SID
** domain_sids
,
937 DEBUG(5, ("make_r_enum_trust_dom\n"));
939 r_e
->enum_context
= enum_context
;
941 if ((domain_names
== NULL
) || (domain_sids
== NULL
))
946 if ((status
== 0) && (num_domains
!= 0))
950 r_e
->num_domains
= num_domains
;
951 r_e
->ptr_enum_domains
= 1;
952 r_e
->num_domains2
= num_domains
;
954 r_e
->hdr_domain_name
= g_new(UNIHDR2
, num_domains
);
955 r_e
->domain_sid
= g_new(DOM_SID2
, num_domains
);
956 if ((r_e
->hdr_domain_name
== NULL
)
957 || (r_e
->domain_sid
== NULL
))
959 r_e
->uni_domain_name
= NULL
;
960 lsa_free_r_enum_trust_dom(r_e
);
961 r_e
->status
= status
;
964 r_e
->uni_domain_name
= domain_names
;
965 for (i
= 0; i
< num_domains
; i
++)
967 make_unihdr2_from_unistr2(&(r_e
->hdr_domain_name
[i
]),
969 make_dom_sid2(&(r_e
->domain_sid
[i
]), domain_sids
[i
]);
974 r_e
->num_domains
= 0;
975 r_e
->ptr_enum_domains
= 0;
978 r_e
->status
= status
;
983 /*******************************************************************
984 reads or writes an LSA_R_ENUM_TRUST_DOM structure.
985 ********************************************************************/
986 BOOL
lsa_io_r_enum_trust_dom(char *desc
, LSA_R_ENUM_TRUST_DOM
* r_e
,
987 prs_struct
* ps
, int depth
)
992 prs_debug(ps
, depth
, desc
, "lsa_io_r_enum_trust_dom");
995 prs_uint32("enum_context ", ps
, depth
, &(r_e
->enum_context
));
996 prs_uint32("num_domains ", ps
, depth
, &(r_e
->num_domains
));
997 prs_uint32("ptr_enum_domains", ps
, depth
, &(r_e
->ptr_enum_domains
));
999 if (r_e
->ptr_enum_domains
!= 0)
1001 uint32 i
, num_domains
;
1002 prs_uint32("num_domains2", ps
, depth
, &(r_e
->num_domains2
));
1003 num_domains
= r_e
->num_domains2
;
1007 r_e
->uni_domain_name
= g_new(UNISTR2
, num_domains
);
1008 r_e
->hdr_domain_name
= g_new(UNIHDR2
, num_domains
);
1009 r_e
->domain_sid
= g_new(DOM_SID2
, num_domains
);
1010 if ((r_e
->uni_domain_name
== NULL
)
1011 || (r_e
->hdr_domain_name
== NULL
)
1012 || (r_e
->domain_sid
== NULL
))
1014 lsa_free_r_enum_trust_dom(r_e
);
1019 for (i
= 0; i
< num_domains
; i
++)
1021 smb_io_unihdr2("", &(r_e
->hdr_domain_name
[i
]), ps
,
1025 for (i
= 0; i
< num_domains
; i
++)
1027 smb_io_unistr2("", &(r_e
->uni_domain_name
[i
]),
1028 r_e
->hdr_domain_name
[i
].buffer
, ps
,
1031 smb_io_dom_sid2("", &(r_e
->domain_sid
[i
]), ps
, depth
);
1035 prs_uint32("status", ps
, depth
, &(r_e
->status
));
1039 r_e
->uni_domain_name
= NULL
;
1040 lsa_free_r_enum_trust_dom(r_e
);
1046 void lsa_free_r_enum_trust_dom(LSA_R_ENUM_TRUST_DOM
* r_e
)
1052 safe_free(r_e
->uni_domain_name
);
1053 safe_free(r_e
->hdr_domain_name
);
1054 safe_free(r_e
->domain_sid
);
1055 r_e
->uni_domain_name
= NULL
;
1056 r_e
->hdr_domain_name
= NULL
;
1057 r_e
->domain_sid
= NULL
;
1059 r_e
->num_domains
= 0;
1060 r_e
->ptr_enum_domains
= 0;
1063 /*******************************************************************
1064 reads or writes an LSA_R_QUERY_INFO structure.
1065 ********************************************************************/
1066 BOOL
lsa_io_r_query(char *desc
, LSA_R_QUERY_INFO
* r_q
, prs_struct
* ps
,
1072 prs_debug(ps
, depth
, desc
, "lsa_io_r_query");
1075 prs_uint32("undoc_buffer", ps
, depth
, &(r_q
->undoc_buffer
));
1077 if (r_q
->undoc_buffer
!= 0)
1079 prs_uint16("info_class", ps
, depth
, &(r_q
->info_class
));
1082 switch (r_q
->info_class
)
1086 smb_io_dom_query_3("", &(r_q
->dom
.id3
), ps
,
1092 smb_io_dom_query_5("", &(r_q
->dom
.id3
), ps
,
1104 prs_uint32("status", ps
, depth
, &(r_q
->status
));
1109 /*******************************************************************
1110 makes a LSA_SID_ENUM structure.
1111 ********************************************************************/
1112 BOOL
make_lsa_sid_enum(LSA_SID_ENUM
* sen
, uint32 num_entries
,
1116 if (sen
== NULL
|| sids
== NULL
)
1119 DEBUG(5, ("make_lsa_sid_enum\n"));
1121 sen
->num_entries
= num_entries
;
1122 sen
->ptr_sid_enum
= num_entries
!= 0 ? 1 : 0;
1123 sen
->num_entries2
= num_entries
;
1125 SMB_ASSERT_ARRAY(sen
->sid
, sen
->num_entries
);
1127 for (i
= 0, i2
= 0; i
< num_entries
; i
++)
1129 if (sids
[i
] != NULL
)
1131 sen
->ptr_sid
[i
] = 1;
1132 make_dom_sid2(&(sen
->sid
[i2
]), sids
[i
]);
1137 sen
->ptr_sid
[i
] = 0;
1144 /*******************************************************************
1145 reads or writes a LSA_SID_ENUM structure.
1146 ********************************************************************/
1147 static BOOL
lsa_io_sid_enum(char *desc
, LSA_SID_ENUM
* sen
,
1148 prs_struct
* ps
, int depth
)
1155 prs_debug(ps
, depth
, desc
, "lsa_io_sid_enum");
1160 prs_uint32("num_entries ", ps
, depth
, &(sen
->num_entries
));
1161 prs_uint32("ptr_sid_enum", ps
, depth
, &(sen
->ptr_sid_enum
));
1162 prs_uint32("num_entries2", ps
, depth
, &(sen
->num_entries2
));
1164 SMB_ASSERT_ARRAY(sen
->ptr_sid
, sen
->num_entries
);
1166 for (i
= 0; i
< sen
->num_entries
; i
++)
1169 slprintf(temp
, sizeof(temp
) - 1, "ptr_sid[%d]", i
);
1170 prs_uint32(temp
, ps
, depth
, &(sen
->ptr_sid
[i
])); /* domain SID pointers to be looked up. */
1173 SMB_ASSERT_ARRAY(sen
->sid
, sen
->num_entries
);
1175 for (i
= 0; i
< sen
->num_entries
; i
++)
1178 slprintf(temp
, sizeof(temp
) - 1, "sid[%d]", i
);
1179 smb_io_dom_sid2(temp
, &(sen
->sid
[i
]), ps
, depth
); /* domain SIDs to be looked up. */
1185 /*******************************************************************
1186 reads or writes a structure.
1187 ********************************************************************/
1188 static BOOL
lsa_io_trans_names(char *desc
, LSA_TRANS_NAME_ENUM
* trn
,
1189 prs_struct
* ps
, int depth
)
1196 prs_debug(ps
, depth
, desc
, "lsa_io_trans_names");
1201 prs_uint32("num_entries ", ps
, depth
, &(trn
->num_entries
));
1202 prs_uint32("ptr_trans_names", ps
, depth
, &(trn
->ptr_trans_names
));
1204 if (trn
->ptr_trans_names
!= 0)
1206 prs_uint32("num_entries2 ", ps
, depth
,
1207 &(trn
->num_entries2
));
1208 SMB_ASSERT_ARRAY(trn
->name
, trn
->num_entries
);
1210 for (i
= 0; i
< trn
->num_entries2
; i
++)
1213 slprintf(t
, sizeof(t
) - 1, "name[%d] ", i
);
1215 lsa_io_trans_name(t
, &(trn
->name
[i
]), ps
, depth
); /* translated name */
1218 for (i
= 0; i
< trn
->num_entries2
; i
++)
1221 slprintf(t
, sizeof(t
) - 1, "name[%d] ", i
);
1223 smb_io_unistr2(t
, &(trn
->uni_name
[i
]),
1224 trn
->name
[i
].hdr_name
.buffer
, ps
,
1233 /*******************************************************************
1235 ********************************************************************/
1236 BOOL
make_q_lookup_sids(LSA_Q_LOOKUP_SIDS
* q_l
, POLICY_HND
*hnd
,
1237 int num_sids
, DOM_SID
** sids
, uint16 level
)
1242 DEBUG(5, ("make_q_lookup_sids\n"));
1244 memcpy(&(q_l
->pol
), hnd
, sizeof(q_l
->pol
));
1245 make_lsa_sid_enum(&(q_l
->sids
), num_sids
, sids
);
1247 q_l
->names
.ptr_trans_names
= 0;
1248 q_l
->names
.num_entries
= 0;
1250 q_l
->level
.value
= level
;
1255 /*******************************************************************
1256 reads or writes a LSA_Q_LOOKUP_SIDS structure.
1257 ********************************************************************/
1258 BOOL
lsa_io_q_lookup_sids(char *desc
, LSA_Q_LOOKUP_SIDS
* q_s
,
1259 prs_struct
* ps
, int depth
)
1264 prs_debug(ps
, depth
, desc
, "lsa_io_q_lookup_sids");
1269 smb_io_pol_hnd("pol_hnd", &(q_s
->pol
), ps
, depth
); /* policy handle */
1270 lsa_io_sid_enum("sids ", &(q_s
->sids
), ps
, depth
); /* sids to be looked up */
1271 lsa_io_trans_names("names ", &(q_s
->names
), ps
, depth
); /* translated names */
1272 smb_io_lookup_level("switch ", &(q_s
->level
), ps
, depth
); /* lookup level */
1274 prs_uint32("mapped_count", ps
, depth
, &(q_s
->mapped_count
));
1279 /*******************************************************************
1280 reads or writes a structure.
1281 ********************************************************************/
1282 BOOL
lsa_io_r_lookup_sids(char *desc
, LSA_R_LOOKUP_SIDS
* r_s
,
1283 prs_struct
* ps
, int depth
)
1288 prs_debug(ps
, depth
, desc
, "lsa_io_r_lookup_sids");
1293 prs_uint32("ptr_dom_ref", ps
, depth
, &(r_s
->ptr_dom_ref
));
1294 if (r_s
->ptr_dom_ref
!= 0)
1296 lsa_io_dom_r_ref("dom_ref", r_s
->dom_ref
, ps
, depth
); /* domain reference info */
1298 lsa_io_trans_names("names ", r_s
->names
, ps
, depth
); /* translated names */
1302 prs_uint32("mapped_count", ps
, depth
, &(r_s
->mapped_count
));
1304 prs_uint32("status ", ps
, depth
, &(r_s
->status
));
1309 /*******************************************************************
1311 ********************************************************************/
1312 BOOL
make_q_lookup_names(LSA_Q_LOOKUP_NAMES
* q_l
, POLICY_HND
*hnd
,
1313 uint32 num_names
, char **names
)
1319 DEBUG(5, ("make_q_lookup_names\n"));
1321 memcpy(&(q_l
->pol
), hnd
, sizeof(q_l
->pol
));
1323 q_l
->num_entries
= num_names
;
1324 q_l
->num_entries2
= num_names
;
1326 SMB_ASSERT_ARRAY(q_l
->uni_name
, q_l
->num_entries
);
1328 for (i
= 0; i
< num_names
; i
++)
1330 const char *name
= names
[i
];
1331 int len
= strlen(name
);
1332 make_uni_hdr(&q_l
->hdr_name
[i
], len
);
1333 make_unistr2(&q_l
->uni_name
[i
], name
, len
);
1336 q_l
->num_trans_entries
= 0;
1337 q_l
->ptr_trans_sids
= 0;
1338 q_l
->lookup_level
= 1;
1339 q_l
->mapped_count
= 0;
1344 /*******************************************************************
1345 reads or writes a structure.
1346 ********************************************************************/
1347 BOOL
lsa_io_q_lookup_names(char *desc
, LSA_Q_LOOKUP_NAMES
* q_r
,
1348 prs_struct
* ps
, int depth
)
1355 prs_debug(ps
, depth
, desc
, "lsa_io_q_lookup_names");
1360 smb_io_pol_hnd("", &(q_r
->pol
), ps
, depth
); /* policy handle */
1362 prs_uint32("num_entries ", ps
, depth
, &(q_r
->num_entries
));
1363 prs_uint32("num_entries2 ", ps
, depth
, &(q_r
->num_entries2
));
1365 SMB_ASSERT_ARRAY(q_r
->uni_name
, q_r
->num_entries
);
1367 for (i
= 0; i
< q_r
->num_entries
; i
++)
1369 smb_io_unihdr("hdr_name", &(q_r
->hdr_name
[i
]), ps
, depth
); /* pointer names */
1372 for (i
= 0; i
< q_r
->num_entries
; i
++)
1374 smb_io_unistr2("dom_name", &(q_r
->uni_name
[i
]),
1375 q_r
->hdr_name
[i
].buffer
, ps
, depth
); /* names to be looked up */
1379 prs_uint32("num_trans_entries ", ps
, depth
,
1380 &(q_r
->num_trans_entries
));
1381 prs_uint32("ptr_trans_sids ", ps
, depth
, &(q_r
->ptr_trans_sids
));
1382 prs_uint32("lookup_level ", ps
, depth
, &(q_r
->lookup_level
));
1383 prs_uint32("mapped_count ", ps
, depth
, &(q_r
->mapped_count
));
1388 /*******************************************************************
1389 reads or writes a structure.
1390 ********************************************************************/
1391 BOOL
lsa_io_r_lookup_names(char *desc
, LSA_R_LOOKUP_NAMES
* r_r
,
1392 prs_struct
* ps
, int depth
)
1399 prs_debug(ps
, depth
, desc
, "lsa_io_r_lookup_names");
1404 prs_uint32("ptr_dom_ref", ps
, depth
, &(r_r
->ptr_dom_ref
));
1405 if (r_r
->ptr_dom_ref
!= 0)
1407 lsa_io_dom_r_ref("", r_r
->dom_ref
, ps
, depth
);
1410 prs_uint32("num_entries", ps
, depth
, &(r_r
->num_entries
));
1411 prs_uint32("ptr_entries", ps
, depth
, &(r_r
->ptr_entries
));
1413 if (r_r
->ptr_entries
!= 0)
1415 prs_uint32("num_entries2", ps
, depth
, &(r_r
->num_entries2
));
1417 if (r_r
->num_entries2
!= r_r
->num_entries
)
1423 for (i
= 0; i
< r_r
->num_entries2
; i
++)
1425 smb_io_dom_rid2("", &(r_r
->dom_rid
[i
]), ps
, depth
); /* domain RIDs being looked up */
1429 prs_uint32("mapped_count", ps
, depth
, &(r_r
->mapped_count
));
1431 prs_uint32("status ", ps
, depth
, &(r_r
->status
));
1437 /*******************************************************************
1438 makes an LSA_Q_CLOSE structure.
1439 ********************************************************************/
1440 BOOL
make_lsa_q_close(LSA_Q_CLOSE
* q_c
, POLICY_HND
*hnd
)
1442 if (q_c
== NULL
|| hnd
== NULL
)
1445 DEBUG(5, ("make_lsa_q_close\n"));
1447 memcpy(&(q_c
->pol
), hnd
, sizeof(q_c
->pol
));
1452 /*******************************************************************
1453 reads or writes an LSA_Q_CLOSE structure.
1454 ********************************************************************/
1455 BOOL
lsa_io_q_close(char *desc
, LSA_Q_CLOSE
* q_c
, prs_struct
* ps
, int depth
)
1460 prs_debug(ps
, depth
, desc
, "lsa_io_q_close");
1463 smb_io_pol_hnd("", &(q_c
->pol
), ps
, depth
);
1468 /*******************************************************************
1469 reads or writes an LSA_R_CLOSE structure.
1470 ********************************************************************/
1471 BOOL
lsa_io_r_close(char *desc
, LSA_R_CLOSE
* r_c
, prs_struct
* ps
, int depth
)
1476 prs_debug(ps
, depth
, desc
, "lsa_io_r_close");
1479 smb_io_pol_hnd("", &(r_c
->pol
), ps
, depth
);
1481 prs_uint32("status", ps
, depth
, &(r_c
->status
));