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

📄 htformat.cc

📁 功能较全面的反汇编器:反汇编器ht-2.0.15.tar.gz
💻 CC
📖 第 1 页 / 共 5 页
字号:
							c_tag_idx = s-1;							r = 1;							break;						}					} else {						s = tag_count_selectable_tags_in_group(c_line, c_tag_group);						if (s) {							if (c_tag_idx >= s) c_tag_idx = s-1;							r = 1;							break;						}					}				}				if (r) {					cursor = c;					memcpy(cursor_line, c_line, sizeof cursor_line);					cursorline_dirty();					cursor_ypos = c_ypos;					cursor.tag_idx = c_tag_idx;					cursor.tag_group = c_tag_group;					if (cursor_ypos <= -1) scroll_up(-cursor_ypos);					update_misc_info();					update_visual_info();					if (edit()) update_micropos();				} else {					scroll_up(n);				}				return r;			} else {				int r=0;				char c_line[1024];				int c_tag_idx = cursor.tag_idx;				int c_tag_group = cursor.tag_group;				int d_tag_group = cursor.tag_group;				uformat_viewer_pos c;				int c_ypos;				if (cursor_state == cursor_state_invisible) {					c = top;					c_ypos = 0;				} else {					c = cursor;					c_ypos = cursor_ypos;				}				int nc = prev_line(&c, n);				c_ypos -= nc;				while (nc--) {					c.sub->getline(c_line, sizeof c_line, c.line_id);					int g = tag_count_groups(c_line);					if (d_tag_group < g) c_tag_group=d_tag_group;					int s;					if (c_tag_group >= g) {						c_tag_group = g-1;						s = tag_count_selectable_tags_in_group(c_line, c_tag_group);						if (s) {							c_tag_idx = s-1;							r = 1;							break;						}					}					s = tag_count_selectable_tags_in_group(c_line, c_tag_group);					if (s) {						if (c_tag_idx >= s) c_tag_idx = s-1;						r=1;						break;					}					if (!next_line(&c, 1)) break;					c_ypos++;				}				if (r) {					cursor = c;					memcpy(cursor_line, c_line, sizeof cursor_line);					cursorline_dirty();					cursor_ypos = c_ypos;					cursor.tag_idx = c_tag_idx;					cursor.tag_group = c_tag_group;					if (-cursor_ypos+n-nc-1 > 0) scroll_up(-cursor_ypos+n-nc-1);					update_misc_info();					update_visual_info();					if (edit()) update_micropos();				} else {					if (cursor_state == cursor_state_invisible) cursor_ypos=-0x80000000;					scroll_up(n);				}				// FIXME: wrong value				return 1;			}		}		case cursor_state_disabled://			scroll_up(n);//			return n;			break;	}	return 0;}int ht_uformat_viewer::cursor_down(int n){	switch (cursor_state) {		case cursor_state_invisible:		case cursor_state_visible: {			if (n == 1 && cursor_state == cursor_state_visible) {				int r=0;				uformat_viewer_pos c;				c = cursor;				char c_line[1024];				int c_ypos=cursor_ypos;				int c_tag_idx=cursor.tag_idx;				int c_tag_group=cursor.tag_group;				int d_tag_group=cursor.tag_group;				int nls;	/* controls scrolling beyond end */				while ((nls = next_line(&c, 1)) && c_ypos <= size.h-1) {					c_ypos++;					c.sub->getline(c_line, sizeof c_line, c.line_id);					int g = tag_count_groups(c_line);					if (d_tag_group < g) c_tag_group = d_tag_group;					int s;					if (c_tag_group >= g) {						c_tag_group = g-1;						s=tag_count_selectable_tags_in_group(c_line, c_tag_group);						if (s) {							c_tag_idx = s-1;							r = 1;							break;						}					}					s = tag_count_selectable_tags_in_group(c_line, c_tag_group);					if (s) {						if (c_tag_idx >= s) c_tag_idx = s-1;						r = 1;						break;					}				}				if (r) {					cursor = c;					memcpy(cursor_line, c_line, sizeof cursor_line);					cursorline_dirty();					cursor_ypos = c_ypos;					cursor.tag_idx = c_tag_idx;					cursor.tag_group = c_tag_group;					if (cursor_ypos >= size.h) scroll_down(cursor_ypos-size.h+1);					update_misc_info();					update_visual_info();					if (edit()) update_micropos();				} else if (nls) scroll_down(1);				return r;			} else {				int r=0;				char c_line[1024];				int c_tag_idx=cursor.tag_idx;				int c_tag_group=cursor.tag_group;				int d_tag_group=cursor.tag_group;				uformat_viewer_pos c;				int c_ypos;				if (cursor_state==cursor_state_invisible) {					c = top;					c_ypos = next_line(&c, size.h-1);				} else {					c = cursor;					c_ypos = cursor_ypos;				}				int nc=next_line(&c, n);				int onc=c_ypos+nc-size.h+1;				c_ypos+=nc;				while (nc--) {					c.sub->getline(c_line, sizeof c_line, c.line_id);					int g=tag_count_groups(c_line);					if (d_tag_group<g) c_tag_group=d_tag_group;					int s;					if (c_tag_group>=g) {						c_tag_group=g-1;						s=tag_count_selectable_tags_in_group(c_line, c_tag_group);						if (s) {							c_tag_idx=s-1;							r=1;							break;						}					} else {						s=tag_count_selectable_tags_in_group(c_line, c_tag_group);						if (s) {							if (c_tag_idx>=s) c_tag_idx=s-1;							r=1;							break;						}					}					if (nc) if (!prev_line(&c, 1)) break;					c_ypos--;				}				if (r) {					cursor = c;					memcpy(cursor_line, c_line, sizeof cursor_line);					cursorline_dirty();					cursor_ypos=c_ypos;					cursor.tag_idx=c_tag_idx;					cursor.tag_group=c_tag_group;					if (cursor_ypos-size.h+1>0) scroll_down(cursor_ypos-size.h+1);					update_misc_info();					update_visual_info();					if (edit()) update_micropos();				} else if (onc>0) {					if (cursor_state==cursor_state_invisible) cursor_ypos=-0x80000000;					scroll_down(onc);				}				// FIXME: wrong value				return 1;			}		}		case cursor_state_disabled://			scroll_down(n);//			return n;			break;	}	return 0;}int ht_uformat_viewer::cursor_home(){	cursor.tag_idx=0;	if (edit()) cursor_tag_micropos=0;	update_visual_info();	update_misc_info();	return 1;}int ht_uformat_viewer::cursor_end(){	cursorline_get();	int c = tag_count_selectable_tags_in_group(cursor_line, cursor.tag_group);	cursor.tag_idx = c-1;	if (edit()) {		char *e = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group);		if (e) cursor_tag_micropos = tag_get_microsize(e) - 1;	}	update_visual_info();	update_misc_info();	return 1;}void ht_uformat_viewer::cursor_tab(){	cursor.tag_group++;	adjust_cursor_group();}void ht_uformat_viewer::cursorline_dirty(){	isdirty_cursor_line = true;}void ht_uformat_viewer::cursorline_get(){	if (isdirty_cursor_line) {		if (cursor.sub) cursor.sub->getline(cursor_line, sizeof cursor_line, cursor.line_id);		isdirty_cursor_line = false;	}}int ht_uformat_viewer::cursormicroedit_forward(){	cursorline_get();	uformat_viewer_pos p;	p = top;	p.tag_group = cursor.tag_group;	uint cursor_tag_bitidx = 0;	cursorline_get();	char *e=tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group);	if (e) {		if (((byte*)e)[1] == HT_TAG_EDIT_BIT) {			cursor_tag_bitidx = ((ht_tag_edit_bit*)e)->bitidx;		}	}	bool cursor_found = false;	char c_line[1024];	for (int y=0; y < size.h+16; y++) {		if (!p.sub->getline(c_line, sizeof c_line, p.line_id)) break;		int c=tag_count_selectable_tags_in_group(c_line, p.tag_group);		while (p.tag_idx<c) {			char *t=tag_get_selectable_tag(c_line, p.tag_idx, p.tag_group);			if (t && (tag_get_class(t) == tag_class_edit)) {				if (cursor_found) {					cursor_tag_micropos=0;					set_cursor(p);					cursorline_dirty();					update_misc_info();					update_visual_info();					return 1;				} else if (tag_get_offset(t) == cursor_tag_offset) {					byte *tb = (byte*)t;					if ( ( tb[1] == HT_TAG_EDIT_BIT &&					 ((ht_tag_edit_bit*)t)->bitidx == cursor_tag_bitidx ) 					|| tb[1] != HT_TAG_EDIT_BIT) {						cursor_found = true;						char *t = tag_get_selectable_tag(c_line, p.tag_idx, p.tag_group);						int s = tag_get_microsize(t);						if (cursor_tag_micropos+1 < s) {							cursor_tag_micropos++;							set_cursor(p);							cursorline_dirty();							update_misc_info();							update_visual_info();							return 1;						}					}				}			}			p.tag_idx++;		}		p.tag_idx = 0;		if (!next_line(&p, 1)) break;	}	if (cursor_right()) cursor_tag_micropos = 0;	return 0;}int ht_uformat_viewer::cursormicro_forward(){	cursorline_get();	char *t = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group);	int s = tag_get_microsize(t);	if (cursor_tag_micropos+1 >= s) {		if (cursor_right()) cursor_tag_micropos=0; else return 0;	} else {		cursor_tag_micropos++;	}	return 1;}int ht_uformat_viewer::cursormicro_backward(){	if (cursor_tag_micropos>0) {		cursor_tag_micropos--;	} else {		if (cursor_left()) {			cursorline_get();			char *t=tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group);			cursor_tag_micropos=tag_get_microsize(t)-1;		} else {			return 0;		}	}	return 1;}void ht_uformat_viewer::draw(){	int sdown_count=0;	if (!uf_initialized) HT_ERROR("complete_init() not called!");restart:	clear(getcolor(palidx_generic_body));	if (!first_sub) return;	uformat_viewer_pos p = top;	uformat_viewer_pos sp;	clear_viewer_pos(&sp);	char line[1024];	bool cursor_in_line;	int cursor_found=-1;	if (focused) hidecursor();	if (!p.sub->getline(line, sizeof line, p.line_id)) {		if (p.sub->closest_line_id(&p.line_id)) {			top = p;		} else return;		if (!p.sub->getline(line, sizeof line, p.line_id)) return;	}	for (int y=0; y < size.h; y++) {		if (y == cursor_ypos) sp = p;		if (!p.sub->getline(line, sizeof line, p.line_id)) break;/**//*		char test[128];		tag_striptags(test+sprintf(test, "%08x,%08x: ", id1, id2), line);		fprintf(stdout, "%s\n", test);		fflush(stdout);*//**/// FIXME: revision		if (cursor_state == cursor_state_visible && p.sub == cursor.sub		 && compeq_line_id(p.line_id, cursor.line_id)) {			cursor_found = y;			cursorline_dirty();			update_misc_info();			int c = tag_count_selectable_tags_in_group(line, cursor.tag_group);			if (cursor.tag_idx >= c) cursor.tag_idx = c-1;			if (cursor_tag_class == tag_class_edit && edit()) {				char *t = tag_get_selectable_tag(line, cursor.tag_idx, cursor.tag_group);				if (t) {					int x = cursor_visual_xpos + tag_get_micropos(t, cursor_tag_micropos) - xscroll;					if (focused && x >= 0) setcursor(x, y);				}			}			cursor_in_line = true;		} else cursor_in_line = false;		print_tagstring(0, y, size.w, xscroll, line, cursor_in_line);		if (xscroll > 0) buf->printChar(0, y, VCP(VC_GREEN, VC_TRANSPARENT), '<');		if (!next_line(&p, 1)) break;	}	if (cursor_state == cursor_state_visible && cursor_found == -1) {#if 1		if (!sp.sub) sp = top;		cursor = sp;#else		top = cursor;#endif		cursorline_dirty();		update_misc_info();		int c = tag_count_selectable_tags_in_group(line, cursor.tag_group);		if (cursor.tag_idx > c-1) cursor.tag_idx=c-1;		if (sdown_count++ > 0) goto restart;	}	if (cursor_found != -1) cursor_ypos = cursor_found;//	buf_printf(1, 1, VCP(VC_GREEN, VC_BLACK), "%s", focused ? "focused" : "unfocused");//	if (cursor_select) printf(20, 1, VCP(VC_GREEN, VC_BLACK), "start=%08x, l=%08x", cursor_select_start, cursor_select_cursor_length);//	buf_printf(20, 6, 7, "csize.x=%2d, csize.y=%2d, csize.w=%2d, csize.h=%2d", csize.x, csize.y, csize.w, csize.h);//	buf_printf(2, 3, 7, "size.x=%2d, size.y=%2d, size.w=%2d, size.h=%2d", size.x, size.y, size.w, size.h);//	buf_printf(2, 4, 7, "vsize.x=%2d, vsize.y=%2d, vsize.w=%2d, vsize.h=%2d", vsize.x, vsize.y, vsize.w, vsize.h);//	buf_printf(2, 5, 7, "bsize.x=%2d, bsize.y=%2d, bsize.w=%2d, bsize.h=%2d", buf->size.x, buf->size.y, buf->size.w, buf->size.h);//	buf_printf(20, 7, 7, "size.x=%2d, size.y=%2d, size.w=%2d, size.h=%2d", group->group->size.x, group->group->size.y, group->group->size.w, group->group->size.h);//	buf_printf(20, 8, 7, "vsize.x=%2d, vsize.y=%2d, vsize.w=%2d, vsize.h=%2d", group->group->vsize.x, group->group->vsize.y, group->group->vsize.w, group->group->vsize.h);//	buf_printf(0, 7, 7, "vx=%2d, vl=%2d, ypos=%2d", cursor_visual_xpos, cursor_visual_length, cursor_ypos);//	buf->printf(0, 2, 7, CP_DEVICE, "cursor_micropos=%d", cursor_tag_micropos);//	buf_printf(0, 2, 7, "%x, %x, %x, %x, %x, c_tagidx", cursor.line_id.id1, cursor.line_id.id2, cursor.line_id.id3, cursor.line_id.id4, cursor.line_id.id5, cursor.tag_idx);//	buf_printf(0, 3, 7, "(%c)", "vid"[cursor_state]);//	buf_printf(0, 6, 7, "cursor.tag_idx=%d", cursor.tag_idx);/*	if (cursor_tag_class==tag_class_edit) {		buf_printf(30, 7, 7, "class=edit, addr=%08x", cursor_tag_offset);	} else {		buf_printf(30, 7, 7, "class=sel, id_low=%08x, id_high=%08x", 0,0);	}*/}bool ht_uformat_viewer::edit(){	return (file && (file->getAccessMode() & IOAM_WRITE));}bool ht_uformat_viewer::edit_end(){	if (!edit()) {		hidecursor();		set_cursor(cursor);#if 0		uformat_viewer_pos p = cursor;		if (find_first_tag(&p, size.h)) {			set_cursor(p);		} else {//			if (cursor_state!=cursor_state_disabled) {/* is that all we have to do ??? testing needed *///				cursor_state=cursor_state_invisible;//				assert(0);	/* FIXME: not yet implemented *///			}		}#endif		cursorline_dirty();		adjust_cursor_idx();		update_visual_info();		update_misc_info();		dirtyview();		return true;	}	return false;}bool ht_uformat_viewer::edit_input(byte b){	cursorline_get();	char *t = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group);	switch (t[1]) {		case HT_TAG_EDIT_BYTE:		case HT_TAG_EDIT_WORD_LE:		case HT_TAG_EDIT_DWORD_LE:		case HT_TAG_EDIT_QWORD_LE:		case HT_TAG_EDIT_WORD_BE:		case HT_TAG_EDIT_DWORD_BE:		case HT_TAG_EDIT_QWORD_BE: {			int nibval = edit_input_c2h(b);			if (nibval == -1) break;						int size = 0;			bool bigendian = true;			switch (t[1]) {				case HT_TAG_EDIT_BYTE: size = 1; break;				case HT_TAG_EDIT_WORD_LE: size = 2; bigendian=false; break;				case HT_TAG_EDIT_DWORD_LE: size = 4; bigendian=false; break;				case HT_TAG_EDIT_QWORD_LE: size = 8; bigendian=false; break;				case HT_TAG_EDIT_WORD_BE: size = 2; bigendian=true; break;				case HT_TAG_EDIT_DWORD_BE: size = 4; bigendian=true; break;				case HT_TAG_EDIT_QWORD_BE: size = 8; bigendian=true; break;			}						uint shift = 4 - (cursor_tag_micropos&1)*4;			uint m = ~(0xf << shift);			uint o = nibval << shift;			int b;			if (bigendian) {				b = cursor_tag_micropos/2;			} else {				b = size - cursor_tag_micropos/2 - 1;			}						byte buf;			pread(cursor_tag_offset + b, &buf, 1);			buf &= m;			buf |= o;			pwrite(cursor_tag_offset + b, &buf, 1);			cursormicroedit_forward();			return true;		}		case HT_TAG_EDIT_CHAR: {			if (b >= 32 && b < 128) {				pwrite(cursor_tag_offset, &b, 1);				cursormicroedit_forward();				return true;			}			break;		}		case HT_TAG_EDIT_BIT: {			if (b == '1' || b == '0' || b == ' ') {				byte d;				cursorline_get();				char *t = tag_get_selectable_tag(cursor_line, cursor.tag_idx, cursor.tag_group);				int shift = ((ht_tag_edit_bit*)t)->bitidx;				uint32 mask = 1 << (shift%8);				int op = shift/8;				pread(cursor_tag_offset+op, &d, 1);				switch (b) {				case '0':					d &= ~mask;					break;				case '1':					d |= mask;					break;				case K_Space:					d ^= mask;					break;				}				pwrite(cursor_tag_offset+op, &d, 1);				cursormicroedit_forward();				return true;			}			break;		}		case HT_TAG_EDIT_TIME_BE:		case HT_TAG_EDIT_TIME_LE: {			uint32 d;			int h = edit_input_c2d(b);								byte buf[4];			if (pread(cursor_tag_offset, &buf, 4)==4 && h!=-1) {				if (t[1] == HT_TAG_EDIT_TIME_LE) {					d=(buf[3]<<24) | (buf[2]<<16) | (buf[1]<<8) | buf[0];				} else {					d=(buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3];				}				time_t tt = d;				tm *ti = gmtime(&tt);				tm q = *ti;				int k;				bool worked = false;				#define DEC_MASK(value, mask) ((value) - (value) / (mask) % 10 * (mask))				switch (cursor_tag_micropos) {				case 0:					k = q.tm_hour % 10 + h * 10;					if (k < 24) {						q.tm_hour = k;						worked = true;					}					break;				case 1:					k = q.tm_hour - q.tm_hour % 10 + h;					if (k < 24) {						q.tm_hour = k;						worked = true;					}					break;

⌨️ 快捷键说明

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