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 *); |