Zydis v4.0.0
DecoderData.h
1/***************************************************************************************************
2
3 Zyan Disassembler Library (Zydis)
4
5 Original Author : Florian Bernd
6
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24
25***************************************************************************************************/
26
27#ifndef ZYDIS_INTERNAL_DECODERDATA_H
28#define ZYDIS_INTERNAL_DECODERDATA_H
29
30#include <Zycore/Defines.h>
31#include <Zycore/Types.h>
32#include <Zydis/Defines.h>
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38/* ============================================================================================== */
39/* Enums and types */
40/* ============================================================================================== */
41
42// MSVC does not like types other than (un-)signed int for bit-fields
43#ifdef ZYAN_MSVC
44# pragma warning(push)
45# pragma warning(disable:4214)
46#endif
47
48#pragma pack(push, 1)
49
50/* ---------------------------------------------------------------------------------------------- */
51/* Decoder tree */
52/* ---------------------------------------------------------------------------------------------- */
53
57typedef ZyanU8 ZydisDecoderTreeNodeType;
58
62enum ZydisDecoderTreeNodeTypes
63{
64 ZYDIS_NODETYPE_INVALID = 0x00,
68 ZYDIS_NODETYPE_DEFINITION_MASK = 0x80,
72 ZYDIS_NODETYPE_FILTER_XOP = 0x01,
76 ZYDIS_NODETYPE_FILTER_VEX = 0x02,
80 ZYDIS_NODETYPE_FILTER_EMVEX = 0x03,
84 ZYDIS_NODETYPE_FILTER_OPCODE = 0x04,
88 ZYDIS_NODETYPE_FILTER_MODE = 0x05,
92 ZYDIS_NODETYPE_FILTER_MODE_COMPACT = 0x06,
96 ZYDIS_NODETYPE_FILTER_MODRM_MOD = 0x07,
100 ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT = 0x08,
104 ZYDIS_NODETYPE_FILTER_MODRM_REG = 0x09,
108 ZYDIS_NODETYPE_FILTER_MODRM_RM = 0x0A,
112 ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1 = 0x0B,
116 ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX = 0x0C,
120 ZYDIS_NODETYPE_FILTER_OPERAND_SIZE = 0x0D,
124 ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE = 0x0E,
128 ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH = 0x0F,
132 ZYDIS_NODETYPE_FILTER_REX_W = 0x10,
136 ZYDIS_NODETYPE_FILTER_REX_B = 0x11,
140 ZYDIS_NODETYPE_FILTER_EVEX_B = 0x12,
144 ZYDIS_NODETYPE_FILTER_MVEX_E = 0x13,
148 ZYDIS_NODETYPE_FILTER_MODE_AMD = 0x14,
152 ZYDIS_NODETYPE_FILTER_MODE_KNC = 0x15,
156 ZYDIS_NODETYPE_FILTER_MODE_MPX = 0x16,
160 ZYDIS_NODETYPE_FILTER_MODE_CET = 0x17,
164 ZYDIS_NODETYPE_FILTER_MODE_LZCNT = 0x18,
168 ZYDIS_NODETYPE_FILTER_MODE_TZCNT = 0x19,
172 ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD = 0x1A,
176 ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE = 0x1B
177};
178
179/* ---------------------------------------------------------------------------------------------- */
180
184typedef ZyanU16 ZydisDecoderTreeNodeValue;
185
186/* ---------------------------------------------------------------------------------------------- */
187
192{
193 ZydisDecoderTreeNodeType type;
194 ZydisDecoderTreeNodeValue value;
196
197/* ---------------------------------------------------------------------------------------------- */
198
199#pragma pack(pop)
200
201#ifdef ZYAN_MSVC
202# pragma warning(pop)
203#endif
204
205/* ---------------------------------------------------------------------------------------------- */
206/* Physical instruction encoding info */
207/* ---------------------------------------------------------------------------------------------- */
208
212typedef ZyanU8 ZydisInstructionEncodingFlags;
213
217#define ZYDIS_INSTR_ENC_FLAG_HAS_MODRM 0x01
218
222#define ZYDIS_INSTR_ENC_FLAG_HAS_DISP 0x02
223
227#define ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 0x04
228
232#define ZYDIS_INSTR_ENC_FLAG_HAS_IMM1 0x08
233
240#define ZYDIS_INSTR_ENC_FLAG_FORCE_REG_FORM 0x10
241
246{
250 ZydisInstructionEncodingFlags flags;
254 struct
255 {
259 ZyanU8 size[3];
264 struct
265 {
269 ZyanU8 size[3];
273 ZyanBool is_signed;
277 ZyanBool is_relative;
278 } imm[2];
280
281/* ---------------------------------------------------------------------------------------------- */
282
283/* ============================================================================================== */
284/* Functions */
285/* ============================================================================================== */
286
287/* ---------------------------------------------------------------------------------------------- */
288/* Decoder tree */
289/* ---------------------------------------------------------------------------------------------- */
290
291extern const ZydisDecoderTreeNode zydis_decoder_tree_root;
292
298ZYAN_INLINE const ZydisDecoderTreeNode* ZydisDecoderTreeGetRootNode(void)
299{
300 return &zydis_decoder_tree_root;
301}
302
311ZYDIS_NO_EXPORT const ZydisDecoderTreeNode* ZydisDecoderTreeGetChildNode(
312 const ZydisDecoderTreeNode* parent, ZyanU16 index);
313
321ZYDIS_NO_EXPORT void ZydisGetInstructionEncodingInfo(const ZydisDecoderTreeNode* node,
322 const ZydisInstructionEncodingInfo** info);
323
324/* ---------------------------------------------------------------------------------------------- */
325
326/* ============================================================================================== */
327
328#ifdef __cplusplus
329}
330#endif
331
332#endif /* ZYDIS_INTERNAL_DECODERDATA_H */
Import/export defines for MSVC builds.
#define ZYDIS_NO_EXPORT
Symbol is not exported and for internal use only.
Definition: Defines.h:74
Defines the ZydisDecoderTreeNode struct.
Definition: DecoderData.h:192
Defines the ZydisInstructionEncodingInfo struct.
Definition: DecoderData.h:246
struct ZydisInstructionEncodingInfo_::@9 disp
Displacement info.
ZydisInstructionEncodingFlags flags
Contains flags with information about the physical instruction-encoding.
Definition: DecoderData.h:250
ZyanBool is_relative
Signals, if the value is a relative offset.
Definition: DecoderData.h:277
ZyanBool is_signed
Signals, if the value is signed.
Definition: DecoderData.h:273
ZyanU8 size[3]
The size of the displacement value.
Definition: DecoderData.h:259
struct ZydisInstructionEncodingInfo_::@10 imm[2]
Immediate info.