diff options
Diffstat (limited to 'src/analysis/disass/disassembler.c')
-rw-r--r-- | src/analysis/disass/disassembler.c | 40 |
1 files changed, 14 insertions, 26 deletions
diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c index ee56043..e7c972d 100644 --- a/src/analysis/disass/disassembler.c +++ b/src/analysis/disass/disassembler.c @@ -48,16 +48,8 @@ /* ------------------------ DESASSEMBLAGE DE BINAIRE DIFFERE ------------------------ */ -#define G_TYPE_DELAYED_DISASSEMBLY g_delayed_disassembly_get_type() -#define G_DELAYED_DISASSEMBLY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_delayed_disassembly_get_type(), GDelayedDisassembly)) -#define G_IS_DELAYED_DISASSEMBLY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_delayed_disassembly_get_type())) -#define G_DELAYED_DISASSEMBLY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DELAYED_DISASSEMBLY, GDelayedDisassemblyClass)) -#define G_IS_DELAYED_DISASSEMBLY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DELAYED_DISASSEMBLY)) -#define G_DELAYED_DISASSEMBLY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DELAYED_DISASSEMBLY, GDelayedDisassemblyClass)) - - /* Ensembles binaires à désassembler (instance) */ -typedef struct _GDelayedDisassembly +struct _GDelayedDisassembly { GDelayedWork parent; /* A laisser en premier */ @@ -70,19 +62,16 @@ typedef struct _GDelayedDisassembly GArchInstruction **instrs; /* Instructions résultantes */ GCodeBuffer *buffer; /* Tampon pour le rendu */ -} GDelayedDisassembly; +}; /* Ensembles binaires à désassembler (classe) */ -typedef struct _GDelayedDisassemblyClass +struct _GDelayedDisassemblyClass { GDelayedWorkClass parent; /* A laisser en premier */ -} GDelayedDisassemblyClass; +}; -/* Indique le type défini pour les tâches de désassemblage différé. */ -static GType g_delayed_disassembly_get_type(void); - /* Initialise la classe des tâches de désassemblage différé. */ static void g_delayed_disassembly_class_init(GDelayedDisassemblyClass *); @@ -99,6 +88,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *, GtkExtStatusBar /* -------------------------- GESTION GLOBALE DE PROCEDURE -------------------------- */ + /* Construit la description d'introduction du désassemblage. */ static void build_disass_prologue(GCodeBuffer *, const char *, const uint8_t *, off_t); @@ -242,7 +232,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta #endif - run_plugins_on_binary(disass->binary, PGA_BINARY_DISASSEMBLED); + run_plugins_on_binary(disass->binary, PGA_BINARY_DISASSEMBLED, true); /* Seconde étape */ @@ -252,7 +242,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta gtk_extended_status_bar_remove(statusbar, id); - run_plugins_on_binary(disass->binary, PGA_BINARY_LINKED); + run_plugins_on_binary(disass->binary, PGA_BINARY_LINKED, true); /* Troisième étape */ @@ -264,7 +254,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta gtk_extended_status_bar_remove(statusbar, id); - run_plugins_on_binary(disass->binary, PGA_BINARY_BOUNDED); + run_plugins_on_binary(disass->binary, PGA_BINARY_BOUNDED, true); /* Quatrième étape */ @@ -276,7 +266,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta gtk_extended_status_bar_remove(statusbar, id); - run_plugins_on_binary(disass->binary, PGA_BINARY_GROUPED); + run_plugins_on_binary(disass->binary, PGA_BINARY_GROUPED, true); /* Cinquième étape */ @@ -285,11 +275,11 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkExtSta qsort(routines, routines_count, sizeof(GBinRoutine *), (__compar_fn_t)g_binary_routine_compare); print_disassembled_instructions(disass->buffer, disass->format, *disass->instrs, - routines, routines_count); + routines, routines_count, statusbar, id); gtk_extended_status_bar_remove(statusbar, id); - run_plugins_on_binary(disass->binary, PGA_BINARY_PRINTED); + run_plugins_on_binary(disass->binary, PGA_BINARY_PRINTED, true); } @@ -395,6 +385,7 @@ static void build_disass_prologue(GCodeBuffer *buffer, const char *filename, con * count = nombre de parties à traiter. * * instrs = liste des instructions chargées. [OUT] * * buffer = tampon de code mis en place. [OUT] * +* ack = fonction à appeler une fois l'opération terminée. * * * * Description : Procède au désassemblage d'un contenu binaire donné. * * * @@ -404,7 +395,7 @@ static void build_disass_prologue(GCodeBuffer *buffer, const char *filename, con * * ******************************************************************************/ -void disassemble_binary(GLoadedBinary *binary, GBinPart **parts, size_t parts_count, GArchInstruction **instrs, GCodeBuffer **buffer) +void disassemble_binary(GLoadedBinary *binary, GBinPart **parts, size_t parts_count, GArchInstruction **instrs, GCodeBuffer **buffer, disassembly_ack_fc ack) { const uint8_t *data; /* Données binaires brutes */ off_t length; /* Quantité de ces données */ @@ -417,12 +408,9 @@ void disassemble_binary(GLoadedBinary *binary, GBinPart **parts, size_t parts_co build_disass_prologue(*buffer, g_loaded_binary_get_filename(binary, true), data, length); disass = g_delayed_disassembly_new(binary, parts, parts_count, instrs, *buffer); + g_signal_connect(disass, "work-completed", G_CALLBACK(ack), binary); queue = get_work_queue(); g_work_queue_schedule_work(queue, G_DELAYED_WORK(disass)); - g_delayed_work_wait_for_completion(G_DELAYED_WORK(disass)); - - g_object_unref(G_OBJECT(disass)); - } |