summaryrefslogtreecommitdiff
path: root/src/arch/context.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/context.c')
-rw-r--r--src/arch/context.c108
1 files changed, 107 insertions, 1 deletions
diff --git a/src/arch/context.c b/src/arch/context.c
index 220ed14..46c4dd1 100644
--- a/src/arch/context.c
+++ b/src/arch/context.c
@@ -2,7 +2,7 @@
/* Chrysalide - Outil d'analyse de fichiers binaires
* context.c - contexte lié à l'exécution d'un processeur
*
- * Copyright (C) 2011 Cyrille Bagard
+ * Copyright (C) 2011-2014 Cyrille Bagard
*
* This file is part of Chrysalide.
*
@@ -24,6 +24,11 @@
#include "context.h"
+#include <assert.h>
+#include <malloc.h>
+#include <string.h>
+
+
#include "context-int.h"
@@ -73,5 +78,106 @@ static void g_proc_context_class_init(GProcContextClass *klass)
static void g_proc_context_init(GProcContext *ctx)
{
+ ctx->drop_points = NULL;
+ ctx->dp_count = 0;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage à compléter. *
+* addr = adresse d'un nouveau point de départ à traiter. *
+* *
+* Description : Ajoute une adresse virtuelle comme point de départ de code. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr)
+{
+ ctx->drop_points = (virt_t *)realloc(ctx->drop_points, ++ctx->dp_count * sizeof(virt_t));
+
+ ctx->drop_points[ctx->dp_count - 1] = addr;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage à consulter. *
+* *
+* Description : Indique si des points de départ restent à traiter ou non. *
+* *
+* Retour : true s'il existe encore au moins un point, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_proc_context_has_drop_points(const GProcContext *ctx)
+{
+ return ctx->dp_count > 0;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage à consulter. *
+* addr = adresse de mémoire virtuelle à rechercher. *
+* *
+* Description : Précise si une adresse donnée figure comme point de départ. *
+* *
+* Retour : true si l'adresse est connue en interne, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_proc_context_has_addr_as_drop_points(const GProcContext *ctx, virt_t addr)
+{
+ bool result; /* Bilan à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = false;
+
+ for (i = 0; i < ctx->dp_count && !result; i++)
+ result = (ctx->drop_points[i] == addr);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage à compléter. *
+* *
+* Description : Fournit une adresse virtuelle comme point de départ de code. *
+* *
+* Retour : Adresse d'un point de départ de code à traiter. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+virt_t g_proc_context_pop_drop_point(GProcContext *ctx)
+{
+ virt_t result; /* Adresse à retourner */
+
+ assert(ctx->dp_count > 0);
+
+ result = ctx->drop_points[0];
+
+ if (ctx->dp_count > 1)
+ memmove(&ctx->drop_points[0], &ctx->drop_points[1], (ctx->dp_count - 1) * sizeof(virt_t));
+
+ ctx->drop_points = (virt_t *)realloc(ctx->drop_points, --ctx->dp_count * sizeof(virt_t));
+
+ return result;
}