summaryrefslogtreecommitdiff
path: root/src/analysis/disass/output.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-04-03 23:14:10 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-04-03 23:14:10 (GMT)
commita4be577f06d16a4fc851ede9a744eac9160bcb45 (patch)
treec45fee3f5c8d51afd6d2d7d2063fcf926556f770 /src/analysis/disass/output.c
parent1d72be43f80250d2e8b064a8bfafe4a1f3f3b007 (diff)
Kept the user informed about the instructions printing status.
Diffstat (limited to 'src/analysis/disass/output.c')
-rw-r--r--src/analysis/disass/output.c101
1 files changed, 73 insertions, 28 deletions
diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c
index dce5497..b2bfce7 100644
--- a/src/analysis/disass/output.c
+++ b/src/analysis/disass/output.c
@@ -35,15 +35,18 @@
+#define ROUTINE_INTRO_MSG "; --------------- BEGIN OF PROCEDURE ---------------"
+
+
+
/******************************************************************************
* *
-* 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. *
+* 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. *
+* status = barre de statut avec progression à mettre à jour. *
* *
* Description : Transcrit du code désassemblé en texte humainement lisible. *
* *
@@ -53,7 +56,7 @@
* *
******************************************************************************/
-void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *format, GArchProcessor *proc, const GArchInstruction *instrs, GBinRoutine * const *routines, size_t count, GtkExtStatusBar *statusbar, bstatus_id_t id)
+void print_disassembled_instructions(GCodeBuffer *buffer, GExeFormat *format, GArchProcessor *proc, GtkStatusStack *status)
{
GLangOutput *output; /* Modèle de sortie adéquat */
GPortionLayer *layer; /* Couche première de portions */
@@ -68,15 +71,14 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
MemoryDataSize msize; /* Taille du bus d'adresses */
const GBinContent *content; /* Contenu binaire global */
-#if 0
- const mrange_t *range; /* Cou
+ size_t count; /* Nombre total d'instructions */
+ activity_id_t id; /* Identifiant de progression */
+
- vmpa_t start; /* Adresse de départ */
- vmpa_t end; /* Adresse de fin */
-#endif
- const GArchInstruction *iter; /* Boucle de parcours #1 */
- size_t i; /* Boucle de parcours #2 */
+ size_t i; /* Boucle de parcours */
+ GArchInstruction *instr; /* Instruction à traiter */
+
const vmpa2t *iaddr; /* Adresse d'instruction */
const vmpa2t *saddr; /* Adresse de symbole */
@@ -86,7 +88,7 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
const vmpa2t *paddr; /* Adresse de portion */
int compared; /* Bilan d'une comparaison */
-
+ SymbolType stype; /* Type de symbole trouvé */
const char *label; /* Etiquette ciblant un symbole*/
mrange_t range; /* Couverture sans surface */
@@ -141,10 +143,17 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
g_arch_instruction_get_location(iter, NULL, NULL, &end);
#endif
- for (iter = instrs, i = 0;
- iter != NULL;
- iter = g_arch_instruction_get_next_iter(instrs, iter, VMPA_MAX))
+
+ count = g_arch_processor_count_disassembled_instructions(proc);
+
+ id = gtk_status_stack_add_activity(status, _("Printing all disassebled parts..."), count);
+
+ for (i = 0; i < count; i++)
{
+ instr = g_arch_processor_get_disassembled_instruction(proc, i);
+
+
+
#if 0
g_arch_instruction_get_location(iter, NULL, NULL, &iaddr);
@@ -160,7 +169,7 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
#endif
- iaddr = get_mrange_addr(g_arch_instruction_get_range(iter));
+ iaddr = get_mrange_addr(g_arch_instruction_get_range(instr));
while (portion_index < portions_count)
{
@@ -181,7 +190,7 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
if (sym_index < sym_count)
{
- iaddr = get_mrange_addr(g_arch_instruction_get_range(iter));
+ iaddr = get_mrange_addr(g_arch_instruction_get_range(instr));
saddr = get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index]));
/* On écarte les symboles qu'on ne sait pas réintroduire */
@@ -202,14 +211,49 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
if (compared == 0)
{
+ /* Ligne de séparation */
+
+ init_mrange(&range, get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index])), 0);
+
+ line = g_code_buffer_prepare_new_line(buffer, &range);
+ g_buffer_line_add_flag(line, BLF_IS_LABEL);
+ g_buffer_line_fill_mrange(line, msize, msize);
+
+ g_code_buffer_append_new_line(buffer, line);
+
+ /* Coupure pour une nouvelle routine */
+
+ stype = g_binary_symbol_get_target_type(symbols[sym_index]);
+
+ if (stype == STP_ROUTINE || stype == STP_FUNCTION || stype == STP_ENTRY_POINT)
+ {
+
+ line = g_code_buffer_prepare_new_line(buffer, &range);
+ g_buffer_line_add_flag(line, BLF_IS_LABEL);
+ g_buffer_line_fill_mrange(line, msize, msize);
+
+ g_buffer_line_start_merge_at(line, BLC_ASSEMBLY_HEAD);
+ g_buffer_line_insert_text(line, BLC_ASSEMBLY_HEAD,
+ ROUTINE_INTRO_MSG, strlen(ROUTINE_INTRO_MSG), RTT_COMMENT);
+
+ g_code_buffer_append_new_line(buffer, line);
+
+ init_mrange(&range, get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index])), 0);
+
+ line = g_code_buffer_prepare_new_line(buffer, &range);
+ g_buffer_line_add_flag(line, BLF_IS_LABEL);
+ g_buffer_line_fill_mrange(line, msize, msize);
+
+ g_code_buffer_append_new_line(buffer, line);
+
+ }
+
/* Etiquette ? */
label = g_binary_symbol_get_label(symbols[sym_index]);
if (label != NULL)
{
- init_mrange(&range, get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index])), 0);
-
line = g_code_buffer_prepare_new_line(buffer, &range);
g_buffer_line_add_flag(line, BLF_IS_LABEL);
g_buffer_line_fill_mrange(line, msize, msize);
@@ -230,16 +274,16 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
- line = g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL);
+ line = g_arch_instruction_print(instr, buffer, msize, content, ASX_INTEL);
- if (g_arch_instruction_get_flags(iter) & AIF_RETURN_POINT)
+ if (g_arch_instruction_get_flags(instr) & AIF_RETURN_POINT)
g_buffer_line_add_flag(line, BLF_BOOKMARK);
if (sym_index < sym_count)
{
- iaddr = get_mrange_addr(g_arch_instruction_get_range(iter));
+ iaddr = get_mrange_addr(g_arch_instruction_get_range(instr));
saddr = get_mrange_addr(g_binary_symbol_get_range(symbols[sym_index]));
if (cmp_vmpa(iaddr, saddr) == 0)
@@ -286,11 +330,12 @@ void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *form
g_code_buffer_append_new_line(buffer, line);
-
- //gtk_extended_status_bar_update_activity(statusbar, id, (iaddr - start) * 1.0 / (end - start));
+ gtk_status_stack_update_activity_value(status, id, 1);
}
+ gtk_status_stack_remove_activity(status, id);
+
g_object_unref(G_OBJECT(content));
if (portions != NULL)