From 0794024b412604ae5e5aca0f104b5a8f3ec5412c Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 14 Apr 2020 00:53:32 +0200
Subject: Avoided to look for syscalls in a kernel binary.

---
 plugins/lnxsyscalls/collect.c           |   5 +-
 plugins/lnxsyscalls/core.c              |   5 +-
 plugins/pychrysalide/format/constants.c |  56 +++++++-
 plugins/pychrysalide/format/constants.h |   3 +
 plugins/pychrysalide/format/format.c    | 231 +++++++++++++++++++++++++++-----
 src/format/format-int.h                 |  45 ++++++-
 src/format/format.c                     | 129 ++++++++++++++++++
 src/format/format.h                     |  33 ++++-
 src/format/symbol-int.h                 |   6 +-
 9 files changed, 467 insertions(+), 46 deletions(-)

diff --git a/plugins/lnxsyscalls/collect.c b/plugins/lnxsyscalls/collect.c
index e7db1c7..8726dc2 100644
--- a/plugins/lnxsyscalls/collect.c
+++ b/plugins/lnxsyscalls/collect.c
@@ -129,7 +129,7 @@ static void copy_call_stack(call_stack *dest, const call_stack *src)
 
     }
 
-    dest->iter = copy_instruction_iterator(src->iter);
+    dest->iter = src->iter != NULL ? copy_instruction_iterator(src->iter) : NULL;
     dest->use_current = src->use_current;
 
     dest->skip_syscall = src->skip_syscall;
