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
35 extern "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 
57 typedef ZyanU8 ZydisDecoderTreeNodeType;
58 
62 enum 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 
184 typedef ZyanU16 ZydisDecoderTreeNodeValue;
185 
186 /* ---------------------------------------------------------------------------------------------- */
187 
191 typedef struct ZydisDecoderTreeNode_
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 
212 typedef 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];
260  } disp;
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 
291 extern const ZydisDecoderTreeNode zydis_decoder_tree_root;
292 
298 ZYAN_INLINE const ZydisDecoderTreeNode* ZydisDecoderTreeGetRootNode(void)
299 {
300  return &zydis_decoder_tree_root;
301 }
302 
311 ZYDIS_NO_EXPORT const ZydisDecoderTreeNode* ZydisDecoderTreeGetChildNode(
312  const ZydisDecoderTreeNode* parent, ZyanU16 index);
313 
321 ZYDIS_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 */
ZyanU8 size[3]
The size of the displacement value.
Definition: DecoderData.h:259
struct ZydisInstructionEncodingInfo_::@9 disp
Displacement info.
Import/export defines for MSVC builds.
Defines the ZydisDecoderTreeNode struct.
Definition: DecoderData.h:191
struct ZydisInstructionEncodingInfo_::@10 imm[2]
Immediate info.
ZyanBool is_relative
Signals, if the value is a relative offset.
Definition: DecoderData.h:277
#define ZYDIS_NO_EXPORT
Symbol is not exported and for internal use only.
Definition: Defines.h:74
ZydisInstructionEncodingFlags flags
Contains flags with information about the physical instruction-encoding.
Definition: DecoderData.h:250
ZyanBool is_signed
Signals, if the value is signed.
Definition: DecoderData.h:273
Defines the ZydisInstructionEncodingInfo struct.
Definition: DecoderData.h:245