summaryrefslogtreecommitdiff
path: root/src/analysis/disass/disassembler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/disass/disassembler.c')
-rw-r--r--src/analysis/disass/disassembler.c40
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));
-
}