1 /*************************************************************************************************** 2 3 Zyan Disassembler Library (Zydis) 4 5 Original Author : Florian Bernd, Joel Hoener 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 /** 28 * @file 29 * Implements the `INTEL` style instruction-formatter. 30 */ 31 32 #ifndef ZYDIS_FORMATTER_INTEL_H 33 #define ZYDIS_FORMATTER_INTEL_H 34 35 #include <Zydis/Formatter.h> 36 #include <Zydis/Internal/FormatterBase.h> 37 #include <Zydis/Internal/String.h> 38 39 #ifdef __cplusplus 40 extern "C" { 41 #endif 42 43 /* ============================================================================================== */ 44 /* Formatter functions */ 45 /* ============================================================================================== */ 46 47 /* ---------------------------------------------------------------------------------------------- */ 48 /* Intel */ 49 /* ---------------------------------------------------------------------------------------------- */ 50 51 ZyanStatus ZydisFormatterIntelFormatInstruction(const ZydisFormatter* formatter, 52 ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); 53 54 ZyanStatus ZydisFormatterIntelFormatOperandMEM(const ZydisFormatter* formatter, 55 ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); 56 57 ZyanStatus ZydisFormatterIntelPrintMnemonic(const ZydisFormatter* formatter, 58 ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); 59 60 ZyanStatus ZydisFormatterIntelPrintRegister(const ZydisFormatter* formatter, 61 ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg); 62 63 ZyanStatus ZydisFormatterIntelPrintDISP(const ZydisFormatter* formatter, 64 ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); 65 66 ZyanStatus ZydisFormatterIntelPrintTypecast(const ZydisFormatter* formatter, 67 ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); 68 69 /* ---------------------------------------------------------------------------------------------- */ 70 /* MASM */ 71 /* ---------------------------------------------------------------------------------------------- */ 72 73 ZyanStatus ZydisFormatterIntelFormatInstructionMASM(const ZydisFormatter* formatter, 74 ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); 75 76 ZyanStatus ZydisFormatterIntelPrintAddressMASM(const ZydisFormatter* formatter, 77 ZydisFormatterBuffer* buffer, ZydisFormatterContext* context); 78 79 /* ---------------------------------------------------------------------------------------------- */ 80 81 /* ============================================================================================== */ 82 /* Fomatter presets */ 83 /* ============================================================================================== */ 84 85 /* ---------------------------------------------------------------------------------------------- */ 86 /* INTEL */ 87 /* ---------------------------------------------------------------------------------------------- */ 88 89 /** 90 * The default formatter configuration for `INTEL` style disassembly. 91 */ 92 static const ZydisFormatter FORMATTER_INTEL = 93 { 94 /* style */ ZYDIS_FORMATTER_STYLE_INTEL, 95 /* force_memory_size */ ZYAN_FALSE, 96 /* force_memory_seg */ ZYAN_FALSE, 97 /* force_memory_scale */ ZYAN_TRUE, 98 /* force_relative_branches */ ZYAN_FALSE, 99 /* force_relative_riprel */ ZYAN_FALSE, 100 /* print_branch_size */ ZYAN_FALSE, 101 /* detailed_prefixes */ ZYAN_FALSE, 102 /* addr_base */ ZYDIS_NUMERIC_BASE_HEX, 103 /* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED, 104 /* addr_padding_absolute */ ZYDIS_PADDING_AUTO, 105 /* addr_padding_relative */ 2, 106 /* disp_base */ ZYDIS_NUMERIC_BASE_HEX, 107 /* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED, 108 /* disp_padding */ 2, 109 /* imm_base */ ZYDIS_NUMERIC_BASE_HEX, 110 /* imm_signedness */ ZYDIS_SIGNEDNESS_UNSIGNED, 111 /* imm_padding */ 2, 112 /* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT, 113 /* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT, 114 /* case_registers */ ZYDIS_LETTER_CASE_DEFAULT, 115 /* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT, 116 /* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT, 117 /* hex_uppercase */ ZYAN_TRUE, 118 /* hex_force_leading_number */ ZYAN_FALSE, 119 /* number_format */ 120 { 121 // ZYDIS_NUMERIC_BASE_DEC 122 { 123 // Prefix 124 { 125 /* string */ ZYAN_NULL, 126 /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), 127 /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 128 }, 129 // Suffix 130 { 131 /* string */ ZYAN_NULL, 132 /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), 133 /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 134 } 135 }, 136 // ZYDIS_NUMERIC_BASE_HEX 137 { 138 // Prefix 139 { 140 /* string */ &FORMATTER_INTEL.number_format[ 141 ZYDIS_NUMERIC_BASE_HEX][0].string_data, 142 /* string_data */ ZYAN_DEFINE_STRING_VIEW("0x"), 143 /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 144 }, 145 // Suffix 146 { 147 /* string */ ZYAN_NULL, 148 /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), 149 /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 150 } 151 } 152 }, 153 /* func_pre_instruction */ ZYAN_NULL, 154 /* func_post_instruction */ ZYAN_NULL, 155 /* func_format_instruction */ &ZydisFormatterIntelFormatInstruction, 156 /* func_pre_operand */ ZYAN_NULL, 157 /* func_post_operand */ ZYAN_NULL, 158 /* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG, 159 /* func_format_operand_mem */ &ZydisFormatterIntelFormatOperandMEM, 160 /* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR, 161 /* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM, 162 /* func_print_mnemonic */ &ZydisFormatterIntelPrintMnemonic, 163 /* func_print_register */ &ZydisFormatterIntelPrintRegister, 164 /* func_print_address_abs */ &ZydisFormatterBasePrintAddressABS, 165 /* func_print_address_rel */ &ZydisFormatterBasePrintAddressREL, 166 /* func_print_disp */ &ZydisFormatterIntelPrintDISP, 167 /* func_print_imm */ &ZydisFormatterBasePrintIMM, 168 /* func_print_typecast */ &ZydisFormatterIntelPrintTypecast, 169 /* func_print_segment */ &ZydisFormatterBasePrintSegment, 170 /* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes, 171 /* func_print_decorator */ &ZydisFormatterBasePrintDecorator 172 }; 173 174 /* ---------------------------------------------------------------------------------------------- */ 175 /* MASM */ 176 /* ---------------------------------------------------------------------------------------------- */ 177 178 /** 179 * The default formatter configuration for `MASM` style disassembly. 180 */ 181 static const ZydisFormatter FORMATTER_INTEL_MASM = 182 { 183 /* style */ ZYDIS_FORMATTER_STYLE_INTEL_MASM, 184 /* force_memory_size */ ZYAN_TRUE, 185 /* force_memory_seg */ ZYAN_FALSE, 186 /* force_memory_scale */ ZYAN_TRUE, 187 /* force_relative_branches */ ZYAN_FALSE, 188 /* force_relative_riprel */ ZYAN_FALSE, 189 /* print_branch_size */ ZYAN_FALSE, 190 /* detailed_prefixes */ ZYAN_FALSE, 191 /* addr_base */ ZYDIS_NUMERIC_BASE_HEX, 192 /* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED, 193 /* addr_padding_absolute */ ZYDIS_PADDING_DISABLED, 194 /* addr_padding_relative */ ZYDIS_PADDING_DISABLED, 195 /* disp_base */ ZYDIS_NUMERIC_BASE_HEX, 196 /* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED, 197 /* disp_padding */ ZYDIS_PADDING_DISABLED, 198 /* imm_base */ ZYDIS_NUMERIC_BASE_HEX, 199 /* imm_signedness */ ZYDIS_SIGNEDNESS_AUTO, 200 /* imm_padding */ ZYDIS_PADDING_DISABLED, 201 /* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT, 202 /* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT, 203 /* case_registers */ ZYDIS_LETTER_CASE_DEFAULT, 204 /* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT, 205 /* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT, 206 /* hex_uppercase */ ZYAN_TRUE, 207 /* hex_force_leading_number */ ZYAN_TRUE, 208 /* number_format */ 209 { 210 // ZYDIS_NUMERIC_BASE_DEC 211 { 212 // Prefix 213 { 214 /* string */ ZYAN_NULL, 215 /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), 216 /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 217 }, 218 // Suffix 219 { 220 /* string */ ZYAN_NULL, 221 /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), 222 /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 223 } 224 }, 225 // ZYDIS_NUMERIC_BASE_HEX 226 { 227 // Prefix 228 { 229 /* string */ ZYAN_NULL, 230 /* string_data */ ZYAN_DEFINE_STRING_VIEW(""), 231 /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 232 }, 233 // Suffix 234 { 235 /* string */ &FORMATTER_INTEL_MASM.number_format[ 236 ZYDIS_NUMERIC_BASE_HEX][1].string_data, 237 /* string_data */ ZYAN_DEFINE_STRING_VIEW("h"), 238 /* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 239 } 240 } 241 }, 242 /* func_pre_instruction */ ZYAN_NULL, 243 /* func_post_instruction */ ZYAN_NULL, 244 /* func_format_instruction */ &ZydisFormatterIntelFormatInstructionMASM, 245 /* func_pre_operand */ ZYAN_NULL, 246 /* func_post_operand */ ZYAN_NULL, 247 /* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG, 248 /* func_format_operand_mem */ &ZydisFormatterIntelFormatOperandMEM, 249 /* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR, 250 /* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM, 251 /* func_print_mnemonic */ &ZydisFormatterIntelPrintMnemonic, 252 /* func_print_register */ &ZydisFormatterIntelPrintRegister, 253 /* func_print_address_abs */ &ZydisFormatterIntelPrintAddressMASM, 254 /* func_print_address_rel */ &ZydisFormatterIntelPrintAddressMASM, 255 /* func_print_disp */ &ZydisFormatterIntelPrintDISP, 256 /* func_print_imm */ &ZydisFormatterBasePrintIMM, 257 /* func_print_typecast */ &ZydisFormatterIntelPrintTypecast, 258 /* func_print_segment */ &ZydisFormatterBasePrintSegment, 259 /* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes, 260 /* func_print_decorator */ &ZydisFormatterBasePrintDecorator 261 }; 262 263 /* ---------------------------------------------------------------------------------------------- */ 264 265 /* ============================================================================================== */ 266 267 #ifdef __cplusplus 268 } 269 #endif 270 271 #endif // ZYDIS_FORMATTER_INTEL_H 272