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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
/* Chrysalide - Outil d'analyse de fichiers binaires
* instruction-int.h - prototypes pour la définition générique interne des instructions
*
* Copyright (C) 2008-2025 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 Chrysalide. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _ARCH_INSTRUCTION_INT_H
#define _ARCH_INSTRUCTION_INT_H
#include <stdint.h>
#include "instruction.h"
#include "../common/array.h"
#include "../glibext/objhole-int.h"
/* Indique l'encodage d'une instruction de façon détaillée. */
typedef char * (* get_instruction_encoding_fc) (const GArchInstruction *);
/* Fournit le nom humain de l'instruction manipulée. */
typedef char * (* get_instruction_keyword_fc) (const GArchInstruction *);
#if 0
#include "../analysis/storage/storage.h"
/* Complète un désassemblage accompli pour une instruction. */
typedef void (* call_instruction_hook_fc) (GArchInstruction *, InstrProcessHook, GArchProcessor *, GProcContext *, GExeFormat *);
/* Construit un petit résumé concis de l'instruction. */
typedef char * (* build_instruction_tooltip_fc) (const GArchInstruction *);
/* Fournit une description pour l'instruction manipulée. */
typedef const char * (* get_instruction_desc_fc) (const GArchInstruction *);
/* Charge une instruction depuis une mémoire tampon. */
typedef bool (* unserialize_instruction_fc) (GArchInstruction *, GAsmStorage *, GBinFormat *, packed_buffer_t *);
/* Sauvegarde une instruction dans une mémoire tampon. */
typedef bool (* serialize_instruction_fc) (GArchInstruction *, GAsmStorage *, packed_buffer_t *);
/* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */
typedef GBufferLine * (* print_instruction_fc) (const GArchInstruction *, GBufferLine *, size_t, size_t, const GBinContent *);
/* Liste les registres lus et écrits par l'instruction. */
typedef void (* get_instruction_rw_regs_fc) (const GArchInstruction *, GArchRegister ***, size_t *, GArchRegister ***, size_t *);
/* Charge un contenu depuis une mémoire tampon. */
typedef bool (* load_instruction_fc) (GArchInstruction *, GObjectStorage *, packed_buffer_t *);
/* Sauvegarde un contenu dans une mémoire tampon. */
typedef bool (* store_instruction_fc) (GArchInstruction *, GObjectStorage *, packed_buffer_t *);
#endif
/* Conservation d'une adresse et de propriétées */
typedef unsigned long compact_ins_link_t;
/* Définition générique d'une instruction d'architecture (instance) */
struct _GArchInstruction
{
GThickObject parent; /* A laisser en premier */
GBinaryPortion *rel_area; /* Zone de référence */
rel_mrange_t rel_range; /* Emplacement compressé */
/**
* A laisser à la suite de la localisation précédente pour éviter
* les espaces vide dans la structure.
*/
uint16_t link_count; /* Quantité de liens établis */
compact_ins_link_t *links; /* Liste de ces liens */
flat_array_t *operands; /* Liste des opérandes */
};
/* Définition générique d'une instruction d'architecture (classe) */
struct _GArchInstructionClass
{
GThickObjectClass parent; /* A laisser en premier */
get_instruction_encoding_fc get_encoding; /* Obtention de l'encodage */
get_instruction_keyword_fc get_keyword; /* Texte humain équivalent */
#if 0
//get_instruction_encoding_fc get_encoding; /* Obtention de l'encodage */
//get_instruction_keyword_fc get_keyword; /* Texte humain équivalent */
call_instruction_hook_fc call_hook; /* Décrochages éventuels */
build_instruction_tooltip_fc build_tooltip; /* Construction d'une bulle*/
get_instruction_desc_fc get_desc; /* Description assez complète */
unserialize_instruction_fc unserialize; /* Chargement depuis un tampon */
serialize_instruction_fc serialize; /* Conservation dans un tampon */
print_instruction_fc print; /* Imprime l'ensemble */
load_instruction_fc load; /* Chargement depuis un tampon */
store_instruction_fc store; /* Conservation dans un tampon */
//get_instruction_rw_regs_fc get_rw_regs; /* Liste des registres liés */
#endif
};
/* Met en place une instruction d'architecture. */
bool g_arch_instruction_create(GArchInstruction *, itid_t);
/**
* Accès aux informations éventuellement déportées.
*/
#define ARCH_INSTRUCTION_EXTRA_DATA \
\
unsigned int reserved : GOBJECT_RESERVED_EXTRA_BITS; \
\
/** \
* itid_t \
*/ \
unsigned int tid : 16; \
\
/** \
* ArchOperandFlag \
*/ \
unsigned int flags : 8;
/* Informations glissées dans la structure GObject de GArchOperand */
typedef struct _instruction_extra_data_t
{
ARCH_INSTRUCTION_EXTRA_DATA; /* Socle commun */
} instruction_extra_data_t;
#define GET_ARCH_INSTR_EXTRA(op) \
GET_GOBJECT_EXTRA(op, instruction_extra_data_t)
#define SET_ARCH_INSTR_EXTRA(op, data) \
SET_GOBJECT_EXTRA(op, instruction_extra_data_t, data)
/**
* Fournit une marge pour toutes les instructions particulières communes
* à l'ensemble des architectures (GRawInstruction, GUndefInstruction).
*/
#define INSTR_TYPE_ID_OFFSET 5
#endif /* _ARCH_INSTRUCTION_INT_H */
|