summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-03-15 13:38:22 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-03-15 13:38:22 (GMT)
commit4ad9e532a78401f787f0a8a6742095512b520488 (patch)
tree2b71914a52fc930be78939362b16756efe9caa68 /src/analysis
parenta2b767b244e03f00c6a987bbd9872796ed385f47 (diff)
Avoided to crash when analysing crackmes such as grainne.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@55 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/line.c107
-rw-r--r--src/analysis/line.h25
2 files changed, 128 insertions, 4 deletions
diff --git a/src/analysis/line.c b/src/analysis/line.c
index f5f3d9c..62acb8e 100644
--- a/src/analysis/line.c
+++ b/src/analysis/line.c
@@ -58,6 +58,7 @@ struct _rendering_line
uint64_t offset; /* Position en mémoire/physique*/
RenderingLineType type; /* Type de représentation */
+ RenderingLineFlag flags; /* Extension d'informations */
PangoLayout *layout; /* Moteur de rendu du code/txt */
@@ -169,6 +170,63 @@ void init_rendering_line(rendering_line *line)
}
+/******************************************************************************
+* *
+* Paramètres : line = ligne dont les informations sont à mettre à jour. *
+* flag = extension d'information à ajouter. *
+* *
+* Description : Ajoute une information supplémentaire à une ligne. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void add_rendering_line_flag(rendering_line *line, RenderingLineFlag flag)
+{
+ line->flags |= flag;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : line = ligne dont les informations sont à mettre à jour. *
+* flag = extension d'information à retirer. *
+* *
+* Description : Retire une information supplémentaire sur d'une ligne. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void remove_rendering_line_flag(rendering_line *line, RenderingLineFlag flag)
+{
+ line->flags &= ~flag;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : line = ligne dont les informations sont à mettre à jour. *
+* *
+* Description : Fournit les informations supplémentaires d'une ligne. *
+* *
+* Retour : Extensions d'informations courantes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+RenderingLineFlag get_rendering_line_flags(const rendering_line *line)
+{
+ return line->flags;
+
+}
@@ -236,6 +294,30 @@ void insert_line_into_rendering_lines(rendering_line **lines, rendering_line *li
}
+/******************************************************************************
+* *
+* Paramètres : lines = liste de lignes à parcourir. *
+* offset = position en mémoire ou physique à chercher. *
+* *
+* Description : Recherche une ligne d'après sa position en mémoire/physique. *
+* *
+* Retour : Ligne représentant l'adresse donnée, NULL si aucune trouvée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+rendering_line *find_offset_in_rendering_lines(const rendering_line **lines, uint64_t offset)
+{
+ rendering_line *result;
+
+ dl_list_for_each(result, DLL_HCAST(lines), rendering_line *)
+ if (result->offset == offset) break;
+
+ return result;
+
+}
+
/******************************************************************************
@@ -313,8 +395,10 @@ void get_rendering_line_size(rendering_line *line, int *width, int *height)
* Paramètres : line = adresse de la structure à représenter. *
* drawable = support de rendu pour le dessin. *
* gc = contexte graphique à utiliser. *
-* x = abscisse de la zone de rendu. *
+* x0 = abscisse de la zone de rendu (marge). *
+* x1 = abscisse de la zone de rendu (texte). *
* y = ordonnée de la zone de rendu. *
+* h = hauteur réservée pour la ligne. *
* *
* Description : Procède à l'initialisation des bases d'une représentation. *
* *
@@ -324,9 +408,26 @@ void get_rendering_line_size(rendering_line *line, int *width, int *height)
* *
******************************************************************************/
-void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, gint x, gint y)
+void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h)
{
- gdk_draw_layout(drawable, gc, x, y, line->layout);
+ GdkPixbuf *pixbuf; /* Données utiles au dessin */
+
+ gdk_draw_layout(drawable, gc, x1, y, line->layout);
+
+ if (line->flags & RLF_ENTRY_POINT)
+ pixbuf = gtk_widget_render_icon(mywid, "gtk-go-forward", GTK_ICON_SIZE_MENU, NULL);
+
+ else pixbuf = NULL;
+
+ if (pixbuf != NULL)
+ {
+ gdk_draw_pixbuf(drawable, gc, pixbuf, 0, 0, x0, y,
+ gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf),
+ GDK_RGB_DITHER_NORMAL, 0, 0);
+
+ g_object_unref(pixbuf);
+
+ }
}
diff --git a/src/analysis/line.h b/src/analysis/line.h
index b0635bf..bb628b6 100644
--- a/src/analysis/line.h
+++ b/src/analysis/line.h
@@ -43,6 +43,15 @@ typedef enum _RenderingLineType
} RenderingLineType;
+/* Image à afficher en marge de ligne */
+typedef enum _RenderingLineFlag
+{
+ RLF_NONE = (0 << 0), /* Ligne commune */
+ RLF_ENTRY_POINT = (1 << 0), /* Point d'entrée du prgm. */
+ RLF_BREAK_POINT = (1 << 1) /* Point d'arrêt */
+
+} RenderingLineFlag;
+
/* Passage de paramètres compact */
typedef struct _disass_options
{
@@ -60,6 +69,17 @@ typedef struct _disass_options
typedef struct _rendering_line rendering_line;
+/* Ajoute une information supplémentaire à une ligne. */
+void add_rendering_line_flag(rendering_line *, RenderingLineFlag);
+
+/* Retire une information supplémentaire d'une ligne. */
+void remove_rendering_line_flag(rendering_line *, RenderingLineFlag);
+
+/* Fournit les informations supplémentaires d'une ligne. */
+RenderingLineFlag get_rendering_line_flags(const rendering_line *);
+
+
+
/* Ajoute une ligne à un ensemble existant. */
void add_line_to_rendering_lines(rendering_line **, rendering_line *);
@@ -67,6 +87,9 @@ void add_line_to_rendering_lines(rendering_line **, rendering_line *);
/* Insère une ligne dans un ensemble existant. */
void insert_line_into_rendering_lines(rendering_line **, rendering_line *, bool);
+/* Recherche une ligne d'après sa position en mémoire/physique. */
+rendering_line *find_offset_in_rendering_lines(const rendering_line **, uint64_t);
+
/* Met à jour la nombre d'octets maximale par instruction. */
@@ -79,7 +102,7 @@ void set_rendering_line_max_binary_len(rendering_line *, off_t);
void get_rendering_line_size(rendering_line *, int *, int *);
/* Procède à l'initialisation des bases d'une représentation. */
-void draw_rendering_line(rendering_line *, GdkDrawable *, GdkGC *, gint, gint);
+void draw_rendering_line(rendering_line *, GdkDrawable *, GdkGC *, gint, gint, gint, gint);