diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-07-31 05:53:06 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-07-31 05:53:06 (GMT) |
commit | a5d8e3fc30cda2e13d30f099e93ab1b182fdc0bd (patch) | |
tree | cf183906b2301cd3c726af820292fd0f2458bfa1 /src/arch/dalvik/processor.c | |
parent | dc436357ff29158dddd836d368d152d42d5b086b (diff) |
Improved the way code is decoded by avoiding to propagate the base address everywhere.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@385 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/dalvik/processor.c')
-rw-r--r-- | src/arch/dalvik/processor.c | 76 |
1 files changed, 65 insertions, 11 deletions
diff --git a/src/arch/dalvik/processor.c b/src/arch/dalvik/processor.c index e105fcd..fdfb38d 100644 --- a/src/arch/dalvik/processor.c +++ b/src/arch/dalvik/processor.c @@ -55,6 +55,12 @@ static void g_dalvik_processor_class_init(GDalvikProcessorClass *); /* Initialise une instance de processeur de VM Dalvik. */ static void g_dalvik_processor_init(GDalvikProcessor *); +/* Supprime toutes les références externes. */ +static void g_dalvik_processor_dispose(GDalvikProcessor *); + +/* Procède à la libération totale de la mémoire. */ +static void g_dalvik_processor_finalize(GDalvikProcessor *); + /* Fournit un contexte pour l'exécution du processeur Dalvik. */ static GDalvikContext *g_dalvik_processor_get_context(const GDalvikProcessor *); @@ -87,6 +93,17 @@ G_DEFINE_TYPE(GDalvikProcessor, g_dalvik_processor, G_TYPE_ARCH_PROCESSOR); static void g_dalvik_processor_class_init(GDalvikProcessorClass *klass) { + GObjectClass *object; /* Autre version de la classe */ + GArchProcessorClass *proc; /* Encore une autre vision... */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_dalvik_processor_dispose; + object->finalize = (GObjectFinalizeFunc)g_dalvik_processor_finalize; + + proc = G_ARCH_PROCESSOR_CLASS(klass); + + proc->decode = (decode_instruction_fc)g_dalvik_processor_decode_instruction; } @@ -115,7 +132,44 @@ static void g_dalvik_processor_init(GDalvikProcessor *proc) parent->get_ctx = (get_processor_context_fc)g_dalvik_processor_get_context; parent->get_dec_ctx = (get_decomp_context_fc)g_dalvik_processor_get_decomp_context; - parent->decode = (decode_instruction_fc)g_dalvik_processor_decode_instruction; + +} + + +/****************************************************************************** +* * +* Paramètres : proc = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_dalvik_processor_dispose(GDalvikProcessor *proc) +{ + G_OBJECT_CLASS(g_dalvik_processor_parent_class)->dispose(G_OBJECT(proc)); + +} + + +/****************************************************************************** +* * +* Paramètres : bookmark = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_dalvik_processor_finalize(GDalvikProcessor *proc) +{ + G_OBJECT_CLASS(g_dalvik_processor_parent_class)->finalize(G_OBJECT(proc)); } @@ -186,7 +240,7 @@ static GDalvikDContext *g_dalvik_processor_get_decomp_context(const GDalvikProce * Paramètres : proc = architecture visée par la procédure. * * data = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * -* len = taille totale des données à analyser. * +* end = limite des données à analyser. * * addr = adresse virtuelle de l'instruction. * * * * Description : Décode une pseudo-instruction dans un flux de données. * @@ -197,7 +251,7 @@ static GDalvikDContext *g_dalvik_processor_get_decomp_context(const GDalvikProce * * ******************************************************************************/ -static GArchInstruction *g_dalvik_guess_pseudo_instruction(const GDalvikProcessor *proc, const bin_t *data, off_t *pos, off_t len, vmpa_t addr) +static GArchInstruction *g_dalvik_guess_pseudo_instruction(const GDalvikProcessor *proc, const bin_t *data, off_t *pos, off_t end, vmpa_t addr) { GArchInstruction *result; /* Instruction à renvoyer */ off_t tmp; /* Position modifiable */ @@ -208,18 +262,18 @@ static GArchInstruction *g_dalvik_guess_pseudo_instruction(const GDalvikProcesso tmp = *pos; - if (!read_u16(&ident, data, &tmp, len, SRE_LITTLE)) + if (!read_u16(&ident, data, &tmp, end, SRE_LITTLE)) return NULL; switch (ident) { case DPO_PACKED_SWITCH: case DPO_SPARSE_SWITCH: - result = g_dalvik_switch_instr_new(data, pos, len, addr, proc); + result = g_dalvik_switch_instr_new(data, pos, end, addr, proc); break; case DPO_FILL_ARRAY_DATA: - result = g_dalvik_fill_instr_new(data, pos, len, addr, proc); + result = g_dalvik_fill_instr_new(data, pos, end, addr, proc); break; default: @@ -239,7 +293,7 @@ static GArchInstruction *g_dalvik_guess_pseudo_instruction(const GDalvikProcesso * ctx = contexte lié à l'exécution du processeur. * * data = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * -* len = taille totale des données à analyser. * +* end = limite des données à analyser. * * addr = adresse virtuelle de l'instruction. * * format = format du fichier contenant le code. * * * @@ -251,7 +305,7 @@ static GArchInstruction *g_dalvik_guess_pseudo_instruction(const GDalvikProcesso * * ******************************************************************************/ -static GArchInstruction *g_dalvik_processor_decode_instruction(const GDalvikProcessor *proc, GDalvikContext *ctx, const bin_t *data, off_t *pos, off_t len, vmpa_t addr, GDexFormat *format) +static GArchInstruction *g_dalvik_processor_decode_instruction(const GDalvikProcessor *proc, GDalvikContext *ctx, const bin_t *data, off_t *pos, off_t end, vmpa_t addr, GDexFormat *format) { GArchInstruction *result; /* Instruction à renvoyer */ DalvikOpcodes id; /* Identifiant d'instruction */ @@ -480,17 +534,17 @@ static GArchInstruction *g_dalvik_processor_decode_instruction(const GDalvikProc }; /* Pseudo-instruction... */ - result = g_dalvik_guess_pseudo_instruction(proc, data, pos, len, addr); + result = g_dalvik_guess_pseudo_instruction(proc, data, pos, end, addr); /* ... ou instruction classique */ if (result == NULL) { - id = dalvik_guess_next_instruction(data, *pos, len); + id = dalvik_guess_next_instruction(data, *pos, end); if (id != DOP_COUNT) { (*pos)++; - result = decodings[id](data, pos, len, addr, proc, format); + result = decodings[id](data, pos, end, addr, proc, format); } } |