diff options
Diffstat (limited to 'src/analysis/disass/block.c')
-rw-r--r-- | src/analysis/disass/block.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/analysis/disass/block.c b/src/analysis/disass/block.c index 8da671b..8cdbc8f 100644 --- a/src/analysis/disass/block.c +++ b/src/analysis/disass/block.c @@ -875,3 +875,49 @@ void g_basic_block_get_boundaries(const GBasicBlock *block, GArchInstruction **f } } + + +/****************************************************************************** +* * +* Paramètres : block = bloc d'instructions à consulter. * +* proc = processeur contenant l'ensemble des instructions. * +* * +* Description : Fournit un itérateur d'instructions limité au bloc basique. * +* * +* Retour : Itérateur mis en place ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +instr_iter_t *g_basic_block_get_iterator(const GBasicBlock *block, GArchProcessor *proc) +{ + instr_iter_t *result; /* Itérateur à renvoyer */ + const mrange_t *first_range; /* Emplacement d'instruction #1*/ + const vmpa2t *first_addr; /* Point de départ associé */ + const mrange_t *last_range; /* Emplacement d'instruction #2*/ + phys_t length; /* Taille de la couverture */ + mrange_t range; /* Couverture du bloc */ + + first_range = g_arch_instruction_get_range(block->first); + + first_addr = get_mrange_addr(first_range); + + result = g_arch_processor_get_iter_from_address(proc, first_addr); + + if (result != NULL) + { + last_range = g_arch_instruction_get_range(block->last); + + length = compute_vmpa_diff(first_addr, get_mrange_addr(last_range)); + length += get_mrange_length(last_range); + + init_mrange(&range, first_addr, length); + + restrict_instruction_iterator(result, &range); + + } + + return result; + +} |