summaryrefslogtreecommitdiff
path: root/src/format/format.h
blob: 8247478d706ccfebd7dc856a767b9c54ef24d0e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140

/* Chrysalide - Outil d'analyse de fichiers binaires
 * format.h - prototypes pour le support des différents formats binaires
 *
 * Copyright (C) 2009-2017 Cyrille Bagard
 *
 *  This file is part of Chrysalide.
 *
 *  Chrysalide is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Chrysalide is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */


#ifndef _FORMAT_FORMAT_H
#define _FORMAT_FORMAT_H


#include <glib-object.h>
#include <stdbool.h>
#include <sys/types.h>


#include "symbol.h"
#include "../analysis/content.h"
#include "../arch/context.h"
#include "../gtkext/gtkstatusstack.h"



#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))


/* Format binaire générique (instance) */
typedef struct _GBinFormat GBinFormat;

/* Format binaire générique (classe) */
typedef struct _GBinFormatClass GBinFormatClass;


/* Indique le type défini pour un format binaire générique. */
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 *);

/* Indique le boutisme employé par le format binaire analysé. */
SourceEndian g_binary_format_get_endianness(const GBinFormat *);

/* Enregistre une adresse comme début d'une zone de code. */
void g_binary_format_register_code_point(GBinFormat *, virt_t, bool);

/* Intègre dans un contexte les informations tirées d'un format. */
void g_binary_format_preload_disassembling_context(GBinFormat *, GProcContext *, GtkStatusStack *);

/* Définit les points de départ d'un contexte de désassemblage. */
void g_binary_format_activate_disassembling_context(GBinFormat *, GProcContext *, GtkStatusStack *);

/* Ajoute un symbole à la collection du format binaire. */
bool g_binary_format_add_symbol(GBinFormat *, GBinSymbol *);

/* Retire un symbole de la collection du format binaire. */
void g_binary_format_remove_symbol(GBinFormat *, GBinSymbol *);

/* Fournit la liste de tous les symboles détectés. */
GBinSymbol **g_binary_format_get_symbols(const GBinFormat *, size_t *);

/* Construit une désignation pour chaîne de caractères. */
char *create_string_label(GBinFormat *, const vmpa2t *, size_t);

/* Recherche le symbole correspondant à une étiquette. */
bool g_binary_format_find_symbol_by_label(GBinFormat *, const char *, GBinSymbol **);

/* Recherche le symbole correspondant à une adresse. */
bool g_binary_format_find_symbol_at(GBinFormat *, const vmpa2t *, GBinSymbol **);

/* Recherche le symbole contenant une adresse. */
bool g_binary_format_find_symbol_for(GBinFormat *, const vmpa2t *, GBinSymbol **);

/* Recherche le symbole suivant celui lié à une adresse. */
bool g_binary_format_find_next_symbol_at(GBinFormat *, const vmpa2t *, GBinSymbol **);

/* Recherche le symbole correspondant à une adresse. */
bool g_binary_format_resolve_symbol(GBinFormat *, const vmpa2t *, bool, GBinSymbol **, phys_t *);

/* Fournit la liste des fichiers source détectés. */
const char * const *g_binary_format_get_source_files(const GBinFormat *, size_t *, size_t *);

/* Procède à la décompilation complète du format. */
//void g_binary_format_decompile(const GBinFormat *, GCodeBuffer *, const char *filename);



/* ------------------ CONSERVATION DES SOUCIS DURANT LE CHARGEMENT ------------------ */


/* Types d'erreurs détectées */

#define FMT_ERROR(idx) ((idx << 2) | (0 << 0))

typedef enum _BinaryFormatError
{
    BFE_SPECIFICATION = FMT_ERROR(0),       /* Non respect des specs       */
    BFE_STRUCTURE     = FMT_ERROR(1)        /* Code non reconnu            */

} BinaryFormatError;


/* Protège ou lève la protection de l'accès aux erreurs. */
void g_binary_format_lock_unlock_errors(GBinFormat *, bool);

#define g_binary_format_lock_errors(f) g_binary_format_lock_unlock_errors(f, true)
#define g_binary_format_unlock_errors(f) g_binary_format_lock_unlock_errors(f, false)

/* Etend la liste des soucis détectés avec de nouvelles infos. */
void g_binary_format_add_error(GBinFormat *, BinaryFormatError, const vmpa2t *, const char *);

/* Indique le nombre d'erreurs relevées au niveau assembleur. */
size_t g_binary_format_count_errors(GBinFormat *);

/* Fournit les éléments concernant un soucis détecté. */
bool g_binary_format_get_error(GBinFormat *, size_t, BinaryFormatError *, vmpa2t *, char **);



#endif  /* _FORMAT_FORMAT_H */