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, 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");
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 (MARSHALLING(ps)) {
129 low = *nttime & 0xFFFFFFFF;
130 high = *nttime >> 32;
133 if(!prs_uint32("low ", ps, depth, &low)) /* low part */
135 if(!prs_uint32("high", ps, depth, &high)) /* high part */
138 if (UNMARSHALLING(ps)) {
139 *nttime = (((uint64_t)high << 32) + low);
145 /*******************************************************************
146 Reads or writes an NTTIME structure.
147 ********************************************************************/
149 BOOL smb_io_nttime(const char *desc, prs_struct *ps, int depth, NTTIME *nttime)
151 return smb_io_time( desc, nttime, ps, depth );
154 /*******************************************************************
155 Reads or writes a DOM_SID structure.
156 ********************************************************************/
158 BOOL smb_io_dom_sid(const char *desc, DOM_SID *sid, prs_struct *ps, int depth)
165 prs_debug(ps, depth, desc, "smb_io_dom_sid");
168 if(!prs_uint8 ("sid_rev_num", ps, depth, &sid->sid_rev_num))
171 if(!prs_uint8 ("num_auths ", ps, depth, &sid->num_auths))
174 for (i = 0; i < 6; i++)
177 slprintf(tmp, sizeof(tmp) - 1, "id_auth[%d] ", i);
178 if(!prs_uint8 (tmp, ps, depth, &sid->id_auth[i]))
182 /* oops! XXXX should really issue a warning here... */
183 if (sid->num_auths > MAXSUBAUTHS)
184 sid->num_auths = MAXSUBAUTHS;
186 if(!prs_uint32s(False, "sub_auths ", ps, depth, sid->sub_auths, sid->num_auths))
192 /*******************************************************************
193 Inits a DOM_SID2 structure.
194 ********************************************************************/
196 void init_dom_sid2(DOM_SID2 *sid2, const DOM_SID *sid)
199 sid2->num_auths = sid2->sid.num_auths;
202 /*******************************************************************
203 Reads or writes a DOM_SID2 structure.
204 ********************************************************************/
206 BOOL smb_io_dom_sid2_p(const char *desc, prs_struct *ps, int depth, DOM_SID2 **sid2)
210 /* caputure the pointer value to stream */
212 data_p = *sid2 ? 0xf000baaa : 0;
214 if ( !prs_uint32("dom_sid2_p", ps, depth, &data_p ))
217 /* we're done if there is no data */
222 if (UNMARSHALLING(ps)) {
223 if ( !(*sid2 = PRS_ALLOC_MEM(ps, DOM_SID2, 1)) )
229 /*******************************************************************
230 Reads or writes a DOM_SID2 structure.
231 ********************************************************************/
233 BOOL smb_io_dom_sid2(const char *desc, DOM_SID2 *sid, prs_struct *ps, int depth)
238 prs_debug(ps, depth, desc, "smb_io_dom_sid2");
244 if(!prs_uint32("num_auths", ps, depth, &sid->num_auths))
247 if(!smb_io_dom_sid("sid", &sid->sid, ps, depth))
253 /*******************************************************************
254 Reads or writes a struct GUID
255 ********************************************************************/
257 BOOL smb_io_uuid(const char *desc, struct GUID *uuid,
258 prs_struct *ps, int depth)
263 prs_debug(ps, depth, desc, "smb_io_uuid");
266 if(!prs_uint32 ("data ", ps, depth, &uuid->time_low))
268 if(!prs_uint16 ("data ", ps, depth, &uuid->time_mid))
270 if(!prs_uint16 ("data ", ps, depth, &uuid->time_hi_and_version))
273 if(!prs_uint8s (False, "data ", ps, depth, uuid->clock_seq, sizeof(uuid->clock_seq)))
275 if(!prs_uint8s (False, "data ", ps, depth, uuid->node, sizeof(uuid->node)))
281 /*******************************************************************
282 creates a STRHDR structure.
283 ********************************************************************/
285 void init_str_hdr(STRHDR *hdr, int max_len, int len, uint32 buffer)
287 hdr->str_max_len = max_len;
288 hdr->str_str_len = len;
289 hdr->buffer = buffer;
292 /*******************************************************************
293 Reads or writes a STRHDR structure.
294 ********************************************************************/
296 BOOL smb_io_strhdr(const char *desc, STRHDR *hdr, prs_struct *ps, int depth)
301 prs_debug(ps, depth, desc, "smb_io_strhdr");
306 if(!prs_uint16("str_str_len", ps, depth, &hdr->str_str_len))
308 if(!prs_uint16("str_max_len", ps, depth, &hdr->str_max_len))
310 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
316 /*******************************************************************
317 Inits a UNIHDR structure.
318 ********************************************************************/
320 void init_uni_hdr(UNIHDR *hdr, UNISTR2 *str2)
322 hdr->uni_str_len = 2 * (str2->uni_str_len);
323 hdr->uni_max_len = 2 * (str2->uni_max_len);
324 hdr->buffer = (str2->uni_str_len != 0) ? 1 : 0;
327 /*******************************************************************
328 Reads or writes a UNIHDR structure.
329 ********************************************************************/
331 BOOL smb_io_unihdr(const char *desc, UNIHDR *hdr, prs_struct *ps, int depth)
336 prs_debug(ps, depth, desc, "smb_io_unihdr");
342 if(!prs_uint16("uni_str_len", ps, depth, &hdr->uni_str_len))
344 if(!prs_uint16("uni_max_len", ps, depth, &hdr->uni_max_len))
346 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
352 /*******************************************************************
353 Inits a BUFHDR structure.
354 ********************************************************************/
356 void init_buf_hdr(BUFHDR *hdr, int max_len, int len)
358 hdr->buf_max_len = max_len;
362 /*******************************************************************
363 prs_uint16 wrapper. Call this and it sets up a pointer to where the
364 uint16 should be stored, or gets the size if reading.
365 ********************************************************************/
367 BOOL smb_io_hdrbuf_pre(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth, uint32 *offset)
369 (*offset) = prs_offset(ps);
374 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
381 if(!prs_set_offset(ps, prs_offset(ps) + (sizeof(uint32) * 2)))
388 /*******************************************************************
389 smb_io_hdrbuf wrapper. Call this and it retrospectively stores the size.
390 Does nothing on reading, as that is already handled by ...._pre()
391 ********************************************************************/
393 BOOL smb_io_hdrbuf_post(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth,
394 uint32 ptr_hdrbuf, uint32 max_len, uint32 len)
397 /* writing: go back and do a retrospective job. i hate this */
399 uint32 old_offset = prs_offset(ps);
401 init_buf_hdr(hdr, max_len, len);
402 if(!prs_set_offset(ps, ptr_hdrbuf))
404 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
407 if(!prs_set_offset(ps, old_offset))
414 /*******************************************************************
415 Reads or writes a BUFHDR structure.
416 ********************************************************************/
418 BOOL smb_io_hdrbuf(const char *desc, BUFHDR *hdr, prs_struct *ps, int depth)
423 prs_debug(ps, depth, desc, "smb_io_hdrbuf");
429 if(!prs_uint32("buf_max_len", ps, depth, &hdr->buf_max_len))
431 if(!prs_uint32("buf_len ", ps, depth, &hdr->buf_len))
437 /*******************************************************************
438 Inits a UNISTR structure.
439 ********************************************************************/
441 void init_unistr(UNISTR *str, const char *buf)
450 len = strlen(buf) + 1;
453 str->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, len);
454 if (str->buffer == NULL)
455 smb_panic("init_unistr: malloc fail");
457 rpcstr_push(str->buffer, buf, len*sizeof(uint16), STR_TERMINATE);
463 /*******************************************************************
464 reads or writes a UNISTR structure.
465 XXXX NOTE: UNISTR structures NEED to be null-terminated.
466 ********************************************************************/
468 BOOL smb_io_unistr(const char *desc, UNISTR *uni, prs_struct *ps, int depth)
473 prs_debug(ps, depth, desc, "smb_io_unistr");
476 if(!prs_unistr("unistr", ps, depth, uni))
482 /*******************************************************************
483 Allocate the RPC_DATA_BLOB memory.
484 ********************************************************************/
486 static void create_rpc_blob(RPC_DATA_BLOB *str, size_t len)
489 str->buffer = (uint8 *)TALLOC_ZERO(get_talloc_ctx(), len);
490 if (str->buffer == NULL)
491 smb_panic("create_rpc_blob: talloc fail");
499 /*******************************************************************
500 Inits a RPC_DATA_BLOB structure from a uint32
501 ********************************************************************/
503 void init_rpc_blob_uint32(RPC_DATA_BLOB *str, uint32 val)
507 /* set up string lengths. */
508 create_rpc_blob(str, sizeof(uint32));
509 SIVAL(str->buffer, 0, val);
512 /*******************************************************************
513 Inits a RPC_DATA_BLOB structure.
514 ********************************************************************/
516 void init_rpc_blob_str(RPC_DATA_BLOB *str, const char *buf, int len)
520 /* set up string lengths. */
522 create_rpc_blob(str, len*2);
523 rpcstr_push(str->buffer, buf, (size_t)str->buf_len, STR_TERMINATE);
527 /*******************************************************************
528 Inits a RPC_DATA_BLOB structure from a hex string.
529 ********************************************************************/
531 void init_rpc_blob_hex(RPC_DATA_BLOB *str, const char *buf)
535 create_rpc_blob(str, strlen(buf));
536 str->buf_len = strhex_to_str((char *)str->buffer, str->buf_len, buf);
540 /*******************************************************************
541 Inits a RPC_DATA_BLOB structure.
542 ********************************************************************/
544 void init_rpc_blob_bytes(RPC_DATA_BLOB *str, uint8 *buf, size_t len)
548 /* max buffer size (allocated size) */
549 if (buf != NULL && len) {
550 create_rpc_blob(str, len);
551 memcpy(str->buffer, buf, len);
556 /*******************************************************************
557 reads or writes a BUFFER5 structure.
558 the buf_len member tells you how large the buffer is.
559 ********************************************************************/
560 BOOL smb_io_buffer5(const char *desc, BUFFER5 *buf5, prs_struct *ps, int depth)
562 prs_debug(ps, depth, desc, "smb_io_buffer5");
565 if (buf5 == NULL) return False;
569 if(!prs_uint32("buf_len", ps, depth, &buf5->buf_len))
573 if(!prs_buffer5(True, "buffer" , ps, depth, buf5))
580 /*******************************************************************
581 Inits a REGVAL_BUFFER structure.
582 ********************************************************************/
584 void init_regval_buffer(REGVAL_BUFFER *str, const uint8 *buf, size_t len)
588 /* max buffer size (allocated size) */
589 str->buf_max_len = len;
591 str->buf_len = buf != NULL ? len : 0;
594 SMB_ASSERT(str->buf_max_len >= str->buf_len);
595 str->buffer = (uint16 *)TALLOC_ZERO(get_talloc_ctx(),
597 if (str->buffer == NULL)
598 smb_panic("init_regval_buffer: talloc fail");
599 memcpy(str->buffer, buf, str->buf_len);
603 /*******************************************************************
604 Reads or writes a REGVAL_BUFFER structure.
605 the uni_max_len member tells you how large the buffer is.
606 the uni_str_len member tells you how much of the buffer is really used.
607 ********************************************************************/
609 BOOL smb_io_regval_buffer(const char *desc, prs_struct *ps, int depth, REGVAL_BUFFER *buf2)
612 prs_debug(ps, depth, desc, "smb_io_regval_buffer");
618 if(!prs_uint32("buf_max_len", ps, depth, &buf2->buf_max_len))
620 if(!prs_uint32("offset ", ps, depth, &buf2->offset))
622 if(!prs_uint32("buf_len ", ps, depth, &buf2->buf_len))
625 /* buffer advanced by indicated length of string
626 NOT by searching for null-termination */
628 if(!prs_regval_buffer(True, "buffer ", ps, depth, buf2))
634 /*******************************************************************
635 creates a UNISTR2 structure: sets up the buffer, too
636 ********************************************************************/
638 void init_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf)
642 init_unistr2(str, buf, UNI_STR_TERMINATE);
645 init_unistr2(str, NULL, UNI_FLAGS_NONE);
650 /*******************************************************************
651 Copies a UNISTR2 structure.
652 ********************************************************************/
654 void copy_unistr2(UNISTR2 *str, const UNISTR2 *from)
656 if (from->buffer == NULL) {
661 SMB_ASSERT(from->uni_max_len >= from->uni_str_len);
663 str->uni_max_len = from->uni_max_len;
664 str->offset = from->offset;
665 str->uni_str_len = from->uni_str_len;
667 /* the string buffer is allocated to the maximum size
668 (the the length of the source string) to prevent
669 reallocation of memory. */
670 if (str->buffer == NULL) {
671 if (str->uni_max_len) {
672 str->buffer = (uint16 *)TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, str->uni_max_len);
673 if ((str->buffer == NULL)) {
674 smb_panic("copy_unistr2: talloc fail");
677 /* copy the string */
678 memcpy(str->buffer, from->buffer, str->uni_max_len*sizeof(uint16));
685 /*******************************************************************
686 Creates a STRING2 structure.
687 ********************************************************************/
689 void init_string2(STRING2 *str, const char *buf, size_t max_len, size_t str_len)
691 /* set up string lengths. */
692 SMB_ASSERT(max_len >= str_len);
694 /* Ensure buf is valid if str_len was set. Coverity check. */
695 if (str_len && !buf) {
699 str->str_max_len = max_len;
701 str->str_str_len = str_len;
703 /* store the string */
705 str->buffer = (uint8 *)TALLOC_ZERO(get_talloc_ctx(),
707 if (str->buffer == NULL)
708 smb_panic("init_string2: malloc fail");
709 memcpy(str->buffer, buf, str_len);
713 /*******************************************************************
714 Reads or writes a STRING2 structure.
715 XXXX NOTE: STRING2 structures need NOT be null-terminated.
716 the str_str_len member tells you how long the string is;
717 the str_max_len member tells you how large the buffer is.
718 ********************************************************************/
720 BOOL smb_io_string2(const char *desc, STRING2 *str2, uint32 buffer, prs_struct *ps, int depth)
727 prs_debug(ps, depth, desc, "smb_io_string2");
733 if(!prs_uint32("str_max_len", ps, depth, &str2->str_max_len))
735 if(!prs_uint32("offset ", ps, depth, &str2->offset))
737 if(!prs_uint32("str_str_len", ps, depth, &str2->str_str_len))
740 /* buffer advanced by indicated length of string
741 NOT by searching for null-termination */
742 if(!prs_string2(True, "buffer ", ps, depth, str2))
747 prs_debug(ps, depth, desc, "smb_io_string2 - NULL");
749 memset((char *)str2, '\0', sizeof(*str2));
756 /*******************************************************************
757 Inits a UNISTR2 structure.
758 ********************************************************************/
760 void init_unistr2(UNISTR2 *str, const char *buf, enum unistr2_term_codes flags)
763 uint32 num_chars = 0;
766 /* We always null terminate the copy. */
767 len = strlen(buf) + 1;
768 if ( flags == UNI_STR_DBLTERMINATE )
772 if (buf == NULL || len == 0) {
773 /* no buffer -- nothing to do */
774 str->uni_max_len = 0;
776 str->uni_str_len = 0;
782 str->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, len);
783 if (str->buffer == NULL) {
784 smb_panic("init_unistr2: malloc fail");
788 /* Ensure len is the length in *bytes* */
789 len *= sizeof(uint16);
792 * The UNISTR2 must be initialized !!!
796 rpcstr_push((char *)str->buffer, buf, len, STR_TERMINATE);
797 num_chars = strlen_w(str->buffer);
798 if (flags == UNI_STR_TERMINATE || flags == UNI_MAXLEN_TERMINATE) {
801 if ( flags == UNI_STR_DBLTERMINATE )
805 str->uni_max_len = num_chars;
807 str->uni_str_len = num_chars;
808 if ( num_chars && ((flags == UNI_MAXLEN_TERMINATE) || (flags == UNI_BROKEN_NON_NULL)) )
812 /*******************************************************************
813 Inits a UNISTR4 structure.
814 ********************************************************************/
816 void init_unistr4(UNISTR4 *uni4, const char *buf, enum unistr2_term_codes flags)
818 uni4->string = TALLOC_P( get_talloc_ctx(), UNISTR2 );
820 smb_panic("init_unistr4: talloc fail");
823 init_unistr2( uni4->string, buf, flags );
825 uni4->length = 2 * (uni4->string->uni_str_len);
826 uni4->size = 2 * (uni4->string->uni_max_len);
829 void init_unistr4_w( TALLOC_CTX *ctx, UNISTR4 *uni4, const smb_ucs2_t *buf )
831 uni4->string = TALLOC_P( ctx, UNISTR2 );
833 smb_panic("init_unistr4_w: talloc fail");
836 init_unistr2_w( ctx, uni4->string, buf );
838 uni4->length = 2 * (uni4->string->uni_str_len);
839 uni4->size = 2 * (uni4->string->uni_max_len);
843 * Inits a UNISTR2 structure.
844 * @param ctx talloc context to allocate string on
845 * @param str pointer to string to create
846 * @param buf UCS2 null-terminated buffer to init from
849 void init_unistr2_w(TALLOC_CTX *ctx, UNISTR2 *str, const smb_ucs2_t *buf)
851 uint32 len = buf ? strlen_w(buf) : 0;
855 /* set up string lengths. */
856 str->uni_max_len = len;
858 str->uni_str_len = len;
861 str->buffer = TALLOC_ZERO_ARRAY(ctx, uint16, len + 1);
862 if (str->buffer == NULL) {
863 smb_panic("init_unistr2_w: talloc fail");
871 * don't move this test above ! The UNISTR2 must be initialized !!!
877 /* Yes, this is a strncpy( foo, bar, strlen(bar)) - but as
878 long as the buffer above is talloc()ed correctly then this
879 is the correct thing to do */
881 strncpy_w(str->buffer, buf, len + 1);
885 /*******************************************************************
886 Inits a UNISTR2 structure from a UNISTR
887 ********************************************************************/
889 void init_unistr2_from_unistr(UNISTR2 *to, const UNISTR *from)
893 /* the destination UNISTR2 should never be NULL.
894 if it is it is a programming error */
896 /* if the source UNISTR is NULL, then zero out
897 the destination string and return */
899 if ((from == NULL) || (from->buffer == NULL))
902 /* get the length; UNISTR must be NULL terminated */
904 while ((from->buffer)[i]!='\0')
906 i++; /* one more to catch the terminating NULL */
907 /* is this necessary -- jerry? I need to think */
909 /* set up string lengths; uni_max_len is set to i+1
910 because we need to account for the final NULL termination */
915 /* allocate the space and copy the string buffer */
917 to->buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, i);
918 if (to->buffer == NULL)
919 smb_panic("init_unistr2_from_unistr: malloc fail");
920 memcpy(to->buffer, from->buffer, i*sizeof(uint16));
927 /*******************************************************************
928 Inits a UNISTR2 structure from a DATA_BLOB.
929 The length of the data_blob must count the bytes of the buffer.
930 Copies the blob data.
931 ********************************************************************/
933 void init_unistr2_from_datablob(UNISTR2 *str, DATA_BLOB *blob)
935 /* Allocs the unistring */
936 init_unistr2(str, NULL, UNI_FLAGS_NONE);
938 /* Sets the values */
939 str->uni_str_len = blob->length / sizeof(uint16);
940 str->uni_max_len = str->uni_str_len;
943 str->buffer = (uint16 *) memdup(blob->data, blob->length);
947 if ((str->buffer == NULL) && (blob->length > 0)) {
948 smb_panic("init_unistr2_from_datablob: malloc fail");
952 /*******************************************************************
953 UNISTR2* are a little different in that the pointer and the UNISTR2
954 are not necessarily read/written back to back. So we break it up
955 into 2 separate functions.
956 See SPOOL_USER_1 in include/rpc_spoolss.h for an example.
957 ********************************************************************/
959 BOOL prs_io_unistr2_p(const char *desc, prs_struct *ps, int depth, UNISTR2 **uni2)
963 /* caputure the pointer value to stream */
965 data_p = *uni2 ? 0xf000baaa : 0;
967 if ( !prs_uint32("ptr", ps, depth, &data_p ))
970 /* we're done if there is no data */
975 if (UNMARSHALLING(ps)) {
976 if ( !(*uni2 = PRS_ALLOC_MEM(ps, UNISTR2, 1)) )
983 /*******************************************************************
984 now read/write the actual UNISTR2. Memory for the UNISTR2 (but
985 not UNISTR2.buffer) has been allocated previously by prs_unistr2_p()
986 ********************************************************************/
988 BOOL prs_io_unistr2(const char *desc, prs_struct *ps, int depth, UNISTR2 *uni2 )
990 /* just return true if there is no pointer to deal with.
991 the memory must have been previously allocated on unmarshalling
992 by prs_unistr2_p() */
997 /* just pass off to smb_io_unstr2() passing the uni2 address as
998 the pointer (like you would expect) */
1000 return smb_io_unistr2( desc, uni2, uni2 ? 1 : 0, ps, depth );
1003 /*******************************************************************
1004 Reads or writes a UNISTR2 structure.
1005 XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
1006 the uni_str_len member tells you how long the string is;
1007 the uni_max_len member tells you how large the buffer is.
1008 ********************************************************************/
1010 BOOL smb_io_unistr2(const char *desc, UNISTR2 *uni2, uint32 buffer, prs_struct *ps, int depth)
1017 prs_debug(ps, depth, desc, "smb_io_unistr2");
1023 if(!prs_uint32("uni_max_len", ps, depth, &uni2->uni_max_len))
1025 if(!prs_uint32("offset ", ps, depth, &uni2->offset))
1027 if(!prs_uint32("uni_str_len", ps, depth, &uni2->uni_str_len))
1030 /* buffer advanced by indicated length of string
1031 NOT by searching for null-termination */
1032 if(!prs_unistr2(True, "buffer ", ps, depth, uni2))
1037 prs_debug(ps, depth, desc, "smb_io_unistr2 - NULL");
1039 memset((char *)uni2, '\0', sizeof(*uni2));
1046 /*******************************************************************
1047 now read/write UNISTR4
1048 ********************************************************************/
1050 BOOL prs_unistr4(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1053 prs_debug(ps, depth, desc, "prs_unistr4");
1056 if ( !prs_uint16("length", ps, depth, &uni4->length ))
1058 if ( !prs_uint16("size", ps, depth, &uni4->size ))
1063 if ( !prs_pointer( desc, ps, depth, &ptr, sizeof(UNISTR2), (PRS_POINTER_CAST)prs_io_unistr2 ) )
1066 uni4->string = (UNISTR2 *)ptr;
1071 /*******************************************************************
1072 now read/write UNISTR4 header
1073 ********************************************************************/
1075 BOOL prs_unistr4_hdr(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1077 prs_debug(ps, depth, desc, "prs_unistr4_hdr");
1080 if ( !prs_uint16("length", ps, depth, &uni4->length) )
1082 if ( !prs_uint16("size", ps, depth, &uni4->size) )
1084 if ( !prs_io_unistr2_p(desc, ps, depth, &uni4->string) )
1090 /*******************************************************************
1091 now read/write UNISTR4 string
1092 ********************************************************************/
1094 BOOL prs_unistr4_str(const char *desc, prs_struct *ps, int depth, UNISTR4 *uni4)
1096 prs_debug(ps, depth, desc, "prs_unistr4_str");
1099 if ( !prs_io_unistr2(desc, ps, depth, uni4->string) )
1105 /*******************************************************************
1106 Reads or writes a UNISTR4_ARRAY structure.
1107 ********************************************************************/
1109 BOOL prs_unistr4_array(const char *desc, prs_struct *ps, int depth, UNISTR4_ARRAY *array )
1113 prs_debug(ps, depth, desc, "prs_unistr4_array");
1116 if(!prs_uint32("count", ps, depth, &array->count))
1119 if (UNMARSHALLING(ps)) {
1121 if ( !(array->strings = TALLOC_ZERO_ARRAY( get_talloc_ctx(), UNISTR4, array->count)) )
1124 array->strings = NULL;
1128 /* write the headers and then the actual string buffer */
1130 for ( i=0; i<array->count; i++ ) {
1131 if ( !prs_unistr4_hdr( "string", ps, depth, &array->strings[i]) )
1135 for (i=0;i<array->count;i++) {
1136 if ( !prs_unistr4_str("string", ps, depth, &array->strings[i]) )
1143 /********************************************************************
1144 initialise a UNISTR_ARRAY from a char**
1145 ********************************************************************/
1147 BOOL init_unistr4_array( UNISTR4_ARRAY *array, uint32 count, const char **strings )
1151 array->count = count;
1153 /* allocate memory for the array of UNISTR4 objects */
1156 if ( !(array->strings = TALLOC_ZERO_ARRAY(get_talloc_ctx(), UNISTR4, count )) )
1159 array->strings = NULL;
1162 for ( i=0; i<count; i++ )
1163 init_unistr4( &array->strings[i], strings[i], UNI_STR_TERMINATE );
1168 BOOL smb_io_lockout_string_hdr(const char *desc, HDR_LOCKOUT_STRING *hdr_account_lockout, prs_struct *ps, int depth)
1170 prs_debug(ps, depth, desc, "smb_io_lockout_string_hdr");
1176 if(!prs_uint16("size", ps, depth, &hdr_account_lockout->size))
1178 if(!prs_uint16("length", ps, depth, &hdr_account_lockout->length))
1180 if(!prs_uint32("buffer", ps, depth, &hdr_account_lockout->buffer))
1186 BOOL smb_io_account_lockout_str(const char *desc, LOCKOUT_STRING *account_lockout, uint32 buffer, prs_struct *ps, int depth)
1188 prs_debug(ps, depth, desc, "smb_io_account_lockout_string");
1191 if(!prs_uint32("array_size", ps, depth, &account_lockout->array_size))
1194 if(!prs_uint32("offset", ps, depth, &account_lockout->offset))
1196 if(!prs_uint32("length", ps, depth, &account_lockout->length))
1199 if (!prs_uint64("lockout_duration", ps, depth, &account_lockout->lockout_duration))
1201 if (!prs_uint64("reset_count", ps, depth, &account_lockout->reset_count))
1203 if (!prs_uint32("bad_attempt_lockout", ps, depth, &account_lockout->bad_attempt_lockout))
1205 if (!prs_uint32("dummy", ps, depth, &account_lockout->dummy))
1208 if(!prs_uint16s (False, "bindata", ps, depth, &account_lockout->bindata, length))
1215 /*******************************************************************
1216 Inits a DOM_RID structure.
1217 ********************************************************************/
1219 void init_dom_rid(DOM_RID *prid, uint32 rid, uint16 type, uint32 idx)
1223 prid->rid_idx = idx;
1226 /*******************************************************************
1227 Reads or writes a DOM_RID structure.
1228 ********************************************************************/
1230 BOOL smb_io_dom_rid(const char *desc, DOM_RID *rid, prs_struct *ps, int depth)
1235 prs_debug(ps, depth, desc, "smb_io_dom_rid");
1241 if(!prs_uint16("type ", ps, depth, &rid->type))
1245 if(!prs_uint32("rid ", ps, depth, &rid->rid))
1247 if(!prs_uint32("rid_idx", ps, depth, &rid->rid_idx))
1253 /*******************************************************************
1254 Reads or writes a DOM_RID2 structure.
1255 ********************************************************************/
1257 BOOL smb_io_dom_rid2(const char *desc, DOM_RID2 *rid, prs_struct *ps, int depth)
1262 prs_debug(ps, depth, desc, "smb_io_dom_rid2");
1268 if(!prs_uint16("type ", ps, depth, &rid->type))
1272 if(!prs_uint32("rid ", ps, depth, &rid->rid))
1274 if(!prs_uint32("rid_idx", ps, depth, &rid->rid_idx))
1276 if(!prs_uint32("unknown", ps, depth, &rid->unknown))
1283 /*******************************************************************
1284 creates a DOM_RID3 structure.
1285 ********************************************************************/
1287 void init_dom_rid3(DOM_RID3 *rid3, uint32 rid, uint8 type)
1291 rid3->ptr_type = 0x1; /* non-zero, basically. */
1296 /*******************************************************************
1297 reads or writes a DOM_RID3 structure.
1298 ********************************************************************/
1300 BOOL smb_io_dom_rid3(const char *desc, DOM_RID3 *rid3, prs_struct *ps, int depth)
1305 prs_debug(ps, depth, desc, "smb_io_dom_rid3");
1311 if(!prs_uint32("rid ", ps, depth, &rid3->rid))
1313 if(!prs_uint32("type1 ", ps, depth, &rid3->type1))
1315 if(!prs_uint32("ptr_type", ps, depth, &rid3->ptr_type))
1317 if(!prs_uint32("type2 ", ps, depth, &rid3->type2))
1319 if(!prs_uint32("unk ", ps, depth, &rid3->unk))
1325 /*******************************************************************
1326 Inits a DOM_RID4 structure.
1327 ********************************************************************/
1329 void init_dom_rid4(DOM_RID4 *rid4, uint16 unknown, uint16 attr, uint32 rid)
1331 rid4->unknown = unknown;
1336 /*******************************************************************
1337 Inits a DOM_CLNT_SRV structure.
1338 ********************************************************************/
1340 void init_clnt_srv(DOM_CLNT_SRV *logcln, const char *logon_srv,
1341 const char *comp_name)
1343 DEBUG(5,("init_clnt_srv: %d\n", __LINE__));
1345 if (logon_srv != NULL) {
1346 logcln->undoc_buffer = 1;
1347 init_unistr2(&logcln->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
1349 logcln->undoc_buffer = 0;
1352 if (comp_name != NULL) {
1353 logcln->undoc_buffer2 = 1;
1354 init_unistr2(&logcln->uni_comp_name, comp_name, UNI_STR_TERMINATE);
1356 logcln->undoc_buffer2 = 0;
1360 /*******************************************************************
1361 Inits or writes a DOM_CLNT_SRV structure.
1362 ********************************************************************/
1364 BOOL smb_io_clnt_srv(const char *desc, DOM_CLNT_SRV *logcln, prs_struct *ps, int depth)
1369 prs_debug(ps, depth, desc, "smb_io_clnt_srv");
1375 if(!prs_uint32("undoc_buffer ", ps, depth, &logcln->undoc_buffer))
1378 if (logcln->undoc_buffer != 0) {
1379 if(!smb_io_unistr2("unistr2", &logcln->uni_logon_srv, logcln->undoc_buffer, ps, depth))
1386 if(!prs_uint32("undoc_buffer2", ps, depth, &logcln->undoc_buffer2))
1389 if (logcln->undoc_buffer2 != 0) {
1390 if(!smb_io_unistr2("unistr2", &logcln->uni_comp_name, logcln->undoc_buffer2, ps, depth))
1397 /*******************************************************************
1398 Inits a DOM_LOG_INFO structure.
1399 ********************************************************************/
1401 void init_log_info(DOM_LOG_INFO *loginfo, const char *logon_srv, const char *acct_name,
1402 uint16 sec_chan, const char *comp_name)
1404 DEBUG(5,("make_log_info %d\n", __LINE__));
1406 loginfo->undoc_buffer = 1;
1408 init_unistr2(&loginfo->uni_logon_srv, logon_srv, UNI_STR_TERMINATE);
1409 init_unistr2(&loginfo->uni_acct_name, acct_name, UNI_STR_TERMINATE);
1411 loginfo->sec_chan = sec_chan;
1413 init_unistr2(&loginfo->uni_comp_name, comp_name, UNI_STR_TERMINATE);
1416 /*******************************************************************
1417 Reads or writes a DOM_LOG_INFO structure.
1418 ********************************************************************/
1420 BOOL smb_io_log_info(const char *desc, DOM_LOG_INFO *loginfo, prs_struct *ps, int depth)
1422 if (loginfo == NULL)
1425 prs_debug(ps, depth, desc, "smb_io_log_info");
1431 if(!prs_uint32("undoc_buffer", ps, depth, &loginfo->undoc_buffer))
1434 if(!smb_io_unistr2("unistr2", &loginfo->uni_logon_srv, True, ps, depth))
1436 if(!smb_io_unistr2("unistr2", &loginfo->uni_acct_name, True, ps, depth))
1439 if(!prs_uint16("sec_chan", ps, depth, &loginfo->sec_chan))
1442 if(!smb_io_unistr2("unistr2", &loginfo->uni_comp_name, True, ps, depth))
1448 /*******************************************************************
1449 Reads or writes a DOM_CHAL structure.
1450 ********************************************************************/
1452 BOOL smb_io_chal(const char *desc, DOM_CHAL *chal, prs_struct *ps, int depth)
1457 prs_debug(ps, depth, desc, "smb_io_chal");
1460 if(!prs_uint8s (False, "data", ps, depth, chal->data, 8))
1466 /*******************************************************************
1467 Reads or writes a DOM_CRED structure.
1468 ********************************************************************/
1470 BOOL smb_io_cred(const char *desc, DOM_CRED *cred, prs_struct *ps, int depth)
1475 prs_debug(ps, depth, desc, "smb_io_cred");
1481 if(!smb_io_chal ("", &cred->challenge, ps, depth))
1484 if(!smb_io_utime("", &cred->timestamp, ps, depth))
1490 /*******************************************************************
1491 Inits a DOM_CLNT_INFO2 structure.
1492 ********************************************************************/
1494 void init_clnt_info2(DOM_CLNT_INFO2 *clnt,
1495 const char *logon_srv, const char *comp_name,
1496 const DOM_CRED *clnt_cred)
1498 DEBUG(5,("make_clnt_info: %d\n", __LINE__));
1500 init_clnt_srv(&clnt->login, logon_srv, comp_name);
1502 if (clnt_cred != NULL) {
1504 memcpy(&clnt->cred, clnt_cred, sizeof(clnt->cred));
1510 /*******************************************************************
1511 Reads or writes a DOM_CLNT_INFO2 structure.
1512 ********************************************************************/
1514 BOOL smb_io_clnt_info2(const char *desc, DOM_CLNT_INFO2 *clnt, prs_struct *ps, int depth)
1519 prs_debug(ps, depth, desc, "smb_io_clnt_info2");
1525 if(!smb_io_clnt_srv("", &clnt->login, ps, depth))
1531 if(!prs_uint32("ptr_cred", ps, depth, &clnt->ptr_cred))
1533 if(!smb_io_cred("", &clnt->cred, ps, depth))
1539 /*******************************************************************
1540 Inits a DOM_CLNT_INFO structure.
1541 ********************************************************************/
1543 void init_clnt_info(DOM_CLNT_INFO *clnt,
1544 const char *logon_srv, const char *acct_name,
1545 uint16 sec_chan, const char *comp_name,
1546 const DOM_CRED *cred)
1548 DEBUG(5,("make_clnt_info\n"));
1550 init_log_info(&clnt->login, logon_srv, acct_name, sec_chan, comp_name);
1551 memcpy(&clnt->cred, cred, sizeof(clnt->cred));
1554 /*******************************************************************
1555 Reads or writes a DOM_CLNT_INFO structure.
1556 ********************************************************************/
1558 BOOL smb_io_clnt_info(const char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int depth)
1563 prs_debug(ps, depth, desc, "smb_io_clnt_info");
1569 if(!smb_io_log_info("", &clnt->login, ps, depth))
1571 if(!smb_io_cred("", &clnt->cred, ps, depth))
1577 /*******************************************************************
1578 Inits a DOM_LOGON_ID structure.
1579 ********************************************************************/
1581 void init_logon_id(DOM_LOGON_ID *logonid, uint32 log_id_low, uint32 log_id_high)
1583 DEBUG(5,("make_logon_id: %d\n", __LINE__));
1585 logonid->low = log_id_low;
1586 logonid->high = log_id_high;
1589 /*******************************************************************
1590 Reads or writes a DOM_LOGON_ID structure.
1591 ********************************************************************/
1593 BOOL smb_io_logon_id(const char *desc, DOM_LOGON_ID *logonid, prs_struct *ps, int depth)
1595 if (logonid == NULL)
1598 prs_debug(ps, depth, desc, "smb_io_logon_id");
1604 if(!prs_uint32("low ", ps, depth, &logonid->low ))
1606 if(!prs_uint32("high", ps, depth, &logonid->high))
1612 /*******************************************************************
1613 Inits an OWF_INFO structure.
1614 ********************************************************************/
1616 void init_owf_info(OWF_INFO *hash, const uint8 data[16])
1618 DEBUG(5,("init_owf_info: %d\n", __LINE__));
1621 memcpy(hash->data, data, sizeof(hash->data));
1623 memset((char *)hash->data, '\0', sizeof(hash->data));
1626 /*******************************************************************
1627 Reads or writes an OWF_INFO structure.
1628 ********************************************************************/
1630 BOOL smb_io_owf_info(const char *desc, OWF_INFO *hash, prs_struct *ps, int depth)
1635 prs_debug(ps, depth, desc, "smb_io_owf_info");
1641 if(!prs_uint8s (False, "data", ps, depth, hash->data, 16))
1647 /*******************************************************************
1648 Reads or writes a DOM_GID structure.
1649 ********************************************************************/
1651 BOOL smb_io_gid(const char *desc, DOM_GID *gid, prs_struct *ps, int depth)
1656 prs_debug(ps, depth, desc, "smb_io_gid");
1662 if(!prs_uint32("g_rid", ps, depth, &gid->g_rid))
1664 if(!prs_uint32("attr ", ps, depth, &gid->attr))
1670 /*******************************************************************
1671 Reads or writes an POLICY_HND structure.
1672 ********************************************************************/
1674 BOOL smb_io_pol_hnd(const char *desc, POLICY_HND *pol, prs_struct *ps, int depth)
1679 prs_debug(ps, depth, desc, "smb_io_pol_hnd");
1685 if(UNMARSHALLING(ps))
1688 if (!prs_uint32("handle_type", ps, depth, &pol->handle_type))
1690 if (!smb_io_uuid("uuid", (struct GUID*)&pol->uuid, ps, depth))
1696 /*******************************************************************
1698 ********************************************************************/
1700 void init_unistr3(UNISTR3 *str, const char *buf)
1704 str->str.buffer = NULL;
1708 str->uni_str_len = strlen(buf) + 1;
1710 if (str->uni_str_len) {
1711 str->str.buffer = TALLOC_ZERO_ARRAY(get_talloc_ctx(), uint16, str->uni_str_len);
1712 if (str->str.buffer == NULL)
1713 smb_panic("init_unistr3: malloc fail");
1715 rpcstr_push((char *)str->str.buffer, buf, str->uni_str_len * sizeof(uint16), STR_TERMINATE);
1717 str->str.buffer = NULL;
1721 /*******************************************************************
1722 Reads or writes a UNISTR3 structure.
1723 ********************************************************************/
1725 BOOL smb_io_unistr3(const char *desc, UNISTR3 *name, prs_struct *ps, int depth)
1730 prs_debug(ps, depth, desc, "smb_io_unistr3");
1736 if(!prs_uint32("uni_str_len", ps, depth, &name->uni_str_len))
1739 /* we're done if there is no string */
1741 if ( name->uni_str_len == 0 )
1744 /* don't know if len is specified by uni_str_len member... */
1745 /* assume unicode string is unicode-null-terminated, instead */
1747 if(!prs_unistr3(True, "unistr", name, ps, depth))
1753 /*******************************************************************
1754 Stream a uint64_struct
1755 ********************************************************************/
1756 BOOL prs_uint64(const char *name, prs_struct *ps, int depth, uint64 *data64)
1758 if (UNMARSHALLING(ps)) {
1761 if (!prs_uint32(name, ps, depth+1, &low))
1764 if (!prs_uint32(name, ps, depth+1, &high))
1767 *data64 = ((uint64_t)high << 32) + low;
1771 uint32 high = (*data64) >> 32, low = (*data64) & 0xFFFFFFFF;
1772 return prs_uint32(name, ps, depth+1, &low) &&
1773 prs_uint32(name, ps, depth+1, &high);
1777 /*******************************************************************
1778 reads or writes a BUFHDR2 structure.
1779 ********************************************************************/
1780 BOOL smb_io_bufhdr2(const char *desc, BUFHDR2 *hdr, prs_struct *ps, int depth)
1782 prs_debug(ps, depth, desc, "smb_io_bufhdr2");
1786 prs_uint32("info_level", ps, depth, &(hdr->info_level));
1787 prs_uint32("length ", ps, depth, &(hdr->length ));
1788 prs_uint32("buffer ", ps, depth, &(hdr->buffer ));
1793 /*******************************************************************
1794 reads or writes a BUFHDR4 structure.
1795 ********************************************************************/
1796 BOOL smb_io_bufhdr4(const char *desc, BUFHDR4 *hdr, prs_struct *ps, int depth)
1798 prs_debug(ps, depth, desc, "smb_io_bufhdr4");
1802 prs_uint32("size", ps, depth, &hdr->size);
1803 prs_uint32("buffer", ps, depth, &hdr->buffer);
1808 /*******************************************************************
1809 reads or writes a RPC_DATA_BLOB structure.
1810 ********************************************************************/
1812 BOOL smb_io_rpc_blob(const char *desc, RPC_DATA_BLOB *blob, prs_struct *ps, int depth)
1814 prs_debug(ps, depth, desc, "smb_io_rpc_blob");
1818 if ( !prs_uint32("buf_len", ps, depth, &blob->buf_len) )
1821 if ( blob->buf_len == 0 )
1824 if (UNMARSHALLING(ps)) {
1825 blob->buffer = PRS_ALLOC_MEM(ps, uint8, blob->buf_len);
1826 if (!blob->buffer) {
1831 if ( !prs_uint8s(True, "buffer", ps, depth, blob->buffer, blob->buf_len) )
1837 /*******************************************************************
1838 creates a UNIHDR structure.
1839 ********************************************************************/
1841 BOOL make_uni_hdr(UNIHDR *hdr, int len)
1847 hdr->uni_str_len = 2 * len;
1848 hdr->uni_max_len = 2 * len;
1849 hdr->buffer = len != 0 ? 1 : 0;
1854 /*******************************************************************
1855 creates a BUFHDR2 structure.
1856 ********************************************************************/
1857 BOOL make_bufhdr2(BUFHDR2 *hdr, uint32 info_level, uint32 length, uint32 buffer)
1859 hdr->info_level = info_level;
1860 hdr->length = length;
1861 hdr->buffer = buffer;
1866 /*******************************************************************
1867 return the length of a UNISTR string.
1868 ********************************************************************/
1870 uint32 str_len_uni(UNISTR *source)
1874 if (!source->buffer)
1877 while (source->buffer[i])