summaryrefslogtreecommitdiff
path: root/src/analysis/disass/output.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/output.c')
-rw-r--r--src/analysis/disass/output.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c
index 812b811..135168e 100644
--- a/src/analysis/disass/output.c
+++ b/src/analysis/disass/output.c
@@ -32,10 +32,13 @@
/******************************************************************************
* *
-* Paramètres : buffer = tampon de récueil des résultats d'impression. *
-* instrs = ensemble d'instructions à traiter. *
-* routines = liste de routines intervenant dans le flot. *
-* count = quantité de ces routines. *
+* Paramètres : buffer = tampon de récueil des résultats d'impression. *
+* format = format du binaire traité. *
+* instrs = ensemble d'instructions à traiter. *
+* routines = liste de routines intervenant dans le flot. *
+* count = quantité de ces routines. *
+* statusbar = barre de statut avec progression à mettre à jour.*
+* id = identifiant du message affiché à l'utilisateur. *
* *
* Description : Transcrit du code désassemblé en texte humainement lisible. *
* *
@@ -45,12 +48,14 @@
* *
******************************************************************************/
-void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *format, const GArchInstruction *instrs, GBinRoutine * const *routines, size_t count)
+void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *format, const GArchInstruction *instrs, GBinRoutine * const *routines, size_t count, GtkExtStatusBar *statusbar, guint id)
{
GLangOutput *output; /* Modèle de sortie adéquat */
GArchProcessor *proc; /* Architecture du binaire */
MemoryDataSize msize; /* Taille du bus d'adresses */
const bin_t *content; /* Contenu binaire global */
+ vmpa_t start; /* Adresse de départ */
+ vmpa_t end; /* Adresse de fin */
const GArchInstruction *iter; /* Boucle de parcours #1 */
size_t i; /* Boucle de parcours #2 */
vmpa_t iaddr; /* Adresse d'instruction */
@@ -63,16 +68,20 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
content = g_binary_format_get_content(G_BIN_FORMAT(format), NULL);
+ g_arch_instruction_get_location(instrs, NULL, NULL, &start);
+ iter = g_arch_instruction_find_last(instrs);
+ g_arch_instruction_get_location(iter, NULL, NULL, &end);
+
for (iter = instrs, i = 0;
iter != NULL;
iter = g_arch_instruction_get_next_iter(instrs, iter, VMPA_MAX))
{
+ g_arch_instruction_get_location(iter, NULL, NULL, &iaddr);
+
/* Ajout des prototypes de fonction */
for (; i < count; i++)
{
- g_arch_instruction_get_location(iter, NULL, NULL, &iaddr);
raddr = g_binary_routine_get_address(routines[i]);
-
if (raddr > iaddr) break;
g_binary_routine_output_info(routines[i], output, buffer);
@@ -81,6 +90,8 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL);
+ gtk_extended_status_bar_update_activity(statusbar, id, (iaddr - start) * 1.0 / (end - start));
+
}
g_object_unref(G_OBJECT(output));