diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-03-08 19:30:52 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-03-08 19:30:52 (GMT) |
commit | 68bb7efaf61e4f5ca2f2cffce84995ffd667c4cc (patch) | |
tree | 9b6a6f63ee20b08d8c2ac35849ee051d61787447 /src/dialogs | |
parent | dc9e68505c4cc7ad208e63dbc7d0e0e8f582d0d9 (diff) |
Handle cross references as well as entry points.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@482 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/dialogs')
-rw-r--r-- | src/dialogs/gotox.c | 136 | ||||
-rw-r--r-- | src/dialogs/gotox.h | 7 |
2 files changed, 117 insertions, 26 deletions
diff --git a/src/dialogs/gotox.c b/src/dialogs/gotox.c index 653a969..33664d7 100644 --- a/src/dialogs/gotox.c +++ b/src/dialogs/gotox.c @@ -52,6 +52,8 @@ typedef enum _GotoXColumn } GotoXColumn; +/* Construit la fenêtre de sélection d'adresses. */ +static GtkWidget *create_gotox_dialog(GtkWindow *, GtkTreeStore **); /* Ajoute une nouvelle localisation de destination. */ static void add_new_location_to_list(GtkTreeStore *, GLoadedBinary *, const vmpa2t *, GBinSymbol *); @@ -61,9 +63,9 @@ static void add_new_location_to_list(GtkTreeStore *, GLoadedBinary *, const vmpa /****************************************************************************** * * * Paramètres : parent = fenêtre parente à surpasser. * -* binary = binaire dont les points d'entrée sont à afficher. * +* store = modèle de gestion pour les éléments de liste. [OUT] * * * -* Description : Construit la fenêtre de sélection des sections. * +* Description : Construit la fenêtre de sélection d'adresses. * * * * Retour : Adresse de la fenêtre mise en place. * * * @@ -71,7 +73,7 @@ static void add_new_location_to_list(GtkTreeStore *, GLoadedBinary *, const vmpa * * ******************************************************************************/ -GtkWidget *create_gotox_dialog(GtkWindow *parent, GLoadedBinary *binary) +static GtkWidget *create_gotox_dialog(GtkWindow *parent, GtkTreeStore **store) { GtkWidget *result; /* Fenêtre à renvoyer */ GtkWidget *dlgvbox; /* Zone principale de la boîte */ @@ -80,15 +82,8 @@ GtkWidget *create_gotox_dialog(GtkWindow *parent, GLoadedBinary *binary) GtkWidget *treeview; /* Affichage de la liste */ GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ GtkTreeViewColumn *column; /* Colonne de la liste */ - GtkTreeStore *store; /* Modèle de gestion */ - GBinFormat *format; /* Format associé au binaire */ - GBinSymbol **symbols; /* Symboles à représenter */ - size_t sym_count; /* Qté de symboles présents */ - size_t i; /* Boucle de parcours */ - vmpa2t addr; /* Localisation de symbole */ result = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(result), _("Binary's entry points")); gtk_window_set_default_size(GTK_WINDOW(result), 600, 350); gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); gtk_window_set_modal(GTK_WINDOW(result), TRUE); @@ -111,12 +106,12 @@ GtkWidget *create_gotox_dialog(GtkWindow *parent, GLoadedBinary *binary) gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN); - store = gtk_tree_store_new(GXC_COUNT, - G_TYPE_UINT64, G_TYPE_UINT64, - CAIRO_GOBJECT_TYPE_SURFACE, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + *store = gtk_tree_store_new(GXC_COUNT, + G_TYPE_UINT64, G_TYPE_UINT64, + CAIRO_GOBJECT_TYPE_SURFACE, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(*store)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE); gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(treeview), TRUE); @@ -167,6 +162,40 @@ GtkWidget *create_gotox_dialog(GtkWindow *parent, GLoadedBinary *binary) gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); gtk_dialog_add_button(GTK_DIALOG(result), _("_Go"), GTK_RESPONSE_OK); + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : parent = fenêtre parente à surpasser. * +* binary = binaire dont les points d'entrée sont à afficher. * +* * +* Description : Construit la fenêtre de sélection des points d'entrée. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_gotox_dialog_for_entry_points(GtkWindow *parent, GLoadedBinary *binary) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkTreeStore *store; /* Modèle de gestion */ + GBinFormat *format; /* Format associé au binaire */ + GBinSymbol **symbols; /* Symboles à représenter */ + size_t sym_count; /* Qté de symboles présents */ + size_t i; /* Boucle de parcours */ + vmpa2t addr; /* Localisation de symbole */ + + /* Mise en place de la boîte de dialogue */ + + result = create_gotox_dialog(parent, &store); + + gtk_window_set_title(GTK_WINDOW(result), _("Binary's entry points")); + /* Affichage de tous les points d'entrées */ format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); @@ -193,6 +222,61 @@ GtkWidget *create_gotox_dialog(GtkWindow *parent, GLoadedBinary *binary) /****************************************************************************** * * +* Paramètres : parent = fenêtre parente à surpasser. * +* binary = binaire dont les points d'entrée sont à afficher. * +* instr = instruction de référence sur laquelle s'appuyer. * +* back = sens de la récupérations des instructions visées. * +* * +* Description : Construit la fenêtre de sélection des références croisées. * +* * +* Retour : Adresse de la fenêtre mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *parent, GLoadedBinary *binary, const GArchInstruction *instr, bool back) +{ + GtkWidget *result; /* Fenêtre à renvoyer */ + GtkTreeStore *store; /* Modèle de gestion */ + GArchInstruction **list; /* Liste d'instructions */ + size_t count; /* Nombre d'éléments présents */ + size_t i; /* Boucle de parcours */ + const vmpa2t *addr; /* Adresse à considérer */ + + /* Mise en place de la boîte de dialogue */ + + result = create_gotox_dialog(parent, &store); + + if (back) + gtk_window_set_title(GTK_WINDOW(result), _("List of backward cross references")); + else + gtk_window_set_title(GTK_WINDOW(result), _("List of forward cross references")); + + /* Affichage de toutes les instructions référencées */ + + if (back) + count = g_arch_instruction_get_sources(instr, &list, NULL); + else + count = g_arch_instruction_get_destinations(instr, &list, NULL, NULL); + + for (i = 0; i < count; i++) + { + addr = get_mrange_addr(g_arch_instruction_get_range(list[i])); + + add_new_location_to_list(store, binary, addr, NULL); + + } + + g_object_unref(G_OBJECT(store)); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : store = modèle de gestionnaire pour la liste affichée. * * binary = représentation du binaire chargé en mémoire. * * addr = localisation à venir ajouter à la liste. * @@ -266,17 +350,21 @@ static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary, /* Image de représentation */ - switch (g_binary_symbol_get_target_type(symbol)) - { - case STP_ENTRY_POINT: - filename = find_pixmap_file("entrypoint.png"); - break; + if (symbol == NULL) + filename = NULL; - default: - filename = NULL; - break; + else + switch (g_binary_symbol_get_target_type(symbol)) + { + case STP_ENTRY_POINT: + filename = find_pixmap_file("entrypoint.png"); + break; - } + default: + filename = NULL; + break; + + } if (filename != NULL) { diff --git a/src/dialogs/gotox.h b/src/dialogs/gotox.h index 1153478..88d1fc9 100644 --- a/src/dialogs/gotox.h +++ b/src/dialogs/gotox.h @@ -33,8 +33,11 @@ -/* Construit la fenêtre de saut à une adresse. */ -GtkWidget *create_gotox_dialog(GtkWindow *, GLoadedBinary *); +/* Construit la fenêtre de sélection des points d'entrée. */ +GtkWidget *create_gotox_dialog_for_entry_points(GtkWindow *, GLoadedBinary *); + +/* Construit la fenêtre de sélection des références croisées. */ +GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *, GLoadedBinary *, const GArchInstruction *, bool); /* Fournit l'adresse obtenue par la saisie de l'utilisateur. */ vmpa2t *get_address_from_gotox_dialog(GtkWidget *); |