From 90e0f7ac04c1622f226dda57a3329b6fe98307e8 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
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 <nocbos@gmail.com>
 
+	* 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 <nocbos@gmail.com>
+
 	* 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