diff options
Diffstat (limited to 'src/analysis/disass/limit.c')
-rw-r--r-- | src/analysis/disass/limit.c | 55 |
1 files changed, 12 insertions, 43 deletions
diff --git a/src/analysis/disass/limit.c b/src/analysis/disass/limit.c index 28a8264..18d089a 100644 --- a/src/analysis/disass/limit.c +++ b/src/analysis/disass/limit.c @@ -25,48 +25,12 @@ -/* Recherche la zone correspond à une adresse donnée. */ -static const mrange_t *find_x_range_for_addr(const mrange_t *, size_t, const vmpa2t *); - - - -/****************************************************************************** -* * -* Paramètres : ranges = liste de zones offrant une exécution et disponibles.* -* count = taille de cette liste. * -* * -* Description : Recherche la zone correspond à une adresse donnée. * -* * -* Retour : Zone trouvée ou NULL si aucune ne correspond. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static const mrange_t *find_x_range_for_addr(const mrange_t *ranges, size_t count, const vmpa2t *addr) -{ - const mrange_t *result; /* Zone à retourner */ - size_t i; /* Boucle de parcours */ - - result = NULL; - - for (i = 0; i < count && result == NULL; i++) - if (mrange_contains_addr(&ranges[i], addr)) - result = &ranges[i]; - - return result; - -} - - /****************************************************************************** * * -* Paramètres : proc = ensemble d'instructions désassemblées. * -* routines = prototypes existants à insérer. * -* 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. * +* Paramètres : routine = routine dont les frontières sont à fixer. * +* prev = routine précédente dans les traitements. * +* proc = ensemble d'instructions désassemblées. * +* portions = ensemble de couches binaires bornées. * * * * Description : S'assure qu'une routine est bien bornée. * * * @@ -76,12 +40,13 @@ static const mrange_t *find_x_range_for_addr(const mrange_t *ranges, size_t coun * * ******************************************************************************/ -void compute_routine_limit(GBinRoutine *routine, GBinRoutine *prev, GArchProcessor *proc, mrange_t *exe_ranges, size_t exe_count) +void compute_routine_limit(GBinRoutine *routine, GBinRoutine *prev, GArchProcessor *proc, GBinPortion *portions) { const mrange_t *range; /* Emplacement courant */ vmpa2t addr; /* Adresse à conserver */ GArchInstruction *start; /* Première instruction */ phys_t diff; /* Taille définie par déduction*/ + GBinPortion *portion; /* Conteneur avec limites */ mrange_t new; /* Nouvel emplacement taillé */ range = g_binary_routine_get_range(routine); @@ -114,12 +79,16 @@ void compute_routine_limit(GBinRoutine *routine, GBinRoutine *prev, GArchProcess /* Sinon on va jusqu'à la fin de la zone ! */ else { - range = find_x_range_for_addr(exe_ranges, exe_count, &addr); - if (range == NULL) goto crl_skip; + portion = g_binary_portion_find_at_addr(portions, &addr, (GdkRectangle []) { }); + if (portion == NULL) goto crl_skip; + + range = g_binary_portion_get_range(portion); diff = compute_vmpa_diff(&addr, get_mrange_addr(range)); diff = get_mrange_length(range) - diff; + g_object_unref(G_OBJECT(portion)); + } init_mrange(&new, &addr, diff); |