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) Gerald (Jerry) Carter 2005
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, see <http://www.gnu.org/licenses/>.
26 #define DBGC_CLASS DBGC_RPC_PARSE
28 /*******************************************************************
29 Reads or writes a UTIME type.
30 ********************************************************************/
32 static bool smb_io_utime(const char *desc
, UTIME
*t
, prs_struct
*ps
, int depth
)
37 prs_debug(ps
, depth
, desc
, "smb_io_utime");
43 if(!prs_uint32 ("time", ps
, depth
, &t
->time
))
49 /*******************************************************************
50 Reads or writes an NTTIME structure.
51 ********************************************************************/
53 bool smb_io_time(const char *desc
, NTTIME
*nttime
, prs_struct
*ps
, int depth
)
59 prs_debug(ps
, depth
, desc
, "smb_io_time");
65 if (MARSHALLING(ps
)) {
66 low
= *nttime
& 0xFFFFFFFF;
70 if(!prs_uint32("low ", ps
, depth
, &low
)) /* low part */
72 if(!prs_uint32("high", ps
, depth
, &high
)) /* high part */
75 if (UNMARSHALLING(ps
)) {
76 *nttime
= (((uint64_t)high
<< 32) + low
);
82 /*******************************************************************
83 Reads or writes an NTTIME structure.
84 ********************************************************************/
86 bool smb_io_nttime(const char *desc
, prs_struct
*ps
, int depth
, NTTIME
*nttime
)
88 return smb_io_time( desc
, nttime
, ps
, depth
);
91 /*******************************************************************
92 Gets an enumeration handle from an ENUM_HND structure.
93 ********************************************************************/
95 uint32
get_enum_hnd(ENUM_HND
*enh
)
97 return (enh
&& enh
->ptr_hnd
!= 0) ? enh
->handle
: 0;
100 /*******************************************************************
101 Inits an ENUM_HND structure.
102 ********************************************************************/
104 void init_enum_hnd(ENUM_HND
*enh
, uint32 hnd
)
106 DEBUG(5,("smb_io_enum_hnd\n"));
108 enh
->ptr_hnd
= (hnd
!= 0) ? 1 : 0;
112 /*******************************************************************
113 Reads or writes an ENUM_HND structure.
114 ********************************************************************/
116 bool smb_io_enum_hnd(const char *desc
, ENUM_HND
*hnd
, prs_struct
*ps
, int depth
)
121 prs_debug(ps
, depth
, desc
, "smb_io_enum_hnd");
127 if(!prs_uint32("ptr_hnd", ps
, depth
, &hnd
->ptr_hnd
)) /* pointer */
130 if (hnd
->ptr_hnd
!= 0) {
131 if(!prs_uint32("handle ", ps
, depth
, &hnd
->handle
)) /* enum handle */
138 /*******************************************************************
139 Reads or writes a DOM_SID structure.
140 ********************************************************************/
142 bool smb_io_dom_sid(const char *desc
, DOM_SID
*sid
, prs_struct
*ps
, int depth
)
149 prs_debug(ps
, depth
, desc
, "smb_io_dom_sid");
152 if(!prs_uint8 ("sid_rev_num", ps
, depth
, &sid
->sid_rev_num
))
155 if(!prs_uint8 ("num_auths ", ps
, depth
, &sid
->num_auths
))
158 for (i
= 0; i
< 6; i
++)
161 slprintf(tmp
, sizeof(tmp
) - 1, "id_auth[%d] ", i
);
162 if(!prs_uint8 (tmp
, ps
, depth
, &sid
->id_auth
[i
]))
166 /* oops! XXXX should really issue a warning here... */
167 if (sid
->num_auths
> MAXSUBAUTHS
)
168 sid
->num_auths
= MAXSUBAUTHS
;
170 if(!prs_uint32s(False
, "sub_auths ", ps
, depth
, sid
->sub_auths
, sid
->num_auths
))
176 /*******************************************************************
177 Inits a DOM_SID2 structure.
178 ********************************************************************/
180 void init_dom_sid2(DOM_SID2
*sid2
, const DOM_SID
*sid
)
183 sid2
->num_auths
= sid2
->sid
.num_auths
;
186 /*******************************************************************
187 Reads or writes a DOM_SID2 structure.
188 ********************************************************************/
190 bool smb_io_dom_sid2_p(const char *desc
, prs_struct
*ps
, int depth
, DOM_SID2
**sid2
)
194 /* caputure the pointer value to stream */
196 data_p
= *sid2
? 0xf000baaa : 0;
198 if ( !prs_uint32("dom_sid2_p", ps
, depth
, &data_p
))
201 /* we're done if there is no data */
206 if (UNMARSHALLING(ps
)) {
207 if ( !(*sid2
= PRS_ALLOC_MEM(ps
, DOM_SID2
, 1)) )
213 /*******************************************************************
214 Reads or writes a DOM_SID2 structure.
215 ********************************************************************/
217 bool smb_io_dom_sid2(const char *desc
, DOM_SID2
*sid
, prs_struct
*ps
, int depth
)
222 prs_debug(ps
, depth
, desc
, "smb_io_dom_sid2");
228 if(!prs_uint32("num_auths", ps
, depth
, &sid
->num_auths
))
231 if(!smb_io_dom_sid("sid", &sid
->sid
, ps
, depth
))
237 /*******************************************************************
238 Reads or writes a struct GUID
239 ********************************************************************/
241 bool smb_io_uuid(const char *desc
, struct GUID
*uuid
,
242 prs_struct
*ps
, int depth
)
247 prs_debug(ps
, depth
, desc
, "smb_io_uuid");
250 if(!prs_uint32 ("data ", ps
, depth
, &uuid
->time_low
))
252 if(!prs_uint16 ("data ", ps
, depth
, &uuid
->time_mid
))
254 if(!prs_uint16 ("data ", ps
, depth
, &uuid
->time_hi_and_version
))
257 if(!prs_uint8s (False
, "data ", ps
, depth
, uuid
->clock_seq
, sizeof(uuid
->clock_seq
)))
259 if(!prs_uint8s (False
, "data ", ps
, depth
, uuid
->node
, sizeof(uuid
->node
)))
265 /*******************************************************************
266 creates a STRHDR structure.
267 ********************************************************************/
269 void init_str_hdr(STRHDR
*hdr
, int max_len
, int len
, uint32 buffer
)
271 hdr
->str_max_len
= max_len
;
272 hdr
->str_str_len
= len
;
273 hdr
->buffer
= buffer
;
276 /*******************************************************************
277 Reads or writes a STRHDR structure.
278 ********************************************************************/
280 bool smb_io_strhdr(const char *desc
, STRHDR
*hdr
, prs_struct
*ps
, int depth
)
285 prs_debug(ps
, depth
, desc
, "smb_io_strhdr");
291 if(!prs_uint16("str_str_len", ps
, depth
, &hdr
->str_str_len
))
293 if(!prs_uint16("str_max_len", ps
, depth
, &hdr
->str_max_len
))
295 if(!prs_uint32("buffer ", ps
, depth
, &hdr
->buffer
))
301 /*******************************************************************
302 Inits a UNIHDR structure.
303 ********************************************************************/
305 void init_uni_hdr(UNIHDR
*hdr
, UNISTR2
*str2
)
307 hdr
->uni_str_len
= 2 * (str2
->uni_str_len
);
308 hdr
->uni_max_len
= 2 * (str2
->uni_max_len
);
309 hdr
->buffer
= (str2
->uni_str_len
!= 0) ? 1 : 0;
312 /*******************************************************************
313 Reads or writes a UNIHDR structure.
314 ********************************************************************/
316 bool smb_io_unihdr(const char *desc
, UNIHDR
*hdr
, prs_struct
*ps
, int depth
)
321 prs_debug(ps
, depth
, desc
, "smb_io_unihdr");
327 if(!prs_uint16("uni_str_len", ps
, depth
, &hdr
->uni_str_len
))
329 if(!prs_uint16("uni_max_len", ps
, depth
, &hdr
->uni_max_len
))
331 if(!prs_uint32("buffer ", ps
, depth
, &hdr
->buffer
))
337 /*******************************************************************
338 Inits a BUFHDR structure.
339 ********************************************************************/
341 void init_buf_hdr(BUFHDR
*hdr
, int max_len
, int len
)
343 hdr
->buf_max_len
= max_len
;
347 /*******************************************************************
348 prs_uint16 wrapper. Call this and it sets up a pointer to where the
349 uint16 should be stored, or gets the size if reading.
350 ********************************************************************/
352 bool smb_io_hdrbuf_pre(const char *desc
, BUFHDR
*hdr
, prs_struct
*ps
, int depth
, uint32
*offset
)
354 (*offset
) = prs_offset(ps
);
359 if(!smb_io_hdrbuf(desc
, hdr
, ps
, depth
))
366 if(!prs_set_offset(ps
, prs_offset(ps
) + (sizeof(uint32
) * 2)))
373 /*******************************************************************
374 smb_io_hdrbuf wrapper. Call this and it retrospectively stores the size.
375 Does nothing on reading, as that is already handled by ...._pre()
376 ********************************************************************/
378 bool smb_io_hdrbuf_post(const char *desc
, BUFHDR
*hdr
, prs_struct
*ps
, int depth
,
379 uint32 ptr_hdrbuf
, uint32 max_len
, uint32 len
)
382 /* writing: go back and do a retrospective job. i hate this */
384 uint32 old_offset
= prs_offset(ps
);
386 init_buf_hdr(hdr
, max_len
, len
);
387 if(!prs_set_offset(ps
, ptr_hdrbuf
))
389 if(!smb_io_hdrbuf(desc
, hdr
, ps
, depth
))
392 if(!prs_set_offset(ps
, old_offset
))
399 /*******************************************************************
400 Reads or writes a BUFHDR structure.
401 ********************************************************************/
403 bool smb_io_hdrbuf(const char *desc
, BUFHDR
*hdr
, prs_struct
*ps
, int depth
)
408 prs_debug(ps
, depth
, desc
, "smb_io_hdrbuf");
414 if(!prs_uint32("buf_max_len", ps
, depth
, &hdr
->buf_max_len
))
416 if(!prs_uint32("buf_len ", ps
, depth
, &hdr
->buf_len
))
422 /*******************************************************************
423 Inits a UNISTR structure.
424 ********************************************************************/
426 void init_unistr(UNISTR
*str
, const char *buf
)
435 len
= rpcstr_push_talloc(talloc_tos(), &str
->buffer
, buf
);
436 if (len
== (size_t)-1) {
441 /*******************************************************************
442 reads or writes a UNISTR structure.
443 XXXX NOTE: UNISTR structures NEED to be null-terminated.
444 ********************************************************************/
446 bool smb_io_unistr(const char *desc
, UNISTR
*uni
, prs_struct
*ps
, int depth
)
451 prs_debug(ps
, depth
, desc
, "smb_io_unistr");
454 if(!prs_unistr("unistr", ps
, depth
, uni
))
460 /*******************************************************************
461 Allocate the RPC_DATA_BLOB memory.
462 ********************************************************************/
464 static void create_rpc_blob(RPC_DATA_BLOB
*str
, size_t len
)
467 str
->buffer
= (uint8
*)TALLOC_ZERO(talloc_tos(), len
);
468 if (str
->buffer
== NULL
)
469 smb_panic("create_rpc_blob: talloc fail");
477 /*******************************************************************
478 Inits a RPC_DATA_BLOB structure from a uint32
479 ********************************************************************/
481 void init_rpc_blob_uint32(RPC_DATA_BLOB
*str
, uint32 val
)
485 /* set up string lengths. */
486 create_rpc_blob(str
, sizeof(uint32
));
487 SIVAL(str
->buffer
, 0, val
);
490 /*******************************************************************
491 Inits a RPC_DATA_BLOB structure.
492 ********************************************************************/
494 void init_rpc_blob_str(RPC_DATA_BLOB
*str
, const char *buf
, int len
)
498 /* set up string lengths. */
500 create_rpc_blob(str
, len
*2);
501 rpcstr_push(str
->buffer
, buf
, (size_t)str
->buf_len
, STR_TERMINATE
);
505 /*******************************************************************
506 Inits a RPC_DATA_BLOB structure from a hex string.
507 ********************************************************************/
509 void init_rpc_blob_hex(RPC_DATA_BLOB
*str
, const char *buf
)
513 size_t len
= strlen(buf
);
514 create_rpc_blob(str
, len
);
515 str
->buf_len
= strhex_to_str((char *)str
->buffer
, str
->buf_len
,
520 /*******************************************************************
521 Inits a RPC_DATA_BLOB structure.
522 ********************************************************************/
524 void init_rpc_blob_bytes(RPC_DATA_BLOB
*str
, uint8
*buf
, size_t len
)
528 /* max buffer size (allocated size) */
529 if (buf
!= NULL
&& len
) {
530 create_rpc_blob(str
, len
);
531 memcpy(str
->buffer
, buf
, len
);
536 /*******************************************************************
537 reads or writes a BUFFER5 structure.
538 the buf_len member tells you how large the buffer is.
539 ********************************************************************/
540 bool smb_io_buffer5(const char *desc
, BUFFER5
*buf5
, prs_struct
*ps
, int depth
)
542 prs_debug(ps
, depth
, desc
, "smb_io_buffer5");
545 if (buf5
== NULL
) return False
;
549 if(!prs_uint32("buf_len", ps
, depth
, &buf5
->buf_len
))
553 if(!prs_buffer5(True
, "buffer" , ps
, depth
, buf5
))
560 /*******************************************************************
561 Inits a REGVAL_BUFFER structure.
562 ********************************************************************/
564 void init_regval_buffer(REGVAL_BUFFER
*str
, const uint8
*buf
, size_t len
)
568 /* max buffer size (allocated size) */
569 str
->buf_max_len
= len
;
571 str
->buf_len
= buf
!= NULL
? len
: 0;
574 SMB_ASSERT(str
->buf_max_len
>= str
->buf_len
);
575 str
->buffer
= (uint16
*)TALLOC_ZERO(talloc_tos(),
577 if (str
->buffer
== NULL
)
578 smb_panic("init_regval_buffer: talloc fail");
579 memcpy(str
->buffer
, buf
, str
->buf_len
);
583 /*******************************************************************
584 Reads or writes a REGVAL_BUFFER structure.
585 the uni_max_len member tells you how large the buffer is.
586 the uni_str_len member tells you how much of the buffer is really used.
587 ********************************************************************/
589 bool smb_io_regval_buffer(const char *desc
, prs_struct
*ps
, int depth
, REGVAL_BUFFER
*buf2
)
592 prs_debug(ps
, depth
, desc
, "smb_io_regval_buffer");
598 if(!prs_uint32("buf_max_len", ps
, depth
, &buf2
->buf_max_len
))
600 if(!prs_uint32("offset ", ps
, depth
, &buf2
->offset
))
602 if(!prs_uint32("buf_len ", ps
, depth
, &buf2
->buf_len
))
605 /* buffer advanced by indicated length of string
606 NOT by searching for null-termination */
608 if(!prs_regval_buffer(True
, "buffer ", ps
, depth
, buf2
))
614 /*******************************************************************
615 creates a UNISTR2 structure: sets up the buffer, too
616 ********************************************************************/
618 void init_buf_unistr2(UNISTR2
*str
, uint32
*ptr
, const char *buf
)
622 init_unistr2(str
, buf
, UNI_STR_TERMINATE
);
625 init_unistr2(str
, NULL
, UNI_FLAGS_NONE
);
630 /*******************************************************************
631 Copies a UNISTR2 structure.
632 ********************************************************************/
634 void copy_unistr2(UNISTR2
*str
, const UNISTR2
*from
)
636 if (from
->buffer
== NULL
) {
641 SMB_ASSERT(from
->uni_max_len
>= from
->uni_str_len
);
643 str
->uni_max_len
= from
->uni_max_len
;
644 str
->offset
= from
->offset
;
645 str
->uni_str_len
= from
->uni_str_len
;
647 /* the string buffer is allocated to the maximum size
648 (the the length of the source string) to prevent
649 reallocation of memory. */
650 if (str
->buffer
== NULL
) {
651 if (str
->uni_max_len
) {
652 str
->buffer
= (uint16
*)TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, str
->uni_max_len
);
653 if ((str
->buffer
== NULL
)) {
654 smb_panic("copy_unistr2: talloc fail");
657 /* copy the string */
658 memcpy(str
->buffer
, from
->buffer
, str
->uni_max_len
*sizeof(uint16
));
665 /*******************************************************************
666 Creates a STRING2 structure.
667 ********************************************************************/
669 void init_string2(STRING2
*str
, const char *buf
, size_t max_len
, size_t str_len
)
671 /* set up string lengths. */
672 SMB_ASSERT(max_len
>= str_len
);
674 /* Ensure buf is valid if str_len was set. Coverity check. */
675 if (str_len
&& !buf
) {
679 str
->str_max_len
= max_len
;
681 str
->str_str_len
= str_len
;
683 /* store the string */
685 str
->buffer
= (uint8
*)TALLOC_ZERO(talloc_tos(),
687 if (str
->buffer
== NULL
)
688 smb_panic("init_string2: malloc fail");
689 memcpy(str
->buffer
, buf
, str_len
);
693 /*******************************************************************
694 Reads or writes a STRING2 structure.
695 XXXX NOTE: STRING2 structures need NOT be null-terminated.
696 the str_str_len member tells you how long the string is;
697 the str_max_len member tells you how large the buffer is.
698 ********************************************************************/
700 bool smb_io_string2(const char *desc
, STRING2
*str2
, uint32 buffer
, prs_struct
*ps
, int depth
)
707 prs_debug(ps
, depth
, desc
, "smb_io_string2");
713 if(!prs_uint32("str_max_len", ps
, depth
, &str2
->str_max_len
))
715 if(!prs_uint32("offset ", ps
, depth
, &str2
->offset
))
717 if(!prs_uint32("str_str_len", ps
, depth
, &str2
->str_str_len
))
720 /* buffer advanced by indicated length of string
721 NOT by searching for null-termination */
722 if(!prs_string2(True
, "buffer ", ps
, depth
, str2
))
727 prs_debug(ps
, depth
, desc
, "smb_io_string2 - NULL");
729 memset((char *)str2
, '\0', sizeof(*str2
));
736 /*******************************************************************
737 Inits a UNISTR2 structure.
738 ********************************************************************/
740 void init_unistr2(UNISTR2
*str
, const char *buf
, enum unistr2_term_codes flags
)
743 uint32 num_chars
= 0;
746 /* We always null terminate the copy. */
747 len
= strlen(buf
) + 1;
748 if ( flags
== UNI_STR_DBLTERMINATE
)
752 if (buf
== NULL
|| len
== 0) {
753 /* no buffer -- nothing to do */
754 str
->uni_max_len
= 0;
756 str
->uni_str_len
= 0;
762 str
->buffer
= TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, len
);
763 if (str
->buffer
== NULL
) {
764 smb_panic("init_unistr2: malloc fail");
768 /* Ensure len is the length in *bytes* */
769 len
*= sizeof(uint16
);
772 * The UNISTR2 must be initialized !!!
776 rpcstr_push((char *)str
->buffer
, buf
, len
, STR_TERMINATE
);
777 num_chars
= strlen_w(str
->buffer
);
778 if (flags
== UNI_STR_TERMINATE
|| flags
== UNI_MAXLEN_TERMINATE
) {
781 if ( flags
== UNI_STR_DBLTERMINATE
)
785 str
->uni_max_len
= num_chars
;
787 str
->uni_str_len
= num_chars
;
788 if ( num_chars
&& ((flags
== UNI_MAXLEN_TERMINATE
) || (flags
== UNI_BROKEN_NON_NULL
)) )
792 /*******************************************************************
793 Inits a UNISTR4 structure.
794 ********************************************************************/
796 void init_unistr4(UNISTR4
*uni4
, const char *buf
, enum unistr2_term_codes flags
)
798 uni4
->string
= TALLOC_P( talloc_tos(), UNISTR2
);
800 smb_panic("init_unistr4: talloc fail");
803 init_unistr2( uni4
->string
, buf
, flags
);
805 uni4
->length
= 2 * (uni4
->string
->uni_str_len
);
806 uni4
->size
= 2 * (uni4
->string
->uni_max_len
);
809 void init_unistr4_w( TALLOC_CTX
*ctx
, UNISTR4
*uni4
, const smb_ucs2_t
*buf
)
811 uni4
->string
= TALLOC_P( ctx
, UNISTR2
);
813 smb_panic("init_unistr4_w: talloc fail");
816 init_unistr2_w( ctx
, uni4
->string
, buf
);
818 uni4
->length
= 2 * (uni4
->string
->uni_str_len
);
819 uni4
->size
= 2 * (uni4
->string
->uni_max_len
);
823 * Inits a UNISTR2 structure.
824 * @param ctx talloc context to allocate string on
825 * @param str pointer to string to create
826 * @param buf UCS2 null-terminated buffer to init from
829 void init_unistr2_w(TALLOC_CTX
*ctx
, UNISTR2
*str
, const smb_ucs2_t
*buf
)
831 uint32 len
= buf
? strlen_w(buf
) : 0;
835 /* set up string lengths. */
836 str
->uni_max_len
= len
;
838 str
->uni_str_len
= len
;
841 str
->buffer
= TALLOC_ZERO_ARRAY(ctx
, uint16
, len
+ 1);
842 if (str
->buffer
== NULL
) {
843 smb_panic("init_unistr2_w: talloc fail");
851 * don't move this test above ! The UNISTR2 must be initialized !!!
857 /* Yes, this is a strncpy( foo, bar, strlen(bar)) - but as
858 long as the buffer above is talloc()ed correctly then this
859 is the correct thing to do */
861 strncpy_w(str
->buffer
, buf
, len
+ 1);
865 /*******************************************************************
866 Inits a UNISTR2 structure from a UNISTR
867 ********************************************************************/
869 void init_unistr2_from_unistr(TALLOC_CTX
*ctx
, UNISTR2
*to
, const UNISTR
*from
)
873 /* the destination UNISTR2 should never be NULL.
874 if it is it is a programming error */
876 /* if the source UNISTR is NULL, then zero out
877 the destination string and return */
879 if ((from
== NULL
) || (from
->buffer
== NULL
))
882 /* get the length; UNISTR must be NULL terminated */
884 while ((from
->buffer
)[i
]!='\0')
886 i
++; /* one more to catch the terminating NULL */
887 /* is this necessary -- jerry? I need to think */
889 /* set up string lengths; uni_max_len is set to i+1
890 because we need to account for the final NULL termination */
895 /* allocate the space and copy the string buffer */
897 to
->buffer
= TALLOC_ZERO_ARRAY(ctx
, uint16
, i
);
898 if (to
->buffer
== NULL
)
899 smb_panic("init_unistr2_from_unistr: talloc fail");
900 memcpy(to
->buffer
, from
->buffer
, i
*sizeof(uint16
));
907 /*******************************************************************
908 Inits a UNISTR2 structure from a DATA_BLOB.
909 The length of the data_blob must count the bytes of the buffer.
910 Copies the blob data.
911 ********************************************************************/
913 void init_unistr2_from_datablob(UNISTR2
*str
, DATA_BLOB
*blob
)
915 /* Allocs the unistring */
916 init_unistr2(str
, NULL
, UNI_FLAGS_NONE
);
918 /* Sets the values */
919 str
->uni_str_len
= blob
->length
/ sizeof(uint16
);
920 str
->uni_max_len
= str
->uni_str_len
;
923 str
->buffer
= (uint16
*) memdup(blob
->data
, blob
->length
);
927 if ((str
->buffer
== NULL
) && (blob
->length
> 0)) {
928 smb_panic("init_unistr2_from_datablob: malloc fail");
932 /*******************************************************************
933 UNISTR2* are a little different in that the pointer and the UNISTR2
934 are not necessarily read/written back to back. So we break it up
935 into 2 separate functions.
936 See SPOOL_USER_1 in include/rpc_spoolss.h for an example.
937 ********************************************************************/
939 bool prs_io_unistr2_p(const char *desc
, prs_struct
*ps
, int depth
, UNISTR2
**uni2
)
943 /* caputure the pointer value to stream */
945 data_p
= *uni2
? 0xf000baaa : 0;
947 if ( !prs_uint32("ptr", ps
, depth
, &data_p
))
950 /* we're done if there is no data */
955 if (UNMARSHALLING(ps
)) {
956 if ( !(*uni2
= PRS_ALLOC_MEM(ps
, UNISTR2
, 1)) )
963 /*******************************************************************
964 now read/write the actual UNISTR2. Memory for the UNISTR2 (but
965 not UNISTR2.buffer) has been allocated previously by prs_unistr2_p()
966 ********************************************************************/
968 bool prs_io_unistr2(const char *desc
, prs_struct
*ps
, int depth
, UNISTR2
*uni2
)
970 /* just return true if there is no pointer to deal with.
971 the memory must have been previously allocated on unmarshalling
972 by prs_unistr2_p() */
977 /* just pass off to smb_io_unstr2() passing the uni2 address as
978 the pointer (like you would expect) */
980 return smb_io_unistr2( desc
, uni2
, uni2
? 1 : 0, ps
, depth
);
983 /*******************************************************************
984 Reads or writes a UNISTR2 structure.
985 XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
986 the uni_str_len member tells you how long the string is;
987 the uni_max_len member tells you how large the buffer is.
988 ********************************************************************/
990 bool smb_io_unistr2(const char *desc
, UNISTR2
*uni2
, uint32 buffer
, prs_struct
*ps
, int depth
)
997 prs_debug(ps
, depth
, desc
, "smb_io_unistr2");
1003 if(!prs_uint32("uni_max_len", ps
, depth
, &uni2
->uni_max_len
))
1005 if(!prs_uint32("offset ", ps
, depth
, &uni2
->offset
))
1007 if(!prs_uint32("uni_str_len", ps
, depth
, &uni2
->uni_str_len
))
1010 /* buffer advanced by indicated length of string
1011 NOT by searching for null-termination */
1012 if(!prs_unistr2(True
, "buffer ", ps
, depth
, uni2
))
1017 prs_debug(ps
, depth
, desc
, "smb_io_unistr2 - NULL");
1019 memset((char *)uni2
, '\0', sizeof(*uni2
));
1026 /*******************************************************************
1027 now read/write UNISTR4
1028 ********************************************************************/
1030 bool prs_unistr4(const char *desc
, prs_struct
*ps
, int depth
, UNISTR4
*uni4
)
1033 prs_debug(ps
, depth
, desc
, "prs_unistr4");
1036 if ( !prs_uint16("length", ps
, depth
, &uni4
->length
))
1038 if ( !prs_uint16("size", ps
, depth
, &uni4
->size
))
1043 if ( !prs_pointer( desc
, ps
, depth
, &ptr
, sizeof(UNISTR2
), (PRS_POINTER_CAST
)prs_io_unistr2
) )
1046 uni4
->string
= (UNISTR2
*)ptr
;
1051 /*******************************************************************
1052 now read/write UNISTR4 header
1053 ********************************************************************/
1055 bool prs_unistr4_hdr(const char *desc
, prs_struct
*ps
, int depth
, UNISTR4
*uni4
)
1057 prs_debug(ps
, depth
, desc
, "prs_unistr4_hdr");
1060 if ( !prs_uint16("length", ps
, depth
, &uni4
->length
) )
1062 if ( !prs_uint16("size", ps
, depth
, &uni4
->size
) )
1064 if ( !prs_io_unistr2_p(desc
, ps
, depth
, &uni4
->string
) )
1070 /*******************************************************************
1071 now read/write UNISTR4 string
1072 ********************************************************************/
1074 bool prs_unistr4_str(const char *desc
, prs_struct
*ps
, int depth
, UNISTR4
*uni4
)
1076 prs_debug(ps
, depth
, desc
, "prs_unistr4_str");
1079 if ( !prs_io_unistr2(desc
, ps
, depth
, uni4
->string
) )
1085 /*******************************************************************
1086 Reads or writes a UNISTR4_ARRAY structure.
1087 ********************************************************************/
1089 bool prs_unistr4_array(const char *desc
, prs_struct
*ps
, int depth
, UNISTR4_ARRAY
*array
)
1093 prs_debug(ps
, depth
, desc
, "prs_unistr4_array");
1096 if(!prs_uint32("count", ps
, depth
, &array
->count
))
1099 if (UNMARSHALLING(ps
)) {
1101 if ( !(array
->strings
= TALLOC_ZERO_ARRAY( talloc_tos(), UNISTR4
, array
->count
)) )
1104 array
->strings
= NULL
;
1108 /* write the headers and then the actual string buffer */
1110 for ( i
=0; i
<array
->count
; i
++ ) {
1111 if ( !prs_unistr4_hdr( "string", ps
, depth
, &array
->strings
[i
]) )
1115 for (i
=0;i
<array
->count
;i
++) {
1116 if ( !prs_unistr4_str("string", ps
, depth
, &array
->strings
[i
]) )
1123 /********************************************************************
1124 initialise a UNISTR_ARRAY from a char**
1125 ********************************************************************/
1127 bool init_unistr4_array( UNISTR4_ARRAY
*array
, uint32 count
, const char **strings
)
1131 array
->count
= count
;
1133 /* allocate memory for the array of UNISTR4 objects */
1136 if ( !(array
->strings
= TALLOC_ZERO_ARRAY(talloc_tos(), UNISTR4
, count
)) )
1139 array
->strings
= NULL
;
1142 for ( i
=0; i
<count
; i
++ )
1143 init_unistr4( &array
->strings
[i
], strings
[i
], UNI_STR_TERMINATE
);
1148 /*******************************************************************
1149 Inits a DOM_RID structure.
1150 ********************************************************************/
1152 void init_dom_rid(DOM_RID
*prid
, uint32 rid
, uint16 type
, uint32 idx
)
1156 prid
->rid_idx
= idx
;
1159 /*******************************************************************
1160 Reads or writes a DOM_RID structure.
1161 ********************************************************************/
1163 bool smb_io_dom_rid(const char *desc
, DOM_RID
*rid
, prs_struct
*ps
, int depth
)
1168 prs_debug(ps
, depth
, desc
, "smb_io_dom_rid");
1174 if(!prs_uint16("type ", ps
, depth
, &rid
->type
))
1178 if(!prs_uint32("rid ", ps
, depth
, &rid
->rid
))
1180 if(!prs_uint32("rid_idx", ps
, depth
, &rid
->rid_idx
))
1186 /*******************************************************************
1187 Reads or writes a DOM_RID2 structure.
1188 ********************************************************************/
1190 bool smb_io_dom_rid2(const char *desc
, DOM_RID2
*rid
, prs_struct
*ps
, int depth
)
1195 prs_debug(ps
, depth
, desc
, "smb_io_dom_rid2");
1201 if(!prs_uint16("type ", ps
, depth
, &rid
->type
))
1205 if(!prs_uint32("rid ", ps
, depth
, &rid
->rid
))
1207 if(!prs_uint32("rid_idx", ps
, depth
, &rid
->rid_idx
))
1209 if(!prs_uint32("unknown", ps
, depth
, &rid
->unknown
))
1216 /*******************************************************************
1217 creates a DOM_RID3 structure.
1218 ********************************************************************/
1220 void init_dom_rid3(DOM_RID3
*rid3
, uint32 rid
, uint8 type
)
1224 rid3
->ptr_type
= 0x1; /* non-zero, basically. */
1229 /*******************************************************************
1230 reads or writes a DOM_RID3 structure.
1231 ********************************************************************/
1233 bool smb_io_dom_rid3(const char *desc
, DOM_RID3
*rid3
, prs_struct
*ps
, int depth
)
1238 prs_debug(ps
, depth
, desc
, "smb_io_dom_rid3");
1244 if(!prs_uint32("rid ", ps
, depth
, &rid3
->rid
))
1246 if(!prs_uint32("type1 ", ps
, depth
, &rid3
->type1
))
1248 if(!prs_uint32("ptr_type", ps
, depth
, &rid3
->ptr_type
))
1250 if(!prs_uint32("type2 ", ps
, depth
, &rid3
->type2
))
1252 if(!prs_uint32("unk ", ps
, depth
, &rid3
->unk
))
1258 /*******************************************************************
1259 Inits a DOM_RID4 structure.
1260 ********************************************************************/
1262 void init_dom_rid4(DOM_RID4
*rid4
, uint16 unknown
, uint16 attr
, uint32 rid
)
1264 rid4
->unknown
= unknown
;
1269 /*******************************************************************
1270 Inits a DOM_CLNT_SRV structure.
1271 ********************************************************************/
1273 void init_clnt_srv(DOM_CLNT_SRV
*logcln
, const char *logon_srv
,
1274 const char *comp_name
)
1276 DEBUG(5,("init_clnt_srv: %d\n", __LINE__
));
1278 if (logon_srv
!= NULL
) {
1279 logcln
->undoc_buffer
= 1;
1280 init_unistr2(&logcln
->uni_logon_srv
, logon_srv
, UNI_STR_TERMINATE
);
1282 logcln
->undoc_buffer
= 0;
1285 if (comp_name
!= NULL
) {
1286 logcln
->undoc_buffer2
= 1;
1287 init_unistr2(&logcln
->uni_comp_name
, comp_name
, UNI_STR_TERMINATE
);
1289 logcln
->undoc_buffer2
= 0;
1293 /*******************************************************************
1294 Inits or writes a DOM_CLNT_SRV structure.
1295 ********************************************************************/
1297 bool smb_io_clnt_srv(const char *desc
, DOM_CLNT_SRV
*logcln
, prs_struct
*ps
, int depth
)
1302 prs_debug(ps
, depth
, desc
, "smb_io_clnt_srv");
1308 if(!prs_uint32("undoc_buffer ", ps
, depth
, &logcln
->undoc_buffer
))
1311 if (logcln
->undoc_buffer
!= 0) {
1312 if(!smb_io_unistr2("unistr2", &logcln
->uni_logon_srv
, logcln
->undoc_buffer
, ps
, depth
))
1319 if(!prs_uint32("undoc_buffer2", ps
, depth
, &logcln
->undoc_buffer2
))
1322 if (logcln
->undoc_buffer2
!= 0) {
1323 if(!smb_io_unistr2("unistr2", &logcln
->uni_comp_name
, logcln
->undoc_buffer2
, ps
, depth
))
1330 /*******************************************************************
1331 Inits a DOM_LOG_INFO structure.
1332 ********************************************************************/
1334 void init_log_info(DOM_LOG_INFO
*loginfo
, const char *logon_srv
, const char *acct_name
,
1335 uint16 sec_chan
, const char *comp_name
)
1337 DEBUG(5,("make_log_info %d\n", __LINE__
));
1339 loginfo
->undoc_buffer
= 1;
1341 init_unistr2(&loginfo
->uni_logon_srv
, logon_srv
, UNI_STR_TERMINATE
);
1342 init_unistr2(&loginfo
->uni_acct_name
, acct_name
, UNI_STR_TERMINATE
);
1344 loginfo
->sec_chan
= sec_chan
;
1346 init_unistr2(&loginfo
->uni_comp_name
, comp_name
, UNI_STR_TERMINATE
);
1349 /*******************************************************************
1350 Reads or writes a DOM_LOG_INFO structure.
1351 ********************************************************************/
1353 bool smb_io_log_info(const char *desc
, DOM_LOG_INFO
*loginfo
, prs_struct
*ps
, int depth
)
1355 if (loginfo
== NULL
)
1358 prs_debug(ps
, depth
, desc
, "smb_io_log_info");
1364 if(!prs_uint32("undoc_buffer", ps
, depth
, &loginfo
->undoc_buffer
))
1367 if(!smb_io_unistr2("unistr2", &loginfo
->uni_logon_srv
, True
, ps
, depth
))
1369 if(!smb_io_unistr2("unistr2", &loginfo
->uni_acct_name
, True
, ps
, depth
))
1372 if(!prs_uint16("sec_chan", ps
, depth
, &loginfo
->sec_chan
))
1375 if(!smb_io_unistr2("unistr2", &loginfo
->uni_comp_name
, True
, ps
, depth
))
1381 /*******************************************************************
1382 Reads or writes a DOM_CHAL structure.
1383 ********************************************************************/
1385 bool smb_io_chal(const char *desc
, DOM_CHAL
*chal
, prs_struct
*ps
, int depth
)
1390 prs_debug(ps
, depth
, desc
, "smb_io_chal");
1393 if(!prs_uint8s (False
, "data", ps
, depth
, chal
->data
, 8))
1399 /*******************************************************************
1400 Reads or writes a DOM_CRED structure.
1401 ********************************************************************/
1403 bool smb_io_cred(const char *desc
, DOM_CRED
*cred
, prs_struct
*ps
, int depth
)
1408 prs_debug(ps
, depth
, desc
, "smb_io_cred");
1414 if(!smb_io_chal ("", &cred
->challenge
, ps
, depth
))
1417 if(!smb_io_utime("", &cred
->timestamp
, ps
, depth
))
1423 /*******************************************************************
1424 Inits a DOM_CLNT_INFO2 structure.
1425 ********************************************************************/
1427 void init_clnt_info2(DOM_CLNT_INFO2
*clnt
,
1428 const char *logon_srv
, const char *comp_name
,
1429 const DOM_CRED
*clnt_cred
)
1431 DEBUG(5,("make_clnt_info: %d\n", __LINE__
));
1433 init_clnt_srv(&clnt
->login
, logon_srv
, comp_name
);
1435 if (clnt_cred
!= NULL
) {
1437 memcpy(&clnt
->cred
, clnt_cred
, sizeof(clnt
->cred
));
1443 /*******************************************************************
1444 Reads or writes a DOM_CLNT_INFO2 structure.
1445 ********************************************************************/
1447 bool smb_io_clnt_info2(const char *desc
, DOM_CLNT_INFO2
*clnt
, prs_struct
*ps
, int depth
)
1452 prs_debug(ps
, depth
, desc
, "smb_io_clnt_info2");
1458 if(!smb_io_clnt_srv("", &clnt
->login
, ps
, depth
))
1464 if(!prs_uint32("ptr_cred", ps
, depth
, &clnt
->ptr_cred
))
1466 if(!smb_io_cred("", &clnt
->cred
, ps
, depth
))
1472 /*******************************************************************
1473 Inits a DOM_CLNT_INFO structure.
1474 ********************************************************************/
1476 void init_clnt_info(DOM_CLNT_INFO
*clnt
,
1477 const char *logon_srv
, const char *acct_name
,
1478 uint16 sec_chan
, const char *comp_name
,
1479 const DOM_CRED
*cred
)
1481 DEBUG(5,("make_clnt_info\n"));
1483 init_log_info(&clnt
->login
, logon_srv
, acct_name
, sec_chan
, comp_name
);
1484 memcpy(&clnt
->cred
, cred
, sizeof(clnt
->cred
));
1487 /*******************************************************************
1488 Reads or writes a DOM_CLNT_INFO structure.
1489 ********************************************************************/
1491 bool smb_io_clnt_info(const char *desc
, DOM_CLNT_INFO
*clnt
, prs_struct
*ps
, int depth
)
1496 prs_debug(ps
, depth
, desc
, "smb_io_clnt_info");
1502 if(!smb_io_log_info("", &clnt
->login
, ps
, depth
))
1504 if(!smb_io_cred("", &clnt
->cred
, ps
, depth
))
1510 /*******************************************************************
1511 Inits a DOM_LOGON_ID structure.
1512 ********************************************************************/
1514 void init_logon_id(DOM_LOGON_ID
*logonid
, uint32 log_id_low
, uint32 log_id_high
)
1516 DEBUG(5,("make_logon_id: %d\n", __LINE__
));
1518 logonid
->low
= log_id_low
;
1519 logonid
->high
= log_id_high
;
1522 /*******************************************************************
1523 Reads or writes a DOM_LOGON_ID structure.
1524 ********************************************************************/
1526 bool smb_io_logon_id(const char *desc
, DOM_LOGON_ID
*logonid
, prs_struct
*ps
, int depth
)
1528 if (logonid
== NULL
)
1531 prs_debug(ps
, depth
, desc
, "smb_io_logon_id");
1537 if(!prs_uint32("low ", ps
, depth
, &logonid
->low
))
1539 if(!prs_uint32("high", ps
, depth
, &logonid
->high
))
1545 /*******************************************************************
1546 Inits an OWF_INFO structure.
1547 ********************************************************************/
1549 void init_owf_info(OWF_INFO
*hash
, const uint8 data
[16])
1551 DEBUG(5,("init_owf_info: %d\n", __LINE__
));
1554 memcpy(hash
->data
, data
, sizeof(hash
->data
));
1556 memset((char *)hash
->data
, '\0', sizeof(hash
->data
));
1559 /*******************************************************************
1560 Reads or writes an OWF_INFO structure.
1561 ********************************************************************/
1563 bool smb_io_owf_info(const char *desc
, OWF_INFO
*hash
, prs_struct
*ps
, int depth
)
1568 prs_debug(ps
, depth
, desc
, "smb_io_owf_info");
1574 if(!prs_uint8s (False
, "data", ps
, depth
, hash
->data
, 16))
1580 /*******************************************************************
1581 Reads or writes a DOM_GID structure.
1582 ********************************************************************/
1584 bool smb_io_gid(const char *desc
, DOM_GID
*gid
, prs_struct
*ps
, int depth
)
1589 prs_debug(ps
, depth
, desc
, "smb_io_gid");
1595 if(!prs_uint32("g_rid", ps
, depth
, &gid
->g_rid
))
1597 if(!prs_uint32("attr ", ps
, depth
, &gid
->attr
))
1603 /*******************************************************************
1604 Reads or writes an POLICY_HND structure.
1605 ********************************************************************/
1607 bool smb_io_pol_hnd(const char *desc
, POLICY_HND
*pol
, prs_struct
*ps
, int depth
)
1612 prs_debug(ps
, depth
, desc
, "smb_io_pol_hnd");
1618 if(UNMARSHALLING(ps
))
1621 if (!prs_uint32("handle_type", ps
, depth
, &pol
->handle_type
))
1623 if (!smb_io_uuid("uuid", (struct GUID
*)&pol
->uuid
, ps
, depth
))
1629 /*******************************************************************
1631 ********************************************************************/
1633 void init_unistr3(UNISTR3
*str
, const char *buf
)
1637 str
->str
.buffer
= NULL
;
1641 str
->uni_str_len
= strlen(buf
) + 1;
1643 if (str
->uni_str_len
) {
1644 str
->str
.buffer
= TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, str
->uni_str_len
);
1645 if (str
->str
.buffer
== NULL
)
1646 smb_panic("init_unistr3: malloc fail");
1648 rpcstr_push((char *)str
->str
.buffer
, buf
, str
->uni_str_len
* sizeof(uint16
), STR_TERMINATE
);
1650 str
->str
.buffer
= NULL
;
1654 /*******************************************************************
1655 Reads or writes a UNISTR3 structure.
1656 ********************************************************************/
1658 bool smb_io_unistr3(const char *desc
, UNISTR3
*name
, prs_struct
*ps
, int depth
)
1663 prs_debug(ps
, depth
, desc
, "smb_io_unistr3");
1669 if(!prs_uint32("uni_str_len", ps
, depth
, &name
->uni_str_len
))
1672 /* we're done if there is no string */
1674 if ( name
->uni_str_len
== 0 )
1677 /* don't know if len is specified by uni_str_len member... */
1678 /* assume unicode string is unicode-null-terminated, instead */
1680 if(!prs_unistr3(True
, "unistr", name
, ps
, depth
))
1686 /*******************************************************************
1687 Stream a uint64_struct
1688 ********************************************************************/
1689 bool prs_uint64(const char *name
, prs_struct
*ps
, int depth
, uint64
*data64
)
1691 if (UNMARSHALLING(ps
)) {
1694 if (!prs_uint32(name
, ps
, depth
+1, &low
))
1697 if (!prs_uint32(name
, ps
, depth
+1, &high
))
1700 *data64
= ((uint64_t)high
<< 32) + low
;
1704 uint32 high
= (*data64
) >> 32, low
= (*data64
) & 0xFFFFFFFF;
1705 return prs_uint32(name
, ps
, depth
+1, &low
) &&
1706 prs_uint32(name
, ps
, depth
+1, &high
);
1710 /*******************************************************************
1711 reads or writes a BUFHDR2 structure.
1712 ********************************************************************/
1713 bool smb_io_bufhdr2(const char *desc
, BUFHDR2
*hdr
, prs_struct
*ps
, int depth
)
1715 prs_debug(ps
, depth
, desc
, "smb_io_bufhdr2");
1720 if (!prs_uint32("info_level", ps
, depth
, &(hdr
->info_level
)))
1722 if (!prs_uint32("length ", ps
, depth
, &(hdr
->length
)))
1724 if (!prs_uint32("buffer ", ps
, depth
, &(hdr
->buffer
)))
1730 /*******************************************************************
1731 reads or writes a BUFHDR4 structure.
1732 ********************************************************************/
1733 bool smb_io_bufhdr4(const char *desc
, BUFHDR4
*hdr
, prs_struct
*ps
, int depth
)
1735 prs_debug(ps
, depth
, desc
, "smb_io_bufhdr4");
1740 if (!prs_uint32("size", ps
, depth
, &hdr
->size
))
1742 if (!prs_uint32("buffer", ps
, depth
, &hdr
->buffer
))
1748 /*******************************************************************
1749 reads or writes a RPC_DATA_BLOB structure.
1750 ********************************************************************/
1752 bool smb_io_rpc_blob(const char *desc
, RPC_DATA_BLOB
*blob
, prs_struct
*ps
, int depth
)
1754 prs_debug(ps
, depth
, desc
, "smb_io_rpc_blob");
1759 if ( !prs_uint32("buf_len", ps
, depth
, &blob
->buf_len
) )
1762 if ( blob
->buf_len
== 0 )
1765 if (UNMARSHALLING(ps
)) {
1766 blob
->buffer
= PRS_ALLOC_MEM(ps
, uint8
, blob
->buf_len
);
1767 if (!blob
->buffer
) {
1772 if ( !prs_uint8s(True
, "buffer", ps
, depth
, blob
->buffer
, blob
->buf_len
) )
1778 /*******************************************************************
1779 creates a UNIHDR structure.
1780 ********************************************************************/
1782 bool make_uni_hdr(UNIHDR
*hdr
, int len
)
1788 hdr
->uni_str_len
= 2 * len
;
1789 hdr
->uni_max_len
= 2 * len
;
1790 hdr
->buffer
= len
!= 0 ? 1 : 0;
1795 /*******************************************************************
1796 creates a BUFHDR2 structure.
1797 ********************************************************************/
1798 bool make_bufhdr2(BUFHDR2
*hdr
, uint32 info_level
, uint32 length
, uint32 buffer
)
1800 hdr
->info_level
= info_level
;
1801 hdr
->length
= length
;
1802 hdr
->buffer
= buffer
;
1807 /*******************************************************************
1808 return the length of a UNISTR string.
1809 ********************************************************************/
1811 uint32
str_len_uni(UNISTR
*source
)
1815 if (!source
->buffer
)
1818 while (source
->buffer
[i
])
1824 /*******************************************************************
1825 Verifies policy handle
1826 ********************************************************************/
1828 bool policy_handle_is_valid(const POLICY_HND
*hnd
)
1830 POLICY_HND zero_pol
;
1832 ZERO_STRUCT(zero_pol
);
1833 return ((memcmp(&zero_pol
, hnd
, sizeof(POLICY_HND
)) == 0) ? false : true );