summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog30
-rw-r--r--plugins/ropgadgets/select.c2
-rw-r--r--src/analysis/db/items/comment.c5
-rw-r--r--src/analysis/disass/area.c3
-rw-r--r--src/analysis/disass/disassembler.c19
-rw-r--r--src/arch/instruction-int.h3
-rw-r--r--src/arch/instruction.c46
-rw-r--r--src/arch/instruction.h3
-rw-r--r--src/arch/raw.c7
-rw-r--r--src/arch/undefined.c7
-rw-r--r--src/format/symbol.c13
-rw-r--r--src/glibext/gbinportion.c5
-rw-r--r--src/glibext/gbuffercache.c36
-rw-r--r--src/glibext/gbuffercache.h2
-rw-r--r--src/glibext/generators/prologue.c5
-rw-r--r--src/glibext/generators/rborder.c5
-rw-r--r--src/glibext/linegen-int.h2
-rw-r--r--src/glibext/linegen.c5
-rw-r--r--src/glibext/linegen.h3
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 *);