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