diff options
Diffstat (limited to 'src/format/executable.c')
-rw-r--r-- | src/format/executable.c | 167 |
1 files changed, 106 insertions, 61 deletions
diff --git a/src/format/executable.c b/src/format/executable.c index c1ff940..3e902cf 100644 --- a/src/format/executable.c +++ b/src/format/executable.c @@ -24,6 +24,7 @@ #include "executable.h" +#include <assert.h> #include <malloc.h> #include <stdlib.h> @@ -39,6 +40,12 @@ static void g_executable_format_class_init(GExeFormatClass *); /* Initialise une instance de format d'exécutable générique. */ static void g_executable_format_init(GExeFormat *); +/* Supprime toutes les références externes. */ +static void g_executable_format_dispose(GExeFormat *); + +/* Procède à la libération totale de la mémoire. */ +static void g_executable_format_finalize(GExeFormat *); + /* Indique le type défini pour un format d'exécutable générique. */ @@ -59,6 +66,12 @@ G_DEFINE_TYPE(GExeFormat, g_executable_format, G_TYPE_BIN_FORMAT); static void g_executable_format_class_init(GExeFormatClass *klass) { + GObjectClass *object; /* Autre version de la classe */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_executable_format_dispose; + object->finalize = (GObjectFinalizeFunc)g_executable_format_finalize; } @@ -77,11 +90,57 @@ static void g_executable_format_class_init(GExeFormatClass *klass) static void g_executable_format_init(GExeFormat *format) { + g_mutex_init(&format->mutex); } +/****************************************************************************** +* * +* Paramètres : format = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_executable_format_dispose(GExeFormat *format) +{ + size_t i; /* Boucle de parcours */ + + for (i = 0; i < format->debugs_count; i++) + g_object_unref(G_OBJECT(format->debugs[i])); + + if (format->portions != NULL) + g_object_unref(G_OBJECT(format->portions)); + + g_mutex_clear(&format->mutex); + G_OBJECT_CLASS(g_executable_format_parent_class)->dispose(G_OBJECT(format)); + +} + + +/****************************************************************************** +* * +* Paramètres : format = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_executable_format_finalize(GExeFormat *format) +{ + G_OBJECT_CLASS(g_executable_format_parent_class)->finalize(G_OBJECT(format)); + +} /****************************************************************************** @@ -184,109 +243,95 @@ const char *g_exe_format_get_target_machine(const GExeFormat *format) /****************************************************************************** * * -* Paramètres : format = description de l'exécutable à consulter. * +* Paramètres : format = instance à traiter. * +* status = barre de statut à tenir informée. * * * -* Description : Fournit la première couche des portions composent le binaire.* +* Description : Effectue les ultimes opérations de chargement d'un binaire. * * * -* Retour : Couche brute des différentes portions. * +* Retour : Bilan de l'opération. * * * -* Remarques : Le compteur de références de l'instance renvoyée doit être * -* décrémenté après usage. * +* Remarques : - * * * ******************************************************************************/ -GPortionLayer *g_exe_format_get_main_layer(GExeFormat *format) +bool g_executable_format_complete_loading(GExeFormat *format, GtkStatusStack *status) { - GBinPortion *portion; /* Portion brute globale */ + bool result; /* Bilan à faire remonter */ + GBinFormat *base; /* Version basique du format */ vmpa2t addr; /* Emplacement vide de sens */ phys_t length; /* Taille de portion globale */ - GPortionLayer *layer; /* Couche à mettre en place */ - - if (format->layers == NULL) - { - /* Création d'une portion globale */ - - portion = g_binary_portion_new(BPC_RAW); - init_vmpa(&addr, 0, VMPA_NO_VIRTUAL); - length = g_binary_content_compute_size(G_BIN_FORMAT(format)->content); + base = G_BIN_FORMAT(format); - g_binary_portion_set_values(portion, &addr, length); + result = g_binary_format_complete_loading(base, status); - /* Création d'une couche de base brute */ - - layer = g_portion_layer_new(length, NULL); - - g_portion_layer_include(layer, portion); + if (result) + { + result = g_exe_format_translate_offset_into_vmpa(format, 0, &addr); + assert(result); - /* Remplissage */ + length = g_binary_content_compute_size(base->content); - G_EXE_FORMAT_GET_CLASS(format)->refine_portions(format, layer); + format->portions = g_binary_portion_new(BPC_RAW, &addr, length); - format->layers = layer; + G_EXE_FORMAT_GET_CLASS(format)->refine_portions(format); } - g_object_ref(G_OBJECT(format->layers)); - - return format->layers; + return result; } /****************************************************************************** * * -* Paramètres : format = informations chargées à consulter. * -* count = quantité de zones listées. [OUT] * +* Paramètres : format = description de l'exécutable à modifier. * +* portion = portion à inclure dans les définitions du format. * * * -* Description : Fournit les espaces mémoires des portions exécutables. * +* Description : Procède à l'enregistrement d'une portion dans un format. * * * -* Retour : Liste de zones binaires exécutables à libérer après usage. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -mrange_t *g_exe_format_get_x_ranges(GExeFormat *format, size_t *count) +void g_exe_format_include_portion(GExeFormat *format, GBinPortion *portion) { - mrange_t *result; /* Liste à retourner */ - - typedef struct _x_ranges - { - mrange_t *list; - size_t length; + g_mutex_lock(&format->mutex); - } x_ranges; + g_binary_portion_include(format->portions, portion); - x_ranges tmp; /* Sauvegarde de la liste */ - GPortionLayer *layer; /* Couche première de portions */ + g_mutex_unlock(&format->mutex); - bool visit_for_x(GBinPortion *portion, x_ranges *ranges) - { - const mrange_t *range; - - if (g_binary_portion_get_rights(portion) & PAC_EXEC) - { - range = g_binary_portion_get_range(portion); +} - ranges->list = (mrange_t *)realloc(ranges->list, ++ranges->length * sizeof(mrange_t)); - copy_mrange(&ranges->list[ranges->length - 1], range); - } +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à consulter. * +* * +* Description : Fournit la première couche des portions composent le binaire.* +* * +* Retour : Arborescence des différentes portions binaires. * +* * +* Remarques : Le compteur de références de l'instance renvoyée doit être * +* décrémenté après usage. * +* * +******************************************************************************/ - return true; +GBinPortion *g_exe_format_get_portions(GExeFormat *format) +{ + GBinPortion *result; /* Instance à retourner */ - } + g_mutex_lock(&format->mutex); - tmp.list = NULL; - tmp.length = 0; + result = format->portions; - layer = g_exe_format_get_main_layer(format); - g_portion_layer_visit(format->layers, (visit_portion_fc)visit_for_x, &tmp); - g_object_unref(G_OBJECT(layer)); + if (result != NULL) + g_object_ref(G_OBJECT(result)); - result = tmp.list; - *count = tmp.length; + g_mutex_unlock(&format->mutex); return result; |