⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htapp.cc

📁 功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz
💻 CC
📖 第 1 页 / 共 5 页
字号:
						if (f->setAccessMode(old->getAccessMode()) == 0) {							FileLayer *l;							// FIXME: UGLY hack							if (dynamic_cast<ht_ltextfile *>(old)) {								l = new ht_ltextfile(f, true, NULL);							} else {								l = new FileModificator(f, true);							}							e->layer->setLayered(l, true);							e->isfile = true;							delete old;							char *fullfn;							if (sys_canonicalize(&fullfn, fn)==0) {								e->window->settitle(fullfn);								free(fullfn);							} else {								e->window->settitle(fn);							}							clearmsg(msg);						} else {							String s1, s2;							errorbox("couldn't inherit access_mode from '%y' to '%y'", &old->getDesc(s1), &f->getDesc(s2));						}					}				}			}			return;		}		case msg_kill: {			htmsg m;			ht_window *w = (ht_window*)msg->data1.ptr;			m.msg = msg_accept_close;			m.type = mt_broadcast;			m.data1.ptr = NULL;			m.data2.ptr = NULL;			w->sendmsg(&m);			if (m.msg == msg_accept_close) delete_window(w);			clearmsg(msg);			return;		}	}	if (msg->msg == msg_draw) {		start_timer(h0);		if (msg->type == mt_broadcast) {			ht_view *v = first;			while (v) {				v->handlemsg(msg);				v = v->next;			}		} else {			current->handlemsg(msg);		}		stop_timer(h0);		draw();		screen->show();	} else {		ht_group::handlemsg(msg);	}	switch (msg->msg) {		case msg_keypressed: {			int i=0;			switch (msg->data1.integer) {				case K_Meta_9: i++;				case K_Meta_8: i++;				case K_Meta_7: i++;				case K_Meta_6: i++;				case K_Meta_5: i++;				case K_Meta_4: i++;				case K_Meta_3: i++;				case K_Meta_2: i++;				case K_Meta_1: i++;					focus(get_window_by_number(i));					clearmsg(msg);					return;				case K_F12: i++;				case K_F11: i++;				case K_F10: i++;				case K_F9: i++;				case K_F8: i++;				case K_F7: i++;				case K_F6: i++;				case K_F5: i++;				case K_F4: i++;				case K_F3: i++;				case K_F2: i++;				case K_F1:					i++;					htmsg m;					m.msg=msg_funcquery;					m.type=mt_empty;					m.data1.integer=i;					sendmsg(&m);					if (m.msg==msg_retval) {						sendmsg(msg_funcexec, i);						clearmsg(msg);						return;					}					break;/*									case K_Meta_R: {					const char *n = "ht.reg";					LocalFile f(n, IOAM_WRITE, FOM_CREATE);					CompressedStream c(&f, false);//					StreamLayer c(&f, false);					ObjectStreamBin b(&c, false);					b.putObject(registry, NULL);					infobox("registry dumped to '%s'", n);										clearmsg(msg);					return;				}*/#if 0				/* FIXME: experimental */				case K_Control_F9:					((ht_app*)app)->create_window_term("main.exe");					clearmsg(msg);					return;				case K_Meta_T:					create_window_ofm("reg:/", "local:/");					clearmsg(msg);					return;*/				case K_Control_A:					create_window_help("/HT/res/info/intidx.info", "Top");//					create_window_help("c:/djgpp/projects/enew/res/info/ibnidx.info", "Interrupts By Number");					dirtyview();					clearmsg(msg);					return;#endif				case K_Space:					sendmsg(cmd_popup_dialog_view_list);					clearmsg(msg);					return;			}			break;		}		case cmd_about:			msgbox(btmask_ok, "About "ht_name, 0, align_custom, "\n"				"\ec"ht_name" "ht_version" (%s)\n\n"				"\el"ht_copyright1"\n"ht_copyright2"\n\n"				"This program is GPL'd. See Help for more information.", sys_get_name());			break;		case msg_funcexec:			if (func(msg->data1.integer, 1)) {				clearmsg(msg);				return;			}			break;		case msg_funcquery: {			const char *s = func(msg->data1.integer, 0);			if (s) {				msg->msg = msg_retval;				msg->data1.cstr = s;			} else clearmsg(msg);			return;		}		case cmd_file_exec_cmd: {			char cmd[HT_NAME_MAX];			cmd[0] = 0;			if (inputbox("execute shell command (experimental!)",			    (sys_get_caps() & SYSCAP_NBIPC) ? "command"			    : "non-interactive (!) command",			    cmd, sizeof cmd, HISTATOM_FILE) == button_ok) {				if (cmd[0]) create_window_term(cmd);			}			clearmsg(msg);			return;		}		case cmd_file_extend: {			File *f = (File *)msg->data1.ptr;			FileOfs s = msg->data2.q;			// don't ask. only for truncates//			if (confirmbox("really extend %s to offset %08qx/%qd?", f->get_filename(), s, s) == button_ok) {				IOAccessMode oam = f->getAccessMode();				if (!(oam & IOAM_WRITE)) f->setAccessMode(oam | IOAM_WRITE);				try {					f->extend(s);				} catch (const IOException &e) {					errorbox("couldn't extend file to offset 0x%08qx/%qd: %y", s, s, &e);				}				if (!(oam & IOAM_WRITE)) f->setAccessMode(oam);//			}			clearmsg(msg);			return;		}		case cmd_file_truncate: {			File *f = (File *)msg->data1.ptr;			FileOfs s = msg->data2.q;/*			ht_app_window_entry *e;			if ((e = windows->enum_first())) {				do {					if (e->type == AWT_FILE && (File*)e->data == f) {						check_collide();					}				} while ((e = windows->enum_next()));			}*/			String fn;			if (confirmbox("really truncate %y at offset 0x%08qx/%qd?", &f->getFilename(fn), s, s) == button_ok) {				f->truncate(s);			}			clearmsg(msg);			return;		}		case cmd_quit:			if (accept_close_all_windows()) {				LOG("terminating...");				exit_program = true;				sendmsg(cmd_project_close);				clearmsg(msg);			}			return;		case cmd_file_open: {			char *name;			uint mode;			if (file_open_dialog(&name, &mode)) {				if (name[0]) create_window_file(name, mode, true);				free(name);			}			clearmsg(msg);			return;		}		case cmd_file_new: {			Bounds b;			get_stdbounds_file(&b);						uint mode;						if (file_new_dialog(&mode)) {				MemoryFile *mfile = new MemoryFile();				switch (mode) {				case FOM_TEXT: {					ht_syntax_lexer *lexer = NULL;					ht_ltextfile *tfile = new ht_ltextfile(mfile, true, lexer);					ht_layer_textfile *file = new ht_layer_textfile(tfile, true);					create_window_file_text(&b, file, "Untitled", false/* because mem_file is underlying, not ht_file, etc.*/);					break;				}				case FOM_BIN: {					FileModificator *modfile = new FileModificator(mfile, true);					FileLayer *file = new FileLayer(modfile, true);					ht_window *w = create_window_file_bin(&b, file, "Untitled", false);					htmsg m;					m.msg = cmd_file_resize;					m.type = mt_empty;					w->sendmsg(&m);				}				}			}			clearmsg(msg);			return;		}		case cmd_edit_show_clipboard: {			create_window_clipboard();			clearmsg(msg);			return;		}		case cmd_edit_clear_clipboard: {			if (confirmbox("Do you really want to delete the clipboard?")==button_ok) {				clipboard_clear();			}			clearmsg(msg);			return;		}		case cmd_edit_paste_into_file: {			char filename[HT_NAME_MAX];			filename[0] = 0;			if (file_chooser("clipboard - paste into file", filename, sizeof filename)) {				try {					String fn(filename);					LocalFile f(fn, IOAM_WRITE, FOM_CREATE);					clipboard_paste(&f, 0);				} catch (const IOException &e) {					errorbox("error writing: '%s': '%y'", filename, &e);				}			}			clearmsg(msg);			return;		}		case cmd_edit_copy_from_file: {			char filename[HT_NAME_MAX];			filename[0] = 0;			if (file_chooser("clipboard - copy from file", filename, sizeof filename)) {				char desc[HT_NAME_MAX+5];				try {					String fn(filename);					LocalFile f(fn, IOAM_READ, FOM_EXISTS);					ht_snprintf(desc, sizeof desc, "file %s", filename);					clipboard_copy(desc, &f, 0, f.getSize());				} catch (const IOException &e) {					errorbox("error reading: '%s': '%y'", filename, &e);				}			}			clearmsg(msg);			return;		}		case cmd_project_open: {			char fn[HT_NAME_MAX];			fn[0] = 0;			if (file_chooser("Open project", fn, sizeof fn)) {				sendmsg(cmd_project_close);				project_opencreate(fn);			}			clearmsg(msg);			return;		}		case cmd_project_close: {			if (project) {				const char *fn = ((ht_project*)project)->get_filename();				LOG("%s: saving project", fn);				do {					String err;					if (save_fileconfig(fn, ht_projectconfig_magic, ht_projectconfig_fileversion, file_project_store_fcfg_func, NULL, err) != LS_OK) {						String e;						e.assignFormat("Couldn't save '%y': %y\n\nRetry?", &fn, &err);						switch (msgbox(btmask_yes+btmask_no+btmask_cancel, "confirmation", 0, align_center, e.contentChar())) {						case button_ok: continue;						case button_cancel: return;						}						LOG("%s: failed", fn);					} else {						LOG("%s: done", fn);					}					break;				} while (1);				delete ((ht_project*)project);				project = NULL;				htmsg m;				m.type = mt_broadcast;				m.msg = msg_project_changed;				sendmsg(&m);			}			clearmsg(msg);			return;		}		case cmd_window_close:			if (battlefield->current) sendmsg(msg_kill, battlefield->current);			clearmsg(msg);			return;		case cmd_window_tile_vertical:			tile(true);			clearmsg(msg);			return;		case cmd_window_tile_horizontal:			tile(false);			clearmsg(msg);			return;		case cmd_popup_dialog_eval: {			eval_dialog(NULL, NULL, NULL);			clearmsg(msg);			return;		}		case cmd_popup_dialog_view_list: {			ht_view *v = popup_view_list("select mode");			if (v) focus(v);			clearmsg(msg);			return;		}		case cmd_popup_dialog_window_list: {			ht_window *w = popup_window_list("select window");			if (w) focus(w);			clearmsg(msg);			return;		}		case cmd_popup_dialog_info_loader: {			char file[256];			file[0] = 0;			if (inputbox("open info file", "filename", file, sizeof file, HISTATOM_FILE) == button_ok) {				char node[256];				strcpy(node, "Top");				if (inputbox("open info file", "nodename", node, sizeof node, HISTATOM_GOTO) == button_ok) {					create_window_help(file, node);					dirtyview();				}			}			clearmsg(msg);			return;		}		case cmd_popup_window_log:			create_window_log();			clearmsg(msg);			return;		case cmd_popup_window_project:			create_window_project();			clearmsg(msg);			return;		case cmd_popup_window_options:			create_window_ofm("reg:/", NULL);			clearmsg(msg);			return;		case cmd_popup_window_help:			create_window_help(MAGIC_HT_HELP, "Top");			clearmsg(msg);			return;		case msg_project_changed: {			ht_window *w = ((ht_app*)app)->get_window_by_type(AWT_PROJECT);			if (w) w->sendmsg(msg_dirtyview);			app->sendmsg(msg_draw);			return;		}	}}void	ht_app::insert_window(ht_window *window, uint type, bool minimized, bool isfile, FileLayer *layer){	uint n=find_free_window_number();	ht_app_window_entry *e=new ht_app_window_entry(window, n, type, minimized, isfile, layer);	windows->insert(e);	window->setnumber(n);	battlefield->insert(window);	focus(window);}void ht_app::load(ObjectStream &f){	ht_registry *tmp = registry;	GET_OBJECT(f, registry);	if (tmp) {		tmp->done();		delete tmp;	}		load_history(f);		htmsg m;	m.msg = msg_config_changed;	m.type = mt_broadcast;	app->sendmsg(&m);}ObjectID ht_app::getObjectID() const{	return ATOM_HT_APP;}static int my_compare_func(const char *a, const char *b){	return strcmp(a, b);}ht_view *ht_app::popup_view_list(const char *dialog_title){	if (!battlefield->current) return NULL;	Bounds b, c;	getbounds(&b);	b.x=b.w/4;	b.y=b.h/4;	b.w/=2;	b.h/=2;	ht_dialog *dialog=new ht_dialog();	dialog->init(&b, dialog_title, FS_KILLER | FS_TITLE | FS_MOVE);	/* create listbox */	c=b;	c.x=0;	c.y=0;	c.w-=2;	c.h-=2;	ht_text_listbox *listbox=new ht_text_listbox();	listbox->init(&c, 1, 0, LISTBOX_NORMAL);	/* insert all browsable views */	Array structure(false);	int index=0;/*	int count=*/popup_view_list_dump(battlefield->current, listbox, &structure, 0, &index, battlefield->getselected());/* and seek to the currently selected one */	listbox->update();	listbox->gotoItemByPosition(index);	ht_text_listbox_sort_order so[1];	so[0].col = 0;	so[0].compare_func = my_compare_func;/*	so[1].col = 1;	so[1].compare_func = my_compare_func;*/	//	listbox->sort(1, so);	dialog->insert(listbox);	dialog->setpalette(palkey_generic_special);	ht_view *result = NULL;	if (dialog->run(false)) {		ht_listbox_data data;		ViewDataBuf vdb(listbox, &data, sizeof data);		result = (ht_view*)structure[listbox->getID(data.data->cursor_ptr)];	}	dialog->done();	delete dialog;	return result;}int ht_app::popup_view_list_dump(ht_view *view, ht_text_listbox *listbox, List *structure, int depth, int *currenti, ht_view *currentv){	if (!view) return 0;	char str[256];	/* secure */	char *s=str;	if (!(view->options & VO_BROWSABLE)) {		depth--;	}	for (int i=0; i<depth; i++) { *(s++)=' ';*(s++)=' '; }	*s=0;	int c=view->childcount();	int count=0;	for (int i=0; i<c; i++) {		ht_view *v = view->getfirstchild();		while (v) {			if (v->browse_idx == i) break;			v = v->next;		}		if (!v) return count;		// FIXME: "viewergroup": dirty hack !!!		if (v->desc && (strcmp(v->desc, VIEWERGROUP_NAME)) && (v->options & VO_BROWSABLE)) {			ht_snprintf(s, sizeof str-(s-str), "- %s", v->desc);			structure->insert(v);			if (v==currentv)				*currenti=structure->count()-1;			listbox->insert_str(structure->count()-1, str);			count++;		}		count += popup_view_list_dump(v, listbox, structure, depth+1, currenti, currentv);	}	return count;}ht_window *ht_app::popup_window_list(const char *dialog_title){	Bounds b, c;	getbounds(&b);	c=b;	b.w=b.w*2/3;	b.h=b.h*2/3;	b.x=(c.w-b.w)/2;	b.y=(c.h-b.h)/2;	ht_dialog *dialog=new ht_dialog();	dialog->init(&b, dialog_title, FS_KILLER | FS_TITLE | FS_MOVE);	/* create listbox */	c=b;	c.x=0;	c.y=0;	c.w-=2;	c.h-=2;	ht_text_listbox *listbox=new ht_itext_listbox();	listbox->init(&c, 2, 1);	foreach(ht_app_window_entry, e, *windows, {		char l[16];	/* secure */		ht_snprintf(l, sizeof l, " %2d", e->number);		listbox->insert_str(e->number, l, e->window->desc);			});	listbox->update();	if (battlefield->current) listbox->gotoItemByPosition(battlefield->current->getnumber()-1);	dialog->insert(listbox);	dialog->setpalette(palkey_generic_special);	ht_window *result = NULL;	if (dialog->run(false)) {		ht_listbox_data data;		ViewDataBuf vdb(listbox, &data, sizeof data);		result = get_window_by_number(listbox->getID(data.data->cursor_ptr));	}	dialog->done();	delete dialog;	return result;}void ht_app::project_opencreate(const char *filename){	char fn[HT_NAME_MAX];	char cwd[HT_NAME_MAX];	getcwd(cwd, sizeof cwd);	if (sys_common_canonicalize(fn, filename, cwd, sys_is_path_delim) != 0) {		LOG("%s: invalid filename", filename);		return;	}	char *suf = sys_filename_suffix(fn);	/* append HT project file suffix if not already there */

⌨️ 快捷键说明

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