static void create_registry(void){ if(regs) { printf("Logic error: create_registry() called with existing registry\n"); save_registry(); return; } regs=malloc(3*sizeof(struct reg_value)); regs[0].type=regs[1].type=DIR; regs[0].name=malloc(5); strcpy(regs[0].name, "HKLM"); regs[1].name=malloc(5); strcpy(regs[1].name, "HKCU"); regs[0].value=regs[1].value=NULL; regs[0].len=regs[1].len=0; reg_size=2; head = 0; save_registry(); }
static void remove_key(long handle, const char* name) { int i, len; char *fullname; fullname = build_keyname(handle, name); len = strlen(fullname); for (i=0; i < reg_size;) { if (!strncmp(regs[i].name, fullname, len)) { free(regs[i].value); free(regs[i].name); memmove(®s[i], ®s[i+1], --reg_size*sizeof(struct reg_value)); } else { i++; } } free(fullname); save_registry(); }
static struct reg_value* insert_reg_value(int handle, const char* name, int type, const void* value, int len) { reg_handle_t* t; struct reg_value* v; char* fullname; if((fullname=build_keyname(handle, name))==NULL) { TRACE("Invalid handle\n"); return NULL; } if((v=find_value_by_name(fullname))==0) //creating new value in registry { if(regs==0) create_registry(); regs=(struct reg_value*)realloc(regs, sizeof(struct reg_value)*(reg_size+1)); //regs=(struct reg_value*)my_realloc(regs, sizeof(struct reg_value)*(reg_size+1)); v=regs+reg_size; reg_size++; } else //replacing old one { free(v->value); free(v->name); } TRACE("RegInsert '%s' %p v:%d len:%d\n", name, value, *(int*)value, len); v->type=type; v->len=len; v->value=malloc(len); memcpy(v->value, value, len); v->name=malloc(strlen(fullname)+1); strcpy(v->name, fullname); free(fullname); save_registry(); return v; }