diff options
Diffstat (limited to 'src/analysis/routine.c')
-rw-r--r-- | src/analysis/routine.c | 173 |
1 files changed, 117 insertions, 56 deletions
diff --git a/src/analysis/routine.c b/src/analysis/routine.c index c26886f..a21b6e7 100644 --- a/src/analysis/routine.c +++ b/src/analysis/routine.c @@ -723,6 +723,90 @@ size_t g_binary_routine_get_var_index_from_offset(const GBinRoutine *routine, si * * * Paramètres : routine = routine à consulter. * * * +* Description : Fournit les instructions natives correspondantes. * +* * +* Retour : Ensemble d'instructions décompilées ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GArchInstruction *g_binary_routine_get_instructions(const GBinRoutine *routine) +{ + return routine->instr; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à mettre à jour. * +* instr = série d'instructions à conserver. * +* * +* Description : Définit les instructions natives de la routine. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_routine_set_instructions(GBinRoutine *routine, GArchInstruction *instr) +{ + if (routine->instr != NULL) + g_object_unref(G_OBJECT(routine->instr)); + + routine->instr = instr; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à consulter. * +* * +* Description : Fournit les instructions décompilées correspondantes. * +* * +* Retour : Ensemble d'instructions décompilées ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GDecInstruction *g_binary_routine_get_decomp_instructions(const GBinRoutine *routine) +{ + return routine->dinstr; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à mettre à jour. * +* instr = série d'instructions à conserver. * +* * +* Description : Définit les instructions décompilées de la routine. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_binary_routine_set_decomp_instructions(GBinRoutine *routine, GDecInstruction *instr) +{ + if (routine->dinstr != NULL) + g_object_unref(G_OBJECT(routine->dinstr)); + + routine->dinstr = instr; + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine à consulter. * +* * * Description : Décrit le prototype de la routine sous forme de caractères. * * * * Retour : Chaîne de caractères à libérer de la mémoire. * @@ -803,84 +887,61 @@ char *_g_binary_routine_to_string(const GBinRoutine *routine, Routine2StringOpti /****************************************************************************** * * -* Paramètres : routine = routine à consulter. * +* Paramètres : routine = routine à afficher. * +* lang = langage à utiliser pour la sortie humaine. * +* buffer = tampon mis à disposition pour la sortie. * * * -* Description : Fournit les instructions natives correspondantes. * +* Description : Procède à l'impression de la description d'une routine. * * * -* Retour : Ensemble d'instructions décompilées ou NULL. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GArchInstruction *g_binary_routine_get_instructions(const GBinRoutine *routine) +void g_binary_routine_output_info(const GBinRoutine *routine, GLangOutput *lang, GCodeBuffer *buffer) { - return routine->instr; + GBufferLine *line; /* Adresse d'une ligne nouvelle*/ + const char *name; /* Nom humain de la routine */ + size_t len; /* Taille de ce nom */ + size_t i; /* Boucle de parcours */ -} + /* Type de retour */ + line = g_lang_output_start_routine_info(lang, buffer); -/****************************************************************************** -* * -* Paramètres : routine = routine à mettre à jour. * -* instr = série d'instructions à conserver. * -* * -* Description : Définit les instructions natives de la routine. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ + g_data_type_output(routine->ret_type, lang, line, true, false); -void g_binary_routine_set_instructions(GBinRoutine *routine, GArchInstruction *instr) -{ - if (routine->instr != NULL) - g_object_unref(G_OBJECT(routine->instr)); + g_buffer_line_insert_text(line, BLC_LAST_USED, " ", 1, RTT_COMMENT); - routine->instr = instr; + /* Nom de la routine */ -} + name = g_binary_routine_get_name(routine); + if (name != NULL) len = strlen(name); + else + { + name = "???"; + len = 3; + } + g_buffer_line_insert_text(line, BLC_LAST_USED, name, len, RTT_COMMENT); -/****************************************************************************** -* * -* Paramètres : routine = routine à consulter. * -* * -* Description : Fournit les instructions décompilées correspondantes. * -* * -* Retour : Ensemble d'instructions décompilées ou NULL. * -* * -* Remarques : - * -* * -******************************************************************************/ + /* Arguments éventuels... */ -GDecInstruction *g_binary_routine_get_decomp_instructions(const GBinRoutine *routine) -{ - return routine->dinstr; + g_buffer_line_insert_text(line, BLC_LAST_USED, "(", 1, RTT_COMMENT); -} + for (i = 0; i < routine->args_count; i++) + { + if (i > 0) + g_buffer_line_insert_text(line, BLC_LAST_USED, ", ", 2, RTT_COMMENT); + g_binary_variable_output(routine->args[i], lang, line, true, false); -/****************************************************************************** -* * -* Paramètres : routine = routine à mettre à jour. * -* instr = série d'instructions à conserver. * -* * -* Description : Définit les instructions décompilées de la routine. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ + } -void g_binary_routine_set_decomp_instructions(GBinRoutine *routine, GDecInstruction *instr) -{ - if (routine->dinstr != NULL) - g_object_unref(G_OBJECT(routine->dinstr)); + g_buffer_line_insert_text(line, BLC_LAST_USED, ")", 1, RTT_COMMENT); - routine->dinstr = instr; + //g_lang_output_end_routine_prototype(lang, buffer, line); } |