mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1147 lines
		
	
	
		
			42 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1147 lines
		
	
	
		
			42 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /***************************************************************************************************
 | |
| 
 | |
|   Zyan Disassembler Library (Zydis)
 | |
| 
 | |
|   Original Author : Florian Bernd
 | |
| 
 | |
|  * Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
|  * of this software and associated documentation files (the "Software"), to deal
 | |
|  * in the Software without restriction, including without limitation the rights
 | |
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
|  * copies of the Software, and to permit persons to whom the Software is
 | |
|  * furnished to do so, subject to the following conditions:
 | |
|  *
 | |
|  * The above copyright notice and this permission notice shall be included in all
 | |
|  * copies or substantial portions of the Software.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | |
|  * SOFTWARE.
 | |
| 
 | |
| ***************************************************************************************************/
 | |
| 
 | |
| /**
 | |
|  * @file
 | |
|  * Functions for formatting instructions to human-readable text.
 | |
|  */
 | |
| 
 | |
| #ifndef ZYDIS_FORMATTER_H
 | |
| #define ZYDIS_FORMATTER_H
 | |
| 
 | |
| #include <Zycore/Defines.h>
 | |
| #include <Zycore/String.h>
 | |
| #include <Zycore/Types.h>
 | |
| #include <Zydis/DecoderTypes.h>
 | |
| #include <Zydis/FormatterBuffer.h>
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /* ============================================================================================== */
 | |
| /* Constants                                                                                      */
 | |
| /* ============================================================================================== */
 | |
| 
 | |
| /**
 | |
|  * Use this constant as value for `runtime_address` in `ZydisFormatterFormatInstruction(Ex)`
 | |
|  * or `ZydisFormatterFormatOperand(Ex)` to print relative values for all addresses.
 | |
|  */
 | |
| #define ZYDIS_RUNTIME_ADDRESS_NONE (ZyanU64)(-1)
 | |
| 
 | |
| /* ============================================================================================== */
 | |
| /* Enums and types                                                                                */
 | |
| /* ============================================================================================== */
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Formatter style                                                                                */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Enum selecting the syntax to format the disassembly in.
 | |
|  */
 | |
| typedef enum ZydisFormatterStyle_
 | |
