📄 state.c
字号:
// bfe2 - cpu state// Copyright (c) 1999-2003 Brand Huntsman and Lee Salzman//#include "common.h"#include "functions.h"//////////////////////////////////////////////////////////////////////////// globals_cpu cpu;// localGtkWidget *r_eax_text, *r_ebx_text, *r_ecx_text, *r_edx_text;GtkWidget *r_ebp_text, *r_esi_text, *r_edi_text, *r_esp_text;GtkWidget *r_eflags_text, *r_eip_text, *stack_label;GtkWidget *r_cs_text, *r_ss_text, *r_ds_text, *r_es_text, *r_fs_text, *r_gs_text;GtkWidget *r_tr_text, *r_ldtr_text, *r_gdtr_text, *r_idtr_text;GtkWidget *r_dr0_text, *r_dr1_text, *r_dr2_text, *r_dr3_text;GtkWidget *r_dr4_text, *r_dr5_text, *r_dr6_text, *r_dr7_text;GtkWidget *r_tr3_text, *r_tr4_text, *r_tr5_text, *r_tr6_text, *r_tr7_text;GtkWidget *r_cr0_text, *r_cr1_text, *r_cr2_text, *r_cr3_text, *r_cr4_text;GtkCList *stack_list, *eflags_list;#define STACK_COLUMN_TITLES 3gchar *stack_column_titles[] = { "ESP", "Value", "EBP" };#define EFLAGS_COLUMN_TITLES 2gchar *eflags_column_titles[] = { "", "" };//////////////////////////////////////////////////////////////////////////static GtkWidget *new_vbox_1( GtkWidget *box ){ GtkWidget *vbox; vbox = gtk_vbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(box), vbox, FALSE, FALSE, 0); gtk_widget_show(vbox); return(vbox);}static GtkWidget *new_label_and_entry( GtkWidget *box, char *name, uint width ){ GtkWidget *hbox, *text; hbox = new_hbox(box, FALSE); new_label(hbox, TRUE, name, FALSE); text = new_text_entry(hbox, FALSE, width); gtk_entry_set_editable(GTK_ENTRY(text), FALSE); return(text);}static GtkCList *new_sized_list( GtkWidget *box, uint columns, gchar *titles[], uint width, uint height ){ GtkWidget *scrolled_window; GtkCList *list; uint x; // create scrolled window scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_widget_set_usize(scrolled_window, width, height); gtk_container_set_border_width(GTK_CONTAINER(scrolled_window), 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(box), scrolled_window, TRUE, TRUE, 0); gtk_widget_show(scrolled_window); // create list list = (GtkCList *)gtk_clist_new_with_titles(columns, titles); for(x = 0; x < columns; x++) gtk_clist_set_column_auto_resize(list, x, TRUE); gtk_clist_set_selection_mode(list, GTK_SELECTION_SINGLE); gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(list)); gtk_widget_show(GTK_WIDGET(list)); gtk_clist_column_titles_hide(list); return(list);}uint virtual_to_physical( s_segment *segment, uint32 offset , uint32 *physical ){ uint32 limit, base; if(!segment->valid) return(0); limit = (segment->descriptor[0] & 0xffff) + (segment->descriptor[1] & 0xf0000); if((segment->descriptor[1] & 0x400000) != 0) limit = limit << 12; base = (segment->descriptor[0] >> 16) + ((segment->descriptor[1] & 0xff) << 16); base += segment->descriptor[1] & 0xff000000; *physical = base + offset; if((base + offset) > (base + limit)) return(0); return(1);}void read_state( ){ if(bochs_offline || bochs_running) return; fprintf(writepipe, "dump_cpu\n"); fscanf(readpipe, " eax:%x\nebx:%x\necx:%x\nedx:%x\n" "ebp:%x\nesi:%x\nedi:%x\nesp:%x\n" "eflags:%x\neip:%x\n" "cs:s=%x, dl=%x, dh=%x, valid=%u\n" "ss:s=%x, dl=%x, dh=%x, valid=%u\n" "ds:s=%x, dl=%x, dh=%x, valid=%u\n" "es:s=%x, dl=%x, dh=%x, valid=%u\n" "fs:s=%x, dl=%x, dh=%x, valid=%u\n" "gs:s=%x, dl=%x, dh=%x, valid=%u\n" "ldtr:s=%x, dl=%x, dh=%x, valid=%u\n" "tr:s=%x, dl=%x, dh=%x, valid=%u\n" "gdtr:base=%x, limit=%x\n" "idtr:base=%x, limit=%x\n" "dr0:%x\ndr1:%x\ndr2:%x\ndr3:%x\n"// "dr4:%x\ndr5:%x\n" "dr6:%x\ndr7:%x\n" "tr3:%x\ntr4:%x\ntr5:%x\ntr6:%x\ntr7:%x\n" "cr0:%x\ncr1:%x\ncr2:%x\ncr3:%x\ncr4:%x\n" "inhibit_mask:%u\ndone\n", &cpu.eax, &cpu.ebx, &cpu.ecx, &cpu.edx, &cpu.ebp, &cpu.esi, &cpu.edi, &cpu.esp, &cpu.eflags, &cpu.eip, &cpu.cs.segment, &cpu.cs.descriptor[0], &cpu.cs.descriptor[1], &cpu.cs.valid, &cpu.ss.segment, &cpu.ss.descriptor[0], &cpu.ss.descriptor[1], &cpu.ss.valid, &cpu.ds.segment, &cpu.ds.descriptor[0], &cpu.ds.descriptor[1], &cpu.ds.valid, &cpu.es.segment, &cpu.es.descriptor[0], &cpu.es.descriptor[1], &cpu.es.valid, &cpu.fs.segment, &cpu.fs.descriptor[0], &cpu.fs.descriptor[1], &cpu.fs.valid, &cpu.gs.segment, &cpu.gs.descriptor[0], &cpu.gs.descriptor[1], &cpu.gs.valid, &cpu.ldtr.segment, &cpu.ldtr.descriptor[0], &cpu.ldtr.descriptor[1], &cpu.ldtr.valid, &cpu.tr.segment, &cpu.tr.descriptor[0], &cpu.tr.descriptor[1], &cpu.tr.valid, &cpu.gdtr.base, &cpu.gdtr.limit, &cpu.idtr.base, &cpu.idtr.limit, &cpu.dr0, &cpu.dr1, &cpu.dr2, &cpu.dr3,// &cpu.dr4, &cpu.dr5, &cpu.dr6, &cpu.dr7, &cpu.tr3, &cpu.tr4, &cpu.tr5, &cpu.tr6, &cpu.tr7, &cpu.cr0, &cpu.cr1, &cpu.cr2, &cpu.cr3, &cpu.cr4, &cpu.inhibit); prompt_read();}void add_flag( uint value, char *name ){ char temp[2], *row[EFLAGS_COLUMN_TITLES]; snprintf(temp, 2, "%u", value); row[0] = temp; row[1] = name; gtk_clist_append(eflags_list, row);}//////////////////////////////////////////////////////////////////////////void stateInit( GtkWidget *hbox ){ GtkWidget *vbox; vbox = new_vbox_1(hbox); stack_label = new_label(vbox, TRUE, "Stack", FALSE); stack_list = new_sized_list(vbox, STACK_COLUMN_TITLES, stack_column_titles, STACK_LIST_W, STACK_LIST_H); gtk_clist_column_titles_show(stack_list); r_dr0_text = new_label_and_entry(vbox, "DR0", WLEN_REGISTER); r_dr1_text = new_label_and_entry(vbox, "DR1", WLEN_REGISTER); r_dr2_text = new_label_and_entry(vbox, "DR2", WLEN_REGISTER); r_dr3_text = new_label_and_entry(vbox, "DR3", WLEN_REGISTER);// r_dr4_text = new_label_and_entry(vbox, "DR4", WLEN_REGISTER);// r_dr5_text = new_label_and_entry(vbox, "DR5", WLEN_REGISTER); r_dr6_text = new_label_and_entry(vbox, "DR6", WLEN_REGISTER); r_dr7_text = new_label_and_entry(vbox, "DR7", WLEN_REGISTER); ///////////////////////////////////////////// vbox = new_vbox_1(hbox); r_eax_text = new_label_and_entry(vbox, "EAX", WLEN_REGISTER); r_ebx_text = new_label_and_entry(vbox, "EBX", WLEN_REGISTER); r_ecx_text = new_label_and_entry(vbox, "ECX", WLEN_REGISTER); r_edx_text = new_label_and_entry(vbox, "EDX", WLEN_REGISTER); r_ebp_text = new_label_and_entry(vbox, "EBP", WLEN_REGISTER); r_esi_text = new_label_and_entry(vbox, "ESI", WLEN_REGISTER); r_edi_text = new_label_and_entry(vbox, "EDI", WLEN_REGISTER); r_esp_text = new_label_and_entry(vbox, "ESP", WLEN_REGISTER); new_gap(vbox); r_tr3_text = new_label_and_entry(vbox, "TR3", WLEN_REGISTER); r_tr4_text = new_label_and_entry(vbox, "TR4", WLEN_REGISTER); r_tr5_text = new_label_and_entry(vbox, "TR5", WLEN_REGISTER); r_tr6_text = new_label_and_entry(vbox, "TR6", WLEN_REGISTER); r_tr7_text = new_label_and_entry(vbox, "TR7", WLEN_REGISTER); ///////////////////////////////////////////// vbox = new_vbox_1(hbox); r_eflags_text = new_label_and_entry(vbox, "EFLAGS", WLEN_REGISTER); r_eip_text = new_label_and_entry(vbox, "EIP", WLEN_REGISTER); r_cs_text = new_label_and_entry(vbox, "CS", WLEN_SEGMENT); r_ss_text = new_label_and_entry(vbox, "SS", WLEN_SEGMENT); r_ds_text = new_label_and_entry(vbox, "DS", WLEN_SEGMENT); r_es_text = new_label_and_entry(vbox, "ES", WLEN_SEGMENT); r_fs_text = new_label_and_entry(vbox, "FS", WLEN_SEGMENT); r_gs_text = new_label_and_entry(vbox, "GS", WLEN_SEGMENT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -