problem been there for months: reg_r_info not aligning after string buffer.
[samba.git] / source3 / rpc_parse / parse_reg.c
index 3365a68b3dc531193854a2cea856adc9e8c43a20..4f9a9350bd035190faa95c263a67e9e7e6971f71 100644 (file)
@@ -766,23 +766,24 @@ creates a structure.
 ********************************************************************/
 void make_reg_r_info(REG_R_INFO *r_r,
                                uint32 level, char *os_type,
-                               uint32 unknown_0, uint32 unknown_1,
                                uint32 status)
 {
-       uint8 buf[512];
-       int len = struni2((uint16*)buf, os_type);
+       char buf[512];
+       int len;
+
+       len = ascii_to_unibuf(buf, os_type, sizeof(buf)-2) - buf;
 
        r_r->ptr1 = 1;
        r_r->level = level;
 
        r_r->ptr_type = 1;
-       make_buffer2(&(r_r->uni_type), buf, len*2);
+       make_buffer2(&(r_r->uni_type), buf, len);
 
        r_r->ptr2 = 1;
-       r_r->unknown_0 = unknown_0;
+       r_r->unknown_0 = len;
 
        r_r->ptr3 = 1;
-       r_r->unknown_1 = unknown_1;
+       r_r->unknown_1 = len;
 
        r_r->status = status;
 }
@@ -807,6 +808,7 @@ void reg_io_r_info(char *desc, REG_R_INFO *r_r, prs_struct *ps, int depth)
                prs_uint32("ptr_type", ps, depth, &(r_r->ptr_type));
 
                smb_io_buffer2("uni_type", &(r_r->uni_type), r_r->ptr_type, ps, depth);
+               prs_align(ps);
 
                prs_uint32("ptr2", ps, depth, &(r_r->ptr2));
 
@@ -1179,3 +1181,66 @@ void reg_io_r_open_entry(char *desc,  REG_R_OPEN_ENTRY *r_r, prs_struct *ps, int
        prs_uint32("status", ps, depth, &(r_r->status));
 }
 
+/*******************************************************************
+makes a structure.
+********************************************************************/
+void make_reg_q_shutdown(REG_Q_SHUTDOWN *q_i,
+                               char *msg, uint32 timeout, uint16 flags)
+{
+       int len = strlen(msg) + 1;
+
+       if (q_i == NULL) return;
+
+       ZERO_STRUCTP(q_i);
+
+       q_i->ptr_0 = 1;
+       q_i->ptr_1 = 1;
+       q_i->ptr_2 = 1;
+
+       make_uni_hdr(&q_i->hdr_msg, len, len, 1);
+       make_unistr2(&(q_i->uni_msg), msg, len);
+       
+       q_i->timeout = timeout;
+       q_i->flags   = flags;
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+void reg_io_q_shutdown(char *desc,  REG_Q_SHUTDOWN *q_q, prs_struct *ps, int depth)
+{
+       if (q_q == NULL) return;
+
+       prs_debug(ps, depth, desc, "reg_io_q_shutdown");
+       depth++;
+
+       prs_align(ps);
+       
+       prs_uint32("ptr_0", ps, depth, &(q_q->ptr_0));
+       prs_uint32("ptr_1", ps, depth, &(q_q->ptr_1));
+       prs_uint32("ptr_2", ps, depth, &(q_q->ptr_2));
+       
+       smb_io_unihdr ("hdr_msg", &(q_q->hdr_msg), ps, depth);
+       smb_io_unistr2("uni_msg", &(q_q->uni_msg), q_q->hdr_msg.buffer, ps, depth);
+       prs_align(ps);
+
+       prs_uint32("timeout", ps, depth, &(q_q->timeout));
+       prs_uint16("flags  ", ps, depth, &(q_q->flags  ));
+       prs_align(ps);
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+void reg_io_r_shutdown(char *desc,  REG_R_SHUTDOWN *r_q, prs_struct *ps, int depth)
+{
+       if (r_q == NULL) return;
+
+       prs_debug(ps, depth, desc, "reg_io_r_shutdown");
+       depth++;
+
+       prs_align(ps);
+       
+       prs_uint32("status", ps, depth, &(r_q->status));
+}
+