summaryrefslogtreecommitdiff
path: root/src/dialogs
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-03-08 19:30:52 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-03-08 19:30:52 (GMT)
commit68bb7efaf61e4f5ca2f2cffce84995ffd667c4cc (patch)
tree9b6a6f63ee20b08d8c2ac35849ee051d61787447 /src/dialogs
parentdc9e68505c4cc7ad208e63dbc7d0e0e8f582d0d9 (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.c136
-rw-r--r--src/dialogs/gotox.h7
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 *);