| {
 | |
|     /**
 | |
|      * Generates `AT&T`-style disassembly.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_STYLE_ATT,
 | |
|     /**
 | |
|      * Generates `Intel`-style disassembly.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_STYLE_INTEL,
 | |
|     /**
 | |
|      * Generates `MASM`-style disassembly that is directly accepted as input for
 | |
|      * the `MASM` assembler.
 | |
|      *
 | |
|      * The runtime-address is ignored in this mode.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_STYLE_INTEL_MASM,
 | |
| 
 | |
|     /**
 | |
|      * Maximum value of this enum.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_STYLE_MAX_VALUE = ZYDIS_FORMATTER_STYLE_INTEL_MASM,
 | |
|     /**
 | |
|      * The minimum number of bits required to represent all values of this enum.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_STYLE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_STYLE_MAX_VALUE)
 | |
| } ZydisFormatterStyle;
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Properties                                                                                     */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Enum selecting a property of the formatter.
 | |
|  */
 | |
| typedef enum ZydisFormatterProperty_
 | |
| {
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
|     /* General                                                                                  */
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Controls the printing of effective operand-size suffixes (`AT&T`) or operand-sizes
 | |
|      * of memory operands (`INTEL`).
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to force the formatter to always print the size, or `ZYAN_FALSE`
 | |
|      * to only print it if needed.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_FORCE_SIZE,
 | |
|     /**
 | |
|      * Controls the printing of segment prefixes.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to force the formatter to always print the segment register of
 | |
|      * memory-operands or `ZYAN_FALSE` to omit implicit `DS`/`SS` segments.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_FORCE_SEGMENT,
 | |
|     /**
 | |
|      * Controls the printing of the scale-factor component for memory operands.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to force the formatter to always print the scale-factor component
 | |
|      * of memory operands or `ZYAN_FALSE` to omit the scale factor for values of `1`.
 | |
|      */
 | |
|      ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE,
 | |
|     /**
 | |
|      * Controls the printing of branch addresses.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to force the formatter to always print relative branch addresses
 | |
|      * or `ZYAN_FALSE` to use absolute addresses, if a runtime-address different to
 | |
|      * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES,
 | |
|     /**
 | |
|      * Controls the printing of `EIP`/`RIP`-relative addresses.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to force the formatter to always print relative addresses for
 | |
|      * `EIP`/`RIP`-relative operands or `ZYAN_FALSE` to use absolute addresses, if a runtime-
 | |
|      * address different to `ZYDIS_RUNTIME_ADDRESS_NONE` was passed.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL,
 | |
|     /**
 | |
|      * Controls the printing of branch-instructions sizes.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to print the size (`short`, `near`) of branch
 | |
|      * instructions or `ZYAN_FALSE` to hide it.
 | |
|      *
 | |
|      * Note that the `far`/`l` modifier is always printed.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE,
 | |
| 
 | |
|     /**
 | |
|      * Controls the printing of instruction prefixes.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to print all instruction-prefixes (even ignored or duplicate
 | |
|      * ones) or `ZYAN_FALSE` to only print prefixes that are effectively used by the instruction.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
|     /* Numeric values                                                                           */
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Controls the base of address values.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_ADDR_BASE,
 | |
|     /**
 | |
|      * Controls the signedness of relative addresses. Absolute addresses are
 | |
|      * always unsigned.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS,
 | |
|     /**
 | |
|      * Controls the padding of absolute address values.
 | |
|      *
 | |
|      * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to padd all
 | |
|      * addresses to the current stack width (hexadecimal only), or any other integer value for
 | |
|      * custom padding.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE,
 | |
|     /**
 | |
|      * Controls the padding of relative address values.
 | |
|      *
 | |
|      * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to padd all
 | |
|      * addresses to the current stack width (hexadecimal only), or any other integer value for
 | |
|      * custom padding.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Controls the base of displacement values.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_DISP_BASE,
 | |
|     /**
 | |
|      * Controls the signedness of displacement values.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS,
 | |
|     /**
 | |
|      * Controls the padding of displacement values.
 | |
|      *
 | |
|      * Pass `ZYDIS_PADDING_DISABLED` to disable padding, or any other integer value for custom
 | |
|      * padding.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_DISP_PADDING,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Controls the base of immediate values.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_IMM_BASE,
 | |
|     /**
 | |
|      * Controls the signedness of immediate values.
 | |
|      *
 | |
|      * Pass `ZYDIS_SIGNEDNESS_AUTO` to automatically choose the most suitable mode based on the
 | |
|      * operands `ZydisDecodedOperand.imm.is_signed` attribute.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS,
 | |
|     /**
 | |
|      * Controls the padding of immediate values.
 | |
|      *
 | |
|      * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to padd all
 | |
|      * immediates to the operand-width (hexadecimal only), or any other integer value for custom
 | |
|      * padding.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_IMM_PADDING,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
|     /* Text formatting                                                                          */
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Controls the letter-case for prefixes.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES,
 | |
|     /**
 | |
|      * Controls the letter-case for the mnemonic.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC,
 | |
|     /**
 | |
|      * Controls the letter-case for registers.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS,
 | |
|     /**
 | |
|      * Controls the letter-case for typecasts.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS,
 | |
|     /**
 | |
|      * Controls the letter-case for decorators.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
|     /* Number formatting                                                                        */
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Controls the prefix for decimal values.
 | |
|      *
 | |
|      * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters
 | |
|      * to set a custom prefix, or `ZYAN_NULL` to disable it.
 | |
|      *
 | |
|      * The string is deep-copied into an internal buffer.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_DEC_PREFIX,
 | |
|     /**
 | |
|      * Controls the suffix for decimal values.
 | |
|      *
 | |
|      * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters
 | |
|      * to set a custom suffix, or `ZYAN_NULL` to disable it.
 | |
|      *
 | |
|      * The string is deep-copied into an internal buffer.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_DEC_SUFFIX,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Controls the letter-case of hexadecimal values.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` as value to format in uppercase and `ZYAN_FALSE` to format in lowercase.
 | |
|      *
 | |
|      * The default value is `ZYAN_TRUE`.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_HEX_UPPERCASE,
 | |
|     /**
 | |
|      * Controls whether to prepend hexadecimal values with a leading zero if the first character
 | |
|      * is non-numeric.
 | |
|      *
 | |
|      * Pass `ZYAN_TRUE` to prepend a leading zero if the first character is non-numeric or
 | |
|      * `ZYAN_FALSE` to disable this functionality.
 | |
|      *
 | |
|      * The default value is `ZYAN_FALSE`.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_HEX_FORCE_LEADING_NUMBER,
 | |
|     /**
 | |
|      * Controls the prefix for hexadecimal values.
 | |
|      *
 | |
|      * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters
 | |
|      * to set a custom prefix, or `ZYAN_NULL` to disable it.
 | |
|      *
 | |
|      * The string is deep-copied into an internal buffer.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_HEX_PREFIX,
 | |
|     /**
 | |
|      * Controls the suffix for hexadecimal values.
 | |
|      *
 | |
|      * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters
 | |
|      * to set a custom suffix, or `ZYAN_NULL` to disable it.
 | |
|      *
 | |
|      * The string is deep-copied into an internal buffer.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_HEX_SUFFIX,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Maximum value of this enum.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_MAX_VALUE = ZYDIS_FORMATTER_PROP_HEX_SUFFIX,
 | |
|     /**
 | |
|      * The minimum number of bits required to represent all values of this enum.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_PROP_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_PROP_MAX_VALUE)
 | |
| } ZydisFormatterProperty;
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Enum defining different mantissae to be used during formatting.
 | |
|  */
 | |
| typedef enum ZydisNumericBase_
 | |
| {
 | |
|     /**
 | |
|      * Decimal system.
 | |
|      */
 | |
|     ZYDIS_NUMERIC_BASE_DEC,
 | |
|     /**
 | |
|      * Hexadecimal system.
 | |
|      */
 | |
|     ZYDIS_NUMERIC_BASE_HEX,
 | |
| 
 | |
|     /**
 | |
|      * Maximum value of this enum.
 | |
|      */
 | |
|     ZYDIS_NUMERIC_BASE_MAX_VALUE = ZYDIS_NUMERIC_BASE_HEX,
 | |
|     /**
 | |
|      * The minimum number of bits required to represent all values of this enum.
 | |
|      */
 | |
|     ZYDIS_NUMERIC_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_NUMERIC_BASE_MAX_VALUE)
 | |
| } ZydisNumericBase;
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Enum defining the signeness of integers to be used during formatting.
 | |
|  */
 | |
| typedef enum ZydisSignedness_
 | |
| {
 | |
|     /**
 | |
|      * Automatically choose the most suitable mode based on the operands
 | |
|      * ZydisDecodedOperand.imm.is_signed` attribute.
 | |
|      */
 | |
|     ZYDIS_SIGNEDNESS_AUTO,
 | |
|     /**
 | |
|      * Force signed values.
 | |
|      */
 | |
|     ZYDIS_SIGNEDNESS_SIGNED,
 | |
|     /**
 | |
|      * Force unsigned values.
 | |
|      */
 | |
|     ZYDIS_SIGNEDNESS_UNSIGNED,
 | |
| 
 | |
|     /**
 | |
|      * Maximum value of this enum.
 | |
|      */
 | |
|     ZYDIS_SIGNEDNESS_MAX_VALUE = ZYDIS_SIGNEDNESS_UNSIGNED,
 | |
|     /**
 | |
|      * The minimum number of bits required to represent all values of this enum.
 | |
|      */
 | |
|     ZYDIS_SIGNEDNESS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SIGNEDNESS_MAX_VALUE)
 | |
| } ZydisSignedness;
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Enum definining magic values that receive special treatment when used as padding properties 
 | |
