htreg.cc

来自「功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz」· CC 代码 · 共 1,153 行 · 第 1/3 页

CC
1,153
字号
	rec_depth = 0;	ht_registry_node *n = find_entry_i(NULL, key, follow_symlinks);	if (n) {		if (n->type == RNT_SUBDIR) return false;		*node = n;		return true;	}	return false;}ht_registry_node *ht_registry::find_entry_i(Container **rdir, const char *key, bool follow_symlinks){	ht_registry_node *dir = root;	char *s;	char t[256]; /* FIXME: possible buffer overflow */	if (key[0]=='/') key++;	while (1) {		s = strchr(key, '/');		if (s) {			ht_strlcpy(t, key, s-key+1);			dir = find_entry_get_subdir(((ht_registry_data_stree*)dir->data)->tree, t);			if (!dir) break;			key = s+1;		} else {			ht_registry_node *n;			if (*key==0) {				n = dir;			} else {				n = find_entry_get_data(((ht_registry_data_stree*)dir->data)->tree, key, follow_symlinks);			}			if (rdir) *rdir=((ht_registry_data_stree*)dir->data)->tree;			return n;		}	}	return NULL;}ht_registry_node *ht_registry::find_entry_get_node(Container *dir, const char *nodename){	if (nodename) {		ht_registry_node t(0, nodename, NULL);		ht_registry_node *n=(ht_registry_node*)dir->get(dir->find(&t));		return n;	}	return NULL;}ht_registry_node *ht_registry::find_entry_get_subdir(Container *dir, const char *nodename){	ht_registry_node *n=find_entry_get_node(dir, nodename);start:	if (!n) return 0;	switch (n->type) {		case RNT_SYMLINK: {			rec_depth++;			if (rec_depth > MAX_SYMLINK_REC_DEPTH) return 0;			char *sl=((ht_registry_data_string*)n->data)->value;			if (sl[0] == '/') {				n = find_entry_i(NULL, sl, true);				goto start;			} else {				return find_entry_get_subdir(dir, sl);			}		}		case RNT_SUBDIR:			return n;	}	return 0;}ht_registry_node *ht_registry::find_entry_get_data(Container *dir, const char *nodename, bool follow_symlinks){	ht_registry_node *n = find_entry_get_node(dir, nodename);start:	if (!n) return NULL;	if (follow_symlinks && n->type == RNT_SYMLINK) {		rec_depth++;		if (rec_depth > MAX_SYMLINK_REC_DEPTH) return NULL;		char *sl = ((ht_registry_data_string*)n->data)->value;		if (sl[0] == '/') {			n = find_entry_i(NULL, sl, true);			goto start;		} else {			return find_entry_get_data(dir, sl, follow_symlinks);		}	}	return n;}ht_registry_node_type ht_registry::have_node_type(const char *identifier, create_empty_registry_data_func create_empty_registry_data){	ht_registry_node_type t=lookup_node_type(identifier);	if (!t) t=register_node_type(identifier, create_empty_registry_data);	return t;}void ht_registry::load(ObjectStream &f){	GET_OBJECT(f, node_types);	GET_OBJECT(f, root);}ht_registry_node_type_desc *ht_registry::get_node_type_desc(ht_registry_node_type t, const char **identifier){	ht_registry_node_type_desc *data = NULL;	firstThat(ht_registry_node_type_desc, data, *node_types, t == data->type);	if (data && identifier) *identifier = data->name;	return data;}ht_registry_node_type ht_registry::lookup_node_type(const char *identifier){	ht_registry_node_type_desc s(0, identifier, NULL);	ht_registry_node_type_desc *d=(ht_registry_node_type_desc*)node_types->get(node_types->find(&s));	return d ? d->type : 0;}ObjectID ht_registry::getObjectID() const{	return ATOM_HT_REGISTRY;}ht_registry_node_type ht_registry::register_node_type(const char *identifier, create_empty_registry_data_func create_empty_registry_data){//	ht_registry_node_type t = RNT_USER;	ht_registry_node_type t = 0;	ht_registry_node_type_desc *nt = NULL;	do {		t++;		firstThat(ht_registry_node_type_desc, nt, *node_types, t == nt->type);	} while (nt != NULL);	ht_registry_node_type_desc *v = new ht_registry_node_type_desc(t, 		identifier, create_empty_registry_data);	if (node_types->find(v) != invObjHandle) {		delete v;		return RNT_INVALID;	} else {		node_types->insert(v);		return t;	}}int ht_registry::set_dword(const char *key, uint32 d){	return set_node(key, RNT_DWORD, new ht_registry_data_dword(d));}int ht_registry::set_raw(const char *key, const void *data, uint size){	return set_node(key, RNT_RAW, new ht_registry_data_raw(data, size));}int ht_registry::set_node(const char *key, ht_registry_node_type type, ht_registry_data *data){	ht_registry_node *n = find_entry_i(NULL, key, false);	if (!n) return ENOENT;	if (n->type == type) {		if (n->data) {			n->data->done();			delete n->data;		}		n->data = data;		return 0;	}	return EPERM;}int ht_registry::set_string(const char *key, const char *string){	return set_node(key, RNT_STRING, new ht_registry_data_string(string));}int ht_registry::set_symlink(const char *key, const char *dest){	return set_node(key, RNT_SYMLINK, new ht_registry_data_string(dest));}bool ht_registry::splitfind(const char *key, const char **name, ht_registry_node **node){	char dir[256]; /* FIXME: possible buffer overflow */	const char *n = strrchr(key, '/');	if (n) {		ht_strlcpy(dir, key, n-key+1);		n++;	} else {		dir[0]=0;		n=key;	}	ht_registry_node *m = find_entry_i(NULL, dir, true);	if (!m) return 0;	if (m->type != RNT_SUBDIR) return 0;	*node = m;	*name = n;	return 1;}void ht_registry::store(ObjectStream &f) const{	PUT_OBJECT(f, node_types);	PUT_OBJECT(f, root);}unsigned char valid_nodename_chars[256/8]={/* 00, 08, 10, 18 */	0, 0, 0, 0,/* 20, 28, 30, 38 *//* space '-' 0-9 '&' ':' '.' */	BITMAP(1, 0, 0, 0, 0, 0, 1, 0), BITMAP(0, 0, 0, 0, 0, 1, 1, 0),	BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 0),/* 40, 48, 50, 58 *//* A-Z '_' */	BITMAP(0, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1),	BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 1),/* 60, 68, 70, 78 *//* a-z */	BITMAP(0, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1),	BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 0),/* 80, 88, 90, 98 */	0, 0, 0, 0,/* a0, a8, b0, b8 */	0, 0, 0, 0,/* c0, c8, d0, d8 */	0, 0, 0, 0,/* e0, e8, f0, f8 */	0, 0, 0, 0};unsigned char valid_nodename_chars_first[256/8]={/* 00, 08, 10, 18 */	0, 0, 0, 0,/* 20, 28, 30, 38 *//* '.' '-' 0-9 */	BITMAP(0, 0, 0, 0, 0, 0, 1, 0), BITMAP(0, 0, 0, 0, 0, 1, 1, 0),	BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 0, 0, 0, 0, 0, 0),/* 40, 48, 50, 58 *//* A-Z '_' */	BITMAP(0, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1),	BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 1),/* 60, 68, 70, 78 *//* a-z */	BITMAP(0, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 1, 1, 1, 1, 1),	BITMAP(1, 1, 1, 1, 1, 1, 1, 1), BITMAP(1, 1, 1, 0, 0, 0, 0, 0),/* 80, 88, 90, 98 */	0, 0, 0, 0,/* a0, a8, b0, b8 */	0, 0, 0, 0,/* c0, c8, d0, d8 */	0, 0, 0, 0,/* e0, e8, f0, f8 */	0, 0, 0, 0};static bool valid_char(unsigned char *bitmap, char c){	int o=c/8;	int p=c%8;	return BITBIT(bitmap[o], p);}bool ht_registry::valid_nodename(const char *nodename){	if ((strcmp(nodename, "..")==0) || (strcmp(nodename, ".")==0)) {		return false;	}	if (!valid_char(valid_nodename_chars_first, *nodename)) return false;	nodename++;	while (*nodename) {		if (!valid_char(valid_nodename_chars, *nodename)) return false;		nodename++;	}	return true;}uint32 get_config_dword(const char *ident){	char e[HT_NAME_MAX], *ee = e;	strcpy(ee, "/config/"); ee += strlen(ee);	ht_strlcpy(ee, ident, sizeof (e) - (ee-e) + 1);	ht_registry_node *n;	if (registry->find_data_entry(e, &n, true)) {		if (n->type == RNT_DWORD) {			ht_registry_data_dword *s = (ht_registry_data_dword *)n->data;			return s->value;		} else {			const char *q = "?";			registry->get_node_type_desc(n->type, &q);			LOG_EX(LOG_ERROR, "registry key '%s' not of type %s, but: %s", e, "dword", q);		}	} else LOG_EX(LOG_ERROR, "registry key '%s' not found", e);	return 0;}char *get_config_string(const char *ident){	char e[HT_NAME_MAX], *ee = e;	strcpy(ee, "/config/"); ee += strlen(ee);	ht_strlcpy(ee, ident, sizeof (e) - (ee-e) + 1);	ht_registry_node *n;	if (registry->find_data_entry(e, &n, true)) {		if (n->type == RNT_STRING) {			ht_registry_data_string *s = (ht_registry_data_string *)n->data;			return ht_strdup(s->value);		} else {			const char *q = "?";			registry->get_node_type_desc(n->type, &q);			LOG_EX(LOG_ERROR, "registry key '%s' not of type %s, but: %s", e, "string", q);		}	} else LOG_EX(LOG_ERROR, "registry key '%s' not found", e);	return NULL;}BUILDER(ATOM_HT_REGISTRY, ht_registry, Object);BUILDER(ATOM_HT_REGISTRY_NODE, ht_registry_node, Object);BUILDER(ATOM_HT_REGISTRY_DATA_STREE, ht_registry_data_stree, ht_registry_data);BUILDER(ATOM_HT_REGISTRY_DATA_DWORD, ht_registry_data_dword, ht_registry_data);BUILDER(ATOM_HT_REGISTRY_DATA_RAW, ht_registry_data_raw, ht_registry_data);BUILDER(ATOM_HT_REGISTRY_DATA_STRING, ht_registry_data_string, ht_registry_data);BUILDER(ATOM_HT_REGISTRY_NODE_TYPE_DESC, ht_registry_node_type_desc, Object);	/* *	INIT */#include "cstream.h"bool init_registry(){	REGISTER(ATOM_HT_REGISTRY, ht_registry);	REGISTER(ATOM_HT_REGISTRY_NODE, ht_registry_node);	REGISTER(ATOM_HT_REGISTRY_DATA_STREE, ht_registry_data_stree);	REGISTER(ATOM_HT_REGISTRY_DATA_DWORD, ht_registry_data_dword);	REGISTER(ATOM_HT_REGISTRY_DATA_RAW, ht_registry_data_raw);	REGISTER(ATOM_HT_REGISTRY_DATA_STRING, ht_registry_data_string);	REGISTER(ATOM_HT_REGISTRY_NODE_TYPE_DESC, ht_registry_node_type_desc);//	registerAtom(ATOM_HT_CREATE_EMPTY_SUBDIR, (void*));	registerAtom(ATOM_HT_CREATE_EMPTY_SYMLINK, (void*)create_empty_symlink);	registerAtom(ATOM_HT_CREATE_EMPTY_DWORD, (void*)create_empty_dword);	registerAtom(ATOM_HT_CREATE_EMPTY_STRING, (void*)create_empty_string);	registerAtom(ATOM_HT_CREATE_EMPTY_RAW, (void*)create_empty_raw);	/*	 *	load default registry	 */	ConstMemMapFile f(default_reg, sizeof default_reg);	CompressedStream c(&f, false);	ObjectStreamBin o(&c, false);	GET_OBJECT(o, registry);//	registry = new ht_registry;//	registry->init();	return true;}/* *	DONE */void done_registry(){	UNREGISTER(ATOM_HT_REGISTRY, ht_registry);	UNREGISTER(ATOM_HT_REGISTRY_NODE, ht_registry_node);	UNREGISTER(ATOM_HT_REGISTRY_DATA_STREE, ht_registry_data_stree);	UNREGISTER(ATOM_HT_REGISTRY_DATA_DWORD, ht_registry_data_dword);	UNREGISTER(ATOM_HT_REGISTRY_DATA_RAW, ht_registry_data_raw);	UNREGISTER(ATOM_HT_REGISTRY_DATA_STRING, ht_registry_data_string);	UNREGISTER(ATOM_HT_REGISTRY_NODE_TYPE_DESC, ht_registry_node_type_desc);//	unregisterAtom(ATOM_HT_CREATE_EMPTY_SUBDIR);	unregisterAtom(ATOM_HT_CREATE_EMPTY_SYMLINK);	unregisterAtom(ATOM_HT_CREATE_EMPTY_DWORD);	unregisterAtom(ATOM_HT_CREATE_EMPTY_STRING);	unregisterAtom(ATOM_HT_CREATE_EMPTY_RAW);		registry->done();	delete registry;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?