summaryrefslogtreecommitdiff
path: root/src/analysis/disass/limit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/limit.c')
-rw-r--r--src/analysis/disass/limit.c55
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);