* changed structure of REG_R_ENUM_VALUE structure since the BUFFER2
[bbaumbach/samba-autobuild/.git] / source / rpc_parse / parse_reg.c
index 23d47cf9b5982deb071d33a9722e56828ffcaf09..3987f208851984d2dc9778b5a7eb15b89903bf8e 100644 (file)
@@ -1,6 +1,5 @@
 /* 
- *  Unix SMB/Netbios implementation.
- *  Version 1.9.
+ *  Unix SMB/CIFS implementation.
  *  RPC Pipe client / server routines
  *  Copyright (C) Andrew Tridgell              1992-1997,
  *  Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-
 #include "includes.h"
 
-extern int DEBUGLEVEL;
-
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_RPC_PARSE
 
 /*******************************************************************
  Inits a structure.
@@ -91,7 +89,7 @@ BOOL reg_io_r_open_hkcr(char *desc,  REG_R_OPEN_HKCR *r_r, prs_struct *ps, int d
        if(!smb_io_pol_hnd("", &r_r->pol, ps, depth))
                return False;
 
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -131,11 +129,11 @@ BOOL reg_io_q_open_hklm(char *desc, REG_Q_OPEN_HKLM * r_q, prs_struct *ps,
        if (r_q->ptr != 0)
        {
                if (!prs_uint16("unknown_0", ps, depth, &(r_q->unknown_0)))
-               return False;
+                       return False;
                if (!prs_uint16("unknown_1", ps, depth, &(r_q->unknown_1)))
-               return False;
+                       return False;
                if (!prs_uint32("access_mask", ps, depth, &(r_q->access_mask)))
-               return False;
+                       return False;
        }
 
        return True;
@@ -157,10 +155,10 @@ BOOL reg_io_r_open_hklm(char *desc, REG_R_OPEN_HKLM * r_r, prs_struct *ps,
        if (!prs_align(ps))
                return False;
 
-       if (!smb_io_pol_hnd("", &(r_r->pol), ps, depth))
+       if (!smb_io_pol_hnd("", &r_r->pol, ps, depth))
                return False;
 
-       if (!prs_uint32("status", ps, depth, &(r_r->status)))
+       if (!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -212,7 +210,7 @@ BOOL reg_io_r_flush_key(char *desc,  REG_R_FLUSH_KEY *r_r, prs_struct *ps, int d
        if(!prs_align(ps))
                return False;
        
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -365,7 +363,7 @@ BOOL reg_io_r_create_key(char *desc,  REG_R_CREATE_KEY *r_r, prs_struct *ps, int
        if(!prs_uint32("unknown", ps, depth, &r_r->unknown))
                return False;
 
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -432,7 +430,7 @@ BOOL reg_io_r_delete_val(char *desc,  REG_R_DELETE_VALUE *r_r, prs_struct *ps, i
        if(!prs_align(ps))
                return False;
        
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -497,7 +495,7 @@ BOOL reg_io_r_delete_key(char *desc,  REG_R_DELETE_KEY *r_r, prs_struct *ps, int
        if(!prs_align(ps))
                return False;
        
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -573,7 +571,7 @@ BOOL reg_io_r_query_key(char *desc,  REG_R_QUERY_KEY *r_r, prs_struct *ps, int d
                return False;
        if(!prs_uint32("max_subkeylen ", ps, depth, &r_r->max_subkeylen))
                return False;
-       if(!prs_uint32("mak_subkeysize", ps, depth, &r_r->max_subkeysize))
+       if(!prs_uint32("reserved      ", ps, depth, &r_r->reserved))
                return False;
        if(!prs_uint32("num_values    ", ps, depth, &r_r->num_values))
                return False;
@@ -586,7 +584,7 @@ BOOL reg_io_r_query_key(char *desc,  REG_R_QUERY_KEY *r_r, prs_struct *ps, int d
        if(!smb_io_time("mod_time     ", &r_r->mod_time, ps, depth))
                return False;
        
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -596,7 +594,7 @@ BOOL reg_io_r_query_key(char *desc,  REG_R_QUERY_KEY *r_r, prs_struct *ps, int d
  Inits a structure.
 ********************************************************************/
 