|  * of the formatter.
 | |
|  */
 | |
| typedef enum ZydisPadding_
 | |
| {
 | |
|     /**
 | |
|      * Disables padding.
 | |
|      */
 | |
|     ZYDIS_PADDING_DISABLED = 0,
 | |
|     /**
 | |
|      * Padds the value to the current stack-width for addresses, or to the
 | |
|      * operand-width for immediate values (hexadecimal only).
 | |
|      */
 | |
|     ZYDIS_PADDING_AUTO     = (-1),
 | |
| 
 | |
|     /**
 | |
|      * Maximum value of this enum.
 | |
|      */
 | |
|     ZYDIS_PADDING_MAX_VALUE = ZYDIS_PADDING_AUTO,
 | |
|     /**
 | |
|      * The minimum number of bits required to represent all values of this enum.
 | |
|      */
 | |
|     ZYDIS_PADDING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PADDING_MAX_VALUE)
 | |
| } ZydisPadding;
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Function types                                                                                 */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Enum selecting a formatter function to be replaced with hooks.
 | |
|  *
 | |
|  * Do NOT change the order of the values this enum or the function fields inside the
 | |
|  * `ZydisFormatter` struct.
 | |
|  */
 | |
| typedef enum ZydisFormatterFunction_
 | |
| {
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
|     /* Instruction                                                                              */
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * This function is invoked before the formatter formats an instruction.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION,
 | |
|     /**
 | |
|      * This function is invoked after the formatter formatted an instruction.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * This function refers to the main formatting function.
 | |
|      *
 | |
|      * Replacing this function allows for complete custom formatting, but indirectly disables all
 | |
|      * other hooks except for `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` and
 | |
|      * `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION`.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
|     /* Operands                                                                                 */
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * This function is invoked before the formatter formats an operand.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRE_OPERAND,
 | |
|     /**
 | |
|      * This function is invoked after the formatter formatted an operand.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_POST_OPERAND,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * This function is invoked to format a register operand.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG,
 | |
|     /**
 | |
|      * This function is invoked to format a memory operand.
 | |
|      *
 | |
|      * Replacing this function might indirectly disable some specific calls to the
 | |
|      * `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST`, `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT`,
 | |
|      * `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` and `ZYDIS_FORMATTER_FUNC_PRINT_DISP` functions.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM,
 | |
|     /**
 | |
|      * This function is invoked to format a pointer operand.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR,
 | |
|     /**
 | |
|      * This function is invoked to format an immediate operand.
 | |
|      *
 | |
|      * Replacing this function might indirectly disable some specific calls to the
 | |
|      * `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS`, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` and
 | |
|      * `ZYDIS_FORMATTER_FUNC_PRINT_IMM` functions.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
|     /* Elemental tokens                                                                         */
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * This function is invoked to print the instruction mnemonic.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * This function is invoked to print a register.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_REGISTER,
 | |
|     /**
 | |
|      * This function is invoked to print absolute addresses.
 | |
|      *
 | |
|      * Conditionally invoked, if a runtime-address different to `ZYDIS_RUNTIME_ADDRESS_NONE` was
 | |
|      * passed:
 | |
|      * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)
 | |
|      * - `MEM` operands with `EIP`/`RIP`-relative address (e.g. `MOV RAX, [RIP+0x12345678]`)
 | |
|      *
 | |
|      * Always invoked for:
 | |
|      * - `MEM` operands with absolute address (e.g. `MOV RAX, [0x12345678]`)
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS,
 | |
|     /**
 | |
|      * This function is invoked to print relative addresses.
 | |
|      *
 | |
|      * Conditionally invoked, if `ZYDIS_RUNTIME_ADDRESS_NONE` was passed as runtime-address:
 | |
|      * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL,
 | |
|     /**
 | |
|      * This function is invoked to print a memory displacement value.
 | |
|      *
 | |
|      * If the memory displacement contains an address and a runtime-address different to
 | |
|      * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` is called
 | |
|      * instead.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_DISP,
 | |
|     /**
 | |
|      * This function is invoked to print an immediate value.
 | |
|      *
 | |
|      * If the immediate contains an address and a runtime-address different to
 | |
|      * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` is called
 | |
|      * instead.
 | |
|      *
 | |
|      * If the immediate contains an address and `ZYDIS_RUNTIME_ADDRESS_NONE` was passed as
 | |
|      * runtime-address, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` is called instead.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_IMM,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
|     /* Optional tokens                                                                          */
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * This function is invoked to print the size of a memory operand (`INTEL` only).
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST,
 | |
|     /**
 | |
|      * This function is invoked to print the segment-register of a memory operand.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT,
 | |
|     /**
 | |
|      * This function is invoked to print the instruction prefixes.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES,
 | |
|     /**
 | |
|      * This function is invoked after formatting an operand to print a `EVEX`/`MVEX`
 | |
|      * decorator.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR,
 | |
| 
 | |
|     /* ---------------------------------------------------------------------------------------- */
 | |
| 
 | |
|     /**
 | |
|      * Maximum value of this enum.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_MAX_VALUE = ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR,
 | |
|     /**
 | |
|      * The minimum number of bits required to represent all values of this enum.
 | |
|      */
 | |
|     ZYDIS_FORMATTER_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_FUNC_MAX_VALUE)
 | |
