/* Chrysalide - Outil d'analyse de fichiers binaires * registers.c - panneau d'affichage des registres d'architecture * * Copyright (C) 2009-2017 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Chrysalide is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "registers.h" #include "../gtkext/easygtk.h" #define _(str) str /****************************************************************************** * * * Paramètres : - * * * * Description : Construit le panneau d'affichage des registres. * * * * Retour : Adresse du panneau mis en place. * * * * Remarques : - * * * ******************************************************************************/ GtkWidget *build_registers_panel(void) { GtkWidget *result; /* Panneau à retourner */ GtkWidget *vbox1; GtkWidget *label1; GtkWidget *table1; GtkWidget *label3; GtkWidget *label4; GtkWidget *label5; GtkWidget *label6; GtkWidget *label7; GtkWidget *label8; GtkWidget *label9; GtkWidget *label10; GtkWidget *label11; GtkWidget *label12; GtkWidget *label13; GtkWidget *label14; GtkWidget *label15; GtkWidget *label16; GtkWidget *entry1; GtkWidget *entry2; GtkWidget *entry3; GtkWidget *entry4; GtkWidget *entry6; GtkWidget *entry5; GtkWidget *entry7; GtkWidget *label2; GtkWidget *label; /* Etiquette textuelle */ GtkWidget *entry; /* Zone de saisie */ result = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(result); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(result), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(result), GTK_SHADOW_IN); vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); gtk_widget_show (vbox1); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(result), vbox1); label1 = qck_create_label(NULL, NULL, _("Registers:")); gtk_box_pack_start (GTK_BOX (vbox1), label1, FALSE, FALSE, 0); table1 = gtk_table_new(7, 3, FALSE); qck_set_margins(table1, 0, 0, 8, 0); gtk_widget_show(table1); gtk_box_pack_start(GTK_BOX(vbox1), table1, FALSE, TRUE, 0); label = qck_create_label(NULL, NULL, "eax: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "eax", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 0, 1, GTK_FILL, 0, 0, 0); label = qck_create_label(NULL, NULL, "ebx: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "ebx", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 1, 2, GTK_FILL, 0, 0, 0); label = qck_create_label(NULL, NULL, "ecx: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 2, 3, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "ecx", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 2, 3, GTK_FILL, 0, 0, 0); label = qck_create_label(NULL, NULL, "edx: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "edx", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 3, 4, GTK_FILL, 0, 0, 0); label = qck_create_label(NULL, NULL, "esi: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 4, 5, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "esi", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 4, 5, GTK_FILL, 0, 0, 0); label = qck_create_label(NULL, NULL, "edi: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 5, 6, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "edi", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 5, 6, GTK_FILL, 0, 0, 0); label = qck_create_label(NULL, NULL, "ebp: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 6, 7, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "ebp", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 6, 7, GTK_FILL, 0, 0, 0); label = qck_create_label(NULL, NULL, "esp: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 7, 8, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "esp", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 7, 8, GTK_FILL, 0, 0, 0); label = qck_create_label(NULL, NULL, "eip: "); gtk_table_attach(GTK_TABLE(table1), label, 0, 1, 8, 9, GTK_FILL, 0, 0, 0); entry = qck_create_entry(G_OBJECT(result), "eip", NULL); gtk_entry_set_width_chars(GTK_ENTRY(entry), 8); gtk_table_attach(GTK_TABLE(table1), entry, 1, 2, 8, 9, GTK_FILL, 0, 0, 0); label2 = qck_create_label(NULL, NULL, _("Segments:")); gtk_box_pack_start (GTK_BOX (vbox1), label2, FALSE, FALSE, 0); return result; } /****************************************************************************** * * * Paramètres : panel = panneau contenant les champs utiles. * * values = liste des registres avec leur valeur. * * count = taille de cette liste. * * * * Description : Met à jour l'affichage des valeurs de registre. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void refresh_registers_panel_with_registers(GtkWidget *panel, register_value *values, size_t count) { GObject *ref; /* Espace de référencement */ size_t i; /* Boucle de parcours */ GtkEntry *entry; /* Zone de texte */ char buffer[32]; ref = G_OBJECT(panel); for (i = 0; i < count; i++) { entry = GTK_ENTRY(g_object_get_data(ref, values[i].name)); if (entry == NULL) continue; snprintf(buffer, 32, "%08llx", values[i].value); gtk_entry_set_text(entry, buffer); } }