summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/arm/v7/processor.c28
-rw-r--r--plugins/dalvik/v35/processor.c29
-rw-r--r--plugins/pychrysalide/arch/processor.c66
-rw-r--r--src/arch/processor-int.h7
-rw-r--r--src/arch/processor.c10
-rw-r--r--src/arch/processor.h2
-rw-r--r--src/core/processors.c18
7 files changed, 147 insertions, 13 deletions
diff --git a/plugins/arm/v7/processor.c b/plugins/arm/v7/processor.c
index 61de7b5..078cc2d 100644
--- a/plugins/arm/v7/processor.c
+++ b/plugins/arm/v7/processor.c
@@ -63,6 +63,9 @@ static void g_armv7_processor_dispose(GArmV7Processor *);
/* Procède à la libération totale de la mémoire. */
static void g_armv7_processor_finalize(GArmV7Processor *);
+/* Fournit la désignation interne du processeur d'architecture. */
+static char *g_armv7_processor_get_key(const GArmV7Processor *);
+
/* Fournit un contexte pour l'exécution du processeur ARM. */
static GArmV7Context *g_armv7_processor_get_context(const GArmV7Processor *);
@@ -99,7 +102,6 @@ static void g_armv7_processor_class_init(GArmV7ProcessorClass *klass)
proc = G_ARCH_PROCESSOR_CLASS(klass);
- proc->key = "armv7";
proc->desc = "ARM v7";
proc->endianness = SRE_LITTLE;
@@ -107,6 +109,7 @@ static void g_armv7_processor_class_init(GArmV7ProcessorClass *klass)
proc->inssize = MDS_32_BITS;
proc->virt_space = true;
+ proc->get_key = (get_processor_key_fc)g_armv7_processor_get_key;
proc->get_ctx = (get_processor_context_fc)g_armv7_processor_get_context;
proc->disassemble = (disass_instr_fc)g_armv7_processor_disassemble;
@@ -195,6 +198,29 @@ GArmV7Processor *g_armv7_processor_new(void)
/******************************************************************************
* *
+* Paramètres : proc = processeur d'architecture à consulter. *
+* *
+* Description : Fournit la désignation interne du processeur d'architecture. *
+* *
+* Retour : Simple chaîne de caractères. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static char *g_armv7_processor_get_key(const GArmV7Processor *proc)
+{
+ char *result; /* Désignation à renvoyer */
+
+ result = strdup("armv7");
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : proc = architecture, spectatrice ici. *
* *
* Description : Fournit un contexte pour l'exécution du processeur Arm. *
diff --git a/plugins/dalvik/v35/processor.c b/plugins/dalvik/v35/processor.c
index ad8cb8a..0865ee7 100644
--- a/plugins/dalvik/v35/processor.c
+++ b/plugins/dalvik/v35/processor.c
@@ -64,6 +64,9 @@ static void g_dalvik35_processor_dispose(GDalvik35Processor *);
/* Procède à la libération totale de la mémoire. */
static void g_dalvik35_processor_finalize(GDalvik35Processor *);
+/* Fournit la désignation interne du processeur d'architecture. */
+static char *g_dalvik35_processor_get_key(const GDalvik35Processor *);
+
/* Décode une instruction dans un flux de données. */
static GArchInstruction *g_dalvik35_processor_disassemble(const GArchProcessor *, GDalvikContext *, const GBinContent *, vmpa2t *, GExeFormat *);
@@ -97,9 +100,10 @@ static void g_dalvik35_processor_class_init(GDalvik35ProcessorClass *klass)
proc = G_ARCH_PROCESSOR_CLASS(klass);
- proc->key = "dalvik35";
proc->desc = "Dalvik Virtual Machine v35";
+ proc->get_key = (get_processor_key_fc)g_dalvik35_processor_get_key;
+
proc->disassemble = (disass_instr_fc)g_dalvik35_processor_disassemble;
}
@@ -186,6 +190,29 @@ GArchProcessor *g_dalvik35_processor_new(void)
/******************************************************************************
* *
+* Paramètres : proc = processeur d'architecture à consulter. *
+* *
+* Description : Fournit la désignation interne du processeur d'architecture. *
+* *
+* Retour : Simple chaîne de caractères. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static char *g_dalvik35_processor_get_key(const GDalvik35Processor *proc)
+{
+ char *result; /* Désignation à renvoyer */
+
+ result = strdup("dalvik35");
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : proc = architecture visée par la procédure. *
* ctx = contexte lié à l'exécution du processeur. *
* content = flux de données à analyser. *
diff --git a/plugins/pychrysalide/arch/processor.c b/plugins/pychrysalide/arch/processor.c
index 379df02..f04929e 100644
--- a/plugins/pychrysalide/arch/processor.c
+++ b/plugins/pychrysalide/arch/processor.c
@@ -60,6 +60,9 @@ static void py_arch_processor_init_ginstance(GArchProcessor *, GArchProcessor *)
/* Initialise une instance sur la base du dérivé de GObject. */
static int py_arch_processor_init(PyObject *, PyObject *, PyObject *);
+/* Fournit la désignation interne du processeur d'architecture. */
+static char *py_arch_processor_get_key_wrapper(const GArchProcessor *);
+
/* Fournit un contexte propre au processeur d'une architecture. */
static GProcContext *py_arch_processor_get_context_wrapper(const GArchProcessor *);
@@ -225,6 +228,7 @@ static void py_arch_processor_init_gclass(GArchProcessorClass *class, gpointer u
*/
}
+ class->get_key = py_arch_processor_get_key_wrapper;
class->get_ctx = py_arch_processor_get_context_wrapper;
class->disassemble = py_arch_processor_disassemble_wrapper;
@@ -313,6 +317,68 @@ static int py_arch_processor_init(PyObject *self, PyObject *args, PyObject *kwds
/******************************************************************************
* *
+* Paramètres : proc = processeur d'architecture à consulter. *
+* *
+* Description : Fournit la désignation interne du processeur d'architecture. *
+* *
+* Retour : Simple chaîne de caractères. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static char *py_arch_processor_get_key_wrapper(const GArchProcessor *proc)
+{
+ char *result; /* Désignation à renvoyer */
+ PyGILState_STATE gstate; /* Sauvegarde d'environnement */
+ PyObject *pyobj; /* Objet Python concerné */
+ PyObject *pykey; /* Clef en objet Python */
+ int ret; /* Bilan d'une conversion */
+ GArchProcessorClass *class; /* Classe de l'objet courant */
+ GArchProcessorClass *parent; /* Classe parente */
+
+ result = NULL;
+
+ gstate = PyGILState_Ensure();
+
+ pyobj = pygobject_new(G_OBJECT(proc));
+
+ if (has_python_method(pyobj, "_get_key"))
+ {
+ pykey = run_python_method(pyobj, "_get_key", NULL);
+
+ if (pykey != NULL)
+ {
+ ret = PyUnicode_Check(pykey);
+
+ if (ret)
+ result = strdup(PyUnicode_AsUTF8(pykey));
+
+ Py_DECREF(pykey);
+
+ }
+
+ }
+
+ else
+ {
+ class = G_ARCH_PROCESSOR_GET_CLASS(proc);
+ parent = g_type_class_peek_parent(class);
+
+ if (parent->get_key != NULL)
+ result = parent->get_key(proc);
+
+ }
+
+ PyGILState_Release(gstate);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : proc = architecture visée par la procédure. *
* *
* Description : Fournit un contexte propre au processeur d'une architecture. *
diff --git a/src/arch/processor-int.h b/src/arch/processor-int.h
index 821ce06..34ba66a 100644
--- a/src/arch/processor-int.h
+++ b/src/arch/processor-int.h
@@ -33,6 +33,9 @@
#define COV_ALLOC_BLOCK 100
+/* Fournit la désignation interne du processeur d'architecture. */
+typedef char * (* get_processor_key_fc) (const GArchProcessor *);
+
/* Fournit un contexte propre au processeur d'une architecture. */
typedef GProcContext * (* get_processor_context_fc) (const GArchProcessor *);
@@ -92,7 +95,6 @@ struct _GArchProcessorClass
{
GObjectClass parent; /* A laisser en premier */
- const char *key; /* Désignation interne */
const char *desc; /* Description humaine liée */
SourceEndian endianness; /* Boutisme de l'architecture */
@@ -100,7 +102,8 @@ struct _GArchProcessorClass
MemoryDataSize inssize; /* Taille min. d'encodage */
bool virt_space; /* Présence d'espace virtuel ? */
- get_processor_context_fc get_ctx; /* Obtention d'un contexte #1 */
+ get_processor_key_fc get_key; /* Code représentant la classe */
+ get_processor_context_fc get_ctx; /* Obtention d'un contexte */
disass_instr_fc disassemble; /* Traduction en instructions */
diff --git a/src/arch/processor.c b/src/arch/processor.c
index 777b01e..7dbd8eb 100644
--- a/src/arch/processor.c
+++ b/src/arch/processor.c
@@ -282,14 +282,18 @@ static GProcContext *_g_arch_processor_get_context(const GArchProcessor *proc)
* *
******************************************************************************/
-const char *g_arch_processor_get_key(const GArchProcessor *proc)
+char *g_arch_processor_get_key(const GArchProcessor *proc)
{
- const char *result; /* Désignation à renvoyer */
+ char *result; /* Désignation à renvoyer */
GArchProcessorClass *class; /* Classe de l'instance */
class = G_ARCH_PROCESSOR_GET_CLASS(proc);
- result = class->key;
+ if (class->get_key == NULL)
+ result = NULL;
+
+ else
+ result = class->get_key(proc);
return result;
diff --git a/src/arch/processor.h b/src/arch/processor.h
index d3d4623..7edf341 100644
--- a/src/arch/processor.h
+++ b/src/arch/processor.h
@@ -56,7 +56,7 @@ typedef struct _GArchProcessorClass GArchProcessorClass;
GType g_arch_processor_get_type(void);
/* Fournit la désignation interne du processeur d'architecture. */
-const char *g_arch_processor_get_key(const GArchProcessor *);
+char *g_arch_processor_get_key(const GArchProcessor *);
/* Fournit le nom humain de l'architecture visée. */
const char *g_arch_processor_get_desc(const GArchProcessor *);
diff --git a/src/core/processors.c b/src/core/processors.c
index 224e9f7..7234365 100644
--- a/src/core/processors.c
+++ b/src/core/processors.c
@@ -98,33 +98,41 @@ bool register_processor_type(GType type)
{
bool result; /* Bilan à retourner */
GArchProcessor *proc; /* Instance pour consultation */
- const char *key; /* Désignation associée */
+ char *key; /* Désignation associée */
proc_t *new; /* Nouvel élément à définir */
+ result = false;
+
proc = g_object_new(type, NULL);
key = g_arch_processor_get_key(proc);
+ if (key == NULL) goto done;
+
+ result = (key != NULL);
+
G_LOCK(_pdef_access);
new = find_processor_by_key(key);
- result = (new == NULL);
-
- if (result)
+ if (new == NULL)
{
_processors_definitions = realloc(_processors_definitions,
++_processors_definitions_count * sizeof(proc_t));
new = &_processors_definitions[_processors_definitions_count - 1];
- new->key = strdup(key);
+ new->key = key;
new->type = type;
+ result = true;
+
}
G_UNLOCK(_pdef_access);
+ done:
+
g_object_unref(G_OBJECT(proc));
return result;