diff options
Diffstat (limited to 'plugins/fmtp')
| -rw-r--r-- | plugins/fmtp/def.h | 18 | ||||
| -rw-r--r-- | plugins/fmtp/parser.c | 39 | ||||
| -rw-r--r-- | plugins/fmtp/parser.h | 2 | 
3 files changed, 47 insertions, 12 deletions
| diff --git a/plugins/fmtp/def.h b/plugins/fmtp/def.h index d69d20a..f1ec7c7 100644 --- a/plugins/fmtp/def.h +++ b/plugins/fmtp/def.h @@ -34,16 +34,24 @@  /** - * Assurément utile pour les déclarations... + * Assurément utile pour les déclarations ou les appels...   */  #define __(s) s +#define PARSING_DEFS(a) a, ARRAY_SIZE(a) +  /**   * Méthodes de définitions des déclarations.   */ +/* Définition générale */ +typedef struct _fmt_field_def fmt_field_def; + +/* Eventuel appel préalable */ +typedef bool (* get_fdef_value_cb) (const fmt_field_def *, GBinContent *, vmpa2t *, SourceEndian, void *); +  /* Possibilités pour un champ à commenter */  typedef struct _field_desc_switch  { @@ -89,10 +97,14 @@ typedef enum _FieldCommentType  } FieldCommentType;  /* Définition générale */ -typedef struct _fmt_field_def +struct _fmt_field_def  {      const char *name;                       /* Nom du champ                */ +    get_fdef_value_cb get_value;            /* Obtention de la valeur      */ + +    bool is_uleb128;                        /* Element de type uleb128     */ +    bool is_leb128;                        /* Element de type sleb128     */      MemoryDataSize size;                    /* Taille d'un élément         */      size_t repeat;                          /* Quantité d'éléments présents*/ @@ -122,7 +134,7 @@ typedef struct _fmt_field_def      } comment; -} fmt_field_def; +};  /* Règles d'affichage */ diff --git a/plugins/fmtp/parser.c b/plugins/fmtp/parser.c index b484a0e..8fc693f 100644 --- a/plugins/fmtp/parser.c +++ b/plugins/fmtp/parser.c @@ -33,8 +33,7 @@  /* Effectue l'interprétation d'une définition de champ. */ -static bool parse_field_definition(const fmt_field_def *, GBinFormat *, vmpa2t *); - +static bool parse_field_definition(const fmt_field_def *, GBinFormat *, vmpa2t *, void *); @@ -43,6 +42,7 @@ static bool parse_field_definition(const fmt_field_def *, GBinFormat *, vmpa2t *  *  Paramètres  : def    = définition de champ à considérer.                   *  *                format = description de l'exécutable à compléter.            *  *                pos    = tête de lecture pour les données.                   * +*                data   = infos complémentaires éventuellement fournies.      *  *                                                                             *  *  Description : Effectue l'interprétation d'une définition de champ.         *  *                                                                             * @@ -52,10 +52,11 @@ static bool parse_field_definition(const fmt_field_def *, GBinFormat *, vmpa2t *  *                                                                             *  ******************************************************************************/ -static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, vmpa2t *pos) +static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, vmpa2t *pos, void *data)  {      GBinContent *content;                   /* Contenu binaire à lire      */      SourceEndian endian;                    /* Boutisme utilisé            */ +    vmpa2t mod;                             /* Position  modifiable        */      bool result;                            /* Bilan à retourner           */      GArchInstruction *instr;                /* Instruction décodée         */      GImmOperand *imm;                       /* Opérande à transformer      */ @@ -74,9 +75,28 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format,      content = g_binary_format_get_content(format);      endian = g_binary_format_get_endianness(format); -    assert(def->repeat > 0); +    if (def->get_value != NULL) +    { +        copy_vmpa(&mod, pos); + +        result = def->get_value(def, content, &mod, endian, data); + +        if (!result) +            goto pfd_exit; + +    } + +    if (def->is_uleb128) +        instr = g_raw_instruction_new_uleb128(content, pos); + +    else if (def->is_leb128) +        instr = g_raw_instruction_new_sleb128(content, pos); -    instr = g_raw_instruction_new_array(content, def->size, def->repeat, pos, endian); +    else +    { +        assert(def->repeat > 0); +        instr = g_raw_instruction_new_array(content, def->size, def->repeat, pos, endian); +    }      result = (instr != NULL); @@ -88,7 +108,9 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format,      if (def->has_display_rules)      { -        assert(def->disp_count <= def->repeat); +        assert((def->is_uleb128 && def->disp_count == 1) +               || (def->is_leb128 && def->disp_count == 1) +               || (!def->is_uleb128 && !def->is_leb128 && def->disp_count <= def->repeat));          for (i = 0; i < def->disp_count; i++)          { @@ -198,6 +220,7 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format,  *                count  = taille de cette liste.                              *  *                format = description de l'exécutable à compléter.            *  *                pos    = tête de lecture pour les données.                   * +*                data   = infos complémentaires éventuellement fournies.      *  *                                                                             *  *  Description : Lance l'interprétation d'une série de définitions de champs. *  *                                                                             * @@ -207,7 +230,7 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format,  *                                                                             *  ******************************************************************************/ -bool parse_field_definitions(const fmt_field_def *defs, size_t count, GBinFormat *format, vmpa2t *pos) +bool parse_field_definitions(const fmt_field_def *defs, size_t count, GBinFormat *format, vmpa2t *pos, void *data)  {      bool result;                            /* Bilan à retourner           */      size_t i;                               /* Boucle de parcours          */ @@ -215,7 +238,7 @@ bool parse_field_definitions(const fmt_field_def *defs, size_t count, GBinFormat      result = true;      for (i = 0; i < count && result; i++) -        result = parse_field_definition(defs + i, format, pos); +        result = parse_field_definition(defs + i, format, pos, data);      return result; diff --git a/plugins/fmtp/parser.h b/plugins/fmtp/parser.h index dcd9bf2..0d5dff3 100644 --- a/plugins/fmtp/parser.h +++ b/plugins/fmtp/parser.h @@ -36,7 +36,7 @@  /* Lance l'interprétation d'une série de définitions de champs. */ -bool parse_field_definitions(const fmt_field_def *, size_t, GBinFormat *, vmpa2t *); +bool parse_field_definitions(const fmt_field_def *, size_t, GBinFormat *, vmpa2t *, void *); | 
