* Add safetyhook, remove libudis86 Co-authored-by: bottiger1 <55270538+bottiger1@users.noreply.github.com> * Add modified CDetour Co-authored-by: bottiger1 <55270538+bottiger1@users.noreply.github.com> * Add CDetour [Safetyhook] to build script * Re-enable loader/core/corelogic, and fix new C++20 error * Reenable all extensions (except dhooks) * Make cstrike compile against new CDetour * Remove unused variable in sdktools output? * Make sdktools compile against new cdetour * Downgrade to C++17 * remove auto * fix compilation on linux * Re-enable dhooks * Re-authorise old compilers * Fix invalid downgrade of std::optional * readd libudis86 for dhooks only --------- Co-authored-by: Kenzzer <kenzzer@users.noreply.github.com> Co-authored-by: bottiger1 <55270538+bottiger1@users.noreply.github.com>
11885 lines
392 KiB
C++
11885 lines
392 KiB
C++
#define ZYCORE_STATIC_BUILD
|
|
#define ZYDIS_STATIC_BUILD
|
|
// DO NOT EDIT. This file is auto-generated by `amalgamate.py`.
|
|
|
|
|
|
//
|
|
// Header: Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Master include file. Includes everything else.
|
|
*/
|
|
|
|
#ifndef ZYDIS_H
|
|
#define ZYDIS_H
|
|
|
|
|
|
//
|
|
// Header: Zycore/Defines.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Core Library (Zycore-C)
|
|
|
|
Original Author : Florian Bernd, Joel Hoener
|
|
|
|
* 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
|
|
* General helper and platform detection macros.
|
|
*/
|
|
|
|
#ifndef ZYCORE_DEFINES_H
|
|
#define ZYCORE_DEFINES_H
|
|
|
|
/* ============================================================================================== */
|
|
/* Meta macros */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Concatenates two values using the stringify operator (`##`).
|
|
*
|
|
* @param x The first value.
|
|
* @param y The second value.
|
|
*
|
|
* @return The combined string of the given values.
|
|
*/
|
|
#define ZYAN_MACRO_CONCAT(x, y) x ## y
|
|
|
|
/**
|
|
* Concatenates two values using the stringify operator (`##`) and expands the value to
|
|
* be used in another macro.
|
|
*
|
|
* @param x The first value.
|
|
* @param y The second value.
|
|
*
|
|
* @return The combined string of the given values.
|
|
*/
|
|
#define ZYAN_MACRO_CONCAT_EXPAND(x, y) ZYAN_MACRO_CONCAT(x, y)
|
|
|
|
/* ============================================================================================== */
|
|
/* Compiler detection */
|
|
/* ============================================================================================== */
|
|
|
|
#if defined(__clang__)
|
|
# define ZYAN_CLANG
|
|
# define ZYAN_GNUC
|
|
#elif defined(__ICC) || defined(__INTEL_COMPILER)
|
|
# define ZYAN_ICC
|
|
#elif defined(__GNUC__) || defined(__GNUG__)
|
|
# define ZYAN_GCC
|
|
# define ZYAN_GNUC
|
|
#elif defined(_MSC_VER)
|
|
# define ZYAN_MSVC
|
|
#elif defined(__BORLANDC__)
|
|
# define ZYAN_BORLAND
|
|
#else
|
|
# define ZYAN_UNKNOWN_COMPILER
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Platform detection */
|
|
/* ============================================================================================== */
|
|
|
|
#if defined(_WIN32)
|
|
# define ZYAN_WINDOWS
|
|
#elif defined(__EMSCRIPTEN__)
|
|
# define ZYAN_EMSCRIPTEN
|
|
#elif defined(__wasi__) || defined(__WASI__)
|
|
// via: https://reviews.llvm.org/D57155
|
|
# define ZYAN_WASI
|
|
#elif defined(__APPLE__)
|
|
# define ZYAN_APPLE
|
|
# define ZYAN_POSIX
|
|
#elif defined(__linux)
|
|
# define ZYAN_LINUX
|
|
# define ZYAN_POSIX
|
|
#elif defined(__FreeBSD__)
|
|
# define ZYAN_FREEBSD
|
|
# define ZYAN_POSIX
|
|
#elif defined(sun) || defined(__sun)
|
|
# define ZYAN_SOLARIS
|
|
# define ZYAN_POSIX
|
|
#elif defined(__unix)
|
|
# define ZYAN_UNIX
|
|
# define ZYAN_POSIX
|
|
#elif defined(__posix)
|
|
# define ZYAN_POSIX
|
|
#else
|
|
# define ZYAN_UNKNOWN_PLATFORM
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Kernel mode detection */
|
|
/* ============================================================================================== */
|
|
|
|
#if (defined(ZYAN_WINDOWS) && defined(_KERNEL_MODE)) || \
|
|
(defined(ZYAN_APPLE) && defined(KERNEL)) || \
|
|
(defined(ZYAN_LINUX) && defined(__KERNEL__)) || \
|
|
(defined(__FreeBSD_kernel__))
|
|
# define ZYAN_KERNEL
|
|
#else
|
|
# define ZYAN_USER
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Architecture detection */
|
|
/* ============================================================================================== */
|
|
|
|
#if defined(_M_AMD64) || defined(__x86_64__)
|
|
# define ZYAN_X64
|
|
#elif defined(_M_IX86) || defined(__i386__)
|
|
# define ZYAN_X86
|
|
#elif defined(_M_ARM64) || defined(__aarch64__)
|
|
# define ZYAN_AARCH64
|
|
#elif defined(_M_ARM) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__)
|
|
# define ZYAN_ARM
|
|
#elif defined(__EMSCRIPTEN__) || defined(__wasm__) || defined(__WASM__)
|
|
# define ZYAN_WASM
|
|
#elif defined(__powerpc64__)
|
|
# define ZYAN_PPC64
|
|
#elif defined(__powerpc__)
|
|
# define ZYAN_PPC
|
|
#elif defined(__riscv) && __riscv_xlen == 64
|
|
# define ZYAN_RISCV64
|
|
#else
|
|
# error "Unsupported architecture detected"
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Debug/Release detection */
|
|
/* ============================================================================================== */
|
|
|
|
#if defined(ZYAN_MSVC) || defined(ZYAN_BORLAND)
|
|
# ifdef _DEBUG
|
|
# define ZYAN_DEBUG
|
|
# else
|
|
# define ZYAN_RELEASE
|
|
# endif
|
|
#elif defined(ZYAN_GNUC) || defined(ZYAN_ICC)
|
|
# ifdef NDEBUG
|
|
# define ZYAN_RELEASE
|
|
# else
|
|
# define ZYAN_DEBUG
|
|
# endif
|
|
#else
|
|
# define ZYAN_RELEASE
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Deprecation hint */
|
|
/* ============================================================================================== */
|
|
|
|
#if defined(ZYAN_GCC) || defined(ZYAN_CLANG)
|
|
# define ZYAN_DEPRECATED __attribute__((__deprecated__))
|
|
#elif defined(ZYAN_MSVC)
|
|
# define ZYAN_DEPRECATED __declspec(deprecated)
|
|
#else
|
|
# define ZYAN_DEPRECATED
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Generic DLL import/export helpers */
|
|
/* ============================================================================================== */
|
|
|
|
#if defined(ZYAN_MSVC)
|
|
# define ZYAN_DLLEXPORT __declspec(dllexport)
|
|
# define ZYAN_DLLIMPORT __declspec(dllimport)
|
|
#else
|
|
# define ZYAN_DLLEXPORT
|
|
# define ZYAN_DLLIMPORT
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Zycore dll{export,import} */
|
|
/* ============================================================================================== */
|
|
|
|
// This is a cut-down version of what CMake's `GenerateExportHeader` would usually generate. To
|
|
// simplify builds without CMake, we define these things manually instead of relying on CMake
|
|
// to generate the header.
|
|
//
|
|
// For static builds, our CMakeList will define `ZYCORE_STATIC_BUILD`. For shared library builds,
|
|
// our CMake will define `ZYCORE_SHOULD_EXPORT` depending on whether the target is being imported or
|
|
// exported. If CMake isn't used, users can manually define these to fit their use-case.
|
|
|
|
// Backward compatibility: CMake would previously generate these variables names. However, because
|
|
// they have pretty cryptic names, we renamed them when we got rid of `GenerateExportHeader`. For
|
|
// backward compatibility for users that don't use CMake and previously manually defined these, we
|
|
// translate the old defines here and print a warning.
|
|
#if defined(ZYCORE_STATIC_DEFINE)
|
|
# pragma message("ZYCORE_STATIC_DEFINE was renamed to ZYCORE_STATIC_BUILD.")
|
|
# define ZYCORE_STATIC_BUILD
|
|
#endif
|
|
#if defined(Zycore_EXPORTS)
|
|
# pragma message("Zycore_EXPORTS was renamed to ZYCORE_SHOULD_EXPORT.")
|
|
# define ZYCORE_SHOULD_EXPORT
|
|
#endif
|
|
|
|
/**
|
|
* Symbol is exported in shared library builds.
|
|
*/
|
|
#if defined(ZYCORE_STATIC_BUILD)
|
|
# define ZYCORE_EXPORT
|
|
#else
|
|
# if defined(ZYCORE_SHOULD_EXPORT)
|
|
# define ZYCORE_EXPORT ZYAN_DLLEXPORT
|
|
# else
|
|
# define ZYCORE_EXPORT ZYAN_DLLIMPORT
|
|
# endif
|
|
#endif
|
|
|
|
/**
|
|
* Symbol is not exported and for internal use only.
|
|
*/
|
|
#define ZYCORE_NO_EXPORT
|
|
|
|
/* ============================================================================================== */
|
|
/* Misc compatibility macros */
|
|
/* ============================================================================================== */
|
|
|
|
#if defined(ZYAN_CLANG)
|
|
# define ZYAN_NO_SANITIZE(what) __attribute__((no_sanitize(what)))
|
|
#else
|
|
# define ZYAN_NO_SANITIZE(what)
|
|
#endif
|
|
|
|
#if defined(ZYAN_MSVC) || defined(ZYAN_BORLAND)
|
|
# define ZYAN_INLINE __inline
|
|
#else
|
|
# define ZYAN_INLINE static inline
|
|
#endif
|
|
|
|
#if defined(ZYAN_MSVC)
|
|
# define ZYAN_NOINLINE __declspec(noinline)
|
|
#elif defined(ZYAN_GCC) || defined(ZYAN_CLANG)
|
|
# define ZYAN_NOINLINE __attribute__((noinline))
|
|
#else
|
|
# define ZYAN_NOINLINE
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Debugging and optimization macros */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Runtime debug assertion.
|
|
*/
|
|
#if defined(ZYAN_NO_LIBC)
|
|
# define ZYAN_ASSERT(condition) (void)(condition)
|
|
#elif defined(ZYAN_WINDOWS) && defined(ZYAN_KERNEL)
|
|
# include <wdm.h>
|
|
# define ZYAN_ASSERT(condition) NT_ASSERT(condition)
|
|
#else
|
|
# include <assert.h>
|
|
# define ZYAN_ASSERT(condition) assert(condition)
|
|
#endif
|
|
|
|
/**
|
|
* Compiler-time assertion.
|
|
*/
|
|
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__cplusplus)
|
|
# define ZYAN_STATIC_ASSERT(x) _Static_assert(x, #x)
|
|
#elif (defined(__cplusplus) && __cplusplus >= 201103L) || \
|
|
(defined(__cplusplus) && defined (_MSC_VER) && (_MSC_VER >= 1600)) || \
|
|
(defined (_MSC_VER) && (_MSC_VER >= 1800))
|
|
# define ZYAN_STATIC_ASSERT(x) static_assert(x, #x)
|
|
#else
|
|
# define ZYAN_STATIC_ASSERT(x) \
|
|
typedef int ZYAN_MACRO_CONCAT_EXPAND(ZYAN_SASSERT_, __COUNTER__) [(x) ? 1 : -1]
|
|
#endif
|
|
|
|
/**
|
|
* Marks the current code path as unreachable.
|
|
*/
|
|
#if defined(ZYAN_RELEASE)
|
|
# if defined(ZYAN_CLANG) // GCC eagerly evals && RHS, we have to use nested ifs.
|
|
# if __has_builtin(__builtin_unreachable)
|
|
# define ZYAN_UNREACHABLE __builtin_unreachable()
|
|
# else
|
|
# define ZYAN_UNREACHABLE for(;;)
|
|
# endif
|
|
# elif defined(ZYAN_GCC) && ((__GNUC__ == 4 && __GNUC_MINOR__ > 4) || __GNUC__ > 4)
|
|
# define ZYAN_UNREACHABLE __builtin_unreachable()
|
|
# elif defined(ZYAN_ICC)
|
|
# ifdef ZYAN_WINDOWS
|
|
# include <stdlib.h> // "missing return statement" workaround
|
|
# define ZYAN_UNREACHABLE __assume(0); (void)abort()
|
|
# else
|
|
# define ZYAN_UNREACHABLE __builtin_unreachable()
|
|
# endif
|
|
# elif defined(ZYAN_MSVC)
|
|
# define ZYAN_UNREACHABLE __assume(0)
|
|
# else
|
|
# define ZYAN_UNREACHABLE for(;;)
|
|
# endif
|
|
#elif defined(ZYAN_NO_LIBC)
|
|
# define ZYAN_UNREACHABLE for(;;)
|
|
#elif defined(ZYAN_WINDOWS) && defined(ZYAN_KERNEL)
|
|
# define ZYAN_UNREACHABLE { __fastfail(0); for(;;){} }
|
|
#else
|
|
# include <stdlib.h>
|
|
# define ZYAN_UNREACHABLE { assert(0); abort(); }
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Utils */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* General purpose */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Marks the specified parameter as unused.
|
|
*
|
|
* @param x The name of the unused parameter.
|
|
*/
|
|
#define ZYAN_UNUSED(x) (void)(x)
|
|
|
|
/**
|
|
* Intentional fallthrough.
|
|
*/
|
|
#if defined(ZYAN_GCC) && __GNUC__ >= 7
|
|
# define ZYAN_FALLTHROUGH ; __attribute__((__fallthrough__))
|
|
#else
|
|
# define ZYAN_FALLTHROUGH
|
|
#endif
|
|
|
|
/**
|
|
* Declares a bitfield.
|
|
*
|
|
* @param x The size (in bits) of the bitfield.
|
|
*/
|
|
#define ZYAN_BITFIELD(x) : x
|
|
|
|
/**
|
|
* Marks functions that require libc (cannot be used with `ZYAN_NO_LIBC`).
|
|
*/
|
|
#define ZYAN_REQUIRES_LIBC
|
|
|
|
/**
|
|
* Decorator for `printf`-style functions.
|
|
*
|
|
* @param format_index The 1-based index of the format string parameter.
|
|
* @param first_to_check The 1-based index of the format arguments parameter.
|
|
*/
|
|
#if defined(__RESHARPER__)
|
|
# define ZYAN_PRINTF_ATTR(format_index, first_to_check) \
|
|
[[gnu::format(printf, format_index, first_to_check)]]
|
|
#elif defined(ZYAN_GCC)
|
|
# define ZYAN_PRINTF_ATTR(format_index, first_to_check) \
|
|
__attribute__((format(printf, format_index, first_to_check)))
|
|
#else
|
|
# define ZYAN_PRINTF_ATTR(format_index, first_to_check)
|
|
#endif
|
|
|
|
/**
|
|
* Decorator for `wprintf`-style functions.
|
|
*
|
|
* @param format_index The 1-based index of the format string parameter.
|
|
* @param first_to_check The 1-based index of the format arguments parameter.
|
|
*/
|
|
#if defined(__RESHARPER__)
|
|
# define ZYAN_WPRINTF_ATTR(format_index, first_to_check) \
|
|
[[rscpp::format(wprintf, format_index, first_to_check)]]
|
|
#else
|
|
# define ZYAN_WPRINTF_ATTR(format_index, first_to_check)
|
|
#endif
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Arrays */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the length (number of elements) of an array.
|
|
*
|
|
* @param a The name of the array.
|
|
*
|
|
* @return The number of elements of the given array.
|
|
*/
|
|
#define ZYAN_ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Arithmetic */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the smaller value of `a` or `b`.
|
|
*
|
|
* @param a The first value.
|
|
* @param b The second value.
|
|
*
|
|
* @return The smaller value of `a` or `b`.
|
|
*/
|
|
#define ZYAN_MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
|
|
/**
|
|
* Returns the bigger value of `a` or `b`.
|
|
*
|
|
* @param a The first value.
|
|
* @param b The second value.
|
|
*
|
|
* @return The bigger value of `a` or `b`.
|
|
*/
|
|
#define ZYAN_MAX(a, b) (((a) > (b)) ? (a) : (b))
|
|
|
|
/**
|
|
* Returns the absolute value of `a`.
|
|
*
|
|
* @param a The value.
|
|
*
|
|
* @return The absolute value of `a`.
|
|
*/
|
|
#define ZYAN_ABS(a) (((a) < 0) ? -(a) : (a))
|
|
|
|
/**
|
|
* Checks, if the given value is a power of 2.
|
|
*
|
|
* @param x The value.
|
|
*
|
|
* @return `ZYAN_TRUE`, if the given value is a power of 2 or `ZYAN_FALSE`, if not.
|
|
*
|
|
* Note that this macro always returns `ZYAN_TRUE` for `x == 0`.
|
|
*/
|
|
#define ZYAN_IS_POWER_OF_2(x) (((x) & ((x) - 1)) == 0)
|
|
|
|
/**
|
|
* Checks, if the given value is properly aligned.
|
|
*
|
|
* Note that this macro only works for powers of 2.
|
|
*/
|
|
#define ZYAN_IS_ALIGNED_TO(x, align) (((x) & ((align) - 1)) == 0)
|
|
|
|
/**
|
|
* Aligns the value to the nearest given alignment boundary (by rounding it up).
|
|
*
|
|
* @param x The value.
|
|
* @param align The desired alignment.
|
|
*
|
|
* @return The aligned value.
|
|
*
|
|
* Note that this macro only works for powers of 2.
|
|
*/
|
|
#define ZYAN_ALIGN_UP(x, align) (((x) + (align) - 1) & ~((align) - 1))
|
|
|
|
/**
|
|
* Aligns the value to the nearest given alignment boundary (by rounding it down).
|
|
*
|
|
* @param x The value.
|
|
* @param align The desired alignment.
|
|
*
|
|
* @return The aligned value.
|
|
*
|
|
* Note that this macro only works for powers of 2.
|
|
*/
|
|
#define ZYAN_ALIGN_DOWN(x, align) (((x) - 1) & ~((align) - 1))
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Bit operations */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/*
|
|
* Checks, if the bit at index `b` is required to present the ordinal value `n`.
|
|
*
|
|
* @param n The ordinal value.
|
|
* @param b The bit index.
|
|
*
|
|
* @return `ZYAN_TRUE`, if the bit at index `b` is required to present the ordinal value `n` or
|
|
* `ZYAN_FALSE`, if not.
|
|
*
|
|
* Note that this macro always returns `ZYAN_FALSE` for `n == 0`.
|
|
*/
|
|
#define ZYAN_NEEDS_BIT(n, b) (((unsigned long)(n) >> (b)) > 0)
|
|
|
|
/*
|
|
* Returns the number of bits required to represent the ordinal value `n`.
|
|
*
|
|
* @param n The ordinal value.
|
|
*
|
|
* @return The number of bits required to represent the ordinal value `n`.
|
|
*
|
|
* Note that this macro returns `0` for `n == 0`.
|
|
*/
|
|
#define ZYAN_BITS_TO_REPRESENT(n) \
|
|
( \
|
|
ZYAN_NEEDS_BIT(n, 0) + ZYAN_NEEDS_BIT(n, 1) + \
|
|
ZYAN_NEEDS_BIT(n, 2) + ZYAN_NEEDS_BIT(n, 3) + \
|
|
ZYAN_NEEDS_BIT(n, 4) + ZYAN_NEEDS_BIT(n, 5) + \
|
|
ZYAN_NEEDS_BIT(n, 6) + ZYAN_NEEDS_BIT(n, 7) + \
|
|
ZYAN_NEEDS_BIT(n, 8) + ZYAN_NEEDS_BIT(n, 9) + \
|
|
ZYAN_NEEDS_BIT(n, 10) + ZYAN_NEEDS_BIT(n, 11) + \
|
|
ZYAN_NEEDS_BIT(n, 12) + ZYAN_NEEDS_BIT(n, 13) + \
|
|
ZYAN_NEEDS_BIT(n, 14) + ZYAN_NEEDS_BIT(n, 15) + \
|
|
ZYAN_NEEDS_BIT(n, 16) + ZYAN_NEEDS_BIT(n, 17) + \
|
|
ZYAN_NEEDS_BIT(n, 18) + ZYAN_NEEDS_BIT(n, 19) + \
|
|
ZYAN_NEEDS_BIT(n, 20) + ZYAN_NEEDS_BIT(n, 21) + \
|
|
ZYAN_NEEDS_BIT(n, 22) + ZYAN_NEEDS_BIT(n, 23) + \
|
|
ZYAN_NEEDS_BIT(n, 24) + ZYAN_NEEDS_BIT(n, 25) + \
|
|
ZYAN_NEEDS_BIT(n, 26) + ZYAN_NEEDS_BIT(n, 27) + \
|
|
ZYAN_NEEDS_BIT(n, 28) + ZYAN_NEEDS_BIT(n, 29) + \
|
|
ZYAN_NEEDS_BIT(n, 30) + ZYAN_NEEDS_BIT(n, 31) \
|
|
)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#endif /* ZYCORE_DEFINES_H */
|
|
|
|
//
|
|
// Header: Zycore/Types.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Core Library (Zyan-C)
|
|
|
|
Original Author : Florian Bernd, Joel Hoener
|
|
|
|
* 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
|
|
* Includes and defines some default data types.
|
|
*/
|
|
|
|
#ifndef ZYCORE_TYPES_H
|
|
#define ZYCORE_TYPES_H
|
|
|
|
|
|
/* ============================================================================================== */
|
|
/* Integer types */
|
|
/* ============================================================================================== */
|
|
|
|
#if defined(ZYAN_NO_LIBC) || \
|
|
(defined(ZYAN_MSVC) && defined(ZYAN_KERNEL)) // The WDK LibC lacks stdint.h.
|
|
// No LibC mode, use compiler built-in types / macros.
|
|
# if defined(ZYAN_MSVC) || defined(ZYAN_ICC)
|
|
typedef unsigned __int8 ZyanU8;
|
|
typedef unsigned __int16 ZyanU16;
|
|
typedef unsigned __int32 ZyanU32;
|
|
typedef unsigned __int64 ZyanU64;
|
|
typedef signed __int8 ZyanI8;
|
|
typedef signed __int16 ZyanI16;
|
|
typedef signed __int32 ZyanI32;
|
|
typedef signed __int64 ZyanI64;
|
|
# if _WIN64
|
|
typedef ZyanU64 ZyanUSize;
|
|
typedef ZyanI64 ZyanISize;
|
|
typedef ZyanU64 ZyanUPointer;
|
|
typedef ZyanI64 ZyanIPointer;
|
|
# else
|
|
typedef ZyanU32 ZyanUSize;
|
|
typedef ZyanI32 ZyanISize;
|
|
typedef ZyanU32 ZyanUPointer;
|
|
typedef ZyanI32 ZyanIPointer;
|
|
# endif
|
|
# elif defined(ZYAN_GNUC)
|
|
typedef __UINT8_TYPE__ ZyanU8;
|
|
typedef __UINT16_TYPE__ ZyanU16;
|
|
typedef __UINT32_TYPE__ ZyanU32;
|
|
typedef __UINT64_TYPE__ ZyanU64;
|
|
typedef __INT8_TYPE__ ZyanI8;
|
|
typedef __INT16_TYPE__ ZyanI16;
|
|
typedef __INT32_TYPE__ ZyanI32;
|
|
typedef __INT64_TYPE__ ZyanI64;
|
|
typedef __SIZE_TYPE__ ZyanUSize;
|
|
typedef __PTRDIFF_TYPE__ ZyanISize;
|
|
typedef __UINTPTR_TYPE__ ZyanUPointer;
|
|
typedef __INTPTR_TYPE__ ZyanIPointer;
|
|
# else
|
|
# error "Unsupported compiler for no-libc mode."
|
|
# endif
|
|
|
|
# if defined(ZYAN_MSVC)
|
|
# define ZYAN_INT8_MIN (-127i8 - 1)
|
|
# define ZYAN_INT16_MIN (-32767i16 - 1)
|
|
# define ZYAN_INT32_MIN (-2147483647i32 - 1)
|
|
# define ZYAN_INT64_MIN (-9223372036854775807i64 - 1)
|
|
# define ZYAN_INT8_MAX 127i8
|
|
# define ZYAN_INT16_MAX 32767i16
|
|
# define ZYAN_INT32_MAX 2147483647i32
|
|
# define ZYAN_INT64_MAX 9223372036854775807i64
|
|
# define ZYAN_UINT8_MAX 0xffui8
|
|
# define ZYAN_UINT16_MAX 0xffffui16
|
|
# define ZYAN_UINT32_MAX 0xffffffffui32
|
|
# define ZYAN_UINT64_MAX 0xffffffffffffffffui64
|
|
# else
|
|
# define ZYAN_INT8_MAX __INT8_MAX__
|
|
# define ZYAN_INT8_MIN (-ZYAN_INT8_MAX - 1)
|
|
# define ZYAN_INT16_MAX __INT16_MAX__
|
|
# define ZYAN_INT16_MIN (-ZYAN_INT16_MAX - 1)
|
|
# define ZYAN_INT32_MAX __INT32_MAX__
|
|
# define ZYAN_INT32_MIN (-ZYAN_INT32_MAX - 1)
|
|
# define ZYAN_INT64_MAX __INT64_MAX__
|
|
# define ZYAN_INT64_MIN (-ZYAN_INT64_MAX - 1)
|
|
# define ZYAN_UINT8_MAX __UINT8_MAX__
|
|
# define ZYAN_UINT16_MAX __UINT16_MAX__
|
|
# define ZYAN_UINT32_MAX __UINT32_MAX__
|
|
# define ZYAN_UINT64_MAX __UINT64_MAX__
|
|
# endif
|
|
#else
|
|
// If is LibC present, we use stdint types.
|
|
# include <stdint.h>
|
|
# include <stddef.h>
|
|
typedef uint8_t ZyanU8;
|
|
typedef uint16_t ZyanU16;
|
|
typedef uint32_t ZyanU32;
|
|
typedef uint64_t ZyanU64;
|
|
typedef int8_t ZyanI8;
|
|
typedef int16_t ZyanI16;
|
|
typedef int32_t ZyanI32;
|
|
typedef int64_t ZyanI64;
|
|
typedef size_t ZyanUSize;
|
|
typedef ptrdiff_t ZyanISize;
|
|
typedef uintptr_t ZyanUPointer;
|
|
typedef intptr_t ZyanIPointer;
|
|
|
|
# define ZYAN_INT8_MIN INT8_MIN
|
|
# define ZYAN_INT16_MIN INT16_MIN
|
|
# define ZYAN_INT32_MIN INT32_MIN
|
|
# define ZYAN_INT64_MIN INT64_MIN
|
|
# define ZYAN_INT8_MAX INT8_MAX
|
|
# define ZYAN_INT16_MAX INT16_MAX
|
|
# define ZYAN_INT32_MAX INT32_MAX
|
|
# define ZYAN_INT64_MAX INT64_MAX
|
|
# define ZYAN_UINT8_MAX UINT8_MAX
|
|
# define ZYAN_UINT16_MAX UINT16_MAX
|
|
# define ZYAN_UINT32_MAX UINT32_MAX
|
|
# define ZYAN_UINT64_MAX UINT64_MAX
|
|
#endif
|
|
|
|
// Verify size assumptions.
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanU8 ) == 1 );
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanU16 ) == 2 );
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanU32 ) == 4 );
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanU64 ) == 8 );
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanI8 ) == 1 );
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanI16 ) == 2 );
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanI32 ) == 4 );
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanI64 ) == 8 );
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanUSize ) == sizeof(void*)); // TODO: This one is incorrect!
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanISize ) == sizeof(void*)); // TODO: This one is incorrect!
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanUPointer) == sizeof(void*));
|
|
ZYAN_STATIC_ASSERT(sizeof(ZyanIPointer) == sizeof(void*));
|
|
|
|
// Verify signedness assumptions (relies on size checks above).
|
|
ZYAN_STATIC_ASSERT((ZyanI8 )-1 >> 1 < (ZyanI8 )((ZyanU8 )-1 >> 1));
|
|
ZYAN_STATIC_ASSERT((ZyanI16)-1 >> 1 < (ZyanI16)((ZyanU16)-1 >> 1));
|
|
ZYAN_STATIC_ASSERT((ZyanI32)-1 >> 1 < (ZyanI32)((ZyanU32)-1 >> 1));
|
|
ZYAN_STATIC_ASSERT((ZyanI64)-1 >> 1 < (ZyanI64)((ZyanU64)-1 >> 1));
|
|
|
|
/* ============================================================================================== */
|
|
/* Pointer */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Defines the `ZyanVoidPointer` data-type.
|
|
*/
|
|
typedef void* ZyanVoidPointer;
|
|
|
|
/**
|
|
* Defines the `ZyanConstVoidPointer` data-type.
|
|
*/
|
|
typedef const void* ZyanConstVoidPointer;
|
|
|
|
#define ZYAN_NULL ((void*)0)
|
|
|
|
/* ============================================================================================== */
|
|
/* Logic types */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Boolean */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#define ZYAN_FALSE 0u
|
|
#define ZYAN_TRUE 1u
|
|
|
|
/**
|
|
* Defines the `ZyanBool` data-type.
|
|
*
|
|
* Represents a default boolean data-type where `0` is interpreted as `false` and all other values
|
|
* as `true`.
|
|
*/
|
|
typedef ZyanU8 ZyanBool;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Ternary */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZyanTernary` data-type.
|
|
*
|
|
* The `ZyanTernary` is a balanced ternary type that uses three truth values indicating `true`,
|
|
* `false` and an indeterminate third value.
|
|
*/
|
|
typedef ZyanI8 ZyanTernary;
|
|
|
|
#define ZYAN_TERNARY_FALSE (-1)
|
|
#define ZYAN_TERNARY_UNKNOWN 0x00
|
|
#define ZYAN_TERNARY_TRUE 0x01
|
|
|
|
/* ============================================================================================== */
|
|
/* String types */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* C-style strings */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZyanCharPointer` data-type.
|
|
*
|
|
* This type is most often used to represent null-terminated strings aka. C-style strings.
|
|
*/
|
|
typedef char* ZyanCharPointer;
|
|
|
|
/**
|
|
* Defines the `ZyanConstCharPointer` data-type.
|
|
*
|
|
* This type is most often used to represent null-terminated strings aka. C-style strings.
|
|
*/
|
|
typedef const char* ZyanConstCharPointer;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#endif /* ZYCORE_TYPES_H */
|
|
|
|
#if !defined(ZYDIS_DISABLE_DECODER)
|
|
|
|
//
|
|
// Header: Zydis/Decoder.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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 decoding instructions.
|
|
*/
|
|
|
|
#ifndef ZYDIS_DECODER_H
|
|
#define ZYDIS_DECODER_H
|
|
|
|
|
|
//
|
|
// Header: Zydis/DecoderTypes.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Defines the basic `ZydisDecodedInstruction` and `ZydisDecodedOperand` structs.
|
|
*/
|
|
|
|
#ifndef ZYDIS_INSTRUCTIONINFO_H
|
|
#define ZYDIS_INSTRUCTIONINFO_H
|
|
|
|
|
|
//
|
|
// Header: Zydis/MetaInfo.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* @brief
|
|
*/
|
|
|
|
#ifndef ZYDIS_METAINFO_H
|
|
#define ZYDIS_METAINFO_H
|
|
|
|
|
|
//
|
|
// Header: Zydis/Defines.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
// - Zydis/MetaInfo.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Disassembler Library (Zydis)
|
|
|
|
Original Author : Joel Hoener
|
|
|
|
* 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
|
|
* Import/export defines for MSVC builds.
|
|
*/
|
|
|
|
#ifndef ZYDIS_DEFINES_H
|
|
#define ZYDIS_DEFINES_H
|
|
|
|
|
|
// This is a cut-down version of what CMake's `GenerateExportHeader` would usually generate. To
|
|
// simplify builds without CMake, we define these things manually instead of relying on CMake
|
|
// to generate the header.
|
|
//
|
|
// For static builds, our CMakeList will define `ZYDIS_STATIC_BUILD`. For shared library builds,
|
|
// our CMake will define `ZYDIS_SHOULD_EXPORT` depending on whether the target is being imported or
|
|
// exported. If CMake isn't used, users can manually define these to fit their use-case.
|
|
|
|
// Backward compatibility: CMake would previously generate these variables names. However, because
|
|
// they have pretty cryptic names, we renamed them when we got rid of `GenerateExportHeader`. For
|
|
// backward compatibility for users that don't use CMake and previously manually defined these, we
|
|
// translate the old defines here and print a warning.
|
|
#if defined(ZYDIS_STATIC_DEFINE)
|
|
# pragma message("ZYDIS_STATIC_DEFINE was renamed to ZYDIS_STATIC_BUILD.")
|
|
# define ZYDIS_STATIC_BUILD
|
|
#endif
|
|
#if defined(Zydis_EXPORTS)
|
|
# pragma message("Zydis_EXPORTS was renamed to ZYDIS_SHOULD_EXPORT.")
|
|
# define ZYDIS_SHOULD_EXPORT
|
|
#endif
|
|
|
|
/**
|
|
* Symbol is exported in shared library builds.
|
|
*/
|
|
#if defined(ZYDIS_STATIC_BUILD)
|
|
# define ZYDIS_EXPORT
|
|
#else
|
|
# if defined(ZYDIS_SHOULD_EXPORT)
|
|
# define ZYDIS_EXPORT ZYAN_DLLEXPORT
|
|
# else
|
|
# define ZYDIS_EXPORT ZYAN_DLLIMPORT
|
|
# endif
|
|
#endif
|
|
|
|
/**
|
|
* Symbol is not exported and for internal use only.
|
|
*/
|
|
#define ZYDIS_NO_EXPORT
|
|
|
|
#endif // ZYDIS_DEFINES_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
|
|
//
|
|
// Header: Zydis/Generated/EnumInstructionCategory.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
// - Zydis/MetaInfo.h
|
|
//
|
|
|
|
/**
|
|
* Defines the `ZydisInstructionCategory` enum.
|
|
*/
|
|
typedef enum ZydisInstructionCategory_
|
|
{
|
|
ZYDIS_CATEGORY_INVALID,
|
|
ZYDIS_CATEGORY_ADOX_ADCX,
|
|
ZYDIS_CATEGORY_AES,
|
|
ZYDIS_CATEGORY_AMD3DNOW,
|
|
ZYDIS_CATEGORY_AMX_TILE,
|
|
ZYDIS_CATEGORY_AVX,
|
|
ZYDIS_CATEGORY_AVX2,
|
|
ZYDIS_CATEGORY_AVX2GATHER,
|
|
ZYDIS_CATEGORY_AVX512,
|
|
ZYDIS_CATEGORY_AVX512_4FMAPS,
|
|
ZYDIS_CATEGORY_AVX512_4VNNIW,
|
|
ZYDIS_CATEGORY_AVX512_BITALG,
|
|
ZYDIS_CATEGORY_AVX512_VBMI,
|
|
ZYDIS_CATEGORY_AVX512_VP2INTERSECT,
|
|
ZYDIS_CATEGORY_BINARY,
|
|
ZYDIS_CATEGORY_BITBYTE,
|
|
ZYDIS_CATEGORY_BLEND,
|
|
ZYDIS_CATEGORY_BMI1,
|
|
ZYDIS_CATEGORY_BMI2,
|
|
ZYDIS_CATEGORY_BROADCAST,
|
|
ZYDIS_CATEGORY_CALL,
|
|
ZYDIS_CATEGORY_CET,
|
|
ZYDIS_CATEGORY_CLDEMOTE,
|
|
ZYDIS_CATEGORY_CLFLUSHOPT,
|
|
ZYDIS_CATEGORY_CLWB,
|
|
ZYDIS_CATEGORY_CLZERO,
|
|
ZYDIS_CATEGORY_CMOV,
|
|
ZYDIS_CATEGORY_COMPRESS,
|
|
ZYDIS_CATEGORY_COND_BR,
|
|
ZYDIS_CATEGORY_CONFLICT,
|
|
ZYDIS_CATEGORY_CONVERT,
|
|
ZYDIS_CATEGORY_DATAXFER,
|
|
ZYDIS_CATEGORY_DECIMAL,
|
|
ZYDIS_CATEGORY_ENQCMD,
|
|
ZYDIS_CATEGORY_EXPAND,
|
|
ZYDIS_CATEGORY_FCMOV,
|
|
ZYDIS_CATEGORY_FLAGOP,
|
|
ZYDIS_CATEGORY_FMA4,
|
|
ZYDIS_CATEGORY_FP16,
|
|
ZYDIS_CATEGORY_GATHER,
|
|
ZYDIS_CATEGORY_GFNI,
|
|
ZYDIS_CATEGORY_HRESET,
|
|
ZYDIS_CATEGORY_IFMA,
|
|
ZYDIS_CATEGORY_INTERRUPT,
|
|
ZYDIS_CATEGORY_IO,
|
|
ZYDIS_CATEGORY_IOSTRINGOP,
|
|
ZYDIS_CATEGORY_KEYLOCKER,
|
|
ZYDIS_CATEGORY_KEYLOCKER_WIDE,
|
|
ZYDIS_CATEGORY_KMASK,
|
|
ZYDIS_CATEGORY_KNC,
|
|
ZYDIS_CATEGORY_KNCMASK,
|
|
ZYDIS_CATEGORY_KNCSCALAR,
|
|
ZYDIS_CATEGORY_LEGACY,
|
|
ZYDIS_CATEGORY_LOGICAL,
|
|
ZYDIS_CATEGORY_LOGICAL_FP,
|
|
ZYDIS_CATEGORY_LZCNT,
|
|
ZYDIS_CATEGORY_MISC,
|
|
ZYDIS_CATEGORY_MMX,
|
|
ZYDIS_CATEGORY_MOVDIR,
|
|
ZYDIS_CATEGORY_MPX,
|
|
ZYDIS_CATEGORY_NOP,
|
|
ZYDIS_CATEGORY_PADLOCK,
|
|
ZYDIS_CATEGORY_PCLMULQDQ,
|
|
ZYDIS_CATEGORY_PCONFIG,
|
|
ZYDIS_CATEGORY_PKU,
|
|
ZYDIS_CATEGORY_POP,
|
|
ZYDIS_CATEGORY_PREFETCH,
|
|
ZYDIS_CATEGORY_PREFETCHWT1,
|
|
ZYDIS_CATEGORY_PT,
|
|
ZYDIS_CATEGORY_PUSH,
|
|
ZYDIS_CATEGORY_RDPID,
|
|
ZYDIS_CATEGORY_RDPRU,
|
|
ZYDIS_CATEGORY_RDRAND,
|
|
ZYDIS_CATEGORY_RDSEED,
|
|
ZYDIS_CATEGORY_RDWRFSGS,
|
|
ZYDIS_CATEGORY_RET,
|
|
ZYDIS_CATEGORY_ROTATE,
|
|
ZYDIS_CATEGORY_SCATTER,
|
|
ZYDIS_CATEGORY_SEGOP,
|
|
ZYDIS_CATEGORY_SEMAPHORE,
|
|
ZYDIS_CATEGORY_SERIALIZE,
|
|
ZYDIS_CATEGORY_SETCC,
|
|
ZYDIS_CATEGORY_SGX,
|
|
ZYDIS_CATEGORY_SHA,
|
|
ZYDIS_CATEGORY_SHIFT,
|
|
ZYDIS_CATEGORY_SMAP,
|
|
ZYDIS_CATEGORY_SSE,
|
|
ZYDIS_CATEGORY_STRINGOP,
|
|
ZYDIS_CATEGORY_STTNI,
|
|
ZYDIS_CATEGORY_SYSCALL,
|
|
ZYDIS_CATEGORY_SYSRET,
|
|
ZYDIS_CATEGORY_SYSTEM,
|
|
ZYDIS_CATEGORY_TBM,
|
|
ZYDIS_CATEGORY_TSX_LDTRK,
|
|
ZYDIS_CATEGORY_UFMA,
|
|
ZYDIS_CATEGORY_UINTR,
|
|
ZYDIS_CATEGORY_UNCOND_BR,
|
|
ZYDIS_CATEGORY_VAES,
|
|
ZYDIS_CATEGORY_VBMI2,
|
|
ZYDIS_CATEGORY_VEX,
|
|
ZYDIS_CATEGORY_VFMA,
|
|
ZYDIS_CATEGORY_VPCLMULQDQ,
|
|
ZYDIS_CATEGORY_VTX,
|
|
ZYDIS_CATEGORY_WAITPKG,
|
|
ZYDIS_CATEGORY_WIDENOP,
|
|
ZYDIS_CATEGORY_X87_ALU,
|
|
ZYDIS_CATEGORY_XOP,
|
|
ZYDIS_CATEGORY_XSAVE,
|
|
ZYDIS_CATEGORY_XSAVEOPT,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_CATEGORY_MAX_VALUE = ZYDIS_CATEGORY_XSAVEOPT,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_CATEGORY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CATEGORY_MAX_VALUE)
|
|
} ZydisInstructionCategory;
|
|
|
|
//
|
|
// Header: Zydis/Generated/EnumISASet.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
// - Zydis/MetaInfo.h
|
|
//
|
|
|
|
/**
|
|
* Defines the `ZydisISASet` enum.
|
|
*/
|
|
typedef enum ZydisISASet_
|
|
{
|
|
ZYDIS_ISA_SET_INVALID,
|
|
ZYDIS_ISA_SET_ADOX_ADCX,
|
|
ZYDIS_ISA_SET_AES,
|
|
ZYDIS_ISA_SET_AMD,
|
|
ZYDIS_ISA_SET_AMD3DNOW,
|
|
ZYDIS_ISA_SET_AMD_INVLPGB,
|
|
ZYDIS_ISA_SET_AMX_BF16,
|
|
ZYDIS_ISA_SET_AMX_INT8,
|
|
ZYDIS_ISA_SET_AMX_TILE,
|
|
ZYDIS_ISA_SET_AVX,
|
|
ZYDIS_ISA_SET_AVX2,
|
|
ZYDIS_ISA_SET_AVX2GATHER,
|
|
ZYDIS_ISA_SET_AVX512BW_128,
|
|
ZYDIS_ISA_SET_AVX512BW_128N,
|
|
ZYDIS_ISA_SET_AVX512BW_256,
|
|
ZYDIS_ISA_SET_AVX512BW_512,
|
|
ZYDIS_ISA_SET_AVX512BW_KOP,
|
|
ZYDIS_ISA_SET_AVX512CD_128,
|
|
ZYDIS_ISA_SET_AVX512CD_256,
|
|
ZYDIS_ISA_SET_AVX512CD_512,
|
|
ZYDIS_ISA_SET_AVX512DQ_128,
|
|
ZYDIS_ISA_SET_AVX512DQ_128N,
|
|
ZYDIS_ISA_SET_AVX512DQ_256,
|
|
ZYDIS_ISA_SET_AVX512DQ_512,
|
|
ZYDIS_ISA_SET_AVX512DQ_KOP,
|
|
ZYDIS_ISA_SET_AVX512DQ_SCALAR,
|
|
ZYDIS_ISA_SET_AVX512ER_512,
|
|
ZYDIS_ISA_SET_AVX512ER_SCALAR,
|
|
ZYDIS_ISA_SET_AVX512F_128,
|
|
ZYDIS_ISA_SET_AVX512F_128N,
|
|
ZYDIS_ISA_SET_AVX512F_256,
|
|
ZYDIS_ISA_SET_AVX512F_512,
|
|
ZYDIS_ISA_SET_AVX512F_KOP,
|
|
ZYDIS_ISA_SET_AVX512F_SCALAR,
|
|
ZYDIS_ISA_SET_AVX512PF_512,
|
|
ZYDIS_ISA_SET_AVX512_4FMAPS_512,
|
|
ZYDIS_ISA_SET_AVX512_4FMAPS_SCALAR,
|
|
ZYDIS_ISA_SET_AVX512_4VNNIW_512,
|
|
ZYDIS_ISA_SET_AVX512_BF16_128,
|
|
ZYDIS_ISA_SET_AVX512_BF16_256,
|
|
ZYDIS_ISA_SET_AVX512_BF16_512,
|
|
ZYDIS_ISA_SET_AVX512_BITALG_128,
|
|
ZYDIS_ISA_SET_AVX512_BITALG_256,
|
|
ZYDIS_ISA_SET_AVX512_BITALG_512,
|
|
ZYDIS_ISA_SET_AVX512_FP16_128,
|
|
ZYDIS_ISA_SET_AVX512_FP16_128N,
|
|
ZYDIS_ISA_SET_AVX512_FP16_256,
|
|
ZYDIS_ISA_SET_AVX512_FP16_512,
|
|
ZYDIS_ISA_SET_AVX512_FP16_SCALAR,
|
|
ZYDIS_ISA_SET_AVX512_GFNI_128,
|
|
ZYDIS_ISA_SET_AVX512_GFNI_256,
|
|
ZYDIS_ISA_SET_AVX512_GFNI_512,
|
|
ZYDIS_ISA_SET_AVX512_IFMA_128,
|
|
ZYDIS_ISA_SET_AVX512_IFMA_256,
|
|
ZYDIS_ISA_SET_AVX512_IFMA_512,
|
|
ZYDIS_ISA_SET_AVX512_VAES_128,
|
|
ZYDIS_ISA_SET_AVX512_VAES_256,
|
|
ZYDIS_ISA_SET_AVX512_VAES_512,
|
|
ZYDIS_ISA_SET_AVX512_VBMI2_128,
|
|
ZYDIS_ISA_SET_AVX512_VBMI2_256,
|
|
ZYDIS_ISA_SET_AVX512_VBMI2_512,
|
|
ZYDIS_ISA_SET_AVX512_VBMI_128,
|
|
ZYDIS_ISA_SET_AVX512_VBMI_256,
|
|
ZYDIS_ISA_SET_AVX512_VBMI_512,
|
|
ZYDIS_ISA_SET_AVX512_VNNI_128,
|
|
ZYDIS_ISA_SET_AVX512_VNNI_256,
|
|
ZYDIS_ISA_SET_AVX512_VNNI_512,
|
|
ZYDIS_ISA_SET_AVX512_VP2INTERSECT_128,
|
|
ZYDIS_ISA_SET_AVX512_VP2INTERSECT_256,
|
|
ZYDIS_ISA_SET_AVX512_VP2INTERSECT_512,
|
|
ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_128,
|
|
ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_256,
|
|
ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_512,
|
|
ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_128,
|
|
ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_256,
|
|
ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_512,
|
|
ZYDIS_ISA_SET_AVXAES,
|
|
ZYDIS_ISA_SET_AVX_GFNI,
|
|
ZYDIS_ISA_SET_AVX_VNNI,
|
|
ZYDIS_ISA_SET_BMI1,
|
|
ZYDIS_ISA_SET_BMI2,
|
|
ZYDIS_ISA_SET_CET,
|
|
ZYDIS_ISA_SET_CLDEMOTE,
|
|
ZYDIS_ISA_SET_CLFLUSHOPT,
|
|
ZYDIS_ISA_SET_CLFSH,
|
|
ZYDIS_ISA_SET_CLWB,
|
|
ZYDIS_ISA_SET_CLZERO,
|
|
ZYDIS_ISA_SET_CMOV,
|
|
ZYDIS_ISA_SET_CMPXCHG16B,
|
|
ZYDIS_ISA_SET_ENQCMD,
|
|
ZYDIS_ISA_SET_F16C,
|
|
ZYDIS_ISA_SET_FAT_NOP,
|
|
ZYDIS_ISA_SET_FCMOV,
|
|
ZYDIS_ISA_SET_FMA,
|
|
ZYDIS_ISA_SET_FMA4,
|
|
ZYDIS_ISA_SET_FXSAVE,
|
|
ZYDIS_ISA_SET_FXSAVE64,
|
|
ZYDIS_ISA_SET_GFNI,
|
|
ZYDIS_ISA_SET_HRESET,
|
|
ZYDIS_ISA_SET_I186,
|
|
ZYDIS_ISA_SET_I286PROTECTED,
|
|
ZYDIS_ISA_SET_I286REAL,
|
|
ZYDIS_ISA_SET_I386,
|
|
ZYDIS_ISA_SET_I486,
|
|
ZYDIS_ISA_SET_I486REAL,
|
|
ZYDIS_ISA_SET_I86,
|
|
ZYDIS_ISA_SET_INVPCID,
|
|
ZYDIS_ISA_SET_KEYLOCKER,
|
|
ZYDIS_ISA_SET_KEYLOCKER_WIDE,
|
|
ZYDIS_ISA_SET_KNCE,
|
|
ZYDIS_ISA_SET_KNCJKBR,
|
|
ZYDIS_ISA_SET_KNCSTREAM,
|
|
ZYDIS_ISA_SET_KNCV,
|
|
ZYDIS_ISA_SET_KNC_MISC,
|
|
ZYDIS_ISA_SET_KNC_PF_HINT,
|
|
ZYDIS_ISA_SET_LAHF,
|
|
ZYDIS_ISA_SET_LONGMODE,
|
|
ZYDIS_ISA_SET_LWP,
|
|
ZYDIS_ISA_SET_LZCNT,
|
|
ZYDIS_ISA_SET_MCOMMIT,
|
|
ZYDIS_ISA_SET_MONITOR,
|
|
ZYDIS_ISA_SET_MONITORX,
|
|
ZYDIS_ISA_SET_MOVBE,
|
|
ZYDIS_ISA_SET_MOVDIR,
|
|
ZYDIS_ISA_SET_MPX,
|
|
ZYDIS_ISA_SET_PADLOCK_ACE,
|
|
ZYDIS_ISA_SET_PADLOCK_PHE,
|
|
ZYDIS_ISA_SET_PADLOCK_PMM,
|
|
ZYDIS_ISA_SET_PADLOCK_RNG,
|
|
ZYDIS_ISA_SET_PAUSE,
|
|
ZYDIS_ISA_SET_PCLMULQDQ,
|
|
ZYDIS_ISA_SET_PCONFIG,
|
|
ZYDIS_ISA_SET_PENTIUMMMX,
|
|
ZYDIS_ISA_SET_PENTIUMREAL,
|
|
ZYDIS_ISA_SET_PKU,
|
|
ZYDIS_ISA_SET_POPCNT,
|
|
ZYDIS_ISA_SET_PPRO,
|
|
ZYDIS_ISA_SET_PREFETCHWT1,
|
|
ZYDIS_ISA_SET_PREFETCH_NOP,
|
|
ZYDIS_ISA_SET_PT,
|
|
ZYDIS_ISA_SET_RDPID,
|
|
ZYDIS_ISA_SET_RDPMC,
|
|
ZYDIS_ISA_SET_RDPRU,
|
|
ZYDIS_ISA_SET_RDRAND,
|
|
ZYDIS_ISA_SET_RDSEED,
|
|
ZYDIS_ISA_SET_RDTSCP,
|
|
ZYDIS_ISA_SET_RDWRFSGS,
|
|
ZYDIS_ISA_SET_RTM,
|
|
ZYDIS_ISA_SET_SERIALIZE,
|
|
ZYDIS_ISA_SET_SGX,
|
|
ZYDIS_ISA_SET_SGX_ENCLV,
|
|
ZYDIS_ISA_SET_SHA,
|
|
ZYDIS_ISA_SET_SMAP,
|
|
ZYDIS_ISA_SET_SMX,
|
|
ZYDIS_ISA_SET_SNP,
|
|
ZYDIS_ISA_SET_SSE,
|
|
ZYDIS_ISA_SET_SSE2,
|
|
ZYDIS_ISA_SET_SSE2MMX,
|
|
ZYDIS_ISA_SET_SSE3,
|
|
ZYDIS_ISA_SET_SSE3X87,
|
|
ZYDIS_ISA_SET_SSE4,
|
|
ZYDIS_ISA_SET_SSE42,
|
|
ZYDIS_ISA_SET_SSE4A,
|
|
ZYDIS_ISA_SET_SSEMXCSR,
|
|
ZYDIS_ISA_SET_SSE_PREFETCH,
|
|
ZYDIS_ISA_SET_SSSE3,
|
|
ZYDIS_ISA_SET_SSSE3MMX,
|
|
ZYDIS_ISA_SET_SVM,
|
|
ZYDIS_ISA_SET_TBM,
|
|
ZYDIS_ISA_SET_TDX,
|
|
ZYDIS_ISA_SET_TSX_LDTRK,
|
|
ZYDIS_ISA_SET_UINTR,
|
|
ZYDIS_ISA_SET_VAES,
|
|
ZYDIS_ISA_SET_VMFUNC,
|
|
ZYDIS_ISA_SET_VPCLMULQDQ,
|
|
ZYDIS_ISA_SET_VTX,
|
|
ZYDIS_ISA_SET_WAITPKG,
|
|
ZYDIS_ISA_SET_X87,
|
|
ZYDIS_ISA_SET_XOP,
|
|
ZYDIS_ISA_SET_XSAVE,
|
|
ZYDIS_ISA_SET_XSAVEC,
|
|
ZYDIS_ISA_SET_XSAVEOPT,
|
|
ZYDIS_ISA_SET_XSAVES,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_ISA_SET_MAX_VALUE = ZYDIS_ISA_SET_XSAVES,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_ISA_SET_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ISA_SET_MAX_VALUE)
|
|
} ZydisISASet;
|
|
|
|
//
|
|
// Header: Zydis/Generated/EnumISAExt.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
// - Zydis/MetaInfo.h
|
|
//
|
|
|
|
/**
|
|
* Defines the `ZydisISAExt` enum.
|
|
*/
|
|
typedef enum ZydisISAExt_
|
|
{
|
|
ZYDIS_ISA_EXT_INVALID,
|
|
ZYDIS_ISA_EXT_ADOX_ADCX,
|
|
ZYDIS_ISA_EXT_AES,
|
|
ZYDIS_ISA_EXT_AMD3DNOW,
|
|
ZYDIS_ISA_EXT_AMD3DNOW_PREFETCH,
|
|
ZYDIS_ISA_EXT_AMD_INVLPGB,
|
|
ZYDIS_ISA_EXT_AMX_BF16,
|
|
ZYDIS_ISA_EXT_AMX_INT8,
|
|
ZYDIS_ISA_EXT_AMX_TILE,
|
|
ZYDIS_ISA_EXT_AVX,
|
|
ZYDIS_ISA_EXT_AVX2,
|
|
ZYDIS_ISA_EXT_AVX2GATHER,
|
|
ZYDIS_ISA_EXT_AVX512EVEX,
|
|
ZYDIS_ISA_EXT_AVX512VEX,
|
|
ZYDIS_ISA_EXT_AVXAES,
|
|
ZYDIS_ISA_EXT_AVX_VNNI,
|
|
ZYDIS_ISA_EXT_BASE,
|
|
ZYDIS_ISA_EXT_BMI1,
|
|
ZYDIS_ISA_EXT_BMI2,
|
|
ZYDIS_ISA_EXT_CET,
|
|
ZYDIS_ISA_EXT_CLDEMOTE,
|
|
ZYDIS_ISA_EXT_CLFLUSHOPT,
|
|
ZYDIS_ISA_EXT_CLFSH,
|
|
ZYDIS_ISA_EXT_CLWB,
|
|
ZYDIS_ISA_EXT_CLZERO,
|
|
ZYDIS_ISA_EXT_ENQCMD,
|
|
ZYDIS_ISA_EXT_F16C,
|
|
ZYDIS_ISA_EXT_FMA,
|
|
ZYDIS_ISA_EXT_FMA4,
|
|
ZYDIS_ISA_EXT_GFNI,
|
|
ZYDIS_ISA_EXT_HRESET,
|
|
ZYDIS_ISA_EXT_INVPCID,
|
|
ZYDIS_ISA_EXT_KEYLOCKER,
|
|
ZYDIS_ISA_EXT_KEYLOCKER_WIDE,
|
|
ZYDIS_ISA_EXT_KNC,
|
|
ZYDIS_ISA_EXT_KNCE,
|
|
ZYDIS_ISA_EXT_KNCV,
|
|
ZYDIS_ISA_EXT_LONGMODE,
|
|
ZYDIS_ISA_EXT_LZCNT,
|
|
ZYDIS_ISA_EXT_MCOMMIT,
|
|
ZYDIS_ISA_EXT_MMX,
|
|
ZYDIS_ISA_EXT_MONITOR,
|
|
ZYDIS_ISA_EXT_MONITORX,
|
|
ZYDIS_ISA_EXT_MOVBE,
|
|
ZYDIS_ISA_EXT_MOVDIR,
|
|
ZYDIS_ISA_EXT_MPX,
|
|
ZYDIS_ISA_EXT_PADLOCK,
|
|
ZYDIS_ISA_EXT_PAUSE,
|
|
ZYDIS_ISA_EXT_PCLMULQDQ,
|
|
ZYDIS_ISA_EXT_PCONFIG,
|
|
ZYDIS_ISA_EXT_PKU,
|
|
ZYDIS_ISA_EXT_PREFETCHWT1,
|
|
ZYDIS_ISA_EXT_PT,
|
|
ZYDIS_ISA_EXT_RDPID,
|
|
ZYDIS_ISA_EXT_RDPRU,
|
|
ZYDIS_ISA_EXT_RDRAND,
|
|
ZYDIS_ISA_EXT_RDSEED,
|
|
ZYDIS_ISA_EXT_RDTSCP,
|
|
ZYDIS_ISA_EXT_RDWRFSGS,
|
|
ZYDIS_ISA_EXT_RTM,
|
|
ZYDIS_ISA_EXT_SERIALIZE,
|
|
ZYDIS_ISA_EXT_SGX,
|
|
ZYDIS_ISA_EXT_SGX_ENCLV,
|
|
ZYDIS_ISA_EXT_SHA,
|
|
ZYDIS_ISA_EXT_SMAP,
|
|
ZYDIS_ISA_EXT_SMX,
|
|
ZYDIS_ISA_EXT_SNP,
|
|
ZYDIS_ISA_EXT_SSE,
|
|
ZYDIS_ISA_EXT_SSE2,
|
|
ZYDIS_ISA_EXT_SSE3,
|
|
ZYDIS_ISA_EXT_SSE4,
|
|
ZYDIS_ISA_EXT_SSE4A,
|
|
ZYDIS_ISA_EXT_SSSE3,
|
|
ZYDIS_ISA_EXT_SVM,
|
|
ZYDIS_ISA_EXT_TBM,
|
|
ZYDIS_ISA_EXT_TDX,
|
|
ZYDIS_ISA_EXT_TSX_LDTRK,
|
|
ZYDIS_ISA_EXT_UINTR,
|
|
ZYDIS_ISA_EXT_VAES,
|
|
ZYDIS_ISA_EXT_VMFUNC,
|
|
ZYDIS_ISA_EXT_VPCLMULQDQ,
|
|
ZYDIS_ISA_EXT_VTX,
|
|
ZYDIS_ISA_EXT_WAITPKG,
|
|
ZYDIS_ISA_EXT_X87,
|
|
ZYDIS_ISA_EXT_XOP,
|
|
ZYDIS_ISA_EXT_XSAVE,
|
|
ZYDIS_ISA_EXT_XSAVEC,
|
|
ZYDIS_ISA_EXT_XSAVEOPT,
|
|
ZYDIS_ISA_EXT_XSAVES,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_ISA_EXT_MAX_VALUE = ZYDIS_ISA_EXT_XSAVES,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_ISA_EXT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ISA_EXT_MAX_VALUE)
|
|
} ZydisISAExt;
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Returns the specified instruction category string.
|
|
*
|
|
* @param category The instruction category.
|
|
*
|
|
* @return The instruction category string or `ZYAN_NULL`, if an invalid category was passed.
|
|
*/
|
|
ZYDIS_EXPORT const char* ZydisCategoryGetString(ZydisInstructionCategory category);
|
|
|
|
/**
|
|
* Returns the specified isa-set string.
|
|
*
|
|
* @param isa_set The isa-set.
|
|
*
|
|
* @return The isa-set string or `ZYAN_NULL`, if an invalid isa-set was passed.
|
|
*/
|
|
ZYDIS_EXPORT const char* ZydisISASetGetString(ZydisISASet isa_set);
|
|
|
|
/**
|
|
* Returns the specified isa-extension string.
|
|
*
|
|
* @param isa_ext The isa-extension.
|
|
*
|
|
* @return The isa-extension string or `ZYAN_NULL`, if an invalid isa-extension was passed.
|
|
*/
|
|
ZYDIS_EXPORT const char* ZydisISAExtGetString(ZydisISAExt isa_ext);
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_METAINFO_H */
|
|
|
|
//
|
|
// Header: Zydis/Mnemonic.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Mnemonic constant definitions and helper functions.
|
|
*/
|
|
|
|
#ifndef ZYDIS_MNEMONIC_H
|
|
#define ZYDIS_MNEMONIC_H
|
|
|
|
|
|
//
|
|
// Header: Zydis/ShortString.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
// - Zydis/Mnemonic.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Defines the immutable and storage-efficient `ZydisShortString` struct, which
|
|
* is used to store strings in the generated tables.
|
|
*/
|
|
|
|
#ifndef ZYDIS_SHORTSTRING_H
|
|
#define ZYDIS_SHORTSTRING_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
#if !(defined(ZYAN_AARCH64) && defined(ZYAN_APPLE))
|
|
# pragma pack(push, 1)
|
|
#endif
|
|
|
|
/**
|
|
* Defines the `ZydisShortString` struct.
|
|
*
|
|
* This compact struct is mainly used for internal string-tables to save up some bytes.
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may lead to unexpected
|
|
* behavior.
|
|
*/
|
|
typedef struct ZydisShortString_
|
|
{
|
|
/**
|
|
* The buffer that contains the actual (null-terminated) string.
|
|
*/
|
|
const char* data;
|
|
/**
|
|
* The length (number of characters) of the string (without 0-termination).
|
|
*/
|
|
ZyanU8 size;
|
|
} ZydisShortString;
|
|
|
|
#if !(defined(ZYAN_AARCH64) && defined(ZYAN_APPLE))
|
|
# pragma pack(pop)
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Declares a `ZydisShortString` from a static C-style string.
|
|
*
|
|
* @param string The C-string constant.
|
|
*/
|
|
#define ZYDIS_MAKE_SHORTSTRING(string) \
|
|
{ string, sizeof(string) - 1 }
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_SHORTSTRING_H */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
|
|
//
|
|
// Header: Zydis/Generated/EnumMnemonic.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
// - Zydis/Mnemonic.h
|
|
//
|
|
|
|
/**
|
|
* Defines the `ZydisMnemonic` enum.
|
|
*/
|
|
typedef enum ZydisMnemonic_
|
|
{
|
|
ZYDIS_MNEMONIC_INVALID,
|
|
ZYDIS_MNEMONIC_AAA,
|
|
ZYDIS_MNEMONIC_AAD,
|
|
ZYDIS_MNEMONIC_AAM,
|
|
ZYDIS_MNEMONIC_AAS,
|
|
ZYDIS_MNEMONIC_ADC,
|
|
ZYDIS_MNEMONIC_ADCX,
|
|
ZYDIS_MNEMONIC_ADD,
|
|
ZYDIS_MNEMONIC_ADDPD,
|
|
ZYDIS_MNEMONIC_ADDPS,
|
|
ZYDIS_MNEMONIC_ADDSD,
|
|
ZYDIS_MNEMONIC_ADDSS,
|
|
ZYDIS_MNEMONIC_ADDSUBPD,
|
|
ZYDIS_MNEMONIC_ADDSUBPS,
|
|
ZYDIS_MNEMONIC_ADOX,
|
|
ZYDIS_MNEMONIC_AESDEC,
|
|
ZYDIS_MNEMONIC_AESDEC128KL,
|
|
ZYDIS_MNEMONIC_AESDEC256KL,
|
|
ZYDIS_MNEMONIC_AESDECLAST,
|
|
ZYDIS_MNEMONIC_AESDECWIDE128KL,
|
|
ZYDIS_MNEMONIC_AESDECWIDE256KL,
|
|
ZYDIS_MNEMONIC_AESENC,
|
|
ZYDIS_MNEMONIC_AESENC128KL,
|
|
ZYDIS_MNEMONIC_AESENC256KL,
|
|
ZYDIS_MNEMONIC_AESENCLAST,
|
|
ZYDIS_MNEMONIC_AESENCWIDE128KL,
|
|
ZYDIS_MNEMONIC_AESENCWIDE256KL,
|
|
ZYDIS_MNEMONIC_AESIMC,
|
|
ZYDIS_MNEMONIC_AESKEYGENASSIST,
|
|
ZYDIS_MNEMONIC_AND,
|
|
ZYDIS_MNEMONIC_ANDN,
|
|
ZYDIS_MNEMONIC_ANDNPD,
|
|
ZYDIS_MNEMONIC_ANDNPS,
|
|
ZYDIS_MNEMONIC_ANDPD,
|
|
ZYDIS_MNEMONIC_ANDPS,
|
|
ZYDIS_MNEMONIC_ARPL,
|
|
ZYDIS_MNEMONIC_BEXTR,
|
|
ZYDIS_MNEMONIC_BLCFILL,
|
|
ZYDIS_MNEMONIC_BLCI,
|
|
ZYDIS_MNEMONIC_BLCIC,
|
|
ZYDIS_MNEMONIC_BLCMSK,
|
|
ZYDIS_MNEMONIC_BLCS,
|
|
ZYDIS_MNEMONIC_BLENDPD,
|
|
ZYDIS_MNEMONIC_BLENDPS,
|
|
ZYDIS_MNEMONIC_BLENDVPD,
|
|
ZYDIS_MNEMONIC_BLENDVPS,
|
|
ZYDIS_MNEMONIC_BLSFILL,
|
|
ZYDIS_MNEMONIC_BLSI,
|
|
ZYDIS_MNEMONIC_BLSIC,
|
|
ZYDIS_MNEMONIC_BLSMSK,
|
|
ZYDIS_MNEMONIC_BLSR,
|
|
ZYDIS_MNEMONIC_BNDCL,
|
|
ZYDIS_MNEMONIC_BNDCN,
|
|
ZYDIS_MNEMONIC_BNDCU,
|
|
ZYDIS_MNEMONIC_BNDLDX,
|
|
ZYDIS_MNEMONIC_BNDMK,
|
|
ZYDIS_MNEMONIC_BNDMOV,
|
|
ZYDIS_MNEMONIC_BNDSTX,
|
|
ZYDIS_MNEMONIC_BOUND,
|
|
ZYDIS_MNEMONIC_BSF,
|
|
ZYDIS_MNEMONIC_BSR,
|
|
ZYDIS_MNEMONIC_BSWAP,
|
|
ZYDIS_MNEMONIC_BT,
|
|
ZYDIS_MNEMONIC_BTC,
|
|
ZYDIS_MNEMONIC_BTR,
|
|
ZYDIS_MNEMONIC_BTS,
|
|
ZYDIS_MNEMONIC_BZHI,
|
|
ZYDIS_MNEMONIC_CALL,
|
|
ZYDIS_MNEMONIC_CBW,
|
|
ZYDIS_MNEMONIC_CDQ,
|
|
ZYDIS_MNEMONIC_CDQE,
|
|
ZYDIS_MNEMONIC_CLAC,
|
|
ZYDIS_MNEMONIC_CLC,
|
|
ZYDIS_MNEMONIC_CLD,
|
|
ZYDIS_MNEMONIC_CLDEMOTE,
|
|
ZYDIS_MNEMONIC_CLEVICT0,
|
|
ZYDIS_MNEMONIC_CLEVICT1,
|
|
ZYDIS_MNEMONIC_CLFLUSH,
|
|
ZYDIS_MNEMONIC_CLFLUSHOPT,
|
|
ZYDIS_MNEMONIC_CLGI,
|
|
ZYDIS_MNEMONIC_CLI,
|
|
ZYDIS_MNEMONIC_CLRSSBSY,
|
|
ZYDIS_MNEMONIC_CLTS,
|
|
ZYDIS_MNEMONIC_CLUI,
|
|
ZYDIS_MNEMONIC_CLWB,
|
|
ZYDIS_MNEMONIC_CLZERO,
|
|
ZYDIS_MNEMONIC_CMC,
|
|
ZYDIS_MNEMONIC_CMOVB,
|
|
ZYDIS_MNEMONIC_CMOVBE,
|
|
ZYDIS_MNEMONIC_CMOVL,
|
|
ZYDIS_MNEMONIC_CMOVLE,
|
|
ZYDIS_MNEMONIC_CMOVNB,
|
|
ZYDIS_MNEMONIC_CMOVNBE,
|
|
ZYDIS_MNEMONIC_CMOVNL,
|
|
ZYDIS_MNEMONIC_CMOVNLE,
|
|
ZYDIS_MNEMONIC_CMOVNO,
|
|
ZYDIS_MNEMONIC_CMOVNP,
|
|
ZYDIS_MNEMONIC_CMOVNS,
|
|
ZYDIS_MNEMONIC_CMOVNZ,
|
|
ZYDIS_MNEMONIC_CMOVO,
|
|
ZYDIS_MNEMONIC_CMOVP,
|
|
ZYDIS_MNEMONIC_CMOVS,
|
|
ZYDIS_MNEMONIC_CMOVZ,
|
|
ZYDIS_MNEMONIC_CMP,
|
|
ZYDIS_MNEMONIC_CMPPD,
|
|
ZYDIS_MNEMONIC_CMPPS,
|
|
ZYDIS_MNEMONIC_CMPSB,
|
|
ZYDIS_MNEMONIC_CMPSD,
|
|
ZYDIS_MNEMONIC_CMPSQ,
|
|
ZYDIS_MNEMONIC_CMPSS,
|
|
ZYDIS_MNEMONIC_CMPSW,
|
|
ZYDIS_MNEMONIC_CMPXCHG,
|
|
ZYDIS_MNEMONIC_CMPXCHG16B,
|
|
ZYDIS_MNEMONIC_CMPXCHG8B,
|
|
ZYDIS_MNEMONIC_COMISD,
|
|
ZYDIS_MNEMONIC_COMISS,
|
|
ZYDIS_MNEMONIC_CPUID,
|
|
ZYDIS_MNEMONIC_CQO,
|
|
ZYDIS_MNEMONIC_CRC32,
|
|
ZYDIS_MNEMONIC_CVTDQ2PD,
|
|
ZYDIS_MNEMONIC_CVTDQ2PS,
|
|
ZYDIS_MNEMONIC_CVTPD2DQ,
|
|
ZYDIS_MNEMONIC_CVTPD2PI,
|
|
ZYDIS_MNEMONIC_CVTPD2PS,
|
|
ZYDIS_MNEMONIC_CVTPI2PD,
|
|
ZYDIS_MNEMONIC_CVTPI2PS,
|
|
ZYDIS_MNEMONIC_CVTPS2DQ,
|
|
ZYDIS_MNEMONIC_CVTPS2PD,
|
|
ZYDIS_MNEMONIC_CVTPS2PI,
|
|
ZYDIS_MNEMONIC_CVTSD2SI,
|
|
ZYDIS_MNEMONIC_CVTSD2SS,
|
|
ZYDIS_MNEMONIC_CVTSI2SD,
|
|
ZYDIS_MNEMONIC_CVTSI2SS,
|
|
ZYDIS_MNEMONIC_CVTSS2SD,
|
|
ZYDIS_MNEMONIC_CVTSS2SI,
|
|
ZYDIS_MNEMONIC_CVTTPD2DQ,
|
|
ZYDIS_MNEMONIC_CVTTPD2PI,
|
|
ZYDIS_MNEMONIC_CVTTPS2DQ,
|
|
ZYDIS_MNEMONIC_CVTTPS2PI,
|
|
ZYDIS_MNEMONIC_CVTTSD2SI,
|
|
ZYDIS_MNEMONIC_CVTTSS2SI,
|
|
ZYDIS_MNEMONIC_CWD,
|
|
ZYDIS_MNEMONIC_CWDE,
|
|
ZYDIS_MNEMONIC_DAA,
|
|
ZYDIS_MNEMONIC_DAS,
|
|
ZYDIS_MNEMONIC_DEC,
|
|
ZYDIS_MNEMONIC_DELAY,
|
|
ZYDIS_MNEMONIC_DIV,
|
|
ZYDIS_MNEMONIC_DIVPD,
|
|
ZYDIS_MNEMONIC_DIVPS,
|
|
ZYDIS_MNEMONIC_DIVSD,
|
|
ZYDIS_MNEMONIC_DIVSS,
|
|
ZYDIS_MNEMONIC_DPPD,
|
|
ZYDIS_MNEMONIC_DPPS,
|
|
ZYDIS_MNEMONIC_EMMS,
|
|
ZYDIS_MNEMONIC_ENCLS,
|
|
ZYDIS_MNEMONIC_ENCLU,
|
|
ZYDIS_MNEMONIC_ENCLV,
|
|
ZYDIS_MNEMONIC_ENCODEKEY128,
|
|
ZYDIS_MNEMONIC_ENCODEKEY256,
|
|
ZYDIS_MNEMONIC_ENDBR32,
|
|
ZYDIS_MNEMONIC_ENDBR64,
|
|
ZYDIS_MNEMONIC_ENQCMD,
|
|
ZYDIS_MNEMONIC_ENQCMDS,
|
|
ZYDIS_MNEMONIC_ENTER,
|
|
ZYDIS_MNEMONIC_EXTRACTPS,
|
|
ZYDIS_MNEMONIC_EXTRQ,
|
|
ZYDIS_MNEMONIC_F2XM1,
|
|
ZYDIS_MNEMONIC_FABS,
|
|
ZYDIS_MNEMONIC_FADD,
|
|
ZYDIS_MNEMONIC_FADDP,
|
|
ZYDIS_MNEMONIC_FBLD,
|
|
ZYDIS_MNEMONIC_FBSTP,
|
|
ZYDIS_MNEMONIC_FCHS,
|
|
ZYDIS_MNEMONIC_FCMOVB,
|
|
ZYDIS_MNEMONIC_FCMOVBE,
|
|
ZYDIS_MNEMONIC_FCMOVE,
|
|
ZYDIS_MNEMONIC_FCMOVNB,
|
|
ZYDIS_MNEMONIC_FCMOVNBE,
|
|
ZYDIS_MNEMONIC_FCMOVNE,
|
|
ZYDIS_MNEMONIC_FCMOVNU,
|
|
ZYDIS_MNEMONIC_FCMOVU,
|
|
ZYDIS_MNEMONIC_FCOM,
|
|
ZYDIS_MNEMONIC_FCOMI,
|
|
ZYDIS_MNEMONIC_FCOMIP,
|
|
ZYDIS_MNEMONIC_FCOMP,
|
|
ZYDIS_MNEMONIC_FCOMPP,
|
|
ZYDIS_MNEMONIC_FCOS,
|
|
ZYDIS_MNEMONIC_FDECSTP,
|
|
ZYDIS_MNEMONIC_FDISI8087_NOP,
|
|
ZYDIS_MNEMONIC_FDIV,
|
|
ZYDIS_MNEMONIC_FDIVP,
|
|
ZYDIS_MNEMONIC_FDIVR,
|
|
ZYDIS_MNEMONIC_FDIVRP,
|
|
ZYDIS_MNEMONIC_FEMMS,
|
|
ZYDIS_MNEMONIC_FENI8087_NOP,
|
|
ZYDIS_MNEMONIC_FFREE,
|
|
ZYDIS_MNEMONIC_FFREEP,
|
|
ZYDIS_MNEMONIC_FIADD,
|
|
ZYDIS_MNEMONIC_FICOM,
|
|
ZYDIS_MNEMONIC_FICOMP,
|
|
ZYDIS_MNEMONIC_FIDIV,
|
|
ZYDIS_MNEMONIC_FIDIVR,
|
|
ZYDIS_MNEMONIC_FILD,
|
|
ZYDIS_MNEMONIC_FIMUL,
|
|
ZYDIS_MNEMONIC_FINCSTP,
|
|
ZYDIS_MNEMONIC_FIST,
|
|
ZYDIS_MNEMONIC_FISTP,
|
|
ZYDIS_MNEMONIC_FISTTP,
|
|
ZYDIS_MNEMONIC_FISUB,
|
|
ZYDIS_MNEMONIC_FISUBR,
|
|
ZYDIS_MNEMONIC_FLD,
|
|
ZYDIS_MNEMONIC_FLD1,
|
|
ZYDIS_MNEMONIC_FLDCW,
|
|
ZYDIS_MNEMONIC_FLDENV,
|
|
ZYDIS_MNEMONIC_FLDL2E,
|
|
ZYDIS_MNEMONIC_FLDL2T,
|
|
ZYDIS_MNEMONIC_FLDLG2,
|
|
ZYDIS_MNEMONIC_FLDLN2,
|
|
ZYDIS_MNEMONIC_FLDPI,
|
|
ZYDIS_MNEMONIC_FLDZ,
|
|
ZYDIS_MNEMONIC_FMUL,
|
|
ZYDIS_MNEMONIC_FMULP,
|
|
ZYDIS_MNEMONIC_FNCLEX,
|
|
ZYDIS_MNEMONIC_FNINIT,
|
|
ZYDIS_MNEMONIC_FNOP,
|
|
ZYDIS_MNEMONIC_FNSAVE,
|
|
ZYDIS_MNEMONIC_FNSTCW,
|
|
ZYDIS_MNEMONIC_FNSTENV,
|
|
ZYDIS_MNEMONIC_FNSTSW,
|
|
ZYDIS_MNEMONIC_FPATAN,
|
|
ZYDIS_MNEMONIC_FPREM,
|
|
ZYDIS_MNEMONIC_FPREM1,
|
|
ZYDIS_MNEMONIC_FPTAN,
|
|
ZYDIS_MNEMONIC_FRNDINT,
|
|
ZYDIS_MNEMONIC_FRSTOR,
|
|
ZYDIS_MNEMONIC_FSCALE,
|
|
ZYDIS_MNEMONIC_FSETPM287_NOP,
|
|
ZYDIS_MNEMONIC_FSIN,
|
|
ZYDIS_MNEMONIC_FSINCOS,
|
|
ZYDIS_MNEMONIC_FSQRT,
|
|
ZYDIS_MNEMONIC_FST,
|
|
ZYDIS_MNEMONIC_FSTP,
|
|
ZYDIS_MNEMONIC_FSTPNCE,
|
|
ZYDIS_MNEMONIC_FSUB,
|
|
ZYDIS_MNEMONIC_FSUBP,
|
|
ZYDIS_MNEMONIC_FSUBR,
|
|
ZYDIS_MNEMONIC_FSUBRP,
|
|
ZYDIS_MNEMONIC_FTST,
|
|
ZYDIS_MNEMONIC_FUCOM,
|
|
ZYDIS_MNEMONIC_FUCOMI,
|
|
ZYDIS_MNEMONIC_FUCOMIP,
|
|
ZYDIS_MNEMONIC_FUCOMP,
|
|
ZYDIS_MNEMONIC_FUCOMPP,
|
|
ZYDIS_MNEMONIC_FWAIT,
|
|
ZYDIS_MNEMONIC_FXAM,
|
|
ZYDIS_MNEMONIC_FXCH,
|
|
ZYDIS_MNEMONIC_FXRSTOR,
|
|
ZYDIS_MNEMONIC_FXRSTOR64,
|
|
ZYDIS_MNEMONIC_FXSAVE,
|
|
ZYDIS_MNEMONIC_FXSAVE64,
|
|
ZYDIS_MNEMONIC_FXTRACT,
|
|
ZYDIS_MNEMONIC_FYL2X,
|
|
ZYDIS_MNEMONIC_FYL2XP1,
|
|
ZYDIS_MNEMONIC_GETSEC,
|
|
ZYDIS_MNEMONIC_GF2P8AFFINEINVQB,
|
|
ZYDIS_MNEMONIC_GF2P8AFFINEQB,
|
|
ZYDIS_MNEMONIC_GF2P8MULB,
|
|
ZYDIS_MNEMONIC_HADDPD,
|
|
ZYDIS_MNEMONIC_HADDPS,
|
|
ZYDIS_MNEMONIC_HLT,
|
|
ZYDIS_MNEMONIC_HRESET,
|
|
ZYDIS_MNEMONIC_HSUBPD,
|
|
ZYDIS_MNEMONIC_HSUBPS,
|
|
ZYDIS_MNEMONIC_IDIV,
|
|
ZYDIS_MNEMONIC_IMUL,
|
|
ZYDIS_MNEMONIC_IN,
|
|
ZYDIS_MNEMONIC_INC,
|
|
ZYDIS_MNEMONIC_INCSSPD,
|
|
ZYDIS_MNEMONIC_INCSSPQ,
|
|
ZYDIS_MNEMONIC_INSB,
|
|
ZYDIS_MNEMONIC_INSD,
|
|
ZYDIS_MNEMONIC_INSERTPS,
|
|
ZYDIS_MNEMONIC_INSERTQ,
|
|
ZYDIS_MNEMONIC_INSW,
|
|
ZYDIS_MNEMONIC_INT,
|
|
ZYDIS_MNEMONIC_INT1,
|
|
ZYDIS_MNEMONIC_INT3,
|
|
ZYDIS_MNEMONIC_INTO,
|
|
ZYDIS_MNEMONIC_INVD,
|
|
ZYDIS_MNEMONIC_INVEPT,
|
|
ZYDIS_MNEMONIC_INVLPG,
|
|
ZYDIS_MNEMONIC_INVLPGA,
|
|
ZYDIS_MNEMONIC_INVLPGB,
|
|
ZYDIS_MNEMONIC_INVPCID,
|
|
ZYDIS_MNEMONIC_INVVPID,
|
|
ZYDIS_MNEMONIC_IRET,
|
|
ZYDIS_MNEMONIC_IRETD,
|
|
ZYDIS_MNEMONIC_IRETQ,
|
|
ZYDIS_MNEMONIC_JB,
|
|
ZYDIS_MNEMONIC_JBE,
|
|
ZYDIS_MNEMONIC_JCXZ,
|
|
ZYDIS_MNEMONIC_JECXZ,
|
|
ZYDIS_MNEMONIC_JKNZD,
|
|
ZYDIS_MNEMONIC_JKZD,
|
|
ZYDIS_MNEMONIC_JL,
|
|
ZYDIS_MNEMONIC_JLE,
|
|
ZYDIS_MNEMONIC_JMP,
|
|
ZYDIS_MNEMONIC_JNB,
|
|
ZYDIS_MNEMONIC_JNBE,
|
|
ZYDIS_MNEMONIC_JNL,
|
|
ZYDIS_MNEMONIC_JNLE,
|
|
ZYDIS_MNEMONIC_JNO,
|
|
ZYDIS_MNEMONIC_JNP,
|
|
ZYDIS_MNEMONIC_JNS,
|
|
ZYDIS_MNEMONIC_JNZ,
|
|
ZYDIS_MNEMONIC_JO,
|
|
ZYDIS_MNEMONIC_JP,
|
|
ZYDIS_MNEMONIC_JRCXZ,
|
|
ZYDIS_MNEMONIC_JS,
|
|
ZYDIS_MNEMONIC_JZ,
|
|
ZYDIS_MNEMONIC_KADDB,
|
|
ZYDIS_MNEMONIC_KADDD,
|
|
ZYDIS_MNEMONIC_KADDQ,
|
|
ZYDIS_MNEMONIC_KADDW,
|
|
ZYDIS_MNEMONIC_KAND,
|
|
ZYDIS_MNEMONIC_KANDB,
|
|
ZYDIS_MNEMONIC_KANDD,
|
|
ZYDIS_MNEMONIC_KANDN,
|
|
ZYDIS_MNEMONIC_KANDNB,
|
|
ZYDIS_MNEMONIC_KANDND,
|
|
ZYDIS_MNEMONIC_KANDNQ,
|
|
ZYDIS_MNEMONIC_KANDNR,
|
|
ZYDIS_MNEMONIC_KANDNW,
|
|
ZYDIS_MNEMONIC_KANDQ,
|
|
ZYDIS_MNEMONIC_KANDW,
|
|
ZYDIS_MNEMONIC_KCONCATH,
|
|
ZYDIS_MNEMONIC_KCONCATL,
|
|
ZYDIS_MNEMONIC_KEXTRACT,
|
|
ZYDIS_MNEMONIC_KMERGE2L1H,
|
|
ZYDIS_MNEMONIC_KMERGE2L1L,
|
|
ZYDIS_MNEMONIC_KMOV,
|
|
ZYDIS_MNEMONIC_KMOVB,
|
|
ZYDIS_MNEMONIC_KMOVD,
|
|
ZYDIS_MNEMONIC_KMOVQ,
|
|
ZYDIS_MNEMONIC_KMOVW,
|
|
ZYDIS_MNEMONIC_KNOT,
|
|
ZYDIS_MNEMONIC_KNOTB,
|
|
ZYDIS_MNEMONIC_KNOTD,
|
|
ZYDIS_MNEMONIC_KNOTQ,
|
|
ZYDIS_MNEMONIC_KNOTW,
|
|
ZYDIS_MNEMONIC_KOR,
|
|
ZYDIS_MNEMONIC_KORB,
|
|
ZYDIS_MNEMONIC_KORD,
|
|
ZYDIS_MNEMONIC_KORQ,
|
|
ZYDIS_MNEMONIC_KORTEST,
|
|
ZYDIS_MNEMONIC_KORTESTB,
|
|
ZYDIS_MNEMONIC_KORTESTD,
|
|
ZYDIS_MNEMONIC_KORTESTQ,
|
|
ZYDIS_MNEMONIC_KORTESTW,
|
|
ZYDIS_MNEMONIC_KORW,
|
|
ZYDIS_MNEMONIC_KSHIFTLB,
|
|
ZYDIS_MNEMONIC_KSHIFTLD,
|
|
ZYDIS_MNEMONIC_KSHIFTLQ,
|
|
ZYDIS_MNEMONIC_KSHIFTLW,
|
|
ZYDIS_MNEMONIC_KSHIFTRB,
|
|
ZYDIS_MNEMONIC_KSHIFTRD,
|
|
ZYDIS_MNEMONIC_KSHIFTRQ,
|
|
ZYDIS_MNEMONIC_KSHIFTRW,
|
|
ZYDIS_MNEMONIC_KTESTB,
|
|
ZYDIS_MNEMONIC_KTESTD,
|
|
ZYDIS_MNEMONIC_KTESTQ,
|
|
ZYDIS_MNEMONIC_KTESTW,
|
|
ZYDIS_MNEMONIC_KUNPCKBW,
|
|
ZYDIS_MNEMONIC_KUNPCKDQ,
|
|
ZYDIS_MNEMONIC_KUNPCKWD,
|
|
ZYDIS_MNEMONIC_KXNOR,
|
|
ZYDIS_MNEMONIC_KXNORB,
|
|
ZYDIS_MNEMONIC_KXNORD,
|
|
ZYDIS_MNEMONIC_KXNORQ,
|
|
ZYDIS_MNEMONIC_KXNORW,
|
|
ZYDIS_MNEMONIC_KXOR,
|
|
ZYDIS_MNEMONIC_KXORB,
|
|
ZYDIS_MNEMONIC_KXORD,
|
|
ZYDIS_MNEMONIC_KXORQ,
|
|
ZYDIS_MNEMONIC_KXORW,
|
|
ZYDIS_MNEMONIC_LAHF,
|
|
ZYDIS_MNEMONIC_LAR,
|
|
ZYDIS_MNEMONIC_LDDQU,
|
|
ZYDIS_MNEMONIC_LDMXCSR,
|
|
ZYDIS_MNEMONIC_LDS,
|
|
ZYDIS_MNEMONIC_LDTILECFG,
|
|
ZYDIS_MNEMONIC_LEA,
|
|
ZYDIS_MNEMONIC_LEAVE,
|
|
ZYDIS_MNEMONIC_LES,
|
|
ZYDIS_MNEMONIC_LFENCE,
|
|
ZYDIS_MNEMONIC_LFS,
|
|
ZYDIS_MNEMONIC_LGDT,
|
|
ZYDIS_MNEMONIC_LGS,
|
|
ZYDIS_MNEMONIC_LIDT,
|
|
ZYDIS_MNEMONIC_LLDT,
|
|
ZYDIS_MNEMONIC_LLWPCB,
|
|
ZYDIS_MNEMONIC_LMSW,
|
|
ZYDIS_MNEMONIC_LOADIWKEY,
|
|
ZYDIS_MNEMONIC_LODSB,
|
|
ZYDIS_MNEMONIC_LODSD,
|
|
ZYDIS_MNEMONIC_LODSQ,
|
|
ZYDIS_MNEMONIC_LODSW,
|
|
ZYDIS_MNEMONIC_LOOP,
|
|
ZYDIS_MNEMONIC_LOOPE,
|
|
ZYDIS_MNEMONIC_LOOPNE,
|
|
ZYDIS_MNEMONIC_LSL,
|
|
ZYDIS_MNEMONIC_LSS,
|
|
ZYDIS_MNEMONIC_LTR,
|
|
ZYDIS_MNEMONIC_LWPINS,
|
|
ZYDIS_MNEMONIC_LWPVAL,
|
|
ZYDIS_MNEMONIC_LZCNT,
|
|
ZYDIS_MNEMONIC_MASKMOVDQU,
|
|
ZYDIS_MNEMONIC_MASKMOVQ,
|
|
ZYDIS_MNEMONIC_MAXPD,
|
|
ZYDIS_MNEMONIC_MAXPS,
|
|
ZYDIS_MNEMONIC_MAXSD,
|
|
ZYDIS_MNEMONIC_MAXSS,
|
|
ZYDIS_MNEMONIC_MCOMMIT,
|
|
ZYDIS_MNEMONIC_MFENCE,
|
|
ZYDIS_MNEMONIC_MINPD,
|
|
ZYDIS_MNEMONIC_MINPS,
|
|
ZYDIS_MNEMONIC_MINSD,
|
|
ZYDIS_MNEMONIC_MINSS,
|
|
ZYDIS_MNEMONIC_MONITOR,
|
|
ZYDIS_MNEMONIC_MONITORX,
|
|
ZYDIS_MNEMONIC_MONTMUL,
|
|
ZYDIS_MNEMONIC_MOV,
|
|
ZYDIS_MNEMONIC_MOVAPD,
|
|
ZYDIS_MNEMONIC_MOVAPS,
|
|
ZYDIS_MNEMONIC_MOVBE,
|
|
ZYDIS_MNEMONIC_MOVD,
|
|
ZYDIS_MNEMONIC_MOVDDUP,
|
|
ZYDIS_MNEMONIC_MOVDIR64B,
|
|
ZYDIS_MNEMONIC_MOVDIRI,
|
|
ZYDIS_MNEMONIC_MOVDQ2Q,
|
|
ZYDIS_MNEMONIC_MOVDQA,
|
|
ZYDIS_MNEMONIC_MOVDQU,
|
|
ZYDIS_MNEMONIC_MOVHLPS,
|
|
ZYDIS_MNEMONIC_MOVHPD,
|
|
ZYDIS_MNEMONIC_MOVHPS,
|
|
ZYDIS_MNEMONIC_MOVLHPS,
|
|
ZYDIS_MNEMONIC_MOVLPD,
|
|
ZYDIS_MNEMONIC_MOVLPS,
|
|
ZYDIS_MNEMONIC_MOVMSKPD,
|
|
ZYDIS_MNEMONIC_MOVMSKPS,
|
|
ZYDIS_MNEMONIC_MOVNTDQ,
|
|
ZYDIS_MNEMONIC_MOVNTDQA,
|
|
ZYDIS_MNEMONIC_MOVNTI,
|
|
ZYDIS_MNEMONIC_MOVNTPD,
|
|
ZYDIS_MNEMONIC_MOVNTPS,
|
|
ZYDIS_MNEMONIC_MOVNTQ,
|
|
ZYDIS_MNEMONIC_MOVNTSD,
|
|
ZYDIS_MNEMONIC_MOVNTSS,
|
|
ZYDIS_MNEMONIC_MOVQ,
|
|
ZYDIS_MNEMONIC_MOVQ2DQ,
|
|
ZYDIS_MNEMONIC_MOVSB,
|
|
ZYDIS_MNEMONIC_MOVSD,
|
|
ZYDIS_MNEMONIC_MOVSHDUP,
|
|
ZYDIS_MNEMONIC_MOVSLDUP,
|
|
ZYDIS_MNEMONIC_MOVSQ,
|
|
ZYDIS_MNEMONIC_MOVSS,
|
|
ZYDIS_MNEMONIC_MOVSW,
|
|
ZYDIS_MNEMONIC_MOVSX,
|
|
ZYDIS_MNEMONIC_MOVSXD,
|
|
ZYDIS_MNEMONIC_MOVUPD,
|
|
ZYDIS_MNEMONIC_MOVUPS,
|
|
ZYDIS_MNEMONIC_MOVZX,
|
|
ZYDIS_MNEMONIC_MPSADBW,
|
|
ZYDIS_MNEMONIC_MUL,
|
|
ZYDIS_MNEMONIC_MULPD,
|
|
ZYDIS_MNEMONIC_MULPS,
|
|
ZYDIS_MNEMONIC_MULSD,
|
|
ZYDIS_MNEMONIC_MULSS,
|
|
ZYDIS_MNEMONIC_MULX,
|
|
ZYDIS_MNEMONIC_MWAIT,
|
|
ZYDIS_MNEMONIC_MWAITX,
|
|
ZYDIS_MNEMONIC_NEG,
|
|
ZYDIS_MNEMONIC_NOP,
|
|
ZYDIS_MNEMONIC_NOT,
|
|
ZYDIS_MNEMONIC_OR,
|
|
ZYDIS_MNEMONIC_ORPD,
|
|
ZYDIS_MNEMONIC_ORPS,
|
|
ZYDIS_MNEMONIC_OUT,
|
|
ZYDIS_MNEMONIC_OUTSB,
|
|
ZYDIS_MNEMONIC_OUTSD,
|
|
ZYDIS_MNEMONIC_OUTSW,
|
|
ZYDIS_MNEMONIC_PABSB,
|
|
ZYDIS_MNEMONIC_PABSD,
|
|
ZYDIS_MNEMONIC_PABSW,
|
|
ZYDIS_MNEMONIC_PACKSSDW,
|
|
ZYDIS_MNEMONIC_PACKSSWB,
|
|
ZYDIS_MNEMONIC_PACKUSDW,
|
|
ZYDIS_MNEMONIC_PACKUSWB,
|
|
ZYDIS_MNEMONIC_PADDB,
|
|
ZYDIS_MNEMONIC_PADDD,
|
|
ZYDIS_MNEMONIC_PADDQ,
|
|
ZYDIS_MNEMONIC_PADDSB,
|
|
ZYDIS_MNEMONIC_PADDSW,
|
|
ZYDIS_MNEMONIC_PADDUSB,
|
|
ZYDIS_MNEMONIC_PADDUSW,
|
|
ZYDIS_MNEMONIC_PADDW,
|
|
ZYDIS_MNEMONIC_PALIGNR,
|
|
ZYDIS_MNEMONIC_PAND,
|
|
ZYDIS_MNEMONIC_PANDN,
|
|
ZYDIS_MNEMONIC_PAUSE,
|
|
ZYDIS_MNEMONIC_PAVGB,
|
|
ZYDIS_MNEMONIC_PAVGUSB,
|
|
ZYDIS_MNEMONIC_PAVGW,
|
|
ZYDIS_MNEMONIC_PBLENDVB,
|
|
ZYDIS_MNEMONIC_PBLENDW,
|
|
ZYDIS_MNEMONIC_PCLMULQDQ,
|
|
ZYDIS_MNEMONIC_PCMPEQB,
|
|
ZYDIS_MNEMONIC_PCMPEQD,
|
|
ZYDIS_MNEMONIC_PCMPEQQ,
|
|
ZYDIS_MNEMONIC_PCMPEQW,
|
|
ZYDIS_MNEMONIC_PCMPESTRI,
|
|
ZYDIS_MNEMONIC_PCMPESTRM,
|
|
ZYDIS_MNEMONIC_PCMPGTB,
|
|
ZYDIS_MNEMONIC_PCMPGTD,
|
|
ZYDIS_MNEMONIC_PCMPGTQ,
|
|
ZYDIS_MNEMONIC_PCMPGTW,
|
|
ZYDIS_MNEMONIC_PCMPISTRI,
|
|
ZYDIS_MNEMONIC_PCMPISTRM,
|
|
ZYDIS_MNEMONIC_PCONFIG,
|
|
ZYDIS_MNEMONIC_PDEP,
|
|
ZYDIS_MNEMONIC_PEXT,
|
|
ZYDIS_MNEMONIC_PEXTRB,
|
|
ZYDIS_MNEMONIC_PEXTRD,
|
|
ZYDIS_MNEMONIC_PEXTRQ,
|
|
ZYDIS_MNEMONIC_PEXTRW,
|
|
ZYDIS_MNEMONIC_PF2ID,
|
|
ZYDIS_MNEMONIC_PF2IW,
|
|
ZYDIS_MNEMONIC_PFACC,
|
|
ZYDIS_MNEMONIC_PFADD,
|
|
ZYDIS_MNEMONIC_PFCMPEQ,
|
|
ZYDIS_MNEMONIC_PFCMPGE,
|
|
ZYDIS_MNEMONIC_PFCMPGT,
|
|
ZYDIS_MNEMONIC_PFCPIT1,
|
|
ZYDIS_MNEMONIC_PFMAX,
|
|
ZYDIS_MNEMONIC_PFMIN,
|
|
ZYDIS_MNEMONIC_PFMUL,
|
|
ZYDIS_MNEMONIC_PFNACC,
|
|
ZYDIS_MNEMONIC_PFPNACC,
|
|
ZYDIS_MNEMONIC_PFRCP,
|
|
ZYDIS_MNEMONIC_PFRCPIT2,
|
|
ZYDIS_MNEMONIC_PFRSQIT1,
|
|
ZYDIS_MNEMONIC_PFSQRT,
|
|
ZYDIS_MNEMONIC_PFSUB,
|
|
ZYDIS_MNEMONIC_PFSUBR,
|
|
ZYDIS_MNEMONIC_PHADDD,
|
|
ZYDIS_MNEMONIC_PHADDSW,
|
|
ZYDIS_MNEMONIC_PHADDW,
|
|
ZYDIS_MNEMONIC_PHMINPOSUW,
|
|
ZYDIS_MNEMONIC_PHSUBD,
|
|
ZYDIS_MNEMONIC_PHSUBSW,
|
|
ZYDIS_MNEMONIC_PHSUBW,
|
|
ZYDIS_MNEMONIC_PI2FD,
|
|
ZYDIS_MNEMONIC_PI2FW,
|
|
ZYDIS_MNEMONIC_PINSRB,
|
|
ZYDIS_MNEMONIC_PINSRD,
|
|
ZYDIS_MNEMONIC_PINSRQ,
|
|
ZYDIS_MNEMONIC_PINSRW,
|
|
ZYDIS_MNEMONIC_PMADDUBSW,
|
|
ZYDIS_MNEMONIC_PMADDWD,
|
|
ZYDIS_MNEMONIC_PMAXSB,
|
|
ZYDIS_MNEMONIC_PMAXSD,
|
|
ZYDIS_MNEMONIC_PMAXSW,
|
|
ZYDIS_MNEMONIC_PMAXUB,
|
|
ZYDIS_MNEMONIC_PMAXUD,
|
|
ZYDIS_MNEMONIC_PMAXUW,
|
|
ZYDIS_MNEMONIC_PMINSB,
|
|
ZYDIS_MNEMONIC_PMINSD,
|
|
ZYDIS_MNEMONIC_PMINSW,
|
|
ZYDIS_MNEMONIC_PMINUB,
|
|
ZYDIS_MNEMONIC_PMINUD,
|
|
ZYDIS_MNEMONIC_PMINUW,
|
|
ZYDIS_MNEMONIC_PMOVMSKB,
|
|
ZYDIS_MNEMONIC_PMOVSXBD,
|
|
ZYDIS_MNEMONIC_PMOVSXBQ,
|
|
ZYDIS_MNEMONIC_PMOVSXBW,
|
|
ZYDIS_MNEMONIC_PMOVSXDQ,
|
|
ZYDIS_MNEMONIC_PMOVSXWD,
|
|
ZYDIS_MNEMONIC_PMOVSXWQ,
|
|
ZYDIS_MNEMONIC_PMOVZXBD,
|
|
ZYDIS_MNEMONIC_PMOVZXBQ,
|
|
ZYDIS_MNEMONIC_PMOVZXBW,
|
|
ZYDIS_MNEMONIC_PMOVZXDQ,
|
|
ZYDIS_MNEMONIC_PMOVZXWD,
|
|
ZYDIS_MNEMONIC_PMOVZXWQ,
|
|
ZYDIS_MNEMONIC_PMULDQ,
|
|
ZYDIS_MNEMONIC_PMULHRSW,
|
|
ZYDIS_MNEMONIC_PMULHRW,
|
|
ZYDIS_MNEMONIC_PMULHUW,
|
|
ZYDIS_MNEMONIC_PMULHW,
|
|
ZYDIS_MNEMONIC_PMULLD,
|
|
ZYDIS_MNEMONIC_PMULLW,
|
|
ZYDIS_MNEMONIC_PMULUDQ,
|
|
ZYDIS_MNEMONIC_POP,
|
|
ZYDIS_MNEMONIC_POPA,
|
|
ZYDIS_MNEMONIC_POPAD,
|
|
ZYDIS_MNEMONIC_POPCNT,
|
|
ZYDIS_MNEMONIC_POPF,
|
|
ZYDIS_MNEMONIC_POPFD,
|
|
ZYDIS_MNEMONIC_POPFQ,
|
|
ZYDIS_MNEMONIC_POR,
|
|
ZYDIS_MNEMONIC_PREFETCH,
|
|
ZYDIS_MNEMONIC_PREFETCHNTA,
|
|
ZYDIS_MNEMONIC_PREFETCHT0,
|
|
ZYDIS_MNEMONIC_PREFETCHT1,
|
|
ZYDIS_MNEMONIC_PREFETCHT2,
|
|
ZYDIS_MNEMONIC_PREFETCHW,
|
|
ZYDIS_MNEMONIC_PREFETCHWT1,
|
|
ZYDIS_MNEMONIC_PSADBW,
|
|
ZYDIS_MNEMONIC_PSHUFB,
|
|
ZYDIS_MNEMONIC_PSHUFD,
|
|
ZYDIS_MNEMONIC_PSHUFHW,
|
|
ZYDIS_MNEMONIC_PSHUFLW,
|
|
ZYDIS_MNEMONIC_PSHUFW,
|
|
ZYDIS_MNEMONIC_PSIGNB,
|
|
ZYDIS_MNEMONIC_PSIGND,
|
|
ZYDIS_MNEMONIC_PSIGNW,
|
|
ZYDIS_MNEMONIC_PSLLD,
|
|
ZYDIS_MNEMONIC_PSLLDQ,
|
|
ZYDIS_MNEMONIC_PSLLQ,
|
|
ZYDIS_MNEMONIC_PSLLW,
|
|
ZYDIS_MNEMONIC_PSMASH,
|
|
ZYDIS_MNEMONIC_PSRAD,
|
|
ZYDIS_MNEMONIC_PSRAW,
|
|
ZYDIS_MNEMONIC_PSRLD,
|
|
ZYDIS_MNEMONIC_PSRLDQ,
|
|
ZYDIS_MNEMONIC_PSRLQ,
|
|
ZYDIS_MNEMONIC_PSRLW,
|
|
ZYDIS_MNEMONIC_PSUBB,
|
|
ZYDIS_MNEMONIC_PSUBD,
|
|
ZYDIS_MNEMONIC_PSUBQ,
|
|
ZYDIS_MNEMONIC_PSUBSB,
|
|
ZYDIS_MNEMONIC_PSUBSW,
|
|
ZYDIS_MNEMONIC_PSUBUSB,
|
|
ZYDIS_MNEMONIC_PSUBUSW,
|
|
ZYDIS_MNEMONIC_PSUBW,
|
|
ZYDIS_MNEMONIC_PSWAPD,
|
|
ZYDIS_MNEMONIC_PTEST,
|
|
ZYDIS_MNEMONIC_PTWRITE,
|
|
ZYDIS_MNEMONIC_PUNPCKHBW,
|
|
ZYDIS_MNEMONIC_PUNPCKHDQ,
|
|
ZYDIS_MNEMONIC_PUNPCKHQDQ,
|
|
ZYDIS_MNEMONIC_PUNPCKHWD,
|
|
ZYDIS_MNEMONIC_PUNPCKLBW,
|
|
ZYDIS_MNEMONIC_PUNPCKLDQ,
|
|
ZYDIS_MNEMONIC_PUNPCKLQDQ,
|
|
ZYDIS_MNEMONIC_PUNPCKLWD,
|
|
ZYDIS_MNEMONIC_PUSH,
|
|
ZYDIS_MNEMONIC_PUSHA,
|
|
ZYDIS_MNEMONIC_PUSHAD,
|
|
ZYDIS_MNEMONIC_PUSHF,
|
|
ZYDIS_MNEMONIC_PUSHFD,
|
|
ZYDIS_MNEMONIC_PUSHFQ,
|
|
ZYDIS_MNEMONIC_PVALIDATE,
|
|
ZYDIS_MNEMONIC_PXOR,
|
|
ZYDIS_MNEMONIC_RCL,
|
|
ZYDIS_MNEMONIC_RCPPS,
|
|
ZYDIS_MNEMONIC_RCPSS,
|
|
ZYDIS_MNEMONIC_RCR,
|
|
ZYDIS_MNEMONIC_RDFSBASE,
|
|
ZYDIS_MNEMONIC_RDGSBASE,
|
|
ZYDIS_MNEMONIC_RDMSR,
|
|
ZYDIS_MNEMONIC_RDPID,
|
|
ZYDIS_MNEMONIC_RDPKRU,
|
|
ZYDIS_MNEMONIC_RDPMC,
|
|
ZYDIS_MNEMONIC_RDPRU,
|
|
ZYDIS_MNEMONIC_RDRAND,
|
|
ZYDIS_MNEMONIC_RDSEED,
|
|
ZYDIS_MNEMONIC_RDSSPD,
|
|
ZYDIS_MNEMONIC_RDSSPQ,
|
|
ZYDIS_MNEMONIC_RDTSC,
|
|
ZYDIS_MNEMONIC_RDTSCP,
|
|
ZYDIS_MNEMONIC_RET,
|
|
ZYDIS_MNEMONIC_RMPADJUST,
|
|
ZYDIS_MNEMONIC_RMPUPDATE,
|
|
ZYDIS_MNEMONIC_ROL,
|
|
ZYDIS_MNEMONIC_ROR,
|
|
ZYDIS_MNEMONIC_RORX,
|
|
ZYDIS_MNEMONIC_ROUNDPD,
|
|
ZYDIS_MNEMONIC_ROUNDPS,
|
|
ZYDIS_MNEMONIC_ROUNDSD,
|
|
ZYDIS_MNEMONIC_ROUNDSS,
|
|
ZYDIS_MNEMONIC_RSM,
|
|
ZYDIS_MNEMONIC_RSQRTPS,
|
|
ZYDIS_MNEMONIC_RSQRTSS,
|
|
ZYDIS_MNEMONIC_RSTORSSP,
|
|
ZYDIS_MNEMONIC_SAHF,
|
|
ZYDIS_MNEMONIC_SALC,
|
|
ZYDIS_MNEMONIC_SAR,
|
|
ZYDIS_MNEMONIC_SARX,
|
|
ZYDIS_MNEMONIC_SAVEPREVSSP,
|
|
ZYDIS_MNEMONIC_SBB,
|
|
ZYDIS_MNEMONIC_SCASB,
|
|
ZYDIS_MNEMONIC_SCASD,
|
|
ZYDIS_MNEMONIC_SCASQ,
|
|
ZYDIS_MNEMONIC_SCASW,
|
|
ZYDIS_MNEMONIC_SEAMCALL,
|
|
ZYDIS_MNEMONIC_SEAMOPS,
|
|
ZYDIS_MNEMONIC_SEAMRET,
|
|
ZYDIS_MNEMONIC_SENDUIPI,
|
|
ZYDIS_MNEMONIC_SERIALIZE,
|
|
ZYDIS_MNEMONIC_SETB,
|
|
ZYDIS_MNEMONIC_SETBE,
|
|
ZYDIS_MNEMONIC_SETL,
|
|
ZYDIS_MNEMONIC_SETLE,
|
|
ZYDIS_MNEMONIC_SETNB,
|
|
ZYDIS_MNEMONIC_SETNBE,
|
|
ZYDIS_MNEMONIC_SETNL,
|
|
ZYDIS_MNEMONIC_SETNLE,
|
|
ZYDIS_MNEMONIC_SETNO,
|
|
ZYDIS_MNEMONIC_SETNP,
|
|
ZYDIS_MNEMONIC_SETNS,
|
|
ZYDIS_MNEMONIC_SETNZ,
|
|
ZYDIS_MNEMONIC_SETO,
|
|
ZYDIS_MNEMONIC_SETP,
|
|
ZYDIS_MNEMONIC_SETS,
|
|
ZYDIS_MNEMONIC_SETSSBSY,
|
|
ZYDIS_MNEMONIC_SETZ,
|
|
ZYDIS_MNEMONIC_SFENCE,
|
|
ZYDIS_MNEMONIC_SGDT,
|
|
ZYDIS_MNEMONIC_SHA1MSG1,
|
|
ZYDIS_MNEMONIC_SHA1MSG2,
|
|
ZYDIS_MNEMONIC_SHA1NEXTE,
|
|
ZYDIS_MNEMONIC_SHA1RNDS4,
|
|
ZYDIS_MNEMONIC_SHA256MSG1,
|
|
ZYDIS_MNEMONIC_SHA256MSG2,
|
|
ZYDIS_MNEMONIC_SHA256RNDS2,
|
|
ZYDIS_MNEMONIC_SHL,
|
|
ZYDIS_MNEMONIC_SHLD,
|
|
ZYDIS_MNEMONIC_SHLX,
|
|
ZYDIS_MNEMONIC_SHR,
|
|
ZYDIS_MNEMONIC_SHRD,
|
|
ZYDIS_MNEMONIC_SHRX,
|
|
ZYDIS_MNEMONIC_SHUFPD,
|
|
ZYDIS_MNEMONIC_SHUFPS,
|
|
ZYDIS_MNEMONIC_SIDT,
|
|
ZYDIS_MNEMONIC_SKINIT,
|
|
ZYDIS_MNEMONIC_SLDT,
|
|
ZYDIS_MNEMONIC_SLWPCB,
|
|
ZYDIS_MNEMONIC_SMSW,
|
|
ZYDIS_MNEMONIC_SPFLT,
|
|
ZYDIS_MNEMONIC_SQRTPD,
|
|
ZYDIS_MNEMONIC_SQRTPS,
|
|
ZYDIS_MNEMONIC_SQRTSD,
|
|
ZYDIS_MNEMONIC_SQRTSS,
|
|
ZYDIS_MNEMONIC_STAC,
|
|
ZYDIS_MNEMONIC_STC,
|
|
ZYDIS_MNEMONIC_STD,
|
|
ZYDIS_MNEMONIC_STGI,
|
|
ZYDIS_MNEMONIC_STI,
|
|
ZYDIS_MNEMONIC_STMXCSR,
|
|
ZYDIS_MNEMONIC_STOSB,
|
|
ZYDIS_MNEMONIC_STOSD,
|
|
ZYDIS_MNEMONIC_STOSQ,
|
|
ZYDIS_MNEMONIC_STOSW,
|
|
ZYDIS_MNEMONIC_STR,
|
|
ZYDIS_MNEMONIC_STTILECFG,
|
|
ZYDIS_MNEMONIC_STUI,
|
|
ZYDIS_MNEMONIC_SUB,
|
|
ZYDIS_MNEMONIC_SUBPD,
|
|
ZYDIS_MNEMONIC_SUBPS,
|
|
ZYDIS_MNEMONIC_SUBSD,
|
|
ZYDIS_MNEMONIC_SUBSS,
|
|
ZYDIS_MNEMONIC_SWAPGS,
|
|
ZYDIS_MNEMONIC_SYSCALL,
|
|
ZYDIS_MNEMONIC_SYSENTER,
|
|
ZYDIS_MNEMONIC_SYSEXIT,
|
|
ZYDIS_MNEMONIC_SYSRET,
|
|
ZYDIS_MNEMONIC_T1MSKC,
|
|
ZYDIS_MNEMONIC_TDCALL,
|
|
ZYDIS_MNEMONIC_TDPBF16PS,
|
|
ZYDIS_MNEMONIC_TDPBSSD,
|
|
ZYDIS_MNEMONIC_TDPBSUD,
|
|
ZYDIS_MNEMONIC_TDPBUSD,
|
|
ZYDIS_MNEMONIC_TDPBUUD,
|
|
ZYDIS_MNEMONIC_TEST,
|
|
ZYDIS_MNEMONIC_TESTUI,
|
|
ZYDIS_MNEMONIC_TILELOADD,
|
|
ZYDIS_MNEMONIC_TILELOADDT1,
|
|
ZYDIS_MNEMONIC_TILERELEASE,
|
|
ZYDIS_MNEMONIC_TILESTORED,
|
|
ZYDIS_MNEMONIC_TILEZERO,
|
|
ZYDIS_MNEMONIC_TLBSYNC,
|
|
ZYDIS_MNEMONIC_TPAUSE,
|
|
ZYDIS_MNEMONIC_TZCNT,
|
|
ZYDIS_MNEMONIC_TZCNTI,
|
|
ZYDIS_MNEMONIC_TZMSK,
|
|
ZYDIS_MNEMONIC_UCOMISD,
|
|
ZYDIS_MNEMONIC_UCOMISS,
|
|
ZYDIS_MNEMONIC_UD0,
|
|
ZYDIS_MNEMONIC_UD1,
|
|
ZYDIS_MNEMONIC_UD2,
|
|
ZYDIS_MNEMONIC_UIRET,
|
|
ZYDIS_MNEMONIC_UMONITOR,
|
|
ZYDIS_MNEMONIC_UMWAIT,
|
|
ZYDIS_MNEMONIC_UNPCKHPD,
|
|
ZYDIS_MNEMONIC_UNPCKHPS,
|
|
ZYDIS_MNEMONIC_UNPCKLPD,
|
|
ZYDIS_MNEMONIC_UNPCKLPS,
|
|
ZYDIS_MNEMONIC_V4FMADDPS,
|
|
ZYDIS_MNEMONIC_V4FMADDSS,
|
|
ZYDIS_MNEMONIC_V4FNMADDPS,
|
|
ZYDIS_MNEMONIC_V4FNMADDSS,
|
|
ZYDIS_MNEMONIC_VADDNPD,
|
|
ZYDIS_MNEMONIC_VADDNPS,
|
|
ZYDIS_MNEMONIC_VADDPD,
|
|
ZYDIS_MNEMONIC_VADDPH,
|
|
ZYDIS_MNEMONIC_VADDPS,
|
|
ZYDIS_MNEMONIC_VADDSD,
|
|
ZYDIS_MNEMONIC_VADDSETSPS,
|
|
ZYDIS_MNEMONIC_VADDSH,
|
|
ZYDIS_MNEMONIC_VADDSS,
|
|
ZYDIS_MNEMONIC_VADDSUBPD,
|
|
ZYDIS_MNEMONIC_VADDSUBPS,
|
|
ZYDIS_MNEMONIC_VAESDEC,
|
|
ZYDIS_MNEMONIC_VAESDECLAST,
|
|
ZYDIS_MNEMONIC_VAESENC,
|
|
ZYDIS_MNEMONIC_VAESENCLAST,
|
|
ZYDIS_MNEMONIC_VAESIMC,
|
|
ZYDIS_MNEMONIC_VAESKEYGENASSIST,
|
|
ZYDIS_MNEMONIC_VALIGND,
|
|
ZYDIS_MNEMONIC_VALIGNQ,
|
|
ZYDIS_MNEMONIC_VANDNPD,
|
|
ZYDIS_MNEMONIC_VANDNPS,
|
|
ZYDIS_MNEMONIC_VANDPD,
|
|
ZYDIS_MNEMONIC_VANDPS,
|
|
ZYDIS_MNEMONIC_VBLENDMPD,
|
|
ZYDIS_MNEMONIC_VBLENDMPS,
|
|
ZYDIS_MNEMONIC_VBLENDPD,
|
|
ZYDIS_MNEMONIC_VBLENDPS,
|
|
ZYDIS_MNEMONIC_VBLENDVPD,
|
|
ZYDIS_MNEMONIC_VBLENDVPS,
|
|
ZYDIS_MNEMONIC_VBROADCASTF128,
|
|
ZYDIS_MNEMONIC_VBROADCASTF32X2,
|
|
ZYDIS_MNEMONIC_VBROADCASTF32X4,
|
|
ZYDIS_MNEMONIC_VBROADCASTF32X8,
|
|
ZYDIS_MNEMONIC_VBROADCASTF64X2,
|
|
ZYDIS_MNEMONIC_VBROADCASTF64X4,
|
|
ZYDIS_MNEMONIC_VBROADCASTI128,
|
|
ZYDIS_MNEMONIC_VBROADCASTI32X2,
|
|
ZYDIS_MNEMONIC_VBROADCASTI32X4,
|
|
ZYDIS_MNEMONIC_VBROADCASTI32X8,
|
|
ZYDIS_MNEMONIC_VBROADCASTI64X2,
|
|
ZYDIS_MNEMONIC_VBROADCASTI64X4,
|
|
ZYDIS_MNEMONIC_VBROADCASTSD,
|
|
ZYDIS_MNEMONIC_VBROADCASTSS,
|
|
ZYDIS_MNEMONIC_VCMPPD,
|
|
ZYDIS_MNEMONIC_VCMPPH,
|
|
ZYDIS_MNEMONIC_VCMPPS,
|
|
ZYDIS_MNEMONIC_VCMPSD,
|
|
ZYDIS_MNEMONIC_VCMPSH,
|
|
ZYDIS_MNEMONIC_VCMPSS,
|
|
ZYDIS_MNEMONIC_VCOMISD,
|
|
ZYDIS_MNEMONIC_VCOMISH,
|
|
ZYDIS_MNEMONIC_VCOMISS,
|
|
ZYDIS_MNEMONIC_VCOMPRESSPD,
|
|
ZYDIS_MNEMONIC_VCOMPRESSPS,
|
|
ZYDIS_MNEMONIC_VCVTDQ2PD,
|
|
ZYDIS_MNEMONIC_VCVTDQ2PH,
|
|
ZYDIS_MNEMONIC_VCVTDQ2PS,
|
|
ZYDIS_MNEMONIC_VCVTFXPNTDQ2PS,
|
|
ZYDIS_MNEMONIC_VCVTFXPNTPD2DQ,
|
|
ZYDIS_MNEMONIC_VCVTFXPNTPD2UDQ,
|
|
ZYDIS_MNEMONIC_VCVTFXPNTPS2DQ,
|
|
ZYDIS_MNEMONIC_VCVTFXPNTPS2UDQ,
|
|
ZYDIS_MNEMONIC_VCVTFXPNTUDQ2PS,
|
|
ZYDIS_MNEMONIC_VCVTNE2PS2BF16,
|
|
ZYDIS_MNEMONIC_VCVTNEPS2BF16,
|
|
ZYDIS_MNEMONIC_VCVTPD2DQ,
|
|
ZYDIS_MNEMONIC_VCVTPD2PH,
|
|
ZYDIS_MNEMONIC_VCVTPD2PS,
|
|
ZYDIS_MNEMONIC_VCVTPD2QQ,
|
|
ZYDIS_MNEMONIC_VCVTPD2UDQ,
|
|
ZYDIS_MNEMONIC_VCVTPD2UQQ,
|
|
ZYDIS_MNEMONIC_VCVTPH2DQ,
|
|
ZYDIS_MNEMONIC_VCVTPH2PD,
|
|
ZYDIS_MNEMONIC_VCVTPH2PS,
|
|
ZYDIS_MNEMONIC_VCVTPH2PSX,
|
|
ZYDIS_MNEMONIC_VCVTPH2QQ,
|
|
ZYDIS_MNEMONIC_VCVTPH2UDQ,
|
|
ZYDIS_MNEMONIC_VCVTPH2UQQ,
|
|
ZYDIS_MNEMONIC_VCVTPH2UW,
|
|
ZYDIS_MNEMONIC_VCVTPH2W,
|
|
ZYDIS_MNEMONIC_VCVTPS2DQ,
|
|
ZYDIS_MNEMONIC_VCVTPS2PD,
|
|
ZYDIS_MNEMONIC_VCVTPS2PH,
|
|
ZYDIS_MNEMONIC_VCVTPS2PHX,
|
|
ZYDIS_MNEMONIC_VCVTPS2QQ,
|
|
ZYDIS_MNEMONIC_VCVTPS2UDQ,
|
|
ZYDIS_MNEMONIC_VCVTPS2UQQ,
|
|
ZYDIS_MNEMONIC_VCVTQQ2PD,
|
|
ZYDIS_MNEMONIC_VCVTQQ2PH,
|
|
ZYDIS_MNEMONIC_VCVTQQ2PS,
|
|
ZYDIS_MNEMONIC_VCVTSD2SH,
|
|
ZYDIS_MNEMONIC_VCVTSD2SI,
|
|
ZYDIS_MNEMONIC_VCVTSD2SS,
|
|
ZYDIS_MNEMONIC_VCVTSD2USI,
|
|
ZYDIS_MNEMONIC_VCVTSH2SD,
|
|
ZYDIS_MNEMONIC_VCVTSH2SI,
|
|
ZYDIS_MNEMONIC_VCVTSH2SS,
|
|
ZYDIS_MNEMONIC_VCVTSH2USI,
|
|
ZYDIS_MNEMONIC_VCVTSI2SD,
|
|
ZYDIS_MNEMONIC_VCVTSI2SH,
|
|
ZYDIS_MNEMONIC_VCVTSI2SS,
|
|
ZYDIS_MNEMONIC_VCVTSS2SD,
|
|
ZYDIS_MNEMONIC_VCVTSS2SH,
|
|
ZYDIS_MNEMONIC_VCVTSS2SI,
|
|
ZYDIS_MNEMONIC_VCVTSS2USI,
|
|
ZYDIS_MNEMONIC_VCVTTPD2DQ,
|
|
ZYDIS_MNEMONIC_VCVTTPD2QQ,
|
|
ZYDIS_MNEMONIC_VCVTTPD2UDQ,
|
|
ZYDIS_MNEMONIC_VCVTTPD2UQQ,
|
|
ZYDIS_MNEMONIC_VCVTTPH2DQ,
|
|
ZYDIS_MNEMONIC_VCVTTPH2QQ,
|
|
ZYDIS_MNEMONIC_VCVTTPH2UDQ,
|
|
ZYDIS_MNEMONIC_VCVTTPH2UQQ,
|
|
ZYDIS_MNEMONIC_VCVTTPH2UW,
|
|
ZYDIS_MNEMONIC_VCVTTPH2W,
|
|
ZYDIS_MNEMONIC_VCVTTPS2DQ,
|
|
ZYDIS_MNEMONIC_VCVTTPS2QQ,
|
|
ZYDIS_MNEMONIC_VCVTTPS2UDQ,
|
|
ZYDIS_MNEMONIC_VCVTTPS2UQQ,
|
|
ZYDIS_MNEMONIC_VCVTTSD2SI,
|
|
ZYDIS_MNEMONIC_VCVTTSD2USI,
|
|
ZYDIS_MNEMONIC_VCVTTSH2SI,
|
|
ZYDIS_MNEMONIC_VCVTTSH2USI,
|
|
ZYDIS_MNEMONIC_VCVTTSS2SI,
|
|
ZYDIS_MNEMONIC_VCVTTSS2USI,
|
|
ZYDIS_MNEMONIC_VCVTUDQ2PD,
|
|
ZYDIS_MNEMONIC_VCVTUDQ2PH,
|
|
ZYDIS_MNEMONIC_VCVTUDQ2PS,
|
|
ZYDIS_MNEMONIC_VCVTUQQ2PD,
|
|
ZYDIS_MNEMONIC_VCVTUQQ2PH,
|
|
ZYDIS_MNEMONIC_VCVTUQQ2PS,
|
|
ZYDIS_MNEMONIC_VCVTUSI2SD,
|
|
ZYDIS_MNEMONIC_VCVTUSI2SH,
|
|
ZYDIS_MNEMONIC_VCVTUSI2SS,
|
|
ZYDIS_MNEMONIC_VCVTUW2PH,
|
|
ZYDIS_MNEMONIC_VCVTW2PH,
|
|
ZYDIS_MNEMONIC_VDBPSADBW,
|
|
ZYDIS_MNEMONIC_VDIVPD,
|
|
ZYDIS_MNEMONIC_VDIVPH,
|
|
ZYDIS_MNEMONIC_VDIVPS,
|
|
ZYDIS_MNEMONIC_VDIVSD,
|
|
ZYDIS_MNEMONIC_VDIVSH,
|
|
ZYDIS_MNEMONIC_VDIVSS,
|
|
ZYDIS_MNEMONIC_VDPBF16PS,
|
|
ZYDIS_MNEMONIC_VDPPD,
|
|
ZYDIS_MNEMONIC_VDPPS,
|
|
ZYDIS_MNEMONIC_VERR,
|
|
ZYDIS_MNEMONIC_VERW,
|
|
ZYDIS_MNEMONIC_VEXP223PS,
|
|
ZYDIS_MNEMONIC_VEXP2PD,
|
|
ZYDIS_MNEMONIC_VEXP2PS,
|
|
ZYDIS_MNEMONIC_VEXPANDPD,
|
|
ZYDIS_MNEMONIC_VEXPANDPS,
|
|
ZYDIS_MNEMONIC_VEXTRACTF128,
|
|
ZYDIS_MNEMONIC_VEXTRACTF32X4,
|
|
ZYDIS_MNEMONIC_VEXTRACTF32X8,
|
|
ZYDIS_MNEMONIC_VEXTRACTF64X2,
|
|
ZYDIS_MNEMONIC_VEXTRACTF64X4,
|
|
ZYDIS_MNEMONIC_VEXTRACTI128,
|
|
ZYDIS_MNEMONIC_VEXTRACTI32X4,
|
|
ZYDIS_MNEMONIC_VEXTRACTI32X8,
|
|
ZYDIS_MNEMONIC_VEXTRACTI64X2,
|
|
ZYDIS_MNEMONIC_VEXTRACTI64X4,
|
|
ZYDIS_MNEMONIC_VEXTRACTPS,
|
|
ZYDIS_MNEMONIC_VFCMADDCPH,
|
|
ZYDIS_MNEMONIC_VFCMADDCSH,
|
|
ZYDIS_MNEMONIC_VFCMULCPH,
|
|
ZYDIS_MNEMONIC_VFCMULCSH,
|
|
ZYDIS_MNEMONIC_VFIXUPIMMPD,
|
|
ZYDIS_MNEMONIC_VFIXUPIMMPS,
|
|
ZYDIS_MNEMONIC_VFIXUPIMMSD,
|
|
ZYDIS_MNEMONIC_VFIXUPIMMSS,
|
|
ZYDIS_MNEMONIC_VFIXUPNANPD,
|
|
ZYDIS_MNEMONIC_VFIXUPNANPS,
|
|
ZYDIS_MNEMONIC_VFMADD132PD,
|
|
ZYDIS_MNEMONIC_VFMADD132PH,
|
|
ZYDIS_MNEMONIC_VFMADD132PS,
|
|
ZYDIS_MNEMONIC_VFMADD132SD,
|
|
ZYDIS_MNEMONIC_VFMADD132SH,
|
|
ZYDIS_MNEMONIC_VFMADD132SS,
|
|
ZYDIS_MNEMONIC_VFMADD213PD,
|
|
ZYDIS_MNEMONIC_VFMADD213PH,
|
|
ZYDIS_MNEMONIC_VFMADD213PS,
|
|
ZYDIS_MNEMONIC_VFMADD213SD,
|
|
ZYDIS_MNEMONIC_VFMADD213SH,
|
|
ZYDIS_MNEMONIC_VFMADD213SS,
|
|
ZYDIS_MNEMONIC_VFMADD231PD,
|
|
ZYDIS_MNEMONIC_VFMADD231PH,
|
|
ZYDIS_MNEMONIC_VFMADD231PS,
|
|
ZYDIS_MNEMONIC_VFMADD231SD,
|
|
ZYDIS_MNEMONIC_VFMADD231SH,
|
|
ZYDIS_MNEMONIC_VFMADD231SS,
|
|
ZYDIS_MNEMONIC_VFMADD233PS,
|
|
ZYDIS_MNEMONIC_VFMADDCPH,
|
|
ZYDIS_MNEMONIC_VFMADDCSH,
|
|
ZYDIS_MNEMONIC_VFMADDPD,
|
|
ZYDIS_MNEMONIC_VFMADDPS,
|
|
ZYDIS_MNEMONIC_VFMADDSD,
|
|
ZYDIS_MNEMONIC_VFMADDSS,
|
|
ZYDIS_MNEMONIC_VFMADDSUB132PD,
|
|
ZYDIS_MNEMONIC_VFMADDSUB132PH,
|
|
ZYDIS_MNEMONIC_VFMADDSUB132PS,
|
|
ZYDIS_MNEMONIC_VFMADDSUB213PD,
|
|
ZYDIS_MNEMONIC_VFMADDSUB213PH,
|
|
ZYDIS_MNEMONIC_VFMADDSUB213PS,
|
|
ZYDIS_MNEMONIC_VFMADDSUB231PD,
|
|
ZYDIS_MNEMONIC_VFMADDSUB231PH,
|
|
ZYDIS_MNEMONIC_VFMADDSUB231PS,
|
|
ZYDIS_MNEMONIC_VFMADDSUBPD,
|
|
ZYDIS_MNEMONIC_VFMADDSUBPS,
|
|
ZYDIS_MNEMONIC_VFMSUB132PD,
|
|
ZYDIS_MNEMONIC_VFMSUB132PH,
|
|
ZYDIS_MNEMONIC_VFMSUB132PS,
|
|
ZYDIS_MNEMONIC_VFMSUB132SD,
|
|
ZYDIS_MNEMONIC_VFMSUB132SH,
|
|
ZYDIS_MNEMONIC_VFMSUB132SS,
|
|
ZYDIS_MNEMONIC_VFMSUB213PD,
|
|
ZYDIS_MNEMONIC_VFMSUB213PH,
|
|
ZYDIS_MNEMONIC_VFMSUB213PS,
|
|
ZYDIS_MNEMONIC_VFMSUB213SD,
|
|
ZYDIS_MNEMONIC_VFMSUB213SH,
|
|
ZYDIS_MNEMONIC_VFMSUB213SS,
|
|
ZYDIS_MNEMONIC_VFMSUB231PD,
|
|
ZYDIS_MNEMONIC_VFMSUB231PH,
|
|
ZYDIS_MNEMONIC_VFMSUB231PS,
|
|
ZYDIS_MNEMONIC_VFMSUB231SD,
|
|
ZYDIS_MNEMONIC_VFMSUB231SH,
|
|
ZYDIS_MNEMONIC_VFMSUB231SS,
|
|
ZYDIS_MNEMONIC_VFMSUBADD132PD,
|
|
ZYDIS_MNEMONIC_VFMSUBADD132PH,
|
|
ZYDIS_MNEMONIC_VFMSUBADD132PS,
|
|
ZYDIS_MNEMONIC_VFMSUBADD213PD,
|
|
ZYDIS_MNEMONIC_VFMSUBADD213PH,
|
|
ZYDIS_MNEMONIC_VFMSUBADD213PS,
|
|
ZYDIS_MNEMONIC_VFMSUBADD231PD,
|
|
ZYDIS_MNEMONIC_VFMSUBADD231PH,
|
|
ZYDIS_MNEMONIC_VFMSUBADD231PS,
|
|
ZYDIS_MNEMONIC_VFMSUBADDPD,
|
|
ZYDIS_MNEMONIC_VFMSUBADDPS,
|
|
ZYDIS_MNEMONIC_VFMSUBPD,
|
|
ZYDIS_MNEMONIC_VFMSUBPS,
|
|
ZYDIS_MNEMONIC_VFMSUBSD,
|
|
ZYDIS_MNEMONIC_VFMSUBSS,
|
|
ZYDIS_MNEMONIC_VFMULCPH,
|
|
ZYDIS_MNEMONIC_VFMULCSH,
|
|
ZYDIS_MNEMONIC_VFNMADD132PD,
|
|
ZYDIS_MNEMONIC_VFNMADD132PH,
|
|
ZYDIS_MNEMONIC_VFNMADD132PS,
|
|
ZYDIS_MNEMONIC_VFNMADD132SD,
|
|
ZYDIS_MNEMONIC_VFNMADD132SH,
|
|
ZYDIS_MNEMONIC_VFNMADD132SS,
|
|
ZYDIS_MNEMONIC_VFNMADD213PD,
|
|
ZYDIS_MNEMONIC_VFNMADD213PH,
|
|
ZYDIS_MNEMONIC_VFNMADD213PS,
|
|
ZYDIS_MNEMONIC_VFNMADD213SD,
|
|
ZYDIS_MNEMONIC_VFNMADD213SH,
|
|
ZYDIS_MNEMONIC_VFNMADD213SS,
|
|
ZYDIS_MNEMONIC_VFNMADD231PD,
|
|
ZYDIS_MNEMONIC_VFNMADD231PH,
|
|
ZYDIS_MNEMONIC_VFNMADD231PS,
|
|
ZYDIS_MNEMONIC_VFNMADD231SD,
|
|
ZYDIS_MNEMONIC_VFNMADD231SH,
|
|
ZYDIS_MNEMONIC_VFNMADD231SS,
|
|
ZYDIS_MNEMONIC_VFNMADDPD,
|
|
ZYDIS_MNEMONIC_VFNMADDPS,
|
|
ZYDIS_MNEMONIC_VFNMADDSD,
|
|
ZYDIS_MNEMONIC_VFNMADDSS,
|
|
ZYDIS_MNEMONIC_VFNMSUB132PD,
|
|
ZYDIS_MNEMONIC_VFNMSUB132PH,
|
|
ZYDIS_MNEMONIC_VFNMSUB132PS,
|
|
ZYDIS_MNEMONIC_VFNMSUB132SD,
|
|
ZYDIS_MNEMONIC_VFNMSUB132SH,
|
|
ZYDIS_MNEMONIC_VFNMSUB132SS,
|
|
ZYDIS_MNEMONIC_VFNMSUB213PD,
|
|
ZYDIS_MNEMONIC_VFNMSUB213PH,
|
|
ZYDIS_MNEMONIC_VFNMSUB213PS,
|
|
ZYDIS_MNEMONIC_VFNMSUB213SD,
|
|
ZYDIS_MNEMONIC_VFNMSUB213SH,
|
|
ZYDIS_MNEMONIC_VFNMSUB213SS,
|
|
ZYDIS_MNEMONIC_VFNMSUB231PD,
|
|
ZYDIS_MNEMONIC_VFNMSUB231PH,
|
|
ZYDIS_MNEMONIC_VFNMSUB231PS,
|
|
ZYDIS_MNEMONIC_VFNMSUB231SD,
|
|
ZYDIS_MNEMONIC_VFNMSUB231SH,
|
|
ZYDIS_MNEMONIC_VFNMSUB231SS,
|
|
ZYDIS_MNEMONIC_VFNMSUBPD,
|
|
ZYDIS_MNEMONIC_VFNMSUBPS,
|
|
ZYDIS_MNEMONIC_VFNMSUBSD,
|
|
ZYDIS_MNEMONIC_VFNMSUBSS,
|
|
ZYDIS_MNEMONIC_VFPCLASSPD,
|
|
ZYDIS_MNEMONIC_VFPCLASSPH,
|
|
ZYDIS_MNEMONIC_VFPCLASSPS,
|
|
ZYDIS_MNEMONIC_VFPCLASSSD,
|
|
ZYDIS_MNEMONIC_VFPCLASSSH,
|
|
ZYDIS_MNEMONIC_VFPCLASSSS,
|
|
ZYDIS_MNEMONIC_VFRCZPD,
|
|
ZYDIS_MNEMONIC_VFRCZPS,
|
|
ZYDIS_MNEMONIC_VFRCZSD,
|
|
ZYDIS_MNEMONIC_VFRCZSS,
|
|
ZYDIS_MNEMONIC_VGATHERDPD,
|
|
ZYDIS_MNEMONIC_VGATHERDPS,
|
|
ZYDIS_MNEMONIC_VGATHERPF0DPD,
|
|
ZYDIS_MNEMONIC_VGATHERPF0DPS,
|
|
ZYDIS_MNEMONIC_VGATHERPF0HINTDPD,
|
|
ZYDIS_MNEMONIC_VGATHERPF0HINTDPS,
|
|
ZYDIS_MNEMONIC_VGATHERPF0QPD,
|
|
ZYDIS_MNEMONIC_VGATHERPF0QPS,
|
|
ZYDIS_MNEMONIC_VGATHERPF1DPD,
|
|
ZYDIS_MNEMONIC_VGATHERPF1DPS,
|
|
ZYDIS_MNEMONIC_VGATHERPF1QPD,
|
|
ZYDIS_MNEMONIC_VGATHERPF1QPS,
|
|
ZYDIS_MNEMONIC_VGATHERQPD,
|
|
ZYDIS_MNEMONIC_VGATHERQPS,
|
|
ZYDIS_MNEMONIC_VGETEXPPD,
|
|
ZYDIS_MNEMONIC_VGETEXPPH,
|
|
ZYDIS_MNEMONIC_VGETEXPPS,
|
|
ZYDIS_MNEMONIC_VGETEXPSD,
|
|
ZYDIS_MNEMONIC_VGETEXPSH,
|
|
ZYDIS_MNEMONIC_VGETEXPSS,
|
|
ZYDIS_MNEMONIC_VGETMANTPD,
|
|
ZYDIS_MNEMONIC_VGETMANTPH,
|
|
ZYDIS_MNEMONIC_VGETMANTPS,
|
|
ZYDIS_MNEMONIC_VGETMANTSD,
|
|
ZYDIS_MNEMONIC_VGETMANTSH,
|
|
ZYDIS_MNEMONIC_VGETMANTSS,
|
|
ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB,
|
|
ZYDIS_MNEMONIC_VGF2P8AFFINEQB,
|
|
ZYDIS_MNEMONIC_VGF2P8MULB,
|
|
ZYDIS_MNEMONIC_VGMAXABSPS,
|
|
ZYDIS_MNEMONIC_VGMAXPD,
|
|
ZYDIS_MNEMONIC_VGMAXPS,
|
|
ZYDIS_MNEMONIC_VGMINPD,
|
|
ZYDIS_MNEMONIC_VGMINPS,
|
|
ZYDIS_MNEMONIC_VHADDPD,
|
|
ZYDIS_MNEMONIC_VHADDPS,
|
|
ZYDIS_MNEMONIC_VHSUBPD,
|
|
ZYDIS_MNEMONIC_VHSUBPS,
|
|
ZYDIS_MNEMONIC_VINSERTF128,
|
|
ZYDIS_MNEMONIC_VINSERTF32X4,
|
|
ZYDIS_MNEMONIC_VINSERTF32X8,
|
|
ZYDIS_MNEMONIC_VINSERTF64X2,
|
|
ZYDIS_MNEMONIC_VINSERTF64X4,
|
|
ZYDIS_MNEMONIC_VINSERTI128,
|
|
ZYDIS_MNEMONIC_VINSERTI32X4,
|
|
ZYDIS_MNEMONIC_VINSERTI32X8,
|
|
ZYDIS_MNEMONIC_VINSERTI64X2,
|
|
ZYDIS_MNEMONIC_VINSERTI64X4,
|
|
ZYDIS_MNEMONIC_VINSERTPS,
|
|
ZYDIS_MNEMONIC_VLDDQU,
|
|
ZYDIS_MNEMONIC_VLDMXCSR,
|
|
ZYDIS_MNEMONIC_VLOADUNPACKHD,
|
|
ZYDIS_MNEMONIC_VLOADUNPACKHPD,
|
|
ZYDIS_MNEMONIC_VLOADUNPACKHPS,
|
|
ZYDIS_MNEMONIC_VLOADUNPACKHQ,
|
|
ZYDIS_MNEMONIC_VLOADUNPACKLD,
|
|
ZYDIS_MNEMONIC_VLOADUNPACKLPD,
|
|
ZYDIS_MNEMONIC_VLOADUNPACKLPS,
|
|
ZYDIS_MNEMONIC_VLOADUNPACKLQ,
|
|
ZYDIS_MNEMONIC_VLOG2PS,
|
|
ZYDIS_MNEMONIC_VMASKMOVDQU,
|
|
ZYDIS_MNEMONIC_VMASKMOVPD,
|
|
ZYDIS_MNEMONIC_VMASKMOVPS,
|
|
ZYDIS_MNEMONIC_VMAXPD,
|
|
ZYDIS_MNEMONIC_VMAXPH,
|
|
ZYDIS_MNEMONIC_VMAXPS,
|
|
ZYDIS_MNEMONIC_VMAXSD,
|
|
ZYDIS_MNEMONIC_VMAXSH,
|
|
ZYDIS_MNEMONIC_VMAXSS,
|
|
ZYDIS_MNEMONIC_VMCALL,
|
|
ZYDIS_MNEMONIC_VMCLEAR,
|
|
ZYDIS_MNEMONIC_VMFUNC,
|
|
ZYDIS_MNEMONIC_VMINPD,
|
|
ZYDIS_MNEMONIC_VMINPH,
|
|
ZYDIS_MNEMONIC_VMINPS,
|
|
ZYDIS_MNEMONIC_VMINSD,
|
|
ZYDIS_MNEMONIC_VMINSH,
|
|
ZYDIS_MNEMONIC_VMINSS,
|
|
ZYDIS_MNEMONIC_VMLAUNCH,
|
|
ZYDIS_MNEMONIC_VMLOAD,
|
|
ZYDIS_MNEMONIC_VMMCALL,
|
|
ZYDIS_MNEMONIC_VMOVAPD,
|
|
ZYDIS_MNEMONIC_VMOVAPS,
|
|
ZYDIS_MNEMONIC_VMOVD,
|
|
ZYDIS_MNEMONIC_VMOVDDUP,
|
|
ZYDIS_MNEMONIC_VMOVDQA,
|
|
ZYDIS_MNEMONIC_VMOVDQA32,
|
|
ZYDIS_MNEMONIC_VMOVDQA64,
|
|
ZYDIS_MNEMONIC_VMOVDQU,
|
|
ZYDIS_MNEMONIC_VMOVDQU16,
|
|
ZYDIS_MNEMONIC_VMOVDQU32,
|
|
ZYDIS_MNEMONIC_VMOVDQU64,
|
|
ZYDIS_MNEMONIC_VMOVDQU8,
|
|
ZYDIS_MNEMONIC_VMOVHLPS,
|
|
ZYDIS_MNEMONIC_VMOVHPD,
|
|
ZYDIS_MNEMONIC_VMOVHPS,
|
|
ZYDIS_MNEMONIC_VMOVLHPS,
|
|
ZYDIS_MNEMONIC_VMOVLPD,
|
|
ZYDIS_MNEMONIC_VMOVLPS,
|
|
ZYDIS_MNEMONIC_VMOVMSKPD,
|
|
ZYDIS_MNEMONIC_VMOVMSKPS,
|
|
ZYDIS_MNEMONIC_VMOVNRAPD,
|
|
ZYDIS_MNEMONIC_VMOVNRAPS,
|
|
ZYDIS_MNEMONIC_VMOVNRNGOAPD,
|
|
ZYDIS_MNEMONIC_VMOVNRNGOAPS,
|
|
ZYDIS_MNEMONIC_VMOVNTDQ,
|
|
ZYDIS_MNEMONIC_VMOVNTDQA,
|
|
ZYDIS_MNEMONIC_VMOVNTPD,
|
|
ZYDIS_MNEMONIC_VMOVNTPS,
|
|
ZYDIS_MNEMONIC_VMOVQ,
|
|
ZYDIS_MNEMONIC_VMOVSD,
|
|
ZYDIS_MNEMONIC_VMOVSH,
|
|
ZYDIS_MNEMONIC_VMOVSHDUP,
|
|
ZYDIS_MNEMONIC_VMOVSLDUP,
|
|
ZYDIS_MNEMONIC_VMOVSS,
|
|
ZYDIS_MNEMONIC_VMOVUPD,
|
|
ZYDIS_MNEMONIC_VMOVUPS,
|
|
ZYDIS_MNEMONIC_VMOVW,
|
|
ZYDIS_MNEMONIC_VMPSADBW,
|
|
ZYDIS_MNEMONIC_VMPTRLD,
|
|
ZYDIS_MNEMONIC_VMPTRST,
|
|
ZYDIS_MNEMONIC_VMREAD,
|
|
ZYDIS_MNEMONIC_VMRESUME,
|
|
ZYDIS_MNEMONIC_VMRUN,
|
|
ZYDIS_MNEMONIC_VMSAVE,
|
|
ZYDIS_MNEMONIC_VMULPD,
|
|
ZYDIS_MNEMONIC_VMULPH,
|
|
ZYDIS_MNEMONIC_VMULPS,
|
|
ZYDIS_MNEMONIC_VMULSD,
|
|
ZYDIS_MNEMONIC_VMULSH,
|
|
ZYDIS_MNEMONIC_VMULSS,
|
|
ZYDIS_MNEMONIC_VMWRITE,
|
|
ZYDIS_MNEMONIC_VMXOFF,
|
|
ZYDIS_MNEMONIC_VMXON,
|
|
ZYDIS_MNEMONIC_VORPD,
|
|
ZYDIS_MNEMONIC_VORPS,
|
|
ZYDIS_MNEMONIC_VP2INTERSECTD,
|
|
ZYDIS_MNEMONIC_VP2INTERSECTQ,
|
|
ZYDIS_MNEMONIC_VP4DPWSSD,
|
|
ZYDIS_MNEMONIC_VP4DPWSSDS,
|
|
ZYDIS_MNEMONIC_VPABSB,
|
|
ZYDIS_MNEMONIC_VPABSD,
|
|
ZYDIS_MNEMONIC_VPABSQ,
|
|
ZYDIS_MNEMONIC_VPABSW,
|
|
ZYDIS_MNEMONIC_VPACKSSDW,
|
|
ZYDIS_MNEMONIC_VPACKSSWB,
|
|
ZYDIS_MNEMONIC_VPACKSTOREHD,
|
|
ZYDIS_MNEMONIC_VPACKSTOREHPD,
|
|
ZYDIS_MNEMONIC_VPACKSTOREHPS,
|
|
ZYDIS_MNEMONIC_VPACKSTOREHQ,
|
|
ZYDIS_MNEMONIC_VPACKSTORELD,
|
|
ZYDIS_MNEMONIC_VPACKSTORELPD,
|
|
ZYDIS_MNEMONIC_VPACKSTORELPS,
|
|
ZYDIS_MNEMONIC_VPACKSTORELQ,
|
|
ZYDIS_MNEMONIC_VPACKUSDW,
|
|
ZYDIS_MNEMONIC_VPACKUSWB,
|
|
ZYDIS_MNEMONIC_VPADCD,
|
|
ZYDIS_MNEMONIC_VPADDB,
|
|
ZYDIS_MNEMONIC_VPADDD,
|
|
ZYDIS_MNEMONIC_VPADDQ,
|
|
ZYDIS_MNEMONIC_VPADDSB,
|
|
ZYDIS_MNEMONIC_VPADDSETCD,
|
|
ZYDIS_MNEMONIC_VPADDSETSD,
|
|
ZYDIS_MNEMONIC_VPADDSW,
|
|
ZYDIS_MNEMONIC_VPADDUSB,
|
|
ZYDIS_MNEMONIC_VPADDUSW,
|
|
ZYDIS_MNEMONIC_VPADDW,
|
|
ZYDIS_MNEMONIC_VPALIGNR,
|
|
ZYDIS_MNEMONIC_VPAND,
|
|
ZYDIS_MNEMONIC_VPANDD,
|
|
ZYDIS_MNEMONIC_VPANDN,
|
|
ZYDIS_MNEMONIC_VPANDND,
|
|
ZYDIS_MNEMONIC_VPANDNQ,
|
|
ZYDIS_MNEMONIC_VPANDQ,
|
|
ZYDIS_MNEMONIC_VPAVGB,
|
|
ZYDIS_MNEMONIC_VPAVGW,
|
|
ZYDIS_MNEMONIC_VPBLENDD,
|
|
ZYDIS_MNEMONIC_VPBLENDMB,
|
|
ZYDIS_MNEMONIC_VPBLENDMD,
|
|
ZYDIS_MNEMONIC_VPBLENDMQ,
|
|
ZYDIS_MNEMONIC_VPBLENDMW,
|
|
ZYDIS_MNEMONIC_VPBLENDVB,
|
|
ZYDIS_MNEMONIC_VPBLENDW,
|
|
ZYDIS_MNEMONIC_VPBROADCASTB,
|
|
ZYDIS_MNEMONIC_VPBROADCASTD,
|
|
ZYDIS_MNEMONIC_VPBROADCASTMB2Q,
|
|
ZYDIS_MNEMONIC_VPBROADCASTMW2D,
|
|
ZYDIS_MNEMONIC_VPBROADCASTQ,
|
|
ZYDIS_MNEMONIC_VPBROADCASTW,
|
|
ZYDIS_MNEMONIC_VPCLMULQDQ,
|
|
ZYDIS_MNEMONIC_VPCMOV,
|
|
ZYDIS_MNEMONIC_VPCMPB,
|
|
ZYDIS_MNEMONIC_VPCMPD,
|
|
ZYDIS_MNEMONIC_VPCMPEQB,
|
|
ZYDIS_MNEMONIC_VPCMPEQD,
|
|
ZYDIS_MNEMONIC_VPCMPEQQ,
|
|
ZYDIS_MNEMONIC_VPCMPEQW,
|
|
ZYDIS_MNEMONIC_VPCMPESTRI,
|
|
ZYDIS_MNEMONIC_VPCMPESTRM,
|
|
ZYDIS_MNEMONIC_VPCMPGTB,
|
|
ZYDIS_MNEMONIC_VPCMPGTD,
|
|
ZYDIS_MNEMONIC_VPCMPGTQ,
|
|
ZYDIS_MNEMONIC_VPCMPGTW,
|
|
ZYDIS_MNEMONIC_VPCMPISTRI,
|
|
ZYDIS_MNEMONIC_VPCMPISTRM,
|
|
ZYDIS_MNEMONIC_VPCMPLTD,
|
|
ZYDIS_MNEMONIC_VPCMPQ,
|
|
ZYDIS_MNEMONIC_VPCMPUB,
|
|
ZYDIS_MNEMONIC_VPCMPUD,
|
|
ZYDIS_MNEMONIC_VPCMPUQ,
|
|
ZYDIS_MNEMONIC_VPCMPUW,
|
|
ZYDIS_MNEMONIC_VPCMPW,
|
|
ZYDIS_MNEMONIC_VPCOMB,
|
|
ZYDIS_MNEMONIC_VPCOMD,
|
|
ZYDIS_MNEMONIC_VPCOMPRESSB,
|
|
ZYDIS_MNEMONIC_VPCOMPRESSD,
|
|
ZYDIS_MNEMONIC_VPCOMPRESSQ,
|
|
ZYDIS_MNEMONIC_VPCOMPRESSW,
|
|
ZYDIS_MNEMONIC_VPCOMQ,
|
|
ZYDIS_MNEMONIC_VPCOMUB,
|
|
ZYDIS_MNEMONIC_VPCOMUD,
|
|
ZYDIS_MNEMONIC_VPCOMUQ,
|
|
ZYDIS_MNEMONIC_VPCOMUW,
|
|
ZYDIS_MNEMONIC_VPCOMW,
|
|
ZYDIS_MNEMONIC_VPCONFLICTD,
|
|
ZYDIS_MNEMONIC_VPCONFLICTQ,
|
|
ZYDIS_MNEMONIC_VPDPBUSD,
|
|
ZYDIS_MNEMONIC_VPDPBUSDS,
|
|
ZYDIS_MNEMONIC_VPDPWSSD,
|
|
ZYDIS_MNEMONIC_VPDPWSSDS,
|
|
ZYDIS_MNEMONIC_VPERM2F128,
|
|
ZYDIS_MNEMONIC_VPERM2I128,
|
|
ZYDIS_MNEMONIC_VPERMB,
|
|
ZYDIS_MNEMONIC_VPERMD,
|
|
ZYDIS_MNEMONIC_VPERMF32X4,
|
|
ZYDIS_MNEMONIC_VPERMI2B,
|
|
ZYDIS_MNEMONIC_VPERMI2D,
|
|
ZYDIS_MNEMONIC_VPERMI2PD,
|
|
ZYDIS_MNEMONIC_VPERMI2PS,
|
|
ZYDIS_MNEMONIC_VPERMI2Q,
|
|
ZYDIS_MNEMONIC_VPERMI2W,
|
|
ZYDIS_MNEMONIC_VPERMIL2PD,
|
|
ZYDIS_MNEMONIC_VPERMIL2PS,
|
|
ZYDIS_MNEMONIC_VPERMILPD,
|
|
ZYDIS_MNEMONIC_VPERMILPS,
|
|
ZYDIS_MNEMONIC_VPERMPD,
|
|
ZYDIS_MNEMONIC_VPERMPS,
|
|
ZYDIS_MNEMONIC_VPERMQ,
|
|
ZYDIS_MNEMONIC_VPERMT2B,
|
|
ZYDIS_MNEMONIC_VPERMT2D,
|
|
ZYDIS_MNEMONIC_VPERMT2PD,
|
|
ZYDIS_MNEMONIC_VPERMT2PS,
|
|
ZYDIS_MNEMONIC_VPERMT2Q,
|
|
ZYDIS_MNEMONIC_VPERMT2W,
|
|
ZYDIS_MNEMONIC_VPERMW,
|
|
ZYDIS_MNEMONIC_VPEXPANDB,
|
|
ZYDIS_MNEMONIC_VPEXPANDD,
|
|
ZYDIS_MNEMONIC_VPEXPANDQ,
|
|
ZYDIS_MNEMONIC_VPEXPANDW,
|
|
ZYDIS_MNEMONIC_VPEXTRB,
|
|
ZYDIS_MNEMONIC_VPEXTRD,
|
|
ZYDIS_MNEMONIC_VPEXTRQ,
|
|
ZYDIS_MNEMONIC_VPEXTRW,
|
|
ZYDIS_MNEMONIC_VPGATHERDD,
|
|
ZYDIS_MNEMONIC_VPGATHERDQ,
|
|
ZYDIS_MNEMONIC_VPGATHERQD,
|
|
ZYDIS_MNEMONIC_VPGATHERQQ,
|
|
ZYDIS_MNEMONIC_VPHADDBD,
|
|
ZYDIS_MNEMONIC_VPHADDBQ,
|
|
ZYDIS_MNEMONIC_VPHADDBW,
|
|
ZYDIS_MNEMONIC_VPHADDD,
|
|
ZYDIS_MNEMONIC_VPHADDDQ,
|
|
ZYDIS_MNEMONIC_VPHADDSW,
|
|
ZYDIS_MNEMONIC_VPHADDUBD,
|
|
ZYDIS_MNEMONIC_VPHADDUBQ,
|
|
ZYDIS_MNEMONIC_VPHADDUBW,
|
|
ZYDIS_MNEMONIC_VPHADDUDQ,
|
|
ZYDIS_MNEMONIC_VPHADDUWD,
|
|
ZYDIS_MNEMONIC_VPHADDUWQ,
|
|
ZYDIS_MNEMONIC_VPHADDW,
|
|
ZYDIS_MNEMONIC_VPHADDWD,
|
|
ZYDIS_MNEMONIC_VPHADDWQ,
|
|
ZYDIS_MNEMONIC_VPHMINPOSUW,
|
|
ZYDIS_MNEMONIC_VPHSUBBW,
|
|
ZYDIS_MNEMONIC_VPHSUBD,
|
|
ZYDIS_MNEMONIC_VPHSUBDQ,
|
|
ZYDIS_MNEMONIC_VPHSUBSW,
|
|
ZYDIS_MNEMONIC_VPHSUBW,
|
|
ZYDIS_MNEMONIC_VPHSUBWD,
|
|
ZYDIS_MNEMONIC_VPINSRB,
|
|
ZYDIS_MNEMONIC_VPINSRD,
|
|
ZYDIS_MNEMONIC_VPINSRQ,
|
|
ZYDIS_MNEMONIC_VPINSRW,
|
|
ZYDIS_MNEMONIC_VPLZCNTD,
|
|
ZYDIS_MNEMONIC_VPLZCNTQ,
|
|
ZYDIS_MNEMONIC_VPMACSDD,
|
|
ZYDIS_MNEMONIC_VPMACSDQH,
|
|
ZYDIS_MNEMONIC_VPMACSDQL,
|
|
ZYDIS_MNEMONIC_VPMACSSDD,
|
|
ZYDIS_MNEMONIC_VPMACSSDQH,
|
|
ZYDIS_MNEMONIC_VPMACSSDQL,
|
|
ZYDIS_MNEMONIC_VPMACSSWD,
|
|
ZYDIS_MNEMONIC_VPMACSSWW,
|
|
ZYDIS_MNEMONIC_VPMACSWD,
|
|
ZYDIS_MNEMONIC_VPMACSWW,
|
|
ZYDIS_MNEMONIC_VPMADCSSWD,
|
|
ZYDIS_MNEMONIC_VPMADCSWD,
|
|
ZYDIS_MNEMONIC_VPMADD231D,
|
|
ZYDIS_MNEMONIC_VPMADD233D,
|
|
ZYDIS_MNEMONIC_VPMADD52HUQ,
|
|
ZYDIS_MNEMONIC_VPMADD52LUQ,
|
|
ZYDIS_MNEMONIC_VPMADDUBSW,
|
|
ZYDIS_MNEMONIC_VPMADDWD,
|
|
ZYDIS_MNEMONIC_VPMASKMOVD,
|
|
ZYDIS_MNEMONIC_VPMASKMOVQ,
|
|
ZYDIS_MNEMONIC_VPMAXSB,
|
|
ZYDIS_MNEMONIC_VPMAXSD,
|
|
ZYDIS_MNEMONIC_VPMAXSQ,
|
|
ZYDIS_MNEMONIC_VPMAXSW,
|
|
ZYDIS_MNEMONIC_VPMAXUB,
|
|
ZYDIS_MNEMONIC_VPMAXUD,
|
|
ZYDIS_MNEMONIC_VPMAXUQ,
|
|
ZYDIS_MNEMONIC_VPMAXUW,
|
|
ZYDIS_MNEMONIC_VPMINSB,
|
|
ZYDIS_MNEMONIC_VPMINSD,
|
|
ZYDIS_MNEMONIC_VPMINSQ,
|
|
ZYDIS_MNEMONIC_VPMINSW,
|
|
ZYDIS_MNEMONIC_VPMINUB,
|
|
ZYDIS_MNEMONIC_VPMINUD,
|
|
ZYDIS_MNEMONIC_VPMINUQ,
|
|
ZYDIS_MNEMONIC_VPMINUW,
|
|
ZYDIS_MNEMONIC_VPMOVB2M,
|
|
ZYDIS_MNEMONIC_VPMOVD2M,
|
|
ZYDIS_MNEMONIC_VPMOVDB,
|
|
ZYDIS_MNEMONIC_VPMOVDW,
|
|
ZYDIS_MNEMONIC_VPMOVM2B,
|
|
ZYDIS_MNEMONIC_VPMOVM2D,
|
|
ZYDIS_MNEMONIC_VPMOVM2Q,
|
|
ZYDIS_MNEMONIC_VPMOVM2W,
|
|
ZYDIS_MNEMONIC_VPMOVMSKB,
|
|
ZYDIS_MNEMONIC_VPMOVQ2M,
|
|
ZYDIS_MNEMONIC_VPMOVQB,
|
|
ZYDIS_MNEMONIC_VPMOVQD,
|
|
ZYDIS_MNEMONIC_VPMOVQW,
|
|
ZYDIS_MNEMONIC_VPMOVSDB,
|
|
ZYDIS_MNEMONIC_VPMOVSDW,
|
|
ZYDIS_MNEMONIC_VPMOVSQB,
|
|
ZYDIS_MNEMONIC_VPMOVSQD,
|
|
ZYDIS_MNEMONIC_VPMOVSQW,
|
|
ZYDIS_MNEMONIC_VPMOVSWB,
|
|
ZYDIS_MNEMONIC_VPMOVSXBD,
|
|
ZYDIS_MNEMONIC_VPMOVSXBQ,
|
|
ZYDIS_MNEMONIC_VPMOVSXBW,
|
|
ZYDIS_MNEMONIC_VPMOVSXDQ,
|
|
ZYDIS_MNEMONIC_VPMOVSXWD,
|
|
ZYDIS_MNEMONIC_VPMOVSXWQ,
|
|
ZYDIS_MNEMONIC_VPMOVUSDB,
|
|
ZYDIS_MNEMONIC_VPMOVUSDW,
|
|
ZYDIS_MNEMONIC_VPMOVUSQB,
|
|
ZYDIS_MNEMONIC_VPMOVUSQD,
|
|
ZYDIS_MNEMONIC_VPMOVUSQW,
|
|
ZYDIS_MNEMONIC_VPMOVUSWB,
|
|
ZYDIS_MNEMONIC_VPMOVW2M,
|
|
ZYDIS_MNEMONIC_VPMOVWB,
|
|
ZYDIS_MNEMONIC_VPMOVZXBD,
|
|
ZYDIS_MNEMONIC_VPMOVZXBQ,
|
|
ZYDIS_MNEMONIC_VPMOVZXBW,
|
|
ZYDIS_MNEMONIC_VPMOVZXDQ,
|
|
ZYDIS_MNEMONIC_VPMOVZXWD,
|
|
ZYDIS_MNEMONIC_VPMOVZXWQ,
|
|
ZYDIS_MNEMONIC_VPMULDQ,
|
|
ZYDIS_MNEMONIC_VPMULHD,
|
|
ZYDIS_MNEMONIC_VPMULHRSW,
|
|
ZYDIS_MNEMONIC_VPMULHUD,
|
|
ZYDIS_MNEMONIC_VPMULHUW,
|
|
ZYDIS_MNEMONIC_VPMULHW,
|
|
ZYDIS_MNEMONIC_VPMULLD,
|
|
ZYDIS_MNEMONIC_VPMULLQ,
|
|
ZYDIS_MNEMONIC_VPMULLW,
|
|
ZYDIS_MNEMONIC_VPMULTISHIFTQB,
|
|
ZYDIS_MNEMONIC_VPMULUDQ,
|
|
ZYDIS_MNEMONIC_VPOPCNTB,
|
|
ZYDIS_MNEMONIC_VPOPCNTD,
|
|
ZYDIS_MNEMONIC_VPOPCNTQ,
|
|
ZYDIS_MNEMONIC_VPOPCNTW,
|
|
ZYDIS_MNEMONIC_VPOR,
|
|
ZYDIS_MNEMONIC_VPORD,
|
|
ZYDIS_MNEMONIC_VPORQ,
|
|
ZYDIS_MNEMONIC_VPPERM,
|
|
ZYDIS_MNEMONIC_VPREFETCH0,
|
|
ZYDIS_MNEMONIC_VPREFETCH1,
|
|
ZYDIS_MNEMONIC_VPREFETCH2,
|
|
ZYDIS_MNEMONIC_VPREFETCHE0,
|
|
ZYDIS_MNEMONIC_VPREFETCHE1,
|
|
ZYDIS_MNEMONIC_VPREFETCHE2,
|
|
ZYDIS_MNEMONIC_VPREFETCHENTA,
|
|
ZYDIS_MNEMONIC_VPREFETCHNTA,
|
|
ZYDIS_MNEMONIC_VPROLD,
|
|
ZYDIS_MNEMONIC_VPROLQ,
|
|
ZYDIS_MNEMONIC_VPROLVD,
|
|
ZYDIS_MNEMONIC_VPROLVQ,
|
|
ZYDIS_MNEMONIC_VPRORD,
|
|
ZYDIS_MNEMONIC_VPRORQ,
|
|
ZYDIS_MNEMONIC_VPRORVD,
|
|
ZYDIS_MNEMONIC_VPRORVQ,
|
|
ZYDIS_MNEMONIC_VPROTB,
|
|
ZYDIS_MNEMONIC_VPROTD,
|
|
ZYDIS_MNEMONIC_VPROTQ,
|
|
ZYDIS_MNEMONIC_VPROTW,
|
|
ZYDIS_MNEMONIC_VPSADBW,
|
|
ZYDIS_MNEMONIC_VPSBBD,
|
|
ZYDIS_MNEMONIC_VPSBBRD,
|
|
ZYDIS_MNEMONIC_VPSCATTERDD,
|
|
ZYDIS_MNEMONIC_VPSCATTERDQ,
|
|
ZYDIS_MNEMONIC_VPSCATTERQD,
|
|
ZYDIS_MNEMONIC_VPSCATTERQQ,
|
|
ZYDIS_MNEMONIC_VPSHAB,
|
|
ZYDIS_MNEMONIC_VPSHAD,
|
|
ZYDIS_MNEMONIC_VPSHAQ,
|
|
ZYDIS_MNEMONIC_VPSHAW,
|
|
ZYDIS_MNEMONIC_VPSHLB,
|
|
ZYDIS_MNEMONIC_VPSHLD,
|
|
ZYDIS_MNEMONIC_VPSHLDD,
|
|
ZYDIS_MNEMONIC_VPSHLDQ,
|
|
ZYDIS_MNEMONIC_VPSHLDVD,
|
|
ZYDIS_MNEMONIC_VPSHLDVQ,
|
|
ZYDIS_MNEMONIC_VPSHLDVW,
|
|
ZYDIS_MNEMONIC_VPSHLDW,
|
|
ZYDIS_MNEMONIC_VPSHLQ,
|
|
ZYDIS_MNEMONIC_VPSHLW,
|
|
ZYDIS_MNEMONIC_VPSHRDD,
|
|
ZYDIS_MNEMONIC_VPSHRDQ,
|
|
ZYDIS_MNEMONIC_VPSHRDVD,
|
|
ZYDIS_MNEMONIC_VPSHRDVQ,
|
|
ZYDIS_MNEMONIC_VPSHRDVW,
|
|
ZYDIS_MNEMONIC_VPSHRDW,
|
|
ZYDIS_MNEMONIC_VPSHUFB,
|
|
ZYDIS_MNEMONIC_VPSHUFBITQMB,
|
|
ZYDIS_MNEMONIC_VPSHUFD,
|
|
ZYDIS_MNEMONIC_VPSHUFHW,
|
|
ZYDIS_MNEMONIC_VPSHUFLW,
|
|
ZYDIS_MNEMONIC_VPSIGNB,
|
|
ZYDIS_MNEMONIC_VPSIGND,
|
|
ZYDIS_MNEMONIC_VPSIGNW,
|
|
ZYDIS_MNEMONIC_VPSLLD,
|
|
ZYDIS_MNEMONIC_VPSLLDQ,
|
|
ZYDIS_MNEMONIC_VPSLLQ,
|
|
ZYDIS_MNEMONIC_VPSLLVD,
|
|
ZYDIS_MNEMONIC_VPSLLVQ,
|
|
ZYDIS_MNEMONIC_VPSLLVW,
|
|
ZYDIS_MNEMONIC_VPSLLW,
|
|
ZYDIS_MNEMONIC_VPSRAD,
|
|
ZYDIS_MNEMONIC_VPSRAQ,
|
|
ZYDIS_MNEMONIC_VPSRAVD,
|
|
ZYDIS_MNEMONIC_VPSRAVQ,
|
|
ZYDIS_MNEMONIC_VPSRAVW,
|
|
ZYDIS_MNEMONIC_VPSRAW,
|
|
ZYDIS_MNEMONIC_VPSRLD,
|
|
ZYDIS_MNEMONIC_VPSRLDQ,
|
|
ZYDIS_MNEMONIC_VPSRLQ,
|
|
ZYDIS_MNEMONIC_VPSRLVD,
|
|
ZYDIS_MNEMONIC_VPSRLVQ,
|
|
ZYDIS_MNEMONIC_VPSRLVW,
|
|
ZYDIS_MNEMONIC_VPSRLW,
|
|
ZYDIS_MNEMONIC_VPSUBB,
|
|
ZYDIS_MNEMONIC_VPSUBD,
|
|
ZYDIS_MNEMONIC_VPSUBQ,
|
|
ZYDIS_MNEMONIC_VPSUBRD,
|
|
ZYDIS_MNEMONIC_VPSUBRSETBD,
|
|
ZYDIS_MNEMONIC_VPSUBSB,
|
|
ZYDIS_MNEMONIC_VPSUBSETBD,
|
|
ZYDIS_MNEMONIC_VPSUBSW,
|
|
ZYDIS_MNEMONIC_VPSUBUSB,
|
|
ZYDIS_MNEMONIC_VPSUBUSW,
|
|
ZYDIS_MNEMONIC_VPSUBW,
|
|
ZYDIS_MNEMONIC_VPTERNLOGD,
|
|
ZYDIS_MNEMONIC_VPTERNLOGQ,
|
|
ZYDIS_MNEMONIC_VPTEST,
|
|
ZYDIS_MNEMONIC_VPTESTMB,
|
|
ZYDIS_MNEMONIC_VPTESTMD,
|
|
ZYDIS_MNEMONIC_VPTESTMQ,
|
|
ZYDIS_MNEMONIC_VPTESTMW,
|
|
ZYDIS_MNEMONIC_VPTESTNMB,
|
|
ZYDIS_MNEMONIC_VPTESTNMD,
|
|
ZYDIS_MNEMONIC_VPTESTNMQ,
|
|
ZYDIS_MNEMONIC_VPTESTNMW,
|
|
ZYDIS_MNEMONIC_VPUNPCKHBW,
|
|
ZYDIS_MNEMONIC_VPUNPCKHDQ,
|
|
ZYDIS_MNEMONIC_VPUNPCKHQDQ,
|
|
ZYDIS_MNEMONIC_VPUNPCKHWD,
|
|
ZYDIS_MNEMONIC_VPUNPCKLBW,
|
|
ZYDIS_MNEMONIC_VPUNPCKLDQ,
|
|
ZYDIS_MNEMONIC_VPUNPCKLQDQ,
|
|
ZYDIS_MNEMONIC_VPUNPCKLWD,
|
|
ZYDIS_MNEMONIC_VPXOR,
|
|
ZYDIS_MNEMONIC_VPXORD,
|
|
ZYDIS_MNEMONIC_VPXORQ,
|
|
ZYDIS_MNEMONIC_VRANGEPD,
|
|
ZYDIS_MNEMONIC_VRANGEPS,
|
|
ZYDIS_MNEMONIC_VRANGESD,
|
|
ZYDIS_MNEMONIC_VRANGESS,
|
|
ZYDIS_MNEMONIC_VRCP14PD,
|
|
ZYDIS_MNEMONIC_VRCP14PS,
|
|
ZYDIS_MNEMONIC_VRCP14SD,
|
|
ZYDIS_MNEMONIC_VRCP14SS,
|
|
ZYDIS_MNEMONIC_VRCP23PS,
|
|
ZYDIS_MNEMONIC_VRCP28PD,
|
|
ZYDIS_MNEMONIC_VRCP28PS,
|
|
ZYDIS_MNEMONIC_VRCP28SD,
|
|
ZYDIS_MNEMONIC_VRCP28SS,
|
|
ZYDIS_MNEMONIC_VRCPPH,
|
|
ZYDIS_MNEMONIC_VRCPPS,
|
|
ZYDIS_MNEMONIC_VRCPSH,
|
|
ZYDIS_MNEMONIC_VRCPSS,
|
|
ZYDIS_MNEMONIC_VREDUCEPD,
|
|
ZYDIS_MNEMONIC_VREDUCEPH,
|
|
ZYDIS_MNEMONIC_VREDUCEPS,
|
|
ZYDIS_MNEMONIC_VREDUCESD,
|
|
ZYDIS_MNEMONIC_VREDUCESH,
|
|
ZYDIS_MNEMONIC_VREDUCESS,
|
|
ZYDIS_MNEMONIC_VRNDFXPNTPD,
|
|
ZYDIS_MNEMONIC_VRNDFXPNTPS,
|
|
ZYDIS_MNEMONIC_VRNDSCALEPD,
|
|
ZYDIS_MNEMONIC_VRNDSCALEPH,
|
|
ZYDIS_MNEMONIC_VRNDSCALEPS,
|
|
ZYDIS_MNEMONIC_VRNDSCALESD,
|
|
ZYDIS_MNEMONIC_VRNDSCALESH,
|
|
ZYDIS_MNEMONIC_VRNDSCALESS,
|
|
ZYDIS_MNEMONIC_VROUNDPD,
|
|
ZYDIS_MNEMONIC_VROUNDPS,
|
|
ZYDIS_MNEMONIC_VROUNDSD,
|
|
ZYDIS_MNEMONIC_VROUNDSS,
|
|
ZYDIS_MNEMONIC_VRSQRT14PD,
|
|
ZYDIS_MNEMONIC_VRSQRT14PS,
|
|
ZYDIS_MNEMONIC_VRSQRT14SD,
|
|
ZYDIS_MNEMONIC_VRSQRT14SS,
|
|
ZYDIS_MNEMONIC_VRSQRT23PS,
|
|
ZYDIS_MNEMONIC_VRSQRT28PD,
|
|
ZYDIS_MNEMONIC_VRSQRT28PS,
|
|
ZYDIS_MNEMONIC_VRSQRT28SD,
|
|
ZYDIS_MNEMONIC_VRSQRT28SS,
|
|
ZYDIS_MNEMONIC_VRSQRTPH,
|
|
ZYDIS_MNEMONIC_VRSQRTPS,
|
|
ZYDIS_MNEMONIC_VRSQRTSH,
|
|
ZYDIS_MNEMONIC_VRSQRTSS,
|
|
ZYDIS_MNEMONIC_VSCALEFPD,
|
|
ZYDIS_MNEMONIC_VSCALEFPH,
|
|
ZYDIS_MNEMONIC_VSCALEFPS,
|
|
ZYDIS_MNEMONIC_VSCALEFSD,
|
|
ZYDIS_MNEMONIC_VSCALEFSH,
|
|
ZYDIS_MNEMONIC_VSCALEFSS,
|
|
ZYDIS_MNEMONIC_VSCALEPS,
|
|
ZYDIS_MNEMONIC_VSCATTERDPD,
|
|
ZYDIS_MNEMONIC_VSCATTERDPS,
|
|
ZYDIS_MNEMONIC_VSCATTERPF0DPD,
|
|
ZYDIS_MNEMONIC_VSCATTERPF0DPS,
|
|
ZYDIS_MNEMONIC_VSCATTERPF0HINTDPD,
|
|
ZYDIS_MNEMONIC_VSCATTERPF0HINTDPS,
|
|
ZYDIS_MNEMONIC_VSCATTERPF0QPD,
|
|
ZYDIS_MNEMONIC_VSCATTERPF0QPS,
|
|
ZYDIS_MNEMONIC_VSCATTERPF1DPD,
|
|
ZYDIS_MNEMONIC_VSCATTERPF1DPS,
|
|
ZYDIS_MNEMONIC_VSCATTERPF1QPD,
|
|
ZYDIS_MNEMONIC_VSCATTERPF1QPS,
|
|
ZYDIS_MNEMONIC_VSCATTERQPD,
|
|
ZYDIS_MNEMONIC_VSCATTERQPS,
|
|
ZYDIS_MNEMONIC_VSHUFF32X4,
|
|
ZYDIS_MNEMONIC_VSHUFF64X2,
|
|
ZYDIS_MNEMONIC_VSHUFI32X4,
|
|
ZYDIS_MNEMONIC_VSHUFI64X2,
|
|
ZYDIS_MNEMONIC_VSHUFPD,
|
|
ZYDIS_MNEMONIC_VSHUFPS,
|
|
ZYDIS_MNEMONIC_VSQRTPD,
|
|
ZYDIS_MNEMONIC_VSQRTPH,
|
|
ZYDIS_MNEMONIC_VSQRTPS,
|
|
ZYDIS_MNEMONIC_VSQRTSD,
|
|
ZYDIS_MNEMONIC_VSQRTSH,
|
|
ZYDIS_MNEMONIC_VSQRTSS,
|
|
ZYDIS_MNEMONIC_VSTMXCSR,
|
|
ZYDIS_MNEMONIC_VSUBPD,
|
|
ZYDIS_MNEMONIC_VSUBPH,
|
|
ZYDIS_MNEMONIC_VSUBPS,
|
|
ZYDIS_MNEMONIC_VSUBRPD,
|
|
ZYDIS_MNEMONIC_VSUBRPS,
|
|
ZYDIS_MNEMONIC_VSUBSD,
|
|
ZYDIS_MNEMONIC_VSUBSH,
|
|
ZYDIS_MNEMONIC_VSUBSS,
|
|
ZYDIS_MNEMONIC_VTESTPD,
|
|
ZYDIS_MNEMONIC_VTESTPS,
|
|
ZYDIS_MNEMONIC_VUCOMISD,
|
|
ZYDIS_MNEMONIC_VUCOMISH,
|
|
ZYDIS_MNEMONIC_VUCOMISS,
|
|
ZYDIS_MNEMONIC_VUNPCKHPD,
|
|
ZYDIS_MNEMONIC_VUNPCKHPS,
|
|
ZYDIS_MNEMONIC_VUNPCKLPD,
|
|
ZYDIS_MNEMONIC_VUNPCKLPS,
|
|
ZYDIS_MNEMONIC_VXORPD,
|
|
ZYDIS_MNEMONIC_VXORPS,
|
|
ZYDIS_MNEMONIC_VZEROALL,
|
|
ZYDIS_MNEMONIC_VZEROUPPER,
|
|
ZYDIS_MNEMONIC_WBINVD,
|
|
ZYDIS_MNEMONIC_WRFSBASE,
|
|
ZYDIS_MNEMONIC_WRGSBASE,
|
|
ZYDIS_MNEMONIC_WRMSR,
|
|
ZYDIS_MNEMONIC_WRPKRU,
|
|
ZYDIS_MNEMONIC_WRSSD,
|
|
ZYDIS_MNEMONIC_WRSSQ,
|
|
ZYDIS_MNEMONIC_WRUSSD,
|
|
ZYDIS_MNEMONIC_WRUSSQ,
|
|
ZYDIS_MNEMONIC_XABORT,
|
|
ZYDIS_MNEMONIC_XADD,
|
|
ZYDIS_MNEMONIC_XBEGIN,
|
|
ZYDIS_MNEMONIC_XCHG,
|
|
ZYDIS_MNEMONIC_XCRYPT_CBC,
|
|
ZYDIS_MNEMONIC_XCRYPT_CFB,
|
|
ZYDIS_MNEMONIC_XCRYPT_CTR,
|
|
ZYDIS_MNEMONIC_XCRYPT_ECB,
|
|
ZYDIS_MNEMONIC_XCRYPT_OFB,
|
|
ZYDIS_MNEMONIC_XEND,
|
|
ZYDIS_MNEMONIC_XGETBV,
|
|
ZYDIS_MNEMONIC_XLAT,
|
|
ZYDIS_MNEMONIC_XOR,
|
|
ZYDIS_MNEMONIC_XORPD,
|
|
ZYDIS_MNEMONIC_XORPS,
|
|
ZYDIS_MNEMONIC_XRESLDTRK,
|
|
ZYDIS_MNEMONIC_XRSTOR,
|
|
ZYDIS_MNEMONIC_XRSTOR64,
|
|
ZYDIS_MNEMONIC_XRSTORS,
|
|
ZYDIS_MNEMONIC_XRSTORS64,
|
|
ZYDIS_MNEMONIC_XSAVE,
|
|
ZYDIS_MNEMONIC_XSAVE64,
|
|
ZYDIS_MNEMONIC_XSAVEC,
|
|
ZYDIS_MNEMONIC_XSAVEC64,
|
|
ZYDIS_MNEMONIC_XSAVEOPT,
|
|
ZYDIS_MNEMONIC_XSAVEOPT64,
|
|
ZYDIS_MNEMONIC_XSAVES,
|
|
ZYDIS_MNEMONIC_XSAVES64,
|
|
ZYDIS_MNEMONIC_XSETBV,
|
|
ZYDIS_MNEMONIC_XSHA1,
|
|
ZYDIS_MNEMONIC_XSHA256,
|
|
ZYDIS_MNEMONIC_XSTORE,
|
|
ZYDIS_MNEMONIC_XSUSLDTRK,
|
|
ZYDIS_MNEMONIC_XTEST,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_MNEMONIC_MAX_VALUE = ZYDIS_MNEMONIC_XTEST,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_MNEMONIC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MNEMONIC_MAX_VALUE)
|
|
} ZydisMnemonic;
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* @addtogroup mnemonic Mnemonic
|
|
* Functions for retrieving mnemonic names.
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* Returns the specified instruction mnemonic string.
|
|
*
|
|
* @param mnemonic The mnemonic.
|
|
*
|
|
* @return The instruction mnemonic string or `ZYAN_NULL`, if an invalid mnemonic was passed.
|
|
*/
|
|
ZYDIS_EXPORT const char* ZydisMnemonicGetString(ZydisMnemonic mnemonic);
|
|
|
|
/**
|
|
* Returns the specified instruction mnemonic as `ZydisShortString`.
|
|
*
|
|
* @param mnemonic The mnemonic.
|
|
*
|
|
* @return The instruction mnemonic string or `ZYAN_NULL`, if an invalid mnemonic was passed.
|
|
*
|
|
* The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case.
|
|
*/
|
|
ZYDIS_EXPORT const ZydisShortString* ZydisMnemonicGetStringWrapped(ZydisMnemonic mnemonic);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_MNEMONIC_H */
|
|
|
|
//
|
|
// Header: Zydis/Register.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Utility functions and constants for registers.
|
|
*/
|
|
|
|
#ifndef ZYDIS_REGISTER_H
|
|
#define ZYDIS_REGISTER_H
|
|
|
|
|
|
//
|
|
// Header: Zydis/SharedTypes.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
// - Zydis/Register.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Defines decoder/encoder-shared macros and types.
|
|
*/
|
|
|
|
#ifndef ZYDIS_SHAREDTYPES_H
|
|
#define ZYDIS_SHAREDTYPES_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Constants */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#define ZYDIS_MAX_INSTRUCTION_LENGTH 15
|
|
#define ZYDIS_MAX_OPERAND_COUNT 10 // TODO: Auto generate
|
|
#define ZYDIS_MAX_OPERAND_COUNT_VISIBLE 5 // TODO: Auto generate
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Machine mode */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisMachineMode` enum.
|
|
*/
|
|
typedef enum ZydisMachineMode_
|
|
{
|
|
/**
|
|
* 64 bit mode.
|
|
*/
|
|
ZYDIS_MACHINE_MODE_LONG_64,
|
|
/**
|
|
* 32 bit protected mode.
|
|
*/
|
|
ZYDIS_MACHINE_MODE_LONG_COMPAT_32,
|
|
/**
|
|
* 16 bit protected mode.
|
|
*/
|
|
ZYDIS_MACHINE_MODE_LONG_COMPAT_16,
|
|
/**
|
|
* 32 bit protected mode.
|
|
*/
|
|
ZYDIS_MACHINE_MODE_LEGACY_32,
|
|
/**
|
|
* 16 bit protected mode.
|
|
*/
|
|
ZYDIS_MACHINE_MODE_LEGACY_16,
|
|
/**
|
|
* 16 bit real mode.
|
|
*/
|
|
ZYDIS_MACHINE_MODE_REAL_16,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_MACHINE_MODE_MAX_VALUE = ZYDIS_MACHINE_MODE_REAL_16,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_MACHINE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MACHINE_MODE_MAX_VALUE)
|
|
} ZydisMachineMode;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Stack width */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisStackWidth` enum.
|
|
*/
|
|
typedef enum ZydisStackWidth_
|
|
{
|
|
ZYDIS_STACK_WIDTH_16,
|
|
ZYDIS_STACK_WIDTH_32,
|
|
ZYDIS_STACK_WIDTH_64,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_STACK_WIDTH_MAX_VALUE = ZYDIS_STACK_WIDTH_64,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_STACK_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_STACK_WIDTH_MAX_VALUE)
|
|
} ZydisStackWidth;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Element type */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisElementType` enum.
|
|
*/
|
|
typedef enum ZydisElementType_
|
|
{
|
|
ZYDIS_ELEMENT_TYPE_INVALID,
|
|
/**
|
|
* A struct type.
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_STRUCT,
|
|
/**
|
|
* Unsigned integer value.
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_UINT,
|
|
/**
|
|
* Signed integer value.
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_INT,
|
|
/**
|
|
* 16-bit floating point value (`half`).
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_FLOAT16,
|
|
/**
|
|
* 32-bit floating point value (`single`).
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_FLOAT32,
|
|
/**
|
|
* 64-bit floating point value (`double`).
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_FLOAT64,
|
|
/**
|
|
* 80-bit floating point value (`extended`).
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_FLOAT80,
|
|
/**
|
|
* Binary coded decimal value.
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_LONGBCD,
|
|
/**
|
|
* A condition code (e.g. used by `CMPPD`, `VCMPPD`, ...).
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_CC,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_MAX_VALUE = ZYDIS_ELEMENT_TYPE_CC,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_ELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ELEMENT_TYPE_MAX_VALUE)
|
|
} ZydisElementType;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Element size */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisElementSize` datatype.
|
|
*/
|
|
typedef ZyanU16 ZydisElementSize;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Operand type */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisOperandType` enum.
|
|
*/
|
|
typedef enum ZydisOperandType_
|
|
{
|
|
/**
|
|
* The operand is not used.
|
|
*/
|
|
ZYDIS_OPERAND_TYPE_UNUSED,
|
|
/**
|
|
* The operand is a register operand.
|
|
*/
|
|
ZYDIS_OPERAND_TYPE_REGISTER,
|
|
/**
|
|
* The operand is a memory operand.
|
|
*/
|
|
ZYDIS_OPERAND_TYPE_MEMORY,
|
|
/**
|
|
* The operand is a pointer operand with a segment:offset lvalue.
|
|
*/
|
|
ZYDIS_OPERAND_TYPE_POINTER,
|
|
/**
|
|
* The operand is an immediate operand.
|
|
*/
|
|
ZYDIS_OPERAND_TYPE_IMMEDIATE,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_OPERAND_TYPE_MAX_VALUE = ZYDIS_OPERAND_TYPE_IMMEDIATE,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_OPERAND_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_TYPE_MAX_VALUE)
|
|
} ZydisOperandType;
|
|
|
|
// If asserts are failing here remember to update encoder table generator before fixing asserts
|
|
ZYAN_STATIC_ASSERT(ZYAN_BITS_TO_REPRESENT(
|
|
ZYDIS_OPERAND_TYPE_MAX_VALUE - ZYDIS_OPERAND_TYPE_REGISTER) == 2);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Operand encoding */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisOperandEncoding` enum.
|
|
*/
|
|
typedef enum ZydisOperandEncoding_
|
|
{
|
|
ZYDIS_OPERAND_ENCODING_NONE,
|
|
ZYDIS_OPERAND_ENCODING_MODRM_REG,
|
|
ZYDIS_OPERAND_ENCODING_MODRM_RM,
|
|
ZYDIS_OPERAND_ENCODING_OPCODE,
|
|
ZYDIS_OPERAND_ENCODING_NDSNDD,
|
|
ZYDIS_OPERAND_ENCODING_IS4,
|
|
ZYDIS_OPERAND_ENCODING_MASK,
|
|
ZYDIS_OPERAND_ENCODING_DISP8,
|
|
ZYDIS_OPERAND_ENCODING_DISP16,
|
|
ZYDIS_OPERAND_ENCODING_DISP32,
|
|
ZYDIS_OPERAND_ENCODING_DISP64,
|
|
ZYDIS_OPERAND_ENCODING_DISP16_32_64,
|
|
ZYDIS_OPERAND_ENCODING_DISP32_32_64,
|
|
ZYDIS_OPERAND_ENCODING_DISP16_32_32,
|
|
ZYDIS_OPERAND_ENCODING_UIMM8,
|
|
ZYDIS_OPERAND_ENCODING_UIMM16,
|
|
ZYDIS_OPERAND_ENCODING_UIMM32,
|
|
ZYDIS_OPERAND_ENCODING_UIMM64,
|
|
ZYDIS_OPERAND_ENCODING_UIMM16_32_64,
|
|
ZYDIS_OPERAND_ENCODING_UIMM32_32_64,
|
|
ZYDIS_OPERAND_ENCODING_UIMM16_32_32,
|
|
ZYDIS_OPERAND_ENCODING_SIMM8,
|
|
ZYDIS_OPERAND_ENCODING_SIMM16,
|
|
ZYDIS_OPERAND_ENCODING_SIMM32,
|
|
ZYDIS_OPERAND_ENCODING_SIMM64,
|
|
ZYDIS_OPERAND_ENCODING_SIMM16_32_64,
|
|
ZYDIS_OPERAND_ENCODING_SIMM32_32_64,
|
|
ZYDIS_OPERAND_ENCODING_SIMM16_32_32,
|
|
ZYDIS_OPERAND_ENCODING_JIMM8,
|
|
ZYDIS_OPERAND_ENCODING_JIMM16,
|
|
ZYDIS_OPERAND_ENCODING_JIMM32,
|
|
ZYDIS_OPERAND_ENCODING_JIMM64,
|
|
ZYDIS_OPERAND_ENCODING_JIMM16_32_64,
|
|
ZYDIS_OPERAND_ENCODING_JIMM32_32_64,
|
|
ZYDIS_OPERAND_ENCODING_JIMM16_32_32,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_OPERAND_ENCODING_MAX_VALUE = ZYDIS_OPERAND_ENCODING_JIMM16_32_32,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_OPERAND_ENCODING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_ENCODING_MAX_VALUE)
|
|
} ZydisOperandEncoding;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Operand visibility */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisOperandVisibility` enum.
|
|
*/
|
|
typedef enum ZydisOperandVisibility_
|
|
{
|
|
ZYDIS_OPERAND_VISIBILITY_INVALID,
|
|
/**
|
|
* The operand is explicitly encoded in the instruction.
|
|
*/
|
|
ZYDIS_OPERAND_VISIBILITY_EXPLICIT,
|
|
/**
|
|
* The operand is part of the opcode, but listed as an operand.
|
|
*/
|
|
ZYDIS_OPERAND_VISIBILITY_IMPLICIT,
|
|
/**
|
|
* The operand is part of the opcode, and not typically listed as an operand.
|
|
*/
|
|
ZYDIS_OPERAND_VISIBILITY_HIDDEN,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_OPERAND_VISIBILITY_MAX_VALUE = ZYDIS_OPERAND_VISIBILITY_HIDDEN,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS =
|
|
ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_VISIBILITY_MAX_VALUE)
|
|
} ZydisOperandVisibility;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Operand action */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisOperandAction` enum.
|
|
*/
|
|
typedef enum ZydisOperandAction_
|
|
{
|
|
/* ------------------------------------------------------------------------------------------ */
|
|
/* Elemental actions */
|
|
/* ------------------------------------------------------------------------------------------ */
|
|
|
|
/**
|
|
* The operand is read by the instruction.
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_READ = 0x01,
|
|
/**
|
|
* The operand is written by the instruction (must write).
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_WRITE = 0x02,
|
|
/**
|
|
* The operand is conditionally read by the instruction.
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_CONDREAD = 0x04,
|
|
/**
|
|
* The operand is conditionally written by the instruction (may write).
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_CONDWRITE = 0x08,
|
|
|
|
/* ------------------------------------------------------------------------------------------ */
|
|
/* Combined actions */
|
|
/* ------------------------------------------------------------------------------------------ */
|
|
|
|
/**
|
|
* The operand is read (must read) and written by the instruction (must write).
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_READWRITE = ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_WRITE,
|
|
/**
|
|
* The operand is conditionally read (may read) and conditionally written by
|
|
* the instruction (may write).
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_CONDREAD_CONDWRITE =
|
|
ZYDIS_OPERAND_ACTION_CONDREAD | ZYDIS_OPERAND_ACTION_CONDWRITE,
|
|
/**
|
|
* The operand is read (must read) and conditionally written by the
|
|
* instruction (may write).
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_READ_CONDWRITE =
|
|
ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_CONDWRITE,
|
|
/**
|
|
* The operand is written (must write) and conditionally read by the
|
|
* instruction (may read).
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_CONDREAD_WRITE =
|
|
ZYDIS_OPERAND_ACTION_CONDREAD | ZYDIS_OPERAND_ACTION_WRITE,
|
|
|
|
/**
|
|
* Mask combining all reading access flags.
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_MASK_READ = ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_CONDREAD,
|
|
/**
|
|
* Mask combining all writing access flags.
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_MASK_WRITE = ZYDIS_OPERAND_ACTION_WRITE | ZYDIS_OPERAND_ACTION_CONDWRITE,
|
|
|
|
/* ------------------------------------------------------------------------------------------ */
|
|
|
|
/**
|
|
* The minimum number of bits required to represent all values of this bitset.
|
|
*/
|
|
ZYDIS_OPERAND_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_ACTION_CONDWRITE)
|
|
} ZydisOperandAction;
|
|
|
|
/**
|
|
* Defines the `ZydisOperandActions` data-type.
|
|
*/
|
|
typedef ZyanU8 ZydisOperandActions;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Instruction encoding */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisInstructionEncoding` enum.
|
|
*/
|
|
typedef enum ZydisInstructionEncoding_
|
|
{
|
|
/**
|
|
* The instruction uses the legacy encoding.
|
|
*/
|
|
ZYDIS_INSTRUCTION_ENCODING_LEGACY,
|
|
/**
|
|
* The instruction uses the AMD 3DNow-encoding.
|
|
*/
|
|
ZYDIS_INSTRUCTION_ENCODING_3DNOW,
|
|
/**
|
|
* The instruction uses the AMD XOP-encoding.
|
|
*/
|
|
ZYDIS_INSTRUCTION_ENCODING_XOP,
|
|
/**
|
|
* The instruction uses the VEX-encoding.
|
|
*/
|
|
ZYDIS_INSTRUCTION_ENCODING_VEX,
|
|
/**
|
|
* The instruction uses the EVEX-encoding.
|
|
*/
|
|
ZYDIS_INSTRUCTION_ENCODING_EVEX,
|
|
/**
|
|
* The instruction uses the MVEX-encoding.
|
|
*/
|
|
ZYDIS_INSTRUCTION_ENCODING_MVEX,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE = ZYDIS_INSTRUCTION_ENCODING_MVEX,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_INSTRUCTION_ENCODING_REQUIRED_BITS =
|
|
ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE)
|
|
} ZydisInstructionEncoding;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Opcode map */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisOpcodeMap` enum.
|
|
*/
|
|
typedef enum ZydisOpcodeMap_
|
|
{
|
|
ZYDIS_OPCODE_MAP_DEFAULT,
|
|
ZYDIS_OPCODE_MAP_0F,
|
|
ZYDIS_OPCODE_MAP_0F38,
|
|
ZYDIS_OPCODE_MAP_0F3A,
|
|
ZYDIS_OPCODE_MAP_MAP4, // not used
|
|
ZYDIS_OPCODE_MAP_MAP5,
|
|
ZYDIS_OPCODE_MAP_MAP6,
|
|
ZYDIS_OPCODE_MAP_MAP7, // not used
|
|
ZYDIS_OPCODE_MAP_0F0F,
|
|
ZYDIS_OPCODE_MAP_XOP8,
|
|
ZYDIS_OPCODE_MAP_XOP9,
|
|
ZYDIS_OPCODE_MAP_XOPA,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_OPCODE_MAP_MAX_VALUE = ZYDIS_OPCODE_MAP_XOPA,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_OPCODE_MAP_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPCODE_MAP_MAX_VALUE)
|
|
} ZydisOpcodeMap;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Instruction attributes */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* @defgroup instruction_attributes Instruction attributes
|
|
*
|
|
* Constants describing various properties of an instruction. Used in the
|
|
* @ref ZydisDecodedInstruction.attributes and @ref ZydisEncoderRequest.prefixes fields.
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* Defines the `ZydisInstructionAttributes` data-type.
|
|
*/
|
|
typedef ZyanU64 ZydisInstructionAttributes;
|
|
|
|
/**
|
|
* The instruction has the `ModRM` byte.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_MODRM (1ULL << 0)
|
|
/**
|
|
* The instruction has the `SIB` byte.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_SIB (1ULL << 1)
|
|
/**
|
|
* The instruction has the `REX` prefix.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_REX (1ULL << 2)
|
|
/**
|
|
* The instruction has the `XOP` prefix.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_XOP (1ULL << 3)
|
|
/**
|
|
* The instruction has the `VEX` prefix.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_VEX (1ULL << 4)
|
|
/**
|
|
* The instruction has the `EVEX` prefix.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_EVEX (1ULL << 5)
|
|
/**
|
|
* The instruction has the `MVEX` prefix.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_MVEX (1ULL << 6)
|
|
/**
|
|
* The instruction has one or more operands with position-relative offsets.
|
|
*/
|
|
#define ZYDIS_ATTRIB_IS_RELATIVE (1ULL << 7)
|
|
/**
|
|
* The instruction is privileged.
|
|
*
|
|
* Privileged instructions are any instructions that require a current ring level below 3.
|
|
*/
|
|
#define ZYDIS_ATTRIB_IS_PRIVILEGED (1ULL << 8)
|
|
/**
|
|
* The instruction accesses one or more CPU-flags.
|
|
*/
|
|
#define ZYDIS_ATTRIB_CPUFLAG_ACCESS (1ULL << 9)
|
|
/**
|
|
* The instruction may conditionally read the general CPU state.
|
|
*/
|
|
#define ZYDIS_ATTRIB_CPU_STATE_CR (1ULL << 10)
|
|
/**
|
|
* The instruction may conditionally write the general CPU state.
|
|
*/
|
|
#define ZYDIS_ATTRIB_CPU_STATE_CW (1ULL << 11)
|
|
/**
|
|
* The instruction may conditionally read the FPU state (X87, MMX).
|
|
*/
|
|
#define ZYDIS_ATTRIB_FPU_STATE_CR (1ULL << 12)
|
|
/**
|
|
* The instruction may conditionally write the FPU state (X87, MMX).
|
|
*/
|
|
#define ZYDIS_ATTRIB_FPU_STATE_CW (1ULL << 13)
|
|
/**
|
|
* The instruction may conditionally read the XMM state (AVX, AVX2, AVX-512).
|
|
*/
|
|
#define ZYDIS_ATTRIB_XMM_STATE_CR (1ULL << 14)
|
|
/**
|
|
* The instruction may conditionally write the XMM state (AVX, AVX2, AVX-512).
|
|
*/
|
|
#define ZYDIS_ATTRIB_XMM_STATE_CW (1ULL << 15)
|
|
/**
|
|
* The instruction accepts the `LOCK` prefix (`0xF0`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_LOCK (1ULL << 16)
|
|
/**
|
|
* The instruction accepts the `REP` prefix (`0xF3`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_REP (1ULL << 17)
|
|
/**
|
|
* The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_REPE (1ULL << 18)
|
|
/**
|
|
* The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_REPZ ZYDIS_ATTRIB_ACCEPTS_REPE
|
|
/**
|
|
* The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_REPNE (1ULL << 19)
|
|
/**
|
|
* The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_REPNZ ZYDIS_ATTRIB_ACCEPTS_REPNE
|
|
/**
|
|
* The instruction accepts the `BND` prefix (`0xF2`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_BND (1ULL << 20)
|
|
/**
|
|
* The instruction accepts the `XACQUIRE` prefix (`0xF2`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_XACQUIRE (1ULL << 21)
|
|
/**
|
|
* The instruction accepts the `XRELEASE` prefix (`0xF3`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_XRELEASE (1ULL << 22)
|
|
/**
|
|
* The instruction accepts the `XACQUIRE`/`XRELEASE` prefixes (`0xF2`, `0xF3`)
|
|
* without the `LOCK` prefix (`0x0F`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK (1ULL << 23)
|
|
/**
|
|
* The instruction accepts branch hints (0x2E, 0x3E).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS (1ULL << 24)
|
|
/**
|
|
* The instruction accepts the `CET` `no-track` prefix (`0x3E`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_NOTRACK (1ULL << 25)
|
|
/**
|
|
* The instruction accepts segment prefixes (`0x2E`, `0x36`, `0x3E`, `0x26`,
|
|
* `0x64`, `0x65`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_ACCEPTS_SEGMENT (1ULL << 26)
|
|
/**
|
|
* The instruction has the `LOCK` prefix (`0xF0`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_LOCK (1ULL << 27)
|
|
/**
|
|
* The instruction has the `REP` prefix (`0xF3`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_REP (1ULL << 28)
|
|
/**
|
|
* The instruction has the `REPE`/`REPZ` prefix (`0xF3`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_REPE (1ULL << 29)
|
|
/**
|
|
* The instruction has the `REPE`/`REPZ` prefix (`0xF3`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_REPZ ZYDIS_ATTRIB_HAS_REPE
|
|
/**
|
|
* The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_REPNE (1ULL << 30)
|
|
/**
|
|
* The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_REPNZ ZYDIS_ATTRIB_HAS_REPNE
|
|
/**
|
|
* The instruction has the `BND` prefix (`0xF2`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_BND (1ULL << 31)
|
|
/**
|
|
* The instruction has the `XACQUIRE` prefix (`0xF2`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_XACQUIRE (1ULL << 32)
|
|
/**
|
|
* The instruction has the `XRELEASE` prefix (`0xF3`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_XRELEASE (1ULL << 33)
|
|
/**
|
|
* The instruction has the branch-not-taken hint (`0x2E`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN (1ULL << 34)
|
|
/**
|
|
* The instruction has the branch-taken hint (`0x3E`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_BRANCH_TAKEN (1ULL << 35)
|
|
/**
|
|
* The instruction has the `CET` `no-track` prefix (`0x3E`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_NOTRACK (1ULL << 36)
|
|
/**
|
|
* The instruction has the `CS` segment modifier (`0x2E`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_SEGMENT_CS (1ULL << 37)
|
|
/**
|
|
* The instruction has the `SS` segment modifier (`0x36`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_SEGMENT_SS (1ULL << 38)
|
|
/**
|
|
* The instruction has the `DS` segment modifier (`0x3E`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_SEGMENT_DS (1ULL << 39)
|
|
/**
|
|
* The instruction has the `ES` segment modifier (`0x26`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_SEGMENT_ES (1ULL << 40)
|
|
/**
|
|
* The instruction has the `FS` segment modifier (`0x64`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_SEGMENT_FS (1ULL << 41)
|
|
/**
|
|
* The instruction has the `GS` segment modifier (`0x65`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_SEGMENT_GS (1ULL << 42)
|
|
/**
|
|
* The instruction has a segment modifier.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_SEGMENT (ZYDIS_ATTRIB_HAS_SEGMENT_CS | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_SS | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_DS | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_ES | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_FS | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_GS)
|
|
/**
|
|
* The instruction has the operand-size override prefix (`0x66`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_OPERANDSIZE (1ULL << 43) // TODO: rename
|
|
/**
|
|
* The instruction has the address-size override prefix (`0x67`).
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_ADDRESSSIZE (1ULL << 44) // TODO: rename
|
|
/**
|
|
* The instruction has the `EVEX.b` bit set.
|
|
*
|
|
* This attribute is mainly used by the encoder.
|
|
*/
|
|
#define ZYDIS_ATTRIB_HAS_EVEX_B (1ULL << 45) // TODO: rename
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_SHAREDTYPES_H */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Registers */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
|
|
//
|
|
// Header: Zydis/Generated/EnumRegister.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/DecoderTypes.h
|
|
// - Zydis/Register.h
|
|
//
|
|
|
|
/**
|
|
* Defines the `ZydisRegister` enum.
|
|
*/
|
|
typedef enum ZydisRegister_
|
|
{
|
|
ZYDIS_REGISTER_NONE,
|
|
|
|
// General purpose registers 8-bit
|
|
ZYDIS_REGISTER_AL,
|
|
ZYDIS_REGISTER_CL,
|
|
ZYDIS_REGISTER_DL,
|
|
ZYDIS_REGISTER_BL,
|
|
ZYDIS_REGISTER_AH,
|
|
ZYDIS_REGISTER_CH,
|
|
ZYDIS_REGISTER_DH,
|
|
ZYDIS_REGISTER_BH,
|
|
ZYDIS_REGISTER_SPL,
|
|
ZYDIS_REGISTER_BPL,
|
|
ZYDIS_REGISTER_SIL,
|
|
ZYDIS_REGISTER_DIL,
|
|
ZYDIS_REGISTER_R8B,
|
|
ZYDIS_REGISTER_R9B,
|
|
ZYDIS_REGISTER_R10B,
|
|
ZYDIS_REGISTER_R11B,
|
|
ZYDIS_REGISTER_R12B,
|
|
ZYDIS_REGISTER_R13B,
|
|
ZYDIS_REGISTER_R14B,
|
|
ZYDIS_REGISTER_R15B,
|
|
|
|
// General purpose registers 16-bit
|
|
ZYDIS_REGISTER_AX,
|
|
ZYDIS_REGISTER_CX,
|
|
ZYDIS_REGISTER_DX,
|
|
ZYDIS_REGISTER_BX,
|
|
ZYDIS_REGISTER_SP,
|
|
ZYDIS_REGISTER_BP,
|
|
ZYDIS_REGISTER_SI,
|
|
ZYDIS_REGISTER_DI,
|
|
ZYDIS_REGISTER_R8W,
|
|
ZYDIS_REGISTER_R9W,
|
|
ZYDIS_REGISTER_R10W,
|
|
ZYDIS_REGISTER_R11W,
|
|
ZYDIS_REGISTER_R12W,
|
|
ZYDIS_REGISTER_R13W,
|
|
ZYDIS_REGISTER_R14W,
|
|
ZYDIS_REGISTER_R15W,
|
|
|
|
// General purpose registers 32-bit
|
|
ZYDIS_REGISTER_EAX,
|
|
ZYDIS_REGISTER_ECX,
|
|
ZYDIS_REGISTER_EDX,
|
|
ZYDIS_REGISTER_EBX,
|
|
ZYDIS_REGISTER_ESP,
|
|
ZYDIS_REGISTER_EBP,
|
|
ZYDIS_REGISTER_ESI,
|
|
ZYDIS_REGISTER_EDI,
|
|
ZYDIS_REGISTER_R8D,
|
|
ZYDIS_REGISTER_R9D,
|
|
ZYDIS_REGISTER_R10D,
|
|
ZYDIS_REGISTER_R11D,
|
|
ZYDIS_REGISTER_R12D,
|
|
ZYDIS_REGISTER_R13D,
|
|
ZYDIS_REGISTER_R14D,
|
|
ZYDIS_REGISTER_R15D,
|
|
|
|
// General purpose registers 64-bit
|
|
ZYDIS_REGISTER_RAX,
|
|
ZYDIS_REGISTER_RCX,
|
|
ZYDIS_REGISTER_RDX,
|
|
ZYDIS_REGISTER_RBX,
|
|
ZYDIS_REGISTER_RSP,
|
|
ZYDIS_REGISTER_RBP,
|
|
ZYDIS_REGISTER_RSI,
|
|
ZYDIS_REGISTER_RDI,
|
|
ZYDIS_REGISTER_R8,
|
|
ZYDIS_REGISTER_R9,
|
|
ZYDIS_REGISTER_R10,
|
|
ZYDIS_REGISTER_R11,
|
|
ZYDIS_REGISTER_R12,
|
|
ZYDIS_REGISTER_R13,
|
|
ZYDIS_REGISTER_R14,
|
|
ZYDIS_REGISTER_R15,
|
|
|
|
// Floating point legacy registers
|
|
ZYDIS_REGISTER_ST0,
|
|
ZYDIS_REGISTER_ST1,
|
|
ZYDIS_REGISTER_ST2,
|
|
ZYDIS_REGISTER_ST3,
|
|
ZYDIS_REGISTER_ST4,
|
|
ZYDIS_REGISTER_ST5,
|
|
ZYDIS_REGISTER_ST6,
|
|
ZYDIS_REGISTER_ST7,
|
|
ZYDIS_REGISTER_X87CONTROL,
|
|
ZYDIS_REGISTER_X87STATUS,
|
|
ZYDIS_REGISTER_X87TAG,
|
|
|
|
// Floating point multimedia registers
|
|
ZYDIS_REGISTER_MM0,
|
|
ZYDIS_REGISTER_MM1,
|
|
ZYDIS_REGISTER_MM2,
|
|
ZYDIS_REGISTER_MM3,
|
|
ZYDIS_REGISTER_MM4,
|
|
ZYDIS_REGISTER_MM5,
|
|
ZYDIS_REGISTER_MM6,
|
|
ZYDIS_REGISTER_MM7,
|
|
|
|
// Floating point vector registers 128-bit
|
|
ZYDIS_REGISTER_XMM0,
|
|
ZYDIS_REGISTER_XMM1,
|
|
ZYDIS_REGISTER_XMM2,
|
|
ZYDIS_REGISTER_XMM3,
|
|
ZYDIS_REGISTER_XMM4,
|
|
ZYDIS_REGISTER_XMM5,
|
|
ZYDIS_REGISTER_XMM6,
|
|
ZYDIS_REGISTER_XMM7,
|
|
ZYDIS_REGISTER_XMM8,
|
|
ZYDIS_REGISTER_XMM9,
|
|
ZYDIS_REGISTER_XMM10,
|
|
ZYDIS_REGISTER_XMM11,
|
|
ZYDIS_REGISTER_XMM12,
|
|
ZYDIS_REGISTER_XMM13,
|
|
ZYDIS_REGISTER_XMM14,
|
|
ZYDIS_REGISTER_XMM15,
|
|
ZYDIS_REGISTER_XMM16,
|
|
ZYDIS_REGISTER_XMM17,
|
|
ZYDIS_REGISTER_XMM18,
|
|
ZYDIS_REGISTER_XMM19,
|
|
ZYDIS_REGISTER_XMM20,
|
|
ZYDIS_REGISTER_XMM21,
|
|
ZYDIS_REGISTER_XMM22,
|
|
ZYDIS_REGISTER_XMM23,
|
|
ZYDIS_REGISTER_XMM24,
|
|
ZYDIS_REGISTER_XMM25,
|
|
ZYDIS_REGISTER_XMM26,
|
|
ZYDIS_REGISTER_XMM27,
|
|
ZYDIS_REGISTER_XMM28,
|
|
ZYDIS_REGISTER_XMM29,
|
|
ZYDIS_REGISTER_XMM30,
|
|
ZYDIS_REGISTER_XMM31,
|
|
|
|
// Floating point vector registers 256-bit
|
|
ZYDIS_REGISTER_YMM0,
|
|
ZYDIS_REGISTER_YMM1,
|
|
ZYDIS_REGISTER_YMM2,
|
|
ZYDIS_REGISTER_YMM3,
|
|
ZYDIS_REGISTER_YMM4,
|
|
ZYDIS_REGISTER_YMM5,
|
|
ZYDIS_REGISTER_YMM6,
|
|
ZYDIS_REGISTER_YMM7,
|
|
ZYDIS_REGISTER_YMM8,
|
|
ZYDIS_REGISTER_YMM9,
|
|
ZYDIS_REGISTER_YMM10,
|
|
ZYDIS_REGISTER_YMM11,
|
|
ZYDIS_REGISTER_YMM12,
|
|
ZYDIS_REGISTER_YMM13,
|
|
ZYDIS_REGISTER_YMM14,
|
|
ZYDIS_REGISTER_YMM15,
|
|
ZYDIS_REGISTER_YMM16,
|
|
ZYDIS_REGISTER_YMM17,
|
|
ZYDIS_REGISTER_YMM18,
|
|
ZYDIS_REGISTER_YMM19,
|
|
ZYDIS_REGISTER_YMM20,
|
|
ZYDIS_REGISTER_YMM21,
|
|
ZYDIS_REGISTER_YMM22,
|
|
ZYDIS_REGISTER_YMM23,
|
|
ZYDIS_REGISTER_YMM24,
|
|
ZYDIS_REGISTER_YMM25,
|
|
ZYDIS_REGISTER_YMM26,
|
|
ZYDIS_REGISTER_YMM27,
|
|
ZYDIS_REGISTER_YMM28,
|
|
ZYDIS_REGISTER_YMM29,
|
|
ZYDIS_REGISTER_YMM30,
|
|
ZYDIS_REGISTER_YMM31,
|
|
|
|
// Floating point vector registers 512-bit
|
|
ZYDIS_REGISTER_ZMM0,
|
|
ZYDIS_REGISTER_ZMM1,
|
|
ZYDIS_REGISTER_ZMM2,
|
|
ZYDIS_REGISTER_ZMM3,
|
|
ZYDIS_REGISTER_ZMM4,
|
|
ZYDIS_REGISTER_ZMM5,
|
|
ZYDIS_REGISTER_ZMM6,
|
|
ZYDIS_REGISTER_ZMM7,
|
|
ZYDIS_REGISTER_ZMM8,
|
|
ZYDIS_REGISTER_ZMM9,
|
|
ZYDIS_REGISTER_ZMM10,
|
|
ZYDIS_REGISTER_ZMM11,
|
|
ZYDIS_REGISTER_ZMM12,
|
|
ZYDIS_REGISTER_ZMM13,
|
|
ZYDIS_REGISTER_ZMM14,
|
|
ZYDIS_REGISTER_ZMM15,
|
|
ZYDIS_REGISTER_ZMM16,
|
|
ZYDIS_REGISTER_ZMM17,
|
|
ZYDIS_REGISTER_ZMM18,
|
|
ZYDIS_REGISTER_ZMM19,
|
|
ZYDIS_REGISTER_ZMM20,
|
|
ZYDIS_REGISTER_ZMM21,
|
|
ZYDIS_REGISTER_ZMM22,
|
|
ZYDIS_REGISTER_ZMM23,
|
|
ZYDIS_REGISTER_ZMM24,
|
|
ZYDIS_REGISTER_ZMM25,
|
|
ZYDIS_REGISTER_ZMM26,
|
|
ZYDIS_REGISTER_ZMM27,
|
|
ZYDIS_REGISTER_ZMM28,
|
|
ZYDIS_REGISTER_ZMM29,
|
|
ZYDIS_REGISTER_ZMM30,
|
|
ZYDIS_REGISTER_ZMM31,
|
|
|
|
// Matrix registers
|
|
ZYDIS_REGISTER_TMM0,
|
|
ZYDIS_REGISTER_TMM1,
|
|
ZYDIS_REGISTER_TMM2,
|
|
ZYDIS_REGISTER_TMM3,
|
|
ZYDIS_REGISTER_TMM4,
|
|
ZYDIS_REGISTER_TMM5,
|
|
ZYDIS_REGISTER_TMM6,
|
|
ZYDIS_REGISTER_TMM7,
|
|
|
|
// Flags registers
|
|
ZYDIS_REGISTER_FLAGS,
|
|
ZYDIS_REGISTER_EFLAGS,
|
|
ZYDIS_REGISTER_RFLAGS,
|
|
|
|
// Instruction-pointer registers
|
|
ZYDIS_REGISTER_IP,
|
|
ZYDIS_REGISTER_EIP,
|
|
ZYDIS_REGISTER_RIP,
|
|
|
|
// Segment registers
|
|
ZYDIS_REGISTER_ES,
|
|
ZYDIS_REGISTER_CS,
|
|
ZYDIS_REGISTER_SS,
|
|
ZYDIS_REGISTER_DS,
|
|
ZYDIS_REGISTER_FS,
|
|
ZYDIS_REGISTER_GS,
|
|
|
|
// Table registers
|
|
ZYDIS_REGISTER_GDTR,
|
|
ZYDIS_REGISTER_LDTR,
|
|
ZYDIS_REGISTER_IDTR,
|
|
ZYDIS_REGISTER_TR,
|
|
|
|
// Test registers
|
|
ZYDIS_REGISTER_TR0,
|
|
ZYDIS_REGISTER_TR1,
|
|
ZYDIS_REGISTER_TR2,
|
|
ZYDIS_REGISTER_TR3,
|
|
ZYDIS_REGISTER_TR4,
|
|
ZYDIS_REGISTER_TR5,
|
|
ZYDIS_REGISTER_TR6,
|
|
ZYDIS_REGISTER_TR7,
|
|
|
|
// Control registers
|
|
ZYDIS_REGISTER_CR0,
|
|
ZYDIS_REGISTER_CR1,
|
|
ZYDIS_REGISTER_CR2,
|
|
ZYDIS_REGISTER_CR3,
|
|
ZYDIS_REGISTER_CR4,
|
|
ZYDIS_REGISTER_CR5,
|
|
ZYDIS_REGISTER_CR6,
|
|
ZYDIS_REGISTER_CR7,
|
|
ZYDIS_REGISTER_CR8,
|
|
ZYDIS_REGISTER_CR9,
|
|
ZYDIS_REGISTER_CR10,
|
|
ZYDIS_REGISTER_CR11,
|
|
ZYDIS_REGISTER_CR12,
|
|
ZYDIS_REGISTER_CR13,
|
|
ZYDIS_REGISTER_CR14,
|
|
ZYDIS_REGISTER_CR15,
|
|
|
|
// Debug registers
|
|
ZYDIS_REGISTER_DR0,
|
|
ZYDIS_REGISTER_DR1,
|
|
ZYDIS_REGISTER_DR2,
|
|
ZYDIS_REGISTER_DR3,
|
|
ZYDIS_REGISTER_DR4,
|
|
ZYDIS_REGISTER_DR5,
|
|
ZYDIS_REGISTER_DR6,
|
|
ZYDIS_REGISTER_DR7,
|
|
ZYDIS_REGISTER_DR8,
|
|
ZYDIS_REGISTER_DR9,
|
|
ZYDIS_REGISTER_DR10,
|
|
ZYDIS_REGISTER_DR11,
|
|
ZYDIS_REGISTER_DR12,
|
|
ZYDIS_REGISTER_DR13,
|
|
ZYDIS_REGISTER_DR14,
|
|
ZYDIS_REGISTER_DR15,
|
|
|
|
// Mask registers
|
|
ZYDIS_REGISTER_K0,
|
|
ZYDIS_REGISTER_K1,
|
|
ZYDIS_REGISTER_K2,
|
|
ZYDIS_REGISTER_K3,
|
|
ZYDIS_REGISTER_K4,
|
|
ZYDIS_REGISTER_K5,
|
|
ZYDIS_REGISTER_K6,
|
|
ZYDIS_REGISTER_K7,
|
|
|
|
// Bound registers
|
|
ZYDIS_REGISTER_BND0,
|
|
ZYDIS_REGISTER_BND1,
|
|
ZYDIS_REGISTER_BND2,
|
|
ZYDIS_REGISTER_BND3,
|
|
ZYDIS_REGISTER_BNDCFG,
|
|
ZYDIS_REGISTER_BNDSTATUS,
|
|
|
|
// Uncategorized
|
|
ZYDIS_REGISTER_MXCSR,
|
|
ZYDIS_REGISTER_PKRU,
|
|
ZYDIS_REGISTER_XCR0,
|
|
ZYDIS_REGISTER_UIF,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_REGISTER_MAX_VALUE = ZYDIS_REGISTER_UIF,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_REGISTER_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGISTER_MAX_VALUE)
|
|
} ZydisRegister;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Register kinds */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisRegisterKind` enum.
|
|
*
|
|
* Please note that this enum does not contain a matching entry for all values of the
|
|
* `ZydisRegister` enum, but only for those registers where it makes sense to logically group them
|
|
* for decoding/encoding purposes.
|
|
*
|
|
* These are mainly the registers that can be identified by an id within their corresponding
|
|
* register-class.
|
|
*/
|
|
typedef enum ZydisRegisterKind_
|
|
{
|
|
ZYDIS_REGKIND_INVALID,
|
|
ZYDIS_REGKIND_GPR,
|
|
ZYDIS_REGKIND_X87,
|
|
ZYDIS_REGKIND_MMX,
|
|
ZYDIS_REGKIND_VR,
|
|
ZYDIS_REGKIND_TMM,
|
|
ZYDIS_REGKIND_SEGMENT,
|
|
ZYDIS_REGKIND_TEST,
|
|
ZYDIS_REGKIND_CONTROL,
|
|
ZYDIS_REGKIND_DEBUG,
|
|
ZYDIS_REGKIND_MASK,
|
|
ZYDIS_REGKIND_BOUND,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_REGKIND_MAX_VALUE = ZYDIS_REGKIND_BOUND,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_REGKIND_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGKIND_MAX_VALUE)
|
|
} ZydisRegisterKind;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Register classes */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisRegisterClass` enum.
|
|
*
|
|
* Please note that this enum does not contain a matching entry for all values of the
|
|
* `ZydisRegister` enum, but only for those registers where it makes sense to logically group them
|
|
* for decoding/encoding purposes.
|
|
*
|
|
* These are mainly the registers that can be identified by an id within their corresponding
|
|
* register-class. The `IP` and `FLAGS` values are exceptions to this rule.
|
|
*/
|
|
typedef enum ZydisRegisterClass_
|
|
{
|
|
ZYDIS_REGCLASS_INVALID,
|
|
/**
|
|
* 8-bit general-purpose registers.
|
|
*/
|
|
ZYDIS_REGCLASS_GPR8,
|
|
/**
|
|
* 16-bit general-purpose registers.
|
|
*/
|
|
ZYDIS_REGCLASS_GPR16,
|
|
/**
|
|
* 32-bit general-purpose registers.
|
|
*/
|
|
ZYDIS_REGCLASS_GPR32,
|
|
/**
|
|
* 64-bit general-purpose registers.
|
|
*/
|
|
ZYDIS_REGCLASS_GPR64,
|
|
/**
|
|
* Floating point legacy registers.
|
|
*/
|
|
ZYDIS_REGCLASS_X87,
|
|
/**
|
|
* Floating point multimedia registers.
|
|
*/
|
|
ZYDIS_REGCLASS_MMX,
|
|
/**
|
|
* 128-bit vector registers.
|
|
*/
|
|
ZYDIS_REGCLASS_XMM,
|
|
/**
|
|
* 256-bit vector registers.
|
|
*/
|
|
ZYDIS_REGCLASS_YMM,
|
|
/**
|
|
* 512-bit vector registers.
|
|
*/
|
|
ZYDIS_REGCLASS_ZMM,
|
|
/**
|
|
* Matrix registers.
|
|
*/
|
|
ZYDIS_REGCLASS_TMM,
|
|
/*
|
|
* Flags registers.
|
|
*/
|
|
ZYDIS_REGCLASS_FLAGS,
|
|
/**
|
|
* Instruction-pointer registers.
|
|
*/
|
|
ZYDIS_REGCLASS_IP,
|
|
/**
|
|
* Segment registers.
|
|
*/
|
|
ZYDIS_REGCLASS_SEGMENT,
|
|
/**
|
|
* Table registers.
|
|
*/
|
|
ZYDIS_REGCLASS_TABLE,
|
|
/**
|
|
* Test registers.
|
|
*/
|
|
ZYDIS_REGCLASS_TEST,
|
|
/**
|
|
* Control registers.
|
|
*/
|
|
ZYDIS_REGCLASS_CONTROL,
|
|
/**
|
|
* Debug registers.
|
|
*/
|
|
ZYDIS_REGCLASS_DEBUG,
|
|
/**
|
|
* Mask registers.
|
|
*/
|
|
ZYDIS_REGCLASS_MASK,
|
|
/**
|
|
* Bound registers.
|
|
*/
|
|
ZYDIS_REGCLASS_BOUND,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_REGCLASS_MAX_VALUE = ZYDIS_REGCLASS_BOUND,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_REGCLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGCLASS_MAX_VALUE)
|
|
} ZydisRegisterClass;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Register width */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisRegisterWidth` data-type.
|
|
*/
|
|
typedef ZyanU16 ZydisRegisterWidth;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Register context */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisRegisterContext` struct.
|
|
*/
|
|
typedef struct ZydisRegisterContext_
|
|
{
|
|
/**
|
|
* The values stored in the register context.
|
|
*/
|
|
ZyanU64 values[ZYDIS_REGISTER_MAX_VALUE + 1];
|
|
} ZydisRegisterContext;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* @addtogroup register Register
|
|
* Functions allowing retrieval of information about registers.
|
|
* @{
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Register */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the register specified by the `register_class` and `id` tuple.
|
|
*
|
|
* @param register_class The register class.
|
|
* @param id The register id.
|
|
*
|
|
* @return The register specified by the `register_class` and `id` tuple or `ZYDIS_REGISTER_NONE`,
|
|
* if an invalid parameter was passed.
|
|
*/
|
|
ZYDIS_EXPORT ZydisRegister ZydisRegisterEncode(ZydisRegisterClass register_class, ZyanU8 id);
|
|
|
|
/**
|
|
* Returns the id of the specified register.
|
|
*
|
|
* @param reg The register.
|
|
*
|
|
* @return The id of the specified register, or -1 if an invalid parameter was passed.
|
|
*/
|
|
ZYDIS_EXPORT ZyanI8 ZydisRegisterGetId(ZydisRegister reg);
|
|
|
|
/**
|
|
* Returns the register-class of the specified register.
|
|
*
|
|
* @param reg The register.
|
|
*
|
|
* @return The register-class of the specified register.
|
|
*/
|
|
ZYDIS_EXPORT ZydisRegisterClass ZydisRegisterGetClass(ZydisRegister reg);
|
|
|
|
/**
|
|
* Returns the width of the specified register.
|
|
*
|
|
* @param mode The active machine mode.
|
|
* @param reg The register.
|
|
*
|
|
* @return The width of the specified register, or `ZYDIS_REGISTER_NONE` if the register is
|
|
* invalid for the active machine-mode.
|
|
*/
|
|
ZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterGetWidth(ZydisMachineMode mode, ZydisRegister reg);
|
|
|
|
/**
|
|
* Returns the largest enclosing register of the given register.
|
|
*
|
|
* @param mode The active machine mode.
|
|
* @param reg The register.
|
|
*
|
|
* @return The largest enclosing register of the given register, or `ZYDIS_REGISTER_NONE` if the
|
|
* register is invalid for the active machine-mode or does not have an enclosing-register.
|
|
*/
|
|
ZYDIS_EXPORT ZydisRegister ZydisRegisterGetLargestEnclosing(ZydisMachineMode mode,
|
|
ZydisRegister reg);
|
|
|
|
/**
|
|
* Returns the specified register string.
|
|
*
|
|
* @param reg The register.
|
|
*
|
|
* @return The register string or `ZYAN_NULL`, if an invalid register was passed.
|
|
*/
|
|
ZYDIS_EXPORT const char* ZydisRegisterGetString(ZydisRegister reg);
|
|
|
|
/**
|
|
* Returns the specified register string as `ZydisShortString`.
|
|
*
|
|
* @param reg The register.
|
|
*
|
|
* @return The register string or `ZYAN_NULL`, if an invalid register was passed.
|
|
*
|
|
* The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case.
|
|
*/
|
|
ZYDIS_EXPORT const ZydisShortString* ZydisRegisterGetStringWrapped(ZydisRegister reg);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Register class */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the width of the specified register-class.
|
|
*
|
|
* @param mode The active machine mode.
|
|
* @param register_class The register class.
|
|
*
|
|
* @return The width of the specified register.
|
|
*/
|
|
ZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterClassGetWidth(ZydisMachineMode mode,
|
|
ZydisRegisterClass register_class);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_REGISTER_H */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Decoded operand */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Operand attributes */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisOperandAttributes` data-type.
|
|
*/
|
|
typedef ZyanU8 ZydisOperandAttributes;
|
|
|
|
/**
|
|
* The operand is a `MULTISOURCE4` register operand.
|
|
*
|
|
* This is a special register operand-type used by `4FMAPS` instructions where the given register
|
|
* points to the first register of a register range (4 registers in total).
|
|
*
|
|
* Example: ZMM3 -> [ZMM3..ZMM6]
|
|
*/
|
|
#define ZYDIS_OATTRIB_IS_MULTISOURCE4 0x01 // (1 << 0)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Memory type */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisMemoryOperandType` enum.
|
|
*/
|
|
typedef enum ZydisMemoryOperandType_
|
|
{
|
|
ZYDIS_MEMOP_TYPE_INVALID,
|
|
/**
|
|
* Normal memory operand.
|
|
*/
|
|
ZYDIS_MEMOP_TYPE_MEM,
|
|
/**
|
|
* The memory operand is only used for address-generation. No real memory-access is
|
|
* caused.
|
|
*/
|
|
ZYDIS_MEMOP_TYPE_AGEN,
|
|
/**
|
|
* A memory operand using `SIB` addressing form, where the index register is not used
|
|
* in address calculation and scale is ignored. No real memory-access is caused.
|
|
*/
|
|
ZYDIS_MEMOP_TYPE_MIB,
|
|
/**
|
|
* A vector `SIB` memory addressing operand (`VSIB`).
|
|
*/
|
|
ZYDIS_MEMOP_TYPE_VSIB,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_MEMOP_TYPE_MAX_VALUE = ZYDIS_MEMOP_TYPE_VSIB,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_MEMOP_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MEMOP_TYPE_MAX_VALUE)
|
|
} ZydisMemoryOperandType;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Decoded operand */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Extended info for register-operands.
|
|
*/
|
|
typedef struct ZydisDecodedOperandReg_
|
|
{
|
|
/**
|
|
* The register value.
|
|
*/
|
|
ZydisRegister value;
|
|
} ZydisDecodedOperandReg;
|
|
|
|
/**
|
|
* Extended info for memory-operands.
|
|
*/
|
|
typedef struct ZydisDecodedOperandMem_
|
|
{
|
|
/**
|
|
* The type of the memory operand.
|
|
*/
|
|
ZydisMemoryOperandType type;
|
|
/**
|
|
* The segment register.
|
|
*/
|
|
ZydisRegister segment;
|
|
/**
|
|
* The base register.
|
|
*/
|
|
ZydisRegister base;
|
|
/**
|
|
* The index register.
|
|
*/
|
|
ZydisRegister index;
|
|
/**
|
|
* The scale factor.
|
|
*/
|
|
ZyanU8 scale;
|
|
/**
|
|
* Extended info for memory-operands with displacement.
|
|
*/
|
|
struct ZydisDecodedOperandMemDisp_
|
|
{
|
|
/**
|
|
* Signals, if the displacement value is used.
|
|
*/
|
|
ZyanBool has_displacement;
|
|
/**
|
|
* The displacement value
|
|
*/
|
|
ZyanI64 value;
|
|
} disp;
|
|
} ZydisDecodedOperandMem;
|
|
|
|
/**
|
|
* Extended info for pointer-operands.
|
|
*/
|
|
typedef struct ZydisDecodedOperandPtr_
|
|
{
|
|
ZyanU16 segment;
|
|
ZyanU32 offset;
|
|
} ZydisDecodedOperandPtr;
|
|
|
|
/**
|
|
* Extended info for immediate-operands.
|
|
*/
|
|
typedef struct ZydisDecodedOperandImm_
|
|
{
|
|
/**
|
|
* Signals, if the immediate value is signed.
|
|
*/
|
|
ZyanBool is_signed;
|
|
/**
|
|
* Signals, if the immediate value contains a relative offset. You can use
|
|
* `ZydisCalcAbsoluteAddress` to determine the absolute address value.
|
|
*/
|
|
ZyanBool is_relative;
|
|
/**
|
|
* The immediate value.
|
|
*/
|
|
union ZydisDecodedOperandImmValue_
|
|
{
|
|
ZyanU64 u;
|
|
ZyanI64 s;
|
|
} value;
|
|
} ZydisDecodedOperandImm;
|
|
|
|
/**
|
|
* Defines the `ZydisDecodedOperand` struct.
|
|
*/
|
|
typedef struct ZydisDecodedOperand_
|
|
{
|
|
/**
|
|
* The operand-id.
|
|
*/
|
|
ZyanU8 id;
|
|
/**
|
|
* The visibility of the operand.
|
|
*/
|
|
ZydisOperandVisibility visibility;
|
|
/**
|
|
* The operand-actions.
|
|
*/
|
|
ZydisOperandActions actions;
|
|
/**
|
|
* The operand-encoding.
|
|
*/
|
|
ZydisOperandEncoding encoding;
|
|
/**
|
|
* The logical size of the operand (in bits).
|
|
*/
|
|
ZyanU16 size;
|
|
/**
|
|
* The element-type.
|
|
*/
|
|
ZydisElementType element_type;
|
|
/**
|
|
* The size of a single element.
|
|
*/
|
|
ZydisElementSize element_size;
|
|
/**
|
|
* The number of elements.
|
|
*/
|
|
ZyanU16 element_count;
|
|
/*
|
|
* Additional operand attributes.
|
|
*/
|
|
ZydisOperandAttributes attributes;
|
|
/**
|
|
* The type of the operand.
|
|
*/
|
|
ZydisOperandType type;
|
|
/*
|
|
* Operand type specific information.
|
|
*
|
|
* The enabled union variant is determined by the `type` field.
|
|
*/
|
|
union
|
|
{
|
|
ZydisDecodedOperandReg reg;
|
|
ZydisDecodedOperandMem mem;
|
|
ZydisDecodedOperandPtr ptr;
|
|
ZydisDecodedOperandImm imm;
|
|
};
|
|
} ZydisDecodedOperand;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Decoded instruction */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* CPU/FPU flags */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisAccessedFlagsMask` data-type.
|
|
*/
|
|
typedef ZyanU32 ZydisAccessedFlagsMask;
|
|
|
|
/**
|
|
* @defgroup decoder_cpu_flags CPU flags
|
|
* @ingroup decoder
|
|
*
|
|
* Constants used for testing CPU flags accessed by an instruction.
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* Carry flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_CF (1ul << 0)
|
|
/**
|
|
* Parity flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_PF (1ul << 2)
|
|
/**
|
|
* Adjust flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_AF (1ul << 4)
|
|
/**
|
|
* Zero flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_ZF (1ul << 6)
|
|
/**
|
|
* Sign flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_SF (1ul << 7)
|
|
/**
|
|
* Trap flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_TF (1ul << 8)
|
|
/**
|
|
* Interrupt enable flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_IF (1ul << 9)
|
|
/**
|
|
* Direction flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_DF (1ul << 10)
|
|
/**
|
|
* Overflow flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_OF (1ul << 11)
|
|
/**
|
|
* I/O privilege level flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_IOPL (1ul << 12)
|
|
/**
|
|
* Nested task flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_NT (1ul << 14)
|
|
/**
|
|
* Resume flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_RF (1ul << 16)
|
|
/**
|
|
* Virtual 8086 mode flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_VM (1ul << 17)
|
|
/**
|
|
* Alignment check.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_AC (1ul << 18)
|
|
/**
|
|
* Virtual interrupt flag.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_VIF (1ul << 19)
|
|
/**
|
|
* Virtual interrupt pending.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_VIP (1ul << 20)
|
|
/**
|
|
* Able to use CPUID instruction.
|
|
*/
|
|
#define ZYDIS_CPUFLAG_ID (1ul << 21)
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @defgroup decoder_fpu_flags FPU flags
|
|
* @ingroup decoder
|
|
*
|
|
* Constants used for testing FPU flags accessed by an instruction.
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* FPU condition-code flag 0.
|
|
*/
|
|
#define ZYDIS_FPUFLAG_C0 (1ul << 0)
|
|
/**
|
|
* FPU condition-code flag 1.
|
|
*/
|
|
#define ZYDIS_FPUFLAG_C1 (1ul << 1)
|
|
/**
|
|
* FPU condition-code flag 2.
|
|
*/
|
|
#define ZYDIS_FPUFLAG_C2 (1ul << 2)
|
|
/**
|
|
* FPU condition-code flag 3.
|
|
*/
|
|
#define ZYDIS_FPUFLAG_C3 (1ul << 3)
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/*
|
|
* Information about CPU/FPU flags accessed by the instruction.
|
|
*/
|
|
typedef struct ZydisAccessedFlags_
|
|
{
|
|
/*
|
|
* As mask containing the flags `TESTED` by the instruction.
|
|
*/
|
|
ZydisAccessedFlagsMask tested;
|
|
/*
|
|
* As mask containing the flags `MODIFIED` by the instruction.
|
|
*/
|
|
ZydisAccessedFlagsMask modified;
|
|
/*
|
|
* As mask containing the flags `SET_0` by the instruction.
|
|
*/
|
|
ZydisAccessedFlagsMask set_0;
|
|
/*
|
|
* As mask containing the flags `SET_1` by the instruction.
|
|
*/
|
|
ZydisAccessedFlagsMask set_1;
|
|
/*
|
|
* As mask containing the flags `UNDEFINED` by the instruction.
|
|
*/
|
|
ZydisAccessedFlagsMask undefined;
|
|
} ZydisAccessedFlags;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Branch types */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisBranchType` enum.
|
|
*/
|
|
typedef enum ZydisBranchType_
|
|
{
|
|
/**
|
|
* The instruction is not a branch instruction.
|
|
*/
|
|
ZYDIS_BRANCH_TYPE_NONE,
|
|
/**
|
|
* The instruction is a short (8-bit) branch instruction.
|
|
*/
|
|
ZYDIS_BRANCH_TYPE_SHORT,
|
|
/**
|
|
* The instruction is a near (16-bit or 32-bit) branch instruction.
|
|
*/
|
|
ZYDIS_BRANCH_TYPE_NEAR,
|
|
/**
|
|
* The instruction is a far (inter-segment) branch instruction.
|
|
*/
|
|
ZYDIS_BRANCH_TYPE_FAR,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_BRANCH_TYPE_MAX_VALUE = ZYDIS_BRANCH_TYPE_FAR,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_BRANCH_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_TYPE_MAX_VALUE)
|
|
} ZydisBranchType;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* SSE/AVX exception-class */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisExceptionClass` enum.
|
|
*/
|
|
typedef enum ZydisExceptionClass_
|
|
{
|
|
ZYDIS_EXCEPTION_CLASS_NONE,
|
|
// TODO: FP Exceptions
|
|
ZYDIS_EXCEPTION_CLASS_SSE1,
|
|
ZYDIS_EXCEPTION_CLASS_SSE2,
|
|
ZYDIS_EXCEPTION_CLASS_SSE3,
|
|
ZYDIS_EXCEPTION_CLASS_SSE4,
|
|
ZYDIS_EXCEPTION_CLASS_SSE5,
|
|
ZYDIS_EXCEPTION_CLASS_SSE7,
|
|
ZYDIS_EXCEPTION_CLASS_AVX1,
|
|
ZYDIS_EXCEPTION_CLASS_AVX2,
|
|
ZYDIS_EXCEPTION_CLASS_AVX3,
|
|
ZYDIS_EXCEPTION_CLASS_AVX4,
|
|
ZYDIS_EXCEPTION_CLASS_AVX5,
|
|
ZYDIS_EXCEPTION_CLASS_AVX6,
|
|
ZYDIS_EXCEPTION_CLASS_AVX7,
|
|
ZYDIS_EXCEPTION_CLASS_AVX8,
|
|
ZYDIS_EXCEPTION_CLASS_AVX11,
|
|
ZYDIS_EXCEPTION_CLASS_AVX12,
|
|
ZYDIS_EXCEPTION_CLASS_E1,
|
|
ZYDIS_EXCEPTION_CLASS_E1NF,
|
|
ZYDIS_EXCEPTION_CLASS_E2,
|
|
ZYDIS_EXCEPTION_CLASS_E2NF,
|
|
ZYDIS_EXCEPTION_CLASS_E3,
|
|
ZYDIS_EXCEPTION_CLASS_E3NF,
|
|
ZYDIS_EXCEPTION_CLASS_E4,
|
|
ZYDIS_EXCEPTION_CLASS_E4NF,
|
|
ZYDIS_EXCEPTION_CLASS_E5,
|
|
ZYDIS_EXCEPTION_CLASS_E5NF,
|
|
ZYDIS_EXCEPTION_CLASS_E6,
|
|
ZYDIS_EXCEPTION_CLASS_E6NF,
|
|
ZYDIS_EXCEPTION_CLASS_E7NM,
|
|
ZYDIS_EXCEPTION_CLASS_E7NM128,
|
|
ZYDIS_EXCEPTION_CLASS_E9NF,
|
|
ZYDIS_EXCEPTION_CLASS_E10,
|
|
ZYDIS_EXCEPTION_CLASS_E10NF,
|
|
ZYDIS_EXCEPTION_CLASS_E11,
|
|
ZYDIS_EXCEPTION_CLASS_E11NF,
|
|
ZYDIS_EXCEPTION_CLASS_E12,
|
|
ZYDIS_EXCEPTION_CLASS_E12NP,
|
|
ZYDIS_EXCEPTION_CLASS_K20,
|
|
ZYDIS_EXCEPTION_CLASS_K21,
|
|
ZYDIS_EXCEPTION_CLASS_AMXE1,
|
|
ZYDIS_EXCEPTION_CLASS_AMXE2,
|
|
ZYDIS_EXCEPTION_CLASS_AMXE3,
|
|
ZYDIS_EXCEPTION_CLASS_AMXE4,
|
|
ZYDIS_EXCEPTION_CLASS_AMXE5,
|
|
ZYDIS_EXCEPTION_CLASS_AMXE6,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_EXCEPTION_CLASS_MAX_VALUE = ZYDIS_EXCEPTION_CLASS_AMXE6,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EXCEPTION_CLASS_MAX_VALUE)
|
|
} ZydisExceptionClass;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* AVX mask mode */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisMaskMode` enum.
|
|
*/
|
|
typedef enum ZydisMaskMode_
|
|
{
|
|
ZYDIS_MASK_MODE_INVALID,
|
|
/**
|
|
* Masking is disabled for the current instruction (`K0` register is used).
|
|
*/
|
|
ZYDIS_MASK_MODE_DISABLED,
|
|
/**
|
|
* The embedded mask register is used as a merge-mask.
|
|
*/
|
|
ZYDIS_MASK_MODE_MERGING,
|
|
/**
|
|
* The embedded mask register is used as a zero-mask.
|
|
*/
|
|
ZYDIS_MASK_MODE_ZEROING,
|
|
/**
|
|
* The embedded mask register is used as a control-mask (element selector).
|
|
*/
|
|
ZYDIS_MASK_MODE_CONTROL,
|
|
/**
|
|
* The embedded mask register is used as a zeroing control-mask (element selector).
|
|
*/
|
|
ZYDIS_MASK_MODE_CONTROL_ZEROING,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_MASK_MODE_MAX_VALUE = ZYDIS_MASK_MODE_CONTROL_ZEROING,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_MASK_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_MODE_MAX_VALUE)
|
|
} ZydisMaskMode;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* AVX broadcast-mode */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisBroadcastMode` enum.
|
|
*/
|
|
typedef enum ZydisBroadcastMode_
|
|
{
|
|
ZYDIS_BROADCAST_MODE_INVALID,
|
|
ZYDIS_BROADCAST_MODE_1_TO_2,
|
|
ZYDIS_BROADCAST_MODE_1_TO_4,
|
|
ZYDIS_BROADCAST_MODE_1_TO_8,
|
|
ZYDIS_BROADCAST_MODE_1_TO_16,
|
|
ZYDIS_BROADCAST_MODE_1_TO_32,
|
|
ZYDIS_BROADCAST_MODE_1_TO_64,
|
|
ZYDIS_BROADCAST_MODE_2_TO_4,
|
|
ZYDIS_BROADCAST_MODE_2_TO_8,
|
|
ZYDIS_BROADCAST_MODE_2_TO_16,
|
|
ZYDIS_BROADCAST_MODE_4_TO_8,
|
|
ZYDIS_BROADCAST_MODE_4_TO_16,
|
|
ZYDIS_BROADCAST_MODE_8_TO_16,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_BROADCAST_MODE_MAX_VALUE = ZYDIS_BROADCAST_MODE_8_TO_16,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_BROADCAST_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BROADCAST_MODE_MAX_VALUE)
|
|
} ZydisBroadcastMode;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* AVX rounding-mode */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisRoundingMode` enum.
|
|
*/
|
|
typedef enum ZydisRoundingMode_
|
|
{
|
|
ZYDIS_ROUNDING_MODE_INVALID,
|
|
/**
|
|
* Round to nearest.
|
|
*/
|
|
ZYDIS_ROUNDING_MODE_RN,
|
|
/**
|
|
* Round down.
|
|
*/
|
|
ZYDIS_ROUNDING_MODE_RD,
|
|
/**
|
|
* Round up.
|
|
*/
|
|
ZYDIS_ROUNDING_MODE_RU,
|
|
/**
|
|
* Round towards zero.
|
|
*/
|
|
ZYDIS_ROUNDING_MODE_RZ,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_ROUNDING_MODE_MAX_VALUE = ZYDIS_ROUNDING_MODE_RZ,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_ROUNDING_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ROUNDING_MODE_MAX_VALUE)
|
|
} ZydisRoundingMode;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* KNC swizzle-mode */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisSwizzleMode` enum.
|
|
*/
|
|
typedef enum ZydisSwizzleMode_
|
|
{
|
|
ZYDIS_SWIZZLE_MODE_INVALID,
|
|
ZYDIS_SWIZZLE_MODE_DCBA,
|
|
ZYDIS_SWIZZLE_MODE_CDAB,
|
|
ZYDIS_SWIZZLE_MODE_BADC,
|
|
ZYDIS_SWIZZLE_MODE_DACB,
|
|
ZYDIS_SWIZZLE_MODE_AAAA,
|
|
ZYDIS_SWIZZLE_MODE_BBBB,
|
|
ZYDIS_SWIZZLE_MODE_CCCC,
|
|
ZYDIS_SWIZZLE_MODE_DDDD,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_SWIZZLE_MODE_MAX_VALUE = ZYDIS_SWIZZLE_MODE_DDDD,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_SWIZZLE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SWIZZLE_MODE_MAX_VALUE)
|
|
} ZydisSwizzleMode;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* KNC conversion-mode */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisConversionMode` enum.
|
|
*/
|
|
typedef enum ZydisConversionMode_
|
|
{
|
|
ZYDIS_CONVERSION_MODE_INVALID,
|
|
ZYDIS_CONVERSION_MODE_FLOAT16,
|
|
ZYDIS_CONVERSION_MODE_SINT8,
|
|
ZYDIS_CONVERSION_MODE_UINT8,
|
|
ZYDIS_CONVERSION_MODE_SINT16,
|
|
ZYDIS_CONVERSION_MODE_UINT16,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_CONVERSION_MODE_MAX_VALUE = ZYDIS_CONVERSION_MODE_UINT16,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_CONVERSION_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CONVERSION_MODE_MAX_VALUE)
|
|
} ZydisConversionMode;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Legacy prefix type */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisPrefixType` enum.
|
|
*/
|
|
typedef enum ZydisPrefixType_
|
|
{
|
|
/**
|
|
* The prefix is ignored by the instruction.
|
|
*
|
|
* This applies to all prefixes that are not accepted by the instruction in general or the
|
|
* ones that are overwritten by a prefix of the same group closer to the instruction opcode.
|
|
*/
|
|
ZYDIS_PREFIX_TYPE_IGNORED,
|
|
/**
|
|
* The prefix is effectively used by the instruction.
|
|
*/
|
|
ZYDIS_PREFIX_TYPE_EFFECTIVE,
|
|
/**
|
|
* The prefix is used as a mandatory prefix.
|
|
*
|
|
* A mandatory prefix is interpreted as an opcode extension and has no further effect on the
|
|
* instruction.
|
|
*/
|
|
ZYDIS_PREFIX_TYPE_MANDATORY,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_PREFIX_TYPE_MAX_VALUE = ZYDIS_PREFIX_TYPE_MANDATORY,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_PREFIX_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PREFIX_TYPE_MAX_VALUE)
|
|
} ZydisPrefixType;
|
|
|
|
// TODO: Check effective for 66/67 prefixes (currently defaults to EFFECTIVE)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Decoded instruction */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Detailed info about the `REX` prefix.
|
|
*/
|
|
typedef struct ZydisDecodedInstructionRawRex_
|
|
{
|
|
/**
|
|
* 64-bit operand-size promotion.
|
|
*/
|
|
ZyanU8 W;
|
|
/**
|
|
* Extension of the `ModRM.reg` field.
|
|
*/
|
|
ZyanU8 R;
|
|
/**
|
|
* Extension of the `SIB.index` field.
|
|
*/
|
|
ZyanU8 X;
|
|
/**
|
|
* Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field.
|
|
*/
|
|
ZyanU8 B;
|
|
/**
|
|
* The offset of the effective `REX` byte, relative to the beginning of the
|
|
* instruction, in bytes.
|
|
*
|
|
* This offset always points to the "effective" `REX` prefix (the one closest to the
|
|
* instruction opcode), if multiple `REX` prefixes are present.
|
|
*
|
|
* Note that the `REX` byte can be the first byte of the instruction, which would lead
|
|
* to an offset of `0`. Please refer to the instruction attributes to check for the
|
|
* presence of the `REX` prefix.
|
|
*/
|
|
ZyanU8 offset;
|
|
} ZydisDecodedInstructionRawRex;
|
|
|
|
/**
|
|
* Detailed info about the `XOP` prefix.
|
|
*/
|
|
typedef struct ZydisDecodedInstructionRawXop_
|
|
{
|
|
/**
|
|
* Extension of the `ModRM.reg` field (inverted).
|
|
*/
|
|
ZyanU8 R;
|
|
/**
|
|
* Extension of the `SIB.index` field (inverted).
|
|
*/
|
|
ZyanU8 X;
|
|
/**
|
|
* Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted).
|
|
*/
|
|
ZyanU8 B;
|
|
/**
|
|
* Opcode-map specifier.
|
|
*/
|
|
ZyanU8 m_mmmm;
|
|
/**
|
|
* 64-bit operand-size promotion or opcode-extension.
|
|
*/
|
|
ZyanU8 W;
|
|
/**
|
|
* `NDS`/`NDD` (non-destructive-source/destination) register
|
|
* specifier (inverted).
|
|
*/
|
|
ZyanU8 vvvv;
|
|
/**
|
|
* Vector-length specifier.
|
|
*/
|
|
ZyanU8 L;
|
|
/**
|
|
* Compressed legacy prefix.
|
|
*/
|
|
ZyanU8 pp;
|
|
/**
|
|
* The offset of the first xop byte, relative to the beginning of
|
|
* the instruction, in bytes.
|
|
*/
|
|
ZyanU8 offset;
|
|
} ZydisDecodedInstructionRawXop;
|
|
|
|
/**
|
|
* Detailed info about the `VEX` prefix.
|
|
*/
|
|
typedef struct ZydisDecodedInstructionRawVex_
|
|
{
|
|
/**
|
|
* Extension of the `ModRM.reg` field (inverted).
|
|
*/
|
|
ZyanU8 R;
|
|
/**
|
|
* Extension of the `SIB.index` field (inverted).
|
|
*/
|
|
ZyanU8 X;
|
|
/**
|
|
* Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted).
|
|
*/
|
|
ZyanU8 B;
|
|
/**
|
|
* Opcode-map specifier.
|
|
*/
|
|
ZyanU8 m_mmmm;
|
|
/**
|
|
* 64-bit operand-size promotion or opcode-extension.
|
|
*/
|
|
ZyanU8 W;
|
|
/**
|
|
* `NDS`/`NDD` (non-destructive-source/destination) register specifier
|
|
* (inverted).
|
|
*/
|
|
ZyanU8 vvvv;
|
|
/**
|
|
* Vector-length specifier.
|
|
*/
|
|
ZyanU8 L;
|
|
/**
|
|
* Compressed legacy prefix.
|
|
*/
|
|
ZyanU8 pp;
|
|
/**
|
|
* The offset of the first `VEX` byte, relative to the beginning of the instruction, in
|
|
* bytes.
|
|
*/
|
|
ZyanU8 offset;
|
|
/**
|
|
* The size of the `VEX` prefix, in bytes.
|
|
*/
|
|
ZyanU8 size;
|
|
} ZydisDecodedInstructionRawVex;
|
|
|
|
/**
|
|
* Detailed info about the `EVEX` prefix.
|
|
*/
|
|
typedef struct ZydisDecodedInstructionRawEvex
|
|
{
|
|
/**
|
|
* Extension of the `ModRM.reg` field (inverted).
|
|
*/
|
|
ZyanU8 R;
|
|
/**
|
|
* Extension of the `SIB.index/vidx` field (inverted).
|
|
*/
|
|
ZyanU8 X;
|
|
/**
|
|
* Extension of the `ModRM.rm` or `SIB.base` field (inverted).
|
|
*/
|
|
ZyanU8 B;
|
|
/**
|
|
* High-16 register specifier modifier (inverted).
|
|
*/
|
|
ZyanU8 R2;
|
|
/**
|
|
* Opcode-map specifier.
|
|
*/
|
|
ZyanU8 mmm;
|
|
/**
|
|
* 64-bit operand-size promotion or opcode-extension.
|
|
*/
|
|
ZyanU8 W;
|
|
/**
|
|
* `NDS`/`NDD` (non-destructive-source/destination) register specifier
|
|
* (inverted).
|
|
*/
|
|
ZyanU8 vvvv;
|
|
/**
|
|
* Compressed legacy prefix.
|
|
*/
|
|
ZyanU8 pp;
|
|
/**
|
|
* Zeroing/Merging.
|
|
*/
|
|
ZyanU8 z;
|
|
/**
|
|
* Vector-length specifier or rounding-control (most significant bit).
|
|
*/
|
|
ZyanU8 L2;
|
|
/**
|
|
* Vector-length specifier or rounding-control (least significant bit).
|
|
*/
|
|
ZyanU8 L;
|
|
/**
|
|
* Broadcast/RC/SAE context.
|
|
*/
|
|
ZyanU8 b;
|
|
/**
|
|
* High-16 `NDS`/`VIDX` register specifier.
|
|
*/
|
|
ZyanU8 V2;
|
|
/**
|
|
* Embedded opmask register specifier.
|
|
*/
|
|
ZyanU8 aaa;
|
|
/**
|
|
* The offset of the first evex byte, relative to the beginning of the
|
|
* instruction, in bytes.
|
|
*/
|
|
ZyanU8 offset;
|
|
} ZydisDecodedInstructionRawEvex;
|
|
|
|
/**
|
|
* Detailed info about the `MVEX` prefix.
|
|
*/
|
|
typedef struct ZydisDecodedInstructionRawMvex_
|
|
{
|
|
/**
|
|
* Extension of the `ModRM.reg` field (inverted).
|
|
*/
|
|
ZyanU8 R;
|
|
/**
|
|
* Extension of the `SIB.index/vidx` field (inverted).
|
|
*/
|
|
ZyanU8 X;
|
|
/**
|
|
* Extension of the `ModRM.rm` or `SIB.base` field (inverted).
|
|
*/
|
|
ZyanU8 B;
|
|
/**
|
|
* High-16 register specifier modifier (inverted).
|
|
*/
|
|
ZyanU8 R2;
|
|
/**
|
|
* Opcode-map specifier.
|
|
*/
|
|
ZyanU8 mmmm;
|
|
/**
|
|
* 64-bit operand-size promotion or opcode-extension.
|
|
*/
|
|
ZyanU8 W;
|
|
/**
|
|
* `NDS`/`NDD` (non-destructive-source/destination) register specifier
|
|
* (inverted).
|
|
*/
|
|
ZyanU8 vvvv;
|
|
/**
|
|
* Compressed legacy prefix.
|
|
*/
|
|
ZyanU8 pp;
|
|
/**
|
|
* Non-temporal/eviction hint.
|
|
*/
|
|
ZyanU8 E;
|
|
/**
|
|
* Swizzle/broadcast/up-convert/down-convert/static-rounding controls.
|
|
*/
|
|
ZyanU8 SSS;
|
|
/**
|
|
* High-16 `NDS`/`VIDX` register specifier.
|
|
*/
|
|
ZyanU8 V2;
|
|
/**
|
|
* Embedded opmask register specifier.
|
|
*/
|
|
ZyanU8 kkk;
|
|
/**
|
|
* The offset of the first mvex byte, relative to the beginning of the
|
|
* instruction, in bytes.
|
|
*/
|
|
ZyanU8 offset;
|
|
} ZydisDecodedInstructionRawMvex;
|
|
|
|
/**
|
|
* Extended info for `AVX` instructions.
|
|
*/
|
|
typedef struct ZydisDecodedInstructionAvx_
|
|
{
|
|
/**
|
|
* The `AVX` vector-length.
|
|
*/
|
|
ZyanU16 vector_length;
|
|
/**
|
|
* Info about the embedded writemask-register (`AVX-512` and `KNC` only).
|
|
*/
|
|
struct ZydisDecodedInstructionAvxMask_
|
|
{
|
|
/**
|
|
* The masking mode.
|
|
*/
|
|
ZydisMaskMode mode;
|
|
/**
|
|
* The mask register.
|
|
*/
|
|
ZydisRegister reg;
|
|
} mask;
|
|
/**
|
|
* Contains info about the `AVX` broadcast.
|
|
*/
|
|
struct ZydisDecodedInstructionAvxBroadcast_
|
|
{
|
|
/**
|
|
* Signals, if the broadcast is a static broadcast.
|
|
*
|
|
* This is the case for instructions with inbuilt broadcast functionality, which is
|
|
* always active and not controlled by the `EVEX/MVEX.RC` bits.
|
|
*/
|
|
ZyanBool is_static;
|
|
/**
|
|
* The `AVX` broadcast-mode.
|
|
*/
|
|
ZydisBroadcastMode mode;
|
|
} broadcast;
|
|
/**
|
|
* Contains info about the `AVX` rounding.
|
|
*/
|
|
struct ZydisDecodedInstructionAvxRounding_
|
|
{
|
|
/**
|
|
* The `AVX` rounding-mode.
|
|
*/
|
|
ZydisRoundingMode mode;
|
|
} rounding;
|
|
/**
|
|
* Contains info about the `AVX` register-swizzle (`KNC` only).
|
|
*/
|
|
struct ZydisDecodedInstructionAvxSwizzle_
|
|
{
|
|
/**
|
|
* The `AVX` register-swizzle mode.
|
|
*/
|
|
ZydisSwizzleMode mode;
|
|
} swizzle;
|
|
/**
|
|
* Contains info about the `AVX` data-conversion (`KNC` only).
|
|
*/
|
|
struct ZydisDecodedInstructionAvxConversion_
|
|
{
|
|
/**
|
|
* The `AVX` data-conversion mode.
|
|
*/
|
|
ZydisConversionMode mode;
|
|
} conversion;
|
|
/**
|
|
* Signals, if the `SAE` (suppress-all-exceptions) functionality is
|
|
* enabled for the instruction.
|
|
*/
|
|
ZyanBool has_sae;
|
|
/**
|
|
* Signals, if the instruction has a memory-eviction-hint (`KNC` only).
|
|
*/
|
|
ZyanBool has_eviction_hint;
|
|
// TODO: publish EVEX tuple-type and MVEX functionality
|
|
} ZydisDecodedInstructionAvx;
|
|
|
|
/**
|
|
* Instruction meta info.
|
|
*/
|
|
typedef struct ZydisDecodedInstructionMeta_
|
|
{
|
|
/**
|
|
* The instruction category.
|
|
*/
|
|
ZydisInstructionCategory category;
|
|
/**
|
|
* The ISA-set.
|
|
*/
|
|
ZydisISASet isa_set;
|
|
/**
|
|
* The ISA-set extension.
|
|
*/
|
|
ZydisISAExt isa_ext;
|
|
/**
|
|
* The branch type.
|
|
*/
|
|
ZydisBranchType branch_type;
|
|
/**
|
|
* The exception class.
|
|
*/
|
|
ZydisExceptionClass exception_class;
|
|
} ZydisDecodedInstructionMeta;
|
|
|
|
/**
|
|
* Detailed info about different instruction-parts like `ModRM`, `SIB` or
|
|
* encoding-prefixes.
|
|
*/
|
|
typedef struct ZydisDecodedInstructionRaw_
|
|
{
|
|
/**
|
|
* The number of legacy prefixes.
|
|
*/
|
|
ZyanU8 prefix_count;
|
|
/**
|
|
* Detailed info about the legacy prefixes (including `REX`).
|
|
*/
|
|
struct ZydisDecodedInstructionRawPrefixes_
|
|
{
|
|
/**
|
|
* The prefix type.
|
|
*/
|
|
ZydisPrefixType type;
|
|
/**
|
|
* The prefix byte.
|
|
*/
|
|
ZyanU8 value;
|
|
} prefixes[ZYDIS_MAX_INSTRUCTION_LENGTH];
|
|
|
|
/*
|
|
* Copy of the `encoding` field.
|
|
*
|
|
* This is here to allow the Rust bindings to treat the following union as an `enum`,
|
|
* sparing us a lot of unsafe code. Prefer using the regular `encoding` field in C/C++ code.
|
|
*/
|
|
ZydisInstructionEncoding encoding2;
|
|
/*
|
|
* Union for things from various mutually exclusive encodings.
|
|
*/
|
|
union
|
|
{
|
|
ZydisDecodedInstructionRawRex rex;
|
|
ZydisDecodedInstructionRawXop xop;
|
|
ZydisDecodedInstructionRawVex vex;
|
|
ZydisDecodedInstructionRawEvex evex;
|
|
ZydisDecodedInstructionRawMvex mvex;
|
|
};
|
|
|
|
/**
|
|
* Detailed info about the `ModRM` byte.
|
|
*/
|
|
struct ZydisDecodedInstructionModRm_
|
|
{
|
|
/**
|
|
* The addressing mode.
|
|
*/
|
|
ZyanU8 mod;
|
|
/**
|
|
* Register specifier or opcode-extension.
|
|
*/
|
|
ZyanU8 reg;
|
|
/**
|
|
* Register specifier or opcode-extension.
|
|
*/
|
|
ZyanU8 rm;
|
|
/**
|
|
* The offset of the `ModRM` byte, relative to the beginning of the
|
|
* instruction, in bytes.
|
|
*/
|
|
ZyanU8 offset;
|
|
} modrm;
|
|
/**
|
|
* Detailed info about the `SIB` byte.
|
|
*/
|
|
struct ZydisDecodedInstructionRawSib_
|
|
{
|
|
/**
|
|
* The scale factor.
|
|
*/
|
|
ZyanU8 scale;
|
|
/**
|
|
* The index-register specifier.
|
|
*/
|
|
ZyanU8 index;
|
|
/**
|
|
* The base-register specifier.
|
|
*/
|
|
ZyanU8 base;
|
|
/**
|
|
* The offset of the `SIB` byte, relative to the beginning of the
|
|
* instruction, in bytes.
|
|
*/
|
|
ZyanU8 offset;
|
|
} sib;
|
|
/**
|
|
* Detailed info about displacement-bytes.
|
|
*/
|
|
struct ZydisDecodedInstructionRawDisp_
|
|
{
|
|
/**
|
|
* The displacement value
|
|
*/
|
|
ZyanI64 value;
|
|
/**
|
|
* The physical displacement size, in bits.
|
|
*/
|
|
ZyanU8 size;
|
|
// TODO: publish cd8 scale
|
|
/**
|
|
* The offset of the displacement data, relative to the beginning of the
|
|
* instruction, in bytes.
|
|
*/
|
|
ZyanU8 offset;
|
|
} disp;
|
|
/**
|
|
* Detailed info about immediate-bytes.
|
|
*/
|
|
struct ZydisDecodedInstructionRawImm_
|
|
{
|
|
/**
|
|
* Signals, if the immediate value is signed.
|
|
*/
|
|
ZyanBool is_signed;
|
|
/**
|
|
* Signals, if the immediate value contains a relative offset. You can use
|
|
* `ZydisCalcAbsoluteAddress` to determine the absolute address value.
|
|
*/
|
|
ZyanBool is_relative;
|
|
/**
|
|
* The immediate value.
|
|
*/
|
|
union ZydisDecodedInstructionRawImmValue_
|
|
{
|
|
ZyanU64 u;
|
|
ZyanI64 s;
|
|
} value;
|
|
/**
|
|
* The physical immediate size, in bits.
|
|
*/
|
|
ZyanU8 size;
|
|
/**
|
|
* The offset of the immediate data, relative to the beginning of the
|
|
* instruction, in bytes.
|
|
*/
|
|
ZyanU8 offset;
|
|
} imm[2];
|
|
} ZydisDecodedInstructionRaw;
|
|
|
|
/**
|
|
* Information about a decoded instruction.
|
|
*/
|
|
typedef struct ZydisDecodedInstruction_
|
|
{
|
|
/**
|
|
* The machine mode used to decode this instruction.
|
|
*/
|
|
ZydisMachineMode machine_mode;
|
|
/**
|
|
* The instruction-mnemonic.
|
|
*/
|
|
ZydisMnemonic mnemonic;
|
|
/**
|
|
* The length of the decoded instruction.
|
|
*/
|
|
ZyanU8 length;
|
|
/**
|
|
* The instruction-encoding (`LEGACY`, `3DNOW`, `VEX`, `EVEX`, `XOP`).
|
|
*/
|
|
ZydisInstructionEncoding encoding;
|
|
/**
|
|
* The opcode-map.
|
|
*/
|
|
ZydisOpcodeMap opcode_map;
|
|
/**
|
|
* The instruction-opcode.
|
|
*/
|
|
ZyanU8 opcode;
|
|
/**
|
|
* The stack width.
|
|
*/
|
|
ZyanU8 stack_width;
|
|
/**
|
|
* The effective operand width.
|
|
*/
|
|
ZyanU8 operand_width;
|
|
/**
|
|
* The effective address width.
|
|
*/
|
|
ZyanU8 address_width;
|
|
/**
|
|
* The number of instruction-operands.
|
|
*
|
|
* Explicit and implicit operands are guaranteed to be in the front and ordered as they are
|
|
* printed by the formatter in `Intel` mode. No assumptions can be made about the order of
|
|
* hidden operands, except that they always located behind the explicit and implicit operands.
|
|
*/
|
|
ZyanU8 operand_count;
|
|
/**
|
|
* The number of explicit (visible) instruction-operands.
|
|
*
|
|
* Explicit and implicit operands are guaranteed to be in the front and ordered as they are
|
|
* printed by the formatter in `Intel` mode.
|
|
*/
|
|
ZyanU8 operand_count_visible;
|
|
/**
|
|
* See @ref instruction_attributes.
|
|
*/
|
|
ZydisInstructionAttributes attributes;
|
|
/**
|
|
* Information about CPU flags accessed by the instruction.
|
|
*
|
|
* The bits in the masks correspond to the actual bits in the `FLAGS/EFLAGS/RFLAGS`
|
|
* register. See @ref decoder_cpu_flags.
|
|
*/
|
|
const ZydisAccessedFlags* cpu_flags;
|
|
/**
|
|
* Information about FPU flags accessed by the instruction.
|
|
*
|
|
* See @ref decoder_fpu_flags.
|
|
*/
|
|
const ZydisAccessedFlags* fpu_flags;
|
|
/**
|
|
* Extended info for `AVX` instructions.
|
|
*/
|
|
ZydisDecodedInstructionAvx avx;
|
|
/**
|
|
* Meta info.
|
|
*/
|
|
ZydisDecodedInstructionMeta meta;
|
|
/**
|
|
* Detailed info about different instruction-parts like `ModRM`, `SIB` or
|
|
* encoding-prefixes.
|
|
*/
|
|
ZydisDecodedInstructionRaw raw;
|
|
} ZydisDecodedInstruction;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Decoder context */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* The decoder context is used to preserve some internal state between subsequent decode
|
|
* operations for THE SAME instruction.
|
|
*
|
|
* The context is initialized by @c ZydisDecoderDecodeInstruction and required by e.g.
|
|
* @c ZydisDecoderDecodeOperands.
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may lead to unexpected
|
|
* behavior.
|
|
*
|
|
* This struct is neither ABI nor API stable!
|
|
*/
|
|
typedef struct ZydisDecoderContext_
|
|
{
|
|
/**
|
|
* A pointer to the internal instruction definition.
|
|
*/
|
|
const void* definition;
|
|
/**
|
|
* Contains the effective operand-size index.
|
|
*
|
|
* 0 = 16 bit, 1 = 32 bit, 2 = 64 bit
|
|
*/
|
|
ZyanU8 eosz_index;
|
|
/**
|
|
* Contains the effective address-size index.
|
|
*
|
|
* 0 = 16 bit, 1 = 32 bit, 2 = 64 bit
|
|
*/
|
|
ZyanU8 easz_index;
|
|
/**
|
|
* Contains some cached REX/XOP/VEX/EVEX/MVEX values to provide uniform access.
|
|
*/
|
|
struct
|
|
{
|
|
ZyanU8 W;
|
|
ZyanU8 R;
|
|
ZyanU8 X;
|
|
ZyanU8 B;
|
|
ZyanU8 L;
|
|
ZyanU8 LL;
|
|
ZyanU8 R2;
|
|
ZyanU8 V2;
|
|
ZyanU8 vvvv;
|
|
ZyanU8 mask;
|
|
} vector_unified;
|
|
/**
|
|
* Information about encoded operand registers.
|
|
*/
|
|
struct
|
|
{
|
|
/**
|
|
* Signals if the `modrm.mod == 3` or `reg` form is forced for the instruction.
|
|
*/
|
|
ZyanBool is_mod_reg;
|
|
/**
|
|
* The final register id for the `reg` encoded register.
|
|
*/
|
|
ZyanU8 id_reg;
|
|
/**
|
|
* The final register id for the `rm` encoded register.
|
|
*
|
|
* This value is only set, if a register is encoded in `modrm.rm`.
|
|
*/
|
|
ZyanU8 id_rm;
|
|
/**
|
|
* The final register id for the `ndsndd` (`.vvvv`) encoded register.
|
|
*/
|
|
ZyanU8 id_ndsndd;
|
|
/**
|
|
* The final register id for the base register.
|
|
*
|
|
* This value is only set, if a memory operand is encoded in `modrm.rm`.
|
|
*/
|
|
ZyanU8 id_base;
|
|
/**
|
|
* The final register id for the index register.
|
|
*
|
|
* This value is only set, if a memory operand is encoded in `modrm.rm` and the `SIB` byte
|
|
* is present.
|
|
*/
|
|
ZyanU8 id_index;
|
|
} reg_info;
|
|
/**
|
|
* Internal EVEX-specific information.
|
|
*/
|
|
struct
|
|
{
|
|
/**
|
|
* The EVEX tuple-type.
|
|
*/
|
|
ZyanU8 tuple_type;
|
|
/**
|
|
* The EVEX element-size.
|
|
*/
|
|
ZyanU8 element_size;
|
|
} evex;
|
|
/**
|
|
* Internal MVEX-specific information.
|
|
*/
|
|
struct
|
|
{
|
|
/**
|
|
* The MVEX functionality.
|
|
*/
|
|
ZyanU8 functionality;
|
|
} mvex;
|
|
/**
|
|
* The scale factor for EVEX/MVEX compressed 8-bit displacement values.
|
|
*/
|
|
ZyanU8 cd8_scale; // TODO: Could make sense to expose this in the ZydisDecodedInstruction
|
|
} ZydisDecoderContext;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_INSTRUCTIONINFO_H */
|
|
|
|
//
|
|
// Header: Zydis/Status.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Status code definitions and check macros.
|
|
*/
|
|
|
|
#ifndef ZYDIS_STATUS_H
|
|
#define ZYDIS_STATUS_H
|
|
|
|
|
|
//
|
|
// Header: Zycore/Status.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Decoder.h
|
|
// - Zydis/Status.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Core Library (Zyan-C)
|
|
|
|
Original Author : Florian Bernd, Joel Hoener
|
|
|
|
* 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
|
|
* Status code definitions and check macros.
|
|
*/
|
|
|
|
#ifndef ZYCORE_STATUS_H
|
|
#define ZYCORE_STATUS_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Defines the `ZyanStatus` data type.
|
|
*/
|
|
typedef ZyanU32 ZyanStatus;
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Definition */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines a zyan status code.
|
|
*
|
|
* @param error `1`, if the status code signals an error or `0`, if not.
|
|
* @param module The module id.
|
|
* @param code The actual code.
|
|
*
|
|
* @return The zyan status code.
|
|
*/
|
|
#define ZYAN_MAKE_STATUS(error, module, code) \
|
|
(ZyanStatus)((((error) & 0x01u) << 31u) | (((module) & 0x7FFu) << 20u) | ((code) & 0xFFFFFu))
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Checks */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Checks if a zyan operation was successful.
|
|
*
|
|
* @param status The zyan status-code to check.
|
|
*
|
|
* @return `ZYAN_TRUE`, if the operation succeeded or `ZYAN_FALSE`, if not.
|
|
*/
|
|
#define ZYAN_SUCCESS(status) \
|
|
(!((status) & 0x80000000u))
|
|
|
|
/**
|
|
* Checks if a zyan operation failed.
|
|
*
|
|
* @param status The zyan status-code to check.
|
|
*
|
|
* @return `ZYAN_TRUE`, if the operation failed or `ZYAN_FALSE`, if not.
|
|
*/
|
|
#define ZYAN_FAILED(status) \
|
|
((status) & 0x80000000u)
|
|
|
|
/**
|
|
* Checks if a zyan operation was successful and returns with the status-code, if not.
|
|
*
|
|
* @param status The zyan status-code to check.
|
|
*/
|
|
#define ZYAN_CHECK(status) \
|
|
do \
|
|
{ \
|
|
const ZyanStatus status_047620348 = (status); \
|
|
if (!ZYAN_SUCCESS(status_047620348)) \
|
|
{ \
|
|
return status_047620348; \
|
|
} \
|
|
} while (0)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Information */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the module id of a zyan status-code.
|
|
*
|
|
* @param status The zyan status-code.
|
|
*
|
|
* @return The module id of the zyan status-code.
|
|
*/
|
|
#define ZYAN_STATUS_MODULE(status) \
|
|
(((status) >> 20) & 0x7FFu)
|
|
|
|
/**
|
|
* Returns the code of a zyan status-code.
|
|
*
|
|
* @param status The zyan status-code.
|
|
*
|
|
* @return The code of the zyan status-code.
|
|
*/
|
|
#define ZYAN_STATUS_CODE(status) \
|
|
((status) & 0xFFFFFu)
|
|
|
|
/* ============================================================================================== */
|
|
/* Status codes */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Module IDs */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* The zycore generic module id.
|
|
*/
|
|
#define ZYAN_MODULE_ZYCORE 0x001u
|
|
|
|
/**
|
|
* The zycore arg-parse submodule id.
|
|
*/
|
|
#define ZYAN_MODULE_ARGPARSE 0x003u
|
|
|
|
/**
|
|
* The base module id for user-defined status codes.
|
|
*/
|
|
#define ZYAN_MODULE_USER 0x3FFu
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Status codes (general purpose) */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* The operation completed successfully.
|
|
*/
|
|
#define ZYAN_STATUS_SUCCESS \
|
|
ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x00u)
|
|
|
|
/**
|
|
* The operation failed with an generic error.
|
|
*/
|
|
#define ZYAN_STATUS_FAILED \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x01u)
|
|
|
|
/**
|
|
* The operation completed successfully and returned `ZYAN_TRUE`.
|
|
*/
|
|
#define ZYAN_STATUS_TRUE \
|
|
ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x02u)
|
|
|
|
/**
|
|
* The operation completed successfully and returned `ZYAN_FALSE`.
|
|
*/
|
|
#define ZYAN_STATUS_FALSE \
|
|
ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x03u)
|
|
|
|
/**
|
|
* An invalid argument was passed to a function.
|
|
*/
|
|
#define ZYAN_STATUS_INVALID_ARGUMENT \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x04u)
|
|
|
|
/**
|
|
* An attempt was made to perform an invalid operation.
|
|
*/
|
|
#define ZYAN_STATUS_INVALID_OPERATION \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x05u)
|
|
|
|
/**
|
|
* Insufficient privileges to perform the requested operation.
|
|
*/
|
|
#define ZYAN_STATUS_ACCESS_DENIED \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x06u)
|
|
|
|
/**
|
|
* The requested entity was not found.
|
|
*/
|
|
#define ZYAN_STATUS_NOT_FOUND \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x07u)
|
|
|
|
/**
|
|
* An index passed to a function was out of bounds.
|
|
*/
|
|
#define ZYAN_STATUS_OUT_OF_RANGE \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x08u)
|
|
|
|
/**
|
|
* A buffer passed to a function was too small to complete the requested operation.
|
|
*/
|
|
#define ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x09u)
|
|
|
|
/**
|
|
* Insufficient memory to perform the operation.
|
|
*/
|
|
#define ZYAN_STATUS_NOT_ENOUGH_MEMORY \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Au)
|
|
|
|
/**
|
|
* An unknown error occurred during a system function call.
|
|
*/
|
|
#define ZYAN_STATUS_BAD_SYSTEMCALL \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Bu)
|
|
|
|
/**
|
|
* The process ran out of resources while performing an operation.
|
|
*/
|
|
#define ZYAN_STATUS_OUT_OF_RESOURCES \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Cu)
|
|
|
|
/**
|
|
* A dependency library was not found or does have an unexpected version number or
|
|
* feature-set.
|
|
*/
|
|
#define ZYAN_STATUS_MISSING_DEPENDENCY \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Du)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Status codes (arg parse) */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Argument was not expected.
|
|
*/
|
|
#define ZYAN_STATUS_ARG_NOT_UNDERSTOOD \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x00u)
|
|
|
|
/**
|
|
* Too few arguments were provided.
|
|
*/
|
|
#define ZYAN_STATUS_TOO_FEW_ARGS \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x01u)
|
|
|
|
/**
|
|
* Too many arguments were provided.
|
|
*/
|
|
#define ZYAN_STATUS_TOO_MANY_ARGS \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x02u)
|
|
|
|
/**
|
|
* An argument that expected a value misses its value.
|
|
*/
|
|
#define ZYAN_STATUS_ARG_MISSES_VALUE \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x03u)
|
|
|
|
/**
|
|
* A required argument is missing.
|
|
*/
|
|
#define ZYAN_STATUS_REQUIRED_ARG_MISSING \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x04u)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYCORE_STATUS_H */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Status codes */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Module IDs */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* The zydis module id.
|
|
*/
|
|
#define ZYAN_MODULE_ZYDIS 0x002u
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Status codes */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Decoder */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* An attempt was made to read data from an input data-source that has no more
|
|
* data available.
|
|
*/
|
|
#define ZYDIS_STATUS_NO_MORE_DATA \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x00u)
|
|
|
|
/**
|
|
* An general error occured while decoding the current instruction. The
|
|
* instruction might be undefined.
|
|
*/
|
|
#define ZYDIS_STATUS_DECODING_ERROR \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x01u)
|
|
|
|
/**
|
|
* The instruction exceeded the maximum length of 15 bytes.
|
|
*/
|
|
#define ZYDIS_STATUS_INSTRUCTION_TOO_LONG \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x02u)
|
|
|
|
/**
|
|
* The instruction encoded an invalid register.
|
|
*/
|
|
#define ZYDIS_STATUS_BAD_REGISTER \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x03u)
|
|
|
|
/**
|
|
* A lock-prefix (F0) was found while decoding an instruction that does not
|
|
* support locking.
|
|
*/
|
|
#define ZYDIS_STATUS_ILLEGAL_LOCK \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x04u)
|
|
|
|
/**
|
|
* A legacy-prefix (F2, F3, 66) was found while decoding a XOP/VEX/EVEX/MVEX
|
|
* instruction.
|
|
*/
|
|
#define ZYDIS_STATUS_ILLEGAL_LEGACY_PFX \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x05u)
|
|
|
|
/**
|
|
* A rex-prefix was found while decoding a XOP/VEX/EVEX/MVEX instruction.
|
|
*/
|
|
#define ZYDIS_STATUS_ILLEGAL_REX \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x06u)
|
|
|
|
/**
|
|
* An invalid opcode-map value was found while decoding a XOP/VEX/EVEX/MVEX-prefix.
|
|
*/
|
|
#define ZYDIS_STATUS_INVALID_MAP \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x07u)
|
|
|
|
/**
|
|
* An error occured while decoding the EVEX-prefix.
|
|
*/
|
|
#define ZYDIS_STATUS_MALFORMED_EVEX \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x08u)
|
|
|
|
/**
|
|
* An error occured while decoding the MVEX-prefix.
|
|
*/
|
|
#define ZYDIS_STATUS_MALFORMED_MVEX \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x09u)
|
|
|
|
/**
|
|
* An invalid write-mask was specified for an EVEX/MVEX instruction.
|
|
*/
|
|
#define ZYDIS_STATUS_INVALID_MASK \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x0Au)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Formatter */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returning this status code in some specified formatter callbacks will cause
|
|
* the formatter to omit the corresponding token.
|
|
*
|
|
* Valid callbacks:
|
|
* - `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`
|
|
*/
|
|
#define ZYDIS_STATUS_SKIP_TOKEN \
|
|
ZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYDIS, 0x0Bu)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Encoder */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#define ZYDIS_STATUS_IMPOSSIBLE_INSTRUCTION \
|
|
ZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x0Cu)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_STATUS_H */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Decoder mode */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisDecoderMode` enum.
|
|
*/
|
|
typedef enum ZydisDecoderMode_
|
|
{
|
|
/**
|
|
* Enables minimal instruction decoding without semantic analysis.
|
|
*
|
|
* This mode provides access to the mnemonic, the instruction-length, the effective
|
|
* operand-size, the effective address-width, some attributes (e.g. `ZYDIS_ATTRIB_IS_RELATIVE`)
|
|
* and all of the information in the `raw` field of the `ZydisDecodedInstruction` struct.
|
|
*
|
|
* Operands, most attributes and other specific information (like `AVX` info) are not
|
|
* accessible in this mode.
|
|
*
|
|
* This mode is NOT enabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_MINIMAL,
|
|
/**
|
|
* Enables the `AMD`-branch mode.
|
|
*
|
|
* Intel ignores the operand-size override-prefix (`0x66`) for all branches with 32-bit
|
|
* immediates and forces the operand-size of the instruction to 64-bit in 64-bit mode.
|
|
* In `AMD`-branch mode `0x66` is not ignored and changes the operand-size and the size of the
|
|
* immediate to 16-bit.
|
|
*
|
|
* This mode is NOT enabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_AMD_BRANCHES,
|
|
/**
|
|
* Enables `KNC` compatibility-mode.
|
|
*
|
|
* `KNC` and `KNL+` chips are sharing opcodes and encodings for some mask-related instructions.
|
|
* Enable this mode to use the old `KNC` specifications (different mnemonics, operands, ..).
|
|
*
|
|
* This mode is NOT enabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_KNC,
|
|
/**
|
|
* Enables the `MPX` mode.
|
|
*
|
|
* The `MPX` isa-extension reuses (overrides) some of the widenop instruction opcodes.
|
|
*
|
|
* This mode is enabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_MPX,
|
|
/**
|
|
* Enables the `CET` mode.
|
|
*
|
|
* The `CET` isa-extension reuses (overrides) some of the widenop instruction opcodes.
|
|
*
|
|
* This mode is enabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_CET,
|
|
/**
|
|
* Enables the `LZCNT` mode.
|
|
*
|
|
* The `LZCNT` isa-extension reuses (overrides) some of the widenop instruction opcodes.
|
|
*
|
|
* This mode is enabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_LZCNT,
|
|
/**
|
|
* Enables the `TZCNT` mode.
|
|
*
|
|
* The `TZCNT` isa-extension reuses (overrides) some of the widenop instruction opcodes.
|
|
*
|
|
* This mode is enabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_TZCNT,
|
|
/**
|
|
* Enables the `WBNOINVD` mode.
|
|
*
|
|
* The `WBINVD` instruction is interpreted as `WBNOINVD` on ICL chips, if a `F3` prefix is
|
|
* used.
|
|
*
|
|
* This mode is disabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_WBNOINVD,
|
|
/**
|
|
* Enables the `CLDEMOTE` mode.
|
|
*
|
|
* The `CLDEMOTE` isa-extension reuses (overrides) some of the widenop instruction opcodes.
|
|
*
|
|
* This mode is enabled by default.
|
|
*/
|
|
ZYDIS_DECODER_MODE_CLDEMOTE,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_DECODER_MODE_MAX_VALUE = ZYDIS_DECODER_MODE_CLDEMOTE,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_DECODER_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_DECODER_MODE_MAX_VALUE)
|
|
} ZydisDecoderMode;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Decoder struct */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisDecoder` struct.
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may lead to unexpected
|
|
* behavior.
|
|
*/
|
|
typedef struct ZydisDecoder_
|
|
{
|
|
/**
|
|
* The machine mode.
|
|
*/
|
|
ZydisMachineMode machine_mode;
|
|
/**
|
|
* The stack width.
|
|
*/
|
|
ZydisStackWidth stack_width;
|
|
/**
|
|
* The decoder mode array.
|
|
*/
|
|
ZyanBool decoder_mode[ZYDIS_DECODER_MODE_MAX_VALUE + 1];
|
|
} ZydisDecoder;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* @addtogroup decoder Decoder
|
|
* Functions allowing decoding of instruction bytes to a machine interpretable struct.
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* Initializes the given `ZydisDecoder` instance.
|
|
*
|
|
* @param decoder A pointer to the `ZydisDecoder` instance.
|
|
* @param machine_mode The machine mode.
|
|
* @param stack_width The stack width.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machine_mode,
|
|
ZydisStackWidth stack_width);
|
|
|
|
/**
|
|
* Enables or disables the specified decoder-mode.
|
|
*
|
|
* @param decoder A pointer to the `ZydisDecoder` instance.
|
|
* @param mode The decoder mode.
|
|
* @param enabled `ZYAN_TRUE` to enable, or `ZYAN_FALSE` to disable the specified decoder-mode.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisDecoderEnableMode(ZydisDecoder* decoder, ZydisDecoderMode mode,
|
|
ZyanBool enabled);
|
|
|
|
/**
|
|
* Decodes the instruction in the given input `buffer` and returns all details (e.g. operands).
|
|
*
|
|
* @param decoder A pointer to the `ZydisDecoder` instance.
|
|
* @param buffer A pointer to the input buffer.
|
|
* @param length The length of the input buffer. Note that this can be bigger than the
|
|
* actual size of the instruction -- you don't have to know the size up
|
|
* front. This length is merely used to prevent Zydis from doing
|
|
* out-of-bounds reads on your buffer.
|
|
* @param instruction A pointer to the `ZydisDecodedInstruction` struct receiving the details
|
|
* about the decoded instruction.
|
|
* @param operands A pointer to an array with `ZYDIS_MAX_OPERAND_COUNT` entries that
|
|
* receives the decoded operands. The number of operands decoded is
|
|
* determined by the `instruction.operand_count` field. Excess entries are
|
|
* zeroed.
|
|
*
|
|
* This is a convenience function that combines the following functions into one call:
|
|
*
|
|
* - `ZydisDecoderDecodeInstruction`
|
|
* - `ZydisDecoderDecodeOperands`
|
|
*
|
|
* Please refer to `ZydisDecoderDecodeInstruction` if operand decoding is not required or should
|
|
* be done separately (`ZydisDecoderDecodeOperands`).
|
|
*
|
|
* This function is not available in MINIMAL_MODE.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeFull(const ZydisDecoder* decoder,
|
|
const void* buffer, ZyanUSize length, ZydisDecodedInstruction* instruction,
|
|
ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]);
|
|
|
|
/**
|
|
* Decodes the instruction in the given input `buffer`.
|
|
*
|
|
* @param decoder A pointer to the `ZydisDecoder` instance.
|
|
* @param context A pointer to a decoder context struct which is required for further
|
|
* decoding (e.g. operand decoding using `ZydisDecoderDecodeOperands`) or
|
|
* `ZYAN_NULL` if not needed.
|
|
* @param buffer A pointer to the input buffer.
|
|
* @param length The length of the input buffer. Note that this can be bigger than the
|
|
* actual size of the instruction -- you don't have to know the size up
|
|
* front. This length is merely used to prevent Zydis from doing
|
|
* out-of-bounds reads on your buffer.
|
|
* @param instruction A pointer to the `ZydisDecodedInstruction` struct, that receives the
|
|
* details about the decoded instruction.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeInstruction(const ZydisDecoder* decoder,
|
|
ZydisDecoderContext* context, const void* buffer, ZyanUSize length,
|
|
ZydisDecodedInstruction* instruction);
|
|
|
|
/**
|
|
* Decodes the instruction operands.
|
|
*
|
|
* @param decoder A pointer to the `ZydisDecoder` instance.
|
|
* @param context A pointer to the `ZydisDecoderContext` struct.
|
|
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
|
|
* @param operands The array that receives the decoded operands.
|
|
* Refer to `ZYDIS_MAX_OPERAND_COUNT` or `ZYDIS_MAX_OPERAND_COUNT_VISIBLE`
|
|
* when allocating space for the array to ensure that the buffer size is
|
|
* sufficient to always fit all instruction operands.
|
|
* Refer to `instruction.operand_count` or
|
|
* `instruction.operand_count_visible' when allocating space for the array
|
|
* to ensure that the buffer size is sufficient to fit all operands of
|
|
* the given instruction.
|
|
* @param operand_count The length of the `operands` array.
|
|
* This argument as well limits the maximum amount of operands to decode.
|
|
* If this value is `0`, no operands will be decoded and `ZYAN_NULL` will
|
|
* be accepted for the `operands` argument.
|
|
*
|
|
* This function fails, if `operand_count` is larger than the total number of operands for the
|
|
* given instruction (`instruction.operand_count`).
|
|
*
|
|
* This function is not available in MINIMAL_MODE.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeOperands(const ZydisDecoder* decoder,
|
|
const ZydisDecoderContext* context, const ZydisDecodedInstruction* instruction,
|
|
ZydisDecodedOperand* operands, ZyanU8 operand_count);
|
|
|
|
/** @} */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_DECODER_H */
|
|
#endif
|
|
|
|
#if !defined(ZYDIS_DISABLE_ENCODER)
|
|
|
|
//
|
|
// Header: Zydis/Encoder.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Disassembler Library (Zydis)
|
|
|
|
Original Author : Mappa
|
|
|
|
* 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 encoding instructions.
|
|
*/
|
|
|
|
#ifndef ZYDIS_ENCODER_H
|
|
#define ZYDIS_ENCODER_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Constants */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Maximum number of encodable (explicit and implicit) operands
|
|
*/
|
|
#define ZYDIS_ENCODER_MAX_OPERANDS 5
|
|
|
|
// If asserts are failing here remember to update encoder table generator before fixing asserts
|
|
ZYAN_STATIC_ASSERT(ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODER_MAX_OPERANDS) == 3);
|
|
|
|
/**
|
|
* Combination of all user-encodable prefixes
|
|
*/
|
|
#define ZYDIS_ENCODABLE_PREFIXES (ZYDIS_ATTRIB_HAS_LOCK | \
|
|
ZYDIS_ATTRIB_HAS_REP | \
|
|
ZYDIS_ATTRIB_HAS_REPE | \
|
|
ZYDIS_ATTRIB_HAS_REPNE | \
|
|
ZYDIS_ATTRIB_HAS_BND | \
|
|
ZYDIS_ATTRIB_HAS_XACQUIRE | \
|
|
ZYDIS_ATTRIB_HAS_XRELEASE | \
|
|
ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN | \
|
|
ZYDIS_ATTRIB_HAS_BRANCH_TAKEN | \
|
|
ZYDIS_ATTRIB_HAS_NOTRACK | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_CS | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_SS | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_DS | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_ES | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_FS | \
|
|
ZYDIS_ATTRIB_HAS_SEGMENT_GS)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Defines possible physical instruction encodings as bit flags, so multiple acceptable encodings
|
|
* can be specified simultaneously.
|
|
*/
|
|
typedef enum ZydisEncodableEncoding_
|
|
{
|
|
ZYDIS_ENCODABLE_ENCODING_DEFAULT = 0x00000000,
|
|
ZYDIS_ENCODABLE_ENCODING_LEGACY = 0x00000001,
|
|
ZYDIS_ENCODABLE_ENCODING_3DNOW = 0x00000002,
|
|
ZYDIS_ENCODABLE_ENCODING_XOP = 0x00000004,
|
|
ZYDIS_ENCODABLE_ENCODING_VEX = 0x00000008,
|
|
ZYDIS_ENCODABLE_ENCODING_EVEX = 0x00000010,
|
|
ZYDIS_ENCODABLE_ENCODING_MVEX = 0x00000020,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_ENCODABLE_ENCODING_MAX_VALUE = (ZYDIS_ENCODABLE_ENCODING_MVEX |
|
|
(ZYDIS_ENCODABLE_ENCODING_MVEX - 1)),
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_ENCODABLE_ENCODING_REQUIRED_BITS =
|
|
ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODABLE_ENCODING_MAX_VALUE)
|
|
} ZydisEncodableEncoding;
|
|
|
|
/**
|
|
* Defines encodable physical/effective sizes of relative immediate operands. See
|
|
* `ZydisEncoderRequest.branch_width` for more details.
|
|
*/
|
|
typedef enum ZydisBranchWidth_
|
|
{
|
|
ZYDIS_BRANCH_WIDTH_NONE,
|
|
ZYDIS_BRANCH_WIDTH_8,
|
|
ZYDIS_BRANCH_WIDTH_16,
|
|
ZYDIS_BRANCH_WIDTH_32,
|
|
ZYDIS_BRANCH_WIDTH_64,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_BRANCH_WIDTH_MAX_VALUE = ZYDIS_BRANCH_WIDTH_64,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_BRANCH_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_WIDTH_MAX_VALUE)
|
|
} ZydisBranchWidth;
|
|
|
|
/**
|
|
* Defines possible values for address size hints. See `ZydisEncoderRequest` for more information
|
|
* about address size hints.
|
|
*/
|
|
typedef enum ZydisAddressSizeHint_
|
|
{
|
|
ZYDIS_ADDRESS_SIZE_HINT_NONE,
|
|
ZYDIS_ADDRESS_SIZE_HINT_16,
|
|
ZYDIS_ADDRESS_SIZE_HINT_32,
|
|
ZYDIS_ADDRESS_SIZE_HINT_64,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE = ZYDIS_ADDRESS_SIZE_HINT_64,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_ADDRESS_SIZE_HINT_REQUIRED_BITS =
|
|
ZYAN_BITS_TO_REPRESENT(ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE)
|
|
} ZydisAddressSizeHint;
|
|
|
|
/**
|
|
* Defines possible values for operand size hints. See `ZydisEncoderRequest` for more information
|
|
* about operand size hints.
|
|
*/
|
|
typedef enum ZydisOperandSizeHint_
|
|
{
|
|
ZYDIS_OPERAND_SIZE_HINT_NONE,
|
|
ZYDIS_OPERAND_SIZE_HINT_8,
|
|
ZYDIS_OPERAND_SIZE_HINT_16,
|
|
ZYDIS_OPERAND_SIZE_HINT_32,
|
|
ZYDIS_OPERAND_SIZE_HINT_64,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE = ZYDIS_OPERAND_SIZE_HINT_64,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_OPERAND_SIZE_HINT_REQUIRED_BITS =
|
|
ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE)
|
|
} ZydisOperandSizeHint;
|
|
|
|
/**
|
|
* Describes explicit or implicit instruction operand.
|
|
*/
|
|
typedef struct ZydisEncoderOperand_
|
|
{
|
|
/**
|
|
* The type of the operand.
|
|
*/
|
|
ZydisOperandType type;
|
|
/**
|
|
* Extended info for register-operands.
|
|
*/
|
|
struct ZydisEncoderOperandReg_
|
|
{
|
|
/**
|
|
* The register value.
|
|
*/
|
|
ZydisRegister value;
|
|
/**
|
|
* Is this 4th operand (`VEX`/`XOP`). Despite its name, `is4` encoding can sometimes be
|
|
* applied to 3rd operand instead of 4th. This field is used to resolve such ambiguities.
|
|
* For all other operands it should be set to `ZYAN_FALSE`.
|
|
*/
|
|
ZyanBool is4;
|
|
} reg;
|
|
/**
|
|
* Extended info for memory-operands.
|
|
*/
|
|
struct ZydisEncoderOperandMem_
|
|
{
|
|
/**
|
|
* The base register.
|
|
*/
|
|
ZydisRegister base;
|
|
/**
|
|
* The index register.
|
|
*/
|
|
ZydisRegister index;
|
|
/**
|
|
* The scale factor.
|
|
*/
|
|
ZyanU8 scale;
|
|
/**
|
|
* The displacement value.
|
|
*/
|
|
ZyanI64 displacement;
|
|
/**
|
|
* Size of this operand in bytes.
|
|
*/
|
|
ZyanU16 size;
|
|
} mem;
|
|
/**
|
|
* Extended info for pointer-operands.
|
|
*/
|
|
struct ZydisEncoderOperandPtr_
|
|
{
|
|
/**
|
|
* The segment value.
|
|
*/
|
|
ZyanU16 segment;
|
|
/**
|
|
* The offset value.
|
|
*/
|
|
ZyanU32 offset;
|
|
} ptr;
|
|
/**
|
|
* Extended info for immediate-operands.
|
|
*/
|
|
union ZydisEncoderOperandImm_
|
|
{
|
|
/**
|
|
* The unsigned immediate value.
|
|
*/
|
|
ZyanU64 u;
|
|
/**
|
|
* The signed immediate value.
|
|
*/
|
|
ZyanI64 s;
|
|
} imm;
|
|
} ZydisEncoderOperand;
|
|
|
|
/**
|
|
* Main structure consumed by the encoder. It represents full semantics of an instruction.
|
|
*/
|
|
typedef struct ZydisEncoderRequest_
|
|
{
|
|
/**
|
|
* The machine mode used to encode this instruction.
|
|
*/
|
|
ZydisMachineMode machine_mode;
|
|
/**
|
|
* This optional field can be used to restrict allowed physical encodings for desired
|
|
* instruction. Some mnemonics can be supported by more than one encoding, so this field can
|
|
* resolve ambiguities e.g. you can disable `AVX-512` extensions by prohibiting usage of `EVEX`
|
|
* prefix and allow only `VEX` variants.
|
|
*/
|
|
ZydisEncodableEncoding allowed_encodings;
|
|
/**
|
|
* The instruction-mnemonic.
|
|
*/
|
|
ZydisMnemonic mnemonic;
|
|
/**
|
|
* A combination of requested encodable prefixes (`ZYDIS_ATTRIB_HAS_*` flags) for desired
|
|
* instruction. See `ZYDIS_ENCODABLE_PREFIXES` for list of available prefixes.
|
|
*/
|
|
ZydisInstructionAttributes prefixes;
|
|
/**
|
|
* Branch type (required for branching instructions only). Use `ZYDIS_BRANCH_TYPE_NONE` to let
|
|
* encoder pick size-optimal branch type automatically (`short` and `near` are prioritized over
|
|
* `far`).
|
|
*/
|
|
ZydisBranchType branch_type;
|
|
/**
|
|
* Specifies physical size for relative immediate operands. Use `ZYDIS_BRANCH_WIDTH_NONE` to
|
|
* let encoder pick size-optimal branch width automatically. For segment:offset `far` branches
|
|
* this field applies to physical size of the offset part. For branching instructions without
|
|
* relative operands this field affects effective operand size attribute.
|
|
*/
|
|
ZydisBranchWidth branch_width;
|
|
/**
|
|
* Optional address size hint used to resolve ambiguities for some instructions. Generally
|
|
* encoder deduces address size from `ZydisEncoderOperand` structures that represent
|
|
* explicit and implicit operands. This hint resolves conflicts when instruction's hidden
|
|
* operands scale with address size attribute.
|
|
*/
|
|
ZydisAddressSizeHint address_size_hint;
|
|
/**
|
|
* Optional operand size hint used to resolve ambiguities for some instructions. Generally
|
|
* encoder deduces operand size from `ZydisEncoderOperand` structures that represent
|
|
* explicit and implicit operands. This hint resolves conflicts when instruction's hidden
|
|
* operands scale with operand size attribute.
|
|
*/
|
|
ZydisOperandSizeHint operand_size_hint;
|
|
/**
|
|
* The number of instruction-operands.
|
|
*/
|
|
ZyanU8 operand_count;
|
|
/**
|
|
* Detailed info for all explicit and implicit instruction operands.
|
|
*/
|
|
ZydisEncoderOperand operands[ZYDIS_ENCODER_MAX_OPERANDS];
|
|
/**
|
|
* Extended info for `EVEX` instructions.
|
|
*/
|
|
struct ZydisEncoderRequestEvexFeatures_
|
|
{
|
|
/**
|
|
* The broadcast-mode. Specify `ZYDIS_BROADCAST_MODE_INVALID` for instructions with
|
|
* static broadcast functionality.
|
|
*/
|
|
ZydisBroadcastMode broadcast;
|
|
/**
|
|
* The rounding-mode.
|
|
*/
|
|
ZydisRoundingMode rounding;
|
|
/**
|
|
* Signals, if the `SAE` (suppress-all-exceptions) functionality should be enabled for
|
|
* the instruction.
|
|
*/
|
|
ZyanBool sae;
|
|
/**
|
|
* Signals, if the zeroing-mask functionality should be enabled for the instruction.
|
|
* Specify `ZYAN_TRUE` for instructions with forced zeroing mask.
|
|
*/
|
|
ZyanBool zeroing_mask;
|
|
} evex;
|
|
/**
|
|
* Extended info for `MVEX` instructions.
|
|
*/
|
|
struct ZydisEncoderRequestMvexFeatures_
|
|
{
|
|
/**
|
|
* The broadcast-mode.
|
|
*/
|
|
ZydisBroadcastMode broadcast;
|
|
/**
|
|
* The data-conversion mode.
|
|
*/
|
|
ZydisConversionMode conversion;
|
|
/**
|
|
* The rounding-mode.
|
|
*/
|
|
ZydisRoundingMode rounding;
|
|
/**
|
|
* The `AVX` register-swizzle mode.
|
|
*/
|
|
ZydisSwizzleMode swizzle;
|
|
/**
|
|
* Signals, if the `SAE` (suppress-all-exceptions) functionality is enabled for
|
|
* the instruction.
|
|
*/
|
|
ZyanBool sae;
|
|
/**
|
|
* Signals, if the instruction has a memory-eviction-hint (`KNC` only).
|
|
*/
|
|
ZyanBool eviction_hint;
|
|
} mvex;
|
|
} ZydisEncoderRequest;
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* @addtogroup encoder Encoder
|
|
* Functions allowing encoding of instruction bytes from a machine interpretable struct.
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* Encodes instruction with semantics specified in encoder request structure.
|
|
*
|
|
* @param request A pointer to the `ZydisEncoderRequest` struct.
|
|
* @param buffer A pointer to the output buffer receiving encoded instruction.
|
|
* @param length A pointer to the variable containing length of the output buffer. Upon
|
|
* successful return this variable receives length of the encoded instruction.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstruction(const ZydisEncoderRequest *request,
|
|
void *buffer, ZyanUSize *length);
|
|
|
|
/**
|
|
* Encodes instruction with semantics specified in encoder request structure. This function expects
|
|
* absolute addresses inside encoder request instead of `EIP`/`RIP`-relative values. Function
|
|
* predicts final instruction length prior to encoding and writes back calculated relative operands
|
|
* to provided encoder request.
|
|
*
|
|
* @param request A pointer to the `ZydisEncoderRequest` struct.
|
|
* @param buffer A pointer to the output buffer receiving encoded instruction.
|
|
* @param length A pointer to the variable containing length of the output buffer. Upon
|
|
* successful return this variable receives length of the encoded
|
|
* instruction.
|
|
* @param runtime_address The runtime address of the instruction.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstructionAbsolute(ZydisEncoderRequest *request,
|
|
void *buffer, ZyanUSize *length, ZyanU64 runtime_address);
|
|
|
|
/**
|
|
* Converts decoded instruction to encoder request that can be passed to
|
|
* `ZydisEncoderEncodeInstruction`.
|
|
*
|
|
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
|
|
* @param operands A pointer to the decoded operands.
|
|
* @param operand_count The operand count.
|
|
* @param request A pointer to the `ZydisEncoderRequest` struct, that receives
|
|
* information necessary for encoder to re-encode the instruction.
|
|
*
|
|
* This function performs simple structure conversion and does minimal sanity checks on the
|
|
* input. There's no guarantee that produced request will be accepted by
|
|
* `ZydisEncoderEncodeInstruction` if malformed `ZydisDecodedInstruction` or malformed
|
|
* `ZydisDecodedOperands` is passed to this function.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisEncoderDecodedInstructionToEncoderRequest(
|
|
const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,
|
|
ZyanU8 operand_count, ZydisEncoderRequest* request);
|
|
|
|
/**
|
|
* Fills provided buffer with `NOP` instructions using longest possible multi-byte instructions.
|
|
*
|
|
* @param buffer A pointer to the output buffer receiving encoded instructions.
|
|
* @param length Size of the output buffer.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisEncoderNopFill(void *buffer, ZyanUSize length);
|
|
|
|
/** @} */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_ENCODER_H */
|
|
#endif
|
|
|
|
#if !defined(ZYDIS_DISABLE_FORMATTER)
|
|
|
|
//
|
|
// Header: Zydis/Formatter.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
|
|
|
|
//
|
|
// Header: Zycore/String.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Formatter.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Core Library (Zycore-C)
|
|
|
|
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
|
|
* Implements a string type.
|
|
*/
|
|
|
|
#ifndef ZYCORE_STRING_H
|
|
#define ZYCORE_STRING_H
|
|
|
|
|
|
//
|
|
// Header: Zycore/Allocator.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Formatter.h
|
|
// - Zycore/String.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Core Library (Zycore-C)
|
|
|
|
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
|
|
* @brief
|
|
*/
|
|
|
|
#ifndef ZYCORE_ALLOCATOR_H
|
|
#define ZYCORE_ALLOCATOR_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
struct ZyanAllocator_;
|
|
|
|
/**
|
|
* Defines the `ZyanAllocatorAllocate` function prototype.
|
|
*
|
|
* @param allocator A pointer to the `ZyanAllocator` instance.
|
|
* @param p Receives a pointer to the first memory block sufficient to hold an
|
|
* array of `n` elements with a size of `element_size`.
|
|
* @param element_size The size of a single element.
|
|
* @param n The number of elements to allocate storage for.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This prototype is used for the `allocate()` and `reallocate()` functions.
|
|
*
|
|
* The result of the `reallocate()` function is undefined, if `p` does not point to a memory block
|
|
* previously obtained by `(re-)allocate()`.
|
|
*/
|
|
typedef ZyanStatus (*ZyanAllocatorAllocate)(struct ZyanAllocator_* allocator, void** p,
|
|
ZyanUSize element_size, ZyanUSize n);
|
|
|
|
/**
|
|
* Defines the `ZyanAllocatorDeallocate` function prototype.
|
|
*
|
|
* @param allocator A pointer to the `ZyanAllocator` instance.
|
|
* @param p The pointer obtained from `(re-)allocate()`.
|
|
* @param element_size The size of a single element.
|
|
* @param n The number of elements earlier passed to `(re-)allocate()`.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
typedef ZyanStatus (*ZyanAllocatorDeallocate)(struct ZyanAllocator_* allocator, void* p,
|
|
ZyanUSize element_size, ZyanUSize n);
|
|
|
|
/**
|
|
* Defines the `ZyanAllocator` struct.
|
|
*
|
|
* This is the base class for all custom allocator implementations.
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may lead to unexpected
|
|
* behavior.
|
|
*/
|
|
typedef struct ZyanAllocator_
|
|
{
|
|
/**
|
|
* The allocate function.
|
|
*/
|
|
ZyanAllocatorAllocate allocate;
|
|
/**
|
|
* The reallocate function.
|
|
*/
|
|
ZyanAllocatorAllocate reallocate;
|
|
/**
|
|
* The deallocate function.
|
|
*/
|
|
ZyanAllocatorDeallocate deallocate;
|
|
} ZyanAllocator;
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Initializes the given `ZyanAllocator` instance.
|
|
*
|
|
* @param allocator A pointer to the `ZyanAllocator` instance.
|
|
* @param allocate The allocate function.
|
|
* @param reallocate The reallocate function.
|
|
* @param deallocate The deallocate function.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanAllocatorInit(ZyanAllocator* allocator, ZyanAllocatorAllocate allocate,
|
|
ZyanAllocatorAllocate reallocate, ZyanAllocatorDeallocate deallocate);
|
|
|
|
#ifndef ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Returns the default `ZyanAllocator` instance.
|
|
*
|
|
* @return A pointer to the default `ZyanAllocator` instance.
|
|
*
|
|
* The default allocator uses the default memory manager to allocate memory on the heap.
|
|
*
|
|
* You should in no case modify the returned allocator instance to avoid unexpected behavior.
|
|
*/
|
|
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanAllocator* ZyanAllocatorDefault(void);
|
|
|
|
#endif // ZYAN_NO_LIBC
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYCORE_ALLOCATOR_H */
|
|
|
|
//
|
|
// Header: Zycore/Vector.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Formatter.h
|
|
// - Zycore/String.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Core Library (Zycore-C)
|
|
|
|
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
|
|
* Implements the vector container class.
|
|
*/
|
|
|
|
#ifndef ZYCORE_VECTOR_H
|
|
#define ZYCORE_VECTOR_H
|
|
|
|
|
|
//
|
|
// Header: Zycore/Comparison.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Formatter.h
|
|
// - Zycore/String.h
|
|
// - Zycore/Vector.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Core Library (Zycore-C)
|
|
|
|
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
|
|
* Defines prototypes of general-purpose comparison functions.
|
|
*/
|
|
|
|
#ifndef ZYCORE_COMPARISON_H
|
|
#define ZYCORE_COMPARISON_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Defines the `ZyanEqualityComparison` function prototype.
|
|
*
|
|
* @param left A pointer to the first element.
|
|
* @param right A pointer to the second element.
|
|
*
|
|
* @return This function should return `ZYAN_TRUE` if the `left` element equals the `right` one
|
|
* or `ZYAN_FALSE`, if not.
|
|
*/
|
|
typedef ZyanBool (*ZyanEqualityComparison)(const void* left, const void* right);
|
|
|
|
/**
|
|
* Defines the `ZyanComparison` function prototype.
|
|
*
|
|
* @param left A pointer to the first element.
|
|
* @param right A pointer to the second element.
|
|
*
|
|
* @return This function should return values in the following range:
|
|
* `left == right -> result == 0`
|
|
* `left < right -> result < 0`
|
|
* `left > right -> result > 0`
|
|
*/
|
|
typedef ZyanI32 (*ZyanComparison)(const void* left, const void* right);
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Equality comparison functions */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Declares a generic equality comparison function for an integral data-type.
|
|
*
|
|
* @param name The name of the function.
|
|
* @param type The name of the integral data-type.
|
|
*/
|
|
#define ZYAN_DECLARE_EQUALITY_COMPARISON(name, type) \
|
|
ZyanBool name(const type* left, const type* right) \
|
|
{ \
|
|
ZYAN_ASSERT(left); \
|
|
ZYAN_ASSERT(right); \
|
|
\
|
|
return (*left == *right) ? ZYAN_TRUE : ZYAN_FALSE; \
|
|
}
|
|
|
|
/**
|
|
* Declares a generic equality comparison function that compares a single integral
|
|
* data-type field of a struct.
|
|
*
|
|
* @param name The name of the function.
|
|
* @param type The name of the integral data-type.
|
|
* @param field_name The name of the struct field.
|
|
*/
|
|
#define ZYAN_DECLARE_EQUALITY_COMPARISON_FOR_FIELD(name, type, field_name) \
|
|
ZyanBool name(const type* left, const type* right) \
|
|
{ \
|
|
ZYAN_ASSERT(left); \
|
|
ZYAN_ASSERT(right); \
|
|
\
|
|
return (left->field_name == right->field_name) ? ZYAN_TRUE : ZYAN_FALSE; \
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Comparison functions */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Declares a generic comparison function for an integral data-type.
|
|
*
|
|
* @param name The name of the function.
|
|
* @param type The name of the integral data-type.
|
|
*/
|
|
#define ZYAN_DECLARE_COMPARISON(name, type) \
|
|
ZyanI32 name(const type* left, const type* right) \
|
|
{ \
|
|
ZYAN_ASSERT(left); \
|
|
ZYAN_ASSERT(right); \
|
|
\
|
|
if (*left < *right) \
|
|
{ \
|
|
return -1; \
|
|
} \
|
|
if (*left > *right) \
|
|
{ \
|
|
return 1; \
|
|
} \
|
|
return 0; \
|
|
}
|
|
|
|
/**
|
|
* Declares a generic comparison function that compares a single integral data-type field
|
|
* of a struct.
|
|
*
|
|
* @param name The name of the function.
|
|
* @param type The name of the integral data-type.
|
|
* @param field_name The name of the struct field.
|
|
*/
|
|
#define ZYAN_DECLARE_COMPARISON_FOR_FIELD(name, type, field_name) \
|
|
ZyanI32 name(const type* left, const type* right) \
|
|
{ \
|
|
ZYAN_ASSERT(left); \
|
|
ZYAN_ASSERT(right); \
|
|
\
|
|
if (left->field_name < right->field_name) \
|
|
{ \
|
|
return -1; \
|
|
} \
|
|
if (left->field_name > right->field_name) \
|
|
{ \
|
|
return 1; \
|
|
} \
|
|
return 0; \
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Default equality comparison functions */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines a default equality comparison function for pointer values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
|
|
* not.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsPointer, void* const)
|
|
|
|
/**
|
|
* Defines a default equality comparison function for `ZyanBool` values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
|
|
* not.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsBool, ZyanBool)
|
|
|
|
/**
|
|
* Defines a default equality comparison function for 8-bit numeric values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
|
|
* not.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric8, ZyanU8)
|
|
|
|
/**
|
|
* Defines a default equality comparison function for 16-bit numeric values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
|
|
* not.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric16, ZyanU16)
|
|
|
|
/**
|
|
* Defines a default equality comparison function for 32-bit numeric values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
|
|
* not.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric32, ZyanU32)
|
|
|
|
/**
|
|
* Defines a default equality comparison function for 64-bit numeric values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if
|
|
* not.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric64, ZyanU64)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Default comparison functions */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines a default comparison function for pointer values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
|
|
* less than the `right` one, or `1` if the `left` value is greater than the `right` one.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanComparePointer, void* const)
|
|
|
|
/**
|
|
* Defines a default comparison function for `ZyanBool` values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
|
|
* less than the `right` one, or `1` if the `left` value is greater than the `right` one.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareBool, ZyanBool)
|
|
|
|
/**
|
|
* Defines a default comparison function for 8-bit numeric values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
|
|
* less than the `right` one, or `1` if the `left` value is greater than the `right` one.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric8, ZyanU8)
|
|
|
|
/**
|
|
* Defines a default comparison function for 16-bit numeric values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
|
|
* less than the `right` one, or `1` if the `left` value is greater than the `right` one.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric16, ZyanU16)
|
|
|
|
/**
|
|
* Defines a default comparison function for 32-bit numeric values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
|
|
* less than the `right` one, or `1` if the `left` value is greater than the `right` one.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric32, ZyanU32)
|
|
|
|
/**
|
|
* Defines a default comparison function for 64-bit numeric values.
|
|
*
|
|
* @param left A pointer to the first value.
|
|
* @param right A pointer to the second value.
|
|
*
|
|
* @return Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is
|
|
* less than the `right` one, or `1` if the `left` value is greater than the `right` one.
|
|
*/
|
|
ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric64, ZyanU64)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYCORE_COMPARISON_H */
|
|
|
|
//
|
|
// Header: Zycore/Object.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Formatter.h
|
|
// - Zycore/String.h
|
|
// - Zycore/Vector.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Core Library (Zycore-C)
|
|
|
|
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
|
|
* Defines some generic object-related datatypes.
|
|
*/
|
|
|
|
#ifndef ZYCORE_OBJECT_H
|
|
#define ZYCORE_OBJECT_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Defines the `ZyanMemberProcedure` function prototype.
|
|
*
|
|
* @param object A pointer to the object.
|
|
*/
|
|
typedef void (*ZyanMemberProcedure)(void* object);
|
|
|
|
/**
|
|
* Defines the `ZyanConstMemberProcedure` function prototype.
|
|
*
|
|
* @param object A pointer to the object.
|
|
*/
|
|
typedef void (*ZyanConstMemberProcedure)(const void* object);
|
|
|
|
/**
|
|
* Defines the `ZyanMemberFunction` function prototype.
|
|
*
|
|
* @param object A pointer to the object.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
typedef ZyanStatus (*ZyanMemberFunction)(void* object);
|
|
|
|
/**
|
|
* Defines the `ZyanConstMemberFunction` function prototype.
|
|
*
|
|
* @param object A pointer to the object.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
typedef ZyanStatus (*ZyanConstMemberFunction)(const void* object);
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYCORE_OBJECT_H */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Constants */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* The initial minimum capacity (number of elements) for all dynamically allocated vector
|
|
* instances.
|
|
*/
|
|
#define ZYAN_VECTOR_MIN_CAPACITY 1
|
|
|
|
/**
|
|
* The default growth factor for all vector instances.
|
|
*/
|
|
#define ZYAN_VECTOR_DEFAULT_GROWTH_FACTOR 2
|
|
|
|
/**
|
|
* The default shrink threshold for all vector instances.
|
|
*/
|
|
#define ZYAN_VECTOR_DEFAULT_SHRINK_THRESHOLD 4
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Defines the `ZyanVector` struct.
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may lead to unexpected
|
|
* behavior.
|
|
*/
|
|
typedef struct ZyanVector_
|
|
{
|
|
/**
|
|
* The memory allocator.
|
|
*/
|
|
ZyanAllocator* allocator;
|
|
/**
|
|
* The growth factor.
|
|
*/
|
|
ZyanU8 growth_factor;
|
|
/**
|
|
* The shrink threshold.
|
|
*/
|
|
ZyanU8 shrink_threshold;
|
|
/**
|
|
* The current number of elements in the vector.
|
|
*/
|
|
ZyanUSize size;
|
|
/**
|
|
* The maximum capacity (number of elements).
|
|
*/
|
|
ZyanUSize capacity;
|
|
/**
|
|
* The size of a single element in bytes.
|
|
*/
|
|
ZyanUSize element_size;
|
|
/**
|
|
* The element destructor callback.
|
|
*/
|
|
ZyanMemberProcedure destructor;
|
|
/**
|
|
* The data pointer.
|
|
*/
|
|
void* data;
|
|
} ZyanVector;
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* General */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines an uninitialized `ZyanVector` instance.
|
|
*/
|
|
#define ZYAN_VECTOR_INITIALIZER \
|
|
{ \
|
|
/* allocator */ ZYAN_NULL, \
|
|
/* growth_factor */ 0, \
|
|
/* shrink_threshold */ 0, \
|
|
/* size */ 0, \
|
|
/* capacity */ 0, \
|
|
/* element_size */ 0, \
|
|
/* destructor */ ZYAN_NULL, \
|
|
/* data */ ZYAN_NULL \
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Helper macros */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the value of the element at the given `index`.
|
|
*
|
|
* @param type The desired value type.
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The element index.
|
|
*
|
|
* @result The value of the desired element in the vector.
|
|
*
|
|
* Note that this function is unsafe and might dereference a null-pointer.
|
|
*/
|
|
#ifdef __cplusplus
|
|
#define ZYAN_VECTOR_GET(type, vector, index) \
|
|
(*reinterpret_cast<const type*>(ZyanVectorGet(vector, index)))
|
|
#else
|
|
#define ZYAN_VECTOR_GET(type, vector, index) \
|
|
(*(const type*)ZyanVectorGet(vector, index))
|
|
#endif
|
|
|
|
/**
|
|
* Loops through all elements of the vector.
|
|
*
|
|
* @param type The desired value type.
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param item_name The name of the iterator item.
|
|
* @param body The body to execute for each item in the vector.
|
|
*/
|
|
#define ZYAN_VECTOR_FOREACH(type, vector, item_name, body) \
|
|
{ \
|
|
const ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \
|
|
for (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \
|
|
ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \
|
|
ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \
|
|
++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \
|
|
{ \
|
|
const type item_name = ZYAN_VECTOR_GET(type, vector, \
|
|
ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \
|
|
body \
|
|
} \
|
|
}
|
|
|
|
/**
|
|
* Loops through all elements of the vector.
|
|
*
|
|
* @param type The desired value type.
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param item_name The name of the iterator item.
|
|
* @param body The body to execute for each item in the vector.
|
|
*/
|
|
#define ZYAN_VECTOR_FOREACH_MUTABLE(type, vector, item_name, body) \
|
|
{ \
|
|
const ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \
|
|
for (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \
|
|
ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \
|
|
ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \
|
|
++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \
|
|
{ \
|
|
type* const item_name = ZyanVectorGetMutable(vector, \
|
|
ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \
|
|
body \
|
|
} \
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Constructor and destructor */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#ifndef ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes the given `ZyanVector` instance.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element_size The size of a single element in bytes.
|
|
* @param capacity The initial capacity (number of elements).
|
|
* @param destructor A destructor callback that is invoked every time an item is deleted, or
|
|
* `ZYAN_NULL` if not needed.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The memory for the vector elements is dynamically allocated by the default allocator using the
|
|
* default growth factor and the default shrink threshold.
|
|
*
|
|
* Finalization with `ZyanVectorDestroy` is required for all instances created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorInit(ZyanVector* vector,
|
|
ZyanUSize element_size, ZyanUSize capacity, ZyanMemberProcedure destructor);
|
|
|
|
#endif // ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes the given `ZyanVector` instance and sets a custom `allocator` and memory
|
|
* allocation/deallocation parameters.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element_size The size of a single element in bytes.
|
|
* @param capacity The initial capacity (number of elements).
|
|
* @param destructor A destructor callback that is invoked every time an item is deleted,
|
|
* or `ZYAN_NULL` if not needed.
|
|
* @param allocator A pointer to a `ZyanAllocator` instance.
|
|
* @param growth_factor The growth factor.
|
|
* @param shrink_threshold The shrink threshold.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* A growth factor of `1` disables overallocation and a shrink threshold of `0` disables
|
|
* dynamic shrinking.
|
|
*
|
|
* Finalization with `ZyanVectorDestroy` is required for all instances created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorInitEx(ZyanVector* vector, ZyanUSize element_size,
|
|
ZyanUSize capacity, ZyanMemberProcedure destructor, ZyanAllocator* allocator,
|
|
ZyanU8 growth_factor, ZyanU8 shrink_threshold);
|
|
|
|
/**
|
|
* Initializes the given `ZyanVector` instance and configures it to use a custom user
|
|
* defined buffer with a fixed size.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element_size The size of a single element in bytes.
|
|
* @param buffer A pointer to the buffer that is used as storage for the elements.
|
|
* @param capacity The maximum capacity (number of elements) of the buffer.
|
|
* @param destructor A destructor callback that is invoked every time an item is deleted, or
|
|
* `ZYAN_NULL` if not needed.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* Finalization is not required for instances created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorInitCustomBuffer(ZyanVector* vector, ZyanUSize element_size,
|
|
void* buffer, ZyanUSize capacity, ZyanMemberProcedure destructor);
|
|
|
|
/**
|
|
* Destroys the given `ZyanVector` instance.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance..
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorDestroy(ZyanVector* vector);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Duplication */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#ifndef ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes a new `ZyanVector` instance by duplicating an existing vector.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanVector` instance.
|
|
* @param source A pointer to the source vector.
|
|
* @param capacity The initial capacity (number of elements).
|
|
*
|
|
* This value is automatically adjusted to the size of the source vector, if
|
|
* a smaller value was passed.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The memory for the vector is dynamically allocated by the default allocator using the default
|
|
* growth factor and the default shrink threshold.
|
|
*
|
|
* Finalization with `ZyanVectorDestroy` is required for all instances created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorDuplicate(ZyanVector* destination,
|
|
const ZyanVector* source, ZyanUSize capacity);
|
|
|
|
#endif // ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes a new `ZyanVector` instance by duplicating an existing vector and sets a
|
|
* custom `allocator` and memory allocation/deallocation parameters.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanVector` instance.
|
|
* @param source A pointer to the source vector.
|
|
* @param capacity The initial capacity (number of elements).
|
|
|
|
* This value is automatically adjusted to the size of the source
|
|
* vector, if a smaller value was passed.
|
|
* @param allocator A pointer to a `ZyanAllocator` instance.
|
|
* @param growth_factor The growth factor.
|
|
* @param shrink_threshold The shrink threshold.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* A growth factor of `1` disables overallocation and a shrink threshold of `0` disables
|
|
* dynamic shrinking.
|
|
*
|
|
* Finalization with `ZyanVectorDestroy` is required for all instances created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateEx(ZyanVector* destination, const ZyanVector* source,
|
|
ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold);
|
|
|
|
/**
|
|
* Initializes a new `ZyanVector` instance by duplicating an existing vector and
|
|
* configures it to use a custom user defined buffer with a fixed size.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanVector` instance.
|
|
* @param source A pointer to the source vector.
|
|
* @param buffer A pointer to the buffer that is used as storage for the elements.
|
|
* @param capacity The maximum capacity (number of elements) of the buffer.
|
|
|
|
* This function will fail, if the capacity of the buffer is less than the
|
|
* size of the source vector.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* Finalization is not required for instances created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateCustomBuffer(ZyanVector* destination,
|
|
const ZyanVector* source, void* buffer, ZyanUSize capacity);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Element access */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns a constant pointer to the element at the given `index`.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The element index.
|
|
*
|
|
* @return A constant pointer to the desired element in the vector or `ZYAN_NULL`, if an error
|
|
* occurred.
|
|
*
|
|
* Note that the returned pointer might get invalid when the vector is resized by either a manual
|
|
* call to the memory-management functions or implicitly by inserting or removing elements.
|
|
*
|
|
* Take a look at `ZyanVectorGetPointer` instead, if you need a function that returns a zyan status
|
|
* code.
|
|
*/
|
|
ZYCORE_EXPORT const void* ZyanVectorGet(const ZyanVector* vector, ZyanUSize index);
|
|
|
|
/**
|
|
* Returns a mutable pointer to the element at the given `index`.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The element index.
|
|
*
|
|
* @return A mutable pointer to the desired element in the vector or `ZYAN_NULL`, if an error
|
|
* occurred.
|
|
*
|
|
* Note that the returned pointer might get invalid when the vector is resized by either a manual
|
|
* call to the memory-management functions or implicitly by inserting or removing elements.
|
|
*
|
|
* Take a look at `ZyanVectorGetPointerMutable` instead, if you need a function that returns a
|
|
* zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT void* ZyanVectorGetMutable(const ZyanVector* vector, ZyanUSize index);
|
|
|
|
/**
|
|
* Returns a constant pointer to the element at the given `index`.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The element index.
|
|
* @param value Receives a constant pointer to the desired element in the vector.
|
|
*
|
|
* Note that the returned pointer might get invalid when the vector is resized by either a manual
|
|
* call to the memory-management functions or implicitly by inserting or removing elements.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorGetPointer(const ZyanVector* vector, ZyanUSize index,
|
|
const void** value);
|
|
|
|
/**
|
|
* Returns a mutable pointer to the element at the given `index`.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The element index.
|
|
* @param value Receives a mutable pointer to the desired element in the vector.
|
|
*
|
|
* Note that the returned pointer might get invalid when the vector is resized by either a manual
|
|
* call to the memory-management functions or implicitly by inserting or removing elements.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorGetPointerMutable(const ZyanVector* vector, ZyanUSize index,
|
|
void** value);
|
|
|
|
/**
|
|
* Assigns a new value to the element at the given `index`.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The value index.
|
|
* @param value The value to assign.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorSet(ZyanVector* vector, ZyanUSize index,
|
|
const void* value);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Insertion */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Adds a new `element` to the end of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element A pointer to the element to add.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorPushBack(ZyanVector* vector, const void* element);
|
|
|
|
/**
|
|
* Inserts an `element` at the given `index` of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The insert index.
|
|
* @param element A pointer to the element to insert.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorInsert(ZyanVector* vector, ZyanUSize index,
|
|
const void* element);
|
|
|
|
/**
|
|
* Inserts multiple `elements` at the given `index` of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The insert index.
|
|
* @param elements A pointer to the first element.
|
|
* @param count The number of elements to insert.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorInsertRange(ZyanVector* vector, ZyanUSize index,
|
|
const void* elements, ZyanUSize count);
|
|
|
|
/**
|
|
* Constructs an `element` in-place at the end of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element Receives a pointer to the new element.
|
|
* @param constructor The constructor callback or `ZYAN_NULL`. The new element will be in
|
|
* undefined state, if no constructor was passed.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorEmplace(ZyanVector* vector, void** element,
|
|
ZyanMemberFunction constructor);
|
|
|
|
/**
|
|
* Constructs an `element` in-place and inserts it at the given `index` of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The insert index.
|
|
* @param element Receives a pointer to the new element.
|
|
* @param constructor The constructor callback or `ZYAN_NULL`. The new element will be in
|
|
* undefined state, if no constructor was passed.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorEmplaceEx(ZyanVector* vector, ZyanUSize index,
|
|
void** element, ZyanMemberFunction constructor);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Utils */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Swaps the element at `index_first` with the element at `index_second`.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index_first The index of the first element.
|
|
* @param index_second The index of the second element.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function requires the vector to have spare capacity for one temporary element. Call
|
|
* `ZyanVectorReserve` before this function to increase capacity, if needed.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorSwapElements(ZyanVector* vector, ZyanUSize index_first,
|
|
ZyanUSize index_second);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Deletion */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Deletes the element at the given `index` of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The element index.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorDelete(ZyanVector* vector, ZyanUSize index);
|
|
|
|
/**
|
|
* Deletes multiple elements from the given vector, starting at `index`.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param index The index of the first element to delete.
|
|
* @param count The number of elements to delete.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorDeleteRange(ZyanVector* vector, ZyanUSize index,
|
|
ZyanUSize count);
|
|
|
|
/**
|
|
* Removes the last element of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorPopBack(ZyanVector* vector);
|
|
|
|
/**
|
|
* Erases all elements of the given vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorClear(ZyanVector* vector);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Searching */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Sequentially searches for the first occurrence of `element` in the given vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element A pointer to the element to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the found element.
|
|
* @param comparison The comparison function to use.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic
|
|
* zyan status code if an error occurred.
|
|
*
|
|
* The `found_index` is set to `-1`, if the element was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorFind(const ZyanVector* vector, const void* element,
|
|
ZyanISize* found_index, ZyanEqualityComparison comparison);
|
|
|
|
/**
|
|
* Sequentially searches for the first occurrence of `element` in the given vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element A pointer to the element to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the found element.
|
|
* @param comparison The comparison function to use.
|
|
* @param index The start index.
|
|
* @param count The maximum number of elements to iterate, beginning from the start `index`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic
|
|
* zyan status code if an error occurred.
|
|
*
|
|
* The `found_index` is set to `-1`, if the element was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorFindEx(const ZyanVector* vector, const void* element,
|
|
ZyanISize* found_index, ZyanEqualityComparison comparison, ZyanUSize index, ZyanUSize count);
|
|
|
|
/**
|
|
* Searches for the first occurrence of `element` in the given vector using a binary-
|
|
* search algorithm.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element A pointer to the element to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the found element.
|
|
* @param comparison The comparison function to use.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic
|
|
* zyan status code if an error occurred.
|
|
*
|
|
* If found, `found_index` contains the zero-based index of `element`. If not found, `found_index`
|
|
* contains the index of the first entry larger than `element`.
|
|
*
|
|
* This function requires all elements in the vector to be strictly ordered (sorted).
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearch(const ZyanVector* vector, const void* element,
|
|
ZyanUSize* found_index, ZyanComparison comparison);
|
|
|
|
/**
|
|
* Searches for the first occurrence of `element` in the given vector using a binary-
|
|
* search algorithm.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param element A pointer to the element to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the found element.
|
|
* @param comparison The comparison function to use.
|
|
* @param index The start index.
|
|
* @param count The maximum number of elements to iterate, beginning from the start `index`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic
|
|
* zyan status code if an error occurred.
|
|
*
|
|
* If found, `found_index` contains the zero-based index of `element`. If not found, `found_index`
|
|
* contains the index of the first entry larger than `element`.
|
|
*
|
|
* This function requires all elements in the vector to be strictly ordered (sorted).
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearchEx(const ZyanVector* vector, const void* element,
|
|
ZyanUSize* found_index, ZyanComparison comparison, ZyanUSize index, ZyanUSize count);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Memory management */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Resizes the given `ZyanVector` instance.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param size The new size of the vector.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorResize(ZyanVector* vector, ZyanUSize size);
|
|
|
|
/**
|
|
* Resizes the given `ZyanVector` instance.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param size The new size of the vector.
|
|
* @param initializer A pointer to a value to be used as initializer for new items.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorResizeEx(ZyanVector* vector, ZyanUSize size,
|
|
const void* initializer);
|
|
|
|
/**
|
|
* Changes the capacity of the given `ZyanVector` instance.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param capacity The new minimum capacity of the vector.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorReserve(ZyanVector* vector, ZyanUSize capacity);
|
|
|
|
/**
|
|
* Shrinks the capacity of the given vector to match it's size.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorShrinkToFit(ZyanVector* vector);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Information */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the current capacity of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param capacity Receives the size of the vector.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorGetCapacity(const ZyanVector* vector, ZyanUSize* capacity);
|
|
|
|
/**
|
|
* Returns the current size of the vector.
|
|
*
|
|
* @param vector A pointer to the `ZyanVector` instance.
|
|
* @param size Receives the size of the vector.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanVectorGetSize(const ZyanVector* vector, ZyanUSize* size);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYCORE_VECTOR_H */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Constants */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* The initial minimum capacity (number of characters) for all dynamically allocated
|
|
* string instances - not including the terminating '\0'-character.
|
|
*/
|
|
#define ZYAN_STRING_MIN_CAPACITY 32
|
|
|
|
/**
|
|
* The default growth factor for all string instances.
|
|
*/
|
|
#define ZYAN_STRING_DEFAULT_GROWTH_FACTOR 2
|
|
|
|
/**
|
|
* The default shrink threshold for all string instances.
|
|
*/
|
|
#define ZYAN_STRING_DEFAULT_SHRINK_THRESHOLD 4
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* String flags */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZyanStringFlags` data-type.
|
|
*/
|
|
typedef ZyanU8 ZyanStringFlags;
|
|
|
|
/**
|
|
* The string uses a custom user-defined buffer with a fixed capacity.
|
|
*/
|
|
#define ZYAN_STRING_HAS_FIXED_CAPACITY 0x01 // (1 << 0)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* String */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZyanString` struct.
|
|
*
|
|
* The `ZyanString` type is implemented as a size-prefixed string - which allows for a lot of
|
|
* performance optimizations.
|
|
* Nevertheless null-termination is guaranteed at all times to provide maximum compatibility with
|
|
* default C-style strings (use `ZyanStringGetData` to access the C-style string).
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may lead to unexpected
|
|
* behavior.
|
|
*/
|
|
typedef struct ZyanString_
|
|
{
|
|
/**
|
|
* String flags.
|
|
*/
|
|
ZyanStringFlags flags;
|
|
/**
|
|
* The vector that contains the actual string.
|
|
*/
|
|
ZyanVector vector;
|
|
} ZyanString;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* View */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZyanStringView` struct.
|
|
*
|
|
* The `ZyanStringView` type provides a view inside a string (`ZyanString` instances, null-
|
|
* terminated C-style strings, or even not-null-terminated custom strings). A view is immutable
|
|
* by design and can't be directly converted to a C-style string.
|
|
*
|
|
* Views might become invalid (e.g. pointing to invalid memory), if the underlying string gets
|
|
* destroyed or resized.
|
|
*
|
|
* The `ZYAN_STRING_TO_VIEW` macro can be used to cast a `ZyanString` to a `ZyanStringView` pointer
|
|
* without any runtime overhead.
|
|
* Casting a view to a normal string is not supported and will lead to unexpected behavior (use
|
|
* `ZyanStringDuplicate` to create a deep-copy instead).
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may lead to unexpected
|
|
* behavior.
|
|
*/
|
|
typedef struct ZyanStringView_
|
|
{
|
|
/**
|
|
* The string data.
|
|
*
|
|
* The view internally re-uses the normal string struct to allow casts without any runtime
|
|
* overhead.
|
|
*/
|
|
ZyanString string;
|
|
} ZyanStringView;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* General */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines an uninitialized `ZyanString` instance.
|
|
*/
|
|
#define ZYAN_STRING_INITIALIZER \
|
|
{ \
|
|
/* flags */ 0, \
|
|
/* vector */ ZYAN_VECTOR_INITIALIZER \
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Helper macros */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Casts a `ZyanString` pointer to a constant `ZyanStringView` pointer.
|
|
*/
|
|
#define ZYAN_STRING_TO_VIEW(string) (const ZyanStringView*)(string)
|
|
|
|
/**
|
|
* Defines a `ZyanStringView` struct that provides a view into a static C-style string.
|
|
*
|
|
* @param string The C-style string.
|
|
*/
|
|
#define ZYAN_DEFINE_STRING_VIEW(string) \
|
|
{ \
|
|
/* string */ \
|
|
{ \
|
|
/* flags */ 0, \
|
|
/* vector */ \
|
|
{ \
|
|
/* allocator */ ZYAN_NULL, \
|
|
/* growth_factor */ 1, \
|
|
/* shrink_threshold */ 0, \
|
|
/* size */ sizeof(string), \
|
|
/* capacity */ sizeof(string), \
|
|
/* element_size */ sizeof(char), \
|
|
/* destructor */ ZYAN_NULL, \
|
|
/* data */ (char*)(string) \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Constructor and destructor */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#ifndef ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes the given `ZyanString` instance.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param capacity The initial capacity (number of characters).
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The memory for the string is dynamically allocated by the default allocator using the default
|
|
* growth factor and the default shrink threshold.
|
|
*
|
|
* The allocated buffer will be at least one character larger than the given `capacity`, to reserve
|
|
* space for the terminating '\0'.
|
|
*
|
|
* Finalization with `ZyanStringDestroy` is required for all strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringInit(ZyanString* string, ZyanUSize capacity);
|
|
|
|
#endif // ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes the given `ZyanString` instance and sets a custom `allocator` and memory
|
|
* allocation/deallocation parameters.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param capacity The initial capacity (number of characters).
|
|
* @param allocator A pointer to a `ZyanAllocator` instance.
|
|
* @param growth_factor The growth factor.
|
|
* @param shrink_threshold The shrink threshold.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* A growth factor of `1` disables overallocation and a shrink threshold of `0` disables
|
|
* dynamic shrinking.
|
|
*
|
|
* The allocated buffer will be at least one character larger than the given `capacity`, to reserve
|
|
* space for the terminating '\0'.
|
|
*
|
|
* Finalization with `ZyanStringDestroy` is required for all strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringInitEx(ZyanString* string, ZyanUSize capacity,
|
|
ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold);
|
|
|
|
/**
|
|
* Initializes the given `ZyanString` instance and configures it to use a custom user
|
|
* defined buffer with a fixed size.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param buffer A pointer to the buffer that is used as storage for the string.
|
|
* @param capacity The maximum capacity (number of characters) of the buffer, including
|
|
* the terminating '\0'.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* Finalization is not required for strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringInitCustomBuffer(ZyanString* string, char* buffer,
|
|
ZyanUSize capacity);
|
|
|
|
/**
|
|
* Destroys the given `ZyanString` instance.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringDestroy(ZyanString* string);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Duplication */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#ifndef ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes a new `ZyanString` instance by duplicating an existing string.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanString` instance.
|
|
* @param source A pointer to the source string.
|
|
* @param capacity The initial capacity (number of characters).
|
|
*
|
|
* This value is automatically adjusted to the size of the source string, if
|
|
* a smaller value was passed.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The behavior of this function is undefined, if `source` is a view into the `destination`
|
|
* string or `destination` points to an already initialized `ZyanString` instance.
|
|
*
|
|
* The memory for the string is dynamically allocated by the default allocator using the default
|
|
* growth factor and the default shrink threshold.
|
|
*
|
|
* The allocated buffer will be at least one character larger than the given `capacity`, to reserve
|
|
* space for the terminating '\0'.
|
|
*
|
|
* Finalization with `ZyanStringDestroy` is required for all strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringDuplicate(ZyanString* destination,
|
|
const ZyanStringView* source, ZyanUSize capacity);
|
|
|
|
#endif // ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes a new `ZyanString` instance by duplicating an existing string and sets a
|
|
* custom `allocator` and memory allocation/deallocation parameters.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanString` instance.
|
|
* @param source A pointer to the source string.
|
|
* @param capacity The initial capacity (number of characters).
|
|
|
|
* This value is automatically adjusted to the size of the source
|
|
* string, if a smaller value was passed.
|
|
* @param allocator A pointer to a `ZyanAllocator` instance.
|
|
* @param growth_factor The growth factor.
|
|
* @param shrink_threshold The shrink threshold.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The behavior of this function is undefined, if `source` is a view into the `destination`
|
|
* string or `destination` points to an already initialized `ZyanString` instance.
|
|
*
|
|
* A growth factor of `1` disables overallocation and a shrink threshold of `0` disables
|
|
* dynamic shrinking.
|
|
*
|
|
* The allocated buffer will be at least one character larger than the given `capacity`, to reserve
|
|
* space for the terminating '\0'.
|
|
*
|
|
* Finalization with `ZyanStringDestroy` is required for all strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringDuplicateEx(ZyanString* destination,
|
|
const ZyanStringView* source, ZyanUSize capacity, ZyanAllocator* allocator,
|
|
ZyanU8 growth_factor, ZyanU8 shrink_threshold);
|
|
|
|
/**
|
|
* Initializes a new `ZyanString` instance by duplicating an existing string and
|
|
* configures it to use a custom user defined buffer with a fixed size.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanString` instance.
|
|
* @param source A pointer to the source string.
|
|
* @param buffer A pointer to the buffer that is used as storage for the string.
|
|
* @param capacity The maximum capacity (number of characters) of the buffer, including the
|
|
* terminating '\0'.
|
|
|
|
* This function will fail, if the capacity of the buffer is less or equal to
|
|
* the size of the source string.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The behavior of this function is undefined, if `source` is a view into the `destination`
|
|
* string or `destination` points to an already initialized `ZyanString` instance.
|
|
*
|
|
* Finalization is not required for strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringDuplicateCustomBuffer(ZyanString* destination,
|
|
const ZyanStringView* source, char* buffer, ZyanUSize capacity);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Concatenation */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#ifndef ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes a new `ZyanString` instance by concatenating two existing strings.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanString` instance.
|
|
*
|
|
* This function will fail, if the destination `ZyanString` instance equals
|
|
* one of the source strings.
|
|
* @param s1 A pointer to the first source string.
|
|
* @param s2 A pointer to the second source string.
|
|
* @param capacity The initial capacity (number of characters).
|
|
|
|
* This value is automatically adjusted to the combined size of the source
|
|
* strings, if a smaller value was passed.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`
|
|
* string or `destination` points to an already initialized `ZyanString` instance.
|
|
*
|
|
* The memory for the string is dynamically allocated by the default allocator using the default
|
|
* growth factor and the default shrink threshold.
|
|
*
|
|
* The allocated buffer will be at least one character larger than the given `capacity`, to reserve
|
|
* space for the terminating '\0'.
|
|
*
|
|
* Finalization with `ZyanStringDestroy` is required for all strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringConcat(ZyanString* destination,
|
|
const ZyanStringView* s1, const ZyanStringView* s2, ZyanUSize capacity);
|
|
|
|
#endif // ZYAN_NO_LIBC
|
|
|
|
/**
|
|
* Initializes a new `ZyanString` instance by concatenating two existing strings and sets
|
|
* a custom `allocator` and memory allocation/deallocation parameters.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanString` instance.
|
|
*
|
|
* This function will fail, if the destination `ZyanString` instance
|
|
* equals one of the source strings.
|
|
* @param s1 A pointer to the first source string.
|
|
* @param s2 A pointer to the second source string.
|
|
* @param capacity The initial capacity (number of characters).
|
|
*
|
|
* This value is automatically adjusted to the combined size of the
|
|
* source strings, if a smaller value was passed.
|
|
* @param allocator A pointer to a `ZyanAllocator` instance.
|
|
* @param growth_factor The growth factor.
|
|
* @param shrink_threshold The shrink threshold.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`
|
|
* string or `destination` points to an already initialized `ZyanString` instance.
|
|
*
|
|
* A growth factor of `1` disables overallocation and a shrink threshold of `0` disables
|
|
* dynamic shrinking.
|
|
*
|
|
* The allocated buffer will be at least one character larger than the given `capacity`, to reserve
|
|
* space for the terminating '\0'.
|
|
*
|
|
* Finalization with `ZyanStringDestroy` is required for all strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringConcatEx(ZyanString* destination, const ZyanStringView* s1,
|
|
const ZyanStringView* s2, ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor,
|
|
ZyanU8 shrink_threshold);
|
|
|
|
/**
|
|
* Initializes a new `ZyanString` instance by concatenating two existing strings and
|
|
* configures it to use a custom user defined buffer with a fixed size.
|
|
*
|
|
* @param destination A pointer to the (uninitialized) destination `ZyanString` instance.
|
|
*
|
|
* This function will fail, if the destination `ZyanString` instance equals
|
|
* one of the source strings.
|
|
* @param s1 A pointer to the first source string.
|
|
* @param s2 A pointer to the second source string.
|
|
* @param buffer A pointer to the buffer that is used as storage for the string.
|
|
* @param capacity The maximum capacity (number of characters) of the buffer.
|
|
*
|
|
* This function will fail, if the capacity of the buffer is less or equal to
|
|
* the combined size of the source strings.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`
|
|
* string or `destination` points to an already initialized `ZyanString` instance.
|
|
*
|
|
* Finalization is not required for strings created by this function.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringConcatCustomBuffer(ZyanString* destination,
|
|
const ZyanStringView* s1, const ZyanStringView* s2, char* buffer, ZyanUSize capacity);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Views */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns a view inside an existing view/string.
|
|
*
|
|
* @param view A pointer to the `ZyanStringView` instance.
|
|
* @param source A pointer to the source string.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The `ZYAN_STRING_TO_VEW` macro can be used to pass any `ZyanString` instance as value for the
|
|
* `source` string.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideView(ZyanStringView* view,
|
|
const ZyanStringView* source);
|
|
|
|
/**
|
|
* Returns a view inside an existing view/string starting from the given `index`.
|
|
*
|
|
* @param view A pointer to the `ZyanStringView` instance.
|
|
* @param source A pointer to the source string.
|
|
* @param index The start index.
|
|
* @param count The number of characters.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* The `ZYAN_STRING_TO_VEW` macro can be used to pass any `ZyanString` instance as value for the
|
|
* `source` string.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideViewEx(ZyanStringView* view,
|
|
const ZyanStringView* source, ZyanUSize index, ZyanUSize count);
|
|
|
|
/**
|
|
* Returns a view inside a null-terminated C-style string.
|
|
*
|
|
* @param view A pointer to the `ZyanStringView` instance.
|
|
* @param string The C-style string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideBuffer(ZyanStringView* view, const char* string);
|
|
|
|
/**
|
|
* Returns a view inside a character buffer with custom length.
|
|
*
|
|
* @param view A pointer to the `ZyanStringView` instance.
|
|
* @param buffer A pointer to the buffer containing the string characters.
|
|
* @param length The length of the string (number of characters).
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideBufferEx(ZyanStringView* view, const char* buffer,
|
|
ZyanUSize length);
|
|
|
|
/**
|
|
* Returns the size (number of characters) of the view.
|
|
*
|
|
* @param view A pointer to the `ZyanStringView` instance.
|
|
* @param size Receives the size (number of characters) of the view.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringViewGetSize(const ZyanStringView* view, ZyanUSize* size);
|
|
|
|
/**
|
|
* Returns the C-style string of the given `ZyanString` instance.
|
|
*
|
|
* @warning The string is not guaranteed to be null terminated!
|
|
*
|
|
* @param view A pointer to the `ZyanStringView` instance.
|
|
* @param buffer Receives a pointer to the C-style string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringViewGetData(const ZyanStringView* view, const char** buffer);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Character access */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the character at the given `index`.
|
|
*
|
|
* @param string A pointer to the `ZyanStringView` instance.
|
|
* @param index The character index.
|
|
* @param value Receives the desired character of the string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringGetChar(const ZyanStringView* string, ZyanUSize index,
|
|
char* value);
|
|
|
|
/**
|
|
* Returns a pointer to the character at the given `index`.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param index The character index.
|
|
* @param value Receives a pointer to the desired character in the string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringGetCharMutable(ZyanString* string, ZyanUSize index,
|
|
char** value);
|
|
|
|
/**
|
|
* Assigns a new value to the character at the given `index`.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param index The character index.
|
|
* @param value The character to assign.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringSetChar(ZyanString* string, ZyanUSize index, char value);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Insertion */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Inserts the content of the source string in the destination string at the given `index`.
|
|
*
|
|
* @param destination The destination string.
|
|
* @param index The insert index.
|
|
* @param source The source string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringInsert(ZyanString* destination, ZyanUSize index,
|
|
const ZyanStringView* source);
|
|
|
|
/**
|
|
* Inserts `count` characters of the source string in the destination string at the given
|
|
* `index`.
|
|
*
|
|
* @param destination The destination string.
|
|
* @param destination_index The insert index.
|
|
* @param source The source string.
|
|
* @param source_index The index of the first character to be inserted from the source
|
|
* string.
|
|
* @param count The number of chars to insert from the source string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringInsertEx(ZyanString* destination, ZyanUSize destination_index,
|
|
const ZyanStringView* source, ZyanUSize source_index, ZyanUSize count);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Appending */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Appends the content of the source string to the end of the destination string.
|
|
*
|
|
* @param destination The destination string.
|
|
* @param source The source string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringAppend(ZyanString* destination, const ZyanStringView* source);
|
|
|
|
/**
|
|
* Appends `count` characters of the source string to the end of the destination string.
|
|
*
|
|
* @param destination The destination string.
|
|
* @param source The source string.
|
|
* @param source_index The index of the first character to be appended from the source string.
|
|
* @param count The number of chars to append from the source string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringAppendEx(ZyanString* destination, const ZyanStringView* source,
|
|
ZyanUSize source_index, ZyanUSize count);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Deletion */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Deletes characters from the given string, starting at `index`.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param index The index of the first character to delete.
|
|
* @param count The number of characters to delete.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringDelete(ZyanString* string, ZyanUSize index, ZyanUSize count);
|
|
|
|
/**
|
|
* Deletes all remaining characters from the given string, starting at `index`.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param index The index of the first character to delete.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringTruncate(ZyanString* string, ZyanUSize index);
|
|
|
|
/**
|
|
* Erases the given string.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringClear(ZyanString* string);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Searching */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Searches for the first occurrence of `needle` in the given `haystack` starting from the
|
|
* left.
|
|
*
|
|
* @param haystack The string to search in.
|
|
* @param needle The sub-string to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the first occurrence of
|
|
* `needle`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occured.
|
|
*
|
|
* The `found_index` is set to `-1`, if the needle was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringLPos(const ZyanStringView* haystack,
|
|
const ZyanStringView* needle, ZyanISize* found_index);
|
|
|
|
/**
|
|
* Searches for the first occurrence of `needle` in the given `haystack` starting from the
|
|
* left.
|
|
*
|
|
* @param haystack The string to search in.
|
|
* @param needle The sub-string to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the first occurrence of
|
|
* `needle`.
|
|
* @param index The start index.
|
|
* @param count The maximum number of characters to iterate, beginning from the start
|
|
* `index`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occured.
|
|
*
|
|
* The `found_index` is set to `-1`, if the needle was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringLPosEx(const ZyanStringView* haystack,
|
|
const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);
|
|
|
|
/**
|
|
* Performs a case-insensitive search for the first occurrence of `needle` in the given
|
|
* `haystack` starting from the left.
|
|
*
|
|
* @param haystack The string to search in.
|
|
* @param needle The sub-string to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the first occurrence of
|
|
* `needle`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occured.
|
|
*
|
|
* The `found_index` is set to `-1`, if the needle was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringLPosI(const ZyanStringView* haystack,
|
|
const ZyanStringView* needle, ZyanISize* found_index);
|
|
|
|
/**
|
|
* Performs a case-insensitive search for the first occurrence of `needle` in the given
|
|
* `haystack` starting from the left.
|
|
*
|
|
* @param haystack The string to search in.
|
|
* @param needle The sub-string to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the first occurrence of
|
|
* `needle`.
|
|
* @param index The start index.
|
|
* @param count The maximum number of characters to iterate, beginning from the start
|
|
* `index`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occurred.
|
|
*
|
|
* The `found_index` is set to `-1`, if the needle was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringLPosIEx(const ZyanStringView* haystack,
|
|
const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);
|
|
|
|
/**
|
|
* Searches for the first occurrence of `needle` in the given `haystack` starting from the
|
|
* right.
|
|
*
|
|
* @param haystack The string to search in.
|
|
* @param needle The sub-string to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the first occurrence of
|
|
* `needle`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occurred.
|
|
*
|
|
* The `found_index` is set to `-1`, if the needle was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringRPos(const ZyanStringView* haystack,
|
|
const ZyanStringView* needle, ZyanISize* found_index);
|
|
|
|
/**
|
|
* Searches for the first occurrence of `needle` in the given `haystack` starting from the
|
|
* right.
|
|
*
|
|
* @param haystack The string to search in.
|
|
* @param needle The sub-string to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the first occurrence of
|
|
* `needle`.
|
|
* @param index The start index.
|
|
* @param count The maximum number of characters to iterate, beginning from the start
|
|
* `index`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occurred.
|
|
*
|
|
* The `found_index` is set to `-1`, if the needle was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringRPosEx(const ZyanStringView* haystack,
|
|
const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);
|
|
|
|
/**
|
|
* Performs a case-insensitive search for the first occurrence of `needle` in the given
|
|
* `haystack` starting from the right.
|
|
*
|
|
* @param haystack The string to search in.
|
|
* @param needle The sub-string to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the first occurrence of
|
|
* `needle`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occurred.
|
|
*
|
|
* The `found_index` is set to `-1`, if the needle was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringRPosI(const ZyanStringView* haystack,
|
|
const ZyanStringView* needle, ZyanISize* found_index);
|
|
|
|
/**
|
|
* Performs a case-insensitive search for the first occurrence of `needle` in the given
|
|
* `haystack` starting from the right.
|
|
*
|
|
* @param haystack The string to search in.
|
|
* @param needle The sub-string to search for.
|
|
* @param found_index A pointer to a variable that receives the index of the first occurrence of
|
|
* `needle`.
|
|
* @param index The start index.
|
|
* @param count The maximum number of characters to iterate, beginning from the start
|
|
* `index`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occurred.
|
|
*
|
|
* The `found_index` is set to `-1`, if the needle was not found.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringRPosIEx(const ZyanStringView* haystack,
|
|
const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Comparing */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Compares two strings.
|
|
*
|
|
* @param s1 The first string
|
|
* @param s2 The second string.
|
|
* @param result Receives the comparison result.
|
|
*
|
|
* Values:
|
|
* - `result < 0` -> The first character that does not match has a lower value
|
|
* in `s1` than in `s2`.
|
|
* - `result == 0` -> The contents of both strings are equal.
|
|
* - `result > 0` -> The first character that does not match has a greater value
|
|
* in `s1` than in `s2`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the strings are equal, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occurred.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringCompare(const ZyanStringView* s1, const ZyanStringView* s2,
|
|
ZyanI32* result);
|
|
|
|
/**
|
|
* Performs a case-insensitive comparison of two strings.
|
|
*
|
|
* @param s1 The first string
|
|
* @param s2 The second string.
|
|
* @param result Receives the comparison result.
|
|
*
|
|
* Values:
|
|
* - `result < 0` -> The first character that does not match has a lower value
|
|
* in `s1` than in `s2`.
|
|
* - `result == 0` -> The contents of both strings are equal.
|
|
* - `result > 0` -> The first character that does not match has a greater value
|
|
* in `s1` than in `s2`.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE`, if the strings are equal, `ZYAN_STATUS_FALSE`, if not, or another
|
|
* zyan status code, if an error occurred.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringCompareI(const ZyanStringView* s1, const ZyanStringView* s2,
|
|
ZyanI32* result);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Case conversion */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Converts the given string to lowercase letters.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
|
* `ZyanString` instance.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringToLowerCase(ZyanString* string);
|
|
|
|
/**
|
|
* Converts `count` characters of the given string to lowercase letters.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param index The start index.
|
|
* @param count The number of characters to convert, beginning from the start `index`.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
|
* `ZyanString` instance.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringToLowerCaseEx(ZyanString* string, ZyanUSize index,
|
|
ZyanUSize count);
|
|
|
|
/**
|
|
* Converts the given string to uppercase letters.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
|
* `ZyanString` instance.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringToUpperCase(ZyanString* string);
|
|
|
|
/**
|
|
* Converts `count` characters of the given string to uppercase letters.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param index The start index.
|
|
* @param count The number of characters to convert, beginning from the start `index`.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
|
* `ZyanString` instance.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringToUpperCaseEx(ZyanString* string, ZyanUSize index,
|
|
ZyanUSize count);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Memory management */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Resizes the given `ZyanString` instance.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param size The new size of the string.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
|
* `ZyanString` instance.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringResize(ZyanString* string, ZyanUSize size);
|
|
|
|
/**
|
|
* Changes the capacity of the given `ZyanString` instance.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param capacity The new minimum capacity of the string.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
|
* `ZyanString` instance.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringReserve(ZyanString* string, ZyanUSize capacity);
|
|
|
|
/**
|
|
* Shrinks the capacity of the given string to match it's size.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
|
* `ZyanString` instance.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringShrinkToFit(ZyanString* string);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Information */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the current capacity of the string.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param capacity Receives the size of the string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringGetCapacity(const ZyanString* string, ZyanUSize* capacity);
|
|
|
|
/**
|
|
* Returns the current size (number of characters) of the string (excluding the
|
|
* terminating zero character).
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param size Receives the size (number of characters) of the string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringGetSize(const ZyanString* string, ZyanUSize* size);
|
|
|
|
/**
|
|
* Returns the C-style string of the given `ZyanString` instance.
|
|
*
|
|
* @param string A pointer to the `ZyanString` instance.
|
|
* @param value Receives a pointer to the C-style string.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYCORE_EXPORT ZyanStatus ZyanStringGetData(const ZyanString* string, const char** value);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // ZYCORE_STRING_H
|
|
|
|
//
|
|
// Header: Zydis/FormatterBuffer.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
// - Zydis/Formatter.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Implements the `ZydisFormatterToken` type and provides functions to use it.
|
|
*/
|
|
|
|
#ifndef ZYDIS_FORMATTER_TOKEN_H
|
|
#define ZYDIS_FORMATTER_TOKEN_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Constants */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Token types */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisTokenType` data-type.
|
|
*/
|
|
typedef ZyanU8 ZydisTokenType;
|
|
|
|
#define ZYDIS_TOKEN_INVALID 0x00
|
|
/**
|
|
* A whitespace character.
|
|
*/
|
|
#define ZYDIS_TOKEN_WHITESPACE 0x01
|
|
/**
|
|
* A delimiter character (like `','`, `':'`, `'+'`, `'-'`, `'*'`).
|
|
*/
|
|
#define ZYDIS_TOKEN_DELIMITER 0x02
|
|
/**
|
|
* An opening parenthesis character (like `'('`, `'['`, `'{'`).
|
|
*/
|
|
#define ZYDIS_TOKEN_PARENTHESIS_OPEN 0x03
|
|
/**
|
|
* A closing parenthesis character (like `')'`, `']'`, `'}'`).
|
|
*/
|
|
#define ZYDIS_TOKEN_PARENTHESIS_CLOSE 0x04
|
|
/**
|
|
* A prefix literal (like `"LOCK"`, `"REP"`).
|
|
*/
|
|
#define ZYDIS_TOKEN_PREFIX 0x05
|
|
/**
|
|
* A mnemonic literal (like `"MOV"`, `"VCMPPSD"`, `"LCALL"`).
|
|
*/
|
|
#define ZYDIS_TOKEN_MNEMONIC 0x06
|
|
/**
|
|
* A register literal (like `"RAX"`, `"DS"`, `"%ECX"`).
|
|
*/
|
|
#define ZYDIS_TOKEN_REGISTER 0x07
|
|
/**
|
|
* An absolute address literal (like `0x00400000`).
|
|
*/
|
|
#define ZYDIS_TOKEN_ADDRESS_ABS 0x08
|
|
/**
|
|
* A relative address literal (like `-0x100`).
|
|
*/
|
|
#define ZYDIS_TOKEN_ADDRESS_REL 0x09
|
|
/**
|
|
* A displacement literal (like `0xFFFFFFFF`, `-0x100`, `+0x1234`).
|
|
*/
|
|
#define ZYDIS_TOKEN_DISPLACEMENT 0x0A
|
|
/**
|
|
* An immediate literal (like `0xC0`, `-0x1234`, `$0x0000`).
|
|
*/
|
|
#define ZYDIS_TOKEN_IMMEDIATE 0x0B
|
|
/**
|
|
* A typecast literal (like `DWORD PTR`).
|
|
*/
|
|
#define ZYDIS_TOKEN_TYPECAST 0x0C
|
|
/**
|
|
* A decorator literal (like `"Z"`, `"1TO4"`).
|
|
*/
|
|
#define ZYDIS_TOKEN_DECORATOR 0x0D
|
|
/**
|
|
* A symbol literal.
|
|
*/
|
|
#define ZYDIS_TOKEN_SYMBOL 0x0E
|
|
|
|
/**
|
|
* The base for user-defined token types.
|
|
*/
|
|
#define ZYDIS_TOKEN_USER 0x80
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Token */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
/**
|
|
* Defines the `ZydisFormatterToken` struct.
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may lead to unexpected
|
|
* behavior.
|
|
*/
|
|
typedef struct ZydisFormatterToken_
|
|
{
|
|
/**
|
|
* The token type.
|
|
*/
|
|
ZydisTokenType type;
|
|
/**
|
|
* An offset to the next token, or `0`.
|
|
*/
|
|
ZyanU8 next;
|
|
} ZydisFormatterToken;
|
|
|
|
#pragma pack(pop)
|
|
|
|
/**
|
|
* Defines the `ZydisFormatterTokenConst` data-type.
|
|
*/
|
|
typedef const ZydisFormatterToken ZydisFormatterTokenConst;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Buffer */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Defines the `ZydisFormatterBuffer` struct.
|
|
*
|
|
* All fields in this struct should be considered as "private". Any changes may
|
|
* lead to unexpected behavior.
|
|
*/
|
|
typedef struct ZydisFormatterBuffer_
|
|
{
|
|
/**
|
|
* `ZYAN_TRUE`, if the buffer contains a token stream or `ZYAN_FALSE, if it
|
|
* contains a simple string.
|
|
*/
|
|
ZyanBool is_token_list;
|
|
/**
|
|
* The remaining capacity of the buffer.
|
|
*/
|
|
ZyanUSize capacity;
|
|
/**
|
|
* The `ZyanString` instance that refers to the literal value of the most
|
|
* recently added token.
|
|
*/
|
|
ZyanString string;
|
|
} ZydisFormatterBuffer;
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Token */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the `type` and the string `value` of the given `token`.
|
|
*
|
|
* @param token A pointer to the `ZydisFormatterToken` struct.
|
|
* @param type Receives the token type.
|
|
* @param value Receives a pointer to the string value of the token.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenGetValue(const ZydisFormatterToken* token,
|
|
ZydisTokenType* type, ZyanConstCharPointer* value);
|
|
|
|
/**
|
|
* Obtains the next `token` linked to the passed one.
|
|
*
|
|
* @param token Receives a pointer to the next `ZydisFormatterToken` struct
|
|
* linked to the passed one.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenNext(ZydisFormatterTokenConst** token);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Buffer */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Returns the current (most recently added) token.
|
|
*
|
|
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
|
* @param token Receives a pointer to the current token.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function returns `ZYAN_STATUS_INVALID_OPERATION`, if the buffer does not contain at least
|
|
* one token.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferGetToken(const ZydisFormatterBuffer* buffer,
|
|
ZydisFormatterTokenConst** token);
|
|
|
|
/**
|
|
* Returns the `ZyanString` instance associated with the given buffer.
|
|
*
|
|
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
|
* @param string Receives a pointer to the `ZyanString` instance associated with the given
|
|
* buffer.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function returns `ZYAN_STATUS_INVALID_OPERATION`, if the buffer does not contain at least
|
|
* one token.
|
|
*
|
|
* The returned string always refers to the literal value of the current (most recently added)
|
|
* token and will remain valid until the buffer is destroyed.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferGetString(ZydisFormatterBuffer* buffer,
|
|
ZyanString** string);
|
|
|
|
/**
|
|
* Appends a new token to the `buffer`.
|
|
*
|
|
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
|
* @param type The type of the new token.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* Note that the `ZyanString` instance returned by `ZydisFormatterBufferGetString` will
|
|
* automatically be updated by calling this function.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferAppend(ZydisFormatterBuffer* buffer,
|
|
ZydisTokenType type);
|
|
|
|
/**
|
|
* Returns a snapshot of the buffer-state.
|
|
*
|
|
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
|
* @param state Receives a snapshot of the buffer-state.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* Note that the buffer-state is saved inside the buffer itself and thus becomes invalid as soon
|
|
* as the buffer gets overwritten or destroyed.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferRemember(const ZydisFormatterBuffer* buffer,
|
|
ZyanUPointer* state);
|
|
|
|
/**
|
|
* Restores a previously saved buffer-state.
|
|
*
|
|
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
|
* @param state The buffer-state to restore.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* All tokens added after obtaining the given `state` snapshot will be removed. This function
|
|
* does NOT restore any string content.
|
|
*
|
|
* Note that the `ZyanString` instance returned by `ZydisFormatterBufferGetString` will
|
|
* automatically be updated by calling this function.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferRestore(ZydisFormatterBuffer* buffer,
|
|
ZyanUPointer state);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_FORMATTER_TOKEN_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 */
|
|
#endif
|
|
|
|
#if !defined(ZYDIS_DISABLE_SEGMENT)
|
|
|
|
//
|
|
// Header: Zydis/Segment.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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 and types providing encoding information about individual instruction bytes.
|
|
*/
|
|
|
|
#ifndef ZYDIS_SEGMENT_H
|
|
#define ZYDIS_SEGMENT_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @addtogroup segment Segment
|
|
* Functions and types providing encoding information about individual instruction bytes.
|
|
* @{
|
|
*/
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Constants */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
#define ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT 9
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Defines the `ZydisInstructionSegment` struct.
|
|
*/
|
|
typedef enum ZydisInstructionSegment_
|
|
{
|
|
ZYDIS_INSTR_SEGMENT_NONE,
|
|
/**
|
|
* The legacy prefixes (including ignored `REX` prefixes).
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_PREFIXES,
|
|
/**
|
|
* The effective `REX` prefix byte.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_REX,
|
|
/**
|
|
* The `XOP` prefix bytes.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_XOP,
|
|
/**
|
|
* The `VEX` prefix bytes.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_VEX,
|
|
/**
|
|
* The `EVEX` prefix bytes.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_EVEX,
|
|
/**
|
|
* The `MVEX` prefix bytes.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_MVEX,
|
|
/**
|
|
* The opcode bytes.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_OPCODE,
|
|
/**
|
|
* The `ModRM` byte.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_MODRM,
|
|
/**
|
|
* The `SIB` byte.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_SIB,
|
|
/**
|
|
* The displacement bytes.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_DISPLACEMENT,
|
|
/**
|
|
* The immediate bytes.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_IMMEDIATE,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_MAX_VALUE = ZYDIS_INSTR_SEGMENT_IMMEDIATE,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_INSTR_SEGMENT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTR_SEGMENT_MAX_VALUE)
|
|
} ZydisInstructionSegment;
|
|
|
|
/**
|
|
* Defines the `ZydisInstructionSegments` struct.
|
|
*/
|
|
typedef struct ZydisInstructionSegments_
|
|
{
|
|
/**
|
|
* The number of logical instruction segments.
|
|
*/
|
|
ZyanU8 count;
|
|
struct
|
|
{
|
|
/**
|
|
* The type of the segment.
|
|
*/
|
|
ZydisInstructionSegment type;
|
|
/**
|
|
* The offset of the segment relative to the start of the instruction (in bytes).
|
|
*/
|
|
ZyanU8 offset;
|
|
/**
|
|
* The size of the segment, in bytes.
|
|
*/
|
|
ZyanU8 size;
|
|
} segments[ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT];
|
|
} ZydisInstructionSegments;
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Returns offsets and sizes of all logical instruction segments (e.g. `OPCODE`,
|
|
* `MODRM`, ...).
|
|
*
|
|
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
|
|
* @param segments Receives the instruction segments information.
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisGetInstructionSegments(const ZydisDecodedInstruction* instruction,
|
|
ZydisInstructionSegments* segments);
|
|
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_SEGMENT_H */
|
|
#endif
|
|
|
|
#if !defined(ZYDIS_DISABLE_DECODER) && !defined(ZYDIS_DISABLE_FORMATTER)
|
|
|
|
//
|
|
// Header: Zydis/Disassembler.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
Zyan Disassembler Library (Zydis)
|
|
|
|
Original Author : Joel Hoener
|
|
|
|
* 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
|
|
* All-in-one convenience function providing the simplest possible way to use Zydis.
|
|
*/
|
|
|
|
#ifndef ZYDIS_DISASSEMBLER_H
|
|
#define ZYDIS_DISASSEMBLER_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Types */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* All commonly used information about a decoded instruction that Zydis can provide.
|
|
*
|
|
* This structure is filled in by calling `ZydisDisassembleIntel` or `ZydisDisassembleATT`.
|
|
*/
|
|
typedef struct ZydisDisassembledInstruction_
|
|
{
|
|
/**
|
|
* The runtime address that was passed when disassembling the instruction.
|
|
*/
|
|
ZyanU64 runtime_address;
|
|
/**
|
|
* General information about the decoded instruction in machine-readable format.
|
|
*/
|
|
ZydisDecodedInstruction info;
|
|
/**
|
|
* The operands of the decoded instruction in a machine-readable format.
|
|
*
|
|
* The amount of actual operands can be determined by inspecting the corresponding fields
|
|
* in the `info` member of this struct. Inspect `operand_count_visible` if you care about
|
|
* visible operands (those that are printed by the formatter) or `operand_count` if you're
|
|
* also interested in implicit operands (for example the registers implicitly accessed by
|
|
* `pushad`). Unused entries are zeroed.
|
|
*/
|
|
ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT];
|
|
/**
|
|
* The textual, human-readable representation of the instruction.
|
|
*
|
|
* Guaranteed to be zero-terminated.
|
|
*/
|
|
char text[96];
|
|
} ZydisDisassembledInstruction;
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Disassemble an instruction and format it to human-readable text in a single step (Intel syntax).
|
|
*
|
|
* @param machine_mode The machine mode to assume when disassembling. When in doubt, pass
|
|
* `ZYDIS_MACHINE_MODE_LONG_64` for what is typically referred to as
|
|
* "64-bit mode" or `ZYDIS_MACHINE_MODE_LEGACY_32` for "32-bit mode".
|
|
* @param runtime_address The program counter (`eip` / `rip`) to assume when formatting the
|
|
* instruction. Many instructions behave differently depending on the
|
|
* address they are located at.
|
|
* @param buffer A pointer to the raw instruction bytes that you wish to decode.
|
|
* @param length The length of the input buffer. Note that this can be bigger than the
|
|
* actual size of the instruction -- you don't have to know the size up
|
|
* front. This length is merely used to prevent Zydis from doing
|
|
* out-of-bounds reads on your buffer.
|
|
* @param instruction A pointer to receive the decoded instruction information. Can be
|
|
* uninitialized and reused on later calls.
|
|
*
|
|
* This is a convenience function intended as a quick path for getting started with using Zydis.
|
|
* It internally calls a range of other more advanced functions to obtain all commonly needed
|
|
* information about the instruction. It is likely that you won't need most of this information in
|
|
* practice, so it is advisable to instead call these more advanced functions directly if you're
|
|
* concerned about performance.
|
|
*
|
|
* This function essentially combines the following more advanced functions into a single call:
|
|
*
|
|
* - `ZydisDecoderInit`
|
|
* - `ZydisDecoderDecodeInstruction`
|
|
* - `ZydisDecoderDecodeOperands`
|
|
* - `ZydisFormatterInit`
|
|
* - `ZydisFormatterFormatInstruction`
|
|
*
|
|
* @return A zyan status code.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisDisassembleIntel(ZydisMachineMode machine_mode,
|
|
ZyanU64 runtime_address, const void* buffer, ZyanUSize length,
|
|
ZydisDisassembledInstruction *instruction);
|
|
|
|
/**
|
|
* Disassemble an instruction and format it to human-readable text in a single step (AT&T syntax).
|
|
*
|
|
* @copydetails ZydisDisassembleIntel
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisDisassembleATT(ZydisMachineMode machine_mode,
|
|
ZyanU64 runtime_address, const void* buffer, ZyanUSize length,
|
|
ZydisDisassembledInstruction *instruction);
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_DISASSEMBLER_H */
|
|
#endif
|
|
|
|
|
|
//
|
|
// Header: Zydis/Utils.h
|
|
//
|
|
// Include stack:
|
|
// - Zydis/Zydis.h
|
|
//
|
|
|
|
/***************************************************************************************************
|
|
|
|
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
|
|
* Other utility functions.
|
|
*/
|
|
|
|
#ifndef ZYDIS_UTILS_H
|
|
#define ZYDIS_UTILS_H
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* @addtogroup utils Utils
|
|
* Miscellaneous utility functions. Address translation and other helpers.
|
|
* @{
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Address calculation */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
// TODO: Provide a function that works in minimal-mode and does not require a operand parameter
|
|
|
|
/**
|
|
* Calculates the absolute address value for the given instruction operand.
|
|
*
|
|
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
|
|
* @param operand A pointer to the `ZydisDecodedOperand` struct.
|
|
* @param runtime_address The runtime address of the instruction.
|
|
* @param result_address A pointer to the memory that receives the absolute address.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* You should use this function in the following cases:
|
|
* - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)
|
|
* - `MEM` operands with `RIP`/`EIP`-relative address (e.g. `MOV RAX, [RIP+0x12345678]`)
|
|
* - `MEM` operands with absolute address (e.g. `MOV RAX, [0x12345678]`)
|
|
* - The displacement needs to get truncated and zero extended
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisCalcAbsoluteAddress(const ZydisDecodedInstruction* instruction,
|
|
const ZydisDecodedOperand* operand, ZyanU64 runtime_address, ZyanU64* result_address);
|
|
|
|
/**
|
|
* Calculates the absolute address value for the given instruction operand.
|
|
*
|
|
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
|
|
* @param operand A pointer to the `ZydisDecodedOperand` struct.
|
|
* @param runtime_address The runtime address of the instruction.
|
|
* @param register_context A pointer to the `ZydisRegisterContext` struct.
|
|
* @param result_address A pointer to the memory that receives the absolute target-address.
|
|
*
|
|
* @return A zyan status code.
|
|
*
|
|
* This function behaves like `ZydisCalcAbsoluteAddress` but takes an additional register-context
|
|
* argument to allow calculation of addresses depending on runtime register values.
|
|
*
|
|
* Note that `IP/EIP/RIP` from the register-context will be ignored in favor of the passed
|
|
* runtime-address.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisCalcAbsoluteAddressEx(const ZydisDecodedInstruction* instruction,
|
|
const ZydisDecodedOperand* operand, ZyanU64 runtime_address,
|
|
const ZydisRegisterContext* register_context, ZyanU64* result_address);
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/* ============================================================================================== */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_UTILS_H */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @addtogroup version Version
|
|
*
|
|
* Functions for checking the library version and build options.
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/* ============================================================================================== */
|
|
/* Macros */
|
|
/* ============================================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Constants */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* A macro that defines the zydis version.
|
|
*/
|
|
#define ZYDIS_VERSION (ZyanU64)0x0004000000000000
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
/* Helper macros */
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/**
|
|
* Extracts the major-part of the zydis version.
|
|
*
|
|
* @param version The zydis version value
|
|
*/
|
|
#define ZYDIS_VERSION_MAJOR(version) (ZyanU16)(((version) & 0xFFFF000000000000) >> 48)
|
|
|
|
/**
|
|
* Extracts the minor-part of the zydis version.
|
|
*
|
|
* @param version The zydis version value
|
|
*/
|
|
#define ZYDIS_VERSION_MINOR(version) (ZyanU16)(((version) & 0x0000FFFF00000000) >> 32)
|
|
|
|
/**
|
|
* Extracts the patch-part of the zydis version.
|
|
*
|
|
* @param version The zydis version value
|
|
*/
|
|
#define ZYDIS_VERSION_PATCH(version) (ZyanU16)(((version) & 0x00000000FFFF0000) >> 16)
|
|
|
|
/**
|
|
* Extracts the build-part of the zydis version.
|
|
*
|
|
* @param version The zydis version value
|
|
*/
|
|
#define ZYDIS_VERSION_BUILD(version) (ZyanU16)((version) & 0x000000000000FFFF)
|
|
|
|
/* ---------------------------------------------------------------------------------------------- */
|
|
|
|
/* ============================================================================================== */
|
|
/* Enums and types */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Defines the `ZydisFeature` enum.
|
|
*/
|
|
typedef enum ZydisFeature_
|
|
{
|
|
ZYDIS_FEATURE_DECODER,
|
|
ZYDIS_FEATURE_ENCODER,
|
|
ZYDIS_FEATURE_FORMATTER,
|
|
ZYDIS_FEATURE_AVX512,
|
|
ZYDIS_FEATURE_KNC,
|
|
ZYDIS_FEATURE_SEGMENT,
|
|
|
|
/**
|
|
* Maximum value of this enum.
|
|
*/
|
|
ZYDIS_FEATURE_MAX_VALUE = ZYDIS_FEATURE_KNC,
|
|
/**
|
|
* The minimum number of bits required to represent all values of this enum.
|
|
*/
|
|
ZYDIS_FEATURE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FEATURE_MAX_VALUE)
|
|
} ZydisFeature;
|
|
|
|
/* ============================================================================================== */
|
|
/* Exported functions */
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* Returns the zydis version.
|
|
*
|
|
* @return The zydis version.
|
|
*
|
|
* Use the macros provided in this file to extract the major, minor, patch and build part from the
|
|
* returned version value.
|
|
*/
|
|
ZYDIS_EXPORT ZyanU64 ZydisGetVersion(void);
|
|
|
|
/**
|
|
* Checks, if the specified feature is enabled in the current zydis library instance.
|
|
*
|
|
* @param feature The feature.
|
|
*
|
|
* @return `ZYAN_STATUS_TRUE` if the feature is enabled, `ZYAN_STATUS_FALSE` if not. Another
|
|
* zyan status code, if an error occured.
|
|
*/
|
|
ZYDIS_EXPORT ZyanStatus ZydisIsFeatureEnabled(ZydisFeature feature);
|
|
|
|
/* ============================================================================================== */
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZYDIS_H */ |