summaryrefslogtreecommitdiff
path: root/src/analysis/disass/routines.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-01-13 22:37:31 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-01-13 22:37:31 (GMT)
commit23b9c6e68bbe5f0531f9a9408c2deb9f897701dc (patch)
tree3804d6c21c9cd5e291cb8c7853607cdda992d125 /src/analysis/disass/routines.c
parenta6975c1d754a1ba5bfb9e23f0b26692c746e6f9c (diff)
Created a real iterator for symbols.
Diffstat (limited to 'src/analysis/disass/routines.c')
-rw-r--r--src/analysis/disass/routines.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/src/analysis/disass/routines.c b/src/analysis/disass/routines.c
index bc4247c..661e136 100644
--- a/src/analysis/disass/routines.c
+++ b/src/analysis/disass/routines.c
@@ -38,12 +38,11 @@ struct _GRoutinesStudy
{
GDelayedWork parent; /* A laisser en premier */
- GArchProcessor *proc; /* Processeurs avec ses instr. */
-
+ GArchProcessor *proc; /* Processeur avec ses instr. */
+ GBinFormat *format; /* Format de fichier manipulé */
GBinPortion *portions; /* Couches de binaire bornées */
- GBinSymbol **symbols; /* Liste de symboles à traiter */
- size_t count; /* Taille de cette liste */
+ size_t count; /* Nombre de symboles à traiter*/
rtn_fallback_cb fallback; /* Routine de traitement finale*/
size_t begin; /* Point de départ du parcours */
@@ -148,6 +147,11 @@ static void g_routines_study_dispose(GRoutinesStudy *study)
{
g_object_unref(G_OBJECT(study->portions));
+ g_binary_format_unlock_symbols_rd(study->format);
+
+ g_object_unref(G_OBJECT(study->format));
+ g_object_unref(G_OBJECT(study->proc));
+
G_OBJECT_CLASS(g_routines_study_parent_class)->dispose(G_OBJECT(study));
}
@@ -175,9 +179,8 @@ static void g_routines_study_finalize(GRoutinesStudy *study)
/******************************************************************************
* *
* Paramètres : proc = ensemble d'instructions désassemblées. *
+* format = format de fichier à manipuler. *
* portions = ensemble de couches binaires bornées. *
-* symbols = liste de symboles à parcourir. *
-* count = quantité de ces prototypes. *
* begin = point de départ du parcours de liste. *
* end = point d'arrivée exclu du parcours. *
* id = identifiant du message affiché à l'utilisateur. *
@@ -191,19 +194,24 @@ static void g_routines_study_finalize(GRoutinesStudy *study)
* *
******************************************************************************/
-GRoutinesStudy *g_routines_study_new(GArchProcessor *proc, GBinPortion *portions, GBinSymbol **symbols, size_t count, size_t begin, size_t end, activity_id_t id, rtn_fallback_cb fallback)
+GRoutinesStudy *g_routines_study_new(GArchProcessor *proc, GBinFormat *format, GBinPortion *portions, size_t begin, size_t end, activity_id_t id, rtn_fallback_cb fallback)
{
GRoutinesStudy *result; /* Tâche à retourner */
result = g_object_new(G_TYPE_ROUTINES_STUDY, NULL);
result->proc = proc;
+ g_object_ref(G_OBJECT(proc));
+
+ result->format = format;
+ g_object_ref(G_OBJECT(format));
result->portions = portions;
g_object_ref(G_OBJECT(portions));
- result->symbols = symbols;
- result->count = count;
+ g_binary_format_lock_symbols_rd(format);
+
+ result->count = g_binary_format_count_symbols(format);
result->fallback = fallback;
result->begin = begin;
@@ -238,12 +246,12 @@ static void g_routines_study_process(GRoutinesStudy *study, GtkStatusStack *stat
for (i = study->begin; i < study->end; i++)
{
- symbol = study->symbols[i];
+ symbol = g_binary_format_get_symbol(study->format, i);
sym_status = g_binary_symbol_get_status(symbol);
if (sym_status == SSS_IMPORTED)
- continue;
+ goto grsp_next;
type = g_binary_symbol_get_target_type(symbol);
@@ -252,6 +260,10 @@ static void g_routines_study_process(GRoutinesStudy *study, GtkStatusStack *stat
gtk_status_stack_update_activity_value(status, study->id, 1);
+ grsp_next:
+
+ g_object_unref(G_OBJECT(symbol));
+
}
}
@@ -274,6 +286,7 @@ static void g_routines_study_process(GRoutinesStudy *study, GtkStatusStack *stat
void g_routines_study_compute_limits(GRoutinesStudy *study, GBinRoutine *routine, size_t index)
{
GBinSymbol *symbol; /* Version alternative */
+ GBinSymbol *next_symbol; /* Eventuel symbole suivant */
const mrange_t *range; /* Zone du symbole suivant */
const vmpa2t *next; /* Début de la zone suivante */
@@ -281,8 +294,13 @@ void g_routines_study_compute_limits(GRoutinesStudy *study, GBinRoutine *routine
if ((index + 1) < study->count)
{
- range = g_binary_symbol_get_range(study->symbols[index + 1]);
+ next_symbol = g_binary_format_get_symbol(study->format, index + 1);
+
+ range = g_binary_symbol_get_range(next_symbol);
next = get_mrange_addr(range);
+
+ g_object_unref(G_OBJECT(next_symbol));
+
}
else