| } ZydisFormatterFunction;
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Decorator types                                                                                */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Enum of all decorator types.
 | |
|  */
 | |
| typedef enum ZydisDecorator_
 | |
| {
 | |
|     ZYDIS_DECORATOR_INVALID,
 | |
|     /**
 | |
|      * The embedded-mask decorator.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_MASK,
 | |
|     /**
 | |
|      * The broadcast decorator.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_BC,
 | |
|     /**
 | |
|      * The rounding-control decorator.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_RC,
 | |
|     /**
 | |
|      * The suppress-all-exceptions decorator.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_SAE,
 | |
|     /**
 | |
|      * The register-swizzle decorator.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_SWIZZLE,
 | |
|     /**
 | |
|      * The conversion decorator.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_CONVERSION,
 | |
|     /**
 | |
|      * The eviction-hint decorator.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_EH,
 | |
| 
 | |
|     /**
 | |
|      * Maximum value of this enum.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_MAX_VALUE = ZYDIS_DECORATOR_EH,
 | |
|     /**
 | |
|      * The minimum number of bits required to represent all values of this enum.
 | |
|      */
 | |
|     ZYDIS_DECORATOR_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_DECORATOR_MAX_VALUE)
 | |
| } ZydisDecorator;
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Formatter context                                                                              */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| typedef struct ZydisFormatter_ ZydisFormatter;
 | |
