summaryrefslogtreecommitdiff
path: root/src/format/executable.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/executable.c')
-rw-r--r--src/format/executable.c167
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;