diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-10-11 20:50:03 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-10-11 20:50:03 (GMT) |
commit | ffc49de3b424d3daf08b5fdeefd4a3ede6defd02 (patch) | |
tree | cf1a96860e922715bcab55126f8095b7f562d2a1 /src/glibext | |
parent | a5e162d47a574f334b172dfee3128a40e8d52fb3 (diff) |
Improved the disassembling process using memory ranges.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@411 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gbinportion.c | 55 | ||||
-rw-r--r-- | src/glibext/gbinportion.h | 12 |
2 files changed, 64 insertions, 3 deletions
diff --git a/src/glibext/gbinportion.c b/src/glibext/gbinportion.c index 76926ca..94a04cc 100644 --- a/src/glibext/gbinportion.c +++ b/src/glibext/gbinportion.c @@ -50,6 +50,7 @@ struct _GBinPortion char *desc; /* Désignation humaine */ + mrange_t range; /* Emplacement dans le code */ vmpa2t addr; /* Emplacement dans le code */ off_t size; /* Taille de la partie */ @@ -265,7 +266,7 @@ const char *g_binary_portion_get_desc(const GBinPortion *portion) * addr = emplacement de la section à conserver. * * size = taille de la section à conserver. * * * -* Description : Définit les valeurs utiles d'une partie de code. * +* Description : Définit les valeurs utiles d'une partie de code binaire. * * * * Retour : - * * * @@ -273,11 +274,32 @@ const char *g_binary_portion_get_desc(const GBinPortion *portion) * * ******************************************************************************/ -void g_binary_portion_set_values(GBinPortion *portion, const vmpa2t *addr, off_t size) +void g_binary_portion_set_values(GBinPortion *portion, const vmpa2t *addr, phys_t size) { copy_vmpa(&portion->addr, addr); portion->size = size; + init_mrange(&portion->range, addr, size); + +} + + +/****************************************************************************** +* * +* Paramètres : portion = description de partie à mettre à jour. * +* * +* Description : Fournit l'emplacement d'une partie de code binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +const mrange_t *g_binary_portion_get_range(const GBinPortion *portion) +{ + return &portion->range; + } @@ -376,6 +398,35 @@ static bool g_binary_portion_compute_sub_area(GBinPortion *portion, GBinPortion /****************************************************************************** * * +* Paramètres : portion = première portion amorçant la visite. * +* visitor = fonction à appeler à chaque étape de la descente. * +* data = adresse pointant vers des données de l'utilisateur.* +* * +* Description : Parcours un ensemble de portions binaires. * +* * +* Retour : true si la visite a été jusqu'à son terme, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_portion_visit(GBinPortion *portion, visit_portion_fc visitor, void *data) +{ + bool result; /* Etat à retourner */ + size_t i; /* Boucle de parcours */ + + result = visitor(portion, data); + + for (i = 0; i < portion->sub_count && result; i++) + result = g_binary_portion_visit(portion->sub_portions[i], visitor, data); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : portion = description de partie à mettre à jour. * * x = abscisse du point de recherche. * * y = ordonnée du point de recherche. * diff --git a/src/glibext/gbinportion.h b/src/glibext/gbinportion.h index fb32496..ac6b4fd 100644 --- a/src/glibext/gbinportion.h +++ b/src/glibext/gbinportion.h @@ -72,6 +72,10 @@ typedef enum _PortionAccessRights } PortionAccessRights; +/* Fonction appelée à chaque visite de portion.*/ +typedef bool (* visit_portion_fc) (GBinPortion *, void *); + + /* Indique le type défini par la GLib pour les blocs de données. */ GType g_binary_portion_get_type(void); @@ -85,7 +89,10 @@ void g_binary_portion_set_desc(GBinPortion *, const char *); const char *g_binary_portion_get_desc(const GBinPortion *); /* Définit les valeurs utiles d'une partie de code. */ -void g_binary_portion_set_values(GBinPortion *, const vmpa2t *, off_t); +void g_binary_portion_set_values(GBinPortion *, const vmpa2t *, phys_t); + +/* Fournit l'emplacement d'une partie de code binaire. */ +const mrange_t *g_binary_portion_get_range(const GBinPortion *); /* Définit les droits associés à une partie de code. */ void g_binary_portion_set_rights(GBinPortion *, PortionAccessRights); @@ -96,6 +103,9 @@ PortionAccessRights g_binary_portion_get_rights(const GBinPortion *); /* Procède à l'inclusion d'une portion dans une autre. */ void g_binary_portion_include(GBinPortion *, GBinPortion *); +/* Parcours un ensemble de portions binaires. */ +bool g_binary_portion_visit(GBinPortion *, visit_portion_fc, void *); + /* Recherche la portion présente à un point donné. */ GBinPortion *g_binary_portion_find_at_pos(GBinPortion *, gint, GdkRectangle *); |