| 
 | |
| /**
 | |
|  * Context structure that that is passed to all formatter.
 | |
|  */
 | |
| typedef struct ZydisFormatterContext_
 | |
| {
 | |
|     /**
 | |
|      * A pointer to the `ZydisDecodedInstruction` struct.
 | |
|      */
 | |
|     const ZydisDecodedInstruction* instruction;
 | |
|     /**
 | |
|      * A pointer to the first `ZydisDecodedOperand` struct of the instruction.
 | |
|      */
 | |
|     const ZydisDecodedOperand* operands;
 | |
|     /**
 | |
|      * A pointer to the `ZydisDecodedOperand` struct.
 | |
|      */
 | |
|     const ZydisDecodedOperand* operand;
 | |
|     /**
 | |
|      * The runtime address of the instruction.
 | |
|      */
 | |
|     ZyanU64 runtime_address;
 | |
|     /**
 | |
|      * A pointer to user-defined data.
 | |
|      *
 | |
|      * This is the value that was previously passed as the `user_data` argument to 
 | |
|      * @ref ZydisFormatterFormatInstruction or @ref ZydisFormatterTokenizeOperand.
 | |
|      */
 | |
|     void* user_data;
 | |
| } ZydisFormatterContext;
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Function prototypes                                                                            */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Defines the `ZydisFormatterFunc` function prototype.
 | |
|  *
 | |
|  * @param   formatter   A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.
 | |
|  * @param   context     A pointer to the `ZydisFormatterContext` struct.
 | |
|  *
 | |
|  * @return  A zyan status code.
 | |
|  *
 | |
|  * Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the formatting
 | |
|  * process to fail (see exceptions below).
 | |
|  *
 | |
|  * Returning `ZYDIS_STATUS_SKIP_TOKEN` is valid for functions of the following types and will
 | |
|  * instruct the formatter to omit the whole operand:
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM`
 | |
|  *
 | |
|  * This function prototype is used by functions of the following types:
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_DISP`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_IMM`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST`
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT`
 | |
|  */
 | |
| typedef ZyanStatus (*ZydisFormatterFunc)(const ZydisFormatter* formatter,
 | |
|     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
 | |
| 
 | |
|  /**
 | |
|  * Defines the `ZydisFormatterRegisterFunc` function prototype.
 | |
|  *
 | |
|  * @param   formatter   A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.
 | |
|  * @param   context     A pointer to the `ZydisFormatterContext` struct.
 | |
|  * @param   reg         The register.
 | |
|  *
 | |
|  * @return  Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the
 | |
|  *          formatting process to fail.
 | |
|  *
 | |
|  * This function prototype is used by functions of the following types:
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_REGISTER`.
 | |
|  */
 | |
| typedef ZyanStatus (*ZydisFormatterRegisterFunc)(const ZydisFormatter* formatter,
 | |
|     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg);
 | |
