* 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.
/** * 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)
/** * Enum selecting the syntax to format the disassembly in.
*/ typedefenum 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;
/** * Enum selecting a property of the formatter.
*/ typedefenum 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,
/** * 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 pad all * addresses to the current address 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 pad all * addresses to the current address 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. * * WARNING: this is currently not implemented (ignored).
*/
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.
*/ typedefenum 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.
*/ typedefenum 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.
*/ typedefenum 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.
*/ typedefenum 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,
/** * 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,
/** * 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,
/** * 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;
/** * Enum of all decorator types.
*/ typedefenum 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;
/** * Context structure that that is passed to all formatter.
*/ typedefstruct 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);
/** * 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);
/** * 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, constvoid** callback);
/** * 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);
/** * 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);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.