diff options
Diffstat (limited to 'src/arch/context.c')
-rw-r--r-- | src/arch/context.c | 108 |
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; } |