| 
 | |
| /**
 | |
|  * Defines the `ZydisFormatterDecoratorFunc` function prototype.
 | |
|  *
 | |
|  * @param   formatter   A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.
 | |
|  * @param   context     A pointer to the `ZydisFormatterContext` struct.
 | |
|  * @param   decorator   The decorator type.
 | |
|  *
 | |
|  * @return  Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the
 | |
|  *          formatting process to fail.
 | |
|  *
 | |
|  * This function type is used for:
 | |
|  * - `ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR`
 | |
|  */
 | |
| typedef ZyanStatus (*ZydisFormatterDecoratorFunc)(const ZydisFormatter* formatter,
 | |
|     ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisDecorator decorator);
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Formatter struct                                                                               */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Context structure keeping track of internal state of the formatter.
 | |
|  *
 | |
|  * All fields in this struct should be considered as "private". Any changes may lead to unexpected
 | |
|  * behavior.
 | |
|  *
 | |
|  * Do NOT change the order of the function fields or the values of the `ZydisFormatterFunction`
 | |
|  * enum.
 | |
|  */
 | |
| struct ZydisFormatter_
 | |
| {
 | |
|     /**
 | |
|      * The formatter style.
 | |
|      */
 | |
|     ZydisFormatterStyle style;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_PROP_FORCE_SIZE` property.
 | |
|      */
 | |
|     ZyanBool force_memory_size;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_PROP_FORCE_SEGMENT` property.
 | |
|      */
 | |
|     ZyanBool force_memory_segment;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE` property.
 | |
|      */
 | |
|     ZyanBool force_memory_scale;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES` property.
 | |
|      */
 | |
|     ZyanBool force_relative_branches;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL` property.
 | |
|      */
 | |
|     ZyanBool force_relative_riprel;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE` property.
 | |
|      */
 | |
|     ZyanBool print_branch_size;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_DETAILED_PREFIXES` property.
 | |
|      */
 | |
|     ZyanBool detailed_prefixes;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_ADDR_BASE` property.
 | |
|      */
 | |
|     ZydisNumericBase addr_base;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_ADDR_SIGNEDNESS` property.
 | |
|      */
 | |
|     ZydisSignedness addr_signedness;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_ADDR_PADDING_ABSOLUTE` property.
 | |
|      */
 | |
|     ZydisPadding addr_padding_absolute;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_ADDR_PADDING_RELATIVE` property.
 | |
|      */
 | |
|     ZydisPadding addr_padding_relative;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_DISP_BASE` property.
 | |
|      */
 | |
|     ZydisNumericBase disp_base;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_DISP_SIGNEDNESS` property.
 | |
|      */
 | |
|     ZydisSignedness disp_signedness;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_DISP_PADDING` property.
 | |
|      */
 | |
|     ZydisPadding disp_padding;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_IMM_BASE` property.
 | |
|      */
 | |
|     ZydisNumericBase imm_base;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_IMM_SIGNEDNESS` property.
 | |
|      */
 | |
|     ZydisSignedness imm_signedness;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_IMM_PADDING` property.
 | |
|      */
 | |
|     ZydisPadding imm_padding;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_UPPERCASE_PREFIXES` property.
 | |
|      */
 | |
|     ZyanI32 case_prefixes;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_UPPERCASE_MNEMONIC` property.
 | |
|      */
 | |
|     ZyanI32 case_mnemonic;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_UPPERCASE_REGISTERS` property.
 | |
|      */
 | |
|     ZyanI32 case_registers;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_UPPERCASE_TYPECASTS` property.
 | |
|      */
 | |
|     ZyanI32 case_typecasts;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_UPPERCASE_DECORATORS` property.
 | |
|      */
 | |
|     ZyanI32 case_decorators;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_HEX_UPPERCASE` property.
 | |
|      */
 | |
|     ZyanBool hex_uppercase;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_HEX_FORCE_LEADING_NUMBER` property.
 | |
|      */
 | |
|     ZyanBool hex_force_leading_number;
 | |
|     /**
 | |
|      * The number formats for all numeric bases.
 | |
|      *
 | |
|      * Index 0 = prefix
 | |
|      * Index 1 = suffix
 | |
|      */
 | |
|     struct
 | |
|     {
 | |
|         /**
 | |
|          * A pointer to the `ZyanStringView` to use as prefix/suffix.
 | |
|          */
 | |
|         const ZyanStringView* string;
 | |
|         /**
 | |
|          * The `ZyanStringView` to use as prefix/suffix
 | |
|          */
 | |
|         ZyanStringView string_data;
 | |
|         /**
 | |
|          * The actual string data.
 | |
|          */
 | |
|         char buffer[11];
 | |
|     } number_format[ZYDIS_NUMERIC_BASE_MAX_VALUE + 1][2];
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_pre_instruction;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_post_instruction;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_format_instruction;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRE_OPERAND` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_pre_operand;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_POST_OPERAND` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_post_operand;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_format_operand_reg;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_format_operand_mem;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_format_operand_ptr;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_format_operand_imm;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_print_mnemonic;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_REGISTER` function.
 | |
|      */
 | |
|     ZydisFormatterRegisterFunc func_print_register;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_print_address_abs;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_print_address_rel;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_DISP` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_print_disp;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_IMM` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_print_imm;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_print_typecast;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_print_segment;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES` function.
 | |
|      */
 | |
|     ZydisFormatterFunc func_print_prefixes;
 | |
|     /**
 | |
|      * The `ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR` function.
 | |
|      */
 | |
|     ZydisFormatterDecoratorFunc func_print_decorator;
 | |
| };
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /* ============================================================================================== */
 | |
