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");
290 if(!prs_uint16("str_str_len", ps
, depth
, &hdr
->str_str_len
))
292 if(!prs_uint16("str_max_len", ps
, depth
, &hdr
->str_max_len
))
294 if(!prs_uint32("buffer ", ps
, depth
, &hdr
->buffer
))
300 /*******************************************************************
301 Inits a UNIHDR structure.
302 ********************************************************************/
304 void init_uni_hdr(UNIHDR
*hdr
, UNISTR2
*str2
)
306 hdr
->uni_str_len
= 2 * (str2
->uni_str_len
);
307 hdr
->uni_max_len
= 2 * (str2
->uni_max_len
);
308 hdr
->buffer
= (str2
->uni_str_len
!= 0) ? 1 : 0;
311 /*******************************************************************
312 Reads or writes a UNIHDR structure.
313 ********************************************************************/
315 BOOL
smb_io_unihdr(const char *desc
, UNIHDR
*hdr
, prs_struct
*ps
, int depth
)
320 prs_debug(ps
, depth
, desc
, "smb_io_unihdr");
326 if(!prs_uint16("uni_str_len", ps
, depth
, &hdr
->uni_str_len
))
328 if(!prs_uint16("uni_max_len", ps
, depth
, &hdr
->uni_max_len
))
330 if(!prs_uint32("buffer ", ps
, depth
, &hdr
->buffer
))
336 /*******************************************************************
337 Inits a BUFHDR structure.
338 ********************************************************************/
340 void init_buf_hdr(BUFHDR
*hdr
, int max_len
, int len
)
342 hdr
->buf_max_len
= max_len
;
346 /*******************************************************************
347 prs_uint16 wrapper. Call this and it sets up a pointer to where the
348 uint16 should be stored, or gets the size if reading.
349 ********************************************************************/
351 BOOL
smb_io_hdrbuf_pre(const char *desc
, BUFHDR
*hdr
, prs_struct
*ps
, int depth
, uint32
*offset
)
353 (*offset
) = prs_offset(ps
);
358 if(!smb_io_hdrbuf(desc
, hdr
, ps
, depth
))
365 if(!prs_set_offset(ps
, prs_offset(ps
) + (sizeof(uint32
) * 2)))
372 /*******************************************************************
373 smb_io_hdrbuf wrapper. Call this and it retrospectively stores the size.
374 Does nothing on reading, as that is already handled by ...._pre()
375 ********************************************************************/
377 BOOL
smb_io_hdrbuf_post(const char *desc
, BUFHDR
*hdr
, prs_struct
*ps
, int depth
,
378 uint32 ptr_hdrbuf
, uint32 max_len
, uint32 len
)
381 /* writing: go back and do a retrospective job. i hate this */
383 uint32 old_offset
= prs_offset(ps
);
385 init_buf_hdr(hdr
, max_len
, len
);
386 if(!prs_set_offset(ps
, ptr_hdrbuf
))
388 if(!smb_io_hdrbuf(desc
, hdr
, ps
, depth
))
391 if(!prs_set_offset(ps
, old_offset
))
398 /*******************************************************************
399 Reads or writes a BUFHDR structure.
400 ********************************************************************/
402 BOOL
smb_io_hdrbuf(const char *desc
, BUFHDR
*hdr
, prs_struct
*ps
, int depth
)
407 prs_debug(ps
, depth
, desc
, "smb_io_hdrbuf");
413 if(!prs_uint32("buf_max_len", ps
, depth
, &hdr
->buf_max_len
))
415 if(!prs_uint32("buf_len ", ps
, depth
, &hdr
->buf_len
))
421 /*******************************************************************
422 Inits a UNISTR structure.
423 ********************************************************************/
425 void init_unistr(UNISTR
*str
, const char *buf
)
434 len
= strlen(buf
) + 1;
437 str
->buffer
= TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, len
);
438 if (str
->buffer
== NULL
)
439 smb_panic("init_unistr: malloc fail");
441 rpcstr_push(str
->buffer
, buf
, len
*sizeof(uint16
), STR_TERMINATE
);
447 /*******************************************************************
448 reads or writes a UNISTR structure.
449 XXXX NOTE: UNISTR structures NEED to be null-terminated.
450 ********************************************************************/
452 BOOL
smb_io_unistr(const char *desc
, UNISTR
*uni
, prs_struct
*ps
, int depth
)
457 prs_debug(ps
, depth
, desc
, "smb_io_unistr");
460 if(!prs_unistr("unistr", ps
, depth
, uni
))
466 /*******************************************************************
467 Allocate the RPC_DATA_BLOB memory.
468 ********************************************************************/
470 static void create_rpc_blob(RPC_DATA_BLOB
*str
, size_t len
)
473 str
->buffer
= (uint8
*)TALLOC_ZERO(talloc_tos(), len
);
474 if (str
->buffer
== NULL
)
475 smb_panic("create_rpc_blob: talloc fail");
483 /*******************************************************************
484 Inits a RPC_DATA_BLOB structure from a uint32
485 ********************************************************************/
487 void init_rpc_blob_uint32(RPC_DATA_BLOB
*str
, uint32 val
)
491 /* set up string lengths. */
492 create_rpc_blob(str
, sizeof(uint32
));
493 SIVAL(str
->buffer
, 0, val
);
496 /*******************************************************************
497 Inits a RPC_DATA_BLOB structure.
498 ********************************************************************/
500 void init_rpc_blob_str(RPC_DATA_BLOB
*str
, const char *buf
, int len
)
504 /* set up string lengths. */
506 create_rpc_blob(str
, len
*2);
507 rpcstr_push(str
->buffer
, buf
, (size_t)str
->buf_len
, STR_TERMINATE
);
511 /*******************************************************************
512 Inits a RPC_DATA_BLOB structure from a hex string.
513 ********************************************************************/
515 void init_rpc_blob_hex(RPC_DATA_BLOB
*str
, const char *buf
)
519 create_rpc_blob(str
, strlen(buf
));
520 str
->buf_len
= strhex_to_str((char *)str
->buffer
, str
->buf_len
, buf
);
524 /*******************************************************************
525 Inits a RPC_DATA_BLOB structure.
526 ********************************************************************/
528 void init_rpc_blob_bytes(RPC_DATA_BLOB
*str
, uint8
*buf
, size_t len
)
532 /* max buffer size (allocated size) */
533 if (buf
!= NULL
&& len
) {
534 create_rpc_blob(str
, len
);
535 memcpy(str
->buffer
, buf
, len
);
540 /*******************************************************************
541 reads or writes a BUFFER5 structure.
542 the buf_len member tells you how large the buffer is.
543 ********************************************************************/
544 BOOL
smb_io_buffer5(const char *desc
, BUFFER5
*buf5
, prs_struct
*ps
, int depth
)
546 prs_debug(ps
, depth
, desc
, "smb_io_buffer5");
549 if (buf5
== NULL
) return False
;
553 if(!prs_uint32("buf_len", ps
, depth
, &buf5
->buf_len
))
557 if(!prs_buffer5(True
, "buffer" , ps
, depth
, buf5
))
564 /*******************************************************************
565 Inits a REGVAL_BUFFER structure.
566 ********************************************************************/
568 void init_regval_buffer(REGVAL_BUFFER
*str
, const uint8
*buf
, size_t len
)
572 /* max buffer size (allocated size) */
573 str
->buf_max_len
= len
;
575 str
->buf_len
= buf
!= NULL
? len
: 0;
578 SMB_ASSERT(str
->buf_max_len
>= str
->buf_len
);
579 str
->buffer
= (uint16
*)TALLOC_ZERO(talloc_tos(),
581 if (str
->buffer
== NULL
)
582 smb_panic("init_regval_buffer: talloc fail");
583 memcpy(str
->buffer
, buf
, str
->buf_len
);
587 /*******************************************************************
588 Reads or writes a REGVAL_BUFFER structure.
589 the uni_max_len member tells you how large the buffer is.
590 the uni_str_len member tells you how much of the buffer is really used.
591 ********************************************************************/
593 BOOL
smb_io_regval_buffer(const char *desc
, prs_struct
*ps
, int depth
, REGVAL_BUFFER
*buf2
)
596 prs_debug(ps
, depth
, desc
, "smb_io_regval_buffer");
602 if(!prs_uint32("buf_max_len", ps
, depth
, &buf2
->buf_max_len
))
604 if(!prs_uint32("offset ", ps
, depth
, &buf2
->offset
))
606 if(!prs_uint32("buf_len ", ps
, depth
, &buf2
->buf_len
))
609 /* buffer advanced by indicated length of string
610 NOT by searching for null-termination */
612 if(!prs_regval_buffer(True
, "buffer ", ps
, depth
, buf2
))
618 /*******************************************************************
619 creates a UNISTR2 structure: sets up the buffer, too
620 ********************************************************************/
622 void init_buf_unistr2(UNISTR2
*str
, uint32
*ptr
, const char *buf
)
626 init_unistr2(str
, buf
, UNI_STR_TERMINATE
);
629 init_unistr2(str
, NULL
, UNI_FLAGS_NONE
);
634 /*******************************************************************
635 Copies a UNISTR2 structure.
636 ********************************************************************/
638 void copy_unistr2(UNISTR2
*str
, const UNISTR2
*from
)
640 if (from
->buffer
== NULL
) {
645 SMB_ASSERT(from
->uni_max_len
>= from
->uni_str_len
);
647 str
->uni_max_len
= from
->uni_max_len
;
648 str
->offset
= from
->offset
;
649 str
->uni_str_len
= from
->uni_str_len
;
651 /* the string buffer is allocated to the maximum size
652 (the the length of the source string) to prevent
653 reallocation of memory. */
654 if (str
->buffer
== NULL
) {
655 if (str
->uni_max_len
) {
656 str
->buffer
= (uint16
*)TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, str
->uni_max_len
);
657 if ((str
->buffer
== NULL
)) {
658 smb_panic("copy_unistr2: talloc fail");
661 /* copy the string */
662 memcpy(str
->buffer
, from
->buffer
, str
->uni_max_len
*sizeof(uint16
));
669 /*******************************************************************
670 Creates a STRING2 structure.
671 ********************************************************************/
673 void init_string2(STRING2
*str
, const char *buf
, size_t max_len
, size_t str_len
)
675 /* set up string lengths. */
676 SMB_ASSERT(max_len
>= str_len
);
678 /* Ensure buf is valid if str_len was set. Coverity check. */
679 if (str_len
&& !buf
) {
683 str
->str_max_len
= max_len
;
685 str
->str_str_len
= str_len
;
687 /* store the string */
689 str
->buffer
= (uint8
*)TALLOC_ZERO(talloc_tos(),
691 if (str
->buffer
== NULL
)
692 smb_panic("init_string2: malloc fail");
693 memcpy(str
->buffer
, buf
, str_len
);
697 /*******************************************************************
698 Reads or writes a STRING2 structure.
699 XXXX NOTE: STRING2 structures need NOT be null-terminated.
700 the str_str_len member tells you how long the string is;
701 the str_max_len member tells you how large the buffer is.
702 ********************************************************************/
704 BOOL
smb_io_string2(const char *desc
, STRING2
*str2
, uint32 buffer
, prs_struct
*ps
, int depth
)
711 prs_debug(ps
, depth
, desc
, "smb_io_string2");
717 if(!prs_uint32("str_max_len", ps
, depth
, &str2
->str_max_len
))
719 if(!prs_uint32("offset ", ps
, depth
, &str2
->offset
))
721 if(!prs_uint32("str_str_len", ps
, depth
, &str2
->str_str_len
))
724 /* buffer advanced by indicated length of string
725 NOT by searching for null-termination */
726 if(!prs_string2(True
, "buffer ", ps
, depth
, str2
))
731 prs_debug(ps
, depth
, desc
, "smb_io_string2 - NULL");
733 memset((char *)str2
, '\0', sizeof(*str2
));
740 /*******************************************************************
741 Inits a UNISTR2 structure.
742 ********************************************************************/
744 void init_unistr2(UNISTR2
*str
, const char *buf
, enum unistr2_term_codes flags
)
747 uint32 num_chars
= 0;
750 /* We always null terminate the copy. */
751 len
= strlen(buf
) + 1;
752 if ( flags
== UNI_STR_DBLTERMINATE
)
756 if (buf
== NULL
|| len
== 0) {
757 /* no buffer -- nothing to do */
758 str
->uni_max_len
= 0;
760 str
->uni_str_len
= 0;
766 str
->buffer
= TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, len
);
767 if (str
->buffer
== NULL
) {
768 smb_panic("init_unistr2: malloc fail");
772 /* Ensure len is the length in *bytes* */
773 len
*= sizeof(uint16
);
776 * The UNISTR2 must be initialized !!!
780 rpcstr_push((char *)str
->buffer
, buf
, len
, STR_TERMINATE
);
781 num_chars
= strlen_w(str
->buffer
);
782 if (flags
== UNI_STR_TERMINATE
|| flags
== UNI_MAXLEN_TERMINATE
) {
785 if ( flags
== UNI_STR_DBLTERMINATE
)
789 str
->uni_max_len
= num_chars
;
791 str
->uni_str_len
= num_chars
;
792 if ( num_chars
&& ((flags
== UNI_MAXLEN_TERMINATE
) || (flags
== UNI_BROKEN_NON_NULL
)) )
796 /*******************************************************************
797 Inits a UNISTR4 structure.
798 ********************************************************************/
800 void init_unistr4(UNISTR4
*uni4
, const char *buf
, enum unistr2_term_codes flags
)
802 uni4
->string
= TALLOC_P( talloc_tos(), UNISTR2
);
804 smb_panic("init_unistr4: talloc fail");
807 init_unistr2( uni4
->string
, buf
, flags
);
809 uni4
->length
= 2 * (uni4
->string
->uni_str_len
);
810 uni4
->size
= 2 * (uni4
->string
->uni_max_len
);
813 void init_unistr4_w( TALLOC_CTX
*ctx
, UNISTR4
*uni4
, const smb_ucs2_t
*buf
)
815 uni4
->string
= TALLOC_P( ctx
, UNISTR2
);
817 smb_panic("init_unistr4_w: talloc fail");
820 init_unistr2_w( ctx
, uni4
->string
, buf
);
822 uni4
->length
= 2 * (uni4
->string
->uni_str_len
);
823 uni4
->size
= 2 * (uni4
->string
->uni_max_len
);
827 * Inits a UNISTR2 structure.
828 * @param ctx talloc context to allocate string on
829 * @param str pointer to string to create
830 * @param buf UCS2 null-terminated buffer to init from
833 void init_unistr2_w(TALLOC_CTX
*ctx
, UNISTR2
*str
, const smb_ucs2_t
*buf
)
835 uint32 len
= buf
? strlen_w(buf
) : 0;
839 /* set up string lengths. */
840 str
->uni_max_len
= len
;
842 str
->uni_str_len
= len
;
845 str
->buffer
= TALLOC_ZERO_ARRAY(ctx
, uint16
, len
+ 1);
846 if (str
->buffer
== NULL
) {
847 smb_panic("init_unistr2_w: talloc fail");
855 * don't move this test above ! The UNISTR2 must be initialized !!!
861 /* Yes, this is a strncpy( foo, bar, strlen(bar)) - but as
862 long as the buffer above is talloc()ed correctly then this
863 is the correct thing to do */
865 strncpy_w(str
->buffer
, buf
, len
+ 1);
869 /*******************************************************************
870 Inits a UNISTR2 structure from a UNISTR
871 ********************************************************************/
873 void init_unistr2_from_unistr(UNISTR2
*to
, const UNISTR
*from
)
877 /* the destination UNISTR2 should never be NULL.
878 if it is it is a programming error */
880 /* if the source UNISTR is NULL, then zero out
881 the destination string and return */
883 if ((from
== NULL
) || (from
->buffer
== NULL
))
886 /* get the length; UNISTR must be NULL terminated */
888 while ((from
->buffer
)[i
]!='\0')
890 i
++; /* one more to catch the terminating NULL */
891 /* is this necessary -- jerry? I need to think */
893 /* set up string lengths; uni_max_len is set to i+1
894 because we need to account for the final NULL termination */
899 /* allocate the space and copy the string buffer */
901 to
->buffer
= TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, i
);
902 if (to
->buffer
== NULL
)
903 smb_panic("init_unistr2_from_unistr: malloc fail");
904 memcpy(to
->buffer
, from
->buffer
, i
*sizeof(uint16
));
911 /*******************************************************************
912 Inits a UNISTR2 structure from a DATA_BLOB.
913 The length of the data_blob must count the bytes of the buffer.
914 Copies the blob data.
915 ********************************************************************/
917 void init_unistr2_from_datablob(UNISTR2
*str
, DATA_BLOB
*blob
)
919 /* Allocs the unistring */
920 init_unistr2(str
, NULL
, UNI_FLAGS_NONE
);
922 /* Sets the values */
923 str
->uni_str_len
= blob
->length
/ sizeof(uint16
);
924 str
->uni_max_len
= str
->uni_str_len
;
927 str
->buffer
= (uint16
*) memdup(blob
->data
, blob
->length
);
931 if ((str
->buffer
== NULL
) && (blob
->length
> 0)) {
932 smb_panic("init_unistr2_from_datablob: malloc fail");
936 /*******************************************************************
937 UNISTR2* are a little different in that the pointer and the UNISTR2
938 are not necessarily read/written back to back. So we break it up
939 into 2 separate functions.
940 See SPOOL_USER_1 in include/rpc_spoolss.h for an example.
941 ********************************************************************/
943 BOOL
prs_io_unistr2_p(const char *desc
, prs_struct
*ps
, int depth
, UNISTR2
**uni2
)
947 /* caputure the pointer value to stream */
949 data_p
= *uni2
? 0xf000baaa : 0;
951 if ( !prs_uint32("ptr", ps
, depth
, &data_p
))
954 /* we're done if there is no data */
959 if (UNMARSHALLING(ps
)) {
960 if ( !(*uni2
= PRS_ALLOC_MEM(ps
, UNISTR2
, 1)) )
967 /*******************************************************************
968 now read/write the actual UNISTR2. Memory for the UNISTR2 (but
969 not UNISTR2.buffer) has been allocated previously by prs_unistr2_p()
970 ********************************************************************/
972 BOOL
prs_io_unistr2(const char *desc
, prs_struct
*ps
, int depth
, UNISTR2
*uni2
)
974 /* just return true if there is no pointer to deal with.
975 the memory must have been previously allocated on unmarshalling
976 by prs_unistr2_p() */
981 /* just pass off to smb_io_unstr2() passing the uni2 address as
982 the pointer (like you would expect) */
984 return smb_io_unistr2( desc
, uni2
, uni2
? 1 : 0, ps
, depth
);
987 /*******************************************************************
988 Reads or writes a UNISTR2 structure.
989 XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
990 the uni_str_len member tells you how long the string is;
991 the uni_max_len member tells you how large the buffer is.
992 ********************************************************************/
994 BOOL
smb_io_unistr2(const char *desc
, UNISTR2
*uni2
, uint32 buffer
, prs_struct
*ps
, int depth
)
1001 prs_debug(ps
, depth
, desc
, "smb_io_unistr2");
1007 if(!prs_uint32("uni_max_len", ps
, depth
, &uni2
->uni_max_len
))
1009 if(!prs_uint32("offset ", ps
, depth
, &uni2
->offset
))
1011 if(!prs_uint32("uni_str_len", ps
, depth
, &uni2
->uni_str_len
))
1014 /* buffer advanced by indicated length of string
1015 NOT by searching for null-termination */
1016 if(!prs_unistr2(True
, "buffer ", ps
, depth
, uni2
))
1021 prs_debug(ps
, depth
, desc
, "smb_io_unistr2 - NULL");
1023 memset((char *)uni2
, '\0', sizeof(*uni2
));
1030 /*******************************************************************
1031 now read/write UNISTR4
1032 ********************************************************************/
1034 BOOL
prs_unistr4(const char *desc
, prs_struct
*ps
, int depth
, UNISTR4
*uni4
)
1037 prs_debug(ps
, depth
, desc
, "prs_unistr4");
1040 if ( !prs_uint16("length", ps
, depth
, &uni4
->length
))
1042 if ( !prs_uint16("size", ps
, depth
, &uni4
->size
))
1047 if ( !prs_pointer( desc
, ps
, depth
, &ptr
, sizeof(UNISTR2
), (PRS_POINTER_CAST
)prs_io_unistr2
) )
1050 uni4
->string
= (UNISTR2
*)ptr
;
1055 /*******************************************************************
1056 now read/write UNISTR4 header
1057 ********************************************************************/
1059 BOOL
prs_unistr4_hdr(const char *desc
, prs_struct
*ps
, int depth
, UNISTR4
*uni4
)
1061 prs_debug(ps
, depth
, desc
, "prs_unistr4_hdr");
1064 if ( !prs_uint16("length", ps
, depth
, &uni4
->length
) )
1066 if ( !prs_uint16("size", ps
, depth
, &uni4
->size
) )
1068 if ( !prs_io_unistr2_p(desc
, ps
, depth
, &uni4
->string
) )
1074 /*******************************************************************
1075 now read/write UNISTR4 string
1076 ********************************************************************/
1078 BOOL
prs_unistr4_str(const char *desc
, prs_struct
*ps
, int depth
, UNISTR4
*uni4
)
1080 prs_debug(ps
, depth
, desc
, "prs_unistr4_str");
1083 if ( !prs_io_unistr2(desc
, ps
, depth
, uni4
->string
) )
1089 /*******************************************************************
1090 Reads or writes a UNISTR4_ARRAY structure.
1091 ********************************************************************/
1093 BOOL
prs_unistr4_array(const char *desc
, prs_struct
*ps
, int depth
, UNISTR4_ARRAY
*array
)
1097 prs_debug(ps
, depth
, desc
, "prs_unistr4_array");
1100 if(!prs_uint32("count", ps
, depth
, &array
->count
))
1103 if (UNMARSHALLING(ps
)) {
1105 if ( !(array
->strings
= TALLOC_ZERO_ARRAY( talloc_tos(), UNISTR4
, array
->count
)) )
1108 array
->strings
= NULL
;
1112 /* write the headers and then the actual string buffer */
1114 for ( i
=0; i
<array
->count
; i
++ ) {
1115 if ( !prs_unistr4_hdr( "string", ps
, depth
, &array
->strings
[i
]) )
1119 for (i
=0;i
<array
->count
;i
++) {
1120 if ( !prs_unistr4_str("string", ps
, depth
, &array
->strings
[i
]) )
1127 /********************************************************************
1128 initialise a UNISTR_ARRAY from a char**
1129 ********************************************************************/
1131 BOOL
init_unistr4_array( UNISTR4_ARRAY
*array
, uint32 count
, const char **strings
)
1135 array
->count
= count
;
1137 /* allocate memory for the array of UNISTR4 objects */
1140 if ( !(array
->strings
= TALLOC_ZERO_ARRAY(talloc_tos(), UNISTR4
, count
)) )
1143 array
->strings
= NULL
;
1146 for ( i
=0; i
<count
; i
++ )
1147 init_unistr4( &array
->strings
[i
], strings
[i
], UNI_STR_TERMINATE
);
1152 BOOL
smb_io_lockout_string_hdr(const char *desc
, HDR_LOCKOUT_STRING
*hdr_account_lockout
, prs_struct
*ps
, int depth
)
1154 prs_debug(ps
, depth
, desc
, "smb_io_lockout_string_hdr");
1160 if(!prs_uint16("size", ps
, depth
, &hdr_account_lockout
->size
))
1162 if(!prs_uint16("length", ps
, depth
, &hdr_account_lockout
->length
))
1164 if(!prs_uint32("buffer", ps
, depth
, &hdr_account_lockout
->buffer
))
1170 BOOL
smb_io_account_lockout_str(const char *desc
, LOCKOUT_STRING
*account_lockout
, uint32 buffer
, prs_struct
*ps
, int depth
)
1172 prs_debug(ps
, depth
, desc
, "smb_io_account_lockout_string");
1175 if(!prs_uint32("array_size", ps
, depth
, &account_lockout
->array_size
))
1178 if(!prs_uint32("offset", ps
, depth
, &account_lockout
->offset
))
1180 if(!prs_uint32("length", ps
, depth
, &account_lockout
->length
))
1183 if (!prs_uint64("lockout_duration", ps
, depth
, &account_lockout
->lockout_duration
))
1185 if (!prs_uint64("reset_count", ps
, depth
, &account_lockout
->reset_count
))
1187 if (!prs_uint32("bad_attempt_lockout", ps
, depth
, &account_lockout
->bad_attempt_lockout
))
1189 if (!prs_uint32("dummy", ps
, depth
, &account_lockout
->dummy
))
1192 if(!prs_uint16s (False
, "bindata", ps
, depth
, &account_lockout
->bindata
, length
))
1199 /*******************************************************************
1200 Inits a DOM_RID structure.
1201 ********************************************************************/
1203 void init_dom_rid(DOM_RID
*prid
, uint32 rid
, uint16 type
, uint32 idx
)
1207 prid
->rid_idx
= idx
;
1210 /*******************************************************************
1211 Reads or writes a DOM_RID structure.
1212 ********************************************************************/
1214 BOOL
smb_io_dom_rid(const char *desc
, DOM_RID
*rid
, prs_struct
*ps
, int depth
)
1219 prs_debug(ps
, depth
, desc
, "smb_io_dom_rid");
1225 if(!prs_uint16("type ", ps
, depth
, &rid
->type
))
1229 if(!prs_uint32("rid ", ps
, depth
, &rid
->rid
))
1231 if(!prs_uint32("rid_idx", ps
, depth
, &rid
->rid_idx
))
1237 /*******************************************************************
1238 Reads or writes a DOM_RID2 structure.
1239 ********************************************************************/
1241 BOOL
smb_io_dom_rid2(const char *desc
, DOM_RID2
*rid
, prs_struct
*ps
, int depth
)
1246 prs_debug(ps
, depth
, desc
, "smb_io_dom_rid2");
1252 if(!prs_uint16("type ", ps
, depth
, &rid
->type
))
1256 if(!prs_uint32("rid ", ps
, depth
, &rid
->rid
))
1258 if(!prs_uint32("rid_idx", ps
, depth
, &rid
->rid_idx
))
1260 if(!prs_uint32("unknown", ps
, depth
, &rid
->unknown
))
1267 /*******************************************************************
1268 creates a DOM_RID3 structure.
1269 ********************************************************************/
1271 void init_dom_rid3(DOM_RID3
*rid3
, uint32 rid
, uint8 type
)
1275 rid3
->ptr_type
= 0x1; /* non-zero, basically. */
1280 /*******************************************************************
1281 reads or writes a DOM_RID3 structure.
1282 ********************************************************************/
1284 BOOL
smb_io_dom_rid3(const char *desc
, DOM_RID3
*rid3
, prs_struct
*ps
, int depth
)
1289 prs_debug(ps
, depth
, desc
, "smb_io_dom_rid3");
1295 if(!prs_uint32("rid ", ps
, depth
, &rid3
->rid
))
1297 if(!prs_uint32("type1 ", ps
, depth
, &rid3
->type1
))
1299 if(!prs_uint32("ptr_type", ps
, depth
, &rid3
->ptr_type
))
1301 if(!prs_uint32("type2 ", ps
, depth
, &rid3
->type2
))
1303 if(!prs_uint32("unk ", ps
, depth
, &rid3
->unk
))
1309 /*******************************************************************
1310 Inits a DOM_RID4 structure.
1311 ********************************************************************/
1313 void init_dom_rid4(DOM_RID4
*rid4
, uint16 unknown
, uint16 attr
, uint32 rid
)
1315 rid4
->unknown
= unknown
;
1320 /*******************************************************************
1321 Inits a DOM_CLNT_SRV structure.
1322 ********************************************************************/
1324 void init_clnt_srv(DOM_CLNT_SRV
*logcln
, const char *logon_srv
,
1325 const char *comp_name
)
1327 DEBUG(5,("init_clnt_srv: %d\n", __LINE__
));
1329 if (logon_srv
!= NULL
) {
1330 logcln
->undoc_buffer
= 1;
1331 init_unistr2(&logcln
->uni_logon_srv
, logon_srv
, UNI_STR_TERMINATE
);
1333 logcln
->undoc_buffer
= 0;
1336 if (comp_name
!= NULL
) {
1337 logcln
->undoc_buffer2
= 1;
1338 init_unistr2(&logcln
->uni_comp_name
, comp_name
, UNI_STR_TERMINATE
);
1340 logcln
->undoc_buffer2
= 0;
1344 /*******************************************************************
1345 Inits or writes a DOM_CLNT_SRV structure.
1346 ********************************************************************/
1348 BOOL
smb_io_clnt_srv(const char *desc
, DOM_CLNT_SRV
*logcln
, prs_struct
*ps
, int depth
)
1353 prs_debug(ps
, depth
, desc
, "smb_io_clnt_srv");
1359 if(!prs_uint32("undoc_buffer ", ps
, depth
, &logcln
->undoc_buffer
))
1362 if (logcln
->undoc_buffer
!= 0) {
1363 if(!smb_io_unistr2("unistr2", &logcln
->uni_logon_srv
, logcln
->undoc_buffer
, ps
, depth
))
1370 if(!prs_uint32("undoc_buffer2", ps
, depth
, &logcln
->undoc_buffer2
))
1373 if (logcln
->undoc_buffer2
!= 0) {
1374 if(!smb_io_unistr2("unistr2", &logcln
->uni_comp_name
, logcln
->undoc_buffer2
, ps
, depth
))
1381 /*******************************************************************
1382 Inits a DOM_LOG_INFO structure.
1383 ********************************************************************/
1385 void init_log_info(DOM_LOG_INFO
*loginfo
, const char *logon_srv
, const char *acct_name
,
1386 uint16 sec_chan
, const char *comp_name
)
1388 DEBUG(5,("make_log_info %d\n", __LINE__
));
1390 loginfo
->undoc_buffer
= 1;
1392 init_unistr2(&loginfo
->uni_logon_srv
, logon_srv
, UNI_STR_TERMINATE
);
1393 init_unistr2(&loginfo
->uni_acct_name
, acct_name
, UNI_STR_TERMINATE
);
1395 loginfo
->sec_chan
= sec_chan
;
1397 init_unistr2(&loginfo
->uni_comp_name
, comp_name
, UNI_STR_TERMINATE
);
1400 /*******************************************************************
1401 Reads or writes a DOM_LOG_INFO structure.
1402 ********************************************************************/
1404 BOOL
smb_io_log_info(const char *desc
, DOM_LOG_INFO
*loginfo
, prs_struct
*ps
, int depth
)
1406 if (loginfo
== NULL
)
1409 prs_debug(ps
, depth
, desc
, "smb_io_log_info");
1415 if(!prs_uint32("undoc_buffer", ps
, depth
, &loginfo
->undoc_buffer
))
1418 if(!smb_io_unistr2("unistr2", &loginfo
->uni_logon_srv
, True
, ps
, depth
))
1420 if(!smb_io_unistr2("unistr2", &loginfo
->uni_acct_name
, True
, ps
, depth
))
1423 if(!prs_uint16("sec_chan", ps
, depth
, &loginfo
->sec_chan
))
1426 if(!smb_io_unistr2("unistr2", &loginfo
->uni_comp_name
, True
, ps
, depth
))
1432 /*******************************************************************
1433 Reads or writes a DOM_CHAL structure.
1434 ********************************************************************/
1436 BOOL
smb_io_chal(const char *desc
, DOM_CHAL
*chal
, prs_struct
*ps
, int depth
)
1441 prs_debug(ps
, depth
, desc
, "smb_io_chal");
1444 if(!prs_uint8s (False
, "data", ps
, depth
, chal
->data
, 8))
1450 /*******************************************************************
1451 Reads or writes a DOM_CRED structure.
1452 ********************************************************************/
1454 BOOL
smb_io_cred(const char *desc
, DOM_CRED
*cred
, prs_struct
*ps
, int depth
)
1459 prs_debug(ps
, depth
, desc
, "smb_io_cred");
1465 if(!smb_io_chal ("", &cred
->challenge
, ps
, depth
))
1468 if(!smb_io_utime("", &cred
->timestamp
, ps
, depth
))
1474 /*******************************************************************
1475 Inits a DOM_CLNT_INFO2 structure.
1476 ********************************************************************/
1478 void init_clnt_info2(DOM_CLNT_INFO2
*clnt
,
1479 const char *logon_srv
, const char *comp_name
,
1480 const DOM_CRED
*clnt_cred
)
1482 DEBUG(5,("make_clnt_info: %d\n", __LINE__
));
1484 init_clnt_srv(&clnt
->login
, logon_srv
, comp_name
);
1486 if (clnt_cred
!= NULL
) {
1488 memcpy(&clnt
->cred
, clnt_cred
, sizeof(clnt
->cred
));
1494 /*******************************************************************
1495 Reads or writes a DOM_CLNT_INFO2 structure.
1496 ********************************************************************/
1498 BOOL
smb_io_clnt_info2(const char *desc
, DOM_CLNT_INFO2
*clnt
, prs_struct
*ps
, int depth
)
1503 prs_debug(ps
, depth
, desc
, "smb_io_clnt_info2");
1509 if(!smb_io_clnt_srv("", &clnt
->login
, ps
, depth
))
1515 if(!prs_uint32("ptr_cred", ps
, depth
, &clnt
->ptr_cred
))
1517 if(!smb_io_cred("", &clnt
->cred
, ps
, depth
))
1523 /*******************************************************************
1524 Inits a DOM_CLNT_INFO structure.
1525 ********************************************************************/
1527 void init_clnt_info(DOM_CLNT_INFO
*clnt
,
1528 const char *logon_srv
, const char *acct_name
,
1529 uint16 sec_chan
, const char *comp_name
,
1530 const DOM_CRED
*cred
)
1532 DEBUG(5,("make_clnt_info\n"));
1534 init_log_info(&clnt
->login
, logon_srv
, acct_name
, sec_chan
, comp_name
);
1535 memcpy(&clnt
->cred
, cred
, sizeof(clnt
->cred
));
1538 /*******************************************************************
1539 Reads or writes a DOM_CLNT_INFO structure.
1540 ********************************************************************/
1542 BOOL
smb_io_clnt_info(const char *desc
, DOM_CLNT_INFO
*clnt
, prs_struct
*ps
, int depth
)
1547 prs_debug(ps
, depth
, desc
, "smb_io_clnt_info");
1553 if(!smb_io_log_info("", &clnt
->login
, ps
, depth
))
1555 if(!smb_io_cred("", &clnt
->cred
, ps
, depth
))
1561 /*******************************************************************
1562 Inits a DOM_LOGON_ID structure.
1563 ********************************************************************/
1565 void init_logon_id(DOM_LOGON_ID
*logonid
, uint32 log_id_low
, uint32 log_id_high
)
1567 DEBUG(5,("make_logon_id: %d\n", __LINE__
));
1569 logonid
->low
= log_id_low
;
1570 logonid
->high
= log_id_high
;
1573 /*******************************************************************
1574 Reads or writes a DOM_LOGON_ID structure.
1575 ********************************************************************/
1577 BOOL
smb_io_logon_id(const char *desc
, DOM_LOGON_ID
*logonid
, prs_struct
*ps
, int depth
)
1579 if (logonid
== NULL
)
1582 prs_debug(ps
, depth
, desc
, "smb_io_logon_id");
1588 if(!prs_uint32("low ", ps
, depth
, &logonid
->low
))
1590 if(!prs_uint32("high", ps
, depth
, &logonid
->high
))
1596 /*******************************************************************
1597 Inits an OWF_INFO structure.
1598 ********************************************************************/
1600 void init_owf_info(OWF_INFO
*hash
, const uint8 data
[16])
1602 DEBUG(5,("init_owf_info: %d\n", __LINE__
));
1605 memcpy(hash
->data
, data
, sizeof(hash
->data
));
1607 memset((char *)hash
->data
, '\0', sizeof(hash
->data
));
1610 /*******************************************************************
1611 Reads or writes an OWF_INFO structure.
1612 ********************************************************************/
1614 BOOL
smb_io_owf_info(const char *desc
, OWF_INFO
*hash
, prs_struct
*ps
, int depth
)
1619 prs_debug(ps
, depth
, desc
, "smb_io_owf_info");
1625 if(!prs_uint8s (False
, "data", ps
, depth
, hash
->data
, 16))
1631 /*******************************************************************
1632 Reads or writes a DOM_GID structure.
1633 ********************************************************************/
1635 BOOL
smb_io_gid(const char *desc
, DOM_GID
*gid
, prs_struct
*ps
, int depth
)
1640 prs_debug(ps
, depth
, desc
, "smb_io_gid");
1646 if(!prs_uint32("g_rid", ps
, depth
, &gid
->g_rid
))
1648 if(!prs_uint32("attr ", ps
, depth
, &gid
->attr
))
1654 /*******************************************************************
1655 Reads or writes an POLICY_HND structure.
1656 ********************************************************************/
1658 BOOL
smb_io_pol_hnd(const char *desc
, POLICY_HND
*pol
, prs_struct
*ps
, int depth
)
1663 prs_debug(ps
, depth
, desc
, "smb_io_pol_hnd");
1669 if(UNMARSHALLING(ps
))
1672 if (!prs_uint32("handle_type", ps
, depth
, &pol
->handle_type
))
1674 if (!smb_io_uuid("uuid", (struct GUID
*)&pol
->uuid
, ps
, depth
))
1680 /*******************************************************************
1682 ********************************************************************/
1684 void init_unistr3(UNISTR3
*str
, const char *buf
)
1688 str
->str
.buffer
= NULL
;
1692 str
->uni_str_len
= strlen(buf
) + 1;
1694 if (str
->uni_str_len
) {
1695 str
->str
.buffer
= TALLOC_ZERO_ARRAY(talloc_tos(), uint16
, str
->uni_str_len
);
1696 if (str
->str
.buffer
== NULL
)
1697 smb_panic("init_unistr3: malloc fail");
1699 rpcstr_push((char *)str
->str
.buffer
, buf
, str
->uni_str_len
* sizeof(uint16
), STR_TERMINATE
);
1701 str
->str
.buffer
= NULL
;
1705 /*******************************************************************
1706 Reads or writes a UNISTR3 structure.
1707 ********************************************************************/
1709 BOOL
smb_io_unistr3(const char *desc
, UNISTR3
*name
, prs_struct
*ps
, int depth
)
1714 prs_debug(ps
, depth
, desc
, "smb_io_unistr3");
1720 if(!prs_uint32("uni_str_len", ps
, depth
, &name
->uni_str_len
))
1723 /* we're done if there is no string */
1725 if ( name
->uni_str_len
== 0 )
1728 /* don't know if len is specified by uni_str_len member... */
1729 /* assume unicode string is unicode-null-terminated, instead */
1731 if(!prs_unistr3(True
, "unistr", name
, ps
, depth
))
1737 /*******************************************************************
1738 Stream a uint64_struct
1739 ********************************************************************/
1740 BOOL
prs_uint64(const char *name
, prs_struct
*ps
, int depth
, uint64
*data64
)
1742 if (UNMARSHALLING(ps
)) {
1745 if (!prs_uint32(name
, ps
, depth
+1, &low
))
1748 if (!prs_uint32(name
, ps
, depth
+1, &high
))
1751 *data64
= ((uint64_t)high
<< 32) + low
;
1755 uint32 high
= (*data64
) >> 32, low
= (*data64
) & 0xFFFFFFFF;
1756 return prs_uint32(name
, ps
, depth
+1, &low
) &&
1757 prs_uint32(name
, ps
, depth
+1, &high
);
1761 /*******************************************************************
1762 reads or writes a BUFHDR2 structure.
1763 ********************************************************************/
1764 BOOL
smb_io_bufhdr2(const char *desc
, BUFHDR2
*hdr
, prs_struct
*ps
, int depth
)
1766 prs_debug(ps
, depth
, desc
, "smb_io_bufhdr2");
1770 prs_uint32("info_level", ps
, depth
, &(hdr
->info_level
));
1771 prs_uint32("length ", ps
, depth
, &(hdr
->length
));
1772 prs_uint32("buffer ", ps
, depth
, &(hdr
->buffer
));
1777 /*******************************************************************
1778 reads or writes a BUFHDR4 structure.
1779 ********************************************************************/
1780 BOOL
smb_io_bufhdr4(const char *desc
, BUFHDR4
*hdr
, prs_struct
*ps
, int depth
)
1782 prs_debug(ps
, depth
, desc
, "smb_io_bufhdr4");
1786 prs_uint32("size", ps
, depth
, &hdr
->size
);
1787 prs_uint32("buffer", ps
, depth
, &hdr
->buffer
);
1792 /*******************************************************************
1793 reads or writes a RPC_DATA_BLOB structure.
1794 ********************************************************************/
1796 BOOL
smb_io_rpc_blob(const char *desc
, RPC_DATA_BLOB
*blob
, prs_struct
*ps
, int depth
)
1798 prs_debug(ps
, depth
, desc
, "smb_io_rpc_blob");
1802 if ( !prs_uint32("buf_len", ps
, depth
, &blob
->buf_len
) )
1805 if ( blob
->buf_len
== 0 )
1808 if (UNMARSHALLING(ps
)) {
1809 blob
->buffer
= PRS_ALLOC_MEM(ps
, uint8
, blob
->buf_len
);
1810 if (!blob
->buffer
) {
1815 if ( !prs_uint8s(True
, "buffer", ps
, depth
, blob
->buffer
, blob
->buf_len
) )
1821 /*******************************************************************
1822 creates a UNIHDR structure.
1823 ********************************************************************/
1825 BOOL
make_uni_hdr(UNIHDR
*hdr
, int len
)
1831 hdr
->uni_str_len
= 2 * len
;
1832 hdr
->uni_max_len
= 2 * len
;
1833 hdr
->buffer
= len
!= 0 ? 1 : 0;
1838 /*******************************************************************
1839 creates a BUFHDR2 structure.
1840 ********************************************************************/
1841 BOOL
make_bufhdr2(BUFHDR2
*hdr
, uint32 info_level
, uint32 length
, uint32 buffer
)
1843 hdr
->info_level
= info_level
;
1844 hdr
->length
= length
;
1845 hdr
->buffer
= buffer
;
1850 /*******************************************************************
1851 return the length of a UNISTR string.
1852 ********************************************************************/
1854 uint32
str_len_uni(UNISTR
*source
)
1858 if (!source
->buffer
)
1861 while (source
->buffer
[i
])