@@ -339,7 +339,8 @@ static void change_register_tracker_iter(tracked_path *path, size_t sid, GArchPr
     const mrange_t *range;                  /* Couverture d'une instruction*/
     instr_iter_t *iter;                     /* Tête de lecture             */
 
-    delete_instruction_iterator(path->stacks[sid].iter);
+    if (path->stacks[sid].iter != NULL)
+        delete_instruction_iterator(path->stacks[sid].iter);
 
     range = g_arch_instruction_get_range(dest);
     iter = g_arch_processor_get_iter_from_address(proc, get_mrange_addr(range));
diff --git a/plugins/lnxsyscalls/core.c b/plugins/lnxsyscalls/core.c
index 02e109d..314f89f 100644
--- a/plugins/lnxsyscalls/core.c
+++ b/plugins/lnxsyscalls/core.c
@@ -114,11 +114,12 @@ G_MODULE_EXPORT void chrysalide_plugin_process_binary_disassembly(const GPluginM
 
     format = G_BIN_FORMAT(g_loaded_binary_get_format(binary));
 
-    goto pbd_exit;
+    if (g_binary_format_has_flag(format, FFL_RUN_IN_KERNEL_SPACE))
+        goto pbd_exit;
 
     arch = g_exe_format_get_target_machine(G_EXE_FORMAT(format));
 
-    if (strcmp(arch, "armv7") == 0)
+    if (0 && strcmp(arch, "armv7") == 0)
         hops = get_armv7_hunting_ops();
 
     else
diff --git a/plugins/pychrysalide/format/constants.c b/plugins/pychrysalide/format/constants.c
index a0d71f7..0df7bd4 100644
--- a/plugins/pychrysalide/format/constants.c
+++ b/plugins/pychrysalide/format/constants.c
@@ -25,6 +25,7 @@
 #include "constants.h"
 
 
+#include <format/format.h>
 #include <format/symbol.h>
 
 
@@ -36,7 +37,60 @@
 *                                                                             *
 *  Paramètres  : type = type dont le dictionnaire est à compléter.            *
 *                                                                             *
-*  Description : Définit les constantes pour le format Dex.                   *
+*  Description : Définit les constantes pour les formats binaires.            *
+*                                                                             *
+*  Retour      : true en cas de succès de l'opération, false sinon.           *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool define_binary_format_constants(PyTypeObject *type)
+{
+    bool result;                            /* Bilan à retourner           */
+    PyObject *values;                       /* Groupe de valeurs à établir */
+
+    values = PyDict_New();
+
+    result = add_const_to_group(values, "SPECIFICATION", BFE_SPECIFICATION);
+    if (result) result = add_const_to_group(values, "STRUCTURE", BFE_STRUCTURE);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "BinaryFormatError", values,
+                                            "Flags for error occurring while loading a binary format.");
+
+    values = PyDict_New();
+
+    result = add_const_to_group(values, "NONE", FFL_NONE);
+    if (result) result = add_const_to_group(values, "RUN_IN_KERNEL_SPACE", FFL_RUN_IN_KERNEL_SPACE);
+    if (result) result = add_const_to_group(values, "MASK", FFL_MASK);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "FormatFlag", values,
+                                            "Extra indications for formats.");
+
+ exit:
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : type = type dont le dictionnaire est à compléter.            *
+*                                                                             *
+*  Description : Définit les constantes pour les symboles binaires.           *
 *                                                                             *
 *  Retour      : true en cas de succès de l'opération, false sinon.           *
 *                                                                             *
diff --git a/plugins/pychrysalide/format/constants.h b/plugins/pychrysalide/format/constants.h
index 6515f35..ad7b9a5 100644
--- a/plugins/pychrysalide/format/constants.h
+++ b/plugins/pychrysalide/format/constants.h
@@ -31,6 +31,9 @@
 
 
 
+/* Définit les constantes pour les formats binaires. */
+bool define_binary_format_constants(PyTypeObject *);
+
 /* Définit les constantes pour les symboles binaires. */
 bool define_binary_symbol_constants(PyTypeObject *);
 
diff --git a/plugins/pychrysalide/format/format.c b/plugins/pychrysalide/format/format.c
index a0f8079..6c1d2da 100644
--- a/plugins/pychrysalide/format/format.c
+++ b/plugins/pychrysalide/format/format.c
@@ -31,6 +31,7 @@
 #include <format/format.h>
 
 
+#include "constants.h"
 #include "executable.h"
 #include "symbol.h"
 #include "symiter.h"
@@ -43,6 +44,15 @@
 /* ---------------------------- FORMAT BINAIRE GENERIQUE ---------------------------- */
 
 
+/* Ajoute une information complémentaire à un format. */
+static PyObject *py_binary_format_set_flag(PyObject *, PyObject *);
+
+/* Retire une information complémentaire à un format. */
+static PyObject *py_binary_format_unset_flag(PyObject *, PyObject *);
+
+/* Détermine si un format possède un fanion particulier. */
+static PyObject *py_binary_format_has_flag(PyObject *, PyObject *);
+
 /* Assure l'interprétation d'un format en différé. */
 static PyObject *py_binary_format_analyze(PyObject *, PyObject *, PyObject *);
 
@@ -67,6 +77,9 @@ static PyObject *py_binary_format_find_next_symbol_at(PyObject *, PyObject *);
 /* Recherche le symbole correspondant à une adresse. */
 static PyObject *py_binary_format_resolve_symbol(PyObject *, PyObject *);
 
+/* Fournit les particularités du format. */
+static PyObject *py_binary_format_get_flags(PyObject *, void *);
+
 /* Indique la désignation interne du format. */
 static PyObject *py_binary_format_get_name(PyObject *, void *);
 
@@ -95,9 +108,6 @@ static PyObject *py_binary_format_get_errors(PyObject *, void *);
 
 
 
-/* Définit les constantes pour les types d'erreurs. */
-static bool define_python_binary_format_constants(PyTypeObject *);
-
 
 
 /* ---------------------------------------------------------------------------------- */
@@ -107,6 +117,152 @@ static bool define_python_binary_format_constants(PyTypeObject *);
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : self = serveur à manipuler.                                  *
+*                args = arguments d'appel non utilisés ici.                   *
+*                                                                             *
+*  Description : Ajoute une information complémentaire à un format.           *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_binary_format_set_flag(PyObject *self, PyObject *args)
+{
+    PyObject *result;                       /* Bilan à retourner           */
+    unsigned int flag;                      /* Propriété à traiter         */
+    int ret;                                /* Bilan de lecture des args.  */
+    GBinFormat *format;                     /* Elément à manipuler         */
+    bool status;                            /* Bilan de l'opération        */
+
+#define BINARY_FORMAT_SET_FLAG_METHOD PYTHON_METHOD_DEF             \
+(                                                                   \
+    set_flag, "$self, flag, /",                                     \
+    METH_VARARGS, py_binary_format,                                 \
+    "Add a property from a binary format.\n"                        \
+    "\n"                                                            \
+    "This property is one of the values listed in the"              \
+    " of pychrysalide.format.BinFormat.FormatFlag enumeration.\n"   \
+    "\n"                                                            \
+    "If the flag was not set before the operation, True is"         \
+    " returned, else the result is False."                          \
+)
+
+    ret = PyArg_ParseTuple(args, "I", &flag);
+    if (!ret) return NULL;
+
+    format = G_BIN_FORMAT(pygobject_get(self));
+
+    status = g_binary_format_set_flag(format, flag);
+
+    result = status ? Py_True : Py_False;
+    Py_INCREF(result);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : self = serveur à manipuler.                                  *
+*                args = arguments d'appel non utilisés ici.                   *
+*                                                                             *
+*  Description : Retire une information complémentaire à un format.           *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_binary_format_unset_flag(PyObject *self, PyObject *args)
+{
+    PyObject *result;                       /* Bilan à retourner           */
+    unsigned int flag;                      /* Propriété à traiter         */
+    int ret;                                /* Bilan de lecture des args.  */
+    GBinFormat *format;                     /* Elément à manipuler         */
+    bool status;                            /* Bilan de l'opération        */
+
+#define BINARY_FORMAT_UNSET_FLAG_METHOD PYTHON_METHOD_DEF           \
+(                                                                   \
+    unset_flag, "$self, flag, /",                                   \
+    METH_VARARGS, py_binary_format,                                 \
+    "Remove a property from a binary format.\n"                     \
+    "\n"                                                            \
+    "This property is one of the values listed in the"              \
+    " of pychrysalide.format.BinFormat.FormatFlag enumeration.\n"   \
+    "\n"                                                            \
+    "If the flag was not set before the operation, False is"        \
+    " returned, else the result is True."                           \
+)
+
+    ret = PyArg_ParseTuple(args, "I", &flag);
+    if (!ret) return NULL;
+
+    format = G_BIN_FORMAT(pygobject_get(self));
+
+    status = g_binary_format_unset_flag(format, flag);
+
+    result = status ? Py_True : Py_False;
+    Py_INCREF(result);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : self = serveur à manipuler.                                  *
+*                args = arguments d'appel non utilisés ici.                   *
+*                                                                             *
+*  Description : Détermine si un format possède un fanion particulier.        *
+*                                                                             *
+*  Retour      : Bilan de la détection.                                       *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_binary_format_has_flag(PyObject *self, PyObject *args)
+{
+    PyObject *result;                       /* Bilan à retourner           */
+    unsigned int flag;                      /* Propriété à traiter         */
+    int ret;                                /* Bilan de lecture des args.  */
+    GBinFormat *format;                     /* Elément à manipuler         */
+    bool status;                            /* Bilan de l'opération        */
+
+#define BINARY_FORMAT_HAS_FLAG_METHOD PYTHON_METHOD_DEF             \
+(                                                                   \
+    has_flag, "$self, flag, /",                                     \
+    METH_VARARGS, py_binary_format,                                 \
+    "Test if a binary format has a given property.\n"               \
+    "\n"                                                            \
+    "This property is one of the values listed in the"              \
+    " of pychrysalide.format.BinFormat.FormatFlag enumeration.\n"   \
+    "\n"                                                            \
+    "The result is a boolean value."                                \
+)
+
+    ret = PyArg_ParseTuple(args, "I", &flag);
+    if (!ret) return NULL;
+
+    format = G_BIN_FORMAT(pygobject_get(self));
+
+    status = g_binary_format_has_flag(format, flag);
+
+    result = status ? Py_True : Py_False;
+    Py_INCREF(result);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : self = contenu binaire à manipuler.                          *
 *                args = arguments fournis à l'appel.                          *
 *                kwds = arguments de type key=val fournis.                    *
@@ -453,6 +609,42 @@ static PyObject *py_binary_format_resolve_symbol(PyObject *self, PyObject *args)
 *  Paramètres  : self    = objet Python concerné par l'appel.                 *
 *                closure = non utilisé ici.                                   *
 *                                                                             *
+*  Description : Fournit les particularités du format.                        *
+*                                                                             *
+*  Retour      : Somme de tous les fanions associés au format.                *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static PyObject *py_binary_format_get_flags(PyObject *self, void *closure)
+{
+    PyObject *result;                       /* Valeur à retourner          */
+    GBinFormat *format;                     /* Elément à consulter         */
+    FormatFlag flags;                       /* Indications complémentaires */
+
+#define BINARY_FORMAT_FLAGS_ATTRIB PYTHON_GET_DEF_FULL          \
+(                                                               \
+    flags, py_binary_format,                                    \
+    "Provide all the flags set for a format. The return value"  \
+    " is of type pychrysalide.format.BinFormat.FormatFlag."     \
+)
+
+    format = G_BIN_FORMAT(pygobject_get(self));
+    flags = g_binary_format_get_flags(format);
+
+    result = cast_with_constants_group_from_type(get_python_binary_format_type(), "FormatFlag", flags);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : self    = objet Python concerné par l'appel.                 *
+*                closure = non utilisé ici.                                   *
+*                                                                             *
 *  Description : Indique la désignation interne du format.                    *
 *                                                                             *
 *  Retour      : Description du format.                                       *
@@ -674,33 +866,6 @@ static PyObject *py_binary_format_get_errors(PyObject *self, void *closure)
 
 
 
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : obj_type = type dont le dictionnaire est à compléter.        *
-*                                                                             *
-*  Description : Définit les constantes pour les types d'erreurs.             *
-*                                                                             *
-*  Retour      : true en cas de succès de l'opération, false sinon.           *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static bool define_python_binary_format_constants(PyTypeObject *obj_type)
-{
-    bool result;                            /* Bilan à retourner           */
-
-    result = true;
-
-    result &= PyDict_AddULongMacro(obj_type, BFE_SPECIFICATION);
-    result &= PyDict_AddULongMacro(obj_type, BFE_STRUCTURE);
-
-    return result;
-
-}
-
-
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : -                                                            *
@@ -716,6 +881,9 @@ static bool define_python_binary_format_constants(PyTypeObject *obj_type)
 PyTypeObject *get_python_binary_format_type(void)
 {
     static PyMethodDef py_bin_format_methods[] = {
+        BINARY_FORMAT_SET_FLAG_METHOD,
+        BINARY_FORMAT_UNSET_FLAG_METHOD,
+        BINARY_FORMAT_HAS_FLAG_METHOD,
         BINARY_FORMAT_ANALYZE_METHOD,
         {
             "register_code_point", py_binary_format_register_code_point,
@@ -761,6 +929,7 @@ PyTypeObject *get_python_binary_format_type(void)
     };
 
     static PyGetSetDef py_bin_format_getseters[] = {
+        BINARY_FORMAT_FLAGS_ATTRIB,
         {
             "name", py_binary_format_get_name, NULL,
             "Internal name of the binary format.", NULL
@@ -836,7 +1005,7 @@ bool ensure_python_binary_format_is_registered(void)
         if (!register_class_for_pygobject(dict, G_TYPE_BIN_FORMAT, type, &PyGObject_Type))
             return false;
 
-        if (!define_python_binary_format_constants(type))
+        if (!define_binary_format_constants(type))
             return false;
 
     }
diff --git a/src/format/format-int.h b/src/format/format-int.h
index c8f2b1a..4ef9793 100644
--- a/src/format/format-int.h
+++ b/src/format/format-int.h
@@ -29,6 +29,7 @@
 
 
 #include "preload.h"
+#include "../glibext/objhole.h"
 #include "../gtkext/gtkstatusstack.h"
 #include "../mangling/demangler.h"
 
@@ -56,6 +57,18 @@ typedef void (* format_complete_analysis_fc) (GBinFormat *, wgroup_id_t, GtkStat
 /* Rythme des allocations pour les entrées de code */
 #define EXTRA_POINT_BLOCK 20
 
+/* Informations glissées dans la structure GObject de GBinFormat */
+typedef union _fmt_obj_extra
+{
+    struct
+    {
+        FormatFlag flags;                   /* Informations complémentaires*/
+
+    };
+
+    gint lock;                              /* Gestion d'accès aux fanions */
+
+} fmt_obj_extra;
 
 /* Description d'une erreur */
 typedef struct _fmt_error
@@ -67,7 +80,6 @@ typedef struct _fmt_error
 
 } fmt_error;
 
-
 /* Format binaire générique (instance) */
 struct _GBinFormat
 {
@@ -99,8 +111,39 @@ struct _GBinFormat
     gint error_locked;                      /* Statut d'accès à la liste   */
 #endif
 
+#if __SIZEOF_INT__ == __SIZEOF_LONG__
+
+    /**
+     * L'inclusion des informations suivantes dépend de l'architecture.
+     *
+     * Si la structure GObject possède un trou, on remplit de préférence
+     * ce dernier.
+     */
+
+    fmt_obj_extra extra;                    /* Externalisation embarquée   */
+
+#endif
+
 };
 
+/**
+ * Accès aux informations éventuellement déportées.
+ */
+
+#if __SIZEOF_INT__ == __SIZEOF_LONG__
+
+#   define INIT_BIN_FORMAT_EXTRA(fmt) fmt->extra.lock = 0
+
+#   define GET_BIN_FORMAT_EXTRA(fmt) &fmt->extra
+
+#else
+
+#   define INIT_BIN_FORMAT_EXTRA(fmt) INIT_GOBJECT_EXTRA(G_OBJECT(fmt))
+
+#   define GET_BIN_FORMAT_EXTRA(fmt) GET_GOBJECT_EXTRA(G_OBJECT(fmt), fmt_obj_extra)
+
+#endif
+
 /* Format binaire générique (classe) */
 struct _GBinFormatClass
 {
diff --git a/src/format/format.c b/src/format/format.c
index 533d641..2be7d5c 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -123,6 +123,8 @@ static void g_binary_format_class_init(GBinFormatClass *klass)
 
 static void g_binary_format_init(GBinFormat *format)
 {
+    INIT_BIN_FORMAT_EXTRA(format);
+
     g_rw_lock_init(&format->pt_lock);
 
     format->info = g_preload_info_new();
@@ -288,6 +290,133 @@ GBinContent *g_binary_format_get_content(const GBinFormat *format)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : format = format à venir modifier.                            *
+*                flag   = drapeau d'information complémentaire à planter.     *
+*                                                                             *
+*  Description : Ajoute une information complémentaire à un format.           *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool g_binary_format_set_flag(GBinFormat *format, FormatFlag flag)
+{
+    bool result;                            /* Bilan à retourner           */
+    fmt_obj_extra *extra;                   /* Données insérées à modifier */
+
+    extra = GET_BIN_FORMAT_EXTRA(format);
+
+    g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+
+    result = !(extra->flags & flag);
+
+    extra->flags |= flag;
+
+    g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : format = format à venir modifier.                            *
+*                flag   = drapeau d'information complémentaire à planter.     *
+*                                                                             *
+*  Description : Retire une information complémentaire à un format.           *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool g_binary_format_unset_flag(GBinFormat *format, FormatFlag flag)
+{
+    bool result;                            /* Bilan à retourner           */
+    fmt_obj_extra *extra;                   /* Données insérées à modifier */
+
+    extra = GET_BIN_FORMAT_EXTRA(format);
+
+    g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+
+    result = (extra->flags & flag);
+
+    extra->flags &= ~flag;
+
+    g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : format = format à venir consulter.                           *
+*                flag   = drapeau d'information à rechercher.                 *
+*                                                                             *
+*  Description : Détermine si un format possède un fanion particulier.        *
+*                                                                             *
+*  Retour      : Bilan de la détection.                                       *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool g_binary_format_has_flag(const GBinFormat *format, FormatFlag flag)
+{
+    bool result;                            /* Bilan à retourner           */
+    fmt_obj_extra *extra;                   /* Données insérées à modifier */
+
+    extra = GET_BIN_FORMAT_EXTRA(format);
+
+    g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+
+    result = (extra->flags & flag);
+
+    g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : format = format à venir consulter.                           *
+*                                                                             *
+*  Description : Fournit les particularités du format.                        *
+*                                                                             *
+*  Retour      : Somme de tous les fanions associés au format.                *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+FormatFlag g_binary_format_get_flags(const GBinFormat *format)
+{
+    FormatFlag result;                      /* Fanions à retourner         */
+    fmt_obj_extra *extra;                   /* Données insérées à modifier */
+
+    extra = GET_BIN_FORMAT_EXTRA(format);
+
+    g_bit_lock(&extra->lock, HOLE_LOCK_BIT);
+
+    result = (extra->flags & FFL_MASK);
+
+    g_bit_unlock(&extra->lock, HOLE_LOCK_BIT);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : format = description de l'exécutable à consulter.            *
 *                                                                             *
 *  Description : Indique la désignation interne du format.                    *
diff --git a/src/format/format.h b/src/format/format.h
index 626bb8a..f11b1db 100644
--- a/src/format/format.h
+++ b/src/format/format.h
@@ -40,14 +40,23 @@
 /* Depuis ../mangling/demangler.h : Décodeur de désignations générique (instance) */
 typedef struct _GCompDemangler GCompDemangler;
 
+/* Indications supplémentaires liées aux formats */
+typedef enum _FormatFlag
+{
+    FFL_NONE                = (0 << 0),     /* Aucune propriété            */
+    FFL_RUN_IN_KERNEL_SPACE = (1 << 0),     /* Exécution en espace noyau   */
+
+    FFL_MASK                = (1 << 1) - 1, /* Indication de nature        */
 
+} FormatFlag;
 
-#define G_TYPE_BIN_FORMAT               g_binary_format_get_type()
-#define G_BIN_FORMAT(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), g_binary_format_get_type(), GBinFormat))
-#define G_IS_BIN_FORMAT(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_binary_format_get_type()))
-#define G_BIN_FORMAT_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BIN_FORMAT, GBinFormatClass))
-#define G_IS_BIN_FORMAT_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BIN_FORMAT))
-#define G_BIN_FORMAT_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BIN_FORMAT, GBinFormatClass))
+
+#define G_TYPE_BIN_FORMAT            g_binary_format_get_type()
+#define G_BIN_FORMAT(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BIN_FORMAT, GBinFormat))
+#define G_IS_BIN_FORMAT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BIN_FORMAT))
+#define G_BIN_FORMAT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BIN_FORMAT, GBinFormatClass))
+#define G_IS_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BIN_FORMAT))
+#define G_BIN_FORMAT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BIN_FORMAT, GBinFormatClass))
 
 
 /* Format binaire générique (instance) */
@@ -63,6 +72,18 @@ GType g_binary_format_get_type(void);
 /* Fournit une référence vers le contenu binaire analysé. */
 GBinContent *g_binary_format_get_content(const GBinFormat *);
 
+/* Ajoute une information complémentaire à un format. */
+bool g_binary_format_set_flag(GBinFormat *, FormatFlag);
+
+/* Retire une information complémentaire à un format. */
+bool g_binary_format_unset_flag(GBinFormat *, FormatFlag);
+
+/* Détermine si un format possède un fanion particulier. */
+bool g_binary_format_has_flag(const GBinFormat *, FormatFlag);
+
+/* Fournit les particularités du format. */
+FormatFlag g_binary_format_get_flags(const GBinFormat *);
+
 /* Indique la désignation interne du format. */
 const char *g_binary_format_get_name(const GBinFormat *);
 
diff --git a/src/format/symbol-int.h b/src/format/symbol-int.h
index 5e77a4d..99cee88 100644
--- a/src/format/symbol-int.h
+++ b/src/format/symbol-int.h
@@ -34,7 +34,7 @@
 typedef char * (* get_symbol_label_fc) (const GBinSymbol *);
 
 
-/* Informations glissées dans la structure GObject de GArchInstruction */
+/* Informations glissées dans la structure GObject de GBinSymbol */
 typedef union _sym_obj_extra
 {
     struct
@@ -82,9 +82,9 @@ struct _GBinSymbol
 
 #if __SIZEOF_INT__ == __SIZEOF_LONG__
 
-#   define INIT_BIN_SYMBOL_EXTRA(sym) ins->extra.lock = 0
+#   define INIT_BIN_SYMBOL_EXTRA(sym) sym->extra.lock = 0
 
-#   define GET_BIN_SYMBOL_EXTRA(sym) &ins->extra
+#   define GET_BIN_SYMBOL_EXTRA(sym) &sym->extra
 
 #else
 
-- 
cgit v0.11.2-87-g4458