| /* Exported functions                                                                             */
 | |
| /* ============================================================================================== */
 | |
| 
 | |
| /**
 | |
|  * @addtogroup formatter Formatter
 | |
|  * Functions allowing formatting of previously decoded instructions to human readable text.
 | |
|  * @{
 | |
|  */
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Initialization                                                                                 */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Initializes the given `ZydisFormatter` instance.
 | |
|  *
 | |
|  * @param   formatter   A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   style       The base formatter style (either `AT&T` or `Intel` style).
 | |
|  *
 | |
|  * @return  A zyan status code.
 | |
|  */
 | |
| ZYDIS_EXPORT ZyanStatus ZydisFormatterInit(ZydisFormatter* formatter, ZydisFormatterStyle style);
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Setter                                                                                         */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Changes the value of the specified formatter `property`.
 | |
|  *
 | |
|  * @param   formatter   A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   property    The id of the formatter-property.
 | |
|  * @param   value       The new value.
 | |
|  *
 | |
|  * @return  A zyan status code.
 | |
|  *
 | |
|  * This function returns `ZYAN_STATUS_INVALID_OPERATION` if a property can't be changed for the
 | |
|  * current formatter-style.
 | |
|  */
 | |
| ZYDIS_EXPORT ZyanStatus ZydisFormatterSetProperty(ZydisFormatter* formatter,
 | |
|     ZydisFormatterProperty property, ZyanUPointer value);
 | |
| 
 | |
| /**
 | |
|  * Replaces a formatter function with a custom callback and/or retrieves the currently
 | |
|  * used function.
 | |
|  *
 | |
|  * @param   formatter   A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   type        The formatter function-type.
 | |
|  * @param   callback    A pointer to a variable that contains the pointer of the callback function
 | |
|  *                      and receives the pointer of the currently used function.
 | |
|  *
 | |
|  * @return  A zyan status code.
 | |
|  *
 | |
|  * Call this function with `callback` pointing to a `ZYAN_NULL` value to retrieve the currently
 | |
|  * used function without replacing it.
 | |
|  *
 | |
|  * This function returns `ZYAN_STATUS_INVALID_OPERATION` if a function can't be replaced for the
 | |
|  * current formatter-style.
 | |
|  */
 | |
| ZYDIS_EXPORT ZyanStatus ZydisFormatterSetHook(ZydisFormatter* formatter,
 | |
|     ZydisFormatterFunction type, const void** callback);
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Formatting                                                                                     */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Formats the given instruction and writes it into the output buffer.
 | |
|  *
 | |
|  * @param   formatter       A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.
 | |
|  * @param   operands        A pointer to the decoded operands array.
 | |
|  * @param   operand_count   The length of the `operands` array. Must be equal to or greater than
 | |
|  *                          the value of `instruction->operand_count_visible`.
 | |
|  * @param   buffer          A pointer to the output buffer.
 | |
|  * @param   length          The length of the output buffer (in characters).
 | |
