diff options
-rw-r--r-- | source3/utils/editreg.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/source3/utils/editreg.c b/source3/utils/editreg.c index 1696316dac..9c4d1a34f4 100644 --- a/source3/utils/editreg.c +++ b/source3/utils/editreg.c @@ -613,6 +613,37 @@ typedef struct vk_struct { #define REG_TYPE_DWORD 4 #define REG_TYPE_MULTISZ 7 +typedef struct _val_str { + unsigned int val; + char * str; +} VAL_STR; + +VAL_STR reg_type_names[] = { + { 1, "REG_SZ" }, + { 2, "REG_EXPAND_SZ" }, + { 3, "REG_BIN" }, + { 4, "REG_DWORD" }, + { 7, "REG_MULTI_SZ" }, + { 0, NULL }, +}; + +char *val_to_str(unsigned int val, VAL_STR *val_array) +{ + int i = 0; + + if (!val_array) return NULL; + + while (val_array[i].val && val_array[i].str) { + + if (val_array[i].val == val) return val_array[i].str; + i++; + + } + + return NULL; + +} + REG_KEY *nt_get_key_tree(REGF *regf, NK_HDR *nk_hdr, int size); int nt_set_regf_input_file(REGF *regf, char *filename) @@ -731,11 +762,58 @@ int valid_regf_hdr(REGF_HDR *regf_hdr) } /* + * Process a VK header and return a value + */ +VAL_KEY *process_vk(REGF *regf, VK_HDR *vk_hdr, int size) +{ + char val_name[1024], data_value[1024]; + int nam_len, dat_len, flag, dat_type, dat_off, vk_id; + char *val_type; + + if (!vk_hdr) return NULL; + + if ((vk_id = SVAL(&vk_hdr->VK_ID)) != REG_VK_ID) { + fprintf(stderr, "Unrecognized VK header ID: %0X, block: %0X, %s\n", + vk_id, vk_hdr, regf->regfile_name); + return NULL; + } + + nam_len = SVAL(&vk_hdr->nam_len); + val_name[nam_len] = '\0'; + flag = SVAL(&vk_hdr->flag); + dat_type = IVAL(&vk_hdr->dat_type); + + if (flag & 0x01) + strncpy(val_name, vk_hdr->dat_name, nam_len); + else + strncpy(val_name, "<No Name>", 10); + + val_type = val_to_str(dat_type, reg_type_names); + + fprintf(stdout, " %s : %s : \n", val_name, val_type); + + return NULL; + +} + +/* * Process a VL Header and return a list of values */ VAL_LIST *process_vl(REGF *regf, VL_TYPE vl, int count, int size) { + int i, vk_off; + VK_HDR *vk_hdr; + + if (-size < (count+1)*sizeof(int)){ + fprintf(stderr, "Error in VL header format. Size less than space required. %d\n", -size); + return NULL; + } + for (i=0; i<count; i++) { + vk_off = IVAL(&vl[i]); + vk_hdr = (VK_HDR *)LOCN(regf->base, vk_off); + process_vk(regf, vk_hdr, BLK_SIZE(vk_hdr)); + } } /* @@ -873,6 +951,7 @@ REG_KEY *nt_get_key_tree(REGF *regf, NK_HDR *nk_hdr, int size) if (sk_off != -1) { + /* To be coded */ } |