diff options
Diffstat (limited to 'src/analysis/disass/routines.c')
-rw-r--r-- | src/analysis/disass/routines.c | 42 |
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 |