-void init_reg_q_unk_1a(REG_Q_UNK_1A *q_o, POLICY_HND *hnd)
+void init_reg_q_unknown_1a(REG_Q_UNKNOWN_1A *q_o, POLICY_HND *hnd)
 {
        memcpy(&q_o->pol, hnd, sizeof(q_o->pol));
 }
@@ -605,12 +603,12 @@ void init_reg_q_unk_1a(REG_Q_UNK_1A *q_o, POLICY_HND *hnd)
 reads or writes a structure.
 ********************************************************************/
 
-BOOL reg_io_q_unk_1a(char *desc,  REG_Q_UNK_1A *r_q, prs_struct *ps, int depth)
+BOOL reg_io_q_unknown_1a(char *desc,  REG_Q_UNKNOWN_1A *r_q, prs_struct *ps, int depth)
 {
        if (r_q == NULL)
                return False;
 
-       prs_debug(ps, depth, desc, "reg_io_q_unk_1a");
+       prs_debug(ps, depth, desc, "reg_io_q_unknown_1a");
        depth++;
 
        if(!prs_align(ps))
@@ -626,12 +624,12 @@ BOOL reg_io_q_unk_1a(char *desc,  REG_Q_UNK_1A *r_q, prs_struct *ps, int depth)
 reads or writes a structure.
 ********************************************************************/
 
-BOOL reg_io_r_unk_1a(char *desc,  REG_R_UNK_1A *r_r, prs_struct *ps, int depth)
+BOOL reg_io_r_unknown_1a(char *desc,  REG_R_UNKNOWN_1A *r_r, prs_struct *ps, int depth)
 {
        if (r_r == NULL)
                return False;
 
-       prs_debug(ps, depth, desc, "reg_io_r_unk_1a");
+       prs_debug(ps, depth, desc, "reg_io_r_unknown_1a");
        depth++;
 
        if(!prs_align(ps))
@@ -639,7 +637,7 @@ BOOL reg_io_r_unk_1a(char *desc,  REG_R_UNK_1A *r_r, prs_struct *ps, int depth)
        
        if(!prs_uint32("unknown", ps, depth, &r_r->unknown))
                return False;
-       if(!prs_uint32("status" , ps, depth, &r_r->status))
+       if(!prs_ntstatus("status" , ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -650,12 +648,12 @@ BOOL reg_io_r_unk_1a(char *desc,  REG_R_UNK_1A *r_r, prs_struct *ps, int depth)
 ********************************************************************/
 
 void init_reg_q_open_hku(REG_Q_OPEN_HKU *q_o,
-                               uint16 unknown_0, uint32 level)
+                               uint16 unknown_0, uint32 access_mask)
 {
        q_o->ptr = 1;
        q_o->unknown_0 = unknown_0;
        q_o->unknown_1 = 0x0; /* random - changes */
-       q_o->level = level;
+       q_o->access_mask = access_mask;
 }
 
 /*******************************************************************
@@ -676,11 +674,11 @@ BOOL reg_io_q_open_hku(char *desc,  REG_Q_OPEN_HKU *r_q, prs_struct *ps, int dep
        if(!prs_uint32("ptr      ", ps, depth, &r_q->ptr))
                return False;
        if (r_q->ptr != 0) {
-               if(!prs_uint16("unknown_0", ps, depth, &r_q->unknown_0))
+               if(!prs_uint16("unknown_0   ", ps, depth, &r_q->unknown_0))
                        return False;
-               if(!prs_uint16("unknown_1", ps, depth, &r_q->unknown_1))
+               if(!prs_uint16("unknown_1   ", ps, depth, &r_q->unknown_1))
                        return False;
-               if(!prs_uint32("level    ", ps, depth, &r_q->level))
+               if(!prs_uint32("access_mask ", ps, depth, &r_q->access_mask))
                        return False;
        }
 
@@ -705,7 +703,7 @@ BOOL reg_io_r_open_hku(char *desc,  REG_R_OPEN_HKU *r_r, prs_struct *ps, int dep
        if(!smb_io_pol_hnd("", &r_r->pol, ps, depth))
                return False;
 
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -731,7 +729,7 @@ BOOL reg_io_q_close(char *desc,  REG_Q_CLOSE *q_u, prs_struct *ps, int depth)
        if (q_u == NULL)
                return False;
 
-       prs_debug(ps, depth, desc, "reg_io_q_unknown_1");
+       prs_debug(ps, depth, desc, "reg_io_q_close");
        depth++;
 
        if(!prs_align(ps))
@@ -754,7 +752,7 @@ BOOL reg_io_r_close(char *desc,  REG_R_CLOSE *r_u, prs_struct *ps, int depth)
        if (r_u == NULL)
                return False;
 
-       prs_debug(ps, depth, desc, "reg_io_r_unknown_1");
+       prs_debug(ps, depth, desc, "reg_io_r_close");
        depth++;
 
        if(!prs_align(ps))
@@ -765,7 +763,7 @@ BOOL reg_io_r_close(char *desc,  REG_R_CLOSE *r_u, prs_struct *ps, int depth)
        if(!prs_align(ps))
                return False;
 
-       if(!prs_uint32("status", ps, depth, &r_u->status))
+       if(!prs_ntstatus("status", ps, depth, &r_u->status))
                return False;
 
        return True;
@@ -830,7 +828,7 @@ BOOL reg_io_r_set_key_sec(char *desc, REG_R_SET_KEY_SEC *r_q, prs_struct *ps, in
        if(!prs_align(ps))
                return False;
        
-       if(!prs_uint32("status", ps, depth, &r_q->status))
+       if(!prs_ntstatus("status", ps, depth, &r_q->status))
                return False;
 
        return True;
@@ -891,7 +889,7 @@ makes a structure.
 ********************************************************************/
  void init_reg_r_get_key_sec(REG_R_GET_KEY_SEC *r_i, POLICY_HND *pol, 
                                uint32 buf_len, uint8 *buf,
-                               uint32 status)
+                               NTSTATUS status)
 {
        r_i->ptr = 1;
        init_buf_hdr(&r_i->hdr_sec, buf_len, buf_len);
@@ -928,7 +926,7 @@ BOOL reg_io_r_get_key_sec(char *desc,  REG_R_GET_KEY_SEC *r_q, prs_struct *ps, i
                        return False;
        }
 
-       if(!prs_uint32("status", ps, depth, &r_q->status))
+       if(!prs_ntstatus("status", ps, depth, &r_q->status))
                return False;
 
        return True;
@@ -1012,13 +1010,15 @@ BOOL reg_io_q_info(char *desc,  REG_Q_INFO *r_q, prs_struct *ps, int depth)
 
        if(!prs_uint32("ptr_buflen", ps, depth, &(r_q->ptr_buflen)))
                return False;
-       if(!prs_uint32("buflen", ps, depth, &(r_q->buflen)))
-               return False;
 
-       if(!prs_uint32("ptr_buflen2", ps, depth, &(r_q->ptr_buflen2)))
-               return False;
-       if(!prs_uint32("buflen2", ps, depth, &(r_q->buflen2)))
-               return False;
+       if (r_q->ptr_buflen) {
+               if(!prs_uint32("buflen", ps, depth, &(r_q->buflen)))
+                       return False;
+               if(!prs_uint32("ptr_buflen2", ps, depth, &(r_q->ptr_buflen2)))
+                       return False;
+               if(!prs_uint32("buflen2", ps, depth, &(r_q->buflen2)))
+                       return False;
+       }
 
        return True;
 }
@@ -1028,7 +1028,7 @@ BOOL reg_io_q_info(char *desc,  REG_Q_INFO *r_q, prs_struct *ps, int depth)
 ********************************************************************/
 
 BOOL init_reg_r_info(uint32 include_keyval, REG_R_INFO *r_r,
-                    BUFFER2* buf, uint32 type, uint32 status)
+                    BUFFER2* buf, uint32 type, NTSTATUS status)
 {
   if(r_r == NULL)
     return False;
@@ -1103,7 +1103,7 @@ BOOL reg_io_r_info(char *desc, REG_R_INFO *r_r, prs_struct *ps, int depth)
                        return False;
        }
 
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -1138,6 +1138,38 @@ void init_reg_q_enum_val(REG_Q_ENUM_VALUE *q_i, POLICY_HND *pol,
        q_i->len_value2 = 0;
 }
 
+/*******************************************************************
+makes a structure.
+********************************************************************/
+
+void init_reg_r_enum_val(REG_R_ENUM_VALUE *r_u, REGISTRY_VALUE *val )
+{
+       ZERO_STRUCTP(r_u);
+
+       /* value name */
+
+       init_uni_hdr( &r_u->hdr_name, strlen(val->valuename)+1 );
+       init_unistr2( &r_u->uni_name, val->valuename, strlen(val->valuename)+1 );
+               
+       /* type */
+       
+       r_u->ptr_type = 1;
+       r_u->type = val->type;
+
+       /* data */
+       
+       r_u->ptr_value = 1;
+       init_buffer2( &r_u->buf_value, val->data.void_ptr, val->size );
+       
+       /* lengths */
+
+       r_u->ptr1 = 1;
+       r_u->len_value1 = val->size;
+       
+       r_u->ptr2 = 1;
+       r_u->len_value2 = val->size;
+}
+
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
@@ -1158,6 +1190,7 @@ BOOL reg_io_q_enum_val(char *desc,  REG_Q_ENUM_VALUE *q_q, prs_struct *ps, int d
        
        if(!prs_uint32("val_index", ps, depth, &q_q->val_index))
                return False;
+               
        if(!smb_io_unihdr ("hdr_name", &q_q->hdr_name, ps, depth))
                return False;
        if(!smb_io_unistr2("uni_name", &q_q->uni_name, q_q->hdr_name.buffer, ps, depth))
@@ -1228,7 +1261,7 @@ BOOL reg_io_r_enum_val(char *desc,  REG_R_ENUM_VALUE *r_q, prs_struct *ps, int d
 
        if(!prs_uint32("ptr_value", ps, depth, &r_q->ptr_value))
                return False;
-       if(!smb_io_buffer2("buf_value", r_q->buf_value, r_q->ptr_value, ps, depth))
+       if(!smb_io_buffer2("buf_value", &r_q->buf_value, r_q->ptr_value, ps, depth))
                return False;
        if(!prs_align(ps))
                return False;
@@ -1247,7 +1280,7 @@ BOOL reg_io_r_enum_val(char *desc,  REG_R_ENUM_VALUE *r_q, prs_struct *ps, int d
                        return False;
        }
 
-       if(!prs_uint32("status", ps, depth, &r_q->status))
+       if(!prs_ntstatus("status", ps, depth, &r_q->status))
                return False;
 
        return True;
@@ -1324,7 +1357,7 @@ BOOL reg_io_r_create_val(char *desc,  REG_R_CREATE_VALUE *r_q, prs_struct *ps, i
        if(!prs_align(ps))
                return False;
        
-       if(!prs_uint32("status", ps, depth, &r_q->status))
+       if(!prs_ntstatus("status", ps, depth, &r_q->status))
                return False;
 
        return True;
@@ -1353,6 +1386,29 @@ void init_reg_q_enum_key(REG_Q_ENUM_KEY *q_i, POLICY_HND *pol, uint32 key_idx)
        unix_to_nt_time(&q_i->time, 0);            /* current time? */
 }
 
+/*******************************************************************
+makes a reply structure.
+********************************************************************/
+
+void init_reg_r_enum_key(REG_R_ENUM_KEY *r_u, char *subkey, uint32 unknown_1,
+                       uint32 unknown_2)
+{
+       if ( !r_u )
+               return;
+               
+       r_u->unknown_1 = unknown_1;
+       r_u->unknown_2 = unknown_2;
+       r_u->unknown_3 = 0x0;
+       
+       r_u->key_name_len = (strlen(subkey)+1) * 2;
+       if (r_u->key_name_len)
+               r_u->ptr1 = 0x1;
+       init_unistr3( &r_u->key_name, subkey );
+       
+       r_u->ptr2 = 0x1;
+       r_u->ptr3 = 0x1;
+}
+
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
@@ -1457,7 +1513,7 @@ BOOL reg_io_r_enum_key(char *desc,  REG_R_ENUM_KEY *r_q, prs_struct *ps, int dep
                        return False;
        }
 
-       if(!prs_uint32("status", ps, depth, &r_q->status))
+       if(!prs_ntstatus("status", ps, depth, &r_q->status))
                return False;
 
        return True;
@@ -1468,7 +1524,7 @@ makes a structure.
 ********************************************************************/
 
 void init_reg_q_open_entry(REG_Q_OPEN_ENTRY *r_q, POLICY_HND *pol,
-                               char *key_name, uint32 unk)
+                               char *key_name, uint32 access_desired)
 {
        int len_name = strlen(key_name)+1;
 
@@ -1478,7 +1534,7 @@ void init_reg_q_open_entry(REG_Q_OPEN_ENTRY *r_q, POLICY_HND *pol,
        init_unistr2(&r_q->uni_name, key_name, len_name);
 
        r_q->unknown_0 = 0x00000000;
-       r_q->unknown_1 = unk;
+       r_q->access_desired = access_desired;
 }
 
 /*******************************************************************
@@ -1506,9 +1562,9 @@ BOOL reg_io_q_open_entry(char *desc,  REG_Q_OPEN_ENTRY *r_q, prs_struct *ps, int
        if(!prs_align(ps))
                return False;
        
-       if(!prs_uint32("unknown_0", ps, depth, &r_q->unknown_0))
+       if(!prs_uint32("unknown_0        ", ps, depth, &r_q->unknown_0))
                return False;
-       if(!prs_uint32("unknown_1", ps, depth, &r_q->unknown_1))
+       if(!prs_uint32("asccess_desired  ", ps, depth, &r_q->access_desired))
                return False;
 
        return True;
@@ -1519,7 +1575,7 @@ BOOL reg_io_q_open_entry(char *desc,  REG_Q_OPEN_ENTRY *r_q, prs_struct *ps, int
 ********************************************************************/
 
 void init_reg_r_open_entry(REG_R_OPEN_ENTRY *r_r,
-                               POLICY_HND *pol, uint32 status)
+                          POLICY_HND *pol, NTSTATUS status)
 {
        memcpy(&r_r->pol, pol, sizeof(r_r->pol));
        r_r->status = status;
@@ -1543,7 +1599,7 @@ BOOL reg_io_r_open_entry(char *desc,  REG_R_OPEN_ENTRY *r_r, prs_struct *ps, int
        if(!smb_io_pol_hnd("", &r_r->pol, ps, depth))
                return False;
 
-       if(!prs_uint32("status", ps, depth, &r_r->status))
+       if(!prs_ntstatus("status", ps, depth, &r_r->status))
                return False;
 
        return True;
@@ -1622,7 +1678,7 @@ BOOL reg_io_r_shutdown(char *desc, REG_R_SHUTDOWN * r_s, prs_struct *ps,
        if(!prs_align(ps))
                return False;
 
-       if(!prs_uint32("status", ps, depth, &(r_s->status)))
+       if(!prs_ntstatus("status", ps, depth, &r_s->status))
                return False;
 
        return True;
@@ -1677,9 +1733,8 @@ BOOL reg_io_r_abort_shutdown(char *desc, REG_R_ABORT_SHUTDOWN * r_s,
        if (!prs_align(ps))
                return False;
 
-       if (!prs_uint32("status", ps, depth, &(r_s->status)))
+       if (!prs_ntstatus("status", ps, depth, &r_s->status))
                return False;
 
        return True;
 }
-