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 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #define DBGC_CLASS DBGC_RPC_PARSE
29 /****************************************************************************
30 A temporary TALLOC context for things like unistrs, that is valid for
31 the life of a complete RPC call.
32 ****************************************************************************/
34 static TALLOC_CTX *current_rpc_talloc = NULL;
36 static TALLOC_CTX *get_current_rpc_talloc(void)
38 return current_rpc_talloc;
41 void set_current_rpc_talloc( TALLOC_CTX *ctx)
43 current_rpc_talloc = ctx;
46 static TALLOC_CTX *main_loop_talloc = NULL;
48 /*******************************************************************
49 free up temporary memory - called from the main loop
50 ********************************************************************/
52 void main_loop_TALLOC_FREE(void)
54 if (!main_loop_talloc)
56 talloc_destroy(main_loop_talloc);
57 main_loop_talloc = NULL;
60 /*******************************************************************
61 Get a talloc context that is freed in the main loop...
62 ********************************************************************/
64 TALLOC_CTX *main_loop_talloc_get(void)
66 if (!main_loop_talloc) {
67 main_loop_talloc = talloc_init("main loop talloc (mainly parse_misc)");
68 if (!main_loop_talloc)
69 smb_panic("main_loop_talloc: malloc fail\n");
72 return main_loop_talloc;
75 /*******************************************************************
76 Try and get a talloc context. Get the rpc one if possible, else
77 get the main loop one. The main loop one is more dangerous as it
78 goes away between packets, the rpc one will stay around for as long
79 as a current RPC lasts.
80 ********************************************************************/
82 TALLOC_CTX *get_talloc_ctx(void)
84 TALLOC_CTX *tc = get_current_rpc_talloc();
88 return main_loop_talloc_get();
91 /*******************************************************************
92 Reads or writes a UTIME type.
93 ********************************************************************/
95 static BOOL smb_io_utime(const char *desc, UTIME *t, prs_struct *ps, int depth)
100 prs_debug(ps, depth, desc, "smb_io_utime");
106 if(!prs_uint32 ("time", ps, depth, &t->time))
112 /*******************************************************************
113 Reads or writes an NTTIME structure.
114 ********************************************************************/
116 BOOL smb_io_time(const char *desc, NTTIME *nttime, prs_struct *ps, int depth)
121 prs_debug(ps, depth, desc, "smb_io_time");
127 if(!prs_uint32("low ", ps, depth, &nttime->low)) /* low part */
129 if(!prs_uint32("high", ps, depth, &nttime->high)) /* high part */
135 /*******************************************************************
136 Reads or writes an NTTIME structure.
137 ********************************************************************/
139 BOOL smb_io_nttime(const char *desc, prs_struct *ps, int depth, NTTIME *nttime)
141 return smb_io_time( desc, nttime, ps, depth );
144 /*******************************************************************
145 Gets an enumeration handle from an ENUM_HND structure.
146 ********************************************************************/
148 uint32 get_enum_hnd(ENUM_HND *enh)
150 return (enh && enh->ptr_hnd != 0) ? enh->handle : 0;
153 /*******************************************************************
154 Inits an ENUM_HND structure.
155 ********************************************************************/
157 void init_enum_hnd(ENUM_HND *enh, uint32 hnd)
159 DEBUG(5,("smb_io_enum_hnd\n"));
161 enh->ptr_hnd = (hnd != 0) ? 1 : 0;
165 /*******************************************************************
166 Reads or writes an ENUM_HND structure.
167 ********************************************************************/
169 BOOL smb_io_enum_hnd(const char *desc, ENUM_HND *hnd, prs_struct *ps, int depth)
174 prs_debug(ps, depth, desc, "smb_io_enum_hnd");
180 if(!prs_uint32("ptr_hnd", ps, depth, &hnd->ptr_hnd)) /* pointer */
183 if (hnd->ptr_hnd != 0) {
184 if(!prs_uint32("handle ", ps, depth, &hnd->handle )) /* enum handle */
191 /*******************************************************************
192 Reads or writes a DOM_SID structure.
193 ********************************************************************/
195 BOOL smb_io_dom_sid(const char *desc, DOM_SID *sid, prs_struct *ps, int depth)
202 prs_debug(ps, depth, desc, "smb_io_dom_sid");
205 if(!prs_uint8 ("sid_rev_num", ps, depth, &sid->sid_rev_num))
208 if(!prs_uint8 ("num_auths ", ps, depth, &sid->num_auths))
211 for (i = 0; i < 6; i++)
214 slprintf(tmp, sizeof(tmp) - 1, "id_auth[%d] ", i);
215 if(!prs_uint8 (tmp, ps, depth, &sid->id_auth[i]))
219 /* oops! XXXX should really issue a warning here... */
220 if (sid->num_auths > MAXSUBAUTHS)
221 sid->num_auths = MAXSUBAUTHS;
223 if(!prs_uint32s(False, "sub_auths ", ps, depth, sid->sub_auths, sid->num_auths))
229 /*******************************************************************
230 Inits a DOM_SID2 structure.
231 ********************************************************************/
233 void init_dom_sid2(DOM_SID2 *sid2, const DOM_SID *sid)
236 sid2->num_auths = sid2->sid.num_auths;
239 /*******************************************************************
240 Reads or writes a DOM_SID2 structure.
241 ********************************************************************/
243 BOOL smb_io_dom_sid2_p(const char *desc, prs_struct *ps, int depth, DOM_SID2 **sid2)
247 /* caputure the pointer value to stream */
249 data_p = *sid2 ? 0xf000baaa : 0;
251 if ( !prs_uint32("dom_sid2_p", ps, depth, &data_p ))
254 /* we're done if there is no data */
259 if (UNMARSHALLING(ps)) {
260 if ( !(*sid2 = PRS_ALLOC_MEM(ps, DOM_SID2, 1)) )
266 /*******************************************************************
267 Reads or writes a DOM_SID2 structure.
268 ********************************************************************/
270 BOOL smb_io_dom_sid2(const char *desc, DOM_SID2 *sid, prs_struct *ps, int depth)
275 prs_debug(ps, depth, desc, "smb_io_dom_sid2");
281 if(!prs_uint32("num_auths", ps, depth, &sid->num_auths))
284 if(!smb_io_dom_sid("sid", &sid->sid, ps, depth))
290 /*******************************************************************
291 Reads or writes a struct uuid
292 ********************************************************************/
294 BOOL smb_io_uuid(const char *desc, struct uuid *uuid,
295 prs_struct *ps, int depth)
300 prs_debug(ps, depth, desc, "smb_io_uuid");
303 if(!prs_uint32 ("data ", ps, depth, &uuid->time_low))
305 if(!prs_uint16 ("data ", ps, depth, &uuid->time_mid))
307 if(!prs_uint16 ("data ", ps, depth, &uuid->time_hi_and_version))
310 if(!prs_uint8s (False, "data ", ps, depth, uuid->clock_seq, sizeof(uuid->clock_seq)))
312 if(!prs_uint8s (False, "data ", ps, depth, uuid->node, sizeof(uuid->node)))
318 /*******************************************************************
319 creates a STRHDR structure.
320 ********************************************************************/
322 void init_str_hdr(STRHDR *hdr, int max_len, int len, uint32 buffer)
324 hdr->str_max_len = max_len;
325 hdr->str_str_len = len;
326 hdr->buffer = buffer;
329 /*******************************************************************
330 Reads or writes a STRHDR structure.
331 ********************************************************************/
333 BOOL smb_io_strhdr(const char *desc, STRHDR *hdr, prs_struct *ps, int depth)
338 prs_debug(ps, depth, desc, "smb_io_strhdr");
343 if(!prs_uint16("str_str_len", ps, depth, &hdr->str_str_len))
345 if(!prs_uint16("str_max_len", ps, depth, &hdr->str_max_len))
347 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
353 /*******************************************************************
354 Inits a UNIHDR structure.
355 ********************************************************************/
357 void init_uni_hdr(UNIHDR *hdr, UNISTR2 *str2)
359 hdr->uni_str_len = 2 * (str2->uni_str_len);
360 hdr->uni_max_len = 2 * (str2->uni_max_len);
361 hdr->buffer = (str2->uni_str_len != 0) ? 1 : 0;
364 /*******************************************************************
365 Reads or writes a UNIHDR structure.
366 ********************************************************************/
368 BOOL smb_io_unihdr(const char *desc, UNIHDR *hdr, prs_struct *ps, int depth)
373 prs_debug(ps, depth, desc, "smb_io_unihdr");
379 if(!prs_uint16("uni_str_len", ps, depth, &hdr->uni_str_len))
381 if(!prs_uint16("uni_max_len", ps, depth, &hdr->uni_max_len))
383 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
389 /*******************************************************************
390 Inits a BUFHDR structure.
391 ********************************************************************/
393 void init_buf_hdr(BUFHDR *hdr, int max_len, int len)
395 hdr->buf_max_len = max_len;
399 /*******************************************************************
400 prs_uint16 wrapper. Call this and it sets up a pointer to where the
401 uint16 should be stored, or gets the size if reading.
402 ********************************************************************/
404 BOOL smb_io_hdrbuf_pre(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth, uint32 *offset)
406 (*offset) = prs_offset(ps);
411 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
418 if(!prs_set_offset(ps, prs_offset(ps) + (sizeof(uint32) * 2)))
425 /*******************************************************************
426 smb_io_hdrbuf wrapper. Call this and it retrospectively stores the size.
427 Does nothing on reading, as that is already handled by ...._pre()
428 ********************************************************************/
430 BOOL smb_io_hdrbuf_post(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth,
431 uint32 ptr_hdrbuf, uint32 max_len, uint32 len)
434 /* writing: go back and do a retrospective job. i hate this */
436 uint32 old_offset = prs_offset(ps);
438 init_buf_hdr(hdr, max_len, len);
439 if(!prs_set_offset(ps, ptr_hdrbuf))
441 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
444 if(!prs_set_offset(ps, old_offset))
451 /*******************************************************************
452 Reads or writes a BUFHDR structure.
453 ********************************************************************/
455 BOOL smb_io_hdrbuf(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth)
460 prs_debug(ps, depth, desc, "smb_io_hdrbuf");
466 if(!prs_uint32("buf_max_len", ps, depth, &hdr->buf_max_len))
468 if(!prs_uint32("buf_len ", ps, depth, &hdr->buf_len))
474 /*******************************************************************
475 Inits a UNISTR structure.
476 ********************************************************************/
478 void init_unistr(UNISTR *str, const char *buf)
487 len = strlen(buf) + 1;
489 str->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, len);
490 if (str->buffer == NULL)
491 smb_panic("init_unistr: malloc fail\n");
493 rpcstr_push(str->buffer, buf, len*sizeof(uint16), STR_TERMINATE);
496 /*******************************************************************
497 reads or writes a UNISTR structure.
498 XXXX NOTE: UNISTR structures NEED to be null-terminated.
499 ********************************************************************/
501 BOOL smb_io_unistr(const char *desc, UNISTR *uni, prs_struct *ps, int depth)
506 prs_debug(ps, depth, desc, "smb_io_unistr");
509 if(!prs_unistr("unistr", ps, depth, uni))
515 /*******************************************************************
516 Allocate the RPC_DATA_BLOB memory.
517 ********************************************************************/
519 size_t create_rpc_blob(RPC_DATA_BLOB *str, size_t len)
521 str->buffer = TALLOC_ZERO(get_talloc_ctx(), len);
522 if (str->buffer == NULL)
523 smb_panic("create_rpc_blob: talloc fail\n");
527 /*******************************************************************
528 Inits a RPC_DATA_BLOB structure from a uint32
529 ********************************************************************/
531 void init_rpc_blob_uint32(RPC_DATA_BLOB *str, uint32 val)
535 /* set up string lengths. */
536 str->buf_len = create_rpc_blob(str, sizeof(uint32));
537 SIVAL(str->buffer, 0, val);
540 /*******************************************************************
541 Inits a RPC_DATA_BLOB structure.
542 ********************************************************************/
544 void init_rpc_blob_str(RPC_DATA_BLOB *str, const char *buf, int len)
548 /* set up string lengths. */
549 str->buf_len = create_rpc_blob(str, len*2);
550 rpcstr_push(str->buffer, buf, (size_t)str->buf_len, STR_TERMINATE);
554 /*******************************************************************
555 Inits a RPC_DATA_BLOB structure from a hex string.
556 ********************************************************************/
558 void init_rpc_blob_hex(RPC_DATA_BLOB *str, const char *buf)
561 str->buf_len = create_rpc_blob(str, strlen(buf));
562 str->buf_len = strhex_to_str((char *)str->buffer, str->buf_len, buf);
565 /*******************************************************************
566 Inits a RPC_DATA_BLOB structure.
567 ********************************************************************/
569 void init_rpc_blob_bytes(RPC_DATA_BLOB *str, uint8 *buf, size_t len)
573 /* max buffer size (allocated size) */
575 len = create_rpc_blob(str, len);
576 memcpy(str->buffer, buf, len);
581 /*******************************************************************
582 reads or writes a BUFFER5 structure.
583 the buf_len member tells you how large the buffer is.
584 ********************************************************************/
585 BOOL smb_io_buffer5(const char *desc, BUFFER5 *buf5, prs_struct *ps, int depth)
587 prs_debug(ps, depth, desc, "smb_io_buffer5");
590 if (buf5 == NULL) return False;
594 if(!prs_uint32("buf_len", ps, depth, &buf5->buf_len))
598 if(!prs_buffer5(True, "buffer" , ps, depth, buf5))
605 /*******************************************************************
606 Inits a REGVAL_BUFFER structure.
607 ********************************************************************/
609 void init_regval_buffer(REGVAL_BUFFER *str, const uint8 *buf, size_t len)
613 /* max buffer size (allocated size) */
614 str->buf_max_len = len;
616 str->buf_len = buf != NULL ? len : 0;
619 SMB_ASSERT(str->buf_max_len >= str->buf_len);
620 str->buffer = TALLOC_ZERO(get_talloc_ctx(), str->buf_max_len);
621 if (str->buffer == NULL)
622 smb_panic("init_regval_buffer: talloc fail\n");
623 memcpy(str->buffer, buf, str->buf_len);
627 /*******************************************************************
628 Reads or writes a REGVAL_BUFFER structure.
629 the uni_max_len member tells you how large the buffer is.
630 the uni_str_len member tells you how much of the buffer is really used.
631 ********************************************************************/
633 BOOL smb_io_regval_buffer(const char *desc, prs_struct *ps, int depth, REGVAL_BUFFER *buf2)
636 prs_debug(ps, depth, desc, "smb_io_regval_buffer");
642 if(!prs_uint32("buf_max_len", ps, depth, &buf2->buf_max_len))
644 if(!prs_uint32("offset ", ps, depth, &buf2->offset))
646 if(!prs_uint32("buf_len ", ps, depth, &buf2->buf_len))
649 /* buffer advanced by indicated length of string
650 NOT by searching for null-termination */
652 if(!prs_regval_buffer(True, "buffer ", ps, depth, buf2))
658 /*******************************************************************
659 creates a UNISTR2 structure: sets up the buffer, too
660 ********************************************************************/
662 void init_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf)
666 init_unistr2(str, buf, UNI_STR_TERMINATE);
669 init_unistr2(str, NULL, UNI_FLAGS_NONE);
674 /*******************************************************************
675 Copies a UNISTR2 structure.
676 ********************************************************************/
678 void copy_unistr2(UNISTR2 *str, const UNISTR2 *from)
680 if (from->buffer == NULL) {
685 SMB_ASSERT(from->uni_max_len >= from->uni_str_len);
687 str->uni_max_len = from->uni_max_len;
688 str->offset = from->offset;
689 str->uni_str_len = from->uni_str_len;
691 /* the string buffer is allocated to the maximum size
692 (the the length of the source string) to prevent
693 reallocation of memory. */
694 if (str->buffer == NULL) {
695 str->buffer = (uint16 *)TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, str->uni_max_len);
696 if ((str->buffer == NULL)) {
697 smb_panic("copy_unistr2: talloc fail\n");
702 /* copy the string */
703 memcpy(str->buffer, from->buffer, str->uni_max_len*sizeof(uint16));
706 /*******************************************************************
707 Creates a STRING2 structure.
708 ********************************************************************/
710 void init_string2(STRING2 *str, const char *buf, size_t max_len, size_t str_len)
712 /* set up string lengths. */
713 SMB_ASSERT(max_len >= str_len);
715 /* Ensure buf is valid if str_len was set. Coverity check. */
716 if (str_len && !buf) {
720 str->str_max_len = max_len;
722 str->str_str_len = str_len;
724 /* store the string */
726 str->buffer = TALLOC_ZERO(get_talloc_ctx(), str->str_max_len);
727 if (str->buffer == NULL)
728 smb_panic("init_string2: malloc fail\n");
729 memcpy(str->buffer, buf, str_len);
733 /*******************************************************************
734 Reads or writes a STRING2 structure.
735 XXXX NOTE: STRING2 structures need NOT be null-terminated.
736 the str_str_len member tells you how long the string is;
737 the str_max_len member tells you how large the buffer is.
738 ********************************************************************/
740 BOOL smb_io_string2(const char *desc, STRING2 *str2, uint32 buffer, prs_struct *ps, int depth)
747 prs_debug(ps, depth, desc, "smb_io_string2");
753 if(!prs_uint32("str_max_len", ps, depth, &str2->str_max_len))
755 if(!prs_uint32("offset ", ps, depth, &str2->offset))
757 if(!prs_uint32("str_str_len", ps, depth, &str2->str_str_len))
760 /* buffer advanced by indicated length of string
761 NOT by searching for null-termination */
762 if(!prs_string2(True, "buffer ", ps, depth, str2))
767 prs_debug(ps, depth, desc, "smb_io_string2 - NULL");
769 memset((char *)str2, '\0', sizeof(*str2));
776 /*******************************************************************
777 Inits a UNISTR2 structure.
778 ********************************************************************/
780 void init_unistr2(UNISTR2 *str, const char *buf, enum unistr2_term_codes flags)
783 uint32 num_chars = 0;
786 /* We always null terminate the copy. */
787 len = strlen(buf) + 1;
788 if ( flags == UNI_STR_DBLTERMINATE )
791 /* no buffer -- nothing to do */
792 str->uni_max_len = 0;
794 str->uni_str_len = 0;
800 str->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, len);
801 if (str->buffer == NULL) {
802 smb_panic("init_unistr2: malloc fail\n");
806 /* Ensure len is the length in *bytes* */
807 len *= sizeof(uint16);
810 * The UNISTR2 must be initialized !!!
814 rpcstr_push((char *)str->buffer, buf, len, STR_TERMINATE);
815 num_chars = strlen_w(str->buffer);
816 if (flags == UNI_STR_TERMINATE || flags == UNI_MAXLEN_TERMINATE) {
819 if ( flags == UNI_STR_DBLTERMINATE )
823 str->uni_max_len = num_chars;
825 str->uni_str_len = num_chars;
826 if ( num_chars && ((flags == UNI_MAXLEN_TERMINATE) || (flags == UNI_BROKEN_NON_NULL)) )
830 /*******************************************************************
831 Inits a UNISTR4 structure.
832 ********************************************************************/
834 void init_unistr4(UNISTR4 *uni4, const char *buf, enum unistr2_term_codes flags)
836 uni4->string = TALLOC_P( get_talloc_ctx(), UNISTR2 );
838 smb_panic("init_unistr4: talloc fail\n");
841 init_unistr2( uni4->string, buf, flags );
843 uni4->length = 2 * (uni4->string->uni_str_len);
844 uni4->size = 2 * (uni4->string->uni_max_len);
847 void init_unistr4_w( TALLOC_CTX *ctx, UNISTR4 *uni4, const smb_ucs2_t *buf )
849 uni4->string = TALLOC_P( ctx, UNISTR2 );
851 smb_panic("init_unistr4_w: talloc fail\n");
854 init_unistr2_w( ctx, uni4->string, buf );
856 uni4->length = 2 * (uni4->string->uni_str_len);
857 uni4->size = 2 * (uni4->string->uni_max_len);
861 * Inits a UNISTR2 structure.
862 * @param ctx talloc context to allocate string on
863 * @param str pointer to string to create
864 * @param buf UCS2 null-terminated buffer to init from
867 void init_unistr2_w(TALLOC_CTX *ctx, UNISTR2 *str, const smb_ucs2_t *buf)
869 uint32 len = buf ? strlen_w(buf) : 0;
873 /* set up string lengths. */
874 str->uni_max_len = len;
876 str->uni_str_len = len;
878 str->buffer = TALLOC_ZERO_ARRAY(ctx, uint16, len + 1);
879 if (str->buffer == NULL) {
880 smb_panic("init_unistr2_w: talloc fail\n");
885 * don't move this test above ! The UNISTR2 must be initialized !!!
891 /* Yes, this is a strncpy( foo, bar, strlen(bar)) - but as
892 long as the buffer above is talloc()ed correctly then this
893 is the correct thing to do */
894 strncpy_w(str->buffer, buf, len + 1);
897 /*******************************************************************
898 Inits a UNISTR2 structure from a UNISTR
899 ********************************************************************/
901 void init_unistr2_from_unistr(UNISTR2 *to, const UNISTR *from)
905 /* the destination UNISTR2 should never be NULL.
906 if it is it is a programming error */
908 /* if the source UNISTR is NULL, then zero out
909 the destination string and return */
911 if ((from == NULL) || (from->buffer == NULL))
914 /* get the length; UNISTR must be NULL terminated */
916 while ((from->buffer)[i]!='\0')
918 i++; /* one more to catch the terminating NULL */
919 /* is this necessary -- jerry? I need to think */
921 /* set up string lengths; uni_max_len is set to i+1
922 because we need to account for the final NULL termination */
927 /* allocate the space and copy the string buffer */
928 to->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, i);
929 if (to->buffer == NULL)
930 smb_panic("init_unistr2_from_unistr: malloc fail\n");
931 memcpy(to->buffer, from->buffer, i*sizeof(uint16));
935 /*******************************************************************
936 Inits a UNISTR2 structure from a DATA_BLOB.
937 The length of the data_blob must count the bytes of the buffer.
938 Copies the blob data.
939 ********************************************************************/
941 void init_unistr2_from_datablob(UNISTR2 *str, DATA_BLOB *blob)
943 /* Allocs the unistring */
944 init_unistr2(str, NULL, UNI_FLAGS_NONE);
946 /* Sets the values */
947 str->uni_str_len = blob->length / sizeof(uint16);
948 str->uni_max_len = str->uni_str_len;
951 str->buffer = (uint16 *) memdup(blob->data, blob->length);
955 if ((str->buffer == NULL) && (blob->length > 0)) {
956 smb_panic("init_unistr2_from_datablob: malloc fail\n");
960 /*******************************************************************
961 UNISTR2* are a little different in that the pointer and the UNISTR2
962 are not necessarily read/written back to back. So we break it up
963 into 2 separate functions.
964 See SPOOL_USER_1 in include/rpc_spoolss.h for an example.
965 ********************************************************************/
967 BOOL prs_io_unistr2_p(const char *desc, prs_struct *ps, int depth, UNISTR2 **uni2)
971 /* caputure the pointer value to stream */
973 data_p = *uni2 ? 0xf000baaa : 0;
975 if ( !prs_uint32("ptr", ps, depth, &data_p ))
978 /* we're done if there is no data */
983 if (UNMARSHALLING(ps)) {
984 if ( !(*uni2 = PRS_ALLOC_MEM(ps, UNISTR2, 1)) )
991 /*******************************************************************
992 now read/write the actual UNISTR2. Memory for the UNISTR2 (but
993 not UNISTR2.buffer) has been allocated previously by prs_unistr2_p()
994 ********************************************************************/
996 BOOL prs_io_unistr2(const char *desc, prs_struct *ps, int depth, UNISTR2 *uni2 )
998 /* just return true if there is no pointer to deal with.
999 the memory must have been previously allocated on unmarshalling
1000 by prs_unistr2_p() */
1005 /* just pass off to smb_io_unstr2() passing the uni2 address as
1006 the pointer (like you would expect) */
1008 return smb_io_unistr2( desc, uni2, uni2 ? 1 : 0, ps, depth );
1011 /*******************************************************************
1012 Reads or writes a UNISTR2 structure.
1013 XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
1014 the uni_str_len member tells you how long the string is;
1015 the uni_max_len member tells you how large the buffer is.
1016 ********************************************************************/
1018 BOOL smb_io_unistr2(const char *desc, UNISTR2 *uni2, uint32 buffer, prs_struct *ps, int depth)
1025 prs_debug(ps, depth, desc, "smb_io_unistr2");
1031 if(!prs_uint32("uni_max_len", ps, depth, &uni2->uni_max_len))
1033 if(!prs_uint32("offset ", ps, depth, &uni2->offset))
1035 if(!prs_uint32("uni_str_len", ps, depth, &uni2->uni_str_len))
1038 /* buffer advanced by indicated length of string
1039 NOT by searching for null-termination */
1040 if(!prs_unistr2(True, "buffer ", ps, depth, uni2))
1045 prs_debug(ps, depth, desc, "smb_io_unistr2 - NULL");
1047 memset((char *)uni2, '\0', sizeof(*uni2));
1054 /*******************************************************************
1055 now read/write UNISTR4
1056 ********************************************************************/
1058 BOOL prs_unistr4(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1061 prs_debug(ps, depth, desc, "prs_unistr4");
1064 if ( !prs_uint16("length", ps, depth, &uni4->length ))
1066 if ( !prs_uint16("size", ps, depth, &uni4->size ))
1071 if ( !prs_pointer( desc, ps, depth, &ptr, sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2 ) )
1074 uni4->string = (UNISTR2 *)ptr;
1079 /*******************************************************************
1080 now read/write UNISTR4 header
1081 ********************************************************************/
1083 BOOL prs_unistr4_hdr(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1085 prs_debug(ps, depth, desc, "prs_unistr4_hdr");
1088 if ( !prs_uint16("length", ps, depth, &uni4->length) )
1090 if ( !prs_uint16("size", ps, depth, &uni4->size) )
1092 if ( !prs_io_unistr2_p(desc, ps, depth, &uni4->string) )
1098 /*******************************************************************
1099 now read/write UNISTR4 string
1100 ********************************************************************/
1102 BOOL prs_unistr4_str(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1104 prs_debug(ps, depth, desc, "prs_unistr4_str");
1107 if ( !prs_io_unistr2(desc, ps, depth, uni4->string) )
1113 /*******************************************************************
1114 Reads or writes a UNISTR4_ARRAY structure.
1115 ********************************************************************/
1117 BOOL prs_unistr4_array(const char *desc, prs_struct *ps, int depth, UNISTR4_ARRAY *array )
1121 prs_debug(ps, depth, desc, "prs_unistr4_array");
1124 if(!prs_uint32("count", ps, depth, &array->count))
1127 if ( array->count == 0 )
1130 if (UNMARSHALLING(ps)) {
1131 if ( !(array->strings = TALLOC_ZERO_ARRAY( get_talloc_ctx(), UNISTR4, array->count)) )
1135 /* write the headers and then the actual string buffer */
1137 for ( i=0; i<array->count; i++ ) {
1138 if ( !prs_unistr4_hdr( "string", ps, depth, &array->strings[i]) )
1142 for (i=0;i<array->count;i++) {
1143 if ( !prs_unistr4_str("string", ps, depth, &array->strings[i]) )
1150 /********************************************************************
1151 initialise a UNISTR_ARRAY from a char**
1152 ********************************************************************/
1154 BOOL init_unistr4_array( UNISTR4_ARRAY *array, uint32 count, const char **strings )
1158 array->count = count;
1160 if ( array->count == 0 )
1163 /* allocate memory for the array of UNISTR4 objects */
1165 if ( !(array->strings = TALLOC_ZERO_ARRAY(get_talloc_ctx(), UNISTR4, count )) )
1168 for ( i=0; i<count; i++ )
1169 init_unistr4( &array->strings[i], strings[i], UNI_STR_TERMINATE );
1174 BOOL smb_io_lockout_string_hdr(const char *desc, HDR_LOCKOUT_STRING *hdr_account_lockout, prs_struct *ps, int depth)
1176 prs_debug(ps, depth, desc, "smb_io_lockout_string_hdr");
1182 if(!prs_uint16("size", ps, depth, &hdr_account_lockout->size))
1184 if(!prs_uint16("length", ps, depth, &hdr_account_lockout->length))
1186 if(!prs_uint32("buffer", ps, depth, &hdr_account_lockout->buffer))
1192 BOOL smb_io_account_lockout_str(const char *desc, LOCKOUT_STRING *account_lockout, uint32 buffer, prs_struct *ps, int depth)
1194 prs_debug(ps, depth, desc, "smb_io_account_lockout_string");
1197 if(!prs_uint32("array_size", ps, depth, &account_lockout->array_size))
1200 if(!prs_uint32("offset", ps, depth, &account_lockout->offset))
1202 if(!prs_uint32("length", ps, depth, &account_lockout->length))
1205 if (!prs_uint64("lockout_duration", ps, depth, &account_lockout->lockout_duration))
1207 if (!prs_uint64("reset_count", ps, depth, &account_lockout->reset_count))
1209 if (!prs_uint32("bad_attempt_lockout", ps, depth, &account_lockout->bad_attempt_lockout))
1211 if (!prs_uint32("dummy", ps, depth, &account_lockout->dummy))
1214 if(!prs_uint16s (False, "bindata", ps, depth, &account_lockout->bindata, length))
1221 /*******************************************************************
1222 Inits a DOM_RID structure.
1223 ********************************************************************/
1225 void init_dom_rid(DOM_RID *prid, uint32 rid, uint16 type, uint32 idx)
1229 prid->rid_idx = idx;
1232 /*******************************************************************
1233 Reads or writes a DOM_RID structure.
1234 ********************************************************************/
1236 BOOL smb_io_dom_rid(const char *desc, DOM_RID *rid, prs_struct *ps, int depth)
1241 prs_debug(ps, depth, desc, "smb_io_dom_rid");
1247 if(!prs_uint16("type ", ps, depth, &rid->type))
1251 if(!prs_uint32("rid ", ps, depth, &rid->rid))
1253 if(!prs_uint32("rid_idx", ps, depth, &rid->rid_idx))
1259 /*******************************************************************
1260 Reads or writes a DOM_RID2 structure.
1261 ********************************************************************/
1263 BOOL smb_io_dom_rid2(const char *desc, DOM_RID2 *rid, prs_struct *ps, int depth)
1268 prs_debug(ps, depth, desc, "smb_io_dom_rid2");
1274 if(!prs_uint16("type ", ps, depth, &rid->type))
1278 if(!prs_uint32("rid ", ps, depth, &rid->rid))
1280 if(!prs_uint32("rid_idx", ps, depth, &rid->rid_idx))
1282 if(!prs_uint32("unknown", ps, depth, &rid->unknown))
1289 /*******************************************************************
1290 creates a DOM_RID3 structure.
1291 ********************************************************************/
1293 void init_dom_rid3(DOM_RID3 *rid3, uint32 rid, uint8 type)
1297 rid3->ptr_type = 0x1; /* non-zero, basically. */
1302 /*******************************************************************
1303 reads or writes a DOM_RID3 structure.
1304 ********************************************************************/
1306 BOOL smb_io_dom_rid3(const char *desc, DOM_RID3 *rid3, prs_struct *ps, int depth)
1311 prs_debug(ps, depth, desc, "smb_io_dom_rid3");
1317 if(!prs_uint32("rid ", ps, depth, &rid3->rid))
1319 if(!prs_uint32("type1 ", ps, depth, &rid3->type1))
1321 if(!prs_uint32("ptr_type", ps, depth, &rid3->ptr_type))
1323 if(!prs_uint32("type2 ", ps, depth, &rid3->type2))
1325 if(!prs_uint32("unk ", ps, depth, &rid3->unk))
1331 /*******************************************************************
1332 Inits a DOM_RID4 structure.
1333 ********************************************************************/
1335 void init_dom_rid4(DOM_RID4 *rid4, uint16 unknown, uint16 attr, uint32 rid)
1337 rid4->unknown = unknown;
1342 /*******************************************************************
1343 Inits a DOM_CLNT_SRV structure.
1344 ********************************************************************/
1346 static void init_clnt_srv(DOM_CLNT_SRV *logcln, const char *logon_srv, const char *comp_name)
1348 DEBUG(5,("init_clnt_srv: %d\n", __LINE__));
1350 if (logon_srv != NULL) {
1351 logcln->undoc_buffer = 1;
1352 init_unistr2(&logcln->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
1354 logcln->undoc_buffer = 0;
1357 if (comp_name != NULL) {
1358 logcln->undoc_buffer2 = 1;
1359 init_unistr2(&logcln->uni_comp_name, comp_name, UNI_STR_TERMINATE);
1361 logcln->undoc_buffer2 = 0;
1365 /*******************************************************************
1366 Inits or writes a DOM_CLNT_SRV structure.
1367 ********************************************************************/
1369 BOOL smb_io_clnt_srv(const char *desc, DOM_CLNT_SRV *logcln, prs_struct *ps, int depth)
1374 prs_debug(ps, depth, desc, "smb_io_clnt_srv");
1380 if(!prs_uint32("undoc_buffer ", ps, depth, &logcln->undoc_buffer))
1383 if (logcln->undoc_buffer != 0) {
1384 if(!smb_io_unistr2("unistr2", &logcln->uni_logon_srv, logcln->undoc_buffer, ps, depth))
1391 if(!prs_uint32("undoc_buffer2", ps, depth, &logcln->undoc_buffer2))
1394 if (logcln->undoc_buffer2 != 0) {
1395 if(!smb_io_unistr2("unistr2", &logcln->uni_comp_name, logcln->undoc_buffer2, ps, depth))
1402 /*******************************************************************
1403 Inits a DOM_LOG_INFO structure.
1404 ********************************************************************/
1406 void init_log_info(DOM_LOG_INFO *loginfo, const char *logon_srv, const char *acct_name,
1407 uint16 sec_chan, const char *comp_name)
1409 DEBUG(5,("make_log_info %d\n", __LINE__));
1411 loginfo->undoc_buffer = 1;
1413 init_unistr2(&loginfo->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
1414 init_unistr2(&loginfo->uni_acct_name, acct_name, UNI_STR_TERMINATE);
1416 loginfo->sec_chan = sec_chan;
1418 init_unistr2(&loginfo->uni_comp_name, comp_name, UNI_STR_TERMINATE);
1421 /*******************************************************************
1422 Reads or writes a DOM_LOG_INFO structure.
1423 ********************************************************************/
1425 BOOL smb_io_log_info(const char *desc, DOM_LOG_INFO *loginfo, prs_struct *ps, int depth)
1427 if (loginfo == NULL)
1430 prs_debug(ps, depth, desc, "smb_io_log_info");
1436 if(!prs_uint32("undoc_buffer", ps, depth, &loginfo->undoc_buffer))
1439 if(!smb_io_unistr2("unistr2", &loginfo->uni_logon_srv, True, ps, depth))
1441 if(!smb_io_unistr2("unistr2", &loginfo->uni_acct_name, True, ps, depth))
1444 if(!prs_uint16("sec_chan", ps, depth, &loginfo->sec_chan))
1447 if(!smb_io_unistr2("unistr2", &loginfo->uni_comp_name, True, ps, depth))
1453 /*******************************************************************
1454 Reads or writes a DOM_CHAL structure.
1455 ********************************************************************/
1457 BOOL smb_io_chal(const char *desc, DOM_CHAL *chal, prs_struct *ps, int depth)
1462 prs_debug(ps, depth, desc, "smb_io_chal");
1465 if(!prs_uint8s (False, "data", ps, depth, chal->data, 8))
1471 /*******************************************************************
1472 Reads or writes a DOM_CRED structure.
1473 ********************************************************************/
1475 BOOL smb_io_cred(const char *desc, DOM_CRED *cred, prs_struct *ps, int depth)
1480 prs_debug(ps, depth, desc, "smb_io_cred");
1486 if(!smb_io_chal ("", &cred->challenge, ps, depth))
1489 if(!smb_io_utime("", &cred->timestamp, ps, depth))
1495 /*******************************************************************
1496 Inits a DOM_CLNT_INFO2 structure.
1497 ********************************************************************/
1499 void init_clnt_info2(DOM_CLNT_INFO2 *clnt,
1500 const char *logon_srv, const char *comp_name,
1501 const DOM_CRED *clnt_cred)
1503 DEBUG(5,("make_clnt_info: %d\n", __LINE__));
1505 init_clnt_srv(&clnt->login, logon_srv, comp_name);
1507 if (clnt_cred != NULL) {
1509 memcpy(&clnt->cred, clnt_cred, sizeof(clnt->cred));
1515 /*******************************************************************
1516 Reads or writes a DOM_CLNT_INFO2 structure.
1517 ********************************************************************/
1519 BOOL smb_io_clnt_info2(const char *desc, DOM_CLNT_INFO2 *clnt, prs_struct *ps, int depth)
1524 prs_debug(ps, depth, desc, "smb_io_clnt_info2");
1530 if(!smb_io_clnt_srv("", &clnt->login, ps, depth))
1536 if(!prs_uint32("ptr_cred", ps, depth, &clnt->ptr_cred))
1538 if(!smb_io_cred("", &clnt->cred, ps, depth))
1544 /*******************************************************************
1545 Inits a DOM_CLNT_INFO structure.
1546 ********************************************************************/
1548 void init_clnt_info(DOM_CLNT_INFO *clnt,
1549 const char *logon_srv, const char *acct_name,
1550 uint16 sec_chan, const char *comp_name,
1551 const DOM_CRED *cred)
1553 DEBUG(5,("make_clnt_info\n"));
1555 init_log_info(&clnt->login, logon_srv, acct_name, sec_chan, comp_name);
1556 memcpy(&clnt->cred, cred, sizeof(clnt->cred));
1559 /*******************************************************************
1560 Reads or writes a DOM_CLNT_INFO structure.
1561 ********************************************************************/
1563 BOOL smb_io_clnt_info(const char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int depth)
1568 prs_debug(ps, depth, desc, "smb_io_clnt_info");
1574 if(!smb_io_log_info("", &clnt->login, ps, depth))
1576 if(!smb_io_cred("", &clnt->cred, ps, depth))
1582 /*******************************************************************
1583 Inits a DOM_LOGON_ID structure.
1584 ********************************************************************/
1586 void init_logon_id(DOM_LOGON_ID *logonid, uint32 log_id_low, uint32 log_id_high)
1588 DEBUG(5,("make_logon_id: %d\n", __LINE__));
1590 logonid->low = log_id_low;
1591 logonid->high = log_id_high;
1594 /*******************************************************************
1595 Reads or writes a DOM_LOGON_ID structure.
1596 ********************************************************************/
1598 BOOL smb_io_logon_id(const char *desc, DOM_LOGON_ID *logonid, prs_struct *ps, int depth)
1600 if (logonid == NULL)
1603 prs_debug(ps, depth, desc, "smb_io_logon_id");
1609 if(!prs_uint32("low ", ps, depth, &logonid->low ))
1611 if(!prs_uint32("high", ps, depth, &logonid->high))
1617 /*******************************************************************
1618 Inits an OWF_INFO structure.
1619 ********************************************************************/
1621 void init_owf_info(OWF_INFO *hash, const uint8 data[16])
1623 DEBUG(5,("init_owf_info: %d\n", __LINE__));
1626 memcpy(hash->data, data, sizeof(hash->data));
1628 memset((char *)hash->data, '\0', sizeof(hash->data));
1631 /*******************************************************************
1632 Reads or writes an OWF_INFO structure.
1633 ********************************************************************/
1635 BOOL smb_io_owf_info(const char *desc, OWF_INFO *hash, prs_struct *ps, int depth)
1640 prs_debug(ps, depth, desc, "smb_io_owf_info");
1646 if(!prs_uint8s (False, "data", ps, depth, hash->data, 16))
1652 /*******************************************************************
1653 Reads or writes a DOM_GID structure.
1654 ********************************************************************/
1656 BOOL smb_io_gid(const char *desc, DOM_GID *gid, prs_struct *ps, int depth)
1661 prs_debug(ps, depth, desc, "smb_io_gid");
1667 if(!prs_uint32("g_rid", ps, depth, &gid->g_rid))
1669 if(!prs_uint32("attr ", ps, depth, &gid->attr))
1675 /*******************************************************************
1676 Reads or writes an POLICY_HND structure.
1677 ********************************************************************/
1679 BOOL smb_io_pol_hnd(const char *desc, POLICY_HND *pol, prs_struct *ps, int depth)
1684 prs_debug(ps, depth, desc, "smb_io_pol_hnd");
1690 if(UNMARSHALLING(ps))
1693 if (!prs_uint32("data1", ps, depth, &pol->data1))
1695 if (!prs_uint32("data2", ps, depth, &pol->data2))
1697 if (!prs_uint16("data3", ps, depth, &pol->data3))
1699 if (!prs_uint16("data4", ps, depth, &pol->data4))
1701 if(!prs_uint8s (False, "data5", ps, depth, pol->data5, sizeof(pol->data5)))
1707 /*******************************************************************
1709 ********************************************************************/
1711 void init_unistr3(UNISTR3 *str, const char *buf)
1715 str->str.buffer = NULL;
1719 str->uni_str_len = strlen(buf) + 1;
1721 str->str.buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, str->uni_str_len);
1722 if (str->str.buffer == NULL)
1723 smb_panic("init_unistr3: malloc fail\n");
1725 rpcstr_push((char *)str->str.buffer, buf, str->uni_str_len * sizeof(uint16), STR_TERMINATE);
1728 /*******************************************************************
1729 Reads or writes a UNISTR3 structure.
1730 ********************************************************************/
1732 BOOL smb_io_unistr3(const char *desc, UNISTR3 *name, prs_struct *ps, int depth)
1737 prs_debug(ps, depth, desc, "smb_io_unistr3");
1743 if(!prs_uint32("uni_str_len", ps, depth, &name->uni_str_len))
1746 /* we're done if there is no string */
1748 if ( name->uni_str_len == 0 )
1751 /* don't know if len is specified by uni_str_len member... */
1752 /* assume unicode string is unicode-null-terminated, instead */
1754 if(!prs_unistr3(True, "unistr", name, ps, depth))
1760 /*******************************************************************
1761 Stream a uint64_struct
1762 ********************************************************************/
1763 BOOL prs_uint64(const char *name, prs_struct *ps, int depth, UINT64_S *data64)
1765 return prs_uint32(name, ps, depth+1, &data64->low) &&
1766 prs_uint32(name, ps, depth+1, &data64->high);
1769 /*******************************************************************
1770 reads or writes a BUFHDR2 structure.
1771 ********************************************************************/
1772 BOOL smb_io_bufhdr2(const char *desc, BUFHDR2 *hdr, prs_struct *ps, int depth)
1774 prs_debug(ps, depth, desc, "smb_io_bufhdr2");
1778 prs_uint32("info_level", ps, depth, &(hdr->info_level));
1779 prs_uint32("length ", ps, depth, &(hdr->length ));
1780 prs_uint32("buffer ", ps, depth, &(hdr->buffer ));
1785 /*******************************************************************
1786 reads or writes a BUFHDR4 structure.
1787 ********************************************************************/
1788 BOOL smb_io_bufhdr4(const char *desc, BUFHDR4 *hdr, prs_struct *ps, int depth)
1790 prs_debug(ps, depth, desc, "smb_io_bufhdr4");
1794 prs_uint32("size", ps, depth, &hdr->size);
1795 prs_uint32("buffer", ps, depth, &hdr->buffer);
1800 /*******************************************************************
1801 reads or writes a RPC_DATA_BLOB structure.
1802 ********************************************************************/
1804 BOOL smb_io_rpc_blob(const char *desc, RPC_DATA_BLOB *blob, prs_struct *ps, int depth)
1806 prs_debug(ps, depth, desc, "smb_io_rpc_blob");
1810 if ( !prs_uint32("buf_len", ps, depth, &blob->buf_len) )
1813 if ( blob->buf_len == 0 )
1816 if (UNMARSHALLING(ps)) {
1817 blob->buffer = PRS_ALLOC_MEM(ps, uint8, blob->buf_len);
1818 if (!blob->buffer) {
1823 if ( !prs_uint8s(True, "buffer", ps, depth, blob->buffer, blob->buf_len) )
1829 /*******************************************************************
1830 creates a UNIHDR structure.
1831 ********************************************************************/
1833 BOOL make_uni_hdr(UNIHDR *hdr, int len)
1839 hdr->uni_str_len = 2 * len;
1840 hdr->uni_max_len = 2 * len;
1841 hdr->buffer = len != 0 ? 1 : 0;
1846 /*******************************************************************
1847 creates a BUFHDR2 structure.
1848 ********************************************************************/
1849 BOOL make_bufhdr2(BUFHDR2 *hdr, uint32 info_level, uint32 length, uint32 buffer)
1851 hdr->info_level = info_level;
1852 hdr->length = length;
1853 hdr->buffer = buffer;
1858 /*******************************************************************
1859 return the length of a UNISTR string.
1860 ********************************************************************/
1862 uint32 str_len_uni(UNISTR *source)
1866 if (!source->buffer)
1869 while (source->buffer[i])