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.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 /****************************************************************************
26 A temporary TALLOC context for things like unistrs, that is valid for
27 the life of a complete RPC call.
28 ****************************************************************************/
30 static TALLOC_CTX *current_rpc_talloc = NULL;
32 TALLOC_CTX *get_current_rpc_talloc(void)
34 return current_rpc_talloc;
37 void set_current_rpc_talloc( TALLOC_CTX *ctx)
39 current_rpc_talloc = ctx;
42 static TALLOC_CTX *main_loop_talloc = NULL;
44 /*******************************************************************
45 free up temporary memory - called from the main loop
46 ********************************************************************/
48 void main_loop_talloc_free(void)
50 if (!main_loop_talloc)
52 talloc_destroy(main_loop_talloc);
53 main_loop_talloc = NULL;
56 /*******************************************************************
57 Get a talloc context that is freed in the main loop...
58 ********************************************************************/
60 TALLOC_CTX *main_loop_talloc_get(void)
62 if (!main_loop_talloc) {
63 main_loop_talloc = talloc_init_named("main loop talloc (mainly parse_misc)");
64 if (!main_loop_talloc)
65 smb_panic("main_loop_talloc: malloc fail\n");
68 return main_loop_talloc;
71 /*******************************************************************
72 Try and get a talloc context. Get the rpc one if possible, else
73 get the main loop one. The main loop one is more dangerous as it
74 goes away between packets, the rpc one will stay around for as long
75 as a current RPC lasts.
76 ********************************************************************/
78 TALLOC_CTX *get_talloc_ctx(void)
80 TALLOC_CTX *tc = get_current_rpc_talloc();
84 return main_loop_talloc_get();
87 /*******************************************************************
88 Reads or writes a UTIME type.
89 ********************************************************************/
91 static BOOL smb_io_utime(char *desc, UTIME *t, prs_struct *ps, int depth)
96 prs_debug(ps, depth, desc, "smb_io_utime");
102 if(!prs_uint32 ("time", ps, depth, &t->time))
108 /*******************************************************************
109 Reads or writes an NTTIME structure.
110 ********************************************************************/
112 BOOL smb_io_time(char *desc, NTTIME *nttime, prs_struct *ps, int depth)
117 prs_debug(ps, depth, desc, "smb_io_time");
123 if(!prs_uint32("low ", ps, depth, &nttime->low)) /* low part */
125 if(!prs_uint32("high", ps, depth, &nttime->high)) /* high part */
131 /*******************************************************************
132 Reads or writes a LOOKUP_LEVEL structure.
133 ********************************************************************/
135 BOOL smb_io_lookup_level(char *desc, LOOKUP_LEVEL *level, prs_struct *ps, int depth)
140 prs_debug(ps, depth, desc, "smb_io_lookup_level");
145 if(!prs_uint16("value", ps, depth, &level->value))
153 /*******************************************************************
154 Gets an enumeration handle from an ENUM_HND structure.
155 ********************************************************************/
157 uint32 get_enum_hnd(ENUM_HND *enh)
159 return (enh && enh->ptr_hnd != 0) ? enh->handle : 0;
162 /*******************************************************************
163 Inits an ENUM_HND structure.
164 ********************************************************************/
166 void init_enum_hnd(ENUM_HND *enh, uint32 hnd)
168 DEBUG(5,("smb_io_enum_hnd\n"));
170 enh->ptr_hnd = (hnd != 0) ? 1 : 0;
174 /*******************************************************************
175 Reads or writes an ENUM_HND structure.
176 ********************************************************************/
178 BOOL smb_io_enum_hnd(char *desc, ENUM_HND *hnd, prs_struct *ps, int depth)
183 prs_debug(ps, depth, desc, "smb_io_enum_hnd");
189 if(!prs_uint32("ptr_hnd", ps, depth, &hnd->ptr_hnd)) /* pointer */
192 if (hnd->ptr_hnd != 0) {
193 if(!prs_uint32("handle ", ps, depth, &hnd->handle )) /* enum handle */
200 /*******************************************************************
201 Reads or writes a DOM_SID structure.
202 ********************************************************************/
204 BOOL smb_io_dom_sid(char *desc, DOM_SID *sid, prs_struct *ps, int depth)
211 prs_debug(ps, depth, desc, "smb_io_dom_sid");
217 if(!prs_uint8 ("sid_rev_num", ps, depth, &sid->sid_rev_num))
219 if(!prs_uint8 ("num_auths ", ps, depth, &sid->num_auths))
222 for (i = 0; i < 6; i++)
225 slprintf(tmp, sizeof(tmp) - 1, "id_auth[%d] ", i);
226 if(!prs_uint8 (tmp, ps, depth, &sid->id_auth[i]))
230 /* oops! XXXX should really issue a warning here... */
231 if (sid->num_auths > MAXSUBAUTHS)
232 sid->num_auths = MAXSUBAUTHS;
234 if(!prs_uint32s(False, "sub_auths ", ps, depth, sid->sub_auths, sid->num_auths))
240 /*******************************************************************
241 Inits a DOM_SID structure.
243 BIG NOTE: this function only does SIDS where the identauth is not >= 2^32
244 identauth >= 2^32 can be detected because it will be specified in hex
245 ********************************************************************/
247 void init_dom_sid(DOM_SID *sid, char *str_sid)
255 DEBUG(4,("netlogon domain SID: none\n"));
256 sid->sid_rev_num = 0;
261 pstrcpy(domsid, str_sid);
263 DEBUG(4,("init_dom_sid %d SID: %s\n", __LINE__, domsid));
265 /* assume, but should check, that domsid starts "S-" */
266 p = strtok(domsid+2,"-");
267 sid->sid_rev_num = atoi(p);
269 /* identauth in decimal should be < 2^32 */
270 /* identauth in hex should be >= 2^32 */
271 identauth = atoi(strtok(0,"-"));
273 DEBUG(4,("netlogon rev %d\n", sid->sid_rev_num));
274 DEBUG(4,("netlogon %s ia %d\n", p, identauth));
278 sid->id_auth[2] = (identauth & 0xff000000) >> 24;
279 sid->id_auth[3] = (identauth & 0x00ff0000) >> 16;
280 sid->id_auth[4] = (identauth & 0x0000ff00) >> 8;
281 sid->id_auth[5] = (identauth & 0x000000ff);
285 while ((p = strtok(0, "-")) != NULL && sid->num_auths < MAXSUBAUTHS)
286 sid->sub_auths[sid->num_auths++] = atoi(p);
288 DEBUG(4,("init_dom_sid: %d SID: %s\n", __LINE__, domsid));
291 /*******************************************************************
292 Inits a DOM_SID2 structure.
293 ********************************************************************/
295 void init_dom_sid2(DOM_SID2 *sid2, const DOM_SID *sid)
298 sid2->num_auths = sid2->sid.num_auths;
301 /*******************************************************************
302 Reads or writes a DOM_SID2 structure.
303 ********************************************************************/
305 BOOL smb_io_dom_sid2(char *desc, DOM_SID2 *sid, prs_struct *ps, int depth)
310 prs_debug(ps, depth, desc, "smb_io_dom_sid2");
316 if(!prs_uint32("num_auths", ps, depth, &sid->num_auths))
319 if(!smb_io_dom_sid("sid", &sid->sid, ps, depth))
325 /*******************************************************************
326 creates a STRHDR structure.
327 ********************************************************************/
329 void init_str_hdr(STRHDR *hdr, int max_len, int len, uint32 buffer)
331 hdr->str_max_len = max_len;
332 hdr->str_str_len = len;
333 hdr->buffer = buffer;
336 /*******************************************************************
337 Reads or writes a STRHDR structure.
338 ********************************************************************/
340 BOOL smb_io_strhdr(char *desc, STRHDR *hdr, prs_struct *ps, int depth)
345 prs_debug(ps, depth, desc, "smb_io_strhdr");
350 if(!prs_uint16("str_str_len", ps, depth, &hdr->str_str_len))
352 if(!prs_uint16("str_max_len", ps, depth, &hdr->str_max_len))
354 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
360 /*******************************************************************
361 Inits a UNIHDR structure.
362 ********************************************************************/
364 void init_uni_hdr(UNIHDR *hdr, int len)
366 hdr->uni_str_len = 2 * len;
367 hdr->uni_max_len = 2 * len;
368 hdr->buffer = len != 0 ? 1 : 0;
371 /*******************************************************************
372 Reads or writes a UNIHDR structure.
373 ********************************************************************/
375 BOOL smb_io_unihdr(char *desc, UNIHDR *hdr, prs_struct *ps, int depth)
380 prs_debug(ps, depth, desc, "smb_io_unihdr");
386 if(!prs_uint16("uni_str_len", ps, depth, &hdr->uni_str_len))
388 if(!prs_uint16("uni_max_len", ps, depth, &hdr->uni_max_len))
390 if(!prs_uint32("buffer ", ps, depth, &hdr->buffer))
396 /*******************************************************************
397 Inits a BUFHDR structure.
398 ********************************************************************/
400 void init_buf_hdr(BUFHDR *hdr, int max_len, int len)
402 hdr->buf_max_len = max_len;
406 /*******************************************************************
407 prs_uint16 wrapper. Call this and it sets up a pointer to where the
408 uint16 should be stored, or gets the size if reading.
409 ********************************************************************/
411 BOOL smb_io_hdrbuf_pre(char *desc, BUFHDR *hdr, prs_struct *ps, int depth, uint32 *offset)
413 (*offset) = prs_offset(ps);
418 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
425 if(!prs_set_offset(ps, prs_offset(ps) + (sizeof(uint32) * 2)))
432 /*******************************************************************
433 smb_io_hdrbuf wrapper. Call this and it retrospectively stores the size.
434 Does nothing on reading, as that is already handled by ...._pre()
435 ********************************************************************/
437 BOOL smb_io_hdrbuf_post(char *desc, BUFHDR *hdr, prs_struct *ps, int depth,
438 uint32 ptr_hdrbuf, uint32 max_len, uint32 len)
441 /* writing: go back and do a retrospective job. i hate this */
443 uint32 old_offset = prs_offset(ps);
445 init_buf_hdr(hdr, max_len, len);
446 if(!prs_set_offset(ps, ptr_hdrbuf))
448 if(!smb_io_hdrbuf(desc, hdr, ps, depth))
451 if(!prs_set_offset(ps, old_offset))
458 /*******************************************************************
459 Reads or writes a BUFHDR structure.
460 ********************************************************************/
462 BOOL smb_io_hdrbuf(char *desc, BUFHDR *hdr, prs_struct *ps, int depth)
467 prs_debug(ps, depth, desc, "smb_io_hdrbuf");
473 if(!prs_uint32("buf_max_len", ps, depth, &hdr->buf_max_len))
475 if(!prs_uint32("buf_len ", ps, depth, &hdr->buf_len))
481 /*******************************************************************
482 creates a UNIHDR2 structure.
483 ********************************************************************/
485 void init_uni_hdr2(UNIHDR2 *hdr, int len)
487 init_uni_hdr(&hdr->unihdr, len);
488 hdr->buffer = (len > 0) ? 1 : 0;
491 /*******************************************************************
492 Reads or writes a UNIHDR2 structure.
493 ********************************************************************/
495 BOOL smb_io_unihdr2(char *desc, UNIHDR2 *hdr2, prs_struct *ps, int depth)
500 prs_debug(ps, depth, desc, "smb_io_unihdr2");
506 if(!smb_io_unihdr("hdr", &hdr2->unihdr, ps, depth))
508 if(!prs_uint32("buffer", ps, depth, &hdr2->buffer))
514 /*******************************************************************
515 Inits a UNISTR structure.
516 ********************************************************************/
518 void init_unistr(UNISTR *str, const char *buf)
528 len = strlen(buf) + 1;
530 if (len < MAX_UNISTRLEN)
532 len *= sizeof(uint16);
534 str->buffer = (uint16 *)talloc_zero(get_talloc_ctx(), len);
535 if (str->buffer == NULL)
536 smb_panic("init_unistr: malloc fail\n");
538 rpcstr_push(str->buffer, buf, len, STR_TERMINATE);
541 /*******************************************************************
542 reads or writes a UNISTR structure.
543 XXXX NOTE: UNISTR structures NEED to be null-terminated.
544 ********************************************************************/
546 BOOL smb_io_unistr(char *desc, UNISTR *uni, prs_struct *ps, int depth)
551 prs_debug(ps, depth, desc, "smb_io_unistr");
556 if(!prs_unistr("unistr", ps, depth, uni))
562 /*******************************************************************
563 Allocate the BUFFER3 memory.
564 ********************************************************************/
566 static void create_buffer3(BUFFER3 *str, size_t len)
568 if (len < MAX_BUFFERLEN)
571 str->buffer = talloc_zero(get_talloc_ctx(), len);
572 if (str->buffer == NULL)
573 smb_panic("create_buffer3: talloc fail\n");
577 /*******************************************************************
578 Inits a BUFFER3 structure from a uint32
579 ********************************************************************/
581 void init_buffer3_uint32(BUFFER3 *str, uint32 val)
585 /* set up string lengths. */
586 str->buf_max_len = sizeof(uint32);
587 str->buf_len = sizeof(uint32);
589 create_buffer3(str, sizeof(uint32));
590 SIVAL(str->buffer, 0, val);
593 /*******************************************************************
594 Inits a BUFFER3 structure.
595 ********************************************************************/
597 void init_buffer3_str(BUFFER3 *str, char *buf, int len)
601 /* set up string lengths. */
602 str->buf_max_len = len * 2;
603 str->buf_len = len * 2;
605 create_buffer3(str, str->buf_max_len);
607 rpcstr_push(str->buffer, buf, str->buf_max_len, STR_TERMINATE);
611 /*******************************************************************
612 Inits a BUFFER3 structure from a hex string.
613 ********************************************************************/
615 void init_buffer3_hex(BUFFER3 *str, char *buf)
618 create_buffer3(str, strlen(buf));
619 str->buf_max_len = str->buf_len = strhex_to_str((char *)str->buffer, sizeof(str->buffer), buf);
622 /*******************************************************************
623 Inits a BUFFER3 structure.
624 ********************************************************************/
626 void init_buffer3_bytes(BUFFER3 *str, uint8 *buf, int len)
630 /* max buffer size (allocated size) */
631 str->buf_max_len = len;
633 create_buffer3(str, len);
634 memcpy(str->buffer, buf, len);
636 str->buf_len = buf != NULL ? len : 0;
639 /*******************************************************************
640 Reads or writes a BUFFER3 structure.
641 the uni_max_len member tells you how large the buffer is.
642 the uni_str_len member tells you how much of the buffer is really used.
643 ********************************************************************/
645 BOOL smb_io_buffer3(char *desc, BUFFER3 *buf3, prs_struct *ps, int depth)
650 prs_debug(ps, depth, desc, "smb_io_buffer3");
656 if(!prs_uint32("uni_max_len", ps, depth, &buf3->buf_max_len))
659 if (UNMARSHALLING(ps)) {
660 buf3->buffer = (unsigned char *)prs_alloc_mem(ps, buf3->buf_max_len);
661 if (buf3->buffer == NULL)
665 if(!prs_uint8s(True, "buffer ", ps, depth, buf3->buffer, buf3->buf_max_len))
668 if(!prs_uint32("buf_len ", ps, depth, &buf3->buf_len))
674 /*******************************************************************
675 reads or writes a BUFFER5 structure.
676 the buf_len member tells you how large the buffer is.
677 ********************************************************************/
678 BOOL smb_io_buffer5(char *desc, BUFFER5 *buf5, prs_struct *ps, int depth)
680 prs_debug(ps, depth, desc, "smb_io_buffer5");
683 if (buf5 == NULL) return False;
687 if(!prs_uint32("buf_len", ps, depth, &buf5->buf_len))
691 if(!prs_buffer5(True, "buffer" , ps, depth, buf5))
697 /*******************************************************************
698 Inits a BUFFER2 structure.
699 ********************************************************************/
701 void init_buffer2(BUFFER2 *str, uint8 *buf, int len)
705 /* max buffer size (allocated size) */
706 str->buf_max_len = len;
708 str->buf_len = buf != NULL ? len : 0;
711 if (len < MAX_BUFFERLEN)
713 str->buffer = talloc_zero(get_talloc_ctx(), len);
714 if (str->buffer == NULL)
715 smb_panic("init_buffer2: talloc fail\n");
716 memcpy(str->buffer, buf, MIN(str->buf_len, len));
720 /*******************************************************************
721 Reads or writes a BUFFER2 structure.
722 the uni_max_len member tells you how large the buffer is.
723 the uni_str_len member tells you how much of the buffer is really used.
724 ********************************************************************/
726 BOOL smb_io_buffer2(char *desc, BUFFER2 *buf2, uint32 buffer, prs_struct *ps, int depth)
733 prs_debug(ps, depth, desc, "smb_io_buffer2");
739 if(!prs_uint32("uni_max_len", ps, depth, &buf2->buf_max_len))
741 if(!prs_uint32("undoc ", ps, depth, &buf2->undoc))
743 if(!prs_uint32("buf_len ", ps, depth, &buf2->buf_len))
746 /* buffer advanced by indicated length of string
747 NOT by searching for null-termination */
749 if(!prs_buffer2(True, "buffer ", ps, depth, buf2))
754 prs_debug(ps, depth, desc, "smb_io_buffer2 - NULL");
756 memset((char *)buf2, '\0', sizeof(*buf2));
762 /*******************************************************************
763 creates a UNISTR2 structure: sets up the buffer, too
764 ********************************************************************/
766 void init_buf_unistr2(UNISTR2 *str, uint32 *ptr, const char *buf)
771 init_unistr2(str, buf, strlen(buf)+1);
776 init_unistr2(str, "", 0);
781 /*******************************************************************
782 Copies a UNISTR2 structure.
783 ********************************************************************/
785 void copy_unistr2(UNISTR2 *str, const UNISTR2 *from)
788 /* set up string lengths. add one if string is not null-terminated */
789 str->uni_max_len = from->uni_max_len;
790 str->undoc = from->undoc;
791 str->uni_str_len = from->uni_str_len;
793 if (from->buffer == NULL)
796 /* the string buffer is allocated to the maximum size
797 (the the length of the source string) to prevent
798 reallocation of memory. */
799 if (str->buffer == NULL) {
800 size_t len = from->uni_max_len * sizeof(uint16);
802 if (len < MAX_UNISTRLEN)
804 len *= sizeof(uint16);
806 str->buffer = (uint16 *)talloc_zero(get_talloc_ctx(), len);
807 if ((str->buffer == NULL) && (len > 0 ))
809 smb_panic("copy_unistr2: talloc fail\n");
814 /* copy the string */
815 memcpy(str->buffer, from->buffer, from->uni_max_len*sizeof(uint16));
818 /*******************************************************************
819 Creates a STRING2 structure.
820 ********************************************************************/
822 void init_string2(STRING2 *str, const char *buf, int max_len, int str_len)
826 /* set up string lengths. */
827 str->str_max_len = max_len;
829 str->str_str_len = str_len;
831 /* store the string */
833 if (str_len < MAX_STRINGLEN)
834 alloc_len = MAX_STRINGLEN;
835 str->buffer = talloc_zero(get_talloc_ctx(), alloc_len);
836 if (str->buffer == NULL)
837 smb_panic("init_string2: malloc fail\n");
838 memcpy(str->buffer, buf, str_len);
842 /*******************************************************************
843 Reads or writes a STRING2 structure.
844 XXXX NOTE: STRING2 structures need NOT be null-terminated.
845 the str_str_len member tells you how long the string is;
846 the str_max_len member tells you how large the buffer is.
847 ********************************************************************/
849 BOOL smb_io_string2(char *desc, STRING2 *str2, uint32 buffer, prs_struct *ps, int depth)
856 prs_debug(ps, depth, desc, "smb_io_string2");
862 if(!prs_uint32("str_max_len", ps, depth, &str2->str_max_len))
864 if(!prs_uint32("undoc ", ps, depth, &str2->undoc))
866 if(!prs_uint32("str_str_len", ps, depth, &str2->str_str_len))
869 /* buffer advanced by indicated length of string
870 NOT by searching for null-termination */
871 if(!prs_string2(True, "buffer ", ps, depth, str2))
876 prs_debug(ps, depth, desc, "smb_io_string2 - NULL");
878 memset((char *)str2, '\0', sizeof(*str2));
885 /*******************************************************************
886 Inits a UNISTR2 structure.
887 ********************************************************************/
889 void init_unistr2(UNISTR2 *str, const char *buf, size_t len)
893 /* set up string lengths. */
894 str->uni_max_len = (uint32)len;
896 str->uni_str_len = (uint32)len;
898 if (len < MAX_UNISTRLEN)
900 len *= sizeof(uint16);
902 str->buffer = (uint16 *)talloc_zero(get_talloc_ctx(), len);
903 if ((str->buffer == NULL) && (len > 0))
905 smb_panic("init_unistr2: malloc fail\n");
910 * don't move this test above ! The UNISTR2 must be initialized !!!
916 rpcstr_push((char *)str->buffer, buf, len, STR_TERMINATE);
919 /*******************************************************************
920 Inits a UNISTR2 structure from a UNISTR
921 ********************************************************************/
922 void init_unistr2_from_unistr (UNISTR2 *to, UNISTR *from)
927 /* the destination UNISTR2 should never be NULL.
928 if it is it is a programming error */
930 /* if the source UNISTR is NULL, then zero out
931 the destination string and return */
933 if ((from == NULL) || (from->buffer == NULL))
936 /* get the length; UNISTR must be NULL terminated */
938 while ((from->buffer)[i]!='\0')
940 i++; /* one more to catch the terminating NULL */
941 /* is this necessary -- jerry? I need to think */
943 /* set up string lengths; uni_max_len is set to i+1
944 because we need to account for the final NULL termination */
949 /* allocate the space and copy the string buffer */
950 to->buffer = (uint16 *)talloc_zero(get_talloc_ctx(), sizeof(uint16)*(to->uni_str_len));
951 if (to->buffer == NULL)
952 smb_panic("init_unistr2_from_unistr: malloc fail\n");
953 memcpy(to->buffer, from->buffer, to->uni_max_len*sizeof(uint16));
959 /*******************************************************************
960 Reads or writes a UNISTR2 structure.
961 XXXX NOTE: UNISTR2 structures need NOT be null-terminated.
962 the uni_str_len member tells you how long the string is;
963 the uni_max_len member tells you how large the buffer is.
964 ********************************************************************/
966 BOOL smb_io_unistr2(char *desc, UNISTR2 *uni2, uint32 buffer, prs_struct *ps, int depth)
973 prs_debug(ps, depth, desc, "smb_io_unistr2");
979 if(!prs_uint32("uni_max_len", ps, depth, &uni2->uni_max_len))
981 if(!prs_uint32("undoc ", ps, depth, &uni2->undoc))
983 if(!prs_uint32("uni_str_len", ps, depth, &uni2->uni_str_len))
986 /* buffer advanced by indicated length of string
987 NOT by searching for null-termination */
988 if(!prs_unistr2(True, "buffer ", ps, depth, uni2))
993 prs_debug(ps, depth, desc, "smb_io_unistr2 - NULL");
995 memset((char *)uni2, '\0', sizeof(*uni2));
1002 /*******************************************************************
1003 Inits a DOM_RID2 structure.
1004 ********************************************************************/
1006 void init_dom_rid2(DOM_RID2 *rid2, uint32 rid, uint8 type, uint32 idx)
1010 rid2->rid_idx = idx;
1013 /*******************************************************************
1014 Reads or writes a DOM_RID2 structure.
1015 ********************************************************************/
1017 BOOL smb_io_dom_rid2(char *desc, DOM_RID2 *rid2, prs_struct *ps, int depth)
1022 prs_debug(ps, depth, desc, "smb_io_dom_rid2");
1028 if(!prs_uint8("type ", ps, depth, &rid2->type))
1032 if(!prs_uint32("rid ", ps, depth, &rid2->rid))
1034 if(!prs_uint32("rid_idx", ps, depth, &rid2->rid_idx))
1040 /*******************************************************************
1041 creates a DOM_RID3 structure.
1042 ********************************************************************/
1044 void init_dom_rid3(DOM_RID3 *rid3, uint32 rid, uint8 type)
1048 rid3->ptr_type = 0x1; /* non-zero, basically. */
1053 /*******************************************************************
1054 reads or writes a DOM_RID3 structure.
1055 ********************************************************************/
1057 BOOL smb_io_dom_rid3(char *desc, DOM_RID3 *rid3, prs_struct *ps, int depth)
1062 prs_debug(ps, depth, desc, "smb_io_dom_rid3");
1068 if(!prs_uint32("rid ", ps, depth, &rid3->rid))
1070 if(!prs_uint32("type1 ", ps, depth, &rid3->type1))
1072 if(!prs_uint32("ptr_type", ps, depth, &rid3->ptr_type))
1074 if(!prs_uint32("type2 ", ps, depth, &rid3->type2))
1076 if(!prs_uint32("unk ", ps, depth, &rid3->unk))
1082 /*******************************************************************
1083 Inits a DOM_RID4 structure.
1084 ********************************************************************/
1086 void init_dom_rid4(DOM_RID4 *rid4, uint16 unknown, uint16 attr, uint32 rid)
1088 rid4->unknown = unknown;
1093 /*******************************************************************
1094 Inits a DOM_CLNT_SRV structure.
1095 ********************************************************************/
1097 static void init_clnt_srv(DOM_CLNT_SRV *log, char *logon_srv, char *comp_name)
1099 DEBUG(5,("init_clnt_srv: %d\n", __LINE__));
1101 if (logon_srv != NULL) {
1102 log->undoc_buffer = 1;
1103 init_unistr2(&log->uni_logon_srv, logon_srv, strlen(logon_srv)+1);
1105 log->undoc_buffer = 0;
1108 if (comp_name != NULL) {
1109 log->undoc_buffer2 = 1;
1110 init_unistr2(&log->uni_comp_name, comp_name, strlen(comp_name)+1);
1112 log->undoc_buffer2 = 0;
1116 /*******************************************************************
1117 Inits or writes a DOM_CLNT_SRV structure.
1118 ********************************************************************/
1120 static BOOL smb_io_clnt_srv(char *desc, DOM_CLNT_SRV *log, prs_struct *ps, int depth)
1125 prs_debug(ps, depth, desc, "smb_io_clnt_srv");
1131 if(!prs_uint32("undoc_buffer ", ps, depth, &log->undoc_buffer))
1134 if (log->undoc_buffer != 0) {
1135 if(!smb_io_unistr2("unistr2", &log->uni_logon_srv, log->undoc_buffer, ps, depth))
1142 if(!prs_uint32("undoc_buffer2", ps, depth, &log->undoc_buffer2))
1145 if (log->undoc_buffer2 != 0) {
1146 if(!smb_io_unistr2("unistr2", &log->uni_comp_name, log->undoc_buffer2, ps, depth))
1153 /*******************************************************************
1154 Inits a DOM_LOG_INFO structure.
1155 ********************************************************************/
1157 void init_log_info(DOM_LOG_INFO *log, const char *logon_srv, const char *acct_name,
1158 uint16 sec_chan, const char *comp_name)
1160 DEBUG(5,("make_log_info %d\n", __LINE__));
1162 log->undoc_buffer = 1;
1164 init_unistr2(&log->uni_logon_srv, logon_srv, strlen(logon_srv)+1);
1165 init_unistr2(&log->uni_acct_name, acct_name, strlen(acct_name)+1);
1167 log->sec_chan = sec_chan;
1169 init_unistr2(&log->uni_comp_name, comp_name, strlen(comp_name)+1);
1172 /*******************************************************************
1173 Reads or writes a DOM_LOG_INFO structure.
1174 ********************************************************************/
1176 BOOL smb_io_log_info(char *desc, DOM_LOG_INFO *log, prs_struct *ps, int depth)
1181 prs_debug(ps, depth, desc, "smb_io_log_info");
1187 if(!prs_uint32("undoc_buffer", ps, depth, &log->undoc_buffer))
1190 if(!smb_io_unistr2("unistr2", &log->uni_logon_srv, True, ps, depth))
1192 if(!smb_io_unistr2("unistr2", &log->uni_acct_name, True, ps, depth))
1195 if(!prs_uint16("sec_chan", ps, depth, &log->sec_chan))
1198 if(!smb_io_unistr2("unistr2", &log->uni_comp_name, True, ps, depth))
1204 /*******************************************************************
1205 Reads or writes a DOM_CHAL structure.
1206 ********************************************************************/
1208 BOOL smb_io_chal(char *desc, DOM_CHAL *chal, prs_struct *ps, int depth)
1213 prs_debug(ps, depth, desc, "smb_io_chal");
1219 if(!prs_uint8s (False, "data", ps, depth, chal->data, 8))
1225 /*******************************************************************
1226 Reads or writes a DOM_CRED structure.
1227 ********************************************************************/
1229 BOOL smb_io_cred(char *desc, DOM_CRED *cred, prs_struct *ps, int depth)
1234 prs_debug(ps, depth, desc, "smb_io_cred");
1240 if(!smb_io_chal ("", &cred->challenge, ps, depth))
1243 if(!smb_io_utime("", &cred->timestamp, ps, depth))
1249 /*******************************************************************
1250 Inits a DOM_CLNT_INFO2 structure.
1251 ********************************************************************/
1253 void init_clnt_info2(DOM_CLNT_INFO2 *clnt,
1254 char *logon_srv, char *comp_name,
1255 DOM_CRED *clnt_cred)
1257 DEBUG(5,("make_clnt_info: %d\n", __LINE__));
1259 init_clnt_srv(&(clnt->login), logon_srv, comp_name);
1261 if (clnt_cred != NULL) {
1263 memcpy(&(clnt->cred), clnt_cred, sizeof(clnt->cred));
1269 /*******************************************************************
1270 Reads or writes a DOM_CLNT_INFO2 structure.
1271 ********************************************************************/
1273 BOOL smb_io_clnt_info2(char *desc, DOM_CLNT_INFO2 *clnt, prs_struct *ps, int depth)
1278 prs_debug(ps, depth, desc, "smb_io_clnt_info2");
1284 if(!smb_io_clnt_srv("", &clnt->login, ps, depth))
1290 if(!prs_uint32("ptr_cred", ps, depth, &clnt->ptr_cred))
1292 if(!smb_io_cred("", &clnt->cred, ps, depth))
1298 /*******************************************************************
1299 Inits a DOM_CLNT_INFO structure.
1300 ********************************************************************/
1302 void init_clnt_info(DOM_CLNT_INFO *clnt,
1303 char *logon_srv, char *acct_name,
1304 uint16 sec_chan, char *comp_name,
1307 DEBUG(5,("make_clnt_info\n"));
1309 init_log_info(&clnt->login, logon_srv, acct_name, sec_chan, comp_name);
1310 memcpy(&clnt->cred, cred, sizeof(clnt->cred));
1313 /*******************************************************************
1314 Reads or writes a DOM_CLNT_INFO structure.
1315 ********************************************************************/
1317 BOOL smb_io_clnt_info(char *desc, DOM_CLNT_INFO *clnt, prs_struct *ps, int depth)
1322 prs_debug(ps, depth, desc, "smb_io_clnt_info");
1328 if(!smb_io_log_info("", &clnt->login, ps, depth))
1330 if(!smb_io_cred("", &clnt->cred, ps, depth))
1336 /*******************************************************************
1337 Inits a DOM_LOGON_ID structure.
1338 ********************************************************************/
1340 void init_logon_id(DOM_LOGON_ID *log, uint32 log_id_low, uint32 log_id_high)
1342 DEBUG(5,("make_logon_id: %d\n", __LINE__));
1344 log->low = log_id_low;
1345 log->high = log_id_high;
1348 /*******************************************************************
1349 Reads or writes a DOM_LOGON_ID structure.
1350 ********************************************************************/
1352 BOOL smb_io_logon_id(char *desc, DOM_LOGON_ID *log, prs_struct *ps, int depth)
1357 prs_debug(ps, depth, desc, "smb_io_logon_id");
1363 if(!prs_uint32("low ", ps, depth, &log->low ))
1365 if(!prs_uint32("high", ps, depth, &log->high))
1371 /*******************************************************************
1372 Inits an OWF_INFO structure.
1373 ********************************************************************/
1375 void init_owf_info(OWF_INFO *hash, uint8 data[16])
1377 DEBUG(5,("init_owf_info: %d\n", __LINE__));
1380 memcpy(hash->data, data, sizeof(hash->data));
1382 memset((char *)hash->data, '\0', sizeof(hash->data));
1385 /*******************************************************************
1386 Reads or writes an OWF_INFO structure.
1387 ********************************************************************/
1389 BOOL smb_io_owf_info(char *desc, OWF_INFO *hash, prs_struct *ps, int depth)
1394 prs_debug(ps, depth, desc, "smb_io_owf_info");
1400 if(!prs_uint8s (False, "data", ps, depth, hash->data, 16))
1406 /*******************************************************************
1407 Reads or writes a DOM_GID structure.
1408 ********************************************************************/
1410 BOOL smb_io_gid(char *desc, DOM_GID *gid, prs_struct *ps, int depth)
1415 prs_debug(ps, depth, desc, "smb_io_gid");
1421 if(!prs_uint32("g_rid", ps, depth, &gid->g_rid))
1423 if(!prs_uint32("attr ", ps, depth, &gid->attr))
1429 /*******************************************************************
1430 Reads or writes an POLICY_HND structure.
1431 ********************************************************************/
1433 BOOL smb_io_pol_hnd(char *desc, POLICY_HND *pol, prs_struct *ps, int depth)
1438 prs_debug(ps, depth, desc, "smb_io_pol_hnd");
1444 if(UNMARSHALLING(ps))
1447 if (!prs_uint32("data1", ps, depth, &pol->data1))
1449 if (!prs_uint32("data2", ps, depth, &pol->data2))
1451 if (!prs_uint16("data3", ps, depth, &pol->data3))
1453 if (!prs_uint16("data4", ps, depth, &pol->data4))
1455 if(!prs_uint8s (False, "data5", ps, depth, pol->data5, sizeof(pol->data5)))
1461 /*******************************************************************
1463 ********************************************************************/
1465 void init_unistr3(UNISTR3 *str, const char *buf)
1471 str->str.buffer = NULL;
1475 len = strlen(buf) + 1;
1477 str->uni_str_len=len;
1479 if (len < MAX_UNISTRLEN)
1480 len = MAX_UNISTRLEN;
1482 len *= sizeof(uint16);
1484 str->str.buffer = (uint16 *)talloc_zero(get_talloc_ctx(), len);
1485 if (str->str.buffer == NULL)
1486 smb_panic("init_unistr3: malloc fail\n");
1488 rpcstr_push((char *)str->str.buffer, buf, len, STR_TERMINATE);
1491 /*******************************************************************
1492 Reads or writes a UNISTR3 structure.
1493 ********************************************************************/
1495 BOOL smb_io_unistr3(char *desc, UNISTR3 *name, prs_struct *ps, int depth)
1500 prs_debug(ps, depth, desc, "smb_io_unistr3");
1506 if(!prs_uint32("uni_str_len", ps, depth, &name->uni_str_len))
1509 /* don't know if len is specified by uni_str_len member... */
1510 /* assume unicode string is unicode-null-terminated, instead */
1512 if(!prs_unistr3(True, "unistr", name, ps, depth))
1519 /*******************************************************************
1520 Stream a uint64_struct
1521 ********************************************************************/
1522 BOOL prs_uint64(char *name, prs_struct *ps, int depth, UINT64_S *data64)
1524 return prs_uint32(name, ps, depth+1, &data64->low) &&
1525 prs_uint32(name, ps, depth+1, &data64->high);
1528 /*******************************************************************
1529 reads or writes a BUFHDR2 structure.
1530 ********************************************************************/
1531 BOOL smb_io_bufhdr2(char *desc, BUFHDR2 *hdr, prs_struct *ps, int depth)
1533 prs_debug(ps, depth, desc, "smb_io_bufhdr2");
1537 prs_uint32("info_level", ps, depth, &(hdr->info_level));
1538 prs_uint32("length ", ps, depth, &(hdr->length ));
1539 prs_uint32("buffer ", ps, depth, &(hdr->buffer ));
1544 /*******************************************************************
1545 reads or writes a BUFFER4 structure.
1546 ********************************************************************/
1547 BOOL smb_io_buffer4(char *desc, BUFFER4 *buf4, uint32 buffer, prs_struct *ps, int depth)
1549 prs_debug(ps, depth, desc, "smb_io_buffer4");
1553 prs_uint32("buf_len", ps, depth, &(buf4->buf_len));
1555 if (buf4->buf_len > MAX_BUFFERLEN)
1557 buf4->buf_len = MAX_BUFFERLEN;
1560 prs_uint8s(True, "buffer", ps, depth, buf4->buffer, buf4->buf_len);
1565 /*******************************************************************
1566 creates a UNIHDR structure.
1567 ********************************************************************/
1569 BOOL make_uni_hdr(UNIHDR *hdr, int len)
1575 hdr->uni_str_len = 2 * len;
1576 hdr->uni_max_len = 2 * len;
1577 hdr->buffer = len != 0 ? 1 : 0;
1582 /*******************************************************************
1583 creates a BUFHDR2 structure.
1584 ********************************************************************/
1585 BOOL make_bufhdr2(BUFHDR2 *hdr, uint32 info_level, uint32 length, uint32 buffer)
1587 hdr->info_level = info_level;
1588 hdr->length = length;
1589 hdr->buffer = buffer;