|  * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`
 | |
|  *                          to print relative addresses.
 | |
|  * @param   user_data       A pointer to user-defined data which can be used in custom formatter
 | |
|  *                          callbacks. Can be `ZYAN_NULL`.
 | |
|  *
 | |
|  * @return  A zyan status code.
 | |
|  */
 | |
| ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatInstruction(const ZydisFormatter* formatter,
 | |
|     const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,
 | |
|     ZyanU8 operand_count, char* buffer, ZyanUSize length, ZyanU64 runtime_address,
 | |
|     void* user_data);
 | |
| 
 | |
| /**
 | |
|  * Formats the given operand and writes it into the output buffer.
 | |
|  *
 | |
|  * @param   formatter       A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.
 | |
|  * @param   operand         A pointer to the `ZydisDecodedOperand` struct of the operand to format.
 | |
|  * @param   buffer          A pointer to the output buffer.
 | |
|  * @param   length          The length of the output buffer (in characters).
 | |
|  * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`
 | |
|  *                          to print relative addresses.
 | |
|  * @param   user_data       A pointer to user-defined data which can be used in custom formatter
 | |
|  *                          callbacks. Can be `ZYAN_NULL`.
 | |
|  *
 | |
|  * @return  A zyan status code.
 | |
|  *
 | |
|  * Use `ZydisFormatterFormatInstruction` or `ZydisFormatterFormatInstructionEx` to format a
 | |
|  * complete instruction.
 | |
|  */
 | |
| ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatOperand(const ZydisFormatter* formatter,
 | |
|     const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand,
 | |
|     char* buffer, ZyanUSize length, ZyanU64 runtime_address, void* user_data);
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| /* Tokenizing                                                                                     */
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * Tokenizes the given instruction and writes it into the output buffer.
 | |
|  *
 | |
|  * @param   formatter       A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.
 | |
|  * @param   operands        A pointer to the decoded operands array.
 | |
|  * @param   operand_count   The length of the `operands` array. Must be equal to or greater than
 | |
|  *                          the value of `instruction->operand_count_visible`.
 | |
|  * @param   buffer          A pointer to the output buffer.
 | |
|  * @param   length          The length of the output buffer (in bytes).
 | |
|  * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`
 | |
|  *                          to print relative addresses.
 | |
|  * @param   token           Receives a pointer to the first token in the output buffer.
 | |
|  * @param   user_data       A pointer to user-defined data which can be used in custom formatter
 | |
|  *                          callbacks. Can be `ZYAN_NULL`.
 | |
|  *
 | |
|  * @return  A zyan status code.
 | |
|  */
 | |
| ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeInstruction(const ZydisFormatter* formatter,
 | |
|     const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,
 | |
|     ZyanU8 operand_count, void* buffer, ZyanUSize length, ZyanU64 runtime_address,
 | |
|     ZydisFormatterTokenConst** token, void* user_data);
 | |
| 
 | |
| /**
 | |
|  * Tokenizes the given operand and writes it into the output buffer.
 | |
|  *
 | |
|  * @param   formatter       A pointer to the `ZydisFormatter` instance.
 | |
|  * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.
 | |
|  * @param   operand         A pointer to the `ZydisDecodedOperand` struct of the operand to format.
 | |
|  * @param   buffer          A pointer to the output buffer.
 | |
|  * @param   length          The length of the output buffer (in bytes).
 | |
|  * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`
 | |
|  *                          to print relative addresses.
 | |
|  * @param   token           Receives a pointer to the first token in the output buffer.
 | |
|  * @param   user_data       A pointer to user-defined data which can be used in custom formatter
 | |
|  *                          callbacks. Can be `ZYAN_NULL`.
 | |
|  *
 | |
|  * @return  A zyan status code.
 | |
|  *
 | |
|  * Use `ZydisFormatterTokenizeInstruction` to tokenize a complete instruction.
 | |
|  */
 | |
| ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeOperand(const ZydisFormatter* formatter,
 | |
|     const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand,
 | |
|     void* buffer, ZyanUSize length, ZyanU64 runtime_address, ZydisFormatterTokenConst** token,
 | |
|     void* user_data);
 | |
| 
 | |
| /* ---------------------------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * @}
 | |
|  */
 | |
| 
 | |
| /* ============================================================================================== */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* ZYDIS_FORMATTER_H */
 | 
