From 90e0f7ac04c1622f226dda57a3329b6fe98307e8 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 10 May 2017 22:44:30 +0200 Subject: Removed the link to binary content used for printing from instructions. --- ChangeLog | 30 +++++++++++++++++++++++++ plugins/ropgadgets/select.c | 2 +- src/analysis/db/items/comment.c | 5 +++-- src/analysis/disass/area.c | 3 --- src/analysis/disass/disassembler.c | 19 ++++++++-------- src/arch/instruction-int.h | 3 +-- src/arch/instruction.c | 46 ++++++++++---------------------------- src/arch/instruction.h | 3 --- src/arch/raw.c | 7 +++--- src/arch/undefined.c | 7 +++--- src/format/symbol.c | 13 ++++++----- src/glibext/gbinportion.c | 5 +++-- src/glibext/gbuffercache.c | 36 ++++++++++++++++++++--------- src/glibext/gbuffercache.h | 2 +- src/glibext/generators/prologue.c | 5 +++-- src/glibext/generators/rborder.c | 5 +++-- src/glibext/linegen-int.h | 2 +- src/glibext/linegen.c | 5 +++-- src/glibext/linegen.h | 3 ++- 19 files changed, 113 insertions(+), 88 deletions(-) diff --git a/ChangeLog b/ChangeLog index 48e8334..39c0db9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,35 @@ 17-05-10 Cyrille Bagard + * plugins/ropgadgets/select.c: + * src/analysis/db/items/comment.c: + * src/analysis/disass/area.c: + * src/analysis/disass/disassembler.c: + Update code. + + * src/arch/instruction-int.h: + * src/arch/instruction.c: + * src/arch/instruction.h: + Remove the link to binary content used for printing from instructions. + + * src/arch/raw.c: + * src/arch/undefined.c: + * src/format/symbol.c: + * src/glibext/gbinportion.c: + Update code. + + * src/glibext/gbuffercache.c: + * src/glibext/gbuffercache.h: + Store the binary content used for printing in buffer caches. + + * src/glibext/generators/prologue.c: + * src/glibext/generators/rborder.c: + * src/glibext/linegen-int.h: + * src/glibext/linegen.c: + * src/glibext/linegen.h: + Update code. + +17-05-10 Cyrille Bagard + * plugins/pychrysa/arch/vmpa.c: Typo. Update code. diff --git a/plugins/ropgadgets/select.c b/plugins/ropgadgets/select.c index 2d8d77d..aa6603f 100644 --- a/plugins/ropgadgets/select.c +++ b/plugins/ropgadgets/select.c @@ -1769,7 +1769,7 @@ static void add_new_gadgets_for_category(GExeFormat *format, GtkComboBoxText *co instr = chain->instrs[j]; line = g_buffer_line_new((mrange_t []){ { { 0 }, 0 } }, BLC_ASSEMBLY); - g_line_generator_print(G_LINE_GENERATOR(instr), line, -1, 0); + g_line_generator_print(G_LINE_GENERATOR(instr), line, -1, 0, content); if (j == 0) { diff --git a/src/analysis/db/items/comment.c b/src/analysis/db/items/comment.c index 3e1c06f..9368291 100644 --- a/src/analysis/db/items/comment.c +++ b/src/analysis/db/items/comment.c @@ -142,7 +142,7 @@ static int g_db_comment_contains_addr(const GDbComment *, const vmpa2t *, size_t static BufferLineFlags g_db_comment_get_flags(const GDbComment *, size_t, size_t); /* Imprime dans une ligne de rendu le contenu représenté. */ -static void g_db_comment_print(GDbComment *, GBufferLine *, size_t, size_t); +static void g_db_comment_print(GDbComment *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -1382,6 +1382,7 @@ static BufferLineFlags g_db_comment_get_flags(const GDbComment *comment, size_t * line = ligne de rendu à compléter. * * index = indice de cette même ligne dans le tampon global. * * repeat = indice d'utilisations successives du générateur. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Imprime dans une ligne de rendu le contenu représenté. * * * @@ -1391,7 +1392,7 @@ static BufferLineFlags g_db_comment_get_flags(const GDbComment *comment, size_t * * ******************************************************************************/ -static void g_db_comment_print(GDbComment *comment, GBufferLine *line, size_t index, size_t repeat) +static void g_db_comment_print(GDbComment *comment, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { char *full; /* Contenu textuel complet */ size_t count; /* Quantité de ces lignes */ diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index ed53b28..f4088e4 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -448,9 +448,6 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction area->instructions[offset] = instr; g_atomic_pointer_add(&area->count, 1); - /* Au passage, association du contenu */ - g_arch_instruction_set_global_content(instr, area->content); - mrimaap_exit: /* Fin des choses sérieuses */ diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c index 0ffcccd..2f6b562 100644 --- a/src/analysis/disass/disassembler.c +++ b/src/analysis/disass/disassembler.c @@ -681,25 +681,28 @@ static void build_disass_prologue(GBufferCache *cache, const GBinFormat *format, void disassemble_binary(GLoadedBinary *binary, GBufferCache **cache, disassembly_ack_fc ack) { GBinFormat *format; /* Format associé au binaire */ - GCodingLanguage *lang; /* Langage de sortie préféré */ GBinContent *content; /* Contenu bianire manipulé */ + GCodingLanguage *lang; /* Langage de sortie préféré */ + const char *desc; /* Désignation du binaire */ const gchar *checksum; /* Identifiant de binaire */ GDelayedDisassembly *disass; /* Désassemblage à mener */ GWorkQueue *queue; /* Gestionnaire de différés */ - *cache = g_buffer_cache_new(); - format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); + content = g_binary_format_get_content(format); + + *cache = g_buffer_cache_new(content); lang = g_asm_language_new(); - content = g_binary_format_get_content(format); + desc = g_binary_content_describe(content, true); checksum = g_binary_content_get_checksum(content); - g_object_unref(G_OBJECT(content)); - g_object_unref(G_OBJECT(format)); + build_disass_prologue(*cache, format, lang, desc, checksum); - build_disass_prologue(*cache, format, lang, g_binary_content_describe(content, true), checksum); + g_object_unref(G_OBJECT(lang)); + g_object_unref(G_OBJECT(content)); + g_object_unref(G_OBJECT(format)); disass = g_delayed_disassembly_new(binary, *cache); g_signal_connect(disass, "work-completed", G_CALLBACK(ack), binary); @@ -707,6 +710,4 @@ void disassemble_binary(GLoadedBinary *binary, GBufferCache **cache, disassembly queue = get_work_queue(); g_work_queue_schedule_work(queue, G_DELAYED_WORK(disass), DEFAULT_WORK_GROUP); - g_object_unref(G_OBJECT(lang)); - } diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h index b7bd5f3..b62bba7 100644 --- a/src/arch/instruction-int.h +++ b/src/arch/instruction-int.h @@ -38,7 +38,7 @@ typedef const char * (* get_instruction_encoding_fc) (const GArchInstruction *); typedef const char * (* get_instruction_keyword_fc) (GArchInstruction *, AsmSyntax ); /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ -typedef GBufferLine * (* print_instruction_fc) (const GArchInstruction *, GBufferLine *, size_t, size_t); +typedef GBufferLine * (* print_instruction_fc) (const GArchInstruction *, GBufferLine *, size_t, size_t, const GBinContent *); /* Liste les registres lus et écrits par l'instruction. */ typedef void (* get_instruction_rw_regs_fc) (const GArchInstruction *, GArchRegister ***, size_t *, GArchRegister ***, size_t *); @@ -52,7 +52,6 @@ struct _GArchInstruction const instr_hook_fc *hooks; /* Traitements complémentaires */ - const GBinContent *content; /* Contenu binaire global */ mrange_t range; /* Emplacement en mémoire */ flat_array_t *operands; /* Liste des opérandes */ diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 807bbbb..dd5b019 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -71,10 +71,10 @@ static int g_arch_instruction_contains_addr(const GArchInstruction *, const vmpa static BufferLineFlags g_arch_instruction_get_flags2(const GArchInstruction *, size_t, size_t); /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ -static void _g_arch_instruction_print(GArchInstruction *, GBufferLine *, size_t, size_t); +static void _g_arch_instruction_print(GArchInstruction *, GBufferLine *, size_t, size_t, const GBinContent *); /* Imprime dans une ligne de rendu le contenu représenté. */ -static void g_arch_instruction_print(GArchInstruction *, GBufferLine *, size_t, size_t); +static void g_arch_instruction_print(GArchInstruction *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -191,9 +191,6 @@ static void g_arch_instruction_generator_interface_init(GLineGeneratorInterface static void g_arch_instruction_dispose(GArchInstruction *instr) { - if (instr->content != NULL) - g_object_unref(G_OBJECT(instr->content)); - G_OBJECT_CLASS(g_arch_instruction_parent_class)->dispose(G_OBJECT(instr)); } @@ -328,27 +325,6 @@ void g_arch_instruction_call_hook(GArchInstruction *instr, InstrProcessHook type /****************************************************************************** * * * Paramètres : instr = instruction quelconque à modifier. * -* content = contenu binaire global à référencer. * -* * -* Description : Note le contenu du sein duquel l'instruction est issue. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_arch_instruction_set_global_content(GArchInstruction *instr, const GBinContent *content) -{ - g_object_ref(G_OBJECT(content)); - instr->content = content; - -} - - -/****************************************************************************** -* * -* Paramètres : instr = instruction quelconque à modifier. * * address = adresse virtuelle et/ou position physique. * * length = taille de l'instruction. * * * @@ -1155,6 +1131,7 @@ static BufferLineFlags g_arch_instruction_get_flags2(const GArchInstruction *ins * msize = taille idéale des positions et adresses; * * content = contenu binaire global à venir lire. * * syntax = type de représentation demandée. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. * * * @@ -1164,7 +1141,7 @@ static BufferLineFlags g_arch_instruction_get_flags2(const GArchInstruction *ins * * ******************************************************************************/ -static void _g_arch_instruction_print(GArchInstruction *instr, GBufferLine *line, size_t index, size_t repeat) +static void _g_arch_instruction_print(GArchInstruction *instr, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { const char *key; /* Mot clef principal */ size_t klen; /* Taille de ce mot clef */ @@ -1174,7 +1151,7 @@ static void _g_arch_instruction_print(GArchInstruction *instr, GBufferLine *line g_buffer_line_fill_vmpa(line, get_mrange_addr(&instr->range), MDS_32_BITS_UNSIGNED, MDS_32_BITS_UNSIGNED); - g_buffer_line_fill_content(line, instr->content, &instr->range, VMPA_NO_PHYSICAL); + g_buffer_line_fill_content(line, content, &instr->range, VMPA_NO_PHYSICAL); /* Instruction proprement dite */ @@ -1214,10 +1191,11 @@ static void _g_arch_instruction_print(GArchInstruction *instr, GBufferLine *line /****************************************************************************** * * -* Paramètres : instr = générateur à utiliser pour l'impression. * -* line = ligne de rendu à compléter. * -* index = indice de cette même ligne dans le tampon global. * -* repeat = indice d'utilisations successives du générateur. * +* Paramètres : instr = générateur à utiliser pour l'impression. * +* line = ligne de rendu à compléter. * +* index = indice de cette même ligne dans le tampon global. * +* repeat = indice d'utilisations successives du générateur. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Imprime dans une ligne de rendu le contenu représenté. * * * @@ -1227,8 +1205,8 @@ static void _g_arch_instruction_print(GArchInstruction *instr, GBufferLine *line * * ******************************************************************************/ -static void g_arch_instruction_print(GArchInstruction *instr, GBufferLine *line, size_t index, size_t repeat) +static void g_arch_instruction_print(GArchInstruction *instr, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { - G_ARCH_INSTRUCTION_GET_CLASS(instr)->print(instr, line, index, repeat); + G_ARCH_INSTRUCTION_GET_CLASS(instr)->print(instr, line, index, repeat, content); } diff --git a/src/arch/instruction.h b/src/arch/instruction.h index 64b8dd5..f508c35 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -107,9 +107,6 @@ void g_arch_instruction_set_hooks(GArchInstruction *, const instr_hook_fc [IPH_C /* Complète un désassemblage accompli pour une instruction. */ void g_arch_instruction_call_hook(GArchInstruction *, InstrProcessHook, GArchProcessor *, GProcContext *, GExeFormat *); -/* Note le contenu du sein duquel l'instruction est issue. */ -void g_arch_instruction_set_global_content(GArchInstruction *, const GBinContent *); - /* Définit la localisation d'une instruction. */ void g_arch_instruction_set_range(GArchInstruction *, const mrange_t *); diff --git a/src/arch/raw.c b/src/arch/raw.c index 9cd77de..4a82aef 100644 --- a/src/arch/raw.c +++ b/src/arch/raw.c @@ -78,7 +78,7 @@ static const char *g_raw_instruction_get_encoding(const GRawInstruction *); static const char *g_raw_instruction_get_keyword(const GRawInstruction *, AsmSyntax); /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ -static void g_raw_instruction_print(GRawInstruction *, GBufferLine *, size_t, size_t); +static void g_raw_instruction_print(GRawInstruction *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -480,6 +480,7 @@ static const char *g_raw_instruction_get_keyword(const GRawInstruction *instr, A * msize = taille idéale des positions et adresses; * * content = contenu binaire global à venir lire. * * syntax = type de représentation demandée. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. * * * @@ -489,7 +490,7 @@ static const char *g_raw_instruction_get_keyword(const GRawInstruction *instr, A * * ******************************************************************************/ -static void g_raw_instruction_print(GRawInstruction *instr, GBufferLine *line, size_t index, size_t repeat) +static void g_raw_instruction_print(GRawInstruction *instr, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { GArchInstruction *base; /* Autre version de l'instance */ phys_t max_displayed_len; /* Quantité de code affichée */ @@ -525,7 +526,7 @@ static void g_raw_instruction_print(GRawInstruction *instr, GBufferLine *line, s max_displayed_len /= g_arch_instruction_count_operands(base); } - g_buffer_line_fill_content(line, base->content, &base->range, max_displayed_len); + g_buffer_line_fill_content(line, content, &base->range, max_displayed_len); /* Zone du code d'assemblage */ diff --git a/src/arch/undefined.c b/src/arch/undefined.c index 8741c43..3c76a09 100644 --- a/src/arch/undefined.c +++ b/src/arch/undefined.c @@ -70,7 +70,7 @@ static const char *g_undef_instruction_get_encoding(const GUndefInstruction *); static const char *g_undef_instruction_get_keyword(const GUndefInstruction *, AsmSyntax); /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ -static void g_undef_instruction_print(GUndefInstruction *, GBufferLine *, size_t, size_t); +static void g_undef_instruction_print(GUndefInstruction *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -267,6 +267,7 @@ const char *g_undef_instruction_get_keyword(const GUndefInstruction *instr, AsmS * msize = taille idéale des positions et adresses; * * content = contenu binaire global à venir lire. * * syntax = type de représentation demandée. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Ajoute à un tampon GLib le contenu de l'instance spécifiée. * * * @@ -276,7 +277,7 @@ const char *g_undef_instruction_get_keyword(const GUndefInstruction *instr, AsmS * * ******************************************************************************/ -static void g_undef_instruction_print(GUndefInstruction *instr, GBufferLine *line, size_t index, size_t repeat) +static void g_undef_instruction_print(GUndefInstruction *instr, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { GArchInstruction *base; /* Version de base */ const char *key; /* Mot clef principal */ @@ -286,7 +287,7 @@ static void g_undef_instruction_print(GUndefInstruction *instr, GBufferLine *lin g_buffer_line_fill_vmpa(line, get_mrange_addr(&base->range), MDS_32_BITS_UNSIGNED, MDS_32_BITS_UNSIGNED); - g_buffer_line_fill_content(line, base->content, &base->range, VMPA_NO_PHYSICAL); + g_buffer_line_fill_content(line, content, &base->range, VMPA_NO_PHYSICAL); /* Instruction proprement dite */ diff --git a/src/format/symbol.c b/src/format/symbol.c index 4a44f83..16e54ef 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -97,7 +97,7 @@ static int g_binary_symbol_contains_addr(const GBinSymbol *, const vmpa2t *, siz static BufferLineFlags g_binary_symbol_get_flags(const GBinSymbol *, size_t, size_t); /* Imprime dans une ligne de rendu le contenu représenté. */ -static void g_binary_symbol_print(GBinSymbol *, GBufferLine *, size_t, size_t); +static void g_binary_symbol_print(GBinSymbol *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -858,10 +858,11 @@ static BufferLineFlags g_binary_symbol_get_flags(const GBinSymbol *symbol, size_ /****************************************************************************** * * -* Paramètres : symbol = générateur à utiliser pour l'impression. * -* line = ligne de rendu à compléter. * -* index = indice de cette même ligne dans le tampon global. * -* repeat = indice d'utilisations successives du générateur. * +* Paramètres : symbol = générateur à utiliser pour l'impression. * +* line = ligne de rendu à compléter. * +* index = indice de cette même ligne dans le tampon global. * +* repeat = indice d'utilisations successives du générateur. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Imprime dans une ligne de rendu le contenu représenté. * * * @@ -871,7 +872,7 @@ static BufferLineFlags g_binary_symbol_get_flags(const GBinSymbol *symbol, size_ * * ******************************************************************************/ -static void g_binary_symbol_print(GBinSymbol *symbol, GBufferLine *line, size_t index, size_t repeat) +static void g_binary_symbol_print(GBinSymbol *symbol, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { const mrange_t *range; /* Emplacement à manipuler */ const char *label; /* Etiquette à insérer */ diff --git a/src/glibext/gbinportion.c b/src/glibext/gbinportion.c index b94b0f6..4a54a9e 100644 --- a/src/glibext/gbinportion.c +++ b/src/glibext/gbinportion.c @@ -111,7 +111,7 @@ static int g_binary_portion_contains_addr(const GBinPortion *, const vmpa2t *, s static BufferLineFlags g_binary_portion_get_flags(const GBinPortion *, size_t, size_t); /* Imprime dans une ligne de rendu le contenu représenté. */ -static void g_binary_portion_print(GBinPortion *, GBufferLine *, size_t, size_t); +static void g_binary_portion_print(GBinPortion *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -1066,6 +1066,7 @@ static BufferLineFlags g_binary_portion_get_flags(const GBinPortion *portion, si * line = ligne de rendu à compléter. * * index = indice de cette même ligne dans le tampon global. * * repeat = indice d'utilisations successives du générateur. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Imprime dans une ligne de rendu le contenu représenté. * * * @@ -1075,7 +1076,7 @@ static BufferLineFlags g_binary_portion_get_flags(const GBinPortion *portion, si * * ******************************************************************************/ -static void g_binary_portion_print(GBinPortion *portion, GBufferLine *line, size_t index, size_t repeat) +static void g_binary_portion_print(GBinPortion *portion, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { assert(repeat < portion->lcount); diff --git a/src/glibext/gbuffercache.c b/src/glibext/gbuffercache.c index 926d034..fd7c987 100644 --- a/src/glibext/gbuffercache.c +++ b/src/glibext/gbuffercache.c @@ -84,7 +84,7 @@ static void get_cache_info_addr(const cache_info *, size_t, gint, vmpa2t *); static void on_line_ref_toggle(cache_info *, GBufferLine *, gboolean); /* Fournit la ligne de tampon correspondant aux générateurs. */ -static GBufferLine *get_cache_info_line(cache_info *, size_t); +static GBufferLine *get_cache_info_line(cache_info *, size_t, const GBinContent *); /* Force la réinitialisation d'une éventuelle ligne cachée. */ static void _reset_cache_info_line_unlocked(cache_info *); @@ -102,6 +102,8 @@ struct _GBufferCache { GObject parent; /* A laisser en premier */ + const GBinContent *content; /* Contenu binaire global */ + cache_info *lines; /* Liste des lignes intégrées */ size_t count; /* Quantité en cache */ size_t used; /* Quantité utilisée */ @@ -410,8 +412,9 @@ static void on_line_ref_toggle(cache_info *info, GBufferLine *line, gboolean las /****************************************************************************** * * -* Paramètres : info = informations sur une ligne à venir manipuler. * -* index = indice de la ligne à constituer. * +* Paramètres : info = informations sur une ligne à venir manipuler. * +* index = indice de la ligne à constituer. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Fournit la ligne de tampon correspondant aux générateurs. * * * @@ -421,7 +424,7 @@ static void on_line_ref_toggle(cache_info *info, GBufferLine *line, gboolean las * * ******************************************************************************/ -static GBufferLine *get_cache_info_line(cache_info *info, size_t index) +static GBufferLine *get_cache_info_line(cache_info *info, size_t index, const GBinContent *content) { GBufferLine *result; /* Construction à retourner */ size_t i; /* Boucle de parcours */ @@ -437,11 +440,13 @@ static GBufferLine *get_cache_info_line(cache_info *info, size_t index) g_object_add_toggle_ref(G_OBJECT(result), (GToggleNotify)on_line_ref_toggle, info); if (info->count == 1) - g_line_generator_print(info->generator.instance, result, index, info->generator.repeat); + g_line_generator_print(info->generator.instance, result, index, + info->generator.repeat, content); else for (i = 0; i < info->count; i++) - g_line_generator_print(info->generators[i].instance, result, index, info->generators[i].repeat); + g_line_generator_print(info->generators[i].instance, result, index, + info->generators[i].repeat, content); info->line = result; @@ -590,6 +595,9 @@ static void g_buffer_cache_dispose(GBufferCache *cache) cache_info *info; /* Accès directe à une ligne */ size_t j; /* Boucle de parcours #2 */ + if (cache->content != NULL) + g_object_unref(G_OBJECT(cache->content)); + for (i = 0; i < cache->used; i++) { info = &cache->lines[i]; @@ -649,7 +657,7 @@ static void g_buffer_cache_finalize(GBufferCache *cache) /****************************************************************************** * * -* Paramètres : - * +* Paramètres : content = éventuel contenu binaire brut à référencer. * * * * Description : Crée un nouveau composant de tampon pour code désassemblé. * * * @@ -659,12 +667,18 @@ static void g_buffer_cache_finalize(GBufferCache *cache) * * ******************************************************************************/ -GBufferCache *g_buffer_cache_new(void) +GBufferCache *g_buffer_cache_new(const GBinContent *content) { GBufferCache *result; /* Composant à retourner */ result = g_object_new(G_TYPE_BUFFER_CACHE, NULL); + if (content != NULL) + { + result->content = content; + g_object_ref(G_OBJECT(content)); + } + return result; } @@ -1325,7 +1339,7 @@ GBufferLine *g_buffer_cache_find_line_by_index(const GBufferCache *cache, size_t GBufferLine *result; /* Ligne trouvée à retourner */ if (index < cache->used) - result = get_cache_info_line(&cache->lines[index], index); + result = get_cache_info_line(&cache->lines[index], index, cache->content); else result = NULL; @@ -1352,7 +1366,7 @@ void g_buffer_cache_collect_widths(GBufferCache *cache, size_t index, line_width { GBufferLine *line; /* Ligne éphémère à mesurer */ - line = get_cache_info_line(&cache->lines[index], index); + line = get_cache_info_line(&cache->lines[index], index, cache->content); g_buffer_line_collect_widths(line, summary); @@ -1416,7 +1430,7 @@ void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, s if (i == first || (g_buffer_cache_get_line_flags(cache, i) & BLF_WIDTH_MANAGER)) g_width_tracker_get_local_width_summary(cache->tracker, i, &summary); - line = get_cache_info_line(info, i); + line = get_cache_info_line(info, i, cache->content); g_buffer_line_draw(line, cr, &summary, class->text_pos, y, display, list); diff --git a/src/glibext/gbuffercache.h b/src/glibext/gbuffercache.h index 85477e1..061d1b1 100644 --- a/src/glibext/gbuffercache.h +++ b/src/glibext/gbuffercache.h @@ -57,7 +57,7 @@ typedef struct _GBufferCacheClass GBufferCacheClass; GType g_buffer_cache_get_type(void); /* Crée un nouveau composant de tampon pour code désassemblé. */ -GBufferCache *g_buffer_cache_new(void); +GBufferCache *g_buffer_cache_new(const GBinContent *); /* Fournit la hauteur d'impression d'une ligne visualisée. */ gint g_buffer_cache_get_line_height(const GBufferCache *); diff --git a/src/glibext/generators/prologue.c b/src/glibext/generators/prologue.c index f88393b..03db327 100644 --- a/src/glibext/generators/prologue.c +++ b/src/glibext/generators/prologue.c @@ -83,7 +83,7 @@ static int g_intro_generator_contains_addr(const GIntroGenerator *, const vmpa2t static BufferLineFlags g_intro_generator_get_flags(const GIntroGenerator *, size_t, size_t); /* Imprime dans une ligne de rendu le contenu représenté. */ -static void g_intro_generator_print(GIntroGenerator *, GBufferLine *, size_t, size_t); +static void g_intro_generator_print(GIntroGenerator *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -336,6 +336,7 @@ static BufferLineFlags g_intro_generator_get_flags(const GIntroGenerator *genera * line = ligne de rendu à compléter. * * index = indice de cette même ligne dans le tampon global.* * repeat = indice d'utilisations successives du générateur. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Imprime dans une ligne de rendu le contenu représenté. * * * @@ -345,7 +346,7 @@ static BufferLineFlags g_intro_generator_get_flags(const GIntroGenerator *genera * * ******************************************************************************/ -static void g_intro_generator_print(GIntroGenerator *generator, GBufferLine *line, size_t index, size_t repeat) +static void g_intro_generator_print(GIntroGenerator *generator, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { assert(repeat < generator->count); diff --git a/src/glibext/generators/rborder.c b/src/glibext/generators/rborder.c index 9a257bb..c1fc88c 100644 --- a/src/glibext/generators/rborder.c +++ b/src/glibext/generators/rborder.c @@ -90,7 +90,7 @@ static int g_border_generator_contains_addr(const GBorderGenerator *, const vmpa static BufferLineFlags g_border_generator_get_flags(const GBorderGenerator *, size_t, size_t); /* Imprime dans une ligne de rendu le contenu représenté. */ -static void g_border_generator_print(GBorderGenerator *, GBufferLine *, size_t, size_t); +static void g_border_generator_print(GBorderGenerator *, GBufferLine *, size_t, size_t, const GBinContent *); @@ -329,6 +329,7 @@ static BufferLineFlags g_border_generator_get_flags(const GBorderGenerator *gene * line = ligne de rendu à compléter. * * index = indice de cette même ligne dans le tampon global.* * repeat = indice d'utilisations successives du générateur. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Imprime dans une ligne de rendu le contenu représenté. * * * @@ -338,7 +339,7 @@ static BufferLineFlags g_border_generator_get_flags(const GBorderGenerator *gene * * ******************************************************************************/ -static void g_border_generator_print(GBorderGenerator *generator, GBufferLine *line, size_t index, size_t repeat) +static void g_border_generator_print(GBorderGenerator *generator, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { char *text; /* Texte principal à insérer */ diff --git a/src/glibext/linegen-int.h b/src/glibext/linegen-int.h index e84b6fd..c5483f4 100644 --- a/src/glibext/linegen-int.h +++ b/src/glibext/linegen-int.h @@ -42,7 +42,7 @@ typedef int (* linegen_contains_fc) (const GLineGenerator *, const vmpa2t *, siz typedef BufferLineFlags (* linegen_get_flags_fc) (const GLineGenerator *, size_t, size_t); /* Imprime dans une ligne de rendu le contenu représenté. */ -typedef void (* linegen_print_fc) (GLineGenerator *, GBufferLine *, size_t, size_t); +typedef void (* linegen_print_fc) (GLineGenerator *, GBufferLine *, size_t, size_t, const GBinContent *); /* Intermédiaire pour la génération de lignes (interface) */ diff --git a/src/glibext/linegen.c b/src/glibext/linegen.c index 1bc5583..52f7269 100644 --- a/src/glibext/linegen.c +++ b/src/glibext/linegen.c @@ -183,6 +183,7 @@ BufferLineFlags g_line_generator_get_flags(const GLineGenerator *generator, size * line = ligne de rendu à compléter. * * index = indice de cette même ligne dans le tampon global.* * repeat = indice d'utilisations successives du générateur. * +* content = éventuel contenu binaire brut à imprimer. * * * * Description : Imprime dans une ligne de rendu le contenu représenté. * * * @@ -192,7 +193,7 @@ BufferLineFlags g_line_generator_get_flags(const GLineGenerator *generator, size * * ******************************************************************************/ -void g_line_generator_print(GLineGenerator *generator, GBufferLine *line, size_t index, size_t repeat) +void g_line_generator_print(GLineGenerator *generator, GBufferLine *line, size_t index, size_t repeat, const GBinContent *content) { GLineGeneratorIface *iface; /* Interface utilisée */ @@ -203,6 +204,6 @@ void g_line_generator_print(GLineGenerator *generator, GBufferLine *line, size_t assert(repeat < g_line_generator_count_lines(generator)); #endif - return iface->print(generator, line, index, repeat); + return iface->print(generator, line, index, repeat, content); } diff --git a/src/glibext/linegen.h b/src/glibext/linegen.h index 56ca945..2045cb8 100644 --- a/src/glibext/linegen.h +++ b/src/glibext/linegen.h @@ -27,6 +27,7 @@ #include "gbufferline.h" +#include "../analysis/content.h" @@ -61,7 +62,7 @@ int g_line_generator_contains_addr(const GLineGenerator *, const vmpa2t *, size_ BufferLineFlags g_line_generator_get_flags(const GLineGenerator *, size_t, size_t); /* Imprime dans une ligne de rendu le contenu représenté. */ -void g_line_generator_print(GLineGenerator *, GBufferLine *, size_t, size_t); +void g_line_generator_print(GLineGenerator *, GBufferLine *, size_t, size_t, const GBinContent *); -- cgit v0.11.2-87-g4458