1 |
#ifndef _BEA_ENGINE_ |
2 |
#define _BEA_ENGINE_ |
3 |
#if defined(__cplusplus) && defined(__BORLANDC__) |
4 |
namespace BeaEngine { |
5 |
#endif |
6 |
|
7 |
#include <beaengine/macros.h> |
8 |
#include <beaengine/export.h> |
9 |
#include <beaengine/basic_types.h> |
10 |
|
11 |
#if !defined(BEA_ENGINE_STATIC) |
12 |
#if defined(BUILD_BEA_ENGINE_DLL) |
13 |
#define BEA_API bea__api_export__ |
14 |
#else |
15 |
#define BEA_API bea__api_import__ |
16 |
#endif |
17 |
#else |
18 |
#define BEA_API |
19 |
#endif |
20 |
|
21 |
|
22 |
#define INSTRUCT_LENGTH 64 |
23 |
|
24 |
#pragma pack(1) |
25 |
typedef struct { |
26 |
UInt8 W_; |
27 |
UInt8 R_; |
28 |
UInt8 X_; |
29 |
UInt8 B_; |
30 |
UInt8 state; |
31 |
} REX_Struct ; |
32 |
#pragma pack() |
33 |
|
34 |
#pragma pack(1) |
35 |
typedef struct { |
36 |
int Number; |
37 |
int NbUndefined; |
38 |
UInt8 LockPrefix; |
39 |
UInt8 OperandSize; |
40 |
UInt8 AddressSize; |
41 |
UInt8 RepnePrefix; |
42 |
UInt8 RepPrefix; |
43 |
UInt8 FSPrefix; |
44 |
UInt8 SSPrefix; |
45 |
UInt8 GSPrefix; |
46 |
UInt8 ESPrefix; |
47 |
UInt8 CSPrefix; |
48 |
UInt8 DSPrefix; |
49 |
UInt8 BranchTaken; |
50 |
UInt8 BranchNotTaken; |
51 |
REX_Struct REX; |
52 |
char alignment[2]; |
53 |
} PREFIXINFO ; |
54 |
#pragma pack() |
55 |
|
56 |
#pragma pack(1) |
57 |
typedef struct { |
58 |
UInt8 OF_; |
59 |
UInt8 SF_; |
60 |
UInt8 ZF_; |
61 |
UInt8 AF_; |
62 |
UInt8 PF_; |
63 |
UInt8 CF_; |
64 |
UInt8 TF_; |
65 |
UInt8 IF_; |
66 |
UInt8 DF_; |
67 |
UInt8 NT_; |
68 |
UInt8 RF_; |
69 |
UInt8 alignment; |
70 |
} EFLStruct ; |
71 |
#pragma pack() |
72 |
|
73 |
#pragma pack(4) |
74 |
typedef struct { |
75 |
Int32 BaseRegister; |
76 |
Int32 IndexRegister; |
77 |
Int32 Scale; |
78 |
Int64 Displacement; |
79 |
} MEMORYTYPE ; |
80 |
#pragma pack() |
81 |
|
82 |
|
83 |
#pragma pack(1) |
84 |
typedef struct { |
85 |
Int32 Category; |
86 |
Int32 Opcode; |
87 |
char Mnemonic[16]; |
88 |
Int32 BranchType; |
89 |
EFLStruct Flags; |
90 |
UInt64 AddrValue; |
91 |
Int64 Immediat; |
92 |
UInt32 ImplicitModifiedRegs; |
93 |
} INSTRTYPE; |
94 |
#pragma pack() |
95 |
|
96 |
#pragma pack(1) |
97 |
typedef struct { |
98 |
char ArgMnemonic[64]; |
99 |
Int32 ArgType; |
100 |
Int32 ArgSize; |
101 |
Int32 ArgPosition; |
102 |
UInt32 AccessMode; |
103 |
MEMORYTYPE Memory; |
104 |
UInt32 SegmentReg; |
105 |
} ARGTYPE; |
106 |
#pragma pack() |
107 |
|
108 |
/* reserved structure used for thread-safety */ |
109 |
/* unusable by customer */ |
110 |
#pragma pack(1) |
111 |
typedef struct { |
112 |
UIntPtr EIP_; |
113 |
UInt64 EIP_VA; |
114 |
UIntPtr EIP_REAL; |
115 |
Int32 OriginalOperandSize; |
116 |
Int32 OperandSize; |
117 |
Int32 MemDecoration; |
118 |
Int32 AddressSize; |
119 |
Int32 MOD_; |
120 |
Int32 RM_; |
121 |
Int32 INDEX_; |
122 |
Int32 SCALE_; |
123 |
Int32 BASE_; |
124 |
Int32 MMX_; |
125 |
Int32 SSE_; |
126 |
Int32 CR_; |
127 |
Int32 DR_; |
128 |
Int32 SEG_; |
129 |
Int32 REGOPCODE; |
130 |
UInt32 DECALAGE_EIP; |
131 |
Int32 FORMATNUMBER; |
132 |
Int32 SYNTAX_; |
133 |
UInt64 EndOfBlock; |
134 |
Int32 RelativeAddress; |
135 |
UInt32 Architecture; |
136 |
Int32 ImmediatSize; |
137 |
Int32 NB_PREFIX; |
138 |
Int32 PrefRepe; |
139 |
Int32 PrefRepne; |
140 |
UInt32 SEGMENTREGS; |
141 |
UInt32 SEGMENTFS; |
142 |
Int32 third_arg; |
143 |
Int32 TAB_; |
144 |
Int32 ERROR_OPCODE; |
145 |
REX_Struct REX; |
146 |
Int32 OutOfBlock; |
147 |
} InternalDatas; |
148 |
#pragma pack() |
149 |
|
150 |
/* ************** main structure ************ */ |
151 |
#pragma pack(1) |
152 |
typedef struct _Disasm { |
153 |
UIntPtr EIP; |
154 |
UInt64 VirtualAddr; |
155 |
UInt32 SecurityBlock; |
156 |
char CompleteInstr[INSTRUCT_LENGTH]; |
157 |
UInt32 Archi; |
158 |
UInt64 Options; |
159 |
INSTRTYPE Instruction; |
160 |
ARGTYPE Argument1; |
161 |
ARGTYPE Argument2; |
162 |
ARGTYPE Argument3; |
163 |
PREFIXINFO Prefix; |
164 |
InternalDatas Reserved_; |
165 |
} DISASM, *PDISASM, *LPDISASM; |
166 |
#pragma pack() |
167 |
|
168 |
#define ESReg 1 |
169 |
#define DSReg 2 |
170 |
#define FSReg 3 |
171 |
#define GSReg 4 |
172 |
#define CSReg 5 |
173 |
#define SSReg 6 |
174 |
|
175 |
#define InvalidPrefix 4 |
176 |
#define SuperfluousPrefix 2 |
177 |
#define NotUsedPrefix 0 |
178 |
#define MandatoryPrefix 8 |
179 |
#define InUsePrefix 1 |
180 |
|
181 |
#define LowPosition 0 |
182 |
#define HighPosition 1 |
183 |
|
184 |
enum INSTRUCTION_TYPE |
185 |
{ |
186 |
GENERAL_PURPOSE_INSTRUCTION = 0x10000, |
187 |
FPU_INSTRUCTION = 0x20000, |
188 |
MMX_INSTRUCTION = 0x40000, |
189 |
SSE_INSTRUCTION = 0x80000, |
190 |
SSE2_INSTRUCTION = 0x100000, |
191 |
SSE3_INSTRUCTION = 0x200000, |
192 |
SSSE3_INSTRUCTION = 0x400000, |
193 |
SSE41_INSTRUCTION = 0x800000, |
194 |
SSE42_INSTRUCTION = 0x1000000, |
195 |
SYSTEM_INSTRUCTION = 0x2000000, |
196 |
VM_INSTRUCTION = 0x4000000, |
197 |
UNDOCUMENTED_INSTRUCTION = 0x8000000, |
198 |
AMD_INSTRUCTION = 0x10000000, |
199 |
ILLEGAL_INSTRUCTION = 0x20000000, |
200 |
AES_INSTRUCTION = 0x40000000, |
201 |
CLMUL_INSTRUCTION = (int)0x80000000, |
202 |
|
203 |
|
204 |
DATA_TRANSFER = 0x1, |
205 |
ARITHMETIC_INSTRUCTION, |
206 |
LOGICAL_INSTRUCTION, |
207 |
SHIFT_ROTATE, |
208 |
BIT_UInt8, |
209 |
CONTROL_TRANSFER, |
210 |
STRING_INSTRUCTION, |
211 |
InOutINSTRUCTION, |
212 |
ENTER_LEAVE_INSTRUCTION, |
213 |
FLAG_CONTROL_INSTRUCTION, |
214 |
SEGMENT_REGISTER, |
215 |
MISCELLANEOUS_INSTRUCTION, |
216 |
COMPARISON_INSTRUCTION, |
217 |
LOGARITHMIC_INSTRUCTION, |
218 |
TRIGONOMETRIC_INSTRUCTION, |
219 |
UNSUPPORTED_INSTRUCTION, |
220 |
LOAD_CONSTANTS, |
221 |
FPUCONTROL, |
222 |
STATE_MANAGEMENT, |
223 |
CONVERSION_INSTRUCTION, |
224 |
SHUFFLE_UNPACK, |
225 |
PACKED_SINGLE_PRECISION, |
226 |
SIMD128bits, |
227 |
SIMD64bits, |
228 |
CACHEABILITY_CONTROL, |
229 |
FP_INTEGER_CONVERSION, |
230 |
SPECIALIZED_128bits, |
231 |
SIMD_FP_PACKED, |
232 |
SIMD_FP_HORIZONTAL , |
233 |
AGENT_SYNCHRONISATION, |
234 |
PACKED_ALIGN_RIGHT , |
235 |
PACKED_SIGN, |
236 |
PACKED_BLENDING_INSTRUCTION, |
237 |
PACKED_TEST, |
238 |
PACKED_MINMAX, |
239 |
HORIZONTAL_SEARCH, |
240 |
PACKED_EQUALITY, |
241 |
STREAMING_LOAD, |
242 |
INSERTION_EXTRACTION, |
243 |
DOT_PRODUCT, |
244 |
SAD_INSTRUCTION, |
245 |
ACCELERATOR_INSTRUCTION, /* crc32, popcnt (sse4.2) */ |
246 |
ROUND_INSTRUCTION |
247 |
|
248 |
}; |
249 |
|
250 |
enum EFLAGS_STATES |
251 |
{ |
252 |
TE_ = 1, |
253 |
MO_ = 2, |
254 |
RE_ = 4, |
255 |
SE_ = 8, |
256 |
UN_ = 0x10, |
257 |
PR_ = 0x20 |
258 |
}; |
259 |
|
260 |
enum BRANCH_TYPE |
261 |
{ |
262 |
JO = 1, |
263 |
JC = 2, |
264 |
JE = 3, |
265 |
JA = 4, |
266 |
JS = 5, |
267 |
JP = 6, |
268 |
JL = 7, |
269 |
JG = 8, |
270 |
JB = 2, // JC == JB |
271 |
JECXZ = 10, |
272 |
JmpType = 11, |
273 |
CallType = 12, |
274 |
RetType = 13, |
275 |
JNO = -1, |
276 |
JNC = -2, |
277 |
JNE = -3, |
278 |
JNA = -4, |
279 |
JNS = -5, |
280 |
JNP = -6, |
281 |
JNL = -7, |
282 |
JNG = -8, |
283 |
JNB = -2 // JNC == JNB |
284 |
}; |
285 |
|
286 |
enum ARGUMENTS_TYPE |
287 |
{ |
288 |
NO_ARGUMENT = 0x10000000, |
289 |
REGISTER_TYPE = 0x20000000, |
290 |
MEMORY_TYPE = 0x40000000, |
291 |
CONSTANT_TYPE = (int)0x80000000, |
292 |
|
293 |
MMX_REG = 0x10000, |
294 |
GENERAL_REG = 0x20000, |
295 |
FPU_REG = 0x40000, |
296 |
SSE_REG = 0x80000, |
297 |
CR_REG = 0x100000, |
298 |
DR_REG = 0x200000, |
299 |
SPECIAL_REG = 0x400000, |
300 |
MEMORY_MANAGEMENT_REG = 0x800000, |
301 |
SEGMENT_REG = 0x1000000, |
302 |
|
303 |
RELATIVE_ = 0x4000000, |
304 |
ABSOLUTE_ = 0x8000000, |
305 |
|
306 |
READ = 0x1, |
307 |
WRITE = 0x2, |
308 |
|
309 |
REG0 = 0x1, |
310 |
REG1 = 0x2, |
311 |
REG2 = 0x4, |
312 |
REG3 = 0x8, |
313 |
REG4 = 0x10, |
314 |
REG5 = 0x20, |
315 |
REG6 = 0x40, |
316 |
REG7 = 0x80, |
317 |
REG8 = 0x100, |
318 |
REG9 = 0x200, |
319 |
REG10 = 0x400, |
320 |
REG11 = 0x800, |
321 |
REG12 = 0x1000, |
322 |
REG13 = 0x2000, |
323 |
REG14 = 0x4000, |
324 |
REG15 = 0x8000 |
325 |
}; |
326 |
|
327 |
enum SPECIAL_INFO |
328 |
{ |
329 |
UNKNOWN_OPCODE = -1, |
330 |
OUT_OF_BLOCK = 0, |
331 |
|
332 |
/* === mask = 0xff */ |
333 |
NoTabulation = 0x00000000, |
334 |
Tabulation = 0x00000001, |
335 |
|
336 |
/* === mask = 0xff00 */ |
337 |
MasmSyntax = 0x00000000, |
338 |
GoAsmSyntax = 0x00000100, |
339 |
NasmSyntax = 0x00000200, |
340 |
ATSyntax = 0x00000400, |
341 |
|
342 |
/* === mask = 0xff0000 */ |
343 |
PrefixedNumeral = 0x00010000, |
344 |
SuffixedNumeral = 0x00000000, |
345 |
|
346 |
/* === mask = 0xff000000 */ |
347 |
ShowSegmentRegs = 0x01000000 |
348 |
}; |
349 |
|
350 |
|
351 |
#ifdef __cplusplus |
352 |
extern "C" |
353 |
#endif |
354 |
|
355 |
BEA_API int __bea_callspec__ Disasm (LPDISASM pDisAsm); |
356 |
BEA_API const__ char* __bea_callspec__ BeaEngineVersion (void); |
357 |
BEA_API const__ char* __bea_callspec__ BeaEngineRevision (void); |
358 |
#if defined(__cplusplus) && defined(__BORLANDC__) |
359 |
}; |
360 |
using namespace BeaEngine; |
361 |
#endif |
362 |
#endif |