/* Chrysalide - Outil d'analyse de fichiers binaires * instruction.c - gestion des instructions décompilées * * Copyright (C) 2010-2013 Cyrille Bagard * * This file is part of Chrysalide. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #include "instruction.h" #include "instruction-int.h" /* Initialise la classe des instructions décompilées. */ static void g_dec_instruction_class_init(GDecInstructionClass *); /* Initialise une instance d'instruction décompilée. */ static void g_dec_instruction_init(GDecInstruction *); /* Indique le type défini pour une instruction décompilée. */ G_DEFINE_TYPE(GDecInstruction, g_dec_instruction, G_TYPE_OBJECT); /****************************************************************************** * * * Paramètres : klass = classe à initialiser. * * * * Description : Initialise la classe des instructions décompilées. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_dec_instruction_class_init(GDecInstructionClass *klass) { } /****************************************************************************** * * * Paramètres : instr = instance à initialiser. * * * * Description : Initialise une instance d'instruction décompilée. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_dec_instruction_init(GDecInstruction *instr) { DL_LIST_ITEM_INIT(&instr->flow); } /****************************************************************************** * * * Paramètres : instr = première instruction à venir visiter. * * parent = instruction parente. * * callback = procédure à appeler à chaque instruction visitée. * * flags = moments des appels à réaliser en retour. * * data = données quelconques associées au visiteur. * * * * Description : Visite un ensemble hiérarchique d'instructions décompilées. * * * * Retour : true si le parcours a été jusqu'à son terme, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool _g_dec_instruction_visit(GDecInstruction *instr, GDecInstruction *parent, dec_instr_visitor_cb callback, DecInstrVisitFlags flags, void *data) { bool result; /* Bilan à retourner */ result = true; if (flags & DVF_ENTER) result = callback(instr, parent, DVF_ENTER, data); if (result && instr->visit) result = instr->visit(instr, callback, flags, data); if (result && (flags & DVF_EXIT)) result = callback(instr, parent, DVF_EXIT, data); return result; } /****************************************************************************** * * * Paramètres : instr = première instruction à venir ausculter. * * old = instruction décompilée à venir remplacer. * * new = instruction décompilée à utiliser dorénavant. * * * * Description : Remplace une instruction décompilée par une autre. * * * * Retour : true si un remplacement a été effectué, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool g_dec_instruction_replace(GDecInstruction *instr, GDecInstruction *old, GDecInstruction *new) { bool result; /* Bilan à retourner */ if (instr->replace != NULL) result = instr->replace(instr, old, new); else result = false; return result; } /****************************************************************************** * * * Paramètres : instr = instruction à transcrire en version humaine. * * buffer = tampon où doit se réaliser l'insertion. * * line = ligne d'impression prête à emploi ou NULL. * * output = langage de programmation de sortie. * * * * Description : Imprime pour l'écran un version humaine d'une instruction. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ GBufferLine *g_dec_instruction_print(const GDecInstruction *instr, GCodeBuffer *buffer, GBufferLine *line, GLangOutput *output) { return instr->print(instr, buffer, line, output); } /* ---------------------------------------------------------------------------------- */ /* TRAITEMENT DES INSTRUCTIONS PAR ENSEMBLE */ /* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * * Paramètres : list = liste d'instructions à consulter. * * * * Description : Fournit la dernière instruction décompilée de l'ensemble. * * * * Retour : Instruction en queue de liste. * * * * Remarques : - * * * ******************************************************************************/ GDecInstruction *g_dec_instruction_get_last(GDecInstruction *list) { return dinstr_list_last(list); } /****************************************************************************** * * * Paramètres : list = liste d'instructions à compléter, ou NULL. * * instr = nouvelle instruction à intégrer à l'ensemble. * * * * Description : Ajoute une instruction à un ensemble existant. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void g_dec_instruction_add_to_list(GDecInstruction **list, GDecInstruction *instr) { dinstr_list_add_tail(instr, list); } /****************************************************************************** * * * Paramètres : list = liste d'instructions à modifier. * * instr = instruction à faire disparaître. * * * * Description : Supprime une instruction de l'ensemble décompilé. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void g_dec_instruction_delete(GDecInstruction **list, GDecInstruction *instr) { dinstr_list_del(instr, list); } /****************************************************************************** * * * Paramètres : list = liste d'instructions à consulter. * * : iter = position actuelle dans la liste. * * * * Description : Fournit l'élement suivant un autre pour un parcours. * * * * Retour : Elément suivant ou NULL si aucun. * * * * Remarques : - * * * ******************************************************************************/ GDecInstruction *g_dec_instruction_get_next_iter(const GDecInstruction *list, const GDecInstruction *iter) { return dinstr_list_next_iter(iter, list); } /****************************************************************************** * * * Paramètres : list = liste d'instructions à consulter. * * : iter = position actuelle dans la liste. * * * * Description : Fournit l'élement précédant un autre pour un parcours. * * * * Retour : Elément suivant ou NULL si aucun. * * * * Remarques : - * * * ******************************************************************************/ GDecInstruction *g_dec_instruction_get_prev_iter(const GDecInstruction *list, const GDecInstruction *iter) { return dinstr_list_prev_iter(iter, list); }