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)
122 prs_debug(ps, depth, desc, "smb_io_time");
128 if(!prs_uint32("low ", ps, depth, &low)) /* low part */
130 if(!prs_uint32("high", ps, depth, &high)) /* high part */
133 *nttime = (((uint64_t)high << 32) + low);
138 /*******************************************************************
139 Reads or writes an NTTIME structure.
140 ********************************************************************/
142 BOOL smb_io_nttime(const char *desc, prs_struct *ps, int depth, NTTIME *nttime)
144 return smb_io_time( desc, nttime, ps, depth );
147 /*******************************************************************
148 Gets an enumeration handle from an ENUM_HND structure.
149 ********************************************************************/
151 uint32 get_enum_hnd(ENUM_HND *enh)
153 return (enh && enh->ptr_hnd != 0) ? enh->handle : 0;
156 /*******************************************************************
157 Inits an ENUM_HND structure.
158 ********************************************************************/
160 void init_enum_hnd(ENUM_HND *enh, uint32 hnd)
162 DEBUG(5,("smb_io_enum_hnd\n"));
164 enh->ptr_hnd = (hnd != 0) ? 1 : 0;
168 /*******************************************************************
169 Reads or writes an ENUM_HND structure.
170 ********************************************************************/
172 BOOL smb_io_enum_hnd(const char *desc, ENUM_HND *hnd, prs_struct *ps, int depth)
177 prs_debug(ps, depth, desc, "smb_io_enum_hnd");
183 if(!prs_uint32("ptr_hnd", ps, depth, &hnd->ptr_hnd)) /* pointer */
186 if (hnd->ptr_hnd != 0) {
187 if(!prs_uint32("handle ", ps, depth, &hnd->handle )) /* enum handle */
194 /*******************************************************************
195 Reads or writes a DOM_SID structure.
196 ********************************************************************/
198 BOOL smb_io_dom_sid(const char *desc, DOM_SID *sid, prs_struct *ps, int depth)
205 prs_debug(ps, depth, desc, "smb_io_dom_sid");
208 if(!prs_uint8 ("sid_rev_num", ps, depth, &sid->sid_rev_num))
211 if(!prs_uint8 ("num_auths ", ps, depth, &sid->num_auths))
214 for (i = 0; i < 6; i++)
217 slprintf(tmp, sizeof(tmp) - 1, "id_auth[%d] ", i);
218 if(!prs_uint8 (tmp, ps, depth, &sid->id_auth[i]))
222 /* oops! XXXX should really issue a warning here... */
223 if (sid->num_auths > MAXSUBAUTHS)
224 sid->num_auths = MAXSUBAUTHS;
226 if(!prs_uint32s(False, "sub_auths ", ps, depth, sid->sub_auths, sid->num_auths))
232 /*******************************************************************
233 Inits a DOM_SID2 structure.
234 ********************************************************************/
236 void init_dom_sid2(DOM_SID2 *sid2, const DOM_SID *sid)
239 sid2->num_auths = sid2->sid.num_auths;
242 /*******************************************************************
243 Reads or writes a DOM_SID2 structure.
244 ********************************************************************/
246 BOOL smb_io_dom_sid2_p(const char *desc, prs_struct *ps, int depth, DOM_SID2 **sid2)
250 /* caputure the pointer value to stream */
252 data_p = *sid2 ? 0xf000baaa : 0;
254 if ( !prs_uint32("dom_sid2_p", ps, depth, &data_p ))
257 /* we're done if there is no data */
262 if (UNMARSHALLING(ps)) {
263 if ( !(*sid2 = PRS_ALLOC_MEM(ps, DOM_SID2, 1)) )
269 /*******************************************************************
270 Reads or writes a DOM_SID2 structure.
271 ********************************************************************/
273 BOOL smb_io_dom_sid2(const char *desc, DOM_SID2 *sid, prs_struct *ps, int depth)
278 prs_debug(ps, depth, desc, "smb_io_dom_sid2");
284 if(!prs_uint32("num_auths", ps, depth, &sid->num_auths))
287 if(!smb_io_dom_sid("sid", &sid->sid, ps, depth))
293 /*******************************************************************
294 Reads or writes a struct uuid
295 ********************************************************************/
297 BOOL smb_io_uuid(const char *desc, struct uuid *uuid,
298 prs_struct *ps, int depth)
303 prs_debug(ps, depth, desc, "smb_io_uuid");
306 if(!prs_uint32 ("data ", ps, depth, &uuid->time_low))
308 if(!prs_uint16 ("data ", ps, depth, &uuid->time_mid))
310 if(!prs_uint16 ("data ", ps, depth, &uuid->time_hi_and_version))
313 if(!prs_uint8s (False, "data ", ps, depth, uuid->clock_seq, sizeof(uuid->clock_seq)))
315 if(!prs_uint8s (False, "data ", ps, depth, uuid->node, sizeof(uuid->node)))
321 /*******************************************************************
322 creates a STRHDR structure.
323 ********************************************************************/
325 void init_str_hdr(STRHDR *hdr, int max_len, int len, uint32 buffer)
327 hdr->str_max_len = max_len;
328 hdr->str_str_len = len;
329 hdr->buffer = buffer;
332 /*******************************************************************
333 Reads or writes a STRHDR structure.
334 ********************************************************************/
336 BOOL smb_io_strhdr(const char *desc, STRHDR *hdr, prs_struct *ps, int depth)
341 prs_debug(ps, depth, desc, "smb_io_strhdr");
346 if(!prs_uint16("str_str_len", ps, depth, &hdr->str_str_len))
348 if(!prs_uint16("str_max_len", ps, depth, &hdr->str_max_len))
350 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
356 /*******************************************************************
357 Inits a UNIHDR structure.
358 ********************************************************************/
360 void init_uni_hdr(UNIHDR *hdr, UNISTR2 *str2)
362 hdr->uni_str_len = 2 * (str2->uni_str_len);
363 hdr->uni_max_len = 2 * (str2->uni_max_len);
364 hdr->buffer = (str2->uni_str_len != 0) ? 1 : 0;
367 /*******************************************************************
368 Reads or writes a UNIHDR structure.
369 ********************************************************************/
371 BOOL smb_io_unihdr(const char *desc, UNIHDR *hdr, prs_struct *ps, int depth)
376 prs_debug(ps, depth, desc, "smb_io_unihdr");
382 if(!prs_uint16("uni_str_len", ps, depth, &hdr->uni_str_len))
384 if(!prs_uint16("uni_max_len", ps, depth, &hdr->uni_max_len))
386 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
392 /*******************************************************************
393 Inits a BUFHDR structure.
394 ********************************************************************/
396 void init_buf_hdr(BUFHDR *hdr, int max_len, int len)
398 hdr->buf_max_len = max_len;
402 /*******************************************************************
403 prs_uint16 wrapper. Call this and it sets up a pointer to where the
404 uint16 should be stored, or gets the size if reading.
405 ********************************************************************/
407 BOOL smb_io_hdrbuf_pre(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth, uint32 *offset)
409 (*offset) = prs_offset(ps);
414 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
421 if(!prs_set_offset(ps, prs_offset(ps) + (sizeof(uint32) * 2)))
428 /*******************************************************************
429 smb_io_hdrbuf wrapper. Call this and it retrospectively stores the size.
430 Does nothing on reading, as that is already handled by ...._pre()
431 ********************************************************************/
433 BOOL smb_io_hdrbuf_post(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth,
434 uint32 ptr_hdrbuf, uint32 max_len, uint32 len)
437 /* writing: go back and do a retrospective job. i hate this */
439 uint32 old_offset = prs_offset(ps);
441 init_buf_hdr(hdr, max_len, len);
442 if(!prs_set_offset(ps, ptr_hdrbuf))
444 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
447 if(!prs_set_offset(ps, old_offset))
454 /*******************************************************************
455 Reads or writes a BUFHDR structure.
456 ********************************************************************/
458 BOOL smb_io_hdrbuf(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth)
463 prs_debug(ps, depth, desc, "smb_io_hdrbuf");
469 if(!prs_uint32("buf_max_len", ps, depth, &hdr->buf_max_len))
471 if(!prs_uint32("buf_len ", ps, depth, &hdr->buf_len))
477 /*******************************************************************
478 Inits a UNISTR structure.
479 ********************************************************************/
481 void init_unistr(UNISTR *str, const char *buf)
490 len = strlen(buf) + 1;
492 str->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, len);
493 if (str->buffer == NULL)
494 smb_panic("init_unistr: malloc fail\n");
496 rpcstr_push(str->buffer, buf, len*sizeof(uint16), STR_TERMINATE);
499 /*******************************************************************
500 reads or writes a UNISTR structure.
501 XXXX NOTE: UNISTR structures NEED to be null-terminated.
502 ********************************************************************/
504 BOOL smb_io_unistr(const char *desc, UNISTR *uni, prs_struct *ps, int depth)
509 prs_debug(ps, depth, desc, "smb_io_unistr");
512 if(!prs_unistr("unistr", ps, depth, uni))
518 /*******************************************************************
519 Allocate the RPC_DATA_BLOB memory.
520 ********************************************************************/
522 size_t create_rpc_blob(RPC_DATA_BLOB *str, size_t len)
524 str->buffer = (uint8 *)TALLOC_ZERO(get_talloc_ctx(), len);
525 if (str->buffer == NULL)
526 smb_panic("create_rpc_blob: talloc fail\n");
530 /*******************************************************************
531 Inits a RPC_DATA_BLOB structure from a uint32
532 ********************************************************************/
534 void init_rpc_blob_uint32(RPC_DATA_BLOB *str, uint32 val)
538 /* set up string lengths. */
539 str->buf_len = create_rpc_blob(str, sizeof(uint32));
540 SIVAL(str->buffer, 0, val);
543 /*******************************************************************
544 Inits a RPC_DATA_BLOB structure.
545 ********************************************************************/
547 void init_rpc_blob_str(RPC_DATA_BLOB *str, const char *buf, int len)
551 /* set up string lengths. */
552 str->buf_len = create_rpc_blob(str, len*2);
553 rpcstr_push(str->buffer, buf, (size_t)str->buf_len, STR_TERMINATE);
557 /*******************************************************************
558 Inits a RPC_DATA_BLOB structure from a hex string.
559 ********************************************************************/
561 void init_rpc_blob_hex(RPC_DATA_BLOB *str, const char *buf)
564 str->buf_len = create_rpc_blob(str, strlen(buf));
565 str->buf_len = strhex_to_str((char *)str->buffer, str->buf_len, buf);
568 /*******************************************************************
569 Inits a RPC_DATA_BLOB structure.
570 ********************************************************************/
572 void init_rpc_blob_bytes(RPC_DATA_BLOB *str, uint8 *buf, size_t len)
576 /* max buffer size (allocated size) */
578 len = create_rpc_blob(str, len);
579 memcpy(str->buffer, buf, len);
584 /*******************************************************************
585 reads or writes a BUFFER5 structure.
586 the buf_len member tells you how large the buffer is.
587 ********************************************************************/
588 BOOL smb_io_buffer5(const char *desc, BUFFER5 *buf5, prs_struct *ps, int depth)
590 prs_debug(ps, depth, desc, "smb_io_buffer5");
593 if (buf5 == NULL) return False;
597 if(!prs_uint32("buf_len", ps, depth, &buf5->buf_len))
601 if(!prs_buffer5(True, "buffer" , ps, depth, buf5))
608 /*******************************************************************
609 Inits a REGVAL_BUFFER structure.
610 ********************************************************************/
612 void init_regval_buffer(REGVAL_BUFFER *str, const uint8 *buf, size_t len)
616 /* max buffer size (allocated size) */
617 str->buf_max_len = len;
619 str->buf_len = buf != NULL ? len : 0;
622 SMB_ASSERT(str->buf_max_len >= str->buf_len);
623 str->buffer = (uint16 *)TALLOC_ZERO(get_talloc_ctx(),
625 if (str->buffer == NULL)
626 smb_panic("init_regval_buffer: talloc fail\n");
627 memcpy(str->buffer, buf, str->buf_len);
631 /*******************************************************************
632 Reads or writes a REGVAL_BUFFER structure.
633 the uni_max_len member tells you how large the buffer is.
634 the uni_str_len member tells you how much of the buffer is really used.
635 ********************************************************************/
637 BOOL smb_io_regval_buffer(const char *desc, prs_struct *ps, int depth, REGVAL_BUFFER *buf2)
640 prs_debug(ps, depth, desc, "smb_io_regval_buffer");
646 if(!prs_uint32("buf_max_len", ps, depth, &buf2->buf_max_len))
648 if(!prs_uint32("offset ", ps, depth, &buf2->offset))
650 if(!prs_uint32("buf_len ", ps, depth, &buf2->buf_len))
653 /* buffer advanced by indicated length of string
654 NOT by searching for null-termination */
656 if(!prs_regval_buffer(True, "buffer ", ps, depth, buf2))
662 /*******************************************************************
663 creates a UNISTR2 structure: sets up the buffer, too
664 ********************************************************************/
666 void init_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf)
670 init_unistr2(str, buf, UNI_STR_TERMINATE);
673 init_unistr2(str, NULL, UNI_FLAGS_NONE);
678 /*******************************************************************
679 Copies a UNISTR2 structure.
680 ********************************************************************/
682 void copy_unistr2(UNISTR2 *str, const UNISTR2 *from)
684 if (from->buffer == NULL) {
689 SMB_ASSERT(from->uni_max_len >= from->uni_str_len);
691 str->uni_max_len = from->uni_max_len;
692 str->offset = from->offset;
693 str->uni_str_len = from->uni_str_len;
695 /* the string buffer is allocated to the maximum size
696 (the the length of the source string) to prevent
697 reallocation of memory. */
698 if (str->buffer == NULL) {
699 str->buffer = (uint16 *)TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, str->uni_max_len);
700 if ((str->buffer == NULL)) {
701 smb_panic("copy_unistr2: talloc fail\n");
706 /* copy the string */
707 memcpy(str->buffer, from->buffer, str->uni_max_len*sizeof(uint16));
710 /*******************************************************************
711 Creates a STRING2 structure.
712 ********************************************************************/
714 void init_string2(STRING2 *str, const char *buf, size_t max_len, size_t str_len)
716 /* set up string lengths. */
717 SMB_ASSERT(max_len >= str_len);
719 /* Ensure buf is valid if str_len was set. Coverity check. */
720 if (str_len && !buf) {
724 str->str_max_len = max_len;
726 str->str_str_len = str_len;
728 /* store the string */
730 str->buffer = (uint8 *)TALLOC_ZERO(get_talloc_ctx(),
732 if (str->buffer == NULL)
733 smb_panic("init_string2: malloc fail\n");
734 memcpy(str->buffer, buf, str_len);
738 /*******************************************************************
739 Reads or writes a STRING2 structure.
740 XXXX NOTE: STRING2 structures need NOT be null-terminated.
741 the str_str_len member tells you how long the string is;
742 the str_max_len member tells you how large the buffer is.
743 ********************************************************************/
745 BOOL smb_io_string2(const char *desc, STRING2 *str2, uint32 buffer, prs_struct *ps, int depth)
752 prs_debug(ps, depth, desc, "smb_io_string2");
758 if(!prs_uint32("str_max_len", ps, depth, &str2->str_max_len))
760 if(!prs_uint32("offset ", ps, depth, &str2->offset))
762 if(!prs_uint32("str_str_len", ps, depth, &str2->str_str_len))
765 /* buffer advanced by indicated length of string
766 NOT by searching for null-termination */
767 if(!prs_string2(True, "buffer ", ps, depth, str2))
772 prs_debug(ps, depth, desc, "smb_io_string2 - NULL");
774 memset((char *)str2, '\0', sizeof(*str2));
781 /*******************************************************************
782 Inits a UNISTR2 structure.
783 ********************************************************************/
785 void init_unistr2(UNISTR2 *str, const char *buf, enum unistr2_term_codes flags)
788 uint32 num_chars = 0;
791 /* We always null terminate the copy. */
792 len = strlen(buf) + 1;
793 if ( flags == UNI_STR_DBLTERMINATE )
796 /* no buffer -- nothing to do */
797 str->uni_max_len = 0;
799 str->uni_str_len = 0;
805 str->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, len);
806 if (str->buffer == NULL) {
807 smb_panic("init_unistr2: malloc fail\n");
811 /* Ensure len is the length in *bytes* */
812 len *= sizeof(uint16);
815 * The UNISTR2 must be initialized !!!
819 rpcstr_push((char *)str->buffer, buf, len, STR_TERMINATE);
820 num_chars = strlen_w(str->buffer);
821 if (flags == UNI_STR_TERMINATE || flags == UNI_MAXLEN_TERMINATE) {
824 if ( flags == UNI_STR_DBLTERMINATE )
828 str->uni_max_len = num_chars;
830 str->uni_str_len = num_chars;
831 if ( num_chars && ((flags == UNI_MAXLEN_TERMINATE) || (flags == UNI_BROKEN_NON_NULL)) )
835 /*******************************************************************
836 Inits a UNISTR4 structure.
837 ********************************************************************/
839 void init_unistr4(UNISTR4 *uni4, const char *buf, enum unistr2_term_codes flags)
841 uni4->string = TALLOC_P( get_talloc_ctx(), UNISTR2 );
843 smb_panic("init_unistr4: talloc fail\n");
846 init_unistr2( uni4->string, buf, flags );
848 uni4->length = 2 * (uni4->string->uni_str_len);
849 uni4->size = 2 * (uni4->string->uni_max_len);
852 void init_unistr4_w( TALLOC_CTX *ctx, UNISTR4 *uni4, const smb_ucs2_t *buf )
854 uni4->string = TALLOC_P( ctx, UNISTR2 );
856 smb_panic("init_unistr4_w: talloc fail\n");
859 init_unistr2_w( ctx, uni4->string, buf );
861 uni4->length = 2 * (uni4->string->uni_str_len);
862 uni4->size = 2 * (uni4->string->uni_max_len);
866 * Inits a UNISTR2 structure.
867 * @param ctx talloc context to allocate string on
868 * @param str pointer to string to create
869 * @param buf UCS2 null-terminated buffer to init from
872 void init_unistr2_w(TALLOC_CTX *ctx, UNISTR2 *str, const smb_ucs2_t *buf)
874 uint32 len = buf ? strlen_w(buf) : 0;
878 /* set up string lengths. */
879 str->uni_max_len = len;
881 str->uni_str_len = len;
883 str->buffer = TALLOC_ZERO_ARRAY(ctx, uint16, len + 1);
884 if (str->buffer == NULL) {
885 smb_panic("init_unistr2_w: talloc fail\n");
890 * don't move this test above ! The UNISTR2 must be initialized !!!
896 /* Yes, this is a strncpy( foo, bar, strlen(bar)) - but as
897 long as the buffer above is talloc()ed correctly then this
898 is the correct thing to do */
899 strncpy_w(str->buffer, buf, len + 1);
902 /*******************************************************************
903 Inits a UNISTR2 structure from a UNISTR
904 ********************************************************************/
906 void init_unistr2_from_unistr(UNISTR2 *to, const UNISTR *from)
910 /* the destination UNISTR2 should never be NULL.
911 if it is it is a programming error */
913 /* if the source UNISTR is NULL, then zero out
914 the destination string and return */
916 if ((from == NULL) || (from->buffer == NULL))
919 /* get the length; UNISTR must be NULL terminated */
921 while ((from->buffer)[i]!='\0')
923 i++; /* one more to catch the terminating NULL */
924 /* is this necessary -- jerry? I need to think */
926 /* set up string lengths; uni_max_len is set to i+1
927 because we need to account for the final NULL termination */
932 /* allocate the space and copy the string buffer */
933 to->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, i);
934 if (to->buffer == NULL)
935 smb_panic("init_unistr2_from_unistr: malloc fail\n");
936 memcpy(to->buffer, from->buffer, i*sizeof(uint16));
940 /*******************************************************************
941 Inits a UNISTR2 structure from a DATA_BLOB.
942 The length of the data_blob must count the bytes of the buffer.
943 Copies the blob data.
944 ********************************************************************/
946 void init_unistr2_from_datablob(UNISTR2 *str, DATA_BLOB *blob)
948 /* Allocs the unistring */
949 init_unistr2(str, NULL, UNI_FLAGS_NONE);
951 /* Sets the values */
952 str->uni_str_len = blob->length / sizeof(uint16);
953 str->uni_max_len = str->uni_str_len;
956 str->buffer = (uint16 *) memdup(blob->data, blob->length);
960 if ((str->buffer == NULL) && (blob->length > 0)) {
961 smb_panic("init_unistr2_from_datablob: malloc fail\n");
965 /*******************************************************************
966 UNISTR2* are a little different in that the pointer and the UNISTR2
967 are not necessarily read/written back to back. So we break it up
968 into 2 separate functions.
969 See SPOOL_USER_1 in include/rpc_spoolss.h for an example.
970 ********************************************************************/
972 BOOL prs_io_unistr2_p(const char *desc, prs_struct *ps, int depth, UNISTR2 **uni2)
976 /* caputure the pointer value to stream */
978 data_p = *uni2 ? 0xf000baaa : 0;
980 if ( !prs_uint32("ptr", ps, depth, &data_p ))
983 /* we're done if there is no data */
988 if (UNMARSHALLING(ps)) {
989 if ( !(*uni2 = PRS_ALLOC_MEM(ps, UNISTR2, 1)) )
996 /*******************************************************************
997 now read/write the actual UNISTR2. Memory for the UNISTR2 (but
998 not UNISTR2.buffer) has been allocated previously by prs_unistr2_p()
999 ********************************************************************/
1001 BOOL prs_io_unistr2(const char *desc, prs_struct *ps, int depth, UNISTR2 *uni2 )
1003 /* just return true if there is no pointer to deal with.
1004 the memory must have been previously allocated on unmarshalling
1005 by prs_unistr2_p() */
1010 /* just pass off to smb_io_unstr2() passing the uni2 address as
1011 the pointer (like you would expect) */
1013 return smb_io_unistr2( desc, uni2, uni2 ? 1 : 0, ps, depth );
1016 /*******************************************************************
1017 Reads or writes a UNISTR2 structure.
1018 XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
1019 the uni_str_len member tells you how long the string is;
1020 the uni_max_len member tells you how large the buffer is.
1021 ********************************************************************/
1023 BOOL smb_io_unistr2(const char *desc, UNISTR2 *uni2, uint32 buffer, prs_struct *ps, int depth)
1030 prs_debug(ps, depth, desc, "smb_io_unistr2");
1036 if(!prs_uint32("uni_max_len", ps, depth, &uni2->uni_max_len))
1038 if(!prs_uint32("offset ", ps, depth, &uni2->offset))
1040 if(!prs_uint32("uni_str_len", ps, depth, &uni2->uni_str_len))
1043 /* buffer advanced by indicated length of string
1044 NOT by searching for null-termination */
1045 if(!prs_unistr2(True, "buffer ", ps, depth, uni2))
1050 prs_debug(ps, depth, desc, "smb_io_unistr2 - NULL");
1052 memset((char *)uni2, '\0', sizeof(*uni2));
1059 /*******************************************************************
1060 now read/write UNISTR4
1061 ********************************************************************/
1063 BOOL prs_unistr4(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1066 prs_debug(ps, depth, desc, "prs_unistr4");
1069 if ( !prs_uint16("length", ps, depth, &uni4->length ))
1071 if ( !prs_uint16("size", ps, depth, &uni4->size ))
1076 if ( !prs_pointer( desc, ps, depth, &ptr, sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2 ) )
1079 uni4->string = (UNISTR2 *)ptr;
1084 /*******************************************************************
1085 now read/write UNISTR4 header
1086 ********************************************************************/
1088 BOOL prs_unistr4_hdr(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1090 prs_debug(ps, depth, desc, "prs_unistr4_hdr");
1093 if ( !prs_uint16("length", ps, depth, &uni4->length) )
1095 if ( !prs_uint16("size", ps, depth, &uni4->size) )
1097 if ( !prs_io_unistr2_p(desc, ps, depth, &uni4->string) )
1103 /*******************************************************************
1104 now read/write UNISTR4 string
1105 ********************************************************************/
1107 BOOL prs_unistr4_str(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1109 prs_debug(ps, depth, desc, "prs_unistr4_str");
1112 if ( !prs_io_unistr2(desc, ps, depth, uni4->string) )
1118 /*******************************************************************
1119 Reads or writes a UNISTR4_ARRAY structure.
1120 ********************************************************************/
1122 BOOL prs_unistr4_array(const char *desc, prs_struct *ps, int depth, UNISTR4_ARRAY *array )
1126 prs_debug(ps, depth, desc, "prs_unistr4_array");
1129 if(!prs_uint32("count", ps, depth, &array->count))
1132 if ( array->count == 0 )
1135 if (UNMARSHALLING(ps)) {
1136 if ( !(array->strings = TALLOC_ZERO_ARRAY( get_talloc_ctx(), UNISTR4, array->count)) )
1140 /* write the headers and then the actual string buffer */
1142 for ( i=0; i<array->count; i++ ) {
1143 if ( !prs_unistr4_hdr( "string", ps, depth, &array->strings[i]) )
1147 for (i=0;i<array->count;i++) {
1148 if ( !prs_unistr4_str("string", ps, depth, &array->strings[i]) )
1155 /********************************************************************
1156 initialise a UNISTR_ARRAY from a char**
1157 ********************************************************************/
1159 BOOL init_unistr4_array( UNISTR4_ARRAY *array, uint32 count, const char **strings )
1163 array->count = count;
1165 if ( array->count == 0 )
1168 /* allocate memory for the array of UNISTR4 objects */
1170 if ( !(array->strings = TALLOC_ZERO_ARRAY(get_talloc_ctx(), UNISTR4, count )) )
1173 for ( i=0; i<count; i++ )
1174 init_unistr4( &array->strings[i], strings[i], UNI_STR_TERMINATE );
1179 BOOL smb_io_lockout_string_hdr(const char *desc, HDR_LOCKOUT_STRING *hdr_account_lockout, prs_struct *ps, int depth)
1181 prs_debug(ps, depth, desc, "smb_io_lockout_string_hdr");
1187 if(!prs_uint16("size", ps, depth, &hdr_account_lockout->size))
1189 if(!prs_uint16("length", ps, depth, &hdr_account_lockout->length))
1191 if(!prs_uint32("buffer", ps, depth, &hdr_account_lockout->buffer))
1197 BOOL smb_io_account_lockout_str(const char *desc, LOCKOUT_STRING *account_lockout, uint32 buffer, prs_struct *ps, int depth)
1199 prs_debug(ps, depth, desc, "smb_io_account_lockout_string");
1202 if(!prs_uint32("array_size", ps, depth, &account_lockout->array_size))
1205 if(!prs_uint32("offset", ps, depth, &account_lockout->offset))
1207 if(!prs_uint32("length", ps, depth, &account_lockout->length))
1210 if (!prs_uint64("lockout_duration", ps, depth, &account_lockout->lockout_duration))
1212 if (!prs_uint64("reset_count", ps, depth, &account_lockout->reset_count))
1214 if (!prs_uint32("bad_attempt_lockout", ps, depth, &account_lockout->bad_attempt_lockout))
1216 if (!prs_uint32("dummy", ps, depth, &account_lockout->dummy))
1219 if(!prs_uint16s (False, "bindata", ps, depth, &account_lockout->bindata, length))
1226 /*******************************************************************
1227 Inits a DOM_RID structure.
1228 ********************************************************************/
1230 void init_dom_rid(DOM_RID *prid, uint32 rid, uint16 type, uint32 idx)
1234 prid->rid_idx = idx;
1237 /*******************************************************************
1238 Reads or writes a DOM_RID structure.
1239 ********************************************************************/
1241 BOOL smb_io_dom_rid(const char *desc, DOM_RID *rid, prs_struct *ps, int depth)
1246 prs_debug(ps, depth, desc, "smb_io_dom_rid");
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))
1264 /*******************************************************************
1265 Reads or writes a DOM_RID2 structure.
1266 ********************************************************************/
1268 BOOL smb_io_dom_rid2(const char *desc, DOM_RID2 *rid, prs_struct *ps, int depth)
1273 prs_debug(ps, depth, desc, "smb_io_dom_rid2");
1279 if(!prs_uint16("type ", ps, depth, &rid->type))
1283 if(!prs_uint32("rid ", ps, depth, &rid->rid))
1285 if(!prs_uint32("rid_idx", ps, depth, &rid->rid_idx))
1287 if(!prs_uint32("unknown", ps, depth, &rid->unknown))
1294 /*******************************************************************
1295 creates a DOM_RID3 structure.
1296 ********************************************************************/
1298 void init_dom_rid3(DOM_RID3 *rid3, uint32 rid, uint8 type)
1302 rid3->ptr_type = 0x1; /* non-zero, basically. */
1307 /*******************************************************************
1308 reads or writes a DOM_RID3 structure.
1309 ********************************************************************/
1311 BOOL smb_io_dom_rid3(const char *desc, DOM_RID3 *rid3, prs_struct *ps, int depth)
1316 prs_debug(ps, depth, desc, "smb_io_dom_rid3");
1322 if(!prs_uint32("rid ", ps, depth, &rid3->rid))
1324 if(!prs_uint32("type1 ", ps, depth, &rid3->type1))
1326 if(!prs_uint32("ptr_type", ps, depth, &rid3->ptr_type))
1328 if(!prs_uint32("type2 ", ps, depth, &rid3->type2))
1330 if(!prs_uint32("unk ", ps, depth, &rid3->unk))
1336 /*******************************************************************
1337 Inits a DOM_RID4 structure.
1338 ********************************************************************/
1340 void init_dom_rid4(DOM_RID4 *rid4, uint16 unknown, uint16 attr, uint32 rid)
1342 rid4->unknown = unknown;
1347 /*******************************************************************
1348 Inits a DOM_CLNT_SRV structure.
1349 ********************************************************************/
1351 static void init_clnt_srv(DOM_CLNT_SRV *logcln, const char *logon_srv, const char *comp_name)
1353 DEBUG(5,("init_clnt_srv: %d\n", __LINE__));
1355 if (logon_srv != NULL) {
1356 logcln->undoc_buffer = 1;
1357 init_unistr2(&logcln->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
1359 logcln->undoc_buffer = 0;
1362 if (comp_name != NULL) {
1363 logcln->undoc_buffer2 = 1;
1364 init_unistr2(&logcln->uni_comp_name, comp_name, UNI_STR_TERMINATE);
1366 logcln->undoc_buffer2 = 0;
1370 /*******************************************************************
1371 Inits or writes a DOM_CLNT_SRV structure.
1372 ********************************************************************/
1374 BOOL smb_io_clnt_srv(const char *desc, DOM_CLNT_SRV *logcln, prs_struct *ps, int depth)
1379 prs_debug(ps, depth, desc, "smb_io_clnt_srv");
1385 if(!prs_uint32("undoc_buffer ", ps, depth, &logcln->undoc_buffer))
1388 if (logcln->undoc_buffer != 0) {
1389 if(!smb_io_unistr2("unistr2", &logcln->uni_logon_srv, logcln->undoc_buffer, ps, depth))
1396 if(!prs_uint32("undoc_buffer2", ps, depth, &logcln->undoc_buffer2))
1399 if (logcln->undoc_buffer2 != 0) {
1400 if(!smb_io_unistr2("unistr2", &logcln->uni_comp_name, logcln->undoc_buffer2, ps, depth))
1407 /*******************************************************************
1408 Inits a DOM_LOG_INFO structure.
1409 ********************************************************************/
1411 void init_log_info(DOM_LOG_INFO *loginfo, const char *logon_srv, const char *acct_name,
1412 uint16 sec_chan, const char *comp_name)
1414 DEBUG(5,("make_log_info %d\n", __LINE__));
1416 loginfo->undoc_buffer = 1;
1418 init_unistr2(&loginfo->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
1419 init_unistr2(&loginfo->uni_acct_name, acct_name, UNI_STR_TERMINATE);
1421 loginfo->sec_chan = sec_chan;
1423 init_unistr2(&loginfo->uni_comp_name, comp_name, UNI_STR_TERMINATE);
1426 /*******************************************************************
1427 Reads or writes a DOM_LOG_INFO structure.
1428 ********************************************************************/
1430 BOOL smb_io_log_info(const char *desc, DOM_LOG_INFO *loginfo, prs_struct *ps, int depth)
1432 if (loginfo == NULL)
1435 prs_debug(ps, depth, desc, "smb_io_log_info");
1441 if(!prs_uint32("undoc_buffer", ps, depth, &loginfo->undoc_buffer))
1444 if(!smb_io_unistr2("unistr2", &loginfo->uni_logon_srv, True, ps, depth))
1446 if(!smb_io_unistr2("unistr2", &loginfo->uni_acct_name, True, ps, depth))
1449 if(!prs_uint16("sec_chan", ps, depth, &loginfo->sec_chan))
1452 if(!smb_io_unistr2("unistr2", &loginfo->uni_comp_name, True, ps, depth))
1458 /*******************************************************************
1459 Reads or writes a DOM_CHAL structure.
1460 ********************************************************************/
1462 BOOL smb_io_chal(const char *desc, DOM_CHAL *chal, prs_struct *ps, int depth)
1467 prs_debug(ps, depth, desc, "smb_io_chal");
1470 if(!prs_uint8s (False, "data", ps, depth, chal->data, 8))
1476 /*******************************************************************
1477 Reads or writes a DOM_CRED structure.
1478 ********************************************************************/
1480 BOOL smb_io_cred(const char *desc, DOM_CRED *cred, prs_struct *ps, int depth)
1485 prs_debug(ps, depth, desc, "smb_io_cred");
1491 if(!smb_io_chal ("", &cred->challenge, ps, depth))
1494 if(!smb_io_utime("", &cred->timestamp, ps, depth))
1500 /*******************************************************************
1501 Inits a DOM_CLNT_INFO2 structure.
1502 ********************************************************************/
1504 void init_clnt_info2(DOM_CLNT_INFO2 *clnt,
1505 const char *logon_srv, const char *comp_name,
1506 const DOM_CRED *clnt_cred)
1508 DEBUG(5,("make_clnt_info: %d\n", __LINE__));
1510 init_clnt_srv(&clnt->login, logon_srv, comp_name);
1512 if (clnt_cred != NULL) {
1514 memcpy(&clnt->cred, clnt_cred, sizeof(clnt->cred));
1520 /*******************************************************************
1521 Reads or writes a DOM_CLNT_INFO2 structure.
1522 ********************************************************************/
1524 BOOL smb_io_clnt_info2(const char *desc, DOM_CLNT_INFO2 *clnt, prs_struct *ps, int depth)
1529 prs_debug(ps, depth, desc, "smb_io_clnt_info2");
1535 if(!smb_io_clnt_srv("", &clnt->login, ps, depth))
1541 if(!prs_uint32("ptr_cred", ps, depth, &clnt->ptr_cred))
1543 if(!smb_io_cred("", &clnt->cred, ps, depth))
1549 /*******************************************************************
1550 Inits a DOM_CLNT_INFO structure.
1551 ********************************************************************/
1553 void init_clnt_info(DOM_CLNT_INFO *clnt,
1554 const char *logon_srv, const char *acct_name,
1555 uint16 sec_chan, const char *comp_name,
1556 const DOM_CRED *cred)
1558 DEBUG(5,("make_clnt_info\n"));
1560 init_log_info(&clnt->login, logon_srv, acct_name, sec_chan, comp_name);
1561 memcpy(&clnt->cred, cred, sizeof(clnt->cred));
1564 /*******************************************************************
1565 Reads or writes a DOM_CLNT_INFO structure.
1566 ********************************************************************/
1568 BOOL smb_io_clnt_info(const char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int depth)
1573 prs_debug(ps, depth, desc, "smb_io_clnt_info");
1579 if(!smb_io_log_info("", &clnt->login, ps, depth))
1581 if(!smb_io_cred("", &clnt->cred, ps, depth))
1587 /*******************************************************************
1588 Inits a DOM_LOGON_ID structure.
1589 ********************************************************************/
1591 void init_logon_id(DOM_LOGON_ID *logonid, uint32 log_id_low, uint32 log_id_high)
1593 DEBUG(5,("make_logon_id: %d\n", __LINE__));
1595 logonid->low = log_id_low;
1596 logonid->high = log_id_high;
1599 /*******************************************************************
1600 Reads or writes a DOM_LOGON_ID structure.
1601 ********************************************************************/
1603 BOOL smb_io_logon_id(const char *desc, DOM_LOGON_ID *logonid, prs_struct *ps, int depth)
1605 if (logonid == NULL)
1608 prs_debug(ps, depth, desc, "smb_io_logon_id");
1614 if(!prs_uint32("low ", ps, depth, &logonid->low ))
1616 if(!prs_uint32("high", ps, depth, &logonid->high))
1622 /*******************************************************************
1623 Inits an OWF_INFO structure.
1624 ********************************************************************/
1626 void init_owf_info(OWF_INFO *hash, const uint8 data[16])
1628 DEBUG(5,("init_owf_info: %d\n", __LINE__));
1631 memcpy(hash->data, data, sizeof(hash->data));
1633 memset((char *)hash->data, '\0', sizeof(hash->data));
1636 /*******************************************************************
1637 Reads or writes an OWF_INFO structure.
1638 ********************************************************************/
1640 BOOL smb_io_owf_info(const char *desc, OWF_INFO *hash, prs_struct *ps, int depth)
1645 prs_debug(ps, depth, desc, "smb_io_owf_info");
1651 if(!prs_uint8s (False, "data", ps, depth, hash->data, 16))
1657 /*******************************************************************
1658 Reads or writes a DOM_GID structure.
1659 ********************************************************************/
1661 BOOL smb_io_gid(const char *desc, DOM_GID *gid, prs_struct *ps, int depth)
1666 prs_debug(ps, depth, desc, "smb_io_gid");
1672 if(!prs_uint32("g_rid", ps, depth, &gid->g_rid))
1674 if(!prs_uint32("attr ", ps, depth, &gid->attr))
1680 /*******************************************************************
1681 Reads or writes an POLICY_HND structure.
1682 ********************************************************************/
1684 BOOL smb_io_pol_hnd(const char *desc, POLICY_HND *pol, prs_struct *ps, int depth)
1689 prs_debug(ps, depth, desc, "smb_io_pol_hnd");
1695 if(UNMARSHALLING(ps))
1698 if (!prs_uint32("data1", ps, depth, &pol->data1))
1700 if (!prs_uint32("data2", ps, depth, &pol->data2))
1702 if (!prs_uint16("data3", ps, depth, &pol->data3))
1704 if (!prs_uint16("data4", ps, depth, &pol->data4))
1706 if(!prs_uint8s (False, "data5", ps, depth, pol->data5, sizeof(pol->data5)))
1712 /*******************************************************************
1714 ********************************************************************/
1716 void init_unistr3(UNISTR3 *str, const char *buf)
1720 str->str.buffer = NULL;
1724 str->uni_str_len = strlen(buf) + 1;
1726 str->str.buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, str->uni_str_len);
1727 if (str->str.buffer == NULL)
1728 smb_panic("init_unistr3: malloc fail\n");
1730 rpcstr_push((char *)str->str.buffer, buf, str->uni_str_len * sizeof(uint16), STR_TERMINATE);
1733 /*******************************************************************
1734 Reads or writes a UNISTR3 structure.
1735 ********************************************************************/
1737 BOOL smb_io_unistr3(const char *desc, UNISTR3 *name, prs_struct *ps, int depth)
1742 prs_debug(ps, depth, desc, "smb_io_unistr3");
1748 if(!prs_uint32("uni_str_len", ps, depth, &name->uni_str_len))
1751 /* we're done if there is no string */
1753 if ( name->uni_str_len == 0 )
1756 /* don't know if len is specified by uni_str_len member... */
1757 /* assume unicode string is unicode-null-terminated, instead */
1759 if(!prs_unistr3(True, "unistr", name, ps, depth))
1765 /*******************************************************************
1766 Stream a uint64_struct
1767 ********************************************************************/
1768 BOOL prs_uint64(const char *name, prs_struct *ps, int depth, uint64 *data64)
1770 if (UNMARSHALLING(ps)) {
1773 if (!prs_uint32(name, ps, depth+1, &low))
1776 if (!prs_uint32(name, ps, depth+1, &high))
1779 *data64 = ((uint64_t)high << 32) + low;
1783 uint32 high = (*data64) >> 32, low = (*data64) & 0xFFFFFFFF;
1784 return prs_uint32(name, ps, depth+1, &low) &&
1785 prs_uint32(name, ps, depth+1, &high);
1789 /*******************************************************************
1790 reads or writes a BUFHDR2 structure.
1791 ********************************************************************/
1792 BOOL smb_io_bufhdr2(const char *desc, BUFHDR2 *hdr, prs_struct *ps, int depth)
1794 prs_debug(ps, depth, desc, "smb_io_bufhdr2");
1798 prs_uint32("info_level", ps, depth, &(hdr->info_level));
1799 prs_uint32("length ", ps, depth, &(hdr->length ));
1800 prs_uint32("buffer ", ps, depth, &(hdr->buffer ));
1805 /*******************************************************************
1806 reads or writes a BUFHDR4 structure.
1807 ********************************************************************/
1808 BOOL smb_io_bufhdr4(const char *desc, BUFHDR4 *hdr, prs_struct *ps, int depth)
1810 prs_debug(ps, depth, desc, "smb_io_bufhdr4");
1814 prs_uint32("size", ps, depth, &hdr->size);
1815 prs_uint32("buffer", ps, depth, &hdr->buffer);
1820 /*******************************************************************
1821 reads or writes a RPC_DATA_BLOB structure.
1822 ********************************************************************/
1824 BOOL smb_io_rpc_blob(const char *desc, RPC_DATA_BLOB *blob, prs_struct *ps, int depth)
1826 prs_debug(ps, depth, desc, "smb_io_rpc_blob");
1830 if ( !prs_uint32("buf_len", ps, depth, &blob->buf_len) )
1833 if ( blob->buf_len == 0 )
1836 if (UNMARSHALLING(ps)) {
1837 blob->buffer = PRS_ALLOC_MEM(ps, uint8, blob->buf_len);
1838 if (!blob->buffer) {
1843 if ( !prs_uint8s(True, "buffer", ps, depth, blob->buffer, blob->buf_len) )
1849 /*******************************************************************
1850 creates a UNIHDR structure.
1851 ********************************************************************/
1853 BOOL make_uni_hdr(UNIHDR *hdr, int len)
1859 hdr->uni_str_len = 2 * len;
1860 hdr->uni_max_len = 2 * len;
1861 hdr->buffer = len != 0 ? 1 : 0;
1866 /*******************************************************************
1867 creates a BUFHDR2 structure.
1868 ********************************************************************/
1869 BOOL make_bufhdr2(BUFHDR2 *hdr, uint32 info_level, uint32 length, uint32 buffer)
1871 hdr->info_level = info_level;
1872 hdr->length = length;
1873 hdr->buffer = buffer;
1878 /*******************************************************************
1879 return the length of a UNISTR string.
1880 ********************************************************************/
1882 uint32 str_len_uni(UNISTR *source)
1886 if (!source->buffer)
1889 while (source->buffer[i])