summaryrefslogtreecommitdiff
path: root/plugins/dalvik
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-10-25 19:39:15 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-10-25 19:39:15 (GMT)
commit8a4274cb6a99184ff4d9203c784ffd1e78550002 (patch)
treeff3a3a5091b90e1cb1958924acf5119b115d656e /plugins/dalvik
parente6180b353a5177238b4e77946ff44505854e12f8 (diff)
Created a cache for Dalvik registers.
Diffstat (limited to 'plugins/dalvik')
-rw-r--r--plugins/dalvik/core.c20
-rw-r--r--plugins/dalvik/core.h3
-rw-r--r--plugins/dalvik/register.c124
-rw-r--r--plugins/dalvik/register.h11
4 files changed, 156 insertions, 2 deletions
diff --git a/plugins/dalvik/core.c b/plugins/dalvik/core.c
index f5b2f91..7f0c79f 100644
--- a/plugins/dalvik/core.c
+++ b/plugins/dalvik/core.c
@@ -29,6 +29,7 @@
#include "processor.h"
+#include "register.h"
@@ -40,7 +41,6 @@ DEFINE_CHRYSALIDE_PLUGIN("dalvik", "Add suport for the Dalvik architecture", "0.
/******************************************************************************
* *
* Paramètres : plugin = greffon à manipuler. *
-* ref = espace de référencement global. *
* *
* Description : Prend acte du chargement du greffon. *
* *
@@ -60,3 +60,21 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
return result;
}
+
+/******************************************************************************
+* *
+* Paramètres : plugin = greffon à manipuler. *
+* *
+* Description : Prend acte du déchargement du greffon. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *plugin)
+{
+ clean_dalvik_register_cache();
+
+}
diff --git a/plugins/dalvik/core.h b/plugins/dalvik/core.h
index e72abaa..08717a9 100644
--- a/plugins/dalvik/core.h
+++ b/plugins/dalvik/core.h
@@ -33,6 +33,9 @@
/* Prend acte du chargement du greffon. */
G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *);
+/* Prend acte du déchargement du greffon. */
+G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *);
+
#endif /* _PLUGINS_DALVIK_CORE_H */
diff --git a/plugins/dalvik/register.c b/plugins/dalvik/register.c
index 00e9757..2e7b7c6 100644
--- a/plugins/dalvik/register.c
+++ b/plugins/dalvik/register.c
@@ -24,6 +24,7 @@
#include "register.h"
+#include <malloc.h>
#include <stdio.h>
@@ -32,6 +33,9 @@
+/* ------------------------- GESTION UNITAIRE DES REGISTRES ------------------------- */
+
+
/* Représentation d'un registre Dalvik (instance) */
struct _GDalvikRegister
{
@@ -71,6 +75,27 @@ static guint g_dalvik_register_hash(const GDalvikRegister *);
/* Traduit un registre en version humainement lisible. */
static void g_dalvik_register_print(const GDalvikRegister *, GBufferLine *, AsmSyntax);
+/* Crée une réprésentation de registre Dalvik. */
+GDalvikRegister *_g_dalvik_register_new(uint16_t);
+
+
+
+/* ------------------------ GESTION SOUS FORME DE SINGLETONS ------------------------ */
+
+
+/* Conservation des registres utilisés */
+static GDalvikRegister **_dalvik_registers = NULL;
+static uint16_t _dreg_count = 0;
+
+
+/* Fournit le singleton associé à un registre Dalvik. */
+static GDalvikRegister *get_dalvik_register(uint16_t);
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* GESTION UNITAIRE DES REGISTRES */
+/* ---------------------------------------------------------------------------------- */
/* Indique le type défini pour une représentation d'un registre Dalvik. */
@@ -235,7 +260,7 @@ static void g_dalvik_register_print(const GDalvikRegister *reg, GBufferLine *lin
* *
******************************************************************************/
-GDalvikRegister *g_dalvik_register_new(uint16_t index)
+GDalvikRegister *_g_dalvik_register_new(uint16_t index)
{
GDalvikRegister *result; /* Structure à retourner */
@@ -250,6 +275,29 @@ GDalvikRegister *g_dalvik_register_new(uint16_t index)
/******************************************************************************
* *
+* Paramètres : index = indice du registre correspondant. *
+* *
+* Description : Crée une réprésentation de registre Dalvik. *
+* *
+* Retour : Adresse de la structure mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GDalvikRegister *g_dalvik_register_new(uint16_t index)
+{
+ GDalvikRegister *result; /* Structure à retourner */
+
+ result = get_dalvik_register(index);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : reg = registre à consulter. *
* *
* Description : Fournit l'indice d'un registre Dalvik. *
@@ -289,3 +337,77 @@ int g_dalvik_register_compare(const GDalvikRegister *a, const GDalvikRegister *b
return result;
}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* GESTION SOUS FORME DE SINGLETONS */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+* *
+* Paramètres : index = indice du registre correspondant. *
+* *
+* Description : Fournit le singleton associé à un registre Dalvik. *
+* *
+* Retour : Adresse de la structure mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GDalvikRegister *get_dalvik_register(uint16_t index)
+{
+ GDalvikRegister *result; /* Structure à retourner */
+ uint16_t i; /* Boucle de parcours */
+
+ if (index >= _dreg_count)
+ {
+ _dalvik_registers = realloc(_dalvik_registers, (index + 1) * sizeof(GDalvikRegister *));
+
+ for (i = _dreg_count; i < (index + 1); i++)
+ _dalvik_registers[i] = NULL;
+
+ _dreg_count = index + 1;
+
+ }
+
+ if (_dalvik_registers[index] == NULL)
+ _dalvik_registers[index] = _g_dalvik_register_new(index);
+
+ result = _dalvik_registers[index];
+
+ g_object_ref(G_OBJECT(result));
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Vide totalement le cache des registres Dalvik. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void clean_dalvik_register_cache(void)
+{
+ uint16_t i; /* Boucle de parcours */
+
+ for (i = 0; i < _dreg_count; i++)
+ g_object_unref(G_OBJECT(_dalvik_registers[i]));
+
+ if (_dalvik_registers != NULL)
+ free(_dalvik_registers);
+
+ _dalvik_registers = NULL;
+ _dreg_count = 0;
+
+}
diff --git a/plugins/dalvik/register.h b/plugins/dalvik/register.h
index 460edd7..de5efe5 100644
--- a/plugins/dalvik/register.h
+++ b/plugins/dalvik/register.h
@@ -33,6 +33,9 @@
+/* ------------------------- GESTION UNITAIRE DES REGISTRES ------------------------- */
+
+
#define G_TYPE_DALVIK_REGISTER g_dalvik_register_get_type()
#define G_DALVIK_REGISTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_dalvik_register_get_type(), GDalvikRegister))
#define G_IS_DALVIK_REGISTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_dalvik_register_get_type()))
@@ -62,4 +65,12 @@ int g_dalvik_register_compare(const GDalvikRegister *, const GDalvikRegister *);
+/* ------------------------ GESTION SOUS FORME DE SINGLETONS ------------------------ */
+
+
+/* Vide totalement le cache des registres Dalvik. */
+void clean_dalvik_register_cache(void);
+
+
+
#endif /* _ARCH_DALVIK_REGISTERS_H */