libs: Import the Zydis library version 4.0.0.
Also some needed header files from Zycore version 1.4.1.
This commit is contained in:
parent
921367fc57
commit
7bc94bc8f0
65 changed files with 50619 additions and 0 deletions
28
configure
vendored
28
configure
vendored
|
@ -709,6 +709,8 @@ X_CFLAGS
|
|||
CPP
|
||||
XMKMF
|
||||
PTHREAD_LIBS
|
||||
ZYDIS_PE_LIBS
|
||||
ZYDIS_PE_CFLAGS
|
||||
ZLIB_PE_LIBS
|
||||
ZLIB_PE_CFLAGS
|
||||
XSLT_PE_LIBS
|
||||
|
@ -1580,6 +1582,7 @@ enable_wmcodecdspuuid
|
|||
enable_xml2
|
||||
enable_xslt
|
||||
enable_zlib
|
||||
enable_zydis
|
||||
enable_loader
|
||||
enable_nls
|
||||
enable_po
|
||||
|
@ -1737,6 +1740,8 @@ XSLT_PE_CFLAGS
|
|||
XSLT_PE_LIBS
|
||||
ZLIB_PE_CFLAGS
|
||||
ZLIB_PE_LIBS
|
||||
ZYDIS_PE_CFLAGS
|
||||
ZYDIS_PE_LIBS
|
||||
XMKMF
|
||||
CPP
|
||||
INOTIFY_CFLAGS
|
||||
|
@ -2536,6 +2541,11 @@ Some influential environment variables:
|
|||
C compiler flags for the PE zlib, overriding the bundled version
|
||||
ZLIB_PE_LIBS
|
||||
Linker flags for the PE zlib, overriding the bundled version
|
||||
ZYDIS_PE_CFLAGS
|
||||
C compiler flags for the PE zydis, overriding the bundled
|
||||
version
|
||||
ZYDIS_PE_LIBS
|
||||
Linker flags for the PE zydis, overriding the bundled version
|
||||
XMKMF Path to xmkmf, Makefile generator for X Window System
|
||||
CPP C preprocessor
|
||||
INOTIFY_CFLAGS
|
||||
|
@ -13221,6 +13231,21 @@ fi
|
|||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: zlib cflags: $ZLIB_PE_CFLAGS" >&5
|
||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: zlib libs: $ZLIB_PE_LIBS" >&5
|
||||
|
||||
if ${ZYDIS_PE_LIBS:+false} :
|
||||
then :
|
||||
ZYDIS_PE_LIBS=zydis
|
||||
if ${ZYDIS_PE_CFLAGS:+false} :
|
||||
then :
|
||||
ZYDIS_PE_CFLAGS="-I\$(top_srcdir)/libs/zydis/include"
|
||||
else $as_nop
|
||||
enable_zydis=no
|
||||
fi
|
||||
else $as_nop
|
||||
enable_zydis=no
|
||||
fi
|
||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: zydis cflags: $ZYDIS_PE_CFLAGS" >&5
|
||||
printf "%s\n" "$as_me:${as_lineno-$LINENO}: zydis libs: $ZYDIS_PE_LIBS" >&5
|
||||
|
||||
|
||||
|
||||
if test "$ac_cv_header_pthread_h" = "yes"
|
||||
|
@ -21890,6 +21915,7 @@ wine_fn_config_makefile libs/wmcodecdspuuid enable_wmcodecdspuuid
|
|||
wine_fn_config_makefile libs/xml2 enable_xml2
|
||||
wine_fn_config_makefile libs/xslt enable_xslt
|
||||
wine_fn_config_makefile libs/zlib enable_zlib
|
||||
wine_fn_config_makefile libs/zydis enable_zydis
|
||||
wine_fn_config_makefile loader enable_loader
|
||||
wine_fn_config_makefile nls enable_nls
|
||||
wine_fn_config_makefile po enable_po
|
||||
|
@ -23042,6 +23068,8 @@ XSLT_PE_CFLAGS = $XSLT_PE_CFLAGS
|
|||
XSLT_PE_LIBS = $XSLT_PE_LIBS
|
||||
ZLIB_PE_CFLAGS = $ZLIB_PE_CFLAGS
|
||||
ZLIB_PE_LIBS = $ZLIB_PE_LIBS
|
||||
ZYDIS_PE_CFLAGS = $ZYDIS_PE_CFLAGS
|
||||
ZYDIS_PE_LIBS = $ZYDIS_PE_LIBS
|
||||
PTHREAD_LIBS = $PTHREAD_LIBS
|
||||
XMKMF = $XMKMF
|
||||
CPP = $CPP
|
||||
|
|
|
@ -1126,6 +1126,7 @@ WINE_EXTLIB_FLAGS(VKD3D, vkd3d, vkd3d, "-I\$(top_srcdir)/libs/vkd3d/include")
|
|||
WINE_EXTLIB_FLAGS(XML2, xml2, xml2, "-I\$(top_srcdir)/libs/xml2/include -DLIBXML_STATIC")
|
||||
WINE_EXTLIB_FLAGS(XSLT, xslt, xslt, "-I\$(top_srcdir)/libs/xslt/libxslt -I\$(top_srcdir)/libs/xslt -DLIBXSLT_STATIC")
|
||||
WINE_EXTLIB_FLAGS(ZLIB, zlib, z, "-I\$(top_srcdir)/libs/zlib -DFAR= -DZ_SOLO")
|
||||
WINE_EXTLIB_FLAGS(ZYDIS, zydis, zydis, "-I\$(top_srcdir)/libs/zydis/include")
|
||||
|
||||
dnl **** Check for pthread ****
|
||||
|
||||
|
@ -3283,6 +3284,7 @@ WINE_CONFIG_MAKEFILE(libs/wmcodecdspuuid)
|
|||
WINE_CONFIG_MAKEFILE(libs/xml2)
|
||||
WINE_CONFIG_MAKEFILE(libs/xslt)
|
||||
WINE_CONFIG_MAKEFILE(libs/zlib)
|
||||
WINE_CONFIG_MAKEFILE(libs/zydis)
|
||||
WINE_CONFIG_MAKEFILE(loader)
|
||||
WINE_CONFIG_MAKEFILE(nls)
|
||||
WINE_CONFIG_MAKEFILE(po)
|
||||
|
|
23
libs/zydis/LICENSE
Normal file
23
libs/zydis/LICENSE
Normal file
|
@ -0,0 +1,23 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014-2021 Florian Bernd
|
||||
Copyright (c) 2014-2021 Joel Höner
|
||||
|
||||
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.
|
||||
|
18
libs/zydis/Makefile.in
Normal file
18
libs/zydis/Makefile.in
Normal file
|
@ -0,0 +1,18 @@
|
|||
EXTLIB = libzydis.a
|
||||
EXTRAINCL = $(ZYDIS_PE_CFLAGS) -I$(srcdir)/src
|
||||
|
||||
SOURCES = \
|
||||
src/Decoder.c \
|
||||
src/DecoderData.c \
|
||||
src/Disassembler.c \
|
||||
src/Formatter.c \
|
||||
src/FormatterATT.c \
|
||||
src/FormatterBase.c \
|
||||
src/FormatterBuffer.c \
|
||||
src/FormatterIntel.c \
|
||||
src/Mnemonic.c \
|
||||
src/Register.c \
|
||||
src/SharedData.c \
|
||||
src/String.c \
|
||||
src/Utils.c \
|
||||
src/Zydis.c
|
142
libs/zydis/include/Zycore/Allocator.h
Normal file
142
libs/zydis/include/Zycore/Allocator.h
Normal file
|
@ -0,0 +1,142 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Status.h>
|
||||
#include <Zycore/Types.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 */
|
316
libs/zydis/include/Zycore/Comparison.h
Normal file
316
libs/zydis/include/Zycore/Comparison.h
Normal file
|
@ -0,0 +1,316 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zycore/Types.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 */
|
527
libs/zydis/include/Zycore/Defines.h
Normal file
527
libs/zydis/include/Zycore/Defines.h
Normal file
|
@ -0,0 +1,527 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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 */
|
285
libs/zydis/include/Zycore/Format.h
Normal file
285
libs/zydis/include/Zycore/Format.h
Normal file
|
@ -0,0 +1,285 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
* Provides helper functions for performant number to string conversion.
|
||||
*/
|
||||
|
||||
#ifndef ZYCORE_FORMAT_H
|
||||
#define ZYCORE_FORMAT_H
|
||||
|
||||
#include <Zycore/Status.h>
|
||||
#include <Zycore/String.h>
|
||||
#include <Zycore/Types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Exported functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Helpers */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Get the absolute value of a 64 bit int.
|
||||
*
|
||||
* @param x The value to process.
|
||||
* @return The absolute, unsigned value.
|
||||
*
|
||||
* This gracefully deals with the special case of `x` being `INT_MAX`.
|
||||
*/
|
||||
ZYAN_INLINE ZyanU64 ZyanAbsI64(ZyanI64 x)
|
||||
{
|
||||
// INT_MIN special case. Can't use the value directly because GCC thinks
|
||||
// it's too big for an INT64 literal, however is perfectly happy to accept
|
||||
// this expression. This is also hit INT64_MIN is defined in `stdint.h`.
|
||||
if (x == (-0x7fffffffffffffff - 1))
|
||||
{
|
||||
return 0x8000000000000000u;
|
||||
}
|
||||
|
||||
return (ZyanU64)(x < 0 ? -x : x);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Insertion */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Inserts formatted text in the destination string at the given `index`.
|
||||
*
|
||||
* @param string The destination string.
|
||||
* @param index The insert index.
|
||||
* @param format The format string.
|
||||
* @param ... The format arguments.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*
|
||||
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
||||
* `ZyanString` instance.
|
||||
*/
|
||||
ZYAN_PRINTF_ATTR(3, 4)
|
||||
ZYCORE_EXPORT ZyanStatus ZyanStringInsertFormat(ZyanString* string, ZyanUSize index,
|
||||
const char* format, ...);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Formats the given unsigned ordinal `value` to its decimal text-representation and
|
||||
* inserts it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param index The insert index.
|
||||
* @param value The value.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
*
|
||||
* @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 ZyanStringInsertDecU(ZyanString* string, ZyanUSize index, ZyanU64 value,
|
||||
ZyanU8 padding_length);
|
||||
|
||||
/**
|
||||
* Formats the given signed ordinal `value` to its decimal text-representation and
|
||||
* inserts it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param index The insert index.
|
||||
* @param value The value.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
* @param force_sign Set `ZYAN_TRUE`, to force printing of the `+` sign for positive numbers.
|
||||
* @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed.
|
||||
*
|
||||
* @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 ZyanStringInsertDecS(ZyanString* string, ZyanUSize index, ZyanI64 value,
|
||||
ZyanU8 padding_length, ZyanBool force_sign, const ZyanString* prefix);
|
||||
|
||||
/**
|
||||
* Formats the given unsigned ordinal `value` to its hexadecimal text-representation and
|
||||
* inserts it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param index The insert index.
|
||||
* @param value The value.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
* @param uppercase Set `ZYAN_TRUE` to use uppercase letters ('A'-'F') instead of lowercase
|
||||
* ones ('a'-'f').
|
||||
*
|
||||
* @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 ZyanStringInsertHexU(ZyanString* string, ZyanUSize index, ZyanU64 value,
|
||||
ZyanU8 padding_length, ZyanBool uppercase);
|
||||
|
||||
/**
|
||||
* Formats the given signed ordinal `value` to its hexadecimal text-representation and
|
||||
* inserts it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param index The insert index.
|
||||
* @param value The value.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
* @param uppercase Set `ZYAN_TRUE` to use uppercase letters ('A'-'F') instead of lowercase
|
||||
* ones ('a'-'f').
|
||||
* @param force_sign Set `ZYAN_TRUE`, to force printing of the `+` sign for positive numbers.
|
||||
* @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed.
|
||||
*
|
||||
* @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 ZyanStringInsertHexS(ZyanString* string, ZyanUSize index, ZyanI64 value,
|
||||
ZyanU8 padding_length, ZyanBool uppercase, ZyanBool force_sign, const ZyanString* prefix);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Appending */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef ZYAN_NO_LIBC
|
||||
|
||||
/**
|
||||
* Appends formatted text to the destination string.
|
||||
*
|
||||
* @param string The destination string.
|
||||
* @param format The format string.
|
||||
* @param ... The format arguments.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*
|
||||
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
||||
* `ZyanString` instance.
|
||||
*/
|
||||
ZYAN_PRINTF_ATTR(2, 3)
|
||||
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringAppendFormat(
|
||||
ZyanString* string, const char* format, ...);
|
||||
|
||||
#endif // ZYAN_NO_LIBC
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Formats the given unsigned ordinal `value` to its decimal text-representation and
|
||||
* appends it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param value The value.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
*
|
||||
* @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 ZyanStringAppendDecU(ZyanString* string, ZyanU64 value,
|
||||
ZyanU8 padding_length);
|
||||
|
||||
/**
|
||||
* Formats the given signed ordinal `value` to its decimal text-representation and
|
||||
* appends it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param value The value.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
* @param force_sign Set `ZYAN_TRUE`, to force printing of the `+` sign for positive numbers.
|
||||
* @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed.
|
||||
*
|
||||
* @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 ZyanStringAppendDecS(ZyanString* string, ZyanI64 value,
|
||||
ZyanU8 padding_length, ZyanBool force_sign, const ZyanStringView* prefix);
|
||||
|
||||
/**
|
||||
* Formats the given unsigned ordinal `value` to its hexadecimal text-representation and
|
||||
* appends it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param value The value.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
* @param uppercase Set `ZYAN_TRUE` to use uppercase letters ('A'-'F') instead of lowercase
|
||||
* ones ('a'-'f').
|
||||
*
|
||||
* @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 ZyanStringAppendHexU(ZyanString* string, ZyanU64 value,
|
||||
ZyanU8 padding_length, ZyanBool uppercase);
|
||||
|
||||
/**
|
||||
* Formats the given signed ordinal `value` to its hexadecimal text-representation and
|
||||
* appends it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param value The value.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
* @param uppercase Set `ZYAN_TRUE` to use uppercase letters ('A'-'F') instead of lowercase
|
||||
* ones ('a'-'f').
|
||||
* @param force_sign Set `ZYAN_TRUE`, to force printing of the `+` sign for positive numbers.
|
||||
* @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed.
|
||||
*
|
||||
* @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 ZyanStringAppendHexS(ZyanString* string, ZyanI64 value,
|
||||
ZyanU8 padding_length, ZyanBool uppercase, ZyanBool force_sign, const ZyanStringView* prefix);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ZYCORE_FORMAT_H
|
511
libs/zydis/include/Zycore/LibC.h
Normal file
511
libs/zydis/include/Zycore/LibC.h
Normal file
|
@ -0,0 +1,511 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
* Provides a simple LibC abstraction and fallback routines.
|
||||
*/
|
||||
|
||||
#ifndef ZYCORE_LIBC_H
|
||||
#define ZYCORE_LIBC_H
|
||||
|
||||
#ifndef ZYAN_CUSTOM_LIBC
|
||||
|
||||
// Include a custom LibC header and define `ZYAN_CUSTOM_LIBC` to provide your own LibC
|
||||
// replacement functions
|
||||
|
||||
#ifndef ZYAN_NO_LIBC
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* LibC is available */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* errno.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#define ZYAN_ERRNO errno
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* stdarg.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
/**
|
||||
* Defines the `ZyanVAList` datatype.
|
||||
*/
|
||||
typedef va_list ZyanVAList;
|
||||
|
||||
#define ZYAN_VA_START va_start
|
||||
#define ZYAN_VA_ARG va_arg
|
||||
#define ZYAN_VA_END va_end
|
||||
#define ZYAN_VA_COPY(dest, source) va_copy((dest), (source))
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* stdio.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define ZYAN_FPUTS fputs
|
||||
#define ZYAN_FPUTC fputc
|
||||
#define ZYAN_FPRINTF fprintf
|
||||
#define ZYAN_PRINTF printf
|
||||
#define ZYAN_PUTC putc
|
||||
#define ZYAN_PUTS puts
|
||||
#define ZYAN_SCANF scanf
|
||||
#define ZYAN_SSCANF sscanf
|
||||
#define ZYAN_VSNPRINTF vsnprintf
|
||||
|
||||
/**
|
||||
* Defines the `ZyanFile` datatype.
|
||||
*/
|
||||
typedef FILE ZyanFile;
|
||||
|
||||
#define ZYAN_STDIN stdin
|
||||
#define ZYAN_STDOUT stdout
|
||||
#define ZYAN_STDERR stderr
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* stdlib.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <stdlib.h>
|
||||
#define ZYAN_CALLOC calloc
|
||||
#define ZYAN_FREE free
|
||||
#define ZYAN_MALLOC malloc
|
||||
#define ZYAN_REALLOC realloc
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* string.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <string.h>
|
||||
#define ZYAN_MEMCHR memchr
|
||||
#define ZYAN_MEMCMP memcmp
|
||||
#define ZYAN_MEMCPY memcpy
|
||||
#define ZYAN_MEMMOVE memmove
|
||||
#define ZYAN_MEMSET memset
|
||||
#define ZYAN_STRCAT strcat
|
||||
#define ZYAN_STRCHR strchr
|
||||
#define ZYAN_STRCMP strcmp
|
||||
#define ZYAN_STRCOLL strcoll
|
||||
#define ZYAN_STRCPY strcpy
|
||||
#define ZYAN_STRCSPN strcspn
|
||||
#define ZYAN_STRLEN strlen
|
||||
#define ZYAN_STRNCAT strncat
|
||||
#define ZYAN_STRNCMP strncmp
|
||||
#define ZYAN_STRNCPY strncpy
|
||||
#define ZYAN_STRPBRK strpbrk
|
||||
#define ZYAN_STRRCHR strrchr
|
||||
#define ZYAN_STRSPN strspn
|
||||
#define ZYAN_STRSTR strstr
|
||||
#define ZYAN_STRTOK strtok
|
||||
#define ZYAN_STRXFRM strxfrm
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#else // if ZYAN_NO_LIBC
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* No LibC available, use our own functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zycore/Types.h>
|
||||
|
||||
/*
|
||||
* These implementations are by no means optimized and will be outperformed by pretty much any
|
||||
* libc implementation out there. We do not aim towards providing competetive implementations here,
|
||||
* but towards providing a last resort fallback for environments without a working libc.
|
||||
*/
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* stdarg.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#if defined(ZYAN_MSVC) || defined(ZYAN_ICC)
|
||||
|
||||
/**
|
||||
* Defines the `ZyanVAList` datatype.
|
||||
*/
|
||||
typedef char* ZyanVAList;
|
||||
|
||||
# define ZYAN_VA_START __crt_va_start
|
||||
# define ZYAN_VA_ARG __crt_va_arg
|
||||
# define ZYAN_VA_END __crt_va_end
|
||||
# define ZYAN_VA_COPY(destination, source) ((destination) = (source))
|
||||
|
||||
#elif defined(ZYAN_GNUC)
|
||||
|
||||
/**
|
||||
* Defines the `ZyanVAList` datatype.
|
||||
*/
|
||||
typedef __builtin_va_list ZyanVAList;
|
||||
|
||||
# define ZYAN_VA_START(v, l) __builtin_va_start(v, l)
|
||||
# define ZYAN_VA_END(v) __builtin_va_end(v)
|
||||
# define ZYAN_VA_ARG(v, l) __builtin_va_arg(v, l)
|
||||
# define ZYAN_VA_COPY(d, s) __builtin_va_copy(d, s)
|
||||
|
||||
#else
|
||||
# error "Unsupported compiler for no-libc mode."
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* stdio.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
// ZYAN_INLINE int ZYAN_VSNPRINTF (char* const buffer, ZyanUSize const count,
|
||||
// char const* const format, ZyanVAList args)
|
||||
// {
|
||||
// // We cant provide a fallback implementation for this function
|
||||
// ZYAN_UNUSED(buffer);
|
||||
// ZYAN_UNUSED(count);
|
||||
// ZYAN_UNUSED(format);
|
||||
// ZYAN_UNUSED(args);
|
||||
// return ZYAN_NULL;
|
||||
// }
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* stdlib.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
// ZYAN_INLINE void* ZYAN_CALLOC(ZyanUSize nitems, ZyanUSize size)
|
||||
// {
|
||||
// // We cant provide a fallback implementation for this function
|
||||
// ZYAN_UNUSED(nitems);
|
||||
// ZYAN_UNUSED(size);
|
||||
// return ZYAN_NULL;
|
||||
// }
|
||||
//
|
||||
// ZYAN_INLINE void ZYAN_FREE(void *p)
|
||||
// {
|
||||
// // We cant provide a fallback implementation for this function
|
||||
// ZYAN_UNUSED(p);
|
||||
// }
|
||||
//
|
||||
// ZYAN_INLINE void* ZYAN_MALLOC(ZyanUSize n)
|
||||
// {
|
||||
// // We cant provide a fallback implementation for this function
|
||||
// ZYAN_UNUSED(n);
|
||||
// return ZYAN_NULL;
|
||||
// }
|
||||
//
|
||||
// ZYAN_INLINE void* ZYAN_REALLOC(void* p, ZyanUSize n)
|
||||
// {
|
||||
// // We cant provide a fallback implementation for this function
|
||||
// ZYAN_UNUSED(p);
|
||||
// ZYAN_UNUSED(n);
|
||||
// return ZYAN_NULL;
|
||||
// }
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* string.h */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZYAN_INLINE void* ZYAN_MEMCHR(const void* str, int c, ZyanUSize n)
|
||||
{
|
||||
const ZyanU8* p = (ZyanU8*)str;
|
||||
while (n--)
|
||||
{
|
||||
if (*p != (ZyanU8)c)
|
||||
{
|
||||
p++;
|
||||
} else
|
||||
{
|
||||
return (void*)p;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ZYAN_INLINE int ZYAN_MEMCMP(const void* s1, const void* s2, ZyanUSize n)
|
||||
{
|
||||
const ZyanU8* p1 = s1, *p2 = s2;
|
||||
while (n--)
|
||||
{
|
||||
if (*p1 != *p2)
|
||||
{
|
||||
return *p1 - *p2;
|
||||
}
|
||||
p1++, p2++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ZYAN_INLINE void* ZYAN_MEMCPY(void* dst, const void* src, ZyanUSize n)
|
||||
{
|
||||
volatile ZyanU8* dp = dst;
|
||||
const ZyanU8* sp = src;
|
||||
while (n--)
|
||||
{
|
||||
*dp++ = *sp++;
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
ZYAN_INLINE void* ZYAN_MEMMOVE(void* dst, const void* src, ZyanUSize n)
|
||||
{
|
||||
volatile ZyanU8* pd = dst;
|
||||
const ZyanU8* ps = src;
|
||||
if (ps < pd)
|
||||
{
|
||||
for (pd += n, ps += n; n--;)
|
||||
{
|
||||
*--pd = *--ps;
|
||||
}
|
||||
} else
|
||||
{
|
||||
while (n--)
|
||||
{
|
||||
*pd++ = *ps++;
|
||||
}
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
ZYAN_INLINE void* ZYAN_MEMSET(void* dst, int val, ZyanUSize n)
|
||||
{
|
||||
volatile ZyanU8* p = dst;
|
||||
while (n--)
|
||||
{
|
||||
*p++ = (unsigned char)val;
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRCAT(char* dest, const char* src)
|
||||
{
|
||||
char* ret = dest;
|
||||
while (*dest)
|
||||
{
|
||||
dest++;
|
||||
}
|
||||
while ((*dest++ = *src++));
|
||||
return ret;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRCHR(const char* s, int c)
|
||||
{
|
||||
while (*s != (char)c)
|
||||
{
|
||||
if (!*s++)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return (char*)s;
|
||||
}
|
||||
|
||||
ZYAN_INLINE int ZYAN_STRCMP(const char* s1, const char* s2)
|
||||
{
|
||||
while (*s1 && (*s1 == *s2))
|
||||
{
|
||||
s1++, s2++;
|
||||
}
|
||||
return *(const ZyanU8*)s1 - *(const ZyanU8*)s2;
|
||||
}
|
||||
|
||||
ZYAN_INLINE int ZYAN_STRCOLL(const char *s1, const char *s2)
|
||||
{
|
||||
// TODO: Implement
|
||||
|
||||
ZYAN_UNUSED(s1);
|
||||
ZYAN_UNUSED(s2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRCPY(char* dest, const char* src)
|
||||
{
|
||||
char* ret = dest;
|
||||
while ((*dest++ = *src++));
|
||||
return ret;
|
||||
}
|
||||
|
||||
ZYAN_INLINE ZyanUSize ZYAN_STRCSPN(const char *s1, const char *s2)
|
||||
{
|
||||
ZyanUSize ret = 0;
|
||||
while (*s1)
|
||||
{
|
||||
if (ZYAN_STRCHR(s2, *s1))
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
s1++, ret++;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ZYAN_INLINE ZyanUSize ZYAN_STRLEN(const char* str)
|
||||
{
|
||||
const char* p = str;
|
||||
while (*str)
|
||||
{
|
||||
++str;
|
||||
}
|
||||
return str - p;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRNCAT(char* dest, const char* src, ZyanUSize n)
|
||||
{
|
||||
char* ret = dest;
|
||||
while (*dest)
|
||||
{
|
||||
dest++;
|
||||
}
|
||||
while (n--)
|
||||
{
|
||||
if (!(*dest++ = *src++))
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
*dest = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ZYAN_INLINE int ZYAN_STRNCMP(const char* s1, const char* s2, ZyanUSize n)
|
||||
{
|
||||
while (n--)
|
||||
{
|
||||
if (*s1++ != *s2++)
|
||||
{
|
||||
return *(unsigned char*)(s1 - 1) - *(unsigned char*)(s2 - 1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRNCPY(char* dest, const char* src, ZyanUSize n)
|
||||
{
|
||||
char* ret = dest;
|
||||
do
|
||||
{
|
||||
if (!n--)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
} while ((*dest++ = *src++));
|
||||
while (n--)
|
||||
{
|
||||
*dest++ = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRPBRK(const char* s1, const char* s2)
|
||||
{
|
||||
while (*s1)
|
||||
{
|
||||
if(ZYAN_STRCHR(s2, *s1++))
|
||||
{
|
||||
return (char*)--s1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRRCHR(const char* s, int c)
|
||||
{
|
||||
char* ret = 0;
|
||||
do
|
||||
{
|
||||
if (*s == (char)c)
|
||||
{
|
||||
ret = (char*)s;
|
||||
}
|
||||
} while (*s++);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ZYAN_INLINE ZyanUSize ZYAN_STRSPN(const char* s1, const char* s2)
|
||||
{
|
||||
ZyanUSize ret = 0;
|
||||
while (*s1 && ZYAN_STRCHR(s2, *s1++))
|
||||
{
|
||||
ret++;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRSTR(const char* s1, const char* s2)
|
||||
{
|
||||
const ZyanUSize n = ZYAN_STRLEN(s2);
|
||||
while (*s1)
|
||||
{
|
||||
if (!ZYAN_MEMCMP(s1++, s2, n))
|
||||
{
|
||||
return (char*)(s1 - 1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ZYAN_INLINE char* ZYAN_STRTOK(char* str, const char* delim)
|
||||
{
|
||||
static char* p = 0;
|
||||
if (str)
|
||||
{
|
||||
p = str;
|
||||
} else
|
||||
if (!p)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
str = p + ZYAN_STRSPN(p, delim);
|
||||
p = str + ZYAN_STRCSPN(str, delim);
|
||||
if (p == str)
|
||||
{
|
||||
return p = 0;
|
||||
}
|
||||
p = *p ? *p = 0, p + 1 : 0;
|
||||
return str;
|
||||
}
|
||||
|
||||
ZYAN_INLINE ZyanUSize ZYAN_STRXFRM(char* dest, const char* src, ZyanUSize n)
|
||||
{
|
||||
const ZyanUSize n2 = ZYAN_STRLEN(src);
|
||||
if (n > n2)
|
||||
{
|
||||
ZYAN_STRCPY(dest, src);
|
||||
}
|
||||
return n2;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
#endif /* ZYCORE_LIBC_H */
|
84
libs/zydis/include/Zycore/Object.h
Normal file
84
libs/zydis/include/Zycore/Object.h
Normal file
|
@ -0,0 +1,84 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Status.h>
|
||||
#include <Zycore/Types.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 */
|
287
libs/zydis/include/Zycore/Status.h
Normal file
287
libs/zydis/include/Zycore/Status.h
Normal file
|
@ -0,0 +1,287 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Types.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* 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 */
|
1011
libs/zydis/include/Zycore/String.h
Normal file
1011
libs/zydis/include/Zycore/String.h
Normal file
File diff suppressed because it is too large
Load diff
236
libs/zydis/include/Zycore/Types.h
Normal file
236
libs/zydis/include/Zycore/Types.h
Normal file
|
@ -0,0 +1,236 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Defines.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 */
|
722
libs/zydis/include/Zycore/Vector.h
Normal file
722
libs/zydis/include/Zycore/Vector.h
Normal file
|
@ -0,0 +1,722 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Allocator.h>
|
||||
#include <Zycore/Comparison.h>
|
||||
#include <Zycore/Object.h>
|
||||
#include <Zycore/Status.h>
|
||||
#include <Zycore/Types.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 */
|
303
libs/zydis/include/Zydis/Decoder.h
Normal file
303
libs/zydis/include/Zydis/Decoder.h
Normal file
|
@ -0,0 +1,303 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Types.h>
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zydis/DecoderTypes.h>
|
||||
#include <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 */
|
1447
libs/zydis/include/Zydis/DecoderTypes.h
Normal file
1447
libs/zydis/include/Zydis/DecoderTypes.h
Normal file
File diff suppressed because it is too large
Load diff
76
libs/zydis/include/Zydis/Defines.h
Normal file
76
libs/zydis/include/Zydis/Defines.h
Normal file
|
@ -0,0 +1,76 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/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
|
135
libs/zydis/include/Zydis/Disassembler.h
Normal file
135
libs/zydis/include/Zydis/Disassembler.h
Normal file
|
@ -0,0 +1,135 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zydis/Decoder.h>
|
||||
#include <Zydis/Formatter.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 */
|
460
libs/zydis/include/Zydis/Encoder.h
Normal file
460
libs/zydis/include/Zydis/Encoder.h
Normal file
|
@ -0,0 +1,460 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Types.h>
|
||||
#include <Zydis/MetaInfo.h>
|
||||
#include <Zydis/Register.h>
|
||||
#include <Zydis/DecoderTypes.h>
|
||||
#include <Zydis/Mnemonic.h>
|
||||
#include <Zydis/Status.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 */
|
1146
libs/zydis/include/Zydis/Formatter.h
Normal file
1146
libs/zydis/include/Zydis/Formatter.h
Normal file
File diff suppressed because it is too large
Load diff
306
libs/zydis/include/Zydis/FormatterBuffer.h
Normal file
306
libs/zydis/include/Zydis/FormatterBuffer.h
Normal file
|
@ -0,0 +1,306 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/String.h>
|
||||
#include <Zycore/Types.h>
|
||||
#include <Zydis/Defines.h>
|
||||
#include <Zydis/Status.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 */
|
104
libs/zydis/include/Zydis/Generated/EnumISAExt.h
Normal file
104
libs/zydis/include/Zydis/Generated/EnumISAExt.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/**
|
||||
* 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;
|
198
libs/zydis/include/Zydis/Generated/EnumISASet.h
Normal file
198
libs/zydis/include/Zydis/Generated/EnumISASet.h
Normal file
|
@ -0,0 +1,198 @@
|
|||
/**
|
||||
* 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;
|
124
libs/zydis/include/Zydis/Generated/EnumInstructionCategory.h
Normal file
124
libs/zydis/include/Zydis/Generated/EnumInstructionCategory.h
Normal file
|
@ -0,0 +1,124 @@
|
|||
/**
|
||||
* 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;
|
1770
libs/zydis/include/Zydis/Generated/EnumMnemonic.h
Normal file
1770
libs/zydis/include/Zydis/Generated/EnumMnemonic.h
Normal file
File diff suppressed because it is too large
Load diff
321
libs/zydis/include/Zydis/Generated/EnumRegister.h
Normal file
321
libs/zydis/include/Zydis/Generated/EnumRegister.h
Normal file
|
@ -0,0 +1,321 @@
|
|||
/**
|
||||
* 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;
|
332
libs/zydis/include/Zydis/Internal/DecoderData.h
Normal file
332
libs/zydis/include/Zydis/Internal/DecoderData.h
Normal file
|
@ -0,0 +1,332 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#ifndef ZYDIS_INTERNAL_DECODERDATA_H
|
||||
#define ZYDIS_INTERNAL_DECODERDATA_H
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zycore/Types.h>
|
||||
#include <Zydis/Defines.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Enums and types */
|
||||
/* ============================================================================================== */
|
||||
|
||||
// MSVC does not like types other than (un-)signed int for bit-fields
|
||||
#ifdef ZYAN_MSVC
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4214)
|
||||
#endif
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Decoder tree */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisDecoderTreeNodeType` data-type.
|
||||
*/
|
||||
typedef ZyanU8 ZydisDecoderTreeNodeType;
|
||||
|
||||
/**
|
||||
* Values that represent zydis decoder tree node types.
|
||||
*/
|
||||
enum ZydisDecoderTreeNodeTypes
|
||||
{
|
||||
ZYDIS_NODETYPE_INVALID = 0x00,
|
||||
/**
|
||||
* Reference to an instruction-definition.
|
||||
*/
|
||||
ZYDIS_NODETYPE_DEFINITION_MASK = 0x80,
|
||||
/**
|
||||
* Reference to an XOP-map filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_XOP = 0x01,
|
||||
/**
|
||||
* Reference to an VEX-map filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_VEX = 0x02,
|
||||
/**
|
||||
* Reference to an EVEX/MVEX-map filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_EMVEX = 0x03,
|
||||
/**
|
||||
* Reference to an opcode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_OPCODE = 0x04,
|
||||
/**
|
||||
* Reference to an instruction-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE = 0x05,
|
||||
/**
|
||||
* Reference to an compacted instruction-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_COMPACT = 0x06,
|
||||
/**
|
||||
* Reference to a ModRM.mod filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODRM_MOD = 0x07,
|
||||
/**
|
||||
* Reference to a compacted ModRM.mod filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT = 0x08,
|
||||
/**
|
||||
* Reference to a ModRM.reg filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODRM_REG = 0x09,
|
||||
/**
|
||||
* Reference to a ModRM.rm filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODRM_RM = 0x0A,
|
||||
/**
|
||||
* Reference to a PrefixGroup1 filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1 = 0x0B,
|
||||
/**
|
||||
* Reference to a mandatory-prefix filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX = 0x0C,
|
||||
/**
|
||||
* Reference to an operand-size filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_OPERAND_SIZE = 0x0D,
|
||||
/**
|
||||
* Reference to an address-size filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE = 0x0E,
|
||||
/**
|
||||
* Reference to a vector-length filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH = 0x0F,
|
||||
/**
|
||||
* Reference to an REX/VEX/EVEX.W filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_REX_W = 0x10,
|
||||
/**
|
||||
* Reference to an REX/VEX/EVEX.B filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_REX_B = 0x11,
|
||||
/**
|
||||
* Reference to an EVEX.b filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_EVEX_B = 0x12,
|
||||
/**
|
||||
* Reference to an MVEX.E filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MVEX_E = 0x13,
|
||||
/**
|
||||
* Reference to a AMD-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_AMD = 0x14,
|
||||
/**
|
||||
* Reference to a KNC-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_KNC = 0x15,
|
||||
/**
|
||||
* Reference to a MPX-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_MPX = 0x16,
|
||||
/**
|
||||
* Reference to a CET-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_CET = 0x17,
|
||||
/**
|
||||
* Reference to a LZCNT-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_LZCNT = 0x18,
|
||||
/**
|
||||
* Reference to a TZCNT-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_TZCNT = 0x19,
|
||||
/**
|
||||
* Reference to a WBNOINVD-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD = 0x1A,
|
||||
/**
|
||||
* Reference to a CLDEMOTE-mode filter.
|
||||
*/
|
||||
ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE = 0x1B
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisDecoderTreeNodeValue` data-type.
|
||||
*/
|
||||
typedef ZyanU16 ZydisDecoderTreeNodeValue;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisDecoderTreeNode` struct.
|
||||
*/
|
||||
typedef struct ZydisDecoderTreeNode_
|
||||
{
|
||||
ZydisDecoderTreeNodeType type;
|
||||
ZydisDecoderTreeNodeValue value;
|
||||
} ZydisDecoderTreeNode;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
#ifdef ZYAN_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Physical instruction encoding info */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionEncodingFlags` data-type.
|
||||
*/
|
||||
typedef ZyanU8 ZydisInstructionEncodingFlags;
|
||||
|
||||
/**
|
||||
* The instruction has an optional modrm byte.
|
||||
*/
|
||||
#define ZYDIS_INSTR_ENC_FLAG_HAS_MODRM 0x01
|
||||
|
||||
/**
|
||||
* The instruction has an optional displacement value.
|
||||
*/
|
||||
#define ZYDIS_INSTR_ENC_FLAG_HAS_DISP 0x02
|
||||
|
||||
/**
|
||||
* The instruction has an optional immediate value.
|
||||
*/
|
||||
#define ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 0x04
|
||||
|
||||
/**
|
||||
* The instruction has a second optional immediate value.
|
||||
*/
|
||||
#define ZYDIS_INSTR_ENC_FLAG_HAS_IMM1 0x08
|
||||
|
||||
/**
|
||||
* The instruction ignores the value of `modrm.mod` and always assumes `modrm.mod == 3`
|
||||
* ("reg, reg" - form).
|
||||
*
|
||||
* Instructions with this flag can't have a SIB byte or a displacement value.
|
||||
*/
|
||||
#define ZYDIS_INSTR_ENC_FLAG_FORCE_REG_FORM 0x10
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionEncodingInfo` struct.
|
||||
*/
|
||||
typedef struct ZydisInstructionEncodingInfo_
|
||||
{
|
||||
/**
|
||||
* Contains flags with information about the physical instruction-encoding.
|
||||
*/
|
||||
ZydisInstructionEncodingFlags flags;
|
||||
/**
|
||||
* Displacement info.
|
||||
*/
|
||||
struct
|
||||
{
|
||||
/**
|
||||
* The size of the displacement value.
|
||||
*/
|
||||
ZyanU8 size[3];
|
||||
} disp;
|
||||
/**
|
||||
* Immediate info.
|
||||
*/
|
||||
struct
|
||||
{
|
||||
/**
|
||||
* The size of the immediate value.
|
||||
*/
|
||||
ZyanU8 size[3];
|
||||
/**
|
||||
* Signals, if the value is signed.
|
||||
*/
|
||||
ZyanBool is_signed;
|
||||
/**
|
||||
* Signals, if the value is a relative offset.
|
||||
*/
|
||||
ZyanBool is_relative;
|
||||
} imm[2];
|
||||
} ZydisInstructionEncodingInfo;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Decoder tree */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
extern const ZydisDecoderTreeNode zydis_decoder_tree_root;
|
||||
|
||||
/**
|
||||
* Returns the root node of the instruction tree.
|
||||
*
|
||||
* @return The root node of the instruction tree.
|
||||
*/
|
||||
ZYAN_INLINE const ZydisDecoderTreeNode* ZydisDecoderTreeGetRootNode(void)
|
||||
{
|
||||
return &zydis_decoder_tree_root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the child node of `parent` specified by `index`.
|
||||
*
|
||||
* @param parent The parent node.
|
||||
* @param index The index of the child node to retrieve.
|
||||
*
|
||||
* @return The specified child node.
|
||||
*/
|
||||
ZYDIS_NO_EXPORT const ZydisDecoderTreeNode* ZydisDecoderTreeGetChildNode(
|
||||
const ZydisDecoderTreeNode* parent, ZyanU16 index);
|
||||
|
||||
/**
|
||||
* Returns information about optional instruction parts (like modrm, displacement or
|
||||
* immediates) for the instruction that is linked to the given `node`.
|
||||
*
|
||||
* @param node The instruction definition node.
|
||||
* @param info A pointer to the `ZydisInstructionParts` struct.
|
||||
*/
|
||||
ZYDIS_NO_EXPORT void ZydisGetInstructionEncodingInfo(const ZydisDecoderTreeNode* node,
|
||||
const ZydisInstructionEncodingInfo** info);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ZYDIS_INTERNAL_DECODERDATA_H */
|
183
libs/zydis/include/Zydis/Internal/FormatterATT.h
Normal file
183
libs/zydis/include/Zydis/Internal/FormatterATT.h
Normal file
|
@ -0,0 +1,183 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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
|
||||
* Implements the `AT&T` style instruction-formatter.
|
||||
*/
|
||||
|
||||
#ifndef ZYDIS_FORMATTER_ATT_H
|
||||
#define ZYDIS_FORMATTER_ATT_H
|
||||
|
||||
#include <Zydis/Formatter.h>
|
||||
#include <Zydis/Internal/FormatterBase.h>
|
||||
#include <Zydis/Internal/String.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Formatter functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Instruction */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterATTFormatInstruction(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Operands */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterATTFormatOperandMEM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Elemental tokens */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintMnemonic(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintRegister(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg);
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintAddressABS(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintDISP(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintIMM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Fomatter presets */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* AT&T */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* The default formatter configuration for `AT&T` style disassembly.
|
||||
*/
|
||||
static const ZydisFormatter FORMATTER_ATT =
|
||||
{
|
||||
/* style */ ZYDIS_FORMATTER_STYLE_ATT,
|
||||
/* force_memory_size */ ZYAN_FALSE,
|
||||
/* force_memory_seg */ ZYAN_FALSE,
|
||||
/* force_memory_scale */ ZYAN_TRUE,
|
||||
/* force_relative_branches */ ZYAN_FALSE,
|
||||
/* force_relative_riprel */ ZYAN_FALSE,
|
||||
/* print_branch_size */ ZYAN_FALSE,
|
||||
/* detailed_prefixes */ ZYAN_FALSE,
|
||||
/* addr_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED,
|
||||
/* addr_padding_absolute */ ZYDIS_PADDING_AUTO,
|
||||
/* addr_padding_relative */ 2,
|
||||
/* disp_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED,
|
||||
/* disp_padding */ 2,
|
||||
/* imm_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* imm_signedness */ ZYDIS_SIGNEDNESS_AUTO,
|
||||
/* imm_padding */ 2,
|
||||
/* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_registers */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* hex_uppercase */ ZYAN_TRUE,
|
||||
/* hex_force_leading_number */ ZYAN_FALSE,
|
||||
/* number_format */
|
||||
{
|
||||
// ZYDIS_NUMERIC_BASE_DEC
|
||||
{
|
||||
// Prefix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
},
|
||||
// Suffix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
}
|
||||
},
|
||||
// ZYDIS_NUMERIC_BASE_HEX
|
||||
{
|
||||
// Prefix
|
||||
{
|
||||
/* string */ &FORMATTER_ATT.number_format[
|
||||
ZYDIS_NUMERIC_BASE_HEX][0].string_data,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW("0x"),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
},
|
||||
// Suffix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
}
|
||||
}
|
||||
},
|
||||
/* func_pre_instruction */ ZYAN_NULL,
|
||||
/* func_post_instruction */ ZYAN_NULL,
|
||||
/* func_format_instruction */ &ZydisFormatterATTFormatInstruction,
|
||||
/* func_pre_operand */ ZYAN_NULL,
|
||||
/* func_post_operand */ ZYAN_NULL,
|
||||
/* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG,
|
||||
/* func_format_operand_mem */ &ZydisFormatterATTFormatOperandMEM,
|
||||
/* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR,
|
||||
/* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM,
|
||||
/* func_print_mnemonic */ &ZydisFormatterATTPrintMnemonic,
|
||||
/* func_print_register */ &ZydisFormatterATTPrintRegister,
|
||||
/* func_print_address_abs */ &ZydisFormatterATTPrintAddressABS,
|
||||
/* func_print_address_rel */ &ZydisFormatterBasePrintAddressREL,
|
||||
/* func_print_disp */ &ZydisFormatterATTPrintDISP,
|
||||
/* func_print_imm */ &ZydisFormatterATTPrintIMM,
|
||||
/* func_print_typecast */ ZYAN_NULL,
|
||||
/* func_print_segment */ &ZydisFormatterBasePrintSegment,
|
||||
/* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes,
|
||||
/* func_print_decorator */ &ZydisFormatterBasePrintDecorator
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ZYDIS_FORMATTER_ATT_H
|
324
libs/zydis/include/Zydis/Internal/FormatterBase.h
Normal file
324
libs/zydis/include/Zydis/Internal/FormatterBase.h
Normal file
|
@ -0,0 +1,324 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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
|
||||
* Provides formatter functions that are shared between the different formatters.
|
||||
*/
|
||||
|
||||
#ifndef ZYDIS_FORMATTER_BASE_H
|
||||
#define ZYDIS_FORMATTER_BASE_H
|
||||
|
||||
#include <Zydis/Formatter.h>
|
||||
#include <Zydis/Internal/String.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Macros */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* String */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Appends an unsigned numeric value to the given string.
|
||||
*
|
||||
* @param formatter A pointer to the `ZydisFormatter` instance.
|
||||
* @param base The numeric base.
|
||||
* @param str The destination string.
|
||||
* @param value The value to append.
|
||||
* @param padding_length The padding length.
|
||||
* @param force_leading_number Enable this option to prepend a leading `0` if the first
|
||||
* character is non-numeric.
|
||||
*/
|
||||
#define ZYDIS_STRING_APPEND_NUM_U(formatter, base, str, value, padding_length, \
|
||||
force_leading_number) \
|
||||
switch (base) \
|
||||
{ \
|
||||
case ZYDIS_NUMERIC_BASE_DEC: \
|
||||
ZYAN_CHECK(ZydisStringAppendDecU(str, value, padding_length, \
|
||||
(formatter)->number_format[base][0].string, \
|
||||
(formatter)->number_format[base][1].string)); \
|
||||
break; \
|
||||
case ZYDIS_NUMERIC_BASE_HEX: \
|
||||
ZYAN_CHECK(ZydisStringAppendHexU(str, value, padding_length, force_leading_number, \
|
||||
(formatter)->hex_uppercase, \
|
||||
(formatter)->number_format[base][0].string, \
|
||||
(formatter)->number_format[base][1].string)); \
|
||||
break; \
|
||||
default: \
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT; \
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a signed numeric value to the given string.
|
||||
*
|
||||
* @param formatter A pointer to the `ZydisFormatter` instance.
|
||||
* @param base The numeric base.
|
||||
* @param str The destination string.
|
||||
* @param value The value to append.
|
||||
* @param padding_length The padding length.
|
||||
* @param force_leading_number Enable this option to prepend a leading `0`, if the first
|
||||
* character is non-numeric.
|
||||
* @param force_sign Enable to print the '+' sign for positive numbers.
|
||||
*/
|
||||
#define ZYDIS_STRING_APPEND_NUM_S(formatter, base, str, value, padding_length, \
|
||||
force_leading_number, force_sign) \
|
||||
switch (base) \
|
||||
{ \
|
||||
case ZYDIS_NUMERIC_BASE_DEC: \
|
||||
ZYAN_CHECK(ZydisStringAppendDecS(str, value, padding_length, force_sign, \
|
||||
(formatter)->number_format[base][0].string, \
|
||||
(formatter)->number_format[base][1].string)); \
|
||||
break; \
|
||||
case ZYDIS_NUMERIC_BASE_HEX: \
|
||||
ZYAN_CHECK(ZydisStringAppendHexS(str, value, padding_length, force_leading_number, \
|
||||
(formatter)->hex_uppercase, force_sign, \
|
||||
(formatter)->number_format[base][0].string, \
|
||||
(formatter)->number_format[base][1].string)); \
|
||||
break; \
|
||||
default: \
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT; \
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Buffer */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Invokes the `ZydisFormatterBufferAppend` routine, if tokenization is enabled for the
|
||||
* current pass.
|
||||
*
|
||||
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
||||
* @param type The token type.
|
||||
*
|
||||
* Using this macro instead of direct calls to `ZydisFormatterBufferAppend` greatly improves the
|
||||
* performance for non-tokenizing passes.
|
||||
*/
|
||||
#define ZYDIS_BUFFER_APPEND_TOKEN(buffer, type) \
|
||||
if ((buffer)->is_token_list) \
|
||||
{ \
|
||||
ZYAN_CHECK(ZydisFormatterBufferAppend(buffer, 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.
|
||||
*
|
||||
* Using this macro instead of direct calls to `ZydisFormatterBufferRemember` improves the
|
||||
* performance for non-tokenizing passes.
|
||||
*/
|
||||
#define ZYDIS_BUFFER_REMEMBER(buffer, state) \
|
||||
if ((buffer)->is_token_list) \
|
||||
{ \
|
||||
(state) = (ZyanUPointer)(buffer)->string.vector.data; \
|
||||
} else \
|
||||
{ \
|
||||
(state) = (ZyanUPointer)(buffer)->string.vector.size; \
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a string (`STR_`-prefix) or a predefined token-list (`TOK_`-prefix).
|
||||
*
|
||||
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
||||
* @param name The base name (without prefix) of the string- or token.
|
||||
*/
|
||||
#define ZYDIS_BUFFER_APPEND(buffer, name) \
|
||||
if ((buffer)->is_token_list) \
|
||||
{ \
|
||||
ZYAN_CHECK(ZydisFormatterBufferAppendPredefined(buffer, TOK_ ## name)); \
|
||||
} else \
|
||||
{ \
|
||||
ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_ ## name)); \
|
||||
}
|
||||
|
||||
// TODO: Implement `letter_case` for predefined tokens
|
||||
|
||||
/**
|
||||
* Appends a string (`STR_`-prefix) or a predefined token-list (`TOK_`-prefix).
|
||||
*
|
||||
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
||||
* @param name The base name (without prefix) of the string- or token.
|
||||
* @param letter_case The desired letter-case.
|
||||
*/
|
||||
#define ZYDIS_BUFFER_APPEND_CASE(buffer, name, letter_case) \
|
||||
if ((buffer)->is_token_list) \
|
||||
{ \
|
||||
ZYAN_CHECK(ZydisFormatterBufferAppendPredefined(buffer, TOK_ ## name)); \
|
||||
} else \
|
||||
{ \
|
||||
ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, &STR_ ## name, letter_case)); \
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Helper functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Buffer */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
// MSVC does not like the C99 flexible-array extension
|
||||
#ifdef ZYAN_MSVC
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4200)
|
||||
#endif
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
typedef struct ZydisPredefinedToken_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[];
|
||||
} ZydisPredefinedToken;
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
#ifdef ZYAN_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Appends a predefined token-list to the `buffer`.
|
||||
*
|
||||
* @param buffer A pointer to the `ZydisFormatterBuffer` struct.
|
||||
* @param data A pointer to the `ZydisPredefinedToken` struct.
|
||||
*
|
||||
* @return A zycore status code.
|
||||
*
|
||||
* This function is internally used to improve performance while adding static strings or multiple
|
||||
* tokens at once.
|
||||
*/
|
||||
ZYAN_INLINE ZyanStatus ZydisFormatterBufferAppendPredefined(ZydisFormatterBuffer* buffer,
|
||||
const ZydisPredefinedToken* data)
|
||||
{
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(data);
|
||||
|
||||
const ZyanUSize len = buffer->string.vector.size;
|
||||
ZYAN_ASSERT((len > 0) && (len < 256));
|
||||
if (buffer->capacity <= len + data->size)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZydisFormatterToken* const last = (ZydisFormatterToken*)buffer->string.vector.data - 1;
|
||||
last->next = (ZyanU8)len;
|
||||
|
||||
ZYAN_MEMCPY((ZyanU8*)buffer->string.vector.data + len, &data->data[0], data->size);
|
||||
|
||||
const ZyanUSize delta = len + data->next;
|
||||
buffer->capacity -= delta;
|
||||
buffer->string.vector.data = (ZyanU8*)buffer->string.vector.data + delta;
|
||||
buffer->string.vector.size = data->size - data->next;
|
||||
buffer->string.vector.capacity = ZYAN_MIN(buffer->capacity, 255);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* General */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Returns the size to be used as explicit size suffix (`AT&T`) or explicit typecast
|
||||
* (`INTEL`), if required.
|
||||
*
|
||||
* @param formatter A pointer to the `ZydisFormatter` instance.
|
||||
* @param context A pointer to the `ZydisFormatterContext` struct.
|
||||
* @param operand The instructions first memory operand.
|
||||
*
|
||||
* @return Returns the explicit size, if required, or `0`, if not needed.
|
||||
*
|
||||
* This function always returns a size different to `0`, if the `ZYDIS_FORMATTER_PROP_FORCE_SIZE`
|
||||
* is set to `ZYAN_TRUE`.
|
||||
*/
|
||||
ZyanU32 ZydisFormatterHelperGetExplicitSize(const ZydisFormatter* formatter,
|
||||
ZydisFormatterContext* context, const ZydisDecodedOperand* operand);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Formatter functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Operands */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterBaseFormatOperandREG(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterBaseFormatOperandPTR(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterBaseFormatOperandIMM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Elemental tokens */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintAddressABS(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintAddressREL(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintIMM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Optional tokens */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintSegment(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintPrefixes(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintDecorator(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisDecorator decorator);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ZYDIS_FORMATTER_BASE_H
|
271
libs/zydis/include/Zydis/Internal/FormatterIntel.h
Normal file
271
libs/zydis/include/Zydis/Internal/FormatterIntel.h
Normal file
|
@ -0,0 +1,271 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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
|
||||
* Implements the `INTEL` style instruction-formatter.
|
||||
*/
|
||||
|
||||
#ifndef ZYDIS_FORMATTER_INTEL_H
|
||||
#define ZYDIS_FORMATTER_INTEL_H
|
||||
|
||||
#include <Zydis/Formatter.h>
|
||||
#include <Zydis/Internal/FormatterBase.h>
|
||||
#include <Zydis/Internal/String.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Formatter functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Intel */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterIntelFormatInstruction(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterIntelFormatOperandMEM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintMnemonic(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintRegister(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg);
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintDISP(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintTypecast(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* MASM */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterIntelFormatInstructionMASM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintAddressMASM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Fomatter presets */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* INTEL */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* The default formatter configuration for `INTEL` style disassembly.
|
||||
*/
|
||||
static const ZydisFormatter FORMATTER_INTEL =
|
||||
{
|
||||
/* style */ ZYDIS_FORMATTER_STYLE_INTEL,
|
||||
/* force_memory_size */ ZYAN_FALSE,
|
||||
/* force_memory_seg */ ZYAN_FALSE,
|
||||
/* force_memory_scale */ ZYAN_TRUE,
|
||||
/* force_relative_branches */ ZYAN_FALSE,
|
||||
/* force_relative_riprel */ ZYAN_FALSE,
|
||||
/* print_branch_size */ ZYAN_FALSE,
|
||||
/* detailed_prefixes */ ZYAN_FALSE,
|
||||
/* addr_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED,
|
||||
/* addr_padding_absolute */ ZYDIS_PADDING_AUTO,
|
||||
/* addr_padding_relative */ 2,
|
||||
/* disp_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED,
|
||||
/* disp_padding */ 2,
|
||||
/* imm_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* imm_signedness */ ZYDIS_SIGNEDNESS_UNSIGNED,
|
||||
/* imm_padding */ 2,
|
||||
/* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_registers */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* hex_uppercase */ ZYAN_TRUE,
|
||||
/* hex_force_leading_number */ ZYAN_FALSE,
|
||||
/* number_format */
|
||||
{
|
||||
// ZYDIS_NUMERIC_BASE_DEC
|
||||
{
|
||||
// Prefix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
},
|
||||
// Suffix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
}
|
||||
},
|
||||
// ZYDIS_NUMERIC_BASE_HEX
|
||||
{
|
||||
// Prefix
|
||||
{
|
||||
/* string */ &FORMATTER_INTEL.number_format[
|
||||
ZYDIS_NUMERIC_BASE_HEX][0].string_data,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW("0x"),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
},
|
||||
// Suffix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
}
|
||||
}
|
||||
},
|
||||
/* func_pre_instruction */ ZYAN_NULL,
|
||||
/* func_post_instruction */ ZYAN_NULL,
|
||||
/* func_format_instruction */ &ZydisFormatterIntelFormatInstruction,
|
||||
/* func_pre_operand */ ZYAN_NULL,
|
||||
/* func_post_operand */ ZYAN_NULL,
|
||||
/* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG,
|
||||
/* func_format_operand_mem */ &ZydisFormatterIntelFormatOperandMEM,
|
||||
/* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR,
|
||||
/* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM,
|
||||
/* func_print_mnemonic */ &ZydisFormatterIntelPrintMnemonic,
|
||||
/* func_print_register */ &ZydisFormatterIntelPrintRegister,
|
||||
/* func_print_address_abs */ &ZydisFormatterBasePrintAddressABS,
|
||||
/* func_print_address_rel */ &ZydisFormatterBasePrintAddressREL,
|
||||
/* func_print_disp */ &ZydisFormatterIntelPrintDISP,
|
||||
/* func_print_imm */ &ZydisFormatterBasePrintIMM,
|
||||
/* func_print_typecast */ &ZydisFormatterIntelPrintTypecast,
|
||||
/* func_print_segment */ &ZydisFormatterBasePrintSegment,
|
||||
/* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes,
|
||||
/* func_print_decorator */ &ZydisFormatterBasePrintDecorator
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* MASM */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* The default formatter configuration for `MASM` style disassembly.
|
||||
*/
|
||||
static const ZydisFormatter FORMATTER_INTEL_MASM =
|
||||
{
|
||||
/* style */ ZYDIS_FORMATTER_STYLE_INTEL_MASM,
|
||||
/* force_memory_size */ ZYAN_TRUE,
|
||||
/* force_memory_seg */ ZYAN_FALSE,
|
||||
/* force_memory_scale */ ZYAN_TRUE,
|
||||
/* force_relative_branches */ ZYAN_FALSE,
|
||||
/* force_relative_riprel */ ZYAN_FALSE,
|
||||
/* print_branch_size */ ZYAN_FALSE,
|
||||
/* detailed_prefixes */ ZYAN_FALSE,
|
||||
/* addr_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* addr_signedness */ ZYDIS_SIGNEDNESS_SIGNED,
|
||||
/* addr_padding_absolute */ ZYDIS_PADDING_DISABLED,
|
||||
/* addr_padding_relative */ ZYDIS_PADDING_DISABLED,
|
||||
/* disp_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* disp_signedness */ ZYDIS_SIGNEDNESS_SIGNED,
|
||||
/* disp_padding */ ZYDIS_PADDING_DISABLED,
|
||||
/* imm_base */ ZYDIS_NUMERIC_BASE_HEX,
|
||||
/* imm_signedness */ ZYDIS_SIGNEDNESS_AUTO,
|
||||
/* imm_padding */ ZYDIS_PADDING_DISABLED,
|
||||
/* case_prefixes */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_mnemonic */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_registers */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_typecasts */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* case_decorators */ ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/* hex_uppercase */ ZYAN_TRUE,
|
||||
/* hex_force_leading_number */ ZYAN_TRUE,
|
||||
/* number_format */
|
||||
{
|
||||
// ZYDIS_NUMERIC_BASE_DEC
|
||||
{
|
||||
// Prefix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
},
|
||||
// Suffix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
}
|
||||
},
|
||||
// ZYDIS_NUMERIC_BASE_HEX
|
||||
{
|
||||
// Prefix
|
||||
{
|
||||
/* string */ ZYAN_NULL,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW(""),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
},
|
||||
// Suffix
|
||||
{
|
||||
/* string */ &FORMATTER_INTEL_MASM.number_format[
|
||||
ZYDIS_NUMERIC_BASE_HEX][1].string_data,
|
||||
/* string_data */ ZYAN_DEFINE_STRING_VIEW("h"),
|
||||
/* buffer */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
}
|
||||
}
|
||||
},
|
||||
/* func_pre_instruction */ ZYAN_NULL,
|
||||
/* func_post_instruction */ ZYAN_NULL,
|
||||
/* func_format_instruction */ &ZydisFormatterIntelFormatInstructionMASM,
|
||||
/* func_pre_operand */ ZYAN_NULL,
|
||||
/* func_post_operand */ ZYAN_NULL,
|
||||
/* func_format_operand_reg */ &ZydisFormatterBaseFormatOperandREG,
|
||||
/* func_format_operand_mem */ &ZydisFormatterIntelFormatOperandMEM,
|
||||
/* func_format_operand_ptr */ &ZydisFormatterBaseFormatOperandPTR,
|
||||
/* func_format_operand_imm */ &ZydisFormatterBaseFormatOperandIMM,
|
||||
/* func_print_mnemonic */ &ZydisFormatterIntelPrintMnemonic,
|
||||
/* func_print_register */ &ZydisFormatterIntelPrintRegister,
|
||||
/* func_print_address_abs */ &ZydisFormatterIntelPrintAddressMASM,
|
||||
/* func_print_address_rel */ &ZydisFormatterIntelPrintAddressMASM,
|
||||
/* func_print_disp */ &ZydisFormatterIntelPrintDISP,
|
||||
/* func_print_imm */ &ZydisFormatterBasePrintIMM,
|
||||
/* func_print_typecast */ &ZydisFormatterIntelPrintTypecast,
|
||||
/* func_print_segment */ &ZydisFormatterBasePrintSegment,
|
||||
/* func_print_prefixes */ &ZydisFormatterBasePrintPrefixes,
|
||||
/* func_print_decorator */ &ZydisFormatterBasePrintDecorator
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ZYDIS_FORMATTER_INTEL_H
|
979
libs/zydis/include/Zydis/Internal/SharedData.h
Normal file
979
libs/zydis/include/Zydis/Internal/SharedData.h
Normal file
|
@ -0,0 +1,979 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#ifndef ZYDIS_INTERNAL_SHAREDDATA_H
|
||||
#define ZYDIS_INTERNAL_SHAREDDATA_H
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zydis/Mnemonic.h>
|
||||
#include <Zydis/Register.h>
|
||||
#include <Zydis/SharedTypes.h>
|
||||
#include <Zydis/DecoderTypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Enums and types */
|
||||
/* ============================================================================================== */
|
||||
|
||||
// MSVC does not like types other than (un-)signed int for bit-fields
|
||||
#ifdef ZYAN_MSVC
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4214)
|
||||
#endif
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Operand definition */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisSemanticOperandType` enum.
|
||||
*/
|
||||
typedef enum ZydisSemanticOperandType_
|
||||
{
|
||||
ZYDIS_SEMANTIC_OPTYPE_UNUSED,
|
||||
ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG,
|
||||
ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM,
|
||||
ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1,
|
||||
ZYDIS_SEMANTIC_OPTYPE_GPR8,
|
||||
ZYDIS_SEMANTIC_OPTYPE_GPR16,
|
||||
ZYDIS_SEMANTIC_OPTYPE_GPR32,
|
||||
ZYDIS_SEMANTIC_OPTYPE_GPR64,
|
||||
ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64,
|
||||
ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64,
|
||||
ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32,
|
||||
ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ,
|
||||
ZYDIS_SEMANTIC_OPTYPE_FPR,
|
||||
ZYDIS_SEMANTIC_OPTYPE_MMX,
|
||||
ZYDIS_SEMANTIC_OPTYPE_XMM,
|
||||
ZYDIS_SEMANTIC_OPTYPE_YMM,
|
||||
ZYDIS_SEMANTIC_OPTYPE_ZMM,
|
||||
ZYDIS_SEMANTIC_OPTYPE_TMM,
|
||||
ZYDIS_SEMANTIC_OPTYPE_BND,
|
||||
ZYDIS_SEMANTIC_OPTYPE_SREG,
|
||||
ZYDIS_SEMANTIC_OPTYPE_CR,
|
||||
ZYDIS_SEMANTIC_OPTYPE_DR,
|
||||
ZYDIS_SEMANTIC_OPTYPE_MASK,
|
||||
ZYDIS_SEMANTIC_OPTYPE_MEM,
|
||||
ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBX,
|
||||
ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY,
|
||||
ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBZ,
|
||||
ZYDIS_SEMANTIC_OPTYPE_IMM,
|
||||
ZYDIS_SEMANTIC_OPTYPE_REL,
|
||||
ZYDIS_SEMANTIC_OPTYPE_PTR,
|
||||
ZYDIS_SEMANTIC_OPTYPE_AGEN,
|
||||
ZYDIS_SEMANTIC_OPTYPE_MOFFS,
|
||||
ZYDIS_SEMANTIC_OPTYPE_MIB,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE = ZYDIS_SEMANTIC_OPTYPE_MIB,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SEMANTIC_OPTYPE_MAX_VALUE)
|
||||
} ZydisSemanticOperandType;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInternalElementType` enum.
|
||||
*/
|
||||
typedef enum ZydisInternalElementType_
|
||||
{
|
||||
ZYDIS_IELEMENT_TYPE_INVALID,
|
||||
ZYDIS_IELEMENT_TYPE_VARIABLE,
|
||||
ZYDIS_IELEMENT_TYPE_STRUCT,
|
||||
ZYDIS_IELEMENT_TYPE_INT,
|
||||
ZYDIS_IELEMENT_TYPE_UINT,
|
||||
ZYDIS_IELEMENT_TYPE_INT1,
|
||||
ZYDIS_IELEMENT_TYPE_INT8,
|
||||
ZYDIS_IELEMENT_TYPE_INT16,
|
||||
ZYDIS_IELEMENT_TYPE_INT32,
|
||||
ZYDIS_IELEMENT_TYPE_INT64,
|
||||
ZYDIS_IELEMENT_TYPE_UINT8,
|
||||
ZYDIS_IELEMENT_TYPE_UINT16,
|
||||
ZYDIS_IELEMENT_TYPE_UINT32,
|
||||
ZYDIS_IELEMENT_TYPE_UINT64,
|
||||
ZYDIS_IELEMENT_TYPE_UINT128,
|
||||
ZYDIS_IELEMENT_TYPE_UINT256,
|
||||
ZYDIS_IELEMENT_TYPE_FLOAT16,
|
||||
ZYDIS_IELEMENT_TYPE_FLOAT16X2,
|
||||
ZYDIS_IELEMENT_TYPE_FLOAT32,
|
||||
ZYDIS_IELEMENT_TYPE_FLOAT64,
|
||||
ZYDIS_IELEMENT_TYPE_FLOAT80,
|
||||
ZYDIS_IELEMENT_TYPE_BCD80,
|
||||
ZYDIS_IELEMENT_TYPE_CC3,
|
||||
ZYDIS_IELEMENT_TYPE_CC5,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_IELEMENT_TYPE_MAX_VALUE = ZYDIS_IELEMENT_TYPE_CC5,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_IELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_TYPE_MAX_VALUE)
|
||||
} ZydisInternalElementType;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisImplicitRegisterType` enum.
|
||||
*/
|
||||
typedef enum ZydisImplicitRegisterType_
|
||||
{
|
||||
// TODO: Rename OSZ|ASZ|SSZ_
|
||||
ZYDIS_IMPLREG_TYPE_STATIC,
|
||||
ZYDIS_IMPLREG_TYPE_GPR_OSZ,
|
||||
ZYDIS_IMPLREG_TYPE_GPR_ASZ,
|
||||
ZYDIS_IMPLREG_TYPE_IP_ASZ,
|
||||
ZYDIS_IMPLREG_TYPE_IP_SSZ,
|
||||
ZYDIS_IMPLREG_TYPE_GPR_SSZ,
|
||||
ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_IMPLREG_TYPE_MAX_VALUE = ZYDIS_IMPLREG_TYPE_FLAGS_SSZ,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_IMPLREG_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLREG_TYPE_MAX_VALUE)
|
||||
} ZydisImplicitRegisterType;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisImplicitMemBase` enum.
|
||||
*/
|
||||
typedef enum ZydisImplicitMemBase_
|
||||
{
|
||||
// TODO: Rename OSZ|ASZ|SSZ_
|
||||
ZYDIS_IMPLMEM_BASE_AGPR_REG,
|
||||
ZYDIS_IMPLMEM_BASE_AGPR_RM,
|
||||
ZYDIS_IMPLMEM_BASE_AAX,
|
||||
ZYDIS_IMPLMEM_BASE_ADX,
|
||||
ZYDIS_IMPLMEM_BASE_ABX,
|
||||
ZYDIS_IMPLMEM_BASE_ASI,
|
||||
ZYDIS_IMPLMEM_BASE_ADI,
|
||||
ZYDIS_IMPLMEM_BASE_SSP,
|
||||
ZYDIS_IMPLMEM_BASE_SBP,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_IMPLMEM_BASE_MAX_VALUE = ZYDIS_IMPLMEM_BASE_SBP,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_IMPLMEM_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IMPLMEM_BASE_MAX_VALUE)
|
||||
} ZydisImplicitMemBase;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
|
||||
// enum types
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ACTION_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_REGISTER_REQUIRED_BITS <= 16);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS <= 8);
|
||||
|
||||
/**
|
||||
* Defines the `ZydisOperandDefinition` struct.
|
||||
*/
|
||||
typedef struct ZydisOperandDefinition_
|
||||
{
|
||||
ZyanU8 type ZYAN_BITFIELD(ZYDIS_SEMANTIC_OPTYPE_REQUIRED_BITS);
|
||||
ZyanU8 visibility ZYAN_BITFIELD(ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS);
|
||||
ZyanU8 actions ZYAN_BITFIELD(ZYDIS_OPERAND_ACTION_REQUIRED_BITS);
|
||||
ZyanU16 size[3];
|
||||
ZyanU8 element_type ZYAN_BITFIELD(ZYDIS_IELEMENT_TYPE_REQUIRED_BITS);
|
||||
union
|
||||
{
|
||||
ZyanU8 encoding ZYAN_BITFIELD(ZYDIS_OPERAND_ENCODING_REQUIRED_BITS);
|
||||
struct
|
||||
{
|
||||
ZyanU8 type ZYAN_BITFIELD(ZYDIS_IMPLREG_TYPE_REQUIRED_BITS);
|
||||
union
|
||||
{
|
||||
ZyanU16 reg ZYAN_BITFIELD(ZYDIS_REGISTER_REQUIRED_BITS);
|
||||
ZyanU8 id ZYAN_BITFIELD(6);
|
||||
} reg;
|
||||
} reg;
|
||||
struct
|
||||
{
|
||||
ZyanU8 seg ZYAN_BITFIELD(3);
|
||||
ZyanU8 base ZYAN_BITFIELD(ZYDIS_IMPLMEM_BASE_REQUIRED_BITS);
|
||||
} mem;
|
||||
} op;
|
||||
ZyanBool is_multisource4 ZYAN_BITFIELD(1);
|
||||
ZyanBool ignore_seg_override ZYAN_BITFIELD(1);
|
||||
} ZydisOperandDefinition;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Instruction definition */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisReadWriteAction` enum.
|
||||
*/
|
||||
typedef enum ZydisReadWriteAction_
|
||||
{
|
||||
ZYDIS_RW_ACTION_NONE,
|
||||
ZYDIS_RW_ACTION_READ,
|
||||
ZYDIS_RW_ACTION_WRITE,
|
||||
ZYDIS_RW_ACTION_READWRITE,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_RW_ACTION_MAX_VALUE = ZYDIS_RW_ACTION_READWRITE,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_RW_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_RW_ACTION_MAX_VALUE)
|
||||
} ZydisReadWriteAction;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInternalVectorLength` enum.
|
||||
*/
|
||||
typedef enum ZydisInternalVectorLength_
|
||||
{
|
||||
ZYDIS_IVECTOR_LENGTH_DEFAULT,
|
||||
ZYDIS_IVECTOR_LENGTH_FIXED_128,
|
||||
ZYDIS_IVECTOR_LENGTH_FIXED_256,
|
||||
ZYDIS_IVECTOR_LENGTH_FIXED_512,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_IVECTOR_LENGTH_MAX_VALUE = ZYDIS_IVECTOR_LENGTH_FIXED_512,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IVECTOR_LENGTH_MAX_VALUE)
|
||||
} ZydisInternalVectorLength;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInternalElementSize` enum.
|
||||
*/
|
||||
typedef enum ZydisInternalElementSize_
|
||||
{
|
||||
ZYDIS_IELEMENT_SIZE_INVALID,
|
||||
ZYDIS_IELEMENT_SIZE_8,
|
||||
ZYDIS_IELEMENT_SIZE_16,
|
||||
ZYDIS_IELEMENT_SIZE_32,
|
||||
ZYDIS_IELEMENT_SIZE_64,
|
||||
ZYDIS_IELEMENT_SIZE_128,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_IELEMENT_SIZE_MAX_VALUE = ZYDIS_IELEMENT_SIZE_128,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_IELEMENT_SIZE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_IELEMENT_SIZE_MAX_VALUE)
|
||||
} ZydisInternalElementSize;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisEVEXFunctionality` enum.
|
||||
*/
|
||||
typedef enum ZydisEVEXFunctionality_
|
||||
{
|
||||
ZYDIS_EVEX_FUNC_INVALID,
|
||||
/**
|
||||
* `EVEX.b` enables broadcast functionality.
|
||||
*/
|
||||
ZYDIS_EVEX_FUNC_BC,
|
||||
/**
|
||||
* `EVEX.b` enables embedded-rounding functionality.
|
||||
*/
|
||||
ZYDIS_EVEX_FUNC_RC,
|
||||
/**
|
||||
* `EVEX.b` enables sae functionality.
|
||||
*/
|
||||
ZYDIS_EVEX_FUNC_SAE,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_EVEX_FUNC_MAX_VALUE = ZYDIS_EVEX_FUNC_SAE,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_EVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_FUNC_MAX_VALUE)
|
||||
} ZydisEVEXFunctionality;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisEVEXTupleType` enum.
|
||||
*/
|
||||
typedef enum ZydisEVEXTupleType_
|
||||
{
|
||||
ZYDIS_TUPLETYPE_INVALID,
|
||||
/**
|
||||
* Full Vector
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_FV,
|
||||
/**
|
||||
* Half Vector
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_HV,
|
||||
/**
|
||||
* Full Vector Mem
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_FVM,
|
||||
/**
|
||||
* Tuple1 Scalar
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_T1S,
|
||||
/**
|
||||
* Tuple1 Fixed
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_T1F,
|
||||
/**
|
||||
* Tuple1 4x32
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_T1_4X,
|
||||
/**
|
||||
* Gather / Scatter
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_GSCAT,
|
||||
/**
|
||||
* Tuple2
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_T2,
|
||||
/**
|
||||
* Tuple4
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_T4,
|
||||
/**
|
||||
* Tuple8
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_T8,
|
||||
/**
|
||||
* Half Mem
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_HVM,
|
||||
/**
|
||||
* QuarterMem
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_QVM,
|
||||
/**
|
||||
* OctMem
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_OVM,
|
||||
/**
|
||||
* Mem128
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_M128,
|
||||
/**
|
||||
* MOVDDUP
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_DUP,
|
||||
/**
|
||||
* Quarter of the vector-length.
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_QUARTER,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_MAX_VALUE = ZYDIS_TUPLETYPE_QUARTER,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_TUPLETYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_TUPLETYPE_MAX_VALUE)
|
||||
} ZydisEVEXTupleType;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisMVEXFunctionality` enum.
|
||||
*/
|
||||
typedef enum ZydisMVEXFunctionality_
|
||||
{
|
||||
/**
|
||||
* The `MVEX.SSS` value is ignored.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_IGNORED,
|
||||
/**
|
||||
* `MVEX.SSS` must be `000b`.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_INVALID,
|
||||
/**
|
||||
* `MVEX.SSS` controls embedded-rounding functionality.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_RC,
|
||||
/**
|
||||
* `MVEX.SSS` controls sae functionality.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SAE,
|
||||
/**
|
||||
* No special operation (32bit float elements).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_F_32,
|
||||
/**
|
||||
* No special operation (32bit uint elements).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_I_32,
|
||||
/**
|
||||
* No special operation (64bit float elements).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_F_64,
|
||||
/**
|
||||
* No special operation (64bit uint elements).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_I_64,
|
||||
/**
|
||||
* Sf32(reg) or Si32(reg).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SWIZZLE_32,
|
||||
/**
|
||||
* Sf64(reg) or Si64(reg).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SWIZZLE_64,
|
||||
/**
|
||||
* Sf32(mem).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SF_32,
|
||||
/**
|
||||
* Sf32(mem) broadcast only.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SF_32_BCST,
|
||||
/**
|
||||
* Sf32(mem) broadcast 4to16 only.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16,
|
||||
/**
|
||||
* Sf64(mem).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SF_64,
|
||||
/**
|
||||
* Si32(mem).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SI_32,
|
||||
/**
|
||||
* Si32(mem) broadcast only.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SI_32_BCST,
|
||||
/**
|
||||
* Si32(mem) broadcast 4to16 only.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16,
|
||||
/**
|
||||
* Si64(mem).
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_SI_64,
|
||||
/**
|
||||
* Uf32.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_UF_32,
|
||||
/**
|
||||
* Uf64.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_UF_64,
|
||||
/**
|
||||
* Ui32.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_UI_32,
|
||||
/**
|
||||
* Ui64.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_UI_64,
|
||||
/**
|
||||
* Df32.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_DF_32,
|
||||
/**
|
||||
* Df64.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_DF_64,
|
||||
/**
|
||||
* Di32.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_DI_32,
|
||||
/**
|
||||
* Di64.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_DI_64,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_MAX_VALUE = ZYDIS_MVEX_FUNC_DI_64,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_MVEX_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_FUNC_MAX_VALUE)
|
||||
} ZydisMVEXFunctionality;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisVEXStaticBroadcast` enum.
|
||||
*/
|
||||
typedef enum ZydisVEXStaticBroadcast
|
||||
{
|
||||
ZYDIS_VEX_STATIC_BROADCAST_NONE,
|
||||
ZYDIS_VEX_STATIC_BROADCAST_1_TO_2,
|
||||
ZYDIS_VEX_STATIC_BROADCAST_1_TO_4,
|
||||
ZYDIS_VEX_STATIC_BROADCAST_1_TO_8,
|
||||
ZYDIS_VEX_STATIC_BROADCAST_1_TO_16,
|
||||
ZYDIS_VEX_STATIC_BROADCAST_1_TO_32,
|
||||
ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_VEX_STATIC_BROADCAST_2_TO_4,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS =
|
||||
ZYAN_BITS_TO_REPRESENT(ZYDIS_VEX_STATIC_BROADCAST_MAX_VALUE)
|
||||
} ZydisVEXStaticBroadcast;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisEVEXStaticBroadcast` enum.
|
||||
*/
|
||||
typedef enum ZydisEVEXStaticBroadcast_
|
||||
{
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_NONE,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_1_TO_2,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_1_TO_4,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_1_TO_8,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_1_TO_16,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_1_TO_32,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_1_TO_64,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_2_TO_4,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_2_TO_8,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_2_TO_16,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_4_TO_8,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_4_TO_16,
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_EVEX_STATIC_BROADCAST_8_TO_16,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS =
|
||||
ZYAN_BITS_TO_REPRESENT(ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE)
|
||||
} ZydisEVEXStaticBroadcast;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisMVEXStaticBroadcast` enum.
|
||||
*/
|
||||
typedef enum ZydisMVEXStaticBroadcast_
|
||||
{
|
||||
ZYDIS_MVEX_STATIC_BROADCAST_NONE,
|
||||
ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8,
|
||||
ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16,
|
||||
ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8,
|
||||
ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE = ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS =
|
||||
ZYAN_BITS_TO_REPRESENT(ZYDIS_MVEX_STATIC_BROADCAST_MAX_VALUE)
|
||||
} ZydisMVEXStaticBroadcast;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisMaskPolicy` enum.
|
||||
*/
|
||||
typedef enum ZydisMaskPolicy_
|
||||
{
|
||||
ZYDIS_MASK_POLICY_INVALID,
|
||||
/**
|
||||
* The instruction accepts mask-registers other than the default-mask (K0), but
|
||||
* does not require them.
|
||||
*/
|
||||
ZYDIS_MASK_POLICY_ALLOWED,
|
||||
/**
|
||||
* The instruction requires a mask-register other than the default-mask (K0).
|
||||
*/
|
||||
ZYDIS_MASK_POLICY_REQUIRED,
|
||||
/**
|
||||
* The instruction does not allow a mask-register other than the default-mask (K0).
|
||||
*/
|
||||
ZYDIS_MASK_POLICY_FORBIDDEN,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_MASK_POLICY_MAX_VALUE = ZYDIS_MASK_POLICY_FORBIDDEN,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_MASK_POLICY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_POLICY_MAX_VALUE)
|
||||
} ZydisMaskPolicy;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisMaskOverride` enum.
|
||||
*/
|
||||
typedef enum ZydisMaskOverride_
|
||||
{
|
||||
ZYDIS_MASK_OVERRIDE_DEFAULT,
|
||||
ZYDIS_MASK_OVERRIDE_ZEROING,
|
||||
ZYDIS_MASK_OVERRIDE_CONTROL,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_MASK_OVERRIDE_MAX_VALUE = ZYDIS_MASK_OVERRIDE_CONTROL,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_MASK_OVERRIDE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_OVERRIDE_MAX_VALUE)
|
||||
} ZydisMaskOverride;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#define ZYDIS_OPDEF_REQUIRED_BITS \
|
||||
ZYAN_MAX(ZYDIS_REGKIND_REQUIRED_BITS, ZYDIS_MEMOP_TYPE_REQUIRED_BITS + 1) + 1
|
||||
|
||||
#define ZYDIS_OPDEF_GET_REG(operand_definition) \
|
||||
((operand_definition) & ((1 << ZYDIS_REGKIND_REQUIRED_BITS ) - 1))
|
||||
|
||||
#define ZYDIS_OPDEF_GET_MEM(operand_definition) \
|
||||
((operand_definition) & ((1 << ZYDIS_MEMOP_TYPE_REQUIRED_BITS) - 1))
|
||||
|
||||
#define ZYDIS_OPDEF_GET_REG_HIGH_BIT(operand_definition) \
|
||||
(((operand_definition) >> ZYDIS_REGKIND_REQUIRED_BITS ) & 0x01)
|
||||
|
||||
#define ZYDIS_OPDEF_GET_MEM_HIGH_BIT(operand_definition) \
|
||||
(((operand_definition) >> ZYDIS_MEMOP_TYPE_REQUIRED_BITS) & 0x01)
|
||||
|
||||
// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
|
||||
// enum types
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_MNEMONIC_REQUIRED_BITS <= 16);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_CATEGORY_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_ISA_SET_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_ISA_EXT_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_BRANCH_TYPE_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_OPDEF_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_RW_ACTION_REQUIRED_BITS <= 8);
|
||||
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
# define ZYDIS_INSTRUCTION_DEFINITION_BASE \
|
||||
ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \
|
||||
ZyanU8 operand_count ZYAN_BITFIELD( 4); \
|
||||
ZyanU8 operand_count_visible ZYAN_BITFIELD( 3); \
|
||||
ZyanU16 operand_reference ZYAN_BITFIELD(15); \
|
||||
ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \
|
||||
ZyanU8 address_size_map ZYAN_BITFIELD( 2); \
|
||||
ZyanU8 flags_reference ZYAN_BITFIELD( 7); \
|
||||
ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \
|
||||
ZyanBool no_compat_mode ZYAN_BITFIELD( 1); \
|
||||
ZyanU8 category ZYAN_BITFIELD(ZYDIS_CATEGORY_REQUIRED_BITS); \
|
||||
ZyanU8 isa_set ZYAN_BITFIELD(ZYDIS_ISA_SET_REQUIRED_BITS); \
|
||||
ZyanU8 isa_ext ZYAN_BITFIELD(ZYDIS_ISA_EXT_REQUIRED_BITS); \
|
||||
ZyanU8 branch_type ZYAN_BITFIELD(ZYDIS_BRANCH_TYPE_REQUIRED_BITS); \
|
||||
ZyanU8 exception_class ZYAN_BITFIELD(ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS); \
|
||||
ZyanU8 op_reg ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \
|
||||
ZyanU8 op_rm ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \
|
||||
ZyanU8 cpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
|
||||
ZyanU8 fpu_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
|
||||
ZyanU8 xmm_state ZYAN_BITFIELD(ZYDIS_RW_ACTION_REQUIRED_BITS); \
|
||||
ZyanBool accepts_segment ZYAN_BITFIELD( 1)
|
||||
#else
|
||||
# define ZYDIS_INSTRUCTION_DEFINITION_BASE \
|
||||
ZyanU16 mnemonic ZYAN_BITFIELD(ZYDIS_MNEMONIC_REQUIRED_BITS); \
|
||||
ZyanU8 operand_size_map ZYAN_BITFIELD( 3); \
|
||||
ZyanU8 address_size_map ZYAN_BITFIELD( 2); \
|
||||
ZyanBool requires_protected_mode ZYAN_BITFIELD( 1); \
|
||||
ZyanBool no_compat_mode ZYAN_BITFIELD( 1); \
|
||||
ZyanU8 op_reg ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS); \
|
||||
ZyanU8 op_rm ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS)
|
||||
#endif
|
||||
|
||||
#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR \
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE; \
|
||||
ZyanU8 op_ndsndd ZYAN_BITFIELD(ZYDIS_OPDEF_REQUIRED_BITS)
|
||||
|
||||
#define ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL \
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR; \
|
||||
ZyanBool is_gather ZYAN_BITFIELD( 1); \
|
||||
ZyanBool no_source_dest_match ZYAN_BITFIELD( 1); \
|
||||
ZyanBool no_source_source_match ZYAN_BITFIELD( 1) // TODO: Could be moved to VEX
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionDefinition` struct.
|
||||
*/
|
||||
typedef struct ZydisInstructionDefinition_
|
||||
{
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE;
|
||||
} ZydisInstructionDefinition;
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionDefinitionLEGACY` struct.
|
||||
*/
|
||||
typedef struct ZydisInstructionDefinitionLEGACY_
|
||||
{
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE;
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
ZyanBool is_privileged ZYAN_BITFIELD( 1);
|
||||
#endif
|
||||
ZyanBool accepts_LOCK ZYAN_BITFIELD( 1);
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
ZyanBool accepts_REP ZYAN_BITFIELD( 1);
|
||||
ZyanBool accepts_REPEREPZ ZYAN_BITFIELD( 1);
|
||||
ZyanBool accepts_REPNEREPNZ ZYAN_BITFIELD( 1);
|
||||
ZyanBool accepts_BOUND ZYAN_BITFIELD( 1);
|
||||
ZyanBool accepts_XACQUIRE ZYAN_BITFIELD( 1);
|
||||
ZyanBool accepts_XRELEASE ZYAN_BITFIELD( 1);
|
||||
ZyanBool accepts_NOTRACK ZYAN_BITFIELD( 1);
|
||||
ZyanBool accepts_hle_without_lock ZYAN_BITFIELD( 1);
|
||||
ZyanBool accepts_branch_hints ZYAN_BITFIELD( 1);
|
||||
#endif
|
||||
} ZydisInstructionDefinitionLEGACY;
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionDefinition3DNOW` struct.
|
||||
*/
|
||||
typedef struct ZydisInstructionDefinition3DNOW_
|
||||
{
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE;
|
||||
} ZydisInstructionDefinition3DNOW;
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionDefinitionXOP` struct.
|
||||
*/
|
||||
typedef struct ZydisInstructionDefinitionXOP_
|
||||
{
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR;
|
||||
} ZydisInstructionDefinitionXOP;
|
||||
|
||||
// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
|
||||
// enum types
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionDefinitionVEX` struct.
|
||||
*/
|
||||
typedef struct ZydisInstructionDefinitionVEX_
|
||||
{
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_VEX_STATIC_BROADCAST_REQUIRED_BITS);
|
||||
#endif
|
||||
} ZydisInstructionDefinitionVEX;
|
||||
|
||||
#ifndef ZYDIS_DISABLE_AVX512
|
||||
|
||||
// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
|
||||
// enum types
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_TUPLETYPE_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_EVEX_FUNC_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionDefinitionEVEX` struct.
|
||||
*/
|
||||
typedef struct ZydisInstructionDefinitionEVEX_
|
||||
{
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
ZyanU8 vector_length ZYAN_BITFIELD(ZYDIS_IVECTOR_LENGTH_REQUIRED_BITS);
|
||||
ZyanU8 tuple_type ZYAN_BITFIELD(ZYDIS_TUPLETYPE_REQUIRED_BITS);
|
||||
ZyanU8 element_size ZYAN_BITFIELD(ZYDIS_IELEMENT_SIZE_REQUIRED_BITS);
|
||||
ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_EVEX_FUNC_REQUIRED_BITS);
|
||||
#endif
|
||||
ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);
|
||||
ZyanBool accepts_zero_mask ZYAN_BITFIELD( 1);
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
ZyanU8 mask_override ZYAN_BITFIELD(ZYDIS_MASK_OVERRIDE_REQUIRED_BITS);
|
||||
ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_EVEX_STATIC_BROADCAST_REQUIRED_BITS);
|
||||
#endif
|
||||
} ZydisInstructionDefinitionEVEX;
|
||||
#endif
|
||||
|
||||
#ifndef ZYDIS_DISABLE_KNC
|
||||
|
||||
// MSVC does not correctly execute the `pragma pack(1)` compiler-directive, if we use the correct
|
||||
// enum types
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_MVEX_FUNC_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_MASK_POLICY_REQUIRED_BITS <= 8);
|
||||
ZYAN_STATIC_ASSERT(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS <= 8);
|
||||
|
||||
/**
|
||||
* Defines the `ZydisInstructionDefinitionMVEX` struct.
|
||||
*/
|
||||
typedef struct ZydisInstructionDefinitionMVEX_
|
||||
{
|
||||
ZYDIS_INSTRUCTION_DEFINITION_BASE_VECTOR_INTEL;
|
||||
ZyanU8 functionality ZYAN_BITFIELD(ZYDIS_MVEX_FUNC_REQUIRED_BITS);
|
||||
ZyanU8 mask_policy ZYAN_BITFIELD(ZYDIS_MASK_POLICY_REQUIRED_BITS);
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
ZyanBool has_element_granularity ZYAN_BITFIELD( 1);
|
||||
ZyanU8 broadcast ZYAN_BITFIELD(ZYDIS_MVEX_STATIC_BROADCAST_REQUIRED_BITS);
|
||||
#endif
|
||||
} ZydisInstructionDefinitionMVEX;
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
#ifdef ZYAN_MSVC
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Accessed CPU/FPU flags */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Contains information about the CPU/FPU flags accessed by an instruction.
|
||||
*
|
||||
* We don't want this struct to be packed! A pointer to the individual members will be used by the
|
||||
* `ZydisDecodedInstruction` struct.
|
||||
*/
|
||||
typedef struct ZydisDefinitionAccessedFlags_
|
||||
{
|
||||
ZydisAccessedFlags cpu_flags;
|
||||
ZydisAccessedFlags fpu_flags;
|
||||
} ZydisDefinitionAccessedFlags;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Instruction definition */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Returns the instruction-definition with the given `encoding` and `id`.
|
||||
*
|
||||
* @param encoding The instruction-encoding.
|
||||
* @param id The definition-id.
|
||||
* @param definition A pointer to the variable that receives a pointer to the instruction-
|
||||
* definition.
|
||||
*/
|
||||
ZYDIS_NO_EXPORT void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding,
|
||||
ZyanU16 id, const ZydisInstructionDefinition** definition);
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Operand definition */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
/**
|
||||
* Returns the the operand-definitions for the given instruction-`definition`.
|
||||
*
|
||||
* @param definition A pointer to the instruction-definition.
|
||||
*
|
||||
* @return A pointer to the first operand definition of the instruction, or `ZYAN_NULL`.
|
||||
*/
|
||||
ZYDIS_NO_EXPORT const ZydisOperandDefinition* ZydisGetOperandDefinitions(
|
||||
const ZydisInstructionDefinition* definition);
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Element info */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
/**
|
||||
* Returns the actual type and size of an internal element-type.
|
||||
*
|
||||
* @param element The internal element type.
|
||||
* @param type The actual element type.
|
||||
* @param size The element size.
|
||||
*/
|
||||
ZYDIS_NO_EXPORT void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type,
|
||||
ZydisElementSize* size);
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Accessed CPU flags */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
/**
|
||||
* Returns the the operand-definitions for the given instruction-`definition`.
|
||||
*
|
||||
* @param definition A pointer to the instruction-definition.
|
||||
* @param flags A pointer to the variable that receives the `ZydisDefinitionAccessedFlags`
|
||||
* struct.
|
||||
*
|
||||
* @return `ZYAN_TRUE`, if the instruction accesses any flags, or `ZYAN_FALSE`, if not.
|
||||
*/
|
||||
ZYDIS_NO_EXPORT ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition,
|
||||
const ZydisDefinitionAccessedFlags** flags);
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ZYDIS_INTERNAL_SHAREDDATA_H */
|
470
libs/zydis/include/Zydis/Internal/String.h
Normal file
470
libs/zydis/include/Zydis/Internal/String.h
Normal file
|
@ -0,0 +1,470 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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
|
||||
* Provides some internal, more performant, but unsafe helper functions for the `ZyanString`
|
||||
* data-type.
|
||||
*
|
||||
* Most of these functions are very similar to the ones in `Zycore/String.h`, but inlined and
|
||||
* without optional overhead like parameter-validation checks, etc ...
|
||||
*
|
||||
* The `ZyanString` data-type is able to dynamically allocate memory on the heap, but as `Zydis` is
|
||||
* designed to be a non-'malloc'ing library, all functions in this file assume that the instances
|
||||
* they are operating on are created with a user-defined static-buffer.
|
||||
*/
|
||||
|
||||
#ifndef ZYDIS_INTERNAL_STRING_H
|
||||
#define ZYDIS_INTERNAL_STRING_H
|
||||
|
||||
#include <Zycore/LibC.h>
|
||||
#include <Zycore/String.h>
|
||||
#include <Zycore/Types.h>
|
||||
#include <Zycore/Format.h>
|
||||
#include <Zydis/ShortString.h>
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zycore/Status.h>
|
||||
#include <Zycore/Vector.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Enums and types */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Letter Case */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisLetterCase` enum.
|
||||
*/
|
||||
typedef enum ZydisLetterCase_
|
||||
{
|
||||
/**
|
||||
* Uses the given text "as is".
|
||||
*/
|
||||
ZYDIS_LETTER_CASE_DEFAULT,
|
||||
/**
|
||||
* Converts the given text to lowercase letters.
|
||||
*/
|
||||
ZYDIS_LETTER_CASE_LOWER,
|
||||
/**
|
||||
* Converts the given text to uppercase letters.
|
||||
*/
|
||||
ZYDIS_LETTER_CASE_UPPER,
|
||||
|
||||
/**
|
||||
* Maximum value of this enum.
|
||||
*/
|
||||
ZYDIS_LETTER_CASE_MAX_VALUE = ZYDIS_LETTER_CASE_UPPER,
|
||||
/**
|
||||
* The minimum number of bits required to represent all values of this enum.
|
||||
*/
|
||||
ZYDIS_LETTER_CASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_LETTER_CASE_MAX_VALUE)
|
||||
} ZydisLetterCase;
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Macros */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Internal macros */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Checks for a terminating '\0' character at the end of the string data.
|
||||
*/
|
||||
#define ZYDIS_STRING_ASSERT_NULLTERMINATION(string) \
|
||||
ZYAN_ASSERT(*(char*)((ZyanU8*)(string)->vector.data + (string)->vector.size - 1) == '\0');
|
||||
|
||||
/**
|
||||
* Writes a terminating '\0' character at the end of the string data.
|
||||
*/
|
||||
#define ZYDIS_STRING_NULLTERMINATE(string) \
|
||||
*(char*)((ZyanU8*)(string)->vector.data + (string)->vector.size - 1) = '\0';
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Internal Functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* 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.
|
||||
*/
|
||||
ZYAN_INLINE ZyanStatus ZydisStringAppend(ZyanString* destination, const ZyanStringView* source)
|
||||
{
|
||||
ZYAN_ASSERT(destination && source);
|
||||
ZYAN_ASSERT(!destination->vector.allocator);
|
||||
ZYAN_ASSERT(destination->vector.size && source->string.vector.size);
|
||||
|
||||
if (destination->vector.size + source->string.vector.size - 1 > destination->vector.capacity)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZYAN_MEMCPY((char*)destination->vector.data + destination->vector.size - 1,
|
||||
source->string.vector.data, source->string.vector.size - 1);
|
||||
|
||||
destination->vector.size += source->string.vector.size - 1;
|
||||
ZYDIS_STRING_NULLTERMINATE(destination);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends the content of the source string to the end of the destination
|
||||
* string, converting the characters to the specified letter-case.
|
||||
*
|
||||
* @param destination The destination string.
|
||||
* @param source The source string.
|
||||
* @param letter_case The desired letter-case.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*/
|
||||
ZYAN_INLINE ZyanStatus ZydisStringAppendCase(ZyanString* destination, const ZyanStringView* source,
|
||||
ZydisLetterCase letter_case)
|
||||
{
|
||||
ZYAN_ASSERT(destination && source);
|
||||
ZYAN_ASSERT(!destination->vector.allocator);
|
||||
ZYAN_ASSERT(destination->vector.size && source->string.vector.size);
|
||||
|
||||
if (destination->vector.size + source->string.vector.size - 1 > destination->vector.capacity)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZYAN_MEMCPY((char*)destination->vector.data + destination->vector.size - 1,
|
||||
source->string.vector.data, source->string.vector.size - 1);
|
||||
|
||||
switch (letter_case)
|
||||
{
|
||||
case ZYDIS_LETTER_CASE_DEFAULT:
|
||||
break;
|
||||
case ZYDIS_LETTER_CASE_LOWER:
|
||||
{
|
||||
const ZyanUSize index = destination->vector.size - 1;
|
||||
const ZyanUSize count = source->string.vector.size - 1;
|
||||
char* s = (char*)destination->vector.data + index;
|
||||
for (ZyanUSize i = index; i < index + count; ++i)
|
||||
{
|
||||
const char c = *s;
|
||||
if ((c >= 'A') && (c <= 'Z'))
|
||||
{
|
||||
*s = c | 32;
|
||||
}
|
||||
++s;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ZYDIS_LETTER_CASE_UPPER:
|
||||
{
|
||||
const ZyanUSize index = destination->vector.size - 1;
|
||||
const ZyanUSize count = source->string.vector.size - 1;
|
||||
char* s = (char*)destination->vector.data + index;
|
||||
for (ZyanUSize i = index; i < index + count; ++i)
|
||||
{
|
||||
const char c = *s;
|
||||
if ((c >= 'a') && (c <= 'z'))
|
||||
{
|
||||
*s = c & ~32;
|
||||
}
|
||||
++s;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ZYAN_UNREACHABLE;
|
||||
}
|
||||
|
||||
destination->vector.size += source->string.vector.size - 1;
|
||||
ZYDIS_STRING_NULLTERMINATE(destination);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends the content of the source short-string to the end of the destination string.
|
||||
*
|
||||
* @param destination The destination string.
|
||||
* @param source The source string.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*/
|
||||
ZYAN_INLINE ZyanStatus ZydisStringAppendShort(ZyanString* destination,
|
||||
const ZydisShortString* source)
|
||||
{
|
||||
ZYAN_ASSERT(destination && source);
|
||||
ZYAN_ASSERT(!destination->vector.allocator);
|
||||
ZYAN_ASSERT(destination->vector.size && source->size);
|
||||
|
||||
if (destination->vector.size + source->size > destination->vector.capacity)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZYAN_MEMCPY((char*)destination->vector.data + destination->vector.size - 1, source->data,
|
||||
(ZyanUSize)source->size + 1);
|
||||
|
||||
destination->vector.size += source->size;
|
||||
ZYDIS_STRING_ASSERT_NULLTERMINATION(destination);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends the content of the source short-string to the end of the destination string,
|
||||
* converting the characters to the specified letter-case.
|
||||
*
|
||||
* @param destination The destination string.
|
||||
* @param source The source string.
|
||||
* @param letter_case The desired letter-case.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*/
|
||||
ZYAN_INLINE ZyanStatus ZydisStringAppendShortCase(ZyanString* destination,
|
||||
const ZydisShortString* source, ZydisLetterCase letter_case)
|
||||
{
|
||||
ZYAN_ASSERT(destination && source);
|
||||
ZYAN_ASSERT(!destination->vector.allocator);
|
||||
ZYAN_ASSERT(destination->vector.size && source->size);
|
||||
|
||||
if (destination->vector.size + source->size > destination->vector.capacity)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZYAN_MEMCPY((char*)destination->vector.data + destination->vector.size - 1, source->data,
|
||||
(ZyanUSize)source->size + 1);
|
||||
|
||||
switch (letter_case)
|
||||
{
|
||||
case ZYDIS_LETTER_CASE_DEFAULT:
|
||||
break;
|
||||
case ZYDIS_LETTER_CASE_LOWER:
|
||||
{
|
||||
const ZyanUSize index = destination->vector.size - 1;
|
||||
const ZyanUSize count = source->size;
|
||||
char* s = (char*)destination->vector.data + index;
|
||||
for (ZyanUSize i = index; i < index + count; ++i)
|
||||
{
|
||||
const char c = *s;
|
||||
if ((c >= 'A') && (c <= 'Z'))
|
||||
{
|
||||
*s = c | 32;
|
||||
}
|
||||
++s;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ZYDIS_LETTER_CASE_UPPER:
|
||||
{
|
||||
const ZyanUSize index = destination->vector.size - 1;
|
||||
const ZyanUSize count = source->size;
|
||||
char* s = (char*)destination->vector.data + index;
|
||||
for (ZyanUSize i = index; i < index + count; ++i)
|
||||
{
|
||||
const char c = *s;
|
||||
if ((c >= 'a') && (c <= 'z'))
|
||||
{
|
||||
*s = c & ~32;
|
||||
}
|
||||
++s;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ZYAN_UNREACHABLE;
|
||||
}
|
||||
|
||||
destination->vector.size += source->size;
|
||||
ZYDIS_STRING_ASSERT_NULLTERMINATION(destination);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Formatting */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Formats the given unsigned ordinal `value` to its decimal text-representation and
|
||||
* appends it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param value The value to append.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
* @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed.
|
||||
* @param suffix The string to use as suffix or `ZYAN_NULL`, if not needed.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*
|
||||
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
||||
* `ZyanString` instance.
|
||||
*/
|
||||
ZyanStatus ZydisStringAppendDecU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length,
|
||||
const ZyanStringView* prefix, const ZyanStringView* suffix);
|
||||
|
||||
/**
|
||||
* Formats the given signed ordinal `value` to its decimal text-representation and
|
||||
* appends it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param value The value to append.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of chars is
|
||||
* less than the `padding_length`.
|
||||
* @param force_sign Enable this option to print the `+` sign for positive numbers.
|
||||
* @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed.
|
||||
* @param suffix The string to use as suffix or `ZYAN_NULL`, if not needed.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*
|
||||
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
||||
* `ZyanString` instance.
|
||||
*/
|
||||
ZYAN_INLINE ZyanStatus ZydisStringAppendDecS(ZyanString* string, ZyanI64 value,
|
||||
ZyanU8 padding_length, ZyanBool force_sign, const ZyanStringView* prefix,
|
||||
const ZyanStringView* suffix)
|
||||
{
|
||||
static const ZydisShortString str_add = ZYDIS_MAKE_SHORTSTRING("+");
|
||||
static const ZydisShortString str_sub = ZYDIS_MAKE_SHORTSTRING("-");
|
||||
|
||||
if (value < 0)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppendShort(string, &str_sub));
|
||||
if (prefix)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppend(string, prefix));
|
||||
}
|
||||
return ZydisStringAppendDecU(string, ZyanAbsI64(value), padding_length,
|
||||
(const ZyanStringView*)ZYAN_NULL, suffix);
|
||||
}
|
||||
|
||||
if (force_sign)
|
||||
{
|
||||
ZYAN_ASSERT(value >= 0);
|
||||
ZYAN_CHECK(ZydisStringAppendShort(string, &str_add));
|
||||
}
|
||||
return ZydisStringAppendDecU(string, value, padding_length, prefix, suffix);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the given unsigned ordinal `value` to its hexadecimal text-representation and
|
||||
* appends it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param value The value to append.
|
||||
* @param padding_length Pads the converted value with leading zeros if the number of
|
||||
* chars is less than the `padding_length`.
|
||||
* @param force_leading_number Enable this option to prepend a leading `0` if the first
|
||||
* character is non-numeric.
|
||||
* @param uppercase Enable this option to use uppercase letters ('A'-'F') instead
|
||||
* of lowercase ones ('a'-'f').
|
||||
* @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed.
|
||||
* @param suffix The string to use as suffix or `ZYAN_NULL`, if not needed.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*
|
||||
* This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
||||
* `ZyanString` instance.
|
||||
*/
|
||||
ZyanStatus ZydisStringAppendHexU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length,
|
||||
ZyanBool force_leading_number, ZyanBool uppercase, const ZyanStringView* prefix,
|
||||
const ZyanStringView* suffix);
|
||||
|
||||
/**
|
||||
* Formats the given signed ordinal `value` to its hexadecimal text-representation and
|
||||
* appends it to the `string`.
|
||||
*
|
||||
* @param string A pointer to the `ZyanString` instance.
|
||||
* @param value The value to append.
|
||||
* @param padding_length Padds the converted value with leading zeros, if the number of
|
||||
* chars is less than the `padding_length` (the sign char does not
|
||||
* count).
|
||||
* @param force_leading_number Enable this option to prepend a leading `0`, if the first
|
||||
* character is non-numeric.
|
||||
* @param uppercase Enable this option to use uppercase letters ('A'-'F') instead
|
||||
* of lowercase ones ('a'-'f').
|
||||
* @param force_sign Enable this option to print the `+` sign for positive numbers.
|
||||
* @param prefix The string to use as prefix or `ZYAN_NULL`, if not needed.
|
||||
* @param suffix The string to use as suffix or `ZYAN_NULL`, if not needed.
|
||||
*
|
||||
* @return A zyan status code.
|
||||
*
|
||||
* This function will fail if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified
|
||||
* `ZyanString` instance.
|
||||
*/
|
||||
ZYAN_INLINE ZyanStatus ZydisStringAppendHexS(ZyanString* string, ZyanI64 value,
|
||||
ZyanU8 padding_length, ZyanBool force_leading_number, ZyanBool uppercase, ZyanBool force_sign,
|
||||
const ZyanStringView* prefix, const ZyanStringView* suffix)
|
||||
{
|
||||
static const ZydisShortString str_add = ZYDIS_MAKE_SHORTSTRING("+");
|
||||
static const ZydisShortString str_sub = ZYDIS_MAKE_SHORTSTRING("-");
|
||||
|
||||
if (value < 0)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppendShort(string, &str_sub));
|
||||
if (prefix)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppend(string, prefix));
|
||||
}
|
||||
return ZydisStringAppendHexU(string, ZyanAbsI64(value), padding_length,
|
||||
force_leading_number, uppercase, (const ZyanStringView*)ZYAN_NULL, suffix);
|
||||
}
|
||||
|
||||
if (force_sign)
|
||||
{
|
||||
ZYAN_ASSERT(value >= 0);
|
||||
ZYAN_CHECK(ZydisStringAppendShort(string, &str_add));
|
||||
}
|
||||
return ZydisStringAppendHexU(string, value, padding_length, force_leading_number, uppercase,
|
||||
prefix, suffix);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ZYDIS_INTERNAL_STRING_H
|
86
libs/zydis/include/Zydis/MetaInfo.h
Normal file
86
libs/zydis/include/Zydis/MetaInfo.h
Normal file
|
@ -0,0 +1,86 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zydis/Defines.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Enums and types */
|
||||
/* ============================================================================================== */
|
||||
|
||||
#include <Zydis/Generated/EnumInstructionCategory.h>
|
||||
#include <Zydis/Generated/EnumISASet.h>
|
||||
#include <Zydis/Generated/EnumISAExt.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* 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 */
|
88
libs/zydis/include/Zydis/Mnemonic.h
Normal file
88
libs/zydis/include/Zydis/Mnemonic.h
Normal file
|
@ -0,0 +1,88 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zydis/Defines.h>
|
||||
#include <Zydis/ShortString.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Enums and types */
|
||||
/* ============================================================================================== */
|
||||
|
||||
#include <Zydis/Generated/EnumMnemonic.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* 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 */
|
337
libs/zydis/include/Zydis/Register.h
Normal file
337
libs/zydis/include/Zydis/Register.h
Normal file
|
@ -0,0 +1,337 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zycore/Types.h>
|
||||
#include <Zydis/Defines.h>
|
||||
#include <Zydis/SharedTypes.h>
|
||||
#include <Zydis/ShortString.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Enums and types */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Registers */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <Zydis/Generated/EnumRegister.h>
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* 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 */
|
178
libs/zydis/include/Zydis/Segment.h
Normal file
178
libs/zydis/include/Zydis/Segment.h
Normal file
|
@ -0,0 +1,178 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zydis/DecoderTypes.h>
|
||||
#include <Zydis/Status.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 */
|
727
libs/zydis/include/Zydis/SharedTypes.h
Normal file
727
libs/zydis/include/Zydis/SharedTypes.h
Normal file
|
@ -0,0 +1,727 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Types.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 */
|
93
libs/zydis/include/Zydis/ShortString.h
Normal file
93
libs/zydis/include/Zydis/ShortString.h
Normal file
|
@ -0,0 +1,93 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zycore/Types.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 */
|
167
libs/zydis/include/Zydis/Status.h
Normal file
167
libs/zydis/include/Zydis/Status.h
Normal file
|
@ -0,0 +1,167 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <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 */
|
111
libs/zydis/include/Zydis/Utils.h
Normal file
111
libs/zydis/include/Zydis/Utils.h
Normal file
|
@ -0,0 +1,111 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zydis/DecoderTypes.h>
|
||||
#include <Zydis/Status.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 */
|
185
libs/zydis/include/Zydis/Zydis.h
Normal file
185
libs/zydis/include/Zydis/Zydis.h
Normal file
|
@ -0,0 +1,185 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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
|
||||
|
||||
#include <Zycore/Defines.h>
|
||||
#include <Zycore/Types.h>
|
||||
|
||||
#if !defined(ZYDIS_DISABLE_DECODER)
|
||||
# include <Zydis/Decoder.h>
|
||||
# include <Zydis/DecoderTypes.h>
|
||||
#endif
|
||||
|
||||
#if !defined(ZYDIS_DISABLE_ENCODER)
|
||||
# include <Zydis/Encoder.h>
|
||||
#endif
|
||||
|
||||
#if !defined(ZYDIS_DISABLE_FORMATTER)
|
||||
# include <Zydis/Formatter.h>
|
||||
#endif
|
||||
|
||||
#if !defined(ZYDIS_DISABLE_SEGMENT)
|
||||
# include <Zydis/Segment.h>
|
||||
#endif
|
||||
|
||||
#if !defined(ZYDIS_DISABLE_DECODER) && !defined(ZYDIS_DISABLE_FORMATTER)
|
||||
# include <Zydis/Disassembler.h>
|
||||
#endif
|
||||
|
||||
#include <Zydis/MetaInfo.h>
|
||||
#include <Zydis/Mnemonic.h>
|
||||
#include <Zydis/Register.h>
|
||||
#include <Zydis/SharedTypes.h>
|
||||
#include <Zydis/Status.h>
|
||||
#include <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 */
|
5074
libs/zydis/src/Decoder.c
Normal file
5074
libs/zydis/src/Decoder.c
Normal file
File diff suppressed because it is too large
Load diff
174
libs/zydis/src/DecoderData.c
Normal file
174
libs/zydis/src/DecoderData.c
Normal file
|
@ -0,0 +1,174 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Internal/DecoderData.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Data tables */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Physical instruction encodings */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <Generated/InstructionEncodings.inc>
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Decoder tree */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#define ZYDIS_INVALID \
|
||||
{ ZYDIS_NODETYPE_INVALID, 0x00000000 }
|
||||
#define ZYDIS_FILTER(type, id) \
|
||||
{ type, id }
|
||||
#define ZYDIS_DEFINITION(encoding_id, id) \
|
||||
{ ZYDIS_NODETYPE_DEFINITION_MASK | encoding_id, id }
|
||||
|
||||
#include <Generated/DecoderTables.inc>
|
||||
|
||||
#undef ZYDIS_INVALID
|
||||
#undef ZYDIS_FILTER
|
||||
#undef ZYDIS_DEFINITION
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Decoder tree */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
const ZydisDecoderTreeNode zydis_decoder_tree_root = { ZYDIS_NODETYPE_FILTER_OPCODE, 0x0000 };
|
||||
|
||||
const ZydisDecoderTreeNode* ZydisDecoderTreeGetChildNode(const ZydisDecoderTreeNode* parent,
|
||||
ZyanU16 index)
|
||||
{
|
||||
switch (parent->type)
|
||||
{
|
||||
case ZYDIS_NODETYPE_FILTER_XOP:
|
||||
ZYAN_ASSERT(index < 13);
|
||||
return &FILTERS_XOP[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_VEX:
|
||||
ZYAN_ASSERT(index < 17);
|
||||
return &FILTERS_VEX[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_EMVEX:
|
||||
ZYAN_ASSERT(index < 49);
|
||||
return &FILTERS_EMVEX[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_OPCODE:
|
||||
ZYAN_ASSERT(index < 256);
|
||||
return &FILTERS_OPCODE[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE:
|
||||
ZYAN_ASSERT(index < 4);
|
||||
return &FILTERS_MODE[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_COMPACT:
|
||||
ZYAN_ASSERT(index < 3);
|
||||
return &FILTERS_MODE_COMPACT[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODRM_MOD:
|
||||
ZYAN_ASSERT(index < 4);
|
||||
return &FILTERS_MODRM_MOD[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODRM_MOD_COMPACT[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODRM_REG:
|
||||
ZYAN_ASSERT(index < 8);
|
||||
return &FILTERS_MODRM_REG[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODRM_RM:
|
||||
ZYAN_ASSERT(index < 8);
|
||||
return &FILTERS_MODRM_RM[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_PREFIX_GROUP1[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX:
|
||||
ZYAN_ASSERT(index < 5);
|
||||
return &FILTERS_MANDATORY_PREFIX[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_OPERAND_SIZE:
|
||||
ZYAN_ASSERT(index < 3);
|
||||
return &FILTERS_OPERAND_SIZE[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE:
|
||||
ZYAN_ASSERT(index < 3);
|
||||
return &FILTERS_ADDRESS_SIZE[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH:
|
||||
ZYAN_ASSERT(index < 3);
|
||||
return &FILTERS_VECTOR_LENGTH[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_REX_W:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_REX_W[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_REX_B:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_REX_B[parent->value][index];
|
||||
#ifndef ZYDIS_DISABLE_AVX512
|
||||
case ZYDIS_NODETYPE_FILTER_EVEX_B:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_EVEX_B[parent->value][index];
|
||||
#endif
|
||||
#ifndef ZYDIS_DISABLE_KNC
|
||||
case ZYDIS_NODETYPE_FILTER_MVEX_E:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MVEX_E[parent->value][index];
|
||||
#endif
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_AMD:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODE_AMD[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_KNC:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODE_KNC[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_MPX:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODE_MPX[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_CET:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODE_CET[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_LZCNT:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODE_LZCNT[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_TZCNT:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODE_TZCNT[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODE_WBNOINVD[parent->value][index];
|
||||
case ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE:
|
||||
ZYAN_ASSERT(index < 2);
|
||||
return &FILTERS_MODE_CLDEMOTE[parent->value][index];
|
||||
default:
|
||||
ZYAN_UNREACHABLE;
|
||||
}
|
||||
}
|
||||
|
||||
void ZydisGetInstructionEncodingInfo(const ZydisDecoderTreeNode* node,
|
||||
const ZydisInstructionEncodingInfo** info)
|
||||
{
|
||||
ZYAN_ASSERT(node->type & ZYDIS_NODETYPE_DEFINITION_MASK);
|
||||
const ZyanU8 class = (node->type) & 0x7F;
|
||||
ZYAN_ASSERT(class < ZYAN_ARRAY_LENGTH(INSTR_ENCODINGS));
|
||||
*info = &INSTR_ENCODINGS[class];
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
105
libs/zydis/src/Disassembler.c
Normal file
105
libs/zydis/src/Disassembler.c
Normal file
|
@ -0,0 +1,105 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Disassembler.h>
|
||||
#include <Zycore/LibC.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Internal helpers */
|
||||
/* ============================================================================================== */
|
||||
|
||||
static ZyanStatus ZydisDisassemble(ZydisMachineMode machine_mode,
|
||||
ZyanU64 runtime_address, const void* buffer, ZyanUSize length,
|
||||
ZydisDisassembledInstruction *instruction, ZydisFormatterStyle style)
|
||||
{
|
||||
if (!buffer || !instruction)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
*instruction = (ZydisDisassembledInstruction)
|
||||
{
|
||||
.runtime_address = runtime_address
|
||||
};
|
||||
|
||||
// Derive the stack width from the address width.
|
||||
ZydisStackWidth stack_width;
|
||||
switch (machine_mode)
|
||||
{
|
||||
case ZYDIS_MACHINE_MODE_LONG_64:
|
||||
stack_width = ZYDIS_STACK_WIDTH_64;
|
||||
break;
|
||||
case ZYDIS_MACHINE_MODE_LONG_COMPAT_32:
|
||||
case ZYDIS_MACHINE_MODE_LEGACY_32:
|
||||
stack_width = ZYDIS_STACK_WIDTH_32;
|
||||
break;
|
||||
case ZYDIS_MACHINE_MODE_LONG_COMPAT_16:
|
||||
case ZYDIS_MACHINE_MODE_LEGACY_16:
|
||||
case ZYDIS_MACHINE_MODE_REAL_16:
|
||||
stack_width = ZYDIS_STACK_WIDTH_16;
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZydisDecoder decoder;
|
||||
ZYAN_CHECK(ZydisDecoderInit(&decoder, machine_mode, stack_width));
|
||||
|
||||
ZydisDecoderContext ctx;
|
||||
ZYAN_CHECK(ZydisDecoderDecodeInstruction(&decoder, &ctx, buffer, length, &instruction->info));
|
||||
ZYAN_CHECK(ZydisDecoderDecodeOperands(&decoder, &ctx, &instruction->info,
|
||||
instruction->operands, instruction->info.operand_count));
|
||||
|
||||
ZydisFormatter formatter;
|
||||
ZYAN_CHECK(ZydisFormatterInit(&formatter, style));
|
||||
ZYAN_CHECK(ZydisFormatterFormatInstruction(&formatter, &instruction->info,
|
||||
instruction->operands, instruction->info.operand_count_visible, instruction->text,
|
||||
sizeof(instruction->text), runtime_address, ZYAN_NULL));
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Public functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
ZyanStatus ZydisDisassembleIntel(ZydisMachineMode machine_mode,
|
||||
ZyanU64 runtime_address, const void* buffer, ZyanUSize length,
|
||||
ZydisDisassembledInstruction *instruction)
|
||||
{
|
||||
return ZydisDisassemble(machine_mode, runtime_address, buffer, length, instruction,
|
||||
ZYDIS_FORMATTER_STYLE_INTEL);
|
||||
}
|
||||
|
||||
ZyanStatus ZydisDisassembleATT(ZydisMachineMode machine_mode,
|
||||
ZyanU64 runtime_address, const void* buffer, ZyanUSize length,
|
||||
ZydisDisassembledInstruction *instruction)
|
||||
{
|
||||
return ZydisDisassemble(machine_mode, runtime_address, buffer, length, instruction,
|
||||
ZYDIS_FORMATTER_STYLE_ATT);
|
||||
}
|
||||
|
||||
/* ============================================================================================== */
|
656
libs/zydis/src/Formatter.c
Normal file
656
libs/zydis/src/Formatter.c
Normal file
|
@ -0,0 +1,656 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zycore/LibC.h>
|
||||
#include <Zydis/Formatter.h>
|
||||
#include <Zydis/Internal/FormatterATT.h>
|
||||
#include <Zydis/Internal/FormatterIntel.h>
|
||||
#include <Zydis/Internal/String.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Constants */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Formatter presets */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
static const ZydisFormatter* const FORMATTER_PRESETS[ZYDIS_FORMATTER_STYLE_MAX_VALUE + 1] =
|
||||
{
|
||||
&FORMATTER_ATT,
|
||||
&FORMATTER_INTEL,
|
||||
&FORMATTER_INTEL_MASM
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Internal functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Helper functions */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
void ZydisFormatterBufferInit(ZydisFormatterBuffer* buffer, char* user_buffer,
|
||||
ZyanUSize length)
|
||||
{
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(user_buffer);
|
||||
ZYAN_ASSERT(length);
|
||||
|
||||
buffer->is_token_list = ZYAN_FALSE;
|
||||
buffer->capacity = 0;
|
||||
buffer->string.flags = ZYAN_STRING_HAS_FIXED_CAPACITY;
|
||||
buffer->string.vector.allocator = ZYAN_NULL;
|
||||
buffer->string.vector.growth_factor = 1;
|
||||
buffer->string.vector.shrink_threshold = 0;
|
||||
buffer->string.vector.destructor = ZYAN_NULL;
|
||||
buffer->string.vector.element_size = sizeof(char);
|
||||
buffer->string.vector.size = 1;
|
||||
buffer->string.vector.capacity = length;
|
||||
buffer->string.vector.data = user_buffer;
|
||||
|
||||
*user_buffer = '\0';
|
||||
}
|
||||
|
||||
void ZydisFormatterBufferInitTokenized(ZydisFormatterBuffer* buffer,
|
||||
ZydisFormatterToken** first_token, void* user_buffer, ZyanUSize length)
|
||||
{
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(first_token);
|
||||
ZYAN_ASSERT(user_buffer);
|
||||
ZYAN_ASSERT(length);
|
||||
|
||||
*first_token = user_buffer;
|
||||
(*first_token)->type = ZYDIS_TOKEN_INVALID;
|
||||
(*first_token)->next = 0;
|
||||
|
||||
user_buffer = (ZyanU8*)user_buffer + sizeof(ZydisFormatterToken);
|
||||
length -= sizeof(ZydisFormatterToken);
|
||||
|
||||
buffer->is_token_list = ZYAN_TRUE;
|
||||
buffer->capacity = length;
|
||||
buffer->string.flags = ZYAN_STRING_HAS_FIXED_CAPACITY;
|
||||
buffer->string.vector.allocator = ZYAN_NULL;
|
||||
buffer->string.vector.growth_factor = 1;
|
||||
buffer->string.vector.shrink_threshold = 0;
|
||||
buffer->string.vector.destructor = ZYAN_NULL;
|
||||
buffer->string.vector.element_size = sizeof(char);
|
||||
buffer->string.vector.size = 1;
|
||||
buffer->string.vector.capacity = length;
|
||||
buffer->string.vector.data = user_buffer;
|
||||
|
||||
*(char*)user_buffer = '\0';
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Exported functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Initialization */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterInit(ZydisFormatter* formatter, ZydisFormatterStyle style)
|
||||
{
|
||||
if (!formatter || ((ZyanUSize)style > ZYDIS_FORMATTER_STYLE_MAX_VALUE))
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZYAN_MEMCPY(formatter, FORMATTER_PRESETS[style], sizeof(*formatter));
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Setter */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterSetProperty(ZydisFormatter* formatter, ZydisFormatterProperty property,
|
||||
ZyanUPointer value)
|
||||
{
|
||||
if (!formatter)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZydisNumericBase base = (ZydisNumericBase)(-1);
|
||||
ZyanU8 index = 0xFF;
|
||||
|
||||
switch (property)
|
||||
{
|
||||
case ZYDIS_FORMATTER_PROP_FORCE_SIZE:
|
||||
{
|
||||
formatter->force_memory_size = (value) ? ZYAN_TRUE : ZYAN_FALSE;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_FORCE_SEGMENT:
|
||||
{
|
||||
formatter->force_memory_segment = (value) ? ZYAN_TRUE : ZYAN_FALSE;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE:
|
||||
{
|
||||
formatter->force_memory_scale = (value) ? ZYAN_TRUE : ZYAN_FALSE;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES:
|
||||
{
|
||||
formatter->force_relative_branches = (value) ? ZYAN_TRUE : ZYAN_FALSE;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL:
|
||||
{
|
||||
formatter->force_relative_riprel = (value) ? ZYAN_TRUE : ZYAN_FALSE;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE:
|
||||
{
|
||||
formatter->print_branch_size = (value) ? ZYAN_TRUE : ZYAN_FALSE;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES:
|
||||
{
|
||||
formatter->detailed_prefixes = (value) ? ZYAN_TRUE : ZYAN_FALSE;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_ADDR_BASE:
|
||||
{
|
||||
if (value > ZYDIS_NUMERIC_BASE_MAX_VALUE)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->addr_base = (ZydisNumericBase)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS:
|
||||
{
|
||||
if (value > ZYDIS_SIGNEDNESS_MAX_VALUE)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->addr_signedness = (ZydisSignedness)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE:
|
||||
{
|
||||
if (((ZydisPadding)value != ZYDIS_PADDING_AUTO) &&
|
||||
(value > 0xFF))
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->addr_padding_absolute = (ZydisPadding)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE:
|
||||
{
|
||||
if (((ZydisPadding)value != ZYDIS_PADDING_AUTO) &&
|
||||
(value > 0xFF))
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->addr_padding_relative = (ZydisPadding)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_DISP_BASE:
|
||||
{
|
||||
if (value > ZYDIS_NUMERIC_BASE_MAX_VALUE)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->disp_base = (ZydisNumericBase)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS:
|
||||
{
|
||||
if (value > ZYDIS_SIGNEDNESS_MAX_VALUE)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->disp_signedness = (ZydisSignedness)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_DISP_PADDING:
|
||||
{
|
||||
if ((ZydisPadding)value == ZYDIS_PADDING_AUTO)
|
||||
{
|
||||
if ((ZyanUSize)formatter->style > ZYDIS_FORMATTER_STYLE_MAX_VALUE)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->disp_padding = FORMATTER_PRESETS[formatter->style]->disp_padding;
|
||||
}
|
||||
else if (value > 0xFF)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->disp_padding = (ZydisPadding)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_IMM_BASE:
|
||||
{
|
||||
if (value > ZYDIS_NUMERIC_BASE_MAX_VALUE)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->imm_base = (ZydisNumericBase)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS:
|
||||
{
|
||||
if (value > ZYDIS_SIGNEDNESS_MAX_VALUE)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->imm_signedness = (ZydisSignedness)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_IMM_PADDING:
|
||||
{
|
||||
if ((ZydisPadding)value == ZYDIS_PADDING_AUTO)
|
||||
{
|
||||
if ((ZyanUSize)formatter->style > ZYDIS_FORMATTER_STYLE_MAX_VALUE)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->imm_padding = FORMATTER_PRESETS[formatter->style]->imm_padding;
|
||||
}
|
||||
else if (value > 0xFF)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
formatter->imm_padding = (ZydisPadding)value;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES:
|
||||
{
|
||||
formatter->case_prefixes = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC:
|
||||
{
|
||||
formatter->case_mnemonic = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS:
|
||||
{
|
||||
formatter->case_registers = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS:
|
||||
{
|
||||
formatter->case_typecasts = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS:
|
||||
{
|
||||
formatter->case_decorators = (value) ? ZYDIS_LETTER_CASE_UPPER : ZYDIS_LETTER_CASE_DEFAULT;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_DEC_PREFIX:
|
||||
{
|
||||
base = ZYDIS_NUMERIC_BASE_DEC;
|
||||
index = 0;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_DEC_SUFFIX:
|
||||
{
|
||||
base = ZYDIS_NUMERIC_BASE_DEC;
|
||||
index = 1;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_HEX_UPPERCASE:
|
||||
{
|
||||
formatter->hex_uppercase = (value) ? ZYAN_TRUE : ZYAN_FALSE;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_HEX_PREFIX:
|
||||
{
|
||||
base = ZYDIS_NUMERIC_BASE_HEX;
|
||||
index = 0;
|
||||
break;
|
||||
}
|
||||
case ZYDIS_FORMATTER_PROP_HEX_SUFFIX:
|
||||
{
|
||||
base = ZYDIS_NUMERIC_BASE_HEX;
|
||||
index = 1;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
// Set prefix or suffix
|
||||
if (base != (ZydisNumericBase)(-1))
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
const ZyanUSize len = ZYAN_STRLEN((char*)value);
|
||||
if (len > 10)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
ZYAN_MEMCPY(formatter->number_format[base][index].buffer, (void*)value, len);
|
||||
formatter->number_format[base][index].buffer[len] = '\0';
|
||||
formatter->number_format[base][index].string_data.string.vector.data =
|
||||
formatter->number_format[base][index].buffer;
|
||||
formatter->number_format[base][index].string_data.string.vector.size = len + 1;
|
||||
formatter->number_format[base][index].string =
|
||||
&formatter->number_format[base][index].string_data;
|
||||
} else
|
||||
{
|
||||
formatter->number_format[base][index].string = ZYAN_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterSetHook(ZydisFormatter* formatter, ZydisFormatterFunction type,
|
||||
const void** callback)
|
||||
{
|
||||
if (!formatter || !callback || ((ZyanUSize)type > ZYDIS_FORMATTER_FUNC_MAX_VALUE))
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
const void* const temp = *callback;
|
||||
|
||||
// The following code relies on the order of the enum values and the function fields inside
|
||||
// the `ZydisFormatter` struct
|
||||
|
||||
#ifdef ZYAN_DEBUG
|
||||
const ZyanUPointer* test = (ZyanUPointer*)(&formatter->func_pre_instruction + type);
|
||||
switch (type)
|
||||
{
|
||||
case ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_pre_instruction ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_post_instruction ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_instruction); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRE_OPERAND:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_pre_operand ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_POST_OPERAND:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_post_operand ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_operand_reg); break;
|
||||
case ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_operand_mem); break;
|
||||
case ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_operand_ptr); break;
|
||||
case ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_format_operand_imm); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_mnemonic ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_REGISTER:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_register ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_address_abs ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_address_rel ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_DISP:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_disp ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_IMM:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_imm ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_typecast ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_segment ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_prefixes ); break;
|
||||
case ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR:
|
||||
ZYAN_ASSERT(test == (ZyanUPointer*)&formatter->func_print_decorator ); break;
|
||||
default:
|
||||
ZYAN_UNREACHABLE;
|
||||
}
|
||||
#endif
|
||||
|
||||
*callback = *(const void**)(&formatter->func_pre_instruction + type);
|
||||
if (!temp)
|
||||
{
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
ZYAN_MEMCPY(&formatter->func_pre_instruction + type, &temp, sizeof(ZyanUPointer));
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Formatting */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterFormatInstruction(const ZydisFormatter* formatter,
|
||||
const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,
|
||||
ZyanU8 operand_count, char* buffer, ZyanUSize length, ZyanU64 runtime_address, void* user_data)
|
||||
{
|
||||
if (!formatter || !instruction || (operand_count && !operands) ||
|
||||
(operand_count > ZYDIS_MAX_OPERAND_COUNT) ||
|
||||
(operand_count < instruction->operand_count_visible) || !buffer || (length == 0))
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZydisFormatterBuffer formatter_buffer;
|
||||
ZydisFormatterBufferInit(&formatter_buffer, buffer, length);
|
||||
|
||||
ZydisFormatterContext context;
|
||||
context.instruction = instruction;
|
||||
context.operands = operands;
|
||||
context.runtime_address = runtime_address;
|
||||
context.operand = ZYAN_NULL;
|
||||
context.user_data = user_data;
|
||||
|
||||
if (formatter->func_pre_instruction)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_pre_instruction(formatter, &formatter_buffer, &context));
|
||||
}
|
||||
|
||||
ZYAN_CHECK(formatter->func_format_instruction(formatter, &formatter_buffer, &context));
|
||||
|
||||
if (formatter->func_post_instruction)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_post_instruction(formatter, &formatter_buffer, &context));
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterFormatOperand(const ZydisFormatter* formatter,
|
||||
const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand,
|
||||
char* buffer, ZyanUSize length, ZyanU64 runtime_address, void* user_data)
|
||||
{
|
||||
if (!formatter || !instruction || !operand || !buffer || (length == 0))
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZydisFormatterBuffer formatter_buffer;
|
||||
ZydisFormatterBufferInit(&formatter_buffer, buffer, length);
|
||||
|
||||
ZydisFormatterContext context;
|
||||
context.instruction = instruction;
|
||||
context.operands = ZYAN_NULL;
|
||||
context.runtime_address = runtime_address;
|
||||
context.operand = operand;
|
||||
context.user_data = user_data;
|
||||
|
||||
// We ignore `ZYDIS_STATUS_SKIP_TOKEN` for all operand-functions as it does not make any sense
|
||||
// to skip the only operand printed by this function
|
||||
|
||||
if (formatter->func_pre_operand)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_pre_operand(formatter, &formatter_buffer, &context));
|
||||
}
|
||||
|
||||
switch (context.operand->type)
|
||||
{
|
||||
case ZYDIS_OPERAND_TYPE_REGISTER:
|
||||
ZYAN_CHECK(formatter->func_format_operand_reg(formatter, &formatter_buffer, &context));
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_MEMORY:
|
||||
ZYAN_CHECK(formatter->func_format_operand_mem(formatter, &formatter_buffer, &context));
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_IMMEDIATE:
|
||||
ZYAN_CHECK(formatter->func_format_operand_imm(formatter, &formatter_buffer, &context));
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_POINTER:
|
||||
ZYAN_CHECK(formatter->func_format_operand_ptr(formatter, &formatter_buffer, &context));
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (formatter->func_post_operand)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_post_operand(formatter, &formatter_buffer, &context));
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Tokenizing */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
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)
|
||||
{
|
||||
if (!formatter || !instruction || (operand_count && !operands) ||
|
||||
(operand_count > ZYDIS_MAX_OPERAND_COUNT) ||
|
||||
(operand_count < instruction->operand_count_visible) || !buffer ||
|
||||
(length <= sizeof(ZydisFormatterToken)) || !token)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZydisFormatterBuffer formatter_buffer;
|
||||
ZydisFormatterToken* first_token;
|
||||
ZydisFormatterBufferInitTokenized(&formatter_buffer, &first_token, buffer, length);
|
||||
|
||||
ZydisFormatterContext context;
|
||||
context.instruction = instruction;
|
||||
context.operands = operands;
|
||||
context.runtime_address = runtime_address;
|
||||
context.operand = ZYAN_NULL;
|
||||
context.user_data = user_data;
|
||||
|
||||
if (formatter->func_pre_instruction)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_pre_instruction(formatter, &formatter_buffer, &context));
|
||||
}
|
||||
|
||||
ZYAN_CHECK(formatter->func_format_instruction(formatter, &formatter_buffer, &context));
|
||||
|
||||
if (formatter->func_post_instruction)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_post_instruction(formatter, &formatter_buffer, &context));
|
||||
}
|
||||
|
||||
if (first_token->next)
|
||||
{
|
||||
*token = (ZydisFormatterTokenConst*)((ZyanU8*)first_token + sizeof(ZydisFormatterToken) +
|
||||
first_token->next);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
*token = first_token;
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterTokenizeOperand(const ZydisFormatter* formatter,
|
||||
const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand,
|
||||
void* buffer, ZyanUSize length, ZyanU64 runtime_address, ZydisFormatterTokenConst** token,
|
||||
void* user_data)
|
||||
{
|
||||
if (!formatter || !instruction || !operand || !buffer ||
|
||||
(length <= sizeof(ZydisFormatterToken)) || !token)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZydisFormatterToken* first_token;
|
||||
ZydisFormatterBuffer formatter_buffer;
|
||||
ZydisFormatterBufferInitTokenized(&formatter_buffer, &first_token, buffer, length);
|
||||
|
||||
ZydisFormatterContext context;
|
||||
context.instruction = instruction;
|
||||
context.operands = ZYAN_NULL;
|
||||
context.runtime_address = runtime_address;
|
||||
context.operand = operand;
|
||||
context.user_data = user_data;
|
||||
|
||||
// We ignore `ZYDIS_STATUS_SKIP_TOKEN` for all operand-functions as it does not make any sense
|
||||
// to skip the only operand printed by this function
|
||||
|
||||
if (formatter->func_pre_operand)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_pre_operand(formatter, &formatter_buffer, &context));
|
||||
}
|
||||
|
||||
switch (context.operand->type)
|
||||
{
|
||||
case ZYDIS_OPERAND_TYPE_REGISTER:
|
||||
ZYAN_CHECK(formatter->func_format_operand_reg(formatter, &formatter_buffer, &context));
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_MEMORY:
|
||||
ZYAN_CHECK(formatter->func_format_operand_mem(formatter, &formatter_buffer, &context));
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_IMMEDIATE:
|
||||
ZYAN_CHECK(formatter->func_format_operand_imm(formatter, &formatter_buffer, &context));
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_POINTER:
|
||||
ZYAN_CHECK(formatter->func_format_operand_ptr(formatter, &formatter_buffer, &context));
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (formatter->func_post_operand)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_post_operand(formatter, &formatter_buffer, &context));
|
||||
}
|
||||
|
||||
if (first_token->next)
|
||||
{
|
||||
*token = (ZydisFormatterTokenConst*)((ZyanU8*)first_token + sizeof(ZydisFormatterToken) +
|
||||
first_token->next);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
*token = first_token;
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ============================================================================================== */
|
422
libs/zydis/src/FormatterATT.c
Normal file
422
libs/zydis/src/FormatterATT.c
Normal file
|
@ -0,0 +1,422 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Internal/FormatterATT.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Constants */
|
||||
/* ============================================================================================== */
|
||||
|
||||
#include <Generated/FormatterStrings.inc>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Formatter functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Instruction */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterATTFormatInstruction(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
ZYAN_ASSERT(context->instruction);
|
||||
ZYAN_ASSERT(context->operands);
|
||||
|
||||
ZYAN_CHECK(formatter->func_print_prefixes(formatter, buffer, context));
|
||||
ZYAN_CHECK(formatter->func_print_mnemonic(formatter, buffer, context));
|
||||
|
||||
ZyanUPointer state_mnemonic;
|
||||
ZYDIS_BUFFER_REMEMBER(buffer, state_mnemonic);
|
||||
|
||||
const ZyanI8 c = (ZyanI8)context->instruction->operand_count_visible - 1;
|
||||
for (ZyanI8 i = c; i >= 0; --i)
|
||||
{
|
||||
const ZydisDecodedOperand* const operand = &context->operands[i];
|
||||
|
||||
// Print embedded-mask registers as decorator instead of a regular operand
|
||||
if ((i == 1) && (operand->type == ZYDIS_OPERAND_TYPE_REGISTER) &&
|
||||
(operand->encoding == ZYDIS_OPERAND_ENCODING_MASK))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ZyanUPointer buffer_state;
|
||||
ZYDIS_BUFFER_REMEMBER(buffer, buffer_state);
|
||||
|
||||
if (buffer_state != state_mnemonic)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, DELIM_OPERAND);
|
||||
} else
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, DELIM_MNEMONIC);
|
||||
}
|
||||
|
||||
// Set current operand
|
||||
context->operand = operand;
|
||||
|
||||
ZyanStatus status;
|
||||
if (formatter->func_pre_operand)
|
||||
{
|
||||
status = formatter->func_pre_operand(formatter, buffer, context);
|
||||
if (status == ZYDIS_STATUS_SKIP_TOKEN)
|
||||
{
|
||||
ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state));
|
||||
continue;
|
||||
}
|
||||
if (!ZYAN_SUCCESS(status))
|
||||
{
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
switch (operand->type)
|
||||
{
|
||||
case ZYDIS_OPERAND_TYPE_REGISTER:
|
||||
status = formatter->func_format_operand_reg(formatter, buffer, context);
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_MEMORY:
|
||||
status = formatter->func_format_operand_mem(formatter, buffer, context);
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_POINTER:
|
||||
status = formatter->func_format_operand_ptr(formatter, buffer, context);
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_IMMEDIATE:
|
||||
status = formatter->func_format_operand_imm(formatter, buffer, context);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
if (status == ZYDIS_STATUS_SKIP_TOKEN)
|
||||
{
|
||||
ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state));
|
||||
continue;
|
||||
}
|
||||
if (!ZYAN_SUCCESS(status))
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
if (formatter->func_post_operand)
|
||||
{
|
||||
status = formatter->func_post_operand(formatter, buffer, context);
|
||||
if (status == ZYDIS_STATUS_SKIP_TOKEN)
|
||||
{
|
||||
ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state));
|
||||
continue;
|
||||
}
|
||||
if (ZYAN_SUCCESS(status))
|
||||
{
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC)
|
||||
if ((context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) ||
|
||||
(context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX))
|
||||
{
|
||||
if ((i == 0) &&
|
||||
(context->instruction->operand_count_visible > 1) &&
|
||||
(context->operands[1].encoding == ZYDIS_OPERAND_ENCODING_MASK))
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_MASK));
|
||||
}
|
||||
if (operand->type == ZYDIS_OPERAND_TYPE_MEMORY)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_BC));
|
||||
if (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_CONVERSION));
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_EH));
|
||||
}
|
||||
} else
|
||||
{
|
||||
ZyanBool decorate_operand;
|
||||
if (i == (context->instruction->operand_count_visible - 1))
|
||||
{
|
||||
decorate_operand = operand->type != ZYDIS_OPERAND_TYPE_IMMEDIATE;
|
||||
}
|
||||
else
|
||||
{
|
||||
decorate_operand =
|
||||
(context->instruction->operand_count_visible > (i + 1)) &&
|
||||
((context->operands[i + 1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE) ||
|
||||
(context->operands[i + 1].visibility == ZYDIS_OPERAND_VISIBILITY_HIDDEN));
|
||||
}
|
||||
if (decorate_operand)
|
||||
{
|
||||
if (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_SWIZZLE));
|
||||
}
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_RC));
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_SAE));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Operands */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterATTFormatOperandMEM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZYAN_CHECK(formatter->func_print_segment(formatter, buffer, context));
|
||||
|
||||
const ZyanBool absolute = !formatter->force_relative_riprel &&
|
||||
(context->runtime_address != ZYDIS_RUNTIME_ADDRESS_NONE);
|
||||
if (absolute && context->operand->mem.disp.has_displacement &&
|
||||
(context->operand->mem.index == ZYDIS_REGISTER_NONE) &&
|
||||
((context->operand->mem.base == ZYDIS_REGISTER_NONE) ||
|
||||
(context->operand->mem.base == ZYDIS_REGISTER_EIP ) ||
|
||||
(context->operand->mem.base == ZYDIS_REGISTER_RIP )))
|
||||
{
|
||||
// EIP/RIP-relative or absolute-displacement address operand
|
||||
ZYAN_CHECK(formatter->func_print_address_abs(formatter, buffer, context));
|
||||
} else
|
||||
{
|
||||
const ZyanBool should_print_reg = context->operand->mem.base != ZYDIS_REGISTER_NONE;
|
||||
const ZyanBool should_print_idx = context->operand->mem.index != ZYDIS_REGISTER_NONE;
|
||||
const ZyanBool neither_reg_nor_idx = !should_print_reg && !should_print_idx;
|
||||
|
||||
// Regular memory operand
|
||||
if (neither_reg_nor_idx)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_address_abs(formatter, buffer, context));
|
||||
} else if (context->operand->mem.disp.has_displacement && context->operand->mem.disp.value)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_disp(formatter, buffer, context));
|
||||
}
|
||||
|
||||
if (neither_reg_nor_idx)
|
||||
{
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND(buffer, MEMORY_BEGIN_ATT);
|
||||
|
||||
if (should_print_reg)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->operand->mem.base));
|
||||
}
|
||||
if (should_print_idx)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, DELIM_MEMORY);
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->operand->mem.index));
|
||||
if (context->operand->mem.scale &&
|
||||
(context->operand->mem.type != ZYDIS_MEMOP_TYPE_MIB) &&
|
||||
((context->operand->mem.scale > 1) || formatter->force_memory_scale))
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_DELIMITER);
|
||||
ZYDIS_BUFFER_APPEND(buffer, DELIM_MEMORY);
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE);
|
||||
ZYAN_CHECK(ZydisStringAppendDecU(&buffer->string, context->operand->mem.scale, 0,
|
||||
ZYAN_NULL, ZYAN_NULL));
|
||||
}
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND(buffer, MEMORY_END_ATT);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Elemental tokens */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintMnemonic(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
ZYAN_ASSERT(context->instruction);
|
||||
ZYAN_ASSERT(context->operands);
|
||||
|
||||
const ZydisShortString* mnemonic = ZydisMnemonicGetStringWrapped(
|
||||
context->instruction->mnemonic);
|
||||
if (!mnemonic)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, INVALID_MNEMONIC, formatter->case_mnemonic);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_MNEMONIC);
|
||||
if (context->instruction->meta.branch_type == ZYDIS_BRANCH_TYPE_FAR)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, &STR_FAR_ATT,
|
||||
formatter->case_mnemonic));
|
||||
}
|
||||
ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, mnemonic, formatter->case_mnemonic));
|
||||
|
||||
// Append operand-size suffix
|
||||
ZyanU32 size = 0;
|
||||
for (ZyanU8 i = 0; i < context->instruction->operand_count_visible; ++i)
|
||||
{
|
||||
const ZydisDecodedOperand* const operand = &context->operands[i];
|
||||
if ((operand->type == ZYDIS_OPERAND_TYPE_MEMORY) &&
|
||||
((operand->mem.type == ZYDIS_MEMOP_TYPE_MEM) ||
|
||||
(operand->mem.type == ZYDIS_MEMOP_TYPE_VSIB)))
|
||||
{
|
||||
size = ZydisFormatterHelperGetExplicitSize(formatter, context, operand);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (size)
|
||||
{
|
||||
case 8: ZydisStringAppendShort(&buffer->string, &STR_SIZE_8_ATT ); break;
|
||||
case 16: ZydisStringAppendShort(&buffer->string, &STR_SIZE_16_ATT ); break;
|
||||
case 32: ZydisStringAppendShort(&buffer->string, &STR_SIZE_32_ATT ); break;
|
||||
case 64: ZydisStringAppendShort(&buffer->string, &STR_SIZE_64_ATT ); break;
|
||||
case 128: ZydisStringAppendShort(&buffer->string, &STR_SIZE_128_ATT); break;
|
||||
case 256: ZydisStringAppendShort(&buffer->string, &STR_SIZE_256_ATT); break;
|
||||
case 512: ZydisStringAppendShort(&buffer->string, &STR_SIZE_512_ATT); break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (formatter->print_branch_size)
|
||||
{
|
||||
switch (context->instruction->meta.branch_type)
|
||||
{
|
||||
case ZYDIS_BRANCH_TYPE_NONE:
|
||||
break;
|
||||
case ZYDIS_BRANCH_TYPE_SHORT:
|
||||
return ZydisStringAppendShortCase(&buffer->string, &STR_SHORT,
|
||||
formatter->case_mnemonic);
|
||||
case ZYDIS_BRANCH_TYPE_NEAR:
|
||||
return ZydisStringAppendShortCase(&buffer->string, &STR_NEAR,
|
||||
formatter->case_mnemonic);
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintRegister(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg)
|
||||
{
|
||||
ZYAN_UNUSED(context);
|
||||
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZYDIS_BUFFER_APPEND(buffer, REGISTER);
|
||||
const ZydisShortString* str = ZydisRegisterGetStringWrapped(reg);
|
||||
if (!str)
|
||||
{
|
||||
return ZydisStringAppendShortCase(&buffer->string, &STR_INVALID_REG,
|
||||
formatter->case_registers);
|
||||
}
|
||||
return ZydisStringAppendShortCase(&buffer->string, str, formatter->case_registers);
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintAddressABS(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
if ((context->instruction->meta.branch_type != ZYDIS_BRANCH_TYPE_NONE) &&
|
||||
(context->operand->type == ZYDIS_OPERAND_TYPE_MEMORY))
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, MUL);
|
||||
}
|
||||
|
||||
return ZydisFormatterBasePrintAddressABS(formatter, buffer, context);
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintDISP(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_DISPLACEMENT);
|
||||
switch (formatter->disp_signedness)
|
||||
{
|
||||
case ZYDIS_SIGNEDNESS_AUTO:
|
||||
case ZYDIS_SIGNEDNESS_SIGNED:
|
||||
ZYDIS_STRING_APPEND_NUM_S(formatter, formatter->disp_base, &buffer->string,
|
||||
context->operand->mem.disp.value, formatter->disp_padding,
|
||||
formatter->hex_force_leading_number, ZYAN_FALSE);
|
||||
break;
|
||||
case ZYDIS_SIGNEDNESS_UNSIGNED:
|
||||
ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->disp_base, &buffer->string,
|
||||
context->operand->mem.disp.value, formatter->disp_padding,
|
||||
formatter->hex_force_leading_number);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterATTPrintIMM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZYDIS_BUFFER_APPEND(buffer, IMMEDIATE);
|
||||
return ZydisFormatterBasePrintIMM(formatter, buffer, context);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
797
libs/zydis/src/FormatterBase.c
Normal file
797
libs/zydis/src/FormatterBase.c
Normal file
|
@ -0,0 +1,797 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Internal/FormatterBase.h>
|
||||
#include <Zydis/Utils.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Constants */
|
||||
/* ============================================================================================== */
|
||||
|
||||
#include <Generated/FormatterStrings.inc>
|
||||
|
||||
static const ZydisShortString* const STR_PREF_REX[16] =
|
||||
{
|
||||
&STR_PREF_REX_40,
|
||||
&STR_PREF_REX_41,
|
||||
&STR_PREF_REX_42,
|
||||
&STR_PREF_REX_43,
|
||||
&STR_PREF_REX_44,
|
||||
&STR_PREF_REX_45,
|
||||
&STR_PREF_REX_46,
|
||||
&STR_PREF_REX_47,
|
||||
&STR_PREF_REX_48,
|
||||
&STR_PREF_REX_49,
|
||||
&STR_PREF_REX_4A,
|
||||
&STR_PREF_REX_4B,
|
||||
&STR_PREF_REX_4C,
|
||||
&STR_PREF_REX_4D,
|
||||
&STR_PREF_REX_4E,
|
||||
&STR_PREF_REX_4F
|
||||
};
|
||||
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX[16] =
|
||||
{
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_40,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_41,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_42,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_43,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_44,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_45,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_46,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_47,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_48,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_49,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4A,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4B,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4C,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4D,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4E,
|
||||
(const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4F
|
||||
};
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Helper functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
ZyanU32 ZydisFormatterHelperGetExplicitSize(const ZydisFormatter* formatter,
|
||||
ZydisFormatterContext* context, const ZydisDecodedOperand* operand)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(context);
|
||||
ZYAN_ASSERT(operand);
|
||||
|
||||
ZYAN_ASSERT(operand->type == ZYDIS_OPERAND_TYPE_MEMORY);
|
||||
ZYAN_ASSERT((operand->mem.type == ZYDIS_MEMOP_TYPE_MEM) ||
|
||||
(operand->mem.type == ZYDIS_MEMOP_TYPE_VSIB));
|
||||
|
||||
if (formatter->force_memory_size)
|
||||
{
|
||||
return operand->size;
|
||||
}
|
||||
|
||||
if (!context->operands)
|
||||
{
|
||||
// Single operand formatting. We can not derive the explicit size by using the other
|
||||
// operands.
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (operand->id)
|
||||
{
|
||||
case 0:
|
||||
if (context->instruction->operand_count_visible < 2)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ((context->operands[1].type == ZYDIS_OPERAND_TYPE_UNUSED) ||
|
||||
(context->operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE))
|
||||
{
|
||||
return context->operands[0].size;
|
||||
}
|
||||
if (context->operands[0].size != context->operands[1].size)
|
||||
{
|
||||
return context->operands[0].size;
|
||||
}
|
||||
if ((context->operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER) &&
|
||||
(context->operands[1].visibility == ZYDIS_OPERAND_VISIBILITY_IMPLICIT) &&
|
||||
(context->operands[1].reg.value == ZYDIS_REGISTER_CL))
|
||||
{
|
||||
return context->operands[0].size;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
if (context->operands[operand->id - 1].size !=
|
||||
context->operands[operand->id].size)
|
||||
{
|
||||
return context->operands[operand->id].size;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Formatter functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Operands */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterBaseFormatOperandREG(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
return formatter->func_print_register(formatter, buffer, context, context->operand->reg.value);
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBaseFormatOperandPTR(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE);
|
||||
ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->addr_base, &buffer->string,
|
||||
context->operand->ptr.segment, 4, formatter->hex_force_leading_number);
|
||||
ZYDIS_BUFFER_APPEND(buffer, DELIM_SEGMENT);
|
||||
|
||||
ZyanU8 padding;
|
||||
switch (context->instruction->operand_width)
|
||||
{
|
||||
case 16:
|
||||
padding = 4;
|
||||
break;
|
||||
case 32:
|
||||
padding = 8;
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE);
|
||||
ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->addr_base, &buffer->string,
|
||||
context->operand->ptr.offset , padding, formatter->hex_force_leading_number);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBaseFormatOperandIMM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
// The immediate operand contains an address
|
||||
if (context->operand->imm.is_relative)
|
||||
{
|
||||
const ZyanBool absolute = !formatter->force_relative_branches &&
|
||||
(context->runtime_address != ZYDIS_RUNTIME_ADDRESS_NONE);
|
||||
if (absolute)
|
||||
{
|
||||
return formatter->func_print_address_abs(formatter, buffer, context);
|
||||
}
|
||||
return formatter->func_print_address_rel(formatter, buffer, context);
|
||||
}
|
||||
|
||||
// The immediate operand contains an actual ordinal value
|
||||
return formatter->func_print_imm(formatter, buffer, context);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Elemental tokens */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintAddressABS(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZyanU64 address;
|
||||
ZYAN_CHECK(ZydisCalcAbsoluteAddress(context->instruction, context->operand,
|
||||
context->runtime_address, &address));
|
||||
ZyanU8 padding = (formatter->addr_padding_absolute ==
|
||||
ZYDIS_PADDING_AUTO) ? 0 : (ZyanU8)formatter->addr_padding_absolute;
|
||||
if ((formatter->addr_padding_absolute == ZYDIS_PADDING_AUTO) &&
|
||||
(formatter->addr_base == ZYDIS_NUMERIC_BASE_HEX))
|
||||
{
|
||||
switch (context->instruction->stack_width)
|
||||
{
|
||||
case 16:
|
||||
padding = 4;
|
||||
address = (ZyanU16)address;
|
||||
break;
|
||||
case 32:
|
||||
padding = 8;
|
||||
address = (ZyanU32)address;
|
||||
break;
|
||||
case 64:
|
||||
padding = 16;
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_ADDRESS_ABS);
|
||||
ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->addr_base, &buffer->string, address, padding,
|
||||
formatter->hex_force_leading_number);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintAddressREL(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZyanU64 address;
|
||||
ZYAN_CHECK(ZydisCalcAbsoluteAddress(context->instruction, context->operand, 0, &address));
|
||||
|
||||
ZyanU8 padding = (formatter->addr_padding_relative ==
|
||||
ZYDIS_PADDING_AUTO) ? 0 : (ZyanU8)formatter->addr_padding_relative;
|
||||
if ((formatter->addr_padding_relative == ZYDIS_PADDING_AUTO) &&
|
||||
(formatter->addr_base == ZYDIS_NUMERIC_BASE_HEX))
|
||||
{
|
||||
switch (context->instruction->stack_width)
|
||||
{
|
||||
case 16:
|
||||
padding = 4;
|
||||
address = (ZyanU16)address;
|
||||
break;
|
||||
case 32:
|
||||
padding = 8;
|
||||
address = (ZyanU32)address;
|
||||
break;
|
||||
case 64:
|
||||
padding = 16;
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_ADDRESS_REL);
|
||||
switch (formatter->addr_signedness)
|
||||
{
|
||||
case ZYDIS_SIGNEDNESS_AUTO:
|
||||
case ZYDIS_SIGNEDNESS_SIGNED:
|
||||
ZYDIS_STRING_APPEND_NUM_S(formatter, formatter->addr_base, &buffer->string, address,
|
||||
padding, formatter->hex_force_leading_number, ZYAN_TRUE);
|
||||
break;
|
||||
case ZYDIS_SIGNEDNESS_UNSIGNED:
|
||||
ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_ADD));
|
||||
ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->addr_base, &buffer->string, address,
|
||||
padding, formatter->hex_force_leading_number);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintIMM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE);
|
||||
|
||||
const ZyanBool is_signed =
|
||||
(formatter->imm_signedness == ZYDIS_SIGNEDNESS_SIGNED) ||
|
||||
(formatter->imm_signedness == ZYDIS_SIGNEDNESS_AUTO && (context->operand->imm.is_signed));
|
||||
if (is_signed && (context->operand->imm.value.s < 0))
|
||||
{
|
||||
ZYDIS_STRING_APPEND_NUM_S(formatter, formatter->imm_base, &buffer->string,
|
||||
context->operand->imm.value.s, formatter->imm_padding,
|
||||
formatter->hex_force_leading_number, ZYAN_FALSE);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
ZyanU64 value;
|
||||
ZyanU8 padding = (formatter->imm_padding ==
|
||||
ZYDIS_PADDING_AUTO) ? 0 : (ZyanU8)formatter->imm_padding;
|
||||
switch (context->instruction->operand_width)
|
||||
{
|
||||
case 8:
|
||||
if (formatter->imm_padding == ZYDIS_PADDING_AUTO)
|
||||
{
|
||||
padding = 2;
|
||||
}
|
||||
value = (ZyanU8 )context->operand->imm.value.u;
|
||||
break;
|
||||
case 16:
|
||||
if (formatter->imm_padding == ZYDIS_PADDING_AUTO)
|
||||
{
|
||||
padding = 4;
|
||||
}
|
||||
value = (ZyanU16)context->operand->imm.value.u;
|
||||
break;
|
||||
case 32:
|
||||
if (formatter->imm_padding == ZYDIS_PADDING_AUTO)
|
||||
{
|
||||
padding = 8;
|
||||
}
|
||||
value = (ZyanU32)context->operand->imm.value.u;
|
||||
break;
|
||||
case 64:
|
||||
if (formatter->imm_padding == ZYDIS_PADDING_AUTO)
|
||||
{
|
||||
padding = 16;
|
||||
}
|
||||
value = (ZyanU64)context->operand->imm.value.u;
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->imm_base, &buffer->string, value, padding,
|
||||
formatter->hex_force_leading_number);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Optional tokens */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintSegment(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZyanBool printed_segment = ZYAN_FALSE;
|
||||
switch (context->operand->mem.segment)
|
||||
{
|
||||
case ZYDIS_REGISTER_ES:
|
||||
case ZYDIS_REGISTER_CS:
|
||||
case ZYDIS_REGISTER_FS:
|
||||
case ZYDIS_REGISTER_GS:
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->operand->mem.segment));
|
||||
printed_segment = ZYAN_TRUE;
|
||||
break;
|
||||
case ZYDIS_REGISTER_SS:
|
||||
if ((formatter->force_memory_segment) ||
|
||||
(context->instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_SS))
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->operand->mem.segment));
|
||||
printed_segment = ZYAN_TRUE;
|
||||
}
|
||||
break;
|
||||
case ZYDIS_REGISTER_DS:
|
||||
if ((formatter->force_memory_segment) ||
|
||||
(context->instruction->attributes & ZYDIS_ATTRIB_HAS_SEGMENT_DS))
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->operand->mem.segment));
|
||||
printed_segment = ZYAN_TRUE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (printed_segment)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, DELIM_SEGMENT);
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintPrefixes(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
if (formatter->detailed_prefixes)
|
||||
{
|
||||
for (ZyanU8 i = 0; i < context->instruction->raw.prefix_count; ++i)
|
||||
{
|
||||
const ZyanU8 value = context->instruction->raw.prefixes[i].value;
|
||||
switch (context->instruction->raw.prefixes[i].type)
|
||||
{
|
||||
case ZYDIS_PREFIX_TYPE_IGNORED:
|
||||
case ZYDIS_PREFIX_TYPE_MANDATORY:
|
||||
{
|
||||
if ((value & 0xF0) == 0x40)
|
||||
{
|
||||
if (buffer->is_token_list)
|
||||
{
|
||||
// TODO: Case
|
||||
ZYAN_CHECK(ZydisFormatterBufferAppendPredefined(buffer,
|
||||
TOK_PREF_REX[value & 0x0F]));
|
||||
} else
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string,
|
||||
STR_PREF_REX[value & 0x0F], formatter->case_prefixes));
|
||||
}
|
||||
} else
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case 0xF0:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_LOCK, formatter->case_prefixes);
|
||||
break;
|
||||
case 0x2E:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_CS, formatter->case_prefixes);
|
||||
break;
|
||||
case 0x36:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_SS, formatter->case_prefixes);
|
||||
break;
|
||||
case 0x3E:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_DS, formatter->case_prefixes);
|
||||
break;
|
||||
case 0x26:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_ES, formatter->case_prefixes);
|
||||
break;
|
||||
case 0x64:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_FS, formatter->case_prefixes);
|
||||
break;
|
||||
case 0x65:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_SEG_GS, formatter->case_prefixes);
|
||||
break;
|
||||
default:
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_PREFIX);
|
||||
ZYAN_CHECK(ZydisStringAppendHexU(&buffer->string, value, 0,
|
||||
formatter->hex_force_leading_number, formatter->hex_uppercase,
|
||||
ZYAN_NULL, ZYAN_NULL));
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_WHITESPACE);
|
||||
ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_WHITESPACE));
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ZYDIS_PREFIX_TYPE_EFFECTIVE:
|
||||
switch (value)
|
||||
{
|
||||
case 0xF0:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_LOCK, formatter->case_prefixes);
|
||||
break;
|
||||
case 0xF2:
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_XACQUIRE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_XACQUIRE, formatter->case_prefixes);
|
||||
}
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REPNE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REPNE, formatter->case_prefixes);
|
||||
}
|
||||
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_BND)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_BND, formatter->case_prefixes);
|
||||
}
|
||||
break;
|
||||
case 0xF3:
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_XRELEASE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_XRELEASE, formatter->case_prefixes);
|
||||
}
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REP)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REP, formatter->case_prefixes);
|
||||
}
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REPE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REPE, formatter->case_prefixes);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_XACQUIRE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_XACQUIRE, formatter->case_prefixes);
|
||||
}
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_XRELEASE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_XRELEASE, formatter->case_prefixes);
|
||||
}
|
||||
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_LOCK, formatter->case_prefixes);
|
||||
}
|
||||
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_BND)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_BND, formatter->case_prefixes);
|
||||
}
|
||||
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_NOTRACK)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_NOTRACK, formatter->case_prefixes);
|
||||
}
|
||||
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REP)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REP, formatter->case_prefixes);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REPE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REPE, formatter->case_prefixes);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
if (context->instruction->attributes & ZYDIS_ATTRIB_HAS_REPNE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, PREF_REPNE, formatter->case_prefixes);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBasePrintDecorator(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisDecorator decorator)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
#if defined(ZYDIS_DISABLE_AVX512) && defined(ZYDIS_DISABLE_KNC)
|
||||
ZYAN_UNUSED(formatter);
|
||||
ZYAN_UNUSED(buffer);
|
||||
ZYAN_UNUSED(context);
|
||||
#endif
|
||||
|
||||
switch (decorator)
|
||||
{
|
||||
case ZYDIS_DECORATOR_MASK:
|
||||
{
|
||||
#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC)
|
||||
if (context->instruction->avx.mask.reg != ZYDIS_REGISTER_K0)
|
||||
{
|
||||
if (buffer->is_token_list)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, DECO_BEGIN);
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->instruction->avx.mask.reg));
|
||||
ZYDIS_BUFFER_APPEND(buffer, DECO_END);
|
||||
} else
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_DECO_BEGIN));
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->instruction->avx.mask.reg));
|
||||
ZYAN_CHECK(ZydisStringAppendShort(&buffer->string, &STR_DECO_END));
|
||||
}
|
||||
|
||||
// Only print the zeroing decorator, if the instruction is not a "zeroing masking only"
|
||||
// instruction (e.g. `vcmpsd`)
|
||||
if ((context->instruction->avx.mask.mode == ZYDIS_MASK_MODE_ZEROING ||
|
||||
context->instruction->avx.mask.mode == ZYDIS_MASK_MODE_CONTROL_ZEROING) &&
|
||||
(context->instruction->raw.evex.z))
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_ZERO, formatter->case_decorators);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case ZYDIS_DECORATOR_BC:
|
||||
#if !defined(ZYDIS_DISABLE_AVX512)
|
||||
if (!context->instruction->avx.broadcast.is_static)
|
||||
{
|
||||
switch (context->instruction->avx.broadcast.mode)
|
||||
{
|
||||
case ZYDIS_BROADCAST_MODE_INVALID:
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_1_TO_2:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO2, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_1_TO_4:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO4, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_1_TO_8:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO8, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_1_TO_16:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO16, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_1_TO_32:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO32, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_1_TO_64:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_1TO64, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_4_TO_8:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_4TO8, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_4_TO_16:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_4TO16, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_BROADCAST_MODE_8_TO_16:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_8TO16, formatter->case_decorators);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case ZYDIS_DECORATOR_RC:
|
||||
#if !defined(ZYDIS_DISABLE_AVX512)
|
||||
if (context->instruction->avx.has_sae)
|
||||
{
|
||||
switch (context->instruction->avx.rounding.mode)
|
||||
{
|
||||
case ZYDIS_ROUNDING_MODE_INVALID:
|
||||
break;
|
||||
case ZYDIS_ROUNDING_MODE_RN:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RN_SAE, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_ROUNDING_MODE_RD:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RD_SAE, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_ROUNDING_MODE_RU:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RU_SAE, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_ROUNDING_MODE_RZ:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RZ_SAE, formatter->case_decorators);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
} else
|
||||
{
|
||||
switch (context->instruction->avx.rounding.mode)
|
||||
{
|
||||
case ZYDIS_ROUNDING_MODE_INVALID:
|
||||
break;
|
||||
case ZYDIS_ROUNDING_MODE_RN:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RN, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_ROUNDING_MODE_RD:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RD, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_ROUNDING_MODE_RU:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RU, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_ROUNDING_MODE_RZ:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_RZ, formatter->case_decorators);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case ZYDIS_DECORATOR_SAE:
|
||||
#if !defined(ZYDIS_DISABLE_AVX512)
|
||||
if (context->instruction->avx.has_sae && !context->instruction->avx.rounding.mode)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_SAE, formatter->case_decorators);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case ZYDIS_DECORATOR_SWIZZLE:
|
||||
#if !defined(ZYDIS_DISABLE_KNC)
|
||||
switch (context->instruction->avx.swizzle.mode)
|
||||
{
|
||||
case ZYDIS_SWIZZLE_MODE_INVALID:
|
||||
case ZYDIS_SWIZZLE_MODE_DCBA:
|
||||
// Nothing to do here
|
||||
break;
|
||||
case ZYDIS_SWIZZLE_MODE_CDAB:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_CDAB, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_SWIZZLE_MODE_BADC:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_BADC, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_SWIZZLE_MODE_DACB:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_DACB, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_SWIZZLE_MODE_AAAA:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_AAAA, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_SWIZZLE_MODE_BBBB:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_BBBB, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_SWIZZLE_MODE_CCCC:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_CCCC, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_SWIZZLE_MODE_DDDD:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_DDDD, formatter->case_decorators);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case ZYDIS_DECORATOR_CONVERSION:
|
||||
#if !defined(ZYDIS_DISABLE_KNC)
|
||||
switch (context->instruction->avx.conversion.mode)
|
||||
{
|
||||
case ZYDIS_CONVERSION_MODE_INVALID:
|
||||
break;
|
||||
case ZYDIS_CONVERSION_MODE_FLOAT16:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_FLOAT16, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_CONVERSION_MODE_SINT8:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_SINT8, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_CONVERSION_MODE_UINT8:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_UINT8, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_CONVERSION_MODE_SINT16:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_SINT16, formatter->case_decorators);
|
||||
break;
|
||||
case ZYDIS_CONVERSION_MODE_UINT16:
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_UINT16, formatter->case_decorators);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case ZYDIS_DECORATOR_EH:
|
||||
#if !defined(ZYDIS_DISABLE_KNC)
|
||||
if (context->instruction->avx.has_eviction_hint)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, DECO_EH, formatter->case_decorators);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
191
libs/zydis/src/FormatterBuffer.c
Normal file
191
libs/zydis/src/FormatterBuffer.c
Normal file
|
@ -0,0 +1,191 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Internal/String.h>
|
||||
#include <Zydis/FormatterBuffer.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Exported functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Token */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterTokenGetValue(const ZydisFormatterToken* token,
|
||||
ZydisTokenType* type, ZyanConstCharPointer* value)
|
||||
{
|
||||
if (!token || !type || !value)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
*type = token->type;
|
||||
*value = (ZyanConstCharPointer)((ZyanU8*)token + sizeof(ZydisFormatterToken));
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterTokenNext(ZydisFormatterTokenConst** token)
|
||||
{
|
||||
if (!token || !*token)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
const ZyanU8 next = (*token)->next;
|
||||
if (!next)
|
||||
{
|
||||
return ZYAN_STATUS_OUT_OF_RANGE;
|
||||
}
|
||||
*token = (ZydisFormatterTokenConst*)((ZyanU8*)*token + sizeof(ZydisFormatterToken) + next);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Buffer */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterBufferGetToken(const ZydisFormatterBuffer* buffer,
|
||||
ZydisFormatterTokenConst** token)
|
||||
{
|
||||
if (!buffer || !token)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
*token = ((ZydisFormatterTokenConst*)buffer->string.vector.data - 1);
|
||||
if ((*token)->type == ZYDIS_TOKEN_INVALID)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBufferGetString(ZydisFormatterBuffer* buffer, ZyanString** string)
|
||||
{
|
||||
if (!buffer || !string)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (buffer->is_token_list &&
|
||||
((ZydisFormatterTokenConst*)buffer->string.vector.data - 1)->type == ZYDIS_TOKEN_INVALID)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
ZYAN_ASSERT(buffer->string.vector.data);
|
||||
ZYAN_ASSERT(buffer->string.vector.size);
|
||||
|
||||
*string = &buffer->string;
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBufferAppend(ZydisFormatterBuffer* buffer, ZydisTokenType type)
|
||||
{
|
||||
if (!buffer)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (!buffer->is_token_list)
|
||||
{
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
const ZyanUSize len = buffer->string.vector.size;
|
||||
ZYAN_ASSERT((len > 0) && (len < 256));
|
||||
if (buffer->capacity <= len + sizeof(ZydisFormatterToken))
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZydisFormatterToken* const last = (ZydisFormatterToken*)buffer->string.vector.data - 1;
|
||||
last->next = (ZyanU8)len;
|
||||
|
||||
const ZyanUSize delta = len + sizeof(ZydisFormatterToken);
|
||||
buffer->capacity -= delta;
|
||||
buffer->string.vector.data = (ZyanU8*)buffer->string.vector.data + delta;
|
||||
buffer->string.vector.size = 1;
|
||||
buffer->string.vector.capacity = ZYAN_MIN(buffer->capacity, 255);
|
||||
*(char*)buffer->string.vector.data = '\0';
|
||||
|
||||
ZydisFormatterToken* const token = (ZydisFormatterToken*)buffer->string.vector.data - 1;
|
||||
token->type = type;
|
||||
token->next = 0;
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBufferRemember(const ZydisFormatterBuffer* buffer, ZyanUPointer* state)
|
||||
{
|
||||
if (!buffer || !state)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (buffer->is_token_list)
|
||||
{
|
||||
*state = (ZyanUPointer)buffer->string.vector.data;
|
||||
} else
|
||||
{
|
||||
*state = (ZyanUPointer)buffer->string.vector.size;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterBufferRestore(ZydisFormatterBuffer* buffer, ZyanUPointer state)
|
||||
{
|
||||
if (!buffer)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if (buffer->is_token_list)
|
||||
{
|
||||
const ZyanUSize delta = (ZyanUPointer)buffer->string.vector.data - state;
|
||||
buffer->capacity += delta;
|
||||
buffer->string.vector.data = (void*)state;
|
||||
buffer->string.vector.size = 1; // TODO: Restore size?
|
||||
buffer->string.vector.capacity = ZYAN_MIN(buffer->capacity, 255);
|
||||
*(char*)buffer->string.vector.data = '\0';
|
||||
} else
|
||||
{
|
||||
buffer->string.vector.size = (ZyanUSize)state;
|
||||
ZYDIS_STRING_NULLTERMINATE(&buffer->string);
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
455
libs/zydis/src/FormatterIntel.c
Normal file
455
libs/zydis/src/FormatterIntel.c
Normal file
|
@ -0,0 +1,455 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Internal/FormatterIntel.h>
|
||||
#include <Zydis/Utils.h>
|
||||
#include <Zycore/Format.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Constants */
|
||||
/* ============================================================================================== */
|
||||
|
||||
#include <Generated/FormatterStrings.inc>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Formatter functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Intel */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterIntelFormatInstruction(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
ZYAN_ASSERT(context->instruction);
|
||||
ZYAN_ASSERT(context->operands);
|
||||
|
||||
ZYAN_CHECK(formatter->func_print_prefixes(formatter, buffer, context));
|
||||
ZYAN_CHECK(formatter->func_print_mnemonic(formatter, buffer, context));
|
||||
|
||||
ZyanUPointer state_mnemonic;
|
||||
ZYDIS_BUFFER_REMEMBER(buffer, state_mnemonic);
|
||||
for (ZyanU8 i = 0; i < context->instruction->operand_count_visible; ++i)
|
||||
{
|
||||
const ZydisDecodedOperand* const operand = &context->operands[i];
|
||||
|
||||
// Print embedded-mask registers as decorator instead of a regular operand
|
||||
if ((i == 1) && (operand->type == ZYDIS_OPERAND_TYPE_REGISTER) &&
|
||||
(operand->encoding == ZYDIS_OPERAND_ENCODING_MASK))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ZyanUPointer buffer_state;
|
||||
ZYDIS_BUFFER_REMEMBER(buffer, buffer_state);
|
||||
|
||||
if (buffer_state != state_mnemonic)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, DELIM_OPERAND);
|
||||
} else
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, DELIM_MNEMONIC);
|
||||
}
|
||||
|
||||
// Set current operand
|
||||
context->operand = operand;
|
||||
|
||||
ZyanStatus status;
|
||||
if (formatter->func_pre_operand)
|
||||
{
|
||||
status = formatter->func_pre_operand(formatter, buffer, context);
|
||||
if (status == ZYDIS_STATUS_SKIP_TOKEN)
|
||||
{
|
||||
ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state));
|
||||
continue;
|
||||
}
|
||||
if (!ZYAN_SUCCESS(status))
|
||||
{
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
switch (operand->type)
|
||||
{
|
||||
case ZYDIS_OPERAND_TYPE_REGISTER:
|
||||
status = formatter->func_format_operand_reg(formatter, buffer, context);
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_MEMORY:
|
||||
status = formatter->func_format_operand_mem(formatter, buffer, context);
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_POINTER:
|
||||
status = formatter->func_format_operand_ptr(formatter, buffer, context);
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_IMMEDIATE:
|
||||
status = formatter->func_format_operand_imm(formatter, buffer, context);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
if (status == ZYDIS_STATUS_SKIP_TOKEN)
|
||||
{
|
||||
ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state));
|
||||
continue;
|
||||
}
|
||||
if (!ZYAN_SUCCESS(status))
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
if (formatter->func_post_operand)
|
||||
{
|
||||
status = formatter->func_post_operand(formatter, buffer, context);
|
||||
if (status == ZYDIS_STATUS_SKIP_TOKEN)
|
||||
{
|
||||
ZYAN_CHECK(ZydisFormatterBufferRestore(buffer, buffer_state));
|
||||
continue;
|
||||
}
|
||||
if (ZYAN_SUCCESS(status))
|
||||
{
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC)
|
||||
if ((context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) ||
|
||||
(context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX))
|
||||
{
|
||||
if ((i == 0) &&
|
||||
(context->instruction->operand_count_visible > 1) &&
|
||||
(context->operands[i + 1].encoding == ZYDIS_OPERAND_ENCODING_MASK))
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_MASK));
|
||||
}
|
||||
if (operand->type == ZYDIS_OPERAND_TYPE_MEMORY)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_BC));
|
||||
if (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_CONVERSION));
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_EH));
|
||||
}
|
||||
} else
|
||||
{
|
||||
ZyanBool decorate_operand;
|
||||
if (i == (context->instruction->operand_count_visible - 1))
|
||||
{
|
||||
decorate_operand = operand->type != ZYDIS_OPERAND_TYPE_IMMEDIATE;
|
||||
}
|
||||
else
|
||||
{
|
||||
decorate_operand =
|
||||
(context->instruction->operand_count_visible > (i + 1)) &&
|
||||
((context->operands[i + 1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE) ||
|
||||
(context->operands[i + 1].visibility == ZYDIS_OPERAND_VISIBILITY_HIDDEN));
|
||||
}
|
||||
if (decorate_operand)
|
||||
{
|
||||
if (context->instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_SWIZZLE));
|
||||
}
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_RC));
|
||||
ZYAN_CHECK(formatter->func_print_decorator(formatter, buffer, context,
|
||||
ZYDIS_DECORATOR_SAE));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterIntelFormatOperandMEM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
if ((context->operand->mem.type == ZYDIS_MEMOP_TYPE_MEM) ||
|
||||
(context->operand->mem.type == ZYDIS_MEMOP_TYPE_VSIB))
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_typecast(formatter, buffer, context));
|
||||
}
|
||||
ZYAN_CHECK(formatter->func_print_segment(formatter, buffer, context));
|
||||
|
||||
ZYDIS_BUFFER_APPEND(buffer, MEMORY_BEGIN_INTEL);
|
||||
|
||||
const ZyanBool absolute = !formatter->force_relative_riprel &&
|
||||
(context->runtime_address != ZYDIS_RUNTIME_ADDRESS_NONE);
|
||||
if (absolute && context->operand->mem.disp.has_displacement &&
|
||||
(context->operand->mem.index == ZYDIS_REGISTER_NONE) &&
|
||||
((context->operand->mem.base == ZYDIS_REGISTER_NONE) ||
|
||||
(context->operand->mem.base == ZYDIS_REGISTER_EIP ) ||
|
||||
(context->operand->mem.base == ZYDIS_REGISTER_RIP )))
|
||||
{
|
||||
// EIP/RIP-relative or absolute-displacement address operand
|
||||
ZYAN_CHECK(formatter->func_print_address_abs(formatter, buffer, context));
|
||||
} else
|
||||
{
|
||||
const ZyanBool should_print_reg = context->operand->mem.base != ZYDIS_REGISTER_NONE;
|
||||
const ZyanBool should_print_idx = context->operand->mem.index != ZYDIS_REGISTER_NONE;
|
||||
const ZyanBool neither_reg_nor_idx = !should_print_reg && !should_print_idx;
|
||||
|
||||
// Regular memory operand
|
||||
if (should_print_reg)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->operand->mem.base));
|
||||
}
|
||||
if (should_print_idx)
|
||||
{
|
||||
if (context->operand->mem.base != ZYDIS_REGISTER_NONE)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, ADD);
|
||||
}
|
||||
ZYAN_CHECK(formatter->func_print_register(formatter, buffer, context,
|
||||
context->operand->mem.index));
|
||||
if (context->operand->mem.scale &&
|
||||
(context->operand->mem.type != ZYDIS_MEMOP_TYPE_MIB) &&
|
||||
((context->operand->mem.scale > 1) || formatter->force_memory_scale))
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, MUL);
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_IMMEDIATE);
|
||||
ZYAN_CHECK(ZydisStringAppendDecU(&buffer->string, context->operand->mem.scale, 0,
|
||||
ZYAN_NULL, ZYAN_NULL));
|
||||
}
|
||||
}
|
||||
if (neither_reg_nor_idx)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_address_abs(formatter, buffer, context));
|
||||
} else if (context->operand->mem.disp.has_displacement && context->operand->mem.disp.value)
|
||||
{
|
||||
ZYAN_CHECK(formatter->func_print_disp(formatter, buffer, context));
|
||||
}
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND(buffer, MEMORY_END_INTEL);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintMnemonic(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
const ZydisShortString* mnemonic = ZydisMnemonicGetStringWrapped(
|
||||
context->instruction->mnemonic);
|
||||
if (!mnemonic)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, INVALID_MNEMONIC, formatter->case_mnemonic);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_MNEMONIC);
|
||||
ZYAN_CHECK(ZydisStringAppendShortCase(&buffer->string, mnemonic, formatter->case_mnemonic));
|
||||
if (context->instruction->meta.branch_type == ZYDIS_BRANCH_TYPE_FAR)
|
||||
{
|
||||
return ZydisStringAppendShortCase(&buffer->string, &STR_FAR, formatter->case_mnemonic);
|
||||
}
|
||||
if (formatter->print_branch_size)
|
||||
{
|
||||
switch (context->instruction->meta.branch_type)
|
||||
{
|
||||
case ZYDIS_BRANCH_TYPE_NONE:
|
||||
break;
|
||||
case ZYDIS_BRANCH_TYPE_SHORT:
|
||||
return ZydisStringAppendShortCase(&buffer->string, &STR_SHORT,
|
||||
formatter->case_mnemonic);
|
||||
case ZYDIS_BRANCH_TYPE_NEAR:
|
||||
return ZydisStringAppendShortCase(&buffer->string, &STR_NEAR,
|
||||
formatter->case_mnemonic);
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintRegister(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg)
|
||||
{
|
||||
ZYAN_UNUSED(context);
|
||||
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
const ZydisShortString* str = ZydisRegisterGetStringWrapped(reg);
|
||||
if (!str)
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND_CASE(buffer, INVALID_REG, formatter->case_registers);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_REGISTER);
|
||||
return ZydisStringAppendShortCase(&buffer->string, str, formatter->case_registers);
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintDISP(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
switch (formatter->disp_signedness)
|
||||
{
|
||||
case ZYDIS_SIGNEDNESS_AUTO:
|
||||
case ZYDIS_SIGNEDNESS_SIGNED:
|
||||
if (context->operand->mem.disp.value < 0)
|
||||
{
|
||||
if ((context->operand->mem.base != ZYDIS_REGISTER_NONE) ||
|
||||
(context->operand->mem.index != ZYDIS_REGISTER_NONE))
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, SUB);
|
||||
}
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_DISPLACEMENT);
|
||||
ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->disp_base, &buffer->string,
|
||||
ZyanAbsI64(context->operand->mem.disp.value), formatter->disp_padding,
|
||||
formatter->hex_force_leading_number);
|
||||
break;
|
||||
}
|
||||
ZYAN_FALLTHROUGH;
|
||||
case ZYDIS_SIGNEDNESS_UNSIGNED:
|
||||
if ((context->operand->mem.base != ZYDIS_REGISTER_NONE) ||
|
||||
(context->operand->mem.index != ZYDIS_REGISTER_NONE))
|
||||
{
|
||||
ZYDIS_BUFFER_APPEND(buffer, ADD);
|
||||
}
|
||||
ZYDIS_BUFFER_APPEND_TOKEN(buffer, ZYDIS_TOKEN_DISPLACEMENT);
|
||||
ZYDIS_STRING_APPEND_NUM_U(formatter, formatter->disp_base, &buffer->string,
|
||||
context->operand->mem.disp.value, formatter->disp_padding,
|
||||
formatter->hex_force_leading_number);
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintTypecast(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
switch (ZydisFormatterHelperGetExplicitSize(formatter, context, context->operand))
|
||||
{
|
||||
case 8: ZYDIS_BUFFER_APPEND(buffer, SIZE_8_INTEL ); break;
|
||||
case 16: ZYDIS_BUFFER_APPEND(buffer, SIZE_16_INTEL ); break;
|
||||
case 32: ZYDIS_BUFFER_APPEND(buffer, SIZE_32_INTEL ); break;
|
||||
case 48: ZYDIS_BUFFER_APPEND(buffer, SIZE_48 ); break;
|
||||
case 64: ZYDIS_BUFFER_APPEND(buffer, SIZE_64_INTEL ); break;
|
||||
case 80: ZYDIS_BUFFER_APPEND(buffer, SIZE_80 ); break;
|
||||
case 128: ZYDIS_BUFFER_APPEND(buffer, SIZE_128_INTEL); break;
|
||||
case 256: ZYDIS_BUFFER_APPEND(buffer, SIZE_256_INTEL); break;
|
||||
case 512: ZYDIS_BUFFER_APPEND(buffer, SIZE_512_INTEL); break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* MASM */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisFormatterIntelFormatInstructionMASM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
// Force the formatter to always call our MASM `ZYDIS_FORMATTER_PRINT_ADDRESS_ABS` function.
|
||||
// This implicitly omits printing of the `RIP`/`EIP` registers for `RIP`/`EIP`-relative
|
||||
// memory operands
|
||||
context->runtime_address = 0;
|
||||
|
||||
return ZydisFormatterIntelFormatInstruction(formatter, buffer, context);
|
||||
}
|
||||
|
||||
ZyanStatus ZydisFormatterIntelPrintAddressMASM(const ZydisFormatter* formatter,
|
||||
ZydisFormatterBuffer* buffer, ZydisFormatterContext* context)
|
||||
{
|
||||
ZYAN_ASSERT(formatter);
|
||||
ZYAN_ASSERT(buffer);
|
||||
ZYAN_ASSERT(context);
|
||||
|
||||
ZyanU64 address;
|
||||
ZYAN_CHECK(ZydisCalcAbsoluteAddress(context->instruction, context->operand, 0, &address));
|
||||
|
||||
ZyanU8 padding = (formatter->addr_padding_relative ==
|
||||
ZYDIS_PADDING_AUTO) ? 0 : (ZyanU8)formatter->addr_padding_relative;
|
||||
if ((formatter->addr_padding_relative == ZYDIS_PADDING_AUTO) &&
|
||||
(formatter->addr_base == ZYDIS_NUMERIC_BASE_HEX))
|
||||
{
|
||||
switch (context->instruction->stack_width)
|
||||
{
|
||||
case 16:
|
||||
padding = 4;
|
||||
address = (ZyanU16)address;
|
||||
break;
|
||||
case 32:
|
||||
padding = 8;
|
||||
address = (ZyanU32)address;
|
||||
break;
|
||||
case 64:
|
||||
padding = 16;
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
|
||||
ZYDIS_BUFFER_APPEND(buffer, ADDR_RELATIVE);
|
||||
ZYDIS_STRING_APPEND_NUM_S(formatter, formatter->addr_base, &buffer->string, address, padding,
|
||||
formatter->hex_force_leading_number, ZYAN_TRUE);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
78
libs/zydis/src/Generated/AccessedFlags.inc
Normal file
78
libs/zydis/src/Generated/AccessedFlags.inc
Normal file
|
@ -0,0 +1,78 @@
|
|||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
static const ZydisDefinitionAccessedFlags ACCESSED_FLAGS[] =
|
||||
{
|
||||
{ { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0xF, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x6, 0x0, 0x0, 0x9 } },
|
||||
{ { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } },
|
||||
{ { 0x0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0xF } },
|
||||
{ { 0x0, 0x0, 0x40000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x0, 0x40000, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1000, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x800, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x800, 0x800, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x400, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1400, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x400, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x0, 0x400, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1000, 0x80200, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x30200, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x21800, 0x64300, 0x10000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x21000, 0xE4200, 0x10100, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x80, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x880, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x40, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x40, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } },
|
||||
{ { 0x8C0, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x40, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x4, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x4, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } },
|
||||
{ { 0x0, 0x8D4, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } },
|
||||
{ { 0x41, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x41, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0xD } },
|
||||
{ { 0xD5, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x3F5FD5, 0x0, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1, 0x1, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1, 0x1, 0x0, 0x0, 0x800 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x11, 0xD5, 0x0, 0x0, 0x800 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1, 0x8D5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x1, 0x8C5, 0x0, 0x0, 0x10 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x1, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x1, 0x0, 0x0, 0x800 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x41, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x440, 0x8D5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0xD5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x8D5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x400, 0x8D5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x25000, 0x3F5FD5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x21000, 0x3D5FD5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x121000, 0x2C5FD5, 0x10000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x3F5FD5, 0x0, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x3C5FD5, 0x10000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x3C5FD5, 0x30000, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x45, 0x890, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x45, 0x890, 0x0, 0x0 }, { 0x0, 0x2, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0xC5, 0x0, 0x0, 0x810 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x8C1, 0x14, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x41, 0x894, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x1, 0x8D4, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x10, 0x11, 0x0, 0x0, 0x8C4 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x1, 0x0, 0x0, 0x894 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0xC1, 0x800, 0x0, 0x14 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x41, 0x0, 0x0, 0x894 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x81, 0x840, 0x0, 0x14 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x801, 0x0, 0x0, 0xD4 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x1, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0xC4, 0x801, 0x0, 0x10 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x40, 0x895, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x8D5, 0x0, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0xC0, 0x801, 0x0, 0x14 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x40, 0x801, 0x0, 0x94 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x0, 0x1, 0x0 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0xC4, 0x0, 0x0, 0x811 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x40, 0x0, 0x0, 0x895 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } },
|
||||
{ { 0x0, 0x0, 0x0, 0x0, 0x8D5 }, { 0x0, 0x0, 0x0, 0x0, 0x0 } }
|
||||
};
|
||||
#endif
|
7585
libs/zydis/src/Generated/DecoderTables.inc
Normal file
7585
libs/zydis/src/Generated/DecoderTables.inc
Normal file
File diff suppressed because one or more lines are too long
1758
libs/zydis/src/Generated/EnumMnemonic.inc
Normal file
1758
libs/zydis/src/Generated/EnumMnemonic.inc
Normal file
File diff suppressed because it is too large
Load diff
289
libs/zydis/src/Generated/EnumRegister.inc
Normal file
289
libs/zydis/src/Generated/EnumRegister.inc
Normal file
|
@ -0,0 +1,289 @@
|
|||
static const ZydisShortString STR_REGISTERS[] =
|
||||
{
|
||||
ZYDIS_MAKE_SHORTSTRING("none"),
|
||||
// General purpose registers 8-bit
|
||||
ZYDIS_MAKE_SHORTSTRING("al"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cl"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dl"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bl"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ah"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ch"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dh"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bh"),
|
||||
ZYDIS_MAKE_SHORTSTRING("spl"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bpl"),
|
||||
ZYDIS_MAKE_SHORTSTRING("sil"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dil"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r8b"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r9b"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r10b"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r11b"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r12b"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r13b"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r14b"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r15b"),
|
||||
// General purpose registers 16-bit
|
||||
ZYDIS_MAKE_SHORTSTRING("ax"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("sp"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bp"),
|
||||
ZYDIS_MAKE_SHORTSTRING("si"),
|
||||
ZYDIS_MAKE_SHORTSTRING("di"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r8w"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r9w"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r10w"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r11w"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r12w"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r13w"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r14w"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r15w"),
|
||||
// General purpose registers 32-bit
|
||||
ZYDIS_MAKE_SHORTSTRING("eax"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ecx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("edx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ebx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("esp"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ebp"),
|
||||
ZYDIS_MAKE_SHORTSTRING("esi"),
|
||||
ZYDIS_MAKE_SHORTSTRING("edi"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r8d"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r9d"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r10d"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r11d"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r12d"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r13d"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r14d"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r15d"),
|
||||
// General purpose registers 64-bit
|
||||
ZYDIS_MAKE_SHORTSTRING("rax"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rcx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rdx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rbx"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rsp"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rbp"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rsi"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rdi"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r8"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r9"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r10"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r11"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r12"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r13"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r14"),
|
||||
ZYDIS_MAKE_SHORTSTRING("r15"),
|
||||
// Floating point legacy registers
|
||||
ZYDIS_MAKE_SHORTSTRING("st0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("st1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("st2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("st3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("st4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("st5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("st6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("st7"),
|
||||
ZYDIS_MAKE_SHORTSTRING("x87control"),
|
||||
ZYDIS_MAKE_SHORTSTRING("x87status"),
|
||||
ZYDIS_MAKE_SHORTSTRING("x87tag"),
|
||||
// Floating point multimedia registers
|
||||
ZYDIS_MAKE_SHORTSTRING("mm0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("mm1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("mm2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("mm3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("mm4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("mm5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("mm6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("mm7"),
|
||||
// Floating point vector registers 128-bit
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm7"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm8"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm9"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm10"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm11"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm12"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm13"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm14"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm15"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm16"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm17"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm18"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm19"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm20"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm21"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm22"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm23"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm24"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm25"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm26"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm27"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm28"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm29"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm30"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xmm31"),
|
||||
// Floating point vector registers 256-bit
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm7"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm8"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm9"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm10"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm11"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm12"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm13"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm14"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm15"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm16"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm17"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm18"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm19"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm20"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm21"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm22"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm23"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm24"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm25"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm26"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm27"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm28"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm29"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm30"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ymm31"),
|
||||
// Floating point vector registers 512-bit
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm7"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm8"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm9"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm10"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm11"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm12"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm13"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm14"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm15"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm16"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm17"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm18"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm19"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm20"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm21"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm22"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm23"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm24"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm25"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm26"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm27"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm28"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm29"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm30"),
|
||||
ZYDIS_MAKE_SHORTSTRING("zmm31"),
|
||||
// Matrix registers
|
||||
ZYDIS_MAKE_SHORTSTRING("tmm0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tmm1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tmm2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tmm3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tmm4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tmm5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tmm6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tmm7"),
|
||||
// Flags registers
|
||||
ZYDIS_MAKE_SHORTSTRING("flags"),
|
||||
ZYDIS_MAKE_SHORTSTRING("eflags"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rflags"),
|
||||
// Instruction-pointer registers
|
||||
ZYDIS_MAKE_SHORTSTRING("ip"),
|
||||
ZYDIS_MAKE_SHORTSTRING("eip"),
|
||||
ZYDIS_MAKE_SHORTSTRING("rip"),
|
||||
// Segment registers
|
||||
ZYDIS_MAKE_SHORTSTRING("es"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cs"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ss"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ds"),
|
||||
ZYDIS_MAKE_SHORTSTRING("fs"),
|
||||
ZYDIS_MAKE_SHORTSTRING("gs"),
|
||||
// Table registers
|
||||
ZYDIS_MAKE_SHORTSTRING("gdtr"),
|
||||
ZYDIS_MAKE_SHORTSTRING("ldtr"),
|
||||
ZYDIS_MAKE_SHORTSTRING("idtr"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tr"),
|
||||
// Test registers
|
||||
ZYDIS_MAKE_SHORTSTRING("tr0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tr1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tr2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tr3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tr4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tr5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tr6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("tr7"),
|
||||
// Control registers
|
||||
ZYDIS_MAKE_SHORTSTRING("cr0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr7"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr8"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr9"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr10"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr11"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr12"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr13"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr14"),
|
||||
ZYDIS_MAKE_SHORTSTRING("cr15"),
|
||||
// Debug registers
|
||||
ZYDIS_MAKE_SHORTSTRING("dr0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr7"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr8"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr9"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr10"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr11"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr12"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr13"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr14"),
|
||||
ZYDIS_MAKE_SHORTSTRING("dr15"),
|
||||
// Mask registers
|
||||
ZYDIS_MAKE_SHORTSTRING("k0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("k1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("k2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("k3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("k4"),
|
||||
ZYDIS_MAKE_SHORTSTRING("k5"),
|
||||
ZYDIS_MAKE_SHORTSTRING("k6"),
|
||||
ZYDIS_MAKE_SHORTSTRING("k7"),
|
||||
// Bound registers
|
||||
ZYDIS_MAKE_SHORTSTRING("bnd0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bnd1"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bnd2"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bnd3"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bndcfg"),
|
||||
ZYDIS_MAKE_SHORTSTRING("bndstatus"),
|
||||
// Uncategorized
|
||||
ZYDIS_MAKE_SHORTSTRING("mxcsr"),
|
||||
ZYDIS_MAKE_SHORTSTRING("pkru"),
|
||||
ZYDIS_MAKE_SHORTSTRING("xcr0"),
|
||||
ZYDIS_MAKE_SHORTSTRING("uif")
|
||||
};
|
816
libs/zydis/src/Generated/FormatterStrings.inc
Normal file
816
libs/zydis/src/Generated/FormatterStrings.inc
Normal file
|
@ -0,0 +1,816 @@
|
|||
#pragma pack(push, 1)
|
||||
|
||||
static const ZydisShortString STR_ADD = ZYDIS_MAKE_SHORTSTRING("+");
|
||||
static const struct ZydisPredefinedTokenADD_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_ADD = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, '+', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_ADD = (const ZydisPredefinedToken* const)&TOK_DATA_ADD;
|
||||
|
||||
static const ZydisShortString STR_ADDR_RELATIVE = ZYDIS_MAKE_SHORTSTRING("$");
|
||||
static const struct ZydisPredefinedTokenADDR_RELATIVE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_ADDR_RELATIVE = { 4, 2, { ZYDIS_TOKEN_ADDRESS_REL, 0, '$', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_ADDR_RELATIVE = (const ZydisPredefinedToken* const)&TOK_DATA_ADDR_RELATIVE;
|
||||
|
||||
static const ZydisShortString STR_DECO_1TO2 = ZYDIS_MAKE_SHORTSTRING(" {1to2}");
|
||||
static const struct ZydisPredefinedTokenDECO_1TO2_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_1TO2 = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, '1', 't', 'o', '2', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_1TO2 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO2;
|
||||
|
||||
static const ZydisShortString STR_DECO_1TO4 = ZYDIS_MAKE_SHORTSTRING(" {1to4}");
|
||||
static const struct ZydisPredefinedTokenDECO_1TO4_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_1TO4 = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, '1', 't', 'o', '4', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_1TO4 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO4;
|
||||
|
||||
static const ZydisShortString STR_DECO_1TO8 = ZYDIS_MAKE_SHORTSTRING(" {1to8}");
|
||||
static const struct ZydisPredefinedTokenDECO_1TO8_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_1TO8 = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, '1', 't', 'o', '8', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_1TO8 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO8;
|
||||
|
||||
static const ZydisShortString STR_DECO_1TO16 = ZYDIS_MAKE_SHORTSTRING(" {1to16}");
|
||||
static const struct ZydisPredefinedTokenDECO_1TO16_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[20];
|
||||
} TOK_DATA_DECO_1TO16 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '1', 't', 'o', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_1TO16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO16;
|
||||
|
||||
static const ZydisShortString STR_DECO_1TO32 = ZYDIS_MAKE_SHORTSTRING(" {1to32}");
|
||||
static const struct ZydisPredefinedTokenDECO_1TO32_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[20];
|
||||
} TOK_DATA_DECO_1TO32 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '1', 't', 'o', '3', '2', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_1TO32 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO32;
|
||||
|
||||
static const ZydisShortString STR_DECO_1TO64 = ZYDIS_MAKE_SHORTSTRING(" {1to64}");
|
||||
static const struct ZydisPredefinedTokenDECO_1TO64_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[20];
|
||||
} TOK_DATA_DECO_1TO64 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '1', 't', 'o', '6', '4', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_1TO64 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_1TO64;
|
||||
|
||||
static const ZydisShortString STR_DECO_4TO8 = ZYDIS_MAKE_SHORTSTRING(" {4to8}");
|
||||
static const struct ZydisPredefinedTokenDECO_4TO8_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_4TO8 = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, '4', 't', 'o', '8', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_4TO8 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_4TO8;
|
||||
|
||||
static const ZydisShortString STR_DECO_4TO16 = ZYDIS_MAKE_SHORTSTRING(" {4to16}");
|
||||
static const struct ZydisPredefinedTokenDECO_4TO16_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[20];
|
||||
} TOK_DATA_DECO_4TO16 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '4', 't', 'o', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_4TO16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_4TO16;
|
||||
|
||||
static const ZydisShortString STR_DECO_8TO16 = ZYDIS_MAKE_SHORTSTRING(" {8to16}");
|
||||
static const struct ZydisPredefinedTokenDECO_8TO16_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[20];
|
||||
} TOK_DATA_DECO_8TO16 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, '8', 't', 'o', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_8TO16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_8TO16;
|
||||
|
||||
static const ZydisShortString STR_DECO_AAAA = ZYDIS_MAKE_SHORTSTRING(" {aaaa}");
|
||||
static const struct ZydisPredefinedTokenDECO_AAAA_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_AAAA = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'a', 'a', 'a', 'a', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_AAAA = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_AAAA;
|
||||
|
||||
static const ZydisShortString STR_DECO_BADC = ZYDIS_MAKE_SHORTSTRING(" {badc}");
|
||||
static const struct ZydisPredefinedTokenDECO_BADC_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_BADC = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'b', 'a', 'd', 'c', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_BADC = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_BADC;
|
||||
|
||||
static const ZydisShortString STR_DECO_BBBB = ZYDIS_MAKE_SHORTSTRING(" {bbbb}");
|
||||
static const struct ZydisPredefinedTokenDECO_BBBB_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_BBBB = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'b', 'b', 'b', 'b', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_BBBB = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_BBBB;
|
||||
|
||||
static const ZydisShortString STR_DECO_BEGIN = ZYDIS_MAKE_SHORTSTRING(" {");
|
||||
static const struct ZydisPredefinedTokenDECO_BEGIN_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[8];
|
||||
} TOK_DATA_DECO_BEGIN = { 8, 6, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 0, '{', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_BEGIN = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_BEGIN;
|
||||
|
||||
static const ZydisShortString STR_DECO_CCCC = ZYDIS_MAKE_SHORTSTRING(" {cccc}");
|
||||
static const struct ZydisPredefinedTokenDECO_CCCC_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_CCCC = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'c', 'c', 'c', 'c', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_CCCC = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_CCCC;
|
||||
|
||||
static const ZydisShortString STR_DECO_CDAB = ZYDIS_MAKE_SHORTSTRING(" {cdab}");
|
||||
static const struct ZydisPredefinedTokenDECO_CDAB_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_CDAB = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'c', 'd', 'a', 'b', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_CDAB = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_CDAB;
|
||||
|
||||
static const ZydisShortString STR_DECO_DACB = ZYDIS_MAKE_SHORTSTRING(" {dacb}");
|
||||
static const struct ZydisPredefinedTokenDECO_DACB_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_DACB = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'd', 'a', 'c', 'b', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_DACB = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_DACB;
|
||||
|
||||
static const ZydisShortString STR_DECO_DDDD = ZYDIS_MAKE_SHORTSTRING(" {dddd}");
|
||||
static const struct ZydisPredefinedTokenDECO_DDDD_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[19];
|
||||
} TOK_DATA_DECO_DDDD = { 19, 17, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 5, 'd', 'd', 'd', 'd', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_DDDD = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_DDDD;
|
||||
|
||||
static const ZydisShortString STR_DECO_EH = ZYDIS_MAKE_SHORTSTRING(" {eh}");
|
||||
static const struct ZydisPredefinedTokenDECO_EH_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[17];
|
||||
} TOK_DATA_DECO_EH = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'e', 'h', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_EH = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_EH;
|
||||
|
||||
static const ZydisShortString STR_DECO_END = ZYDIS_MAKE_SHORTSTRING("}");
|
||||
static const struct ZydisPredefinedTokenDECO_END_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_DECO_END = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_END = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_END;
|
||||
|
||||
static const ZydisShortString STR_DECO_FLOAT16 = ZYDIS_MAKE_SHORTSTRING(" {float16}");
|
||||
static const struct ZydisPredefinedTokenDECO_FLOAT16_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[22];
|
||||
} TOK_DATA_DECO_FLOAT16 = { 22, 20, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 8, 'f', 'l', 'o', 'a', 't', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_FLOAT16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_FLOAT16;
|
||||
|
||||
static const ZydisShortString STR_DECO_RD = ZYDIS_MAKE_SHORTSTRING(" {rd}");
|
||||
static const struct ZydisPredefinedTokenDECO_RD_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[17];
|
||||
} TOK_DATA_DECO_RD = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'r', 'd', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_RD = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RD;
|
||||
|
||||
static const ZydisShortString STR_DECO_RD_SAE = ZYDIS_MAKE_SHORTSTRING(" {rd-sae}");
|
||||
static const struct ZydisPredefinedTokenDECO_RD_SAE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[21];
|
||||
} TOK_DATA_DECO_RD_SAE = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'r', 'd', '-', 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_RD_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RD_SAE;
|
||||
|
||||
static const ZydisShortString STR_DECO_RN = ZYDIS_MAKE_SHORTSTRING(" {rn}");
|
||||
static const struct ZydisPredefinedTokenDECO_RN_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[17];
|
||||
} TOK_DATA_DECO_RN = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'r', 'n', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_RN = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RN;
|
||||
|
||||
static const ZydisShortString STR_DECO_RN_SAE = ZYDIS_MAKE_SHORTSTRING(" {rn-sae}");
|
||||
static const struct ZydisPredefinedTokenDECO_RN_SAE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[21];
|
||||
} TOK_DATA_DECO_RN_SAE = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'r', 'n', '-', 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_RN_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RN_SAE;
|
||||
|
||||
static const ZydisShortString STR_DECO_RU = ZYDIS_MAKE_SHORTSTRING(" {ru}");
|
||||
static const struct ZydisPredefinedTokenDECO_RU_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[17];
|
||||
} TOK_DATA_DECO_RU = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'r', 'u', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_RU = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RU;
|
||||
|
||||
static const ZydisShortString STR_DECO_RU_SAE = ZYDIS_MAKE_SHORTSTRING(" {ru-sae}");
|
||||
static const struct ZydisPredefinedTokenDECO_RU_SAE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[21];
|
||||
} TOK_DATA_DECO_RU_SAE = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'r', 'u', '-', 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_RU_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RU_SAE;
|
||||
|
||||
static const ZydisShortString STR_DECO_RZ = ZYDIS_MAKE_SHORTSTRING(" {rz}");
|
||||
static const struct ZydisPredefinedTokenDECO_RZ_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[17];
|
||||
} TOK_DATA_DECO_RZ = { 17, 15, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 3, 'r', 'z', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_RZ = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RZ;
|
||||
|
||||
static const ZydisShortString STR_DECO_RZ_SAE = ZYDIS_MAKE_SHORTSTRING(" {rz-sae}");
|
||||
static const struct ZydisPredefinedTokenDECO_RZ_SAE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[21];
|
||||
} TOK_DATA_DECO_RZ_SAE = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'r', 'z', '-', 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_RZ_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_RZ_SAE;
|
||||
|
||||
static const ZydisShortString STR_DECO_SAE = ZYDIS_MAKE_SHORTSTRING(" {sae}");
|
||||
static const struct ZydisPredefinedTokenDECO_SAE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[18];
|
||||
} TOK_DATA_DECO_SAE = { 18, 16, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 4, 's', 'a', 'e', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_SAE = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_SAE;
|
||||
|
||||
static const ZydisShortString STR_DECO_SINT8 = ZYDIS_MAKE_SHORTSTRING(" {sint8}");
|
||||
static const struct ZydisPredefinedTokenDECO_SINT8_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[20];
|
||||
} TOK_DATA_DECO_SINT8 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, 's', 'i', 'n', 't', '8', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_SINT8 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_SINT8;
|
||||
|
||||
static const ZydisShortString STR_DECO_SINT16 = ZYDIS_MAKE_SHORTSTRING(" {sint16}");
|
||||
static const struct ZydisPredefinedTokenDECO_SINT16_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[21];
|
||||
} TOK_DATA_DECO_SINT16 = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 's', 'i', 'n', 't', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_SINT16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_SINT16;
|
||||
|
||||
static const ZydisShortString STR_DECO_UINT8 = ZYDIS_MAKE_SHORTSTRING(" {uint8}");
|
||||
static const struct ZydisPredefinedTokenDECO_UINT8_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[20];
|
||||
} TOK_DATA_DECO_UINT8 = { 20, 18, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 6, 'u', 'i', 'n', 't', '8', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_UINT8 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_UINT8;
|
||||
|
||||
static const ZydisShortString STR_DECO_UINT16 = ZYDIS_MAKE_SHORTSTRING(" {uint16}");
|
||||
static const struct ZydisPredefinedTokenDECO_UINT16_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[21];
|
||||
} TOK_DATA_DECO_UINT16 = { 21, 19, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 7, 'u', 'i', 'n', 't', '1', '6', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_UINT16 = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_UINT16;
|
||||
|
||||
static const ZydisShortString STR_DECO_ZERO = ZYDIS_MAKE_SHORTSTRING(" {z}");
|
||||
static const struct ZydisPredefinedTokenDECO_ZERO_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[16];
|
||||
} TOK_DATA_DECO_ZERO = { 16, 14, { ZYDIS_TOKEN_WHITESPACE, 2, ' ', '\0', ZYDIS_TOKEN_PARENTHESIS_OPEN, 2, '{', '\0', ZYDIS_TOKEN_DECORATOR, 2, 'z', '\0', ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, '}', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DECO_ZERO = (const ZydisPredefinedToken* const)&TOK_DATA_DECO_ZERO;
|
||||
|
||||
static const ZydisShortString STR_DELIM_MEMORY = ZYDIS_MAKE_SHORTSTRING(",");
|
||||
static const struct ZydisPredefinedTokenDELIM_MEMORY_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_DELIM_MEMORY = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, ',', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DELIM_MEMORY = (const ZydisPredefinedToken* const)&TOK_DATA_DELIM_MEMORY;
|
||||
|
||||
static const ZydisShortString STR_DELIM_MNEMONIC = ZYDIS_MAKE_SHORTSTRING(" ");
|
||||
static const struct ZydisPredefinedTokenDELIM_MNEMONIC_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_DELIM_MNEMONIC = { 4, 2, { ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DELIM_MNEMONIC = (const ZydisPredefinedToken* const)&TOK_DATA_DELIM_MNEMONIC;
|
||||
|
||||
static const ZydisShortString STR_DELIM_OPERAND = ZYDIS_MAKE_SHORTSTRING(", ");
|
||||
static const struct ZydisPredefinedTokenDELIM_OPERAND_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[8];
|
||||
} TOK_DATA_DELIM_OPERAND = { 8, 6, { ZYDIS_TOKEN_DELIMITER, 2, ',', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DELIM_OPERAND = (const ZydisPredefinedToken* const)&TOK_DATA_DELIM_OPERAND;
|
||||
|
||||
static const ZydisShortString STR_DELIM_SEGMENT = ZYDIS_MAKE_SHORTSTRING(":");
|
||||
static const struct ZydisPredefinedTokenDELIM_SEGMENT_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_DELIM_SEGMENT = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, ':', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_DELIM_SEGMENT = (const ZydisPredefinedToken* const)&TOK_DATA_DELIM_SEGMENT;
|
||||
|
||||
static const ZydisShortString STR_FAR = ZYDIS_MAKE_SHORTSTRING(" far");
|
||||
static const ZydisShortString STR_FAR_ATT = ZYDIS_MAKE_SHORTSTRING("l");
|
||||
static const ZydisShortString STR_IMMEDIATE = ZYDIS_MAKE_SHORTSTRING("$");
|
||||
static const struct ZydisPredefinedTokenIMMEDIATE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_IMMEDIATE = { 4, 2, { ZYDIS_TOKEN_IMMEDIATE, 0, '$', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_IMMEDIATE = (const ZydisPredefinedToken* const)&TOK_DATA_IMMEDIATE;
|
||||
|
||||
static const ZydisShortString STR_INVALID_MNEMONIC = ZYDIS_MAKE_SHORTSTRING("invalid");
|
||||
static const struct ZydisPredefinedTokenINVALID_MNEMONIC_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[10];
|
||||
} TOK_DATA_INVALID_MNEMONIC = { 10, 2, { ZYDIS_TOKEN_MNEMONIC, 0, 'i', 'n', 'v', 'a', 'l', 'i', 'd', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_INVALID_MNEMONIC = (const ZydisPredefinedToken* const)&TOK_DATA_INVALID_MNEMONIC;
|
||||
|
||||
static const ZydisShortString STR_INVALID_REG = ZYDIS_MAKE_SHORTSTRING("invalid");
|
||||
static const struct ZydisPredefinedTokenINVALID_REG_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[10];
|
||||
} TOK_DATA_INVALID_REG = { 10, 2, { ZYDIS_TOKEN_REGISTER, 0, 'i', 'n', 'v', 'a', 'l', 'i', 'd', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_INVALID_REG = (const ZydisPredefinedToken* const)&TOK_DATA_INVALID_REG;
|
||||
|
||||
static const ZydisShortString STR_MEMORY_BEGIN_ATT = ZYDIS_MAKE_SHORTSTRING("(");
|
||||
static const struct ZydisPredefinedTokenMEMORY_BEGIN_ATT_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_MEMORY_BEGIN_ATT = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_OPEN, 0, '(', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_MEMORY_BEGIN_ATT = (const ZydisPredefinedToken* const)&TOK_DATA_MEMORY_BEGIN_ATT;
|
||||
|
||||
static const ZydisShortString STR_MEMORY_BEGIN_INTEL = ZYDIS_MAKE_SHORTSTRING("[");
|
||||
static const struct ZydisPredefinedTokenMEMORY_BEGIN_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_MEMORY_BEGIN_INTEL = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_OPEN, 0, '[', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_MEMORY_BEGIN_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_MEMORY_BEGIN_INTEL;
|
||||
|
||||
static const ZydisShortString STR_MEMORY_END_ATT = ZYDIS_MAKE_SHORTSTRING(")");
|
||||
static const struct ZydisPredefinedTokenMEMORY_END_ATT_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_MEMORY_END_ATT = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, ')', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_MEMORY_END_ATT = (const ZydisPredefinedToken* const)&TOK_DATA_MEMORY_END_ATT;
|
||||
|
||||
static const ZydisShortString STR_MEMORY_END_INTEL = ZYDIS_MAKE_SHORTSTRING("]");
|
||||
static const struct ZydisPredefinedTokenMEMORY_END_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_MEMORY_END_INTEL = { 4, 2, { ZYDIS_TOKEN_PARENTHESIS_CLOSE, 0, ']', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_MEMORY_END_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_MEMORY_END_INTEL;
|
||||
|
||||
static const ZydisShortString STR_MUL = ZYDIS_MAKE_SHORTSTRING("*");
|
||||
static const struct ZydisPredefinedTokenMUL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_MUL = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, '*', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_MUL = (const ZydisPredefinedToken* const)&TOK_DATA_MUL;
|
||||
|
||||
static const ZydisShortString STR_NEAR = ZYDIS_MAKE_SHORTSTRING(" near");
|
||||
static const ZydisShortString STR_PREF_BND = ZYDIS_MAKE_SHORTSTRING("bnd ");
|
||||
static const struct ZydisPredefinedTokenPREF_BND_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[10];
|
||||
} TOK_DATA_PREF_BND = { 10, 8, { ZYDIS_TOKEN_PREFIX, 4, 'b', 'n', 'd', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_BND = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_BND;
|
||||
|
||||
static const ZydisShortString STR_PREF_LOCK = ZYDIS_MAKE_SHORTSTRING("lock ");
|
||||
static const struct ZydisPredefinedTokenPREF_LOCK_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[11];
|
||||
} TOK_DATA_PREF_LOCK = { 11, 9, { ZYDIS_TOKEN_PREFIX, 5, 'l', 'o', 'c', 'k', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_LOCK = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_LOCK;
|
||||
|
||||
static const ZydisShortString STR_PREF_REP = ZYDIS_MAKE_SHORTSTRING("rep ");
|
||||
static const struct ZydisPredefinedTokenPREF_REP_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[10];
|
||||
} TOK_DATA_PREF_REP = { 10, 8, { ZYDIS_TOKEN_PREFIX, 4, 'r', 'e', 'p', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REP = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REP;
|
||||
|
||||
static const ZydisShortString STR_PREF_REPE = ZYDIS_MAKE_SHORTSTRING("repe ");
|
||||
static const struct ZydisPredefinedTokenPREF_REPE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[11];
|
||||
} TOK_DATA_PREF_REPE = { 11, 9, { ZYDIS_TOKEN_PREFIX, 5, 'r', 'e', 'p', 'e', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REPE = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REPE;
|
||||
|
||||
static const ZydisShortString STR_PREF_REPNE = ZYDIS_MAKE_SHORTSTRING("repne ");
|
||||
static const struct ZydisPredefinedTokenPREF_REPNE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[12];
|
||||
} TOK_DATA_PREF_REPNE = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'p', 'n', 'e', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REPNE = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REPNE;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_4A = ZYDIS_MAKE_SHORTSTRING("rex.wx ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_4A_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[13];
|
||||
} TOK_DATA_PREF_REX_4A = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'w', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_4A = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4A;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_4B = ZYDIS_MAKE_SHORTSTRING("rex.wxb ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_4B_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[14];
|
||||
} TOK_DATA_PREF_REX_4B = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'r', 'e', 'x', '.', 'w', 'x', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_4B = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4B;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_4C = ZYDIS_MAKE_SHORTSTRING("rex.wr ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_4C_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[13];
|
||||
} TOK_DATA_PREF_REX_4C = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'w', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_4C = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4C;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_4D = ZYDIS_MAKE_SHORTSTRING("rex.wrb ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_4D_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[14];
|
||||
} TOK_DATA_PREF_REX_4D = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'r', 'e', 'x', '.', 'w', 'r', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_4D = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4D;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_4E = ZYDIS_MAKE_SHORTSTRING("rex.wrx ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_4E_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[14];
|
||||
} TOK_DATA_PREF_REX_4E = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'r', 'e', 'x', '.', 'w', 'r', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_4E = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4E;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_4F = ZYDIS_MAKE_SHORTSTRING("rex.wrxb ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_4F_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[15];
|
||||
} TOK_DATA_PREF_REX_4F = { 15, 13, { ZYDIS_TOKEN_PREFIX, 9, 'r', 'e', 'x', '.', 'w', 'r', 'x', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_4F = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_4F;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_40 = ZYDIS_MAKE_SHORTSTRING("rex ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_40_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[10];
|
||||
} TOK_DATA_PREF_REX_40 = { 10, 8, { ZYDIS_TOKEN_PREFIX, 4, 'r', 'e', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_40 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_40;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_41 = ZYDIS_MAKE_SHORTSTRING("rex.b ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_41_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[12];
|
||||
} TOK_DATA_PREF_REX_41 = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'x', '.', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_41 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_41;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_42 = ZYDIS_MAKE_SHORTSTRING("rex.x ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_42_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[12];
|
||||
} TOK_DATA_PREF_REX_42 = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'x', '.', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_42 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_42;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_43 = ZYDIS_MAKE_SHORTSTRING("rex.xb ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_43_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[13];
|
||||
} TOK_DATA_PREF_REX_43 = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'x', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_43 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_43;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_44 = ZYDIS_MAKE_SHORTSTRING("rex.r ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_44_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[12];
|
||||
} TOK_DATA_PREF_REX_44 = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'x', '.', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_44 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_44;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_45 = ZYDIS_MAKE_SHORTSTRING("rex.rb ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_45_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[13];
|
||||
} TOK_DATA_PREF_REX_45 = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'r', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_45 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_45;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_46 = ZYDIS_MAKE_SHORTSTRING("rex.rx ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_46_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[13];
|
||||
} TOK_DATA_PREF_REX_46 = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'r', 'x', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_46 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_46;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_47 = ZYDIS_MAKE_SHORTSTRING("rex.rxb ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_47_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[14];
|
||||
} TOK_DATA_PREF_REX_47 = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'r', 'e', 'x', '.', 'r', 'x', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_47 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_47;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_48 = ZYDIS_MAKE_SHORTSTRING("rex.w ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_48_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[12];
|
||||
} TOK_DATA_PREF_REX_48 = { 12, 10, { ZYDIS_TOKEN_PREFIX, 6, 'r', 'e', 'x', '.', 'w', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_48 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_48;
|
||||
|
||||
static const ZydisShortString STR_PREF_REX_49 = ZYDIS_MAKE_SHORTSTRING("rex.wb ");
|
||||
static const struct ZydisPredefinedTokenPREF_REX_49_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[13];
|
||||
} TOK_DATA_PREF_REX_49 = { 13, 11, { ZYDIS_TOKEN_PREFIX, 7, 'r', 'e', 'x', '.', 'w', 'b', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_REX_49 = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_REX_49;
|
||||
|
||||
static const ZydisShortString STR_PREF_SEG_CS = ZYDIS_MAKE_SHORTSTRING("cs ");
|
||||
static const struct ZydisPredefinedTokenPREF_SEG_CS_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[9];
|
||||
} TOK_DATA_PREF_SEG_CS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'c', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_SEG_CS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_CS;
|
||||
|
||||
static const ZydisShortString STR_PREF_SEG_DS = ZYDIS_MAKE_SHORTSTRING("ds ");
|
||||
static const struct ZydisPredefinedTokenPREF_SEG_DS_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[9];
|
||||
} TOK_DATA_PREF_SEG_DS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'd', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_SEG_DS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_DS;
|
||||
|
||||
static const ZydisShortString STR_PREF_SEG_ES = ZYDIS_MAKE_SHORTSTRING("es ");
|
||||
static const struct ZydisPredefinedTokenPREF_SEG_ES_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[9];
|
||||
} TOK_DATA_PREF_SEG_ES = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'e', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_SEG_ES = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_ES;
|
||||
|
||||
static const ZydisShortString STR_PREF_SEG_FS = ZYDIS_MAKE_SHORTSTRING("fs ");
|
||||
static const struct ZydisPredefinedTokenPREF_SEG_FS_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[9];
|
||||
} TOK_DATA_PREF_SEG_FS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'f', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_SEG_FS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_FS;
|
||||
|
||||
static const ZydisShortString STR_PREF_SEG_GS = ZYDIS_MAKE_SHORTSTRING("gs ");
|
||||
static const struct ZydisPredefinedTokenPREF_SEG_GS_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[9];
|
||||
} TOK_DATA_PREF_SEG_GS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 'g', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_SEG_GS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_GS;
|
||||
|
||||
static const ZydisShortString STR_PREF_SEG_SS = ZYDIS_MAKE_SHORTSTRING("ss ");
|
||||
static const struct ZydisPredefinedTokenPREF_SEG_SS_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[9];
|
||||
} TOK_DATA_PREF_SEG_SS = { 9, 7, { ZYDIS_TOKEN_PREFIX, 3, 's', 's', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_SEG_SS = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_SEG_SS;
|
||||
|
||||
static const ZydisShortString STR_PREF_XACQUIRE = ZYDIS_MAKE_SHORTSTRING("xacquire ");
|
||||
static const struct ZydisPredefinedTokenPREF_XACQUIRE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[15];
|
||||
} TOK_DATA_PREF_XACQUIRE = { 15, 13, { ZYDIS_TOKEN_PREFIX, 9, 'x', 'a', 'c', 'q', 'u', 'i', 'r', 'e', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_XACQUIRE = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_XACQUIRE;
|
||||
|
||||
static const ZydisShortString STR_PREF_XRELEASE = ZYDIS_MAKE_SHORTSTRING("xrelease ");
|
||||
static const struct ZydisPredefinedTokenPREF_XRELEASE_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[15];
|
||||
} TOK_DATA_PREF_XRELEASE = { 15, 13, { ZYDIS_TOKEN_PREFIX, 9, 'x', 'r', 'e', 'l', 'e', 'a', 's', 'e', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_XRELEASE = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_XRELEASE;
|
||||
|
||||
static const ZydisShortString STR_PREF_NOTRACK = ZYDIS_MAKE_SHORTSTRING("notrack ");
|
||||
static const struct ZydisPredefinedTokenPREF_NOTRACK_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[14];
|
||||
} TOK_DATA_PREF_NOTRACK = { 14, 12, { ZYDIS_TOKEN_PREFIX, 8, 'n', 'o', 't', 'r', 'a', 'c', 'k', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_PREF_NOTRACK = (const ZydisPredefinedToken* const)&TOK_DATA_PREF_NOTRACK;
|
||||
|
||||
static const ZydisShortString STR_REGISTER = ZYDIS_MAKE_SHORTSTRING("%");
|
||||
static const struct ZydisPredefinedTokenREGISTER_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_REGISTER = { 4, 2, { ZYDIS_TOKEN_REGISTER, 0, '%', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_REGISTER = (const ZydisPredefinedToken* const)&TOK_DATA_REGISTER;
|
||||
|
||||
static const ZydisShortString STR_SHORT = ZYDIS_MAKE_SHORTSTRING(" short");
|
||||
static const ZydisShortString STR_SIZE_8_ATT = ZYDIS_MAKE_SHORTSTRING("b");
|
||||
static const ZydisShortString STR_SIZE_8_INTEL = ZYDIS_MAKE_SHORTSTRING("byte ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_8_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[15];
|
||||
} TOK_DATA_SIZE_8_INTEL = { 15, 13, { ZYDIS_TOKEN_TYPECAST, 9, 'b', 'y', 't', 'e', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_8_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_8_INTEL;
|
||||
|
||||
static const ZydisShortString STR_SIZE_16_ATT = ZYDIS_MAKE_SHORTSTRING("w");
|
||||
static const ZydisShortString STR_SIZE_16_INTEL = ZYDIS_MAKE_SHORTSTRING("word ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_16_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[15];
|
||||
} TOK_DATA_SIZE_16_INTEL = { 15, 13, { ZYDIS_TOKEN_TYPECAST, 9, 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_16_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_16_INTEL;
|
||||
|
||||
static const ZydisShortString STR_SIZE_32_ATT = ZYDIS_MAKE_SHORTSTRING("l");
|
||||
static const ZydisShortString STR_SIZE_32_INTEL = ZYDIS_MAKE_SHORTSTRING("dword ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_32_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[16];
|
||||
} TOK_DATA_SIZE_32_INTEL = { 16, 14, { ZYDIS_TOKEN_TYPECAST, 10, 'd', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_32_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_32_INTEL;
|
||||
|
||||
static const ZydisShortString STR_SIZE_48 = ZYDIS_MAKE_SHORTSTRING("fword ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_48_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[16];
|
||||
} TOK_DATA_SIZE_48 = { 16, 14, { ZYDIS_TOKEN_TYPECAST, 10, 'f', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_48 = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_48;
|
||||
|
||||
static const ZydisShortString STR_SIZE_64_ATT = ZYDIS_MAKE_SHORTSTRING("q");
|
||||
static const ZydisShortString STR_SIZE_64_INTEL = ZYDIS_MAKE_SHORTSTRING("qword ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_64_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[16];
|
||||
} TOK_DATA_SIZE_64_INTEL = { 16, 14, { ZYDIS_TOKEN_TYPECAST, 10, 'q', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_64_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_64_INTEL;
|
||||
|
||||
static const ZydisShortString STR_SIZE_80 = ZYDIS_MAKE_SHORTSTRING("tbyte ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_80_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[16];
|
||||
} TOK_DATA_SIZE_80 = { 16, 14, { ZYDIS_TOKEN_TYPECAST, 10, 't', 'b', 'y', 't', 'e', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_80 = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_80;
|
||||
|
||||
static const ZydisShortString STR_SIZE_128_ATT = ZYDIS_MAKE_SHORTSTRING("x");
|
||||
static const ZydisShortString STR_SIZE_128_INTEL = ZYDIS_MAKE_SHORTSTRING("xmmword ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_128_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[18];
|
||||
} TOK_DATA_SIZE_128_INTEL = { 18, 16, { ZYDIS_TOKEN_TYPECAST, 12, 'x', 'm', 'm', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_128_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_128_INTEL;
|
||||
|
||||
static const ZydisShortString STR_SIZE_256_ATT = ZYDIS_MAKE_SHORTSTRING("y");
|
||||
static const ZydisShortString STR_SIZE_256_INTEL = ZYDIS_MAKE_SHORTSTRING("ymmword ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_256_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[18];
|
||||
} TOK_DATA_SIZE_256_INTEL = { 18, 16, { ZYDIS_TOKEN_TYPECAST, 12, 'y', 'm', 'm', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_256_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_256_INTEL;
|
||||
|
||||
static const ZydisShortString STR_SIZE_512_ATT = ZYDIS_MAKE_SHORTSTRING("z");
|
||||
static const ZydisShortString STR_SIZE_512_INTEL = ZYDIS_MAKE_SHORTSTRING("zmmword ptr ");
|
||||
static const struct ZydisPredefinedTokenSIZE_512_INTEL_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[18];
|
||||
} TOK_DATA_SIZE_512_INTEL = { 18, 16, { ZYDIS_TOKEN_TYPECAST, 12, 'z', 'm', 'm', 'w', 'o', 'r', 'd', ' ', 'p', 't', 'r', '\0', ZYDIS_TOKEN_WHITESPACE, 0, ' ', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SIZE_512_INTEL = (const ZydisPredefinedToken* const)&TOK_DATA_SIZE_512_INTEL;
|
||||
|
||||
static const ZydisShortString STR_SUB = ZYDIS_MAKE_SHORTSTRING("-");
|
||||
static const struct ZydisPredefinedTokenSUB_
|
||||
{
|
||||
ZyanU8 size;
|
||||
ZyanU8 next;
|
||||
ZyanU8 data[4];
|
||||
} TOK_DATA_SUB = { 4, 2, { ZYDIS_TOKEN_DELIMITER, 0, '-', '\0' } };
|
||||
static const ZydisPredefinedToken* const TOK_SUB = (const ZydisPredefinedToken* const)&TOK_DATA_SUB;
|
||||
|
||||
static const ZydisShortString STR_WHITESPACE = ZYDIS_MAKE_SHORTSTRING(" ");
|
||||
#pragma pack(pop)
|
7839
libs/zydis/src/Generated/InstructionDefinitions.inc
Normal file
7839
libs/zydis/src/Generated/InstructionDefinitions.inc
Normal file
File diff suppressed because it is too large
Load diff
23
libs/zydis/src/Generated/InstructionEncodings.inc
Normal file
23
libs/zydis/src/Generated/InstructionEncodings.inc
Normal file
|
@ -0,0 +1,23 @@
|
|||
static const ZydisInstructionEncodingInfo INSTR_ENCODINGS[] =
|
||||
{
|
||||
{ 0, { { 0, 0, 0 } }, { { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_MODRM, { { 0, 0, 0 } }, { { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_DISP, { { 16, 32, 64 } }, { { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 16, 16 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 64 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_TRUE, ZYAN_TRUE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_TRUE, ZYAN_TRUE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 32, 32, 32 }, ZYAN_TRUE, ZYAN_TRUE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 32, 32, 32 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_TRUE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_TRUE, ZYAN_TRUE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_FORCE_REG_FORM, { { 0, 0, 0 } }, { { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE }, { { 0, 0, 0 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 | ZYDIS_INSTR_ENC_FLAG_HAS_IMM1, { { 0, 0, 0 } }, { { { 16, 16, 16 }, ZYAN_FALSE, ZYAN_FALSE }, { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 | ZYDIS_INSTR_ENC_FLAG_HAS_IMM1, { { 0, 0, 0 } }, { { { 16, 32, 32 }, ZYAN_FALSE, ZYAN_FALSE }, { { 16, 16, 16 }, ZYAN_FALSE, ZYAN_FALSE } } },
|
||||
{ ZYDIS_INSTR_ENC_FLAG_HAS_MODRM | ZYDIS_INSTR_ENC_FLAG_HAS_IMM0 | ZYDIS_INSTR_ENC_FLAG_HAS_IMM1, { { 0, 0, 0 } }, { { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE }, { { 8, 8, 8 }, ZYAN_FALSE, ZYAN_FALSE } } }
|
||||
};
|
7816
libs/zydis/src/Generated/OperandDefinitions.inc
Normal file
7816
libs/zydis/src/Generated/OperandDefinitions.inc
Normal file
File diff suppressed because it is too large
Load diff
23
libs/zydis/src/Generated/RegisterClassLookup.inc
Normal file
23
libs/zydis/src/Generated/RegisterClassLookup.inc
Normal file
|
@ -0,0 +1,23 @@
|
|||
static const ZydisRegisterClassLookupItem REG_CLASS_LOOKUP[] =
|
||||
{
|
||||
/* INVALID */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 },
|
||||
/* GPR8 */ { ZYDIS_REGISTER_AL, ZYDIS_REGISTER_R15B, 8, 8 },
|
||||
/* GPR16 */ { ZYDIS_REGISTER_AX, ZYDIS_REGISTER_R15W, 16, 16 },
|
||||
/* GPR32 */ { ZYDIS_REGISTER_EAX, ZYDIS_REGISTER_R15D, 32, 32 },
|
||||
/* GPR64 */ { ZYDIS_REGISTER_RAX, ZYDIS_REGISTER_R15, 0, 64 },
|
||||
/* X87 */ { ZYDIS_REGISTER_ST0, ZYDIS_REGISTER_ST7, 80, 80 },
|
||||
/* MMX */ { ZYDIS_REGISTER_MM0, ZYDIS_REGISTER_MM7, 64, 64 },
|
||||
/* XMM */ { ZYDIS_REGISTER_XMM0, ZYDIS_REGISTER_XMM31, 128, 128 },
|
||||
/* YMM */ { ZYDIS_REGISTER_YMM0, ZYDIS_REGISTER_YMM31, 256, 256 },
|
||||
/* ZMM */ { ZYDIS_REGISTER_ZMM0, ZYDIS_REGISTER_ZMM31, 512, 512 },
|
||||
/* TMM */ { ZYDIS_REGISTER_TMM0, ZYDIS_REGISTER_TMM7, 8192, 8192 },
|
||||
/* FLAGS */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 },
|
||||
/* IP */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 },
|
||||
/* SEGMENT */ { ZYDIS_REGISTER_ES, ZYDIS_REGISTER_GS, 16, 16 },
|
||||
/* TABLE */ { ZYDIS_REGISTER_NONE, ZYDIS_REGISTER_NONE, 0, 0 },
|
||||
/* TEST */ { ZYDIS_REGISTER_TR0, ZYDIS_REGISTER_TR7, 32, 32 },
|
||||
/* CONTROL */ { ZYDIS_REGISTER_CR0, ZYDIS_REGISTER_CR15, 32, 64 },
|
||||
/* DEBUG */ { ZYDIS_REGISTER_DR0, ZYDIS_REGISTER_DR15, 32, 64 },
|
||||
/* MASK */ { ZYDIS_REGISTER_K0, ZYDIS_REGISTER_K7, 64, 64 },
|
||||
/* BOUND */ { ZYDIS_REGISTER_BND0, ZYDIS_REGISTER_BND3, 128, 128 }
|
||||
};
|
269
libs/zydis/src/Generated/RegisterLookup.inc
Normal file
269
libs/zydis/src/Generated/RegisterLookup.inc
Normal file
|
@ -0,0 +1,269 @@
|
|||
static const ZydisRegisterLookupItem REG_LOOKUP[] =
|
||||
{
|
||||
/* NONE */ { ZYDIS_REGCLASS_INVALID, -1, 0, 0 },
|
||||
/* AL */ { ZYDIS_REGCLASS_GPR8, 0, 8, 8 },
|
||||
/* CL */ { ZYDIS_REGCLASS_GPR8, 1, 8, 8 },
|
||||
/* DL */ { ZYDIS_REGCLASS_GPR8, 2, 8, 8 },
|
||||
/* BL */ { ZYDIS_REGCLASS_GPR8, 3, 8, 8 },
|
||||
/* AH */ { ZYDIS_REGCLASS_GPR8, 4, 8, 8 },
|
||||
/* CH */ { ZYDIS_REGCLASS_GPR8, 5, 8, 8 },
|
||||
/* DH */ { ZYDIS_REGCLASS_GPR8, 6, 8, 8 },
|
||||
/* BH */ { ZYDIS_REGCLASS_GPR8, 7, 8, 8 },
|
||||
/* SPL */ { ZYDIS_REGCLASS_GPR8, 8, 8, 8 },
|
||||
/* BPL */ { ZYDIS_REGCLASS_GPR8, 9, 8, 8 },
|
||||
/* SIL */ { ZYDIS_REGCLASS_GPR8, 10, 8, 8 },
|
||||
/* DIL */ { ZYDIS_REGCLASS_GPR8, 11, 8, 8 },
|
||||
/* R8B */ { ZYDIS_REGCLASS_GPR8, 12, 8, 8 },
|
||||
/* R9B */ { ZYDIS_REGCLASS_GPR8, 13, 8, 8 },
|
||||
/* R10B */ { ZYDIS_REGCLASS_GPR8, 14, 8, 8 },
|
||||
/* R11B */ { ZYDIS_REGCLASS_GPR8, 15, 8, 8 },
|
||||
/* R12B */ { ZYDIS_REGCLASS_GPR8, 16, 8, 8 },
|
||||
/* R13B */ { ZYDIS_REGCLASS_GPR8, 17, 8, 8 },
|
||||
/* R14B */ { ZYDIS_REGCLASS_GPR8, 18, 8, 8 },
|
||||
/* R15B */ { ZYDIS_REGCLASS_GPR8, 19, 8, 8 },
|
||||
/* AX */ { ZYDIS_REGCLASS_GPR16, 0, 16, 16 },
|
||||
/* CX */ { ZYDIS_REGCLASS_GPR16, 1, 16, 16 },
|
||||
/* DX */ { ZYDIS_REGCLASS_GPR16, 2, 16, 16 },
|
||||
/* BX */ { ZYDIS_REGCLASS_GPR16, 3, 16, 16 },
|
||||
/* SP */ { ZYDIS_REGCLASS_GPR16, 4, 16, 16 },
|
||||
/* BP */ { ZYDIS_REGCLASS_GPR16, 5, 16, 16 },
|
||||
/* SI */ { ZYDIS_REGCLASS_GPR16, 6, 16, 16 },
|
||||
/* DI */ { ZYDIS_REGCLASS_GPR16, 7, 16, 16 },
|
||||
/* R8W */ { ZYDIS_REGCLASS_GPR16, 8, 16, 16 },
|
||||
/* R9W */ { ZYDIS_REGCLASS_GPR16, 9, 16, 16 },
|
||||
/* R10W */ { ZYDIS_REGCLASS_GPR16, 10, 16, 16 },
|
||||
/* R11W */ { ZYDIS_REGCLASS_GPR16, 11, 16, 16 },
|
||||
/* R12W */ { ZYDIS_REGCLASS_GPR16, 12, 16, 16 },
|
||||
/* R13W */ { ZYDIS_REGCLASS_GPR16, 13, 16, 16 },
|
||||
/* R14W */ { ZYDIS_REGCLASS_GPR16, 14, 16, 16 },
|
||||
/* R15W */ { ZYDIS_REGCLASS_GPR16, 15, 16, 16 },
|
||||
/* EAX */ { ZYDIS_REGCLASS_GPR32, 0, 32, 32 },
|
||||
/* ECX */ { ZYDIS_REGCLASS_GPR32, 1, 32, 32 },
|
||||
/* EDX */ { ZYDIS_REGCLASS_GPR32, 2, 32, 32 },
|
||||
/* EBX */ { ZYDIS_REGCLASS_GPR32, 3, 32, 32 },
|
||||
/* ESP */ { ZYDIS_REGCLASS_GPR32, 4, 32, 32 },
|
||||
/* EBP */ { ZYDIS_REGCLASS_GPR32, 5, 32, 32 },
|
||||
/* ESI */ { ZYDIS_REGCLASS_GPR32, 6, 32, 32 },
|
||||
/* EDI */ { ZYDIS_REGCLASS_GPR32, 7, 32, 32 },
|
||||
/* R8D */ { ZYDIS_REGCLASS_GPR32, 8, 32, 32 },
|
||||
/* R9D */ { ZYDIS_REGCLASS_GPR32, 9, 32, 32 },
|
||||
/* R10D */ { ZYDIS_REGCLASS_GPR32, 10, 32, 32 },
|
||||
/* R11D */ { ZYDIS_REGCLASS_GPR32, 11, 32, 32 },
|
||||
/* R12D */ { ZYDIS_REGCLASS_GPR32, 12, 32, 32 },
|
||||
/* R13D */ { ZYDIS_REGCLASS_GPR32, 13, 32, 32 },
|
||||
/* R14D */ { ZYDIS_REGCLASS_GPR32, 14, 32, 32 },
|
||||
/* R15D */ { ZYDIS_REGCLASS_GPR32, 15, 32, 32 },
|
||||
/* RAX */ { ZYDIS_REGCLASS_GPR64, 0, 0, 64 },
|
||||
/* RCX */ { ZYDIS_REGCLASS_GPR64, 1, 0, 64 },
|
||||
/* RDX */ { ZYDIS_REGCLASS_GPR64, 2, 0, 64 },
|
||||
/* RBX */ { ZYDIS_REGCLASS_GPR64, 3, 0, 64 },
|
||||
/* RSP */ { ZYDIS_REGCLASS_GPR64, 4, 0, 64 },
|
||||
/* RBP */ { ZYDIS_REGCLASS_GPR64, 5, 0, 64 },
|
||||
/* RSI */ { ZYDIS_REGCLASS_GPR64, 6, 0, 64 },
|
||||
/* RDI */ { ZYDIS_REGCLASS_GPR64, 7, 0, 64 },
|
||||
/* R8 */ { ZYDIS_REGCLASS_GPR64, 8, 0, 64 },
|
||||
/* R9 */ { ZYDIS_REGCLASS_GPR64, 9, 0, 64 },
|
||||
/* R10 */ { ZYDIS_REGCLASS_GPR64, 10, 0, 64 },
|
||||
/* R11 */ { ZYDIS_REGCLASS_GPR64, 11, 0, 64 },
|
||||
/* R12 */ { ZYDIS_REGCLASS_GPR64, 12, 0, 64 },
|
||||
/* R13 */ { ZYDIS_REGCLASS_GPR64, 13, 0, 64 },
|
||||
/* R14 */ { ZYDIS_REGCLASS_GPR64, 14, 0, 64 },
|
||||
/* R15 */ { ZYDIS_REGCLASS_GPR64, 15, 0, 64 },
|
||||
/* ST0 */ { ZYDIS_REGCLASS_X87, 0, 80, 80 },
|
||||
/* ST1 */ { ZYDIS_REGCLASS_X87, 1, 80, 80 },
|
||||
/* ST2 */ { ZYDIS_REGCLASS_X87, 2, 80, 80 },
|
||||
/* ST3 */ { ZYDIS_REGCLASS_X87, 3, 80, 80 },
|
||||
/* ST4 */ { ZYDIS_REGCLASS_X87, 4, 80, 80 },
|
||||
/* ST5 */ { ZYDIS_REGCLASS_X87, 5, 80, 80 },
|
||||
/* ST6 */ { ZYDIS_REGCLASS_X87, 6, 80, 80 },
|
||||
/* ST7 */ { ZYDIS_REGCLASS_X87, 7, 80, 80 },
|
||||
/* X87CONTROL */ { ZYDIS_REGCLASS_INVALID, -1, 16, 16 },
|
||||
/* X87STATUS */ { ZYDIS_REGCLASS_INVALID, -1, 16, 16 },
|
||||
/* X87TAG */ { ZYDIS_REGCLASS_INVALID, -1, 16, 16 },
|
||||
/* MM0 */ { ZYDIS_REGCLASS_MMX, 0, 64, 64 },
|
||||
/* MM1 */ { ZYDIS_REGCLASS_MMX, 1, 64, 64 },
|
||||
/* MM2 */ { ZYDIS_REGCLASS_MMX, 2, 64, 64 },
|
||||
/* MM3 */ { ZYDIS_REGCLASS_MMX, 3, 64, 64 },
|
||||
/* MM4 */ { ZYDIS_REGCLASS_MMX, 4, 64, 64 },
|
||||
/* MM5 */ { ZYDIS_REGCLASS_MMX, 5, 64, 64 },
|
||||
/* MM6 */ { ZYDIS_REGCLASS_MMX, 6, 64, 64 },
|
||||
/* MM7 */ { ZYDIS_REGCLASS_MMX, 7, 64, 64 },
|
||||
/* XMM0 */ { ZYDIS_REGCLASS_XMM, 0, 128, 128 },
|
||||
/* XMM1 */ { ZYDIS_REGCLASS_XMM, 1, 128, 128 },
|
||||
/* XMM2 */ { ZYDIS_REGCLASS_XMM, 2, 128, 128 },
|
||||
/* XMM3 */ { ZYDIS_REGCLASS_XMM, 3, 128, 128 },
|
||||
/* XMM4 */ { ZYDIS_REGCLASS_XMM, 4, 128, 128 },
|
||||
/* XMM5 */ { ZYDIS_REGCLASS_XMM, 5, 128, 128 },
|
||||
/* XMM6 */ { ZYDIS_REGCLASS_XMM, 6, 128, 128 },
|
||||
/* XMM7 */ { ZYDIS_REGCLASS_XMM, 7, 128, 128 },
|
||||
/* XMM8 */ { ZYDIS_REGCLASS_XMM, 8, 128, 128 },
|
||||
/* XMM9 */ { ZYDIS_REGCLASS_XMM, 9, 128, 128 },
|
||||
/* XMM10 */ { ZYDIS_REGCLASS_XMM, 10, 128, 128 },
|
||||
/* XMM11 */ { ZYDIS_REGCLASS_XMM, 11, 128, 128 },
|
||||
/* XMM12 */ { ZYDIS_REGCLASS_XMM, 12, 128, 128 },
|
||||
/* XMM13 */ { ZYDIS_REGCLASS_XMM, 13, 128, 128 },
|
||||
/* XMM14 */ { ZYDIS_REGCLASS_XMM, 14, 128, 128 },
|
||||
/* XMM15 */ { ZYDIS_REGCLASS_XMM, 15, 128, 128 },
|
||||
/* XMM16 */ { ZYDIS_REGCLASS_XMM, 16, 128, 128 },
|
||||
/* XMM17 */ { ZYDIS_REGCLASS_XMM, 17, 128, 128 },
|
||||
/* XMM18 */ { ZYDIS_REGCLASS_XMM, 18, 128, 128 },
|
||||
/* XMM19 */ { ZYDIS_REGCLASS_XMM, 19, 128, 128 },
|
||||
/* XMM20 */ { ZYDIS_REGCLASS_XMM, 20, 128, 128 },
|
||||
/* XMM21 */ { ZYDIS_REGCLASS_XMM, 21, 128, 128 },
|
||||
/* XMM22 */ { ZYDIS_REGCLASS_XMM, 22, 128, 128 },
|
||||
/* XMM23 */ { ZYDIS_REGCLASS_XMM, 23, 128, 128 },
|
||||
/* XMM24 */ { ZYDIS_REGCLASS_XMM, 24, 128, 128 },
|
||||
/* XMM25 */ { ZYDIS_REGCLASS_XMM, 25, 128, 128 },
|
||||
/* XMM26 */ { ZYDIS_REGCLASS_XMM, 26, 128, 128 },
|
||||
/* XMM27 */ { ZYDIS_REGCLASS_XMM, 27, 128, 128 },
|
||||
/* XMM28 */ { ZYDIS_REGCLASS_XMM, 28, 128, 128 },
|
||||
/* XMM29 */ { ZYDIS_REGCLASS_XMM, 29, 128, 128 },
|
||||
/* XMM30 */ { ZYDIS_REGCLASS_XMM, 30, 128, 128 },
|
||||
/* XMM31 */ { ZYDIS_REGCLASS_XMM, 31, 128, 128 },
|
||||
/* YMM0 */ { ZYDIS_REGCLASS_YMM, 0, 256, 256 },
|
||||
/* YMM1 */ { ZYDIS_REGCLASS_YMM, 1, 256, 256 },
|
||||
/* YMM2 */ { ZYDIS_REGCLASS_YMM, 2, 256, 256 },
|
||||
/* YMM3 */ { ZYDIS_REGCLASS_YMM, 3, 256, 256 },
|
||||
/* YMM4 */ { ZYDIS_REGCLASS_YMM, 4, 256, 256 },
|
||||
/* YMM5 */ { ZYDIS_REGCLASS_YMM, 5, 256, 256 },
|
||||
/* YMM6 */ { ZYDIS_REGCLASS_YMM, 6, 256, 256 },
|
||||
/* YMM7 */ { ZYDIS_REGCLASS_YMM, 7, 256, 256 },
|
||||
/* YMM8 */ { ZYDIS_REGCLASS_YMM, 8, 256, 256 },
|
||||
/* YMM9 */ { ZYDIS_REGCLASS_YMM, 9, 256, 256 },
|
||||
/* YMM10 */ { ZYDIS_REGCLASS_YMM, 10, 256, 256 },
|
||||
/* YMM11 */ { ZYDIS_REGCLASS_YMM, 11, 256, 256 },
|
||||
/* YMM12 */ { ZYDIS_REGCLASS_YMM, 12, 256, 256 },
|
||||
/* YMM13 */ { ZYDIS_REGCLASS_YMM, 13, 256, 256 },
|
||||
/* YMM14 */ { ZYDIS_REGCLASS_YMM, 14, 256, 256 },
|
||||
/* YMM15 */ { ZYDIS_REGCLASS_YMM, 15, 256, 256 },
|
||||
/* YMM16 */ { ZYDIS_REGCLASS_YMM, 16, 256, 256 },
|
||||
/* YMM17 */ { ZYDIS_REGCLASS_YMM, 17, 256, 256 },
|
||||
/* YMM18 */ { ZYDIS_REGCLASS_YMM, 18, 256, 256 },
|
||||
/* YMM19 */ { ZYDIS_REGCLASS_YMM, 19, 256, 256 },
|
||||
/* YMM20 */ { ZYDIS_REGCLASS_YMM, 20, 256, 256 },
|
||||
/* YMM21 */ { ZYDIS_REGCLASS_YMM, 21, 256, 256 },
|
||||
/* YMM22 */ { ZYDIS_REGCLASS_YMM, 22, 256, 256 },
|
||||
/* YMM23 */ { ZYDIS_REGCLASS_YMM, 23, 256, 256 },
|
||||
/* YMM24 */ { ZYDIS_REGCLASS_YMM, 24, 256, 256 },
|
||||
/* YMM25 */ { ZYDIS_REGCLASS_YMM, 25, 256, 256 },
|
||||
/* YMM26 */ { ZYDIS_REGCLASS_YMM, 26, 256, 256 },
|
||||
/* YMM27 */ { ZYDIS_REGCLASS_YMM, 27, 256, 256 },
|
||||
/* YMM28 */ { ZYDIS_REGCLASS_YMM, 28, 256, 256 },
|
||||
/* YMM29 */ { ZYDIS_REGCLASS_YMM, 29, 256, 256 },
|
||||
/* YMM30 */ { ZYDIS_REGCLASS_YMM, 30, 256, 256 },
|
||||
/* YMM31 */ { ZYDIS_REGCLASS_YMM, 31, 256, 256 },
|
||||
/* ZMM0 */ { ZYDIS_REGCLASS_ZMM, 0, 512, 512 },
|
||||
/* ZMM1 */ { ZYDIS_REGCLASS_ZMM, 1, 512, 512 },
|
||||
/* ZMM2 */ { ZYDIS_REGCLASS_ZMM, 2, 512, 512 },
|
||||
/* ZMM3 */ { ZYDIS_REGCLASS_ZMM, 3, 512, 512 },
|
||||
/* ZMM4 */ { ZYDIS_REGCLASS_ZMM, 4, 512, 512 },
|
||||
/* ZMM5 */ { ZYDIS_REGCLASS_ZMM, 5, 512, 512 },
|
||||
/* ZMM6 */ { ZYDIS_REGCLASS_ZMM, 6, 512, 512 },
|
||||
/* ZMM7 */ { ZYDIS_REGCLASS_ZMM, 7, 512, 512 },
|
||||
/* ZMM8 */ { ZYDIS_REGCLASS_ZMM, 8, 512, 512 },
|
||||
/* ZMM9 */ { ZYDIS_REGCLASS_ZMM, 9, 512, 512 },
|
||||
/* ZMM10 */ { ZYDIS_REGCLASS_ZMM, 10, 512, 512 },
|
||||
/* ZMM11 */ { ZYDIS_REGCLASS_ZMM, 11, 512, 512 },
|
||||
/* ZMM12 */ { ZYDIS_REGCLASS_ZMM, 12, 512, 512 },
|
||||
/* ZMM13 */ { ZYDIS_REGCLASS_ZMM, 13, 512, 512 },
|
||||
/* ZMM14 */ { ZYDIS_REGCLASS_ZMM, 14, 512, 512 },
|
||||
/* ZMM15 */ { ZYDIS_REGCLASS_ZMM, 15, 512, 512 },
|
||||
/* ZMM16 */ { ZYDIS_REGCLASS_ZMM, 16, 512, 512 },
|
||||
/* ZMM17 */ { ZYDIS_REGCLASS_ZMM, 17, 512, 512 },
|
||||
/* ZMM18 */ { ZYDIS_REGCLASS_ZMM, 18, 512, 512 },
|
||||
/* ZMM19 */ { ZYDIS_REGCLASS_ZMM, 19, 512, 512 },
|
||||
/* ZMM20 */ { ZYDIS_REGCLASS_ZMM, 20, 512, 512 },
|
||||
/* ZMM21 */ { ZYDIS_REGCLASS_ZMM, 21, 512, 512 },
|
||||
/* ZMM22 */ { ZYDIS_REGCLASS_ZMM, 22, 512, 512 },
|
||||
/* ZMM23 */ { ZYDIS_REGCLASS_ZMM, 23, 512, 512 },
|
||||
/* ZMM24 */ { ZYDIS_REGCLASS_ZMM, 24, 512, 512 },
|
||||
/* ZMM25 */ { ZYDIS_REGCLASS_ZMM, 25, 512, 512 },
|
||||
/* ZMM26 */ { ZYDIS_REGCLASS_ZMM, 26, 512, 512 },
|
||||
/* ZMM27 */ { ZYDIS_REGCLASS_ZMM, 27, 512, 512 },
|
||||
/* ZMM28 */ { ZYDIS_REGCLASS_ZMM, 28, 512, 512 },
|
||||
/* ZMM29 */ { ZYDIS_REGCLASS_ZMM, 29, 512, 512 },
|
||||
/* ZMM30 */ { ZYDIS_REGCLASS_ZMM, 30, 512, 512 },
|
||||
/* ZMM31 */ { ZYDIS_REGCLASS_ZMM, 31, 512, 512 },
|
||||
/* TMM0 */ { ZYDIS_REGCLASS_TMM, 0, 8192, 8192 },
|
||||
/* TMM1 */ { ZYDIS_REGCLASS_TMM, 1, 8192, 8192 },
|
||||
/* TMM2 */ { ZYDIS_REGCLASS_TMM, 2, 8192, 8192 },
|
||||
/* TMM3 */ { ZYDIS_REGCLASS_TMM, 3, 8192, 8192 },
|
||||
/* TMM4 */ { ZYDIS_REGCLASS_TMM, 4, 8192, 8192 },
|
||||
/* TMM5 */ { ZYDIS_REGCLASS_TMM, 5, 8192, 8192 },
|
||||
/* TMM6 */ { ZYDIS_REGCLASS_TMM, 6, 8192, 8192 },
|
||||
/* TMM7 */ { ZYDIS_REGCLASS_TMM, 7, 8192, 8192 },
|
||||
/* FLAGS */ { ZYDIS_REGCLASS_FLAGS, -1, 16, 16 },
|
||||
/* EFLAGS */ { ZYDIS_REGCLASS_FLAGS, -1, 32, 32 },
|
||||
/* RFLAGS */ { ZYDIS_REGCLASS_FLAGS, -1, 0, 64 },
|
||||
/* IP */ { ZYDIS_REGCLASS_IP, -1, 16, 16 },
|
||||
/* EIP */ { ZYDIS_REGCLASS_IP, -1, 32, 32 },
|
||||
/* RIP */ { ZYDIS_REGCLASS_IP, -1, 0, 64 },
|
||||
/* ES */ { ZYDIS_REGCLASS_SEGMENT, 0, 16, 16 },
|
||||
/* CS */ { ZYDIS_REGCLASS_SEGMENT, 1, 16, 16 },
|
||||
/* SS */ { ZYDIS_REGCLASS_SEGMENT, 2, 16, 16 },
|
||||
/* DS */ { ZYDIS_REGCLASS_SEGMENT, 3, 16, 16 },
|
||||
/* FS */ { ZYDIS_REGCLASS_SEGMENT, 4, 16, 16 },
|
||||
/* GS */ { ZYDIS_REGCLASS_SEGMENT, 5, 16, 16 },
|
||||
/* GDTR */ { ZYDIS_REGCLASS_TABLE, -1, 0, 0 },
|
||||
/* LDTR */ { ZYDIS_REGCLASS_TABLE, -1, 0, 0 },
|
||||
/* IDTR */ { ZYDIS_REGCLASS_TABLE, -1, 0, 0 },
|
||||
/* TR */ { ZYDIS_REGCLASS_TABLE, -1, 0, 0 },
|
||||
/* TR0 */ { ZYDIS_REGCLASS_TEST, 0, 32, 32 },
|
||||
/* TR1 */ { ZYDIS_REGCLASS_TEST, 1, 32, 32 },
|
||||
/* TR2 */ { ZYDIS_REGCLASS_TEST, 2, 32, 32 },
|
||||
/* TR3 */ { ZYDIS_REGCLASS_TEST, 3, 32, 32 },
|
||||
/* TR4 */ { ZYDIS_REGCLASS_TEST, 4, 32, 32 },
|
||||
/* TR5 */ { ZYDIS_REGCLASS_TEST, 5, 32, 32 },
|
||||
/* TR6 */ { ZYDIS_REGCLASS_TEST, 6, 32, 32 },
|
||||
/* TR7 */ { ZYDIS_REGCLASS_TEST, 7, 32, 32 },
|
||||
/* CR0 */ { ZYDIS_REGCLASS_CONTROL, 0, 32, 64 },
|
||||
/* CR1 */ { ZYDIS_REGCLASS_CONTROL, 1, 32, 64 },
|
||||
/* CR2 */ { ZYDIS_REGCLASS_CONTROL, 2, 32, 64 },
|
||||
/* CR3 */ { ZYDIS_REGCLASS_CONTROL, 3, 32, 64 },
|
||||
/* CR4 */ { ZYDIS_REGCLASS_CONTROL, 4, 32, 64 },
|
||||
/* CR5 */ { ZYDIS_REGCLASS_CONTROL, 5, 32, 64 },
|
||||
/* CR6 */ { ZYDIS_REGCLASS_CONTROL, 6, 32, 64 },
|
||||
/* CR7 */ { ZYDIS_REGCLASS_CONTROL, 7, 32, 64 },
|
||||
/* CR8 */ { ZYDIS_REGCLASS_CONTROL, 8, 32, 64 },
|
||||
/* CR9 */ { ZYDIS_REGCLASS_CONTROL, 9, 32, 64 },
|
||||
/* CR10 */ { ZYDIS_REGCLASS_CONTROL, 10, 32, 64 },
|
||||
/* CR11 */ { ZYDIS_REGCLASS_CONTROL, 11, 32, 64 },
|
||||
/* CR12 */ { ZYDIS_REGCLASS_CONTROL, 12, 32, 64 },
|
||||
/* CR13 */ { ZYDIS_REGCLASS_CONTROL, 13, 32, 64 },
|
||||
/* CR14 */ { ZYDIS_REGCLASS_CONTROL, 14, 32, 64 },
|
||||
/* CR15 */ { ZYDIS_REGCLASS_CONTROL, 15, 32, 64 },
|
||||
/* DR0 */ { ZYDIS_REGCLASS_DEBUG, 0, 32, 64 },
|
||||
/* DR1 */ { ZYDIS_REGCLASS_DEBUG, 1, 32, 64 },
|
||||
/* DR2 */ { ZYDIS_REGCLASS_DEBUG, 2, 32, 64 },
|
||||
/* DR3 */ { ZYDIS_REGCLASS_DEBUG, 3, 32, 64 },
|
||||
/* DR4 */ { ZYDIS_REGCLASS_DEBUG, 4, 32, 64 },
|
||||
/* DR5 */ { ZYDIS_REGCLASS_DEBUG, 5, 32, 64 },
|
||||
/* DR6 */ { ZYDIS_REGCLASS_DEBUG, 6, 32, 64 },
|
||||
/* DR7 */ { ZYDIS_REGCLASS_DEBUG, 7, 32, 64 },
|
||||
/* DR8 */ { ZYDIS_REGCLASS_DEBUG, 8, 32, 64 },
|
||||
/* DR9 */ { ZYDIS_REGCLASS_DEBUG, 9, 32, 64 },
|
||||
/* DR10 */ { ZYDIS_REGCLASS_DEBUG, 10, 32, 64 },
|
||||
/* DR11 */ { ZYDIS_REGCLASS_DEBUG, 11, 32, 64 },
|
||||
/* DR12 */ { ZYDIS_REGCLASS_DEBUG, 12, 32, 64 },
|
||||
/* DR13 */ { ZYDIS_REGCLASS_DEBUG, 13, 32, 64 },
|
||||
/* DR14 */ { ZYDIS_REGCLASS_DEBUG, 14, 32, 64 },
|
||||
/* DR15 */ { ZYDIS_REGCLASS_DEBUG, 15, 32, 64 },
|
||||
/* K0 */ { ZYDIS_REGCLASS_MASK, 0, 64, 64 },
|
||||
/* K1 */ { ZYDIS_REGCLASS_MASK, 1, 64, 64 },
|
||||
/* K2 */ { ZYDIS_REGCLASS_MASK, 2, 64, 64 },
|
||||
/* K3 */ { ZYDIS_REGCLASS_MASK, 3, 64, 64 },
|
||||
/* K4 */ { ZYDIS_REGCLASS_MASK, 4, 64, 64 },
|
||||
/* K5 */ { ZYDIS_REGCLASS_MASK, 5, 64, 64 },
|
||||
/* K6 */ { ZYDIS_REGCLASS_MASK, 6, 64, 64 },
|
||||
/* K7 */ { ZYDIS_REGCLASS_MASK, 7, 64, 64 },
|
||||
/* BND0 */ { ZYDIS_REGCLASS_BOUND, 0, 128, 128 },
|
||||
/* BND1 */ { ZYDIS_REGCLASS_BOUND, 1, 128, 128 },
|
||||
/* BND2 */ { ZYDIS_REGCLASS_BOUND, 2, 128, 128 },
|
||||
/* BND3 */ { ZYDIS_REGCLASS_BOUND, 3, 128, 128 },
|
||||
/* BNDCFG */ { ZYDIS_REGCLASS_INVALID, -1, 64, 64 },
|
||||
/* BNDSTATUS */ { ZYDIS_REGCLASS_INVALID, -1, 64, 64 },
|
||||
/* MXCSR */ { ZYDIS_REGCLASS_INVALID, -1, 32, 32 },
|
||||
/* PKRU */ { ZYDIS_REGCLASS_INVALID, -1, 32, 32 },
|
||||
/* XCR0 */ { ZYDIS_REGCLASS_INVALID, -1, 64, 64 },
|
||||
/* UIF */ { ZYDIS_REGCLASS_INVALID, -1, 1, 1 }
|
||||
};
|
52
libs/zydis/src/Mnemonic.c
Normal file
52
libs/zydis/src/Mnemonic.c
Normal file
|
@ -0,0 +1,52 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Mnemonic.h>
|
||||
#include <Generated/EnumMnemonic.inc>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Exported functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
const char* ZydisMnemonicGetString(ZydisMnemonic mnemonic)
|
||||
{
|
||||
if ((ZyanUSize)mnemonic >= ZYAN_ARRAY_LENGTH(STR_MNEMONIC))
|
||||
{
|
||||
return ZYAN_NULL;
|
||||
}
|
||||
return (const char*)STR_MNEMONIC[mnemonic].data;
|
||||
}
|
||||
|
||||
const ZydisShortString* ZydisMnemonicGetStringWrapped(ZydisMnemonic mnemonic)
|
||||
{
|
||||
if ((ZyanUSize)mnemonic >= ZYAN_ARRAY_LENGTH(STR_MNEMONIC))
|
||||
{
|
||||
return ZYAN_NULL;
|
||||
}
|
||||
return &STR_MNEMONIC[mnemonic];
|
||||
}
|
||||
|
||||
/* ============================================================================================== */
|
265
libs/zydis/src/Register.c
Normal file
265
libs/zydis/src/Register.c
Normal file
|
@ -0,0 +1,265 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Register.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Register strings */
|
||||
/* ============================================================================================== */
|
||||
|
||||
#include <Generated/EnumRegister.inc>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Register-class mapping */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/**
|
||||
* Defines the `ZydisRegisterMapItem` struct.
|
||||
*/
|
||||
typedef struct ZydisRegisterLookupItem
|
||||
{
|
||||
/**
|
||||
* The register class.
|
||||
*/
|
||||
ZydisRegisterClass class;
|
||||
/**
|
||||
* The register id.
|
||||
*/
|
||||
ZyanI8 id;
|
||||
/**
|
||||
* The width of register 16- and 32-bit mode.
|
||||
*/
|
||||
ZydisRegisterWidth width;
|
||||
/**
|
||||
* The width of register in 64-bit mode.
|
||||
*/
|
||||
ZydisRegisterWidth width64;
|
||||
} ZydisRegisterLookupItem;
|
||||
|
||||
#include <Generated/RegisterLookup.inc>
|
||||
|
||||
/**
|
||||
* Defines the `ZydisRegisterClassLookupItem` struct.
|
||||
*/
|
||||
typedef struct ZydisRegisterClassLookupItem_
|
||||
{
|
||||
/**
|
||||
* The lowest register of the current class.
|
||||
*/
|
||||
ZydisRegister lo;
|
||||
/**
|
||||
* The highest register of the current class.
|
||||
*/
|
||||
ZydisRegister hi;
|
||||
/**
|
||||
* The width of registers of the current class in 16- and 32-bit mode.
|
||||
*/
|
||||
ZydisRegisterWidth width;
|
||||
/**
|
||||
* The width of registers of the current class in 64-bit mode.
|
||||
*/
|
||||
ZydisRegisterWidth width64;
|
||||
} ZydisRegisterClassLookupItem;
|
||||
|
||||
#include <Generated/RegisterClassLookup.inc>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Exported functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Register */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZydisRegister ZydisRegisterEncode(ZydisRegisterClass register_class, ZyanU8 id)
|
||||
{
|
||||
if ((register_class == ZYDIS_REGCLASS_INVALID) ||
|
||||
(register_class == ZYDIS_REGCLASS_FLAGS) ||
|
||||
(register_class == ZYDIS_REGCLASS_IP))
|
||||
{
|
||||
return ZYDIS_REGISTER_NONE;
|
||||
}
|
||||
|
||||
if ((ZyanUSize)register_class >= ZYAN_ARRAY_LENGTH(REG_CLASS_LOOKUP))
|
||||
{
|
||||
return ZYDIS_REGISTER_NONE;
|
||||
}
|
||||
|
||||
const ZydisRegisterClassLookupItem* item = ®_CLASS_LOOKUP[register_class];
|
||||
if (id <= (item->hi - item->lo))
|
||||
{
|
||||
return item->lo + id;
|
||||
}
|
||||
|
||||
return ZYDIS_REGISTER_NONE;
|
||||
}
|
||||
|
||||
ZyanI8 ZydisRegisterGetId(ZydisRegister reg)
|
||||
{
|
||||
if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(REG_LOOKUP))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return REG_LOOKUP[reg].id;
|
||||
}
|
||||
|
||||
ZydisRegisterClass ZydisRegisterGetClass(ZydisRegister reg)
|
||||
{
|
||||
if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(REG_LOOKUP))
|
||||
{
|
||||
return ZYDIS_REGCLASS_INVALID;
|
||||
}
|
||||
|
||||
return REG_LOOKUP[reg].class;
|
||||
}
|
||||
|
||||
ZydisRegisterWidth ZydisRegisterGetWidth(ZydisMachineMode mode, ZydisRegister reg)
|
||||
{
|
||||
if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(REG_LOOKUP))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (mode == ZYDIS_MACHINE_MODE_LONG_64)
|
||||
? REG_LOOKUP[reg].width64
|
||||
: REG_LOOKUP[reg].width;
|
||||
}
|
||||
|
||||
ZydisRegister ZydisRegisterGetLargestEnclosing(ZydisMachineMode mode, ZydisRegister reg)
|
||||
{
|
||||
if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(REG_LOOKUP))
|
||||
{
|
||||
return ZYDIS_REGISTER_NONE;
|
||||
}
|
||||
|
||||
static const ZyanU8 GPR8_MAPPING[20] =
|
||||
{
|
||||
/* AL */ 0,
|
||||
/* CL */ 1,
|
||||
/* DL */ 2,
|
||||
/* BL */ 3,
|
||||
/* AH */ 0,
|
||||
/* CH */ 1,
|
||||
/* DH */ 2,
|
||||
/* BH */ 3,
|
||||
/* SPL */ 4,
|
||||
/* BPL */ 5,
|
||||
/* SIL */ 6,
|
||||
/* DIL */ 7,
|
||||
/* R8B */ 8,
|
||||
/* R9B */ 9,
|
||||
/* R10B */ 10,
|
||||
/* R11B */ 11,
|
||||
/* R12B */ 12,
|
||||
/* R13B */ 13,
|
||||
/* R14B */ 14,
|
||||
/* R15B */ 15,
|
||||
};
|
||||
|
||||
const ZydisRegisterClass reg_class = REG_LOOKUP[reg].class;
|
||||
if ((reg_class == ZYDIS_REGCLASS_INVALID) ||
|
||||
((reg_class == ZYDIS_REGCLASS_GPR64) && (mode != ZYDIS_MACHINE_MODE_LONG_64)))
|
||||
{
|
||||
return ZYDIS_REGISTER_NONE;
|
||||
}
|
||||
|
||||
ZyanU8 reg_id = REG_LOOKUP[reg].id;
|
||||
switch (reg_class)
|
||||
{
|
||||
case ZYDIS_REGCLASS_GPR8:
|
||||
reg_id = GPR8_MAPPING[reg_id];
|
||||
ZYAN_FALLTHROUGH;
|
||||
case ZYDIS_REGCLASS_GPR16:
|
||||
case ZYDIS_REGCLASS_GPR32:
|
||||
case ZYDIS_REGCLASS_GPR64:
|
||||
switch (mode)
|
||||
{
|
||||
case ZYDIS_MACHINE_MODE_LONG_64:
|
||||
return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_GPR64].lo + reg_id;
|
||||
case ZYDIS_MACHINE_MODE_LONG_COMPAT_32:
|
||||
case ZYDIS_MACHINE_MODE_LEGACY_32:
|
||||
return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_GPR32].lo + reg_id;
|
||||
case ZYDIS_MACHINE_MODE_LONG_COMPAT_16:
|
||||
case ZYDIS_MACHINE_MODE_LEGACY_16:
|
||||
case ZYDIS_MACHINE_MODE_REAL_16:
|
||||
return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_GPR16].lo + reg_id;
|
||||
default:
|
||||
return ZYDIS_REGISTER_NONE;
|
||||
}
|
||||
case ZYDIS_REGCLASS_XMM:
|
||||
case ZYDIS_REGCLASS_YMM:
|
||||
case ZYDIS_REGCLASS_ZMM:
|
||||
#if defined(ZYDIS_DISABLE_AVX512) && defined(ZYDIS_DISABLE_KNC)
|
||||
return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_YMM].lo + reg_id;
|
||||
#else
|
||||
return REG_CLASS_LOOKUP[ZYDIS_REGCLASS_ZMM].lo + reg_id;
|
||||
#endif
|
||||
default:
|
||||
return ZYDIS_REGISTER_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
const char* ZydisRegisterGetString(ZydisRegister reg)
|
||||
{
|
||||
if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(STR_REGISTERS))
|
||||
{
|
||||
return ZYAN_NULL;
|
||||
}
|
||||
|
||||
return STR_REGISTERS[reg].data;
|
||||
}
|
||||
|
||||
const ZydisShortString* ZydisRegisterGetStringWrapped(ZydisRegister reg)
|
||||
{
|
||||
if ((ZyanUSize)reg >= ZYAN_ARRAY_LENGTH(STR_REGISTERS))
|
||||
{
|
||||
return ZYAN_NULL;
|
||||
}
|
||||
|
||||
return &STR_REGISTERS[reg];
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Register class */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZydisRegisterWidth ZydisRegisterClassGetWidth(ZydisMachineMode mode,
|
||||
ZydisRegisterClass register_class)
|
||||
{
|
||||
if ((ZyanUSize)register_class >= ZYAN_ARRAY_LENGTH(REG_CLASS_LOOKUP))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (mode == ZYDIS_MACHINE_MODE_LONG_64)
|
||||
? REG_CLASS_LOOKUP[register_class].width64
|
||||
: REG_CLASS_LOOKUP[register_class].width;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
186
libs/zydis/src/SharedData.c
Normal file
186
libs/zydis/src/SharedData.c
Normal file
|
@ -0,0 +1,186 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Internal/SharedData.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Data tables */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Instruction definitions */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef ZYDIS_MINIMAL_MODE
|
||||
# define ZYDIS_NOTMIN(x)
|
||||
#else
|
||||
# define ZYDIS_NOTMIN(x) , x
|
||||
#endif
|
||||
|
||||
#include <Generated/InstructionDefinitions.inc>
|
||||
|
||||
#undef ZYDIS_NOTMIN
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Operand definitions */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#define ZYDIS_OPERAND_DEFINITION(type, encoding, access) \
|
||||
{ type, encoding, access }
|
||||
|
||||
#include <Generated/OperandDefinitions.inc>
|
||||
|
||||
#undef ZYDIS_OPERAND_DEFINITION
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Accessed CPU flags */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#include <Generated/AccessedFlags.inc>
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Instruction definition */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
void ZydisGetInstructionDefinition(ZydisInstructionEncoding encoding, ZyanU16 id,
|
||||
const ZydisInstructionDefinition** definition)
|
||||
{
|
||||
switch (encoding)
|
||||
{
|
||||
case ZYDIS_INSTRUCTION_ENCODING_LEGACY:
|
||||
*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_LEGACY[id];
|
||||
break;
|
||||
case ZYDIS_INSTRUCTION_ENCODING_3DNOW:
|
||||
*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_3DNOW[id];
|
||||
break;
|
||||
case ZYDIS_INSTRUCTION_ENCODING_XOP:
|
||||
*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_XOP[id];
|
||||
break;
|
||||
case ZYDIS_INSTRUCTION_ENCODING_VEX:
|
||||
*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_VEX[id];
|
||||
break;
|
||||
#ifndef ZYDIS_DISABLE_AVX512
|
||||
case ZYDIS_INSTRUCTION_ENCODING_EVEX:
|
||||
*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_EVEX[id];
|
||||
break;
|
||||
#endif
|
||||
#ifndef ZYDIS_DISABLE_KNC
|
||||
case ZYDIS_INSTRUCTION_ENCODING_MVEX:
|
||||
*definition = (ZydisInstructionDefinition*)&ISTR_DEFINITIONS_MVEX[id];
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ZYAN_UNREACHABLE;
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Operand definition */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
const ZydisOperandDefinition* ZydisGetOperandDefinitions(
|
||||
const ZydisInstructionDefinition* definition)
|
||||
{
|
||||
if (definition->operand_count == 0)
|
||||
{
|
||||
return ZYAN_NULL;
|
||||
}
|
||||
ZYAN_ASSERT(definition->operand_reference != 0xFFFF);
|
||||
return &OPERAND_DEFINITIONS[definition->operand_reference];
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Element info */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
void ZydisGetElementInfo(ZydisInternalElementType element, ZydisElementType* type,
|
||||
ZydisElementSize* size)
|
||||
{
|
||||
static const struct
|
||||
{
|
||||
ZydisElementType type;
|
||||
ZydisElementSize size;
|
||||
} lookup[ZYDIS_IELEMENT_TYPE_MAX_VALUE + 1] =
|
||||
{
|
||||
{ ZYDIS_ELEMENT_TYPE_INVALID , 0 },
|
||||
{ ZYDIS_ELEMENT_TYPE_INVALID , 0 },
|
||||
{ ZYDIS_ELEMENT_TYPE_STRUCT , 0 },
|
||||
{ ZYDIS_ELEMENT_TYPE_INT , 0 },
|
||||
{ ZYDIS_ELEMENT_TYPE_UINT , 0 },
|
||||
{ ZYDIS_ELEMENT_TYPE_INT , 1 },
|
||||
{ ZYDIS_ELEMENT_TYPE_INT , 8 },
|
||||
{ ZYDIS_ELEMENT_TYPE_INT , 16 },
|
||||
{ ZYDIS_ELEMENT_TYPE_INT , 32 },
|
||||
{ ZYDIS_ELEMENT_TYPE_INT , 64 },
|
||||
{ ZYDIS_ELEMENT_TYPE_UINT , 8 },
|
||||
{ ZYDIS_ELEMENT_TYPE_UINT , 16 },
|
||||
{ ZYDIS_ELEMENT_TYPE_UINT , 32 },
|
||||
{ ZYDIS_ELEMENT_TYPE_UINT , 64 },
|
||||
{ ZYDIS_ELEMENT_TYPE_UINT , 128 },
|
||||
{ ZYDIS_ELEMENT_TYPE_UINT , 256 },
|
||||
{ ZYDIS_ELEMENT_TYPE_FLOAT16 , 16 },
|
||||
{ ZYDIS_ELEMENT_TYPE_FLOAT16 , 32 }, // TODO: Should indicate 2 float16 elements
|
||||
{ ZYDIS_ELEMENT_TYPE_FLOAT32 , 32 },
|
||||
{ ZYDIS_ELEMENT_TYPE_FLOAT64 , 64 },
|
||||
{ ZYDIS_ELEMENT_TYPE_FLOAT80 , 80 },
|
||||
{ ZYDIS_ELEMENT_TYPE_LONGBCD , 80 },
|
||||
{ ZYDIS_ELEMENT_TYPE_CC , 3 },
|
||||
{ ZYDIS_ELEMENT_TYPE_CC , 5 }
|
||||
};
|
||||
|
||||
ZYAN_ASSERT((ZyanUSize)element < ZYAN_ARRAY_LENGTH(lookup));
|
||||
|
||||
*type = lookup[element].type;
|
||||
*size = lookup[element].size;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Accessed CPU flags */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef ZYDIS_MINIMAL_MODE
|
||||
ZyanBool ZydisGetAccessedFlags(const ZydisInstructionDefinition* definition,
|
||||
const ZydisDefinitionAccessedFlags** flags)
|
||||
{
|
||||
ZYAN_ASSERT(definition->flags_reference < ZYAN_ARRAY_LENGTH(ACCESSED_FLAGS));
|
||||
*flags = &ACCESSED_FLAGS[definition->flags_reference];
|
||||
return (definition->flags_reference != 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
376
libs/zydis/src/String.c
Normal file
376
libs/zydis/src/String.c
Normal file
|
@ -0,0 +1,376 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
Zyan Disassembler Library (Zydis)
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Internal/String.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Constants */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Defines */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#define ZYDIS_MAXCHARS_DEC_32 10
|
||||
#define ZYDIS_MAXCHARS_DEC_64 20
|
||||
#define ZYDIS_MAXCHARS_HEX_32 8
|
||||
#define ZYDIS_MAXCHARS_HEX_64 16
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Lookup Tables */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
static const char* const DECIMAL_LOOKUP =
|
||||
"00010203040506070809"
|
||||
"10111213141516171819"
|
||||
"20212223242526272829"
|
||||
"30313233343536373839"
|
||||
"40414243444546474849"
|
||||
"50515253545556575859"
|
||||
"60616263646566676869"
|
||||
"70717273747576777879"
|
||||
"80818283848586878889"
|
||||
"90919293949596979899";
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Internal Functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Decimal */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#if defined(ZYAN_X86) || defined(ZYAN_ARM) || defined(ZYAN_EMSCRIPTEN) || defined(ZYAN_WASM) || defined(ZYAN_PPC)
|
||||
ZyanStatus ZydisStringAppendDecU32(ZyanString* string, ZyanU32 value, ZyanU8 padding_length)
|
||||
{
|
||||
ZYAN_ASSERT(string);
|
||||
ZYAN_ASSERT(!string->vector.allocator);
|
||||
|
||||
char buffer[ZYDIS_MAXCHARS_DEC_32];
|
||||
char *buffer_end = &buffer[ZYDIS_MAXCHARS_DEC_32];
|
||||
char *buffer_write_pointer = buffer_end;
|
||||
while (value >= 100)
|
||||
{
|
||||
const ZyanU32 value_old = value;
|
||||
buffer_write_pointer -= 2;
|
||||
value /= 100;
|
||||
ZYAN_MEMCPY(buffer_write_pointer, &DECIMAL_LOOKUP[(value_old - (value * 100)) * 2], 2);
|
||||
}
|
||||
buffer_write_pointer -= 2;
|
||||
ZYAN_MEMCPY(buffer_write_pointer, &DECIMAL_LOOKUP[value * 2], 2);
|
||||
|
||||
const ZyanUSize offset_odd = (ZyanUSize)(value < 10);
|
||||
const ZyanUSize length_number = buffer_end - buffer_write_pointer - offset_odd;
|
||||
const ZyanUSize length_total = ZYAN_MAX(length_number, padding_length);
|
||||
const ZyanUSize length_target = string->vector.size;
|
||||
|
||||
if (string->vector.size + length_total > string->vector.capacity)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZyanUSize offset_write = 0;
|
||||
if (padding_length > length_number)
|
||||
{
|
||||
offset_write = padding_length - length_number;
|
||||
ZYAN_MEMSET((char*)string->vector.data + length_target - 1, '0', offset_write);
|
||||
}
|
||||
|
||||
ZYAN_MEMCPY((char*)string->vector.data + length_target + offset_write - 1,
|
||||
buffer_write_pointer + offset_odd, length_number);
|
||||
string->vector.size = length_target + length_total;
|
||||
ZYDIS_STRING_NULLTERMINATE(string);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
ZyanStatus ZydisStringAppendDecU64(ZyanString* string, ZyanU64 value, ZyanU8 padding_length)
|
||||
{
|
||||
ZYAN_ASSERT(string);
|
||||
ZYAN_ASSERT(!string->vector.allocator);
|
||||
|
||||
char buffer[ZYDIS_MAXCHARS_DEC_64];
|
||||
char *buffer_end = &buffer[ZYDIS_MAXCHARS_DEC_64];
|
||||
char *buffer_write_pointer = buffer_end;
|
||||
while (value >= 100)
|
||||
{
|
||||
const ZyanU64 value_old = value;
|
||||
buffer_write_pointer -= 2;
|
||||
value /= 100;
|
||||
ZYAN_MEMCPY(buffer_write_pointer, &DECIMAL_LOOKUP[(value_old - (value * 100)) * 2], 2);
|
||||
}
|
||||
buffer_write_pointer -= 2;
|
||||
ZYAN_MEMCPY(buffer_write_pointer, &DECIMAL_LOOKUP[value * 2], 2);
|
||||
|
||||
const ZyanUSize offset_odd = (ZyanUSize)(value < 10);
|
||||
const ZyanUSize length_number = buffer_end - buffer_write_pointer - offset_odd;
|
||||
const ZyanUSize length_total = ZYAN_MAX(length_number, padding_length);
|
||||
const ZyanUSize length_target = string->vector.size;
|
||||
|
||||
if (string->vector.size + length_total > string->vector.capacity)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZyanUSize offset_write = 0;
|
||||
if (padding_length > length_number)
|
||||
{
|
||||
offset_write = padding_length - length_number;
|
||||
ZYAN_MEMSET((char*)string->vector.data + length_target - 1, '0', offset_write);
|
||||
}
|
||||
|
||||
ZYAN_MEMCPY((char*)string->vector.data + length_target + offset_write - 1,
|
||||
buffer_write_pointer + offset_odd, length_number);
|
||||
string->vector.size = length_target + length_total;
|
||||
ZYDIS_STRING_NULLTERMINATE(string);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Hexadecimal */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
#if defined(ZYAN_X86) || defined(ZYAN_ARM) || defined(ZYAN_EMSCRIPTEN) || defined(ZYAN_WASM) || defined(ZYAN_PPC)
|
||||
ZyanStatus ZydisStringAppendHexU32(ZyanString* string, ZyanU32 value, ZyanU8 padding_length,
|
||||
ZyanBool force_leading_number, ZyanBool uppercase)
|
||||
{
|
||||
ZYAN_ASSERT(string);
|
||||
ZYAN_ASSERT(!string->vector.allocator);
|
||||
|
||||
const ZyanUSize len = string->vector.size;
|
||||
const ZyanUSize remaining = string->vector.capacity - string->vector.size;
|
||||
|
||||
if (remaining < (ZyanUSize)padding_length)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
if (!value)
|
||||
{
|
||||
const ZyanU8 n = (padding_length ? padding_length : 1);
|
||||
|
||||
if (remaining < (ZyanUSize)n)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZYAN_MEMSET((char*)string->vector.data + len - 1, '0', n);
|
||||
string->vector.size = len + n;
|
||||
ZYDIS_STRING_NULLTERMINATE(string);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanU8 n = 0;
|
||||
char* buffer = ZYAN_NULL;
|
||||
for (ZyanI8 i = ZYDIS_MAXCHARS_HEX_32 - 1; i >= 0; --i)
|
||||
{
|
||||
const ZyanU8 v = (value >> i * 4) & 0x0F;
|
||||
if (!n)
|
||||
{
|
||||
if (!v)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
const ZyanU8 zero = force_leading_number && (v > 9) && (padding_length <= i) ? 1 : 0;
|
||||
if (remaining <= (ZyanUSize)i + zero)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
buffer = (char*)string->vector.data + len - 1;
|
||||
if (zero)
|
||||
{
|
||||
buffer[n++] = '0';
|
||||
}
|
||||
if (padding_length > i)
|
||||
{
|
||||
n = padding_length - i - 1;
|
||||
ZYAN_MEMSET(buffer, '0', n);
|
||||
}
|
||||
}
|
||||
ZYAN_ASSERT(buffer);
|
||||
if (uppercase)
|
||||
{
|
||||
buffer[n++] = "0123456789ABCDEF"[v];
|
||||
} else
|
||||
{
|
||||
buffer[n++] = "0123456789abcdef"[v];
|
||||
}
|
||||
}
|
||||
string->vector.size = len + n;
|
||||
ZYDIS_STRING_NULLTERMINATE(string);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
ZyanStatus ZydisStringAppendHexU64(ZyanString* string, ZyanU64 value, ZyanU8 padding_length,
|
||||
ZyanBool force_leading_number, ZyanBool uppercase)
|
||||
{
|
||||
ZYAN_ASSERT(string);
|
||||
ZYAN_ASSERT(!string->vector.allocator);
|
||||
|
||||
const ZyanUSize len = string->vector.size;
|
||||
const ZyanUSize remaining = string->vector.capacity - string->vector.size;
|
||||
|
||||
if (remaining < (ZyanUSize)padding_length)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
if (!value)
|
||||
{
|
||||
const ZyanU8 n = (padding_length ? padding_length : 1);
|
||||
|
||||
if (remaining < (ZyanUSize)n)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
ZYAN_MEMSET((char*)string->vector.data + len - 1, '0', n);
|
||||
string->vector.size = len + n;
|
||||
ZYDIS_STRING_NULLTERMINATE(string);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanU8 n = 0;
|
||||
char* buffer = ZYAN_NULL;
|
||||
for (ZyanI8 i = ((value & 0xFFFFFFFF00000000) ?
|
||||
ZYDIS_MAXCHARS_HEX_64 : ZYDIS_MAXCHARS_HEX_32) - 1; i >= 0; --i)
|
||||
{
|
||||
const ZyanU8 v = (value >> i * 4) & 0x0F;
|
||||
if (!n)
|
||||
{
|
||||
if (!v)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
const ZyanU8 zero = force_leading_number && (v > 9) && (padding_length <= i) ? 1 : 0;
|
||||
if (remaining <= (ZyanUSize)i + zero)
|
||||
{
|
||||
return ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE;
|
||||
}
|
||||
buffer = (char*)string->vector.data + len - 1;
|
||||
if (zero)
|
||||
{
|
||||
buffer[n++] = '0';
|
||||
}
|
||||
if (padding_length > i)
|
||||
{
|
||||
n = padding_length - i - 1;
|
||||
ZYAN_MEMSET(buffer, '0', n);
|
||||
}
|
||||
}
|
||||
ZYAN_ASSERT(buffer);
|
||||
if (uppercase)
|
||||
{
|
||||
buffer[n++] = "0123456789ABCDEF"[v];
|
||||
} else
|
||||
{
|
||||
buffer[n++] = "0123456789abcdef"[v];
|
||||
}
|
||||
}
|
||||
string->vector.size = len + n;
|
||||
ZYDIS_STRING_NULLTERMINATE(string);
|
||||
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Public Functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Formatting */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
ZyanStatus ZydisStringAppendDecU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length,
|
||||
const ZyanStringView* prefix, const ZyanStringView* suffix)
|
||||
{
|
||||
if (prefix)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppend(string, prefix));
|
||||
}
|
||||
|
||||
#if defined(ZYAN_X64) || defined(ZYAN_AARCH64) || defined(ZYAN_PPC64) || defined(ZYAN_RISCV64)
|
||||
ZYAN_CHECK(ZydisStringAppendDecU64(string, value, padding_length));
|
||||
#else
|
||||
if (value & 0xFFFFFFFF00000000)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppendDecU64(string, value, padding_length));
|
||||
}
|
||||
ZYAN_CHECK(ZydisStringAppendDecU32(string, (ZyanU32)value, padding_length));
|
||||
#endif
|
||||
|
||||
if (suffix)
|
||||
{
|
||||
return ZydisStringAppend(string, suffix);
|
||||
}
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisStringAppendHexU(ZyanString* string, ZyanU64 value, ZyanU8 padding_length,
|
||||
ZyanBool force_leading_number, ZyanBool uppercase, const ZyanStringView* prefix,
|
||||
const ZyanStringView* suffix)
|
||||
{
|
||||
if (prefix)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppend(string, prefix));
|
||||
}
|
||||
|
||||
#if defined(ZYAN_X64) || defined(ZYAN_AARCH64) || defined(ZYAN_PPC64) || defined(ZYAN_RISCV64)
|
||||
ZYAN_CHECK(ZydisStringAppendHexU64(string, value, padding_length, force_leading_number,
|
||||
uppercase));
|
||||
#else
|
||||
if (value & 0xFFFFFFFF00000000)
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppendHexU64(string, value, padding_length, force_leading_number,
|
||||
uppercase));
|
||||
}
|
||||
else
|
||||
{
|
||||
ZYAN_CHECK(ZydisStringAppendHexU32(string, (ZyanU32)value, padding_length,
|
||||
force_leading_number, uppercase));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (suffix)
|
||||
{
|
||||
return ZydisStringAppend(string, suffix);
|
||||
}
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* ============================================================================================== */
|
171
libs/zydis/src/Utils.c
Normal file
171
libs/zydis/src/Utils.c
Normal file
|
@ -0,0 +1,171 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zycore/LibC.h>
|
||||
#include <Zydis/Utils.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Exported functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
/* Address calculation */
|
||||
/* ---------------------------------------------------------------------------------------------- */
|
||||
|
||||
// Signed integer overflow is expected behavior in this function, for wrapping around the
|
||||
// instruction pointer on jumps right at the end of the address space.
|
||||
ZYAN_NO_SANITIZE("signed-integer-overflow")
|
||||
ZyanStatus ZydisCalcAbsoluteAddress(const ZydisDecodedInstruction* instruction,
|
||||
const ZydisDecodedOperand* operand, ZyanU64 runtime_address, ZyanU64* result_address)
|
||||
{
|
||||
if (!instruction || !operand || !result_address)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
switch (operand->type)
|
||||
{
|
||||
case ZYDIS_OPERAND_TYPE_MEMORY:
|
||||
if (!operand->mem.disp.has_displacement)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
if (operand->mem.base == ZYDIS_REGISTER_EIP)
|
||||
{
|
||||
*result_address = ((ZyanU32)runtime_address + instruction->length +
|
||||
(ZyanU32)operand->mem.disp.value);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
if (operand->mem.base == ZYDIS_REGISTER_RIP)
|
||||
{
|
||||
*result_address = (ZyanU64)(runtime_address + instruction->length +
|
||||
operand->mem.disp.value);
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
if ((operand->mem.base == ZYDIS_REGISTER_NONE) &&
|
||||
(operand->mem.index == ZYDIS_REGISTER_NONE))
|
||||
{
|
||||
switch (instruction->address_width)
|
||||
{
|
||||
case 16:
|
||||
*result_address = (ZyanU64)operand->mem.disp.value & 0x000000000000FFFF;
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
case 32:
|
||||
*result_address = (ZyanU64)operand->mem.disp.value & 0x00000000FFFFFFFF;
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
case 64:
|
||||
*result_address = (ZyanU64)operand->mem.disp.value;
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ZYDIS_OPERAND_TYPE_IMMEDIATE:
|
||||
if (operand->imm.is_signed && operand->imm.is_relative)
|
||||
{
|
||||
*result_address = (ZyanU64)((ZyanI64)runtime_address + instruction->length +
|
||||
operand->imm.value.s);
|
||||
switch (instruction->machine_mode)
|
||||
{
|
||||
case ZYDIS_MACHINE_MODE_LONG_COMPAT_16:
|
||||
case ZYDIS_MACHINE_MODE_LEGACY_16:
|
||||
case ZYDIS_MACHINE_MODE_REAL_16:
|
||||
case ZYDIS_MACHINE_MODE_LONG_COMPAT_32:
|
||||
case ZYDIS_MACHINE_MODE_LEGACY_32:
|
||||
// `XBEGIN` is a special case as it doesn't truncate computed address
|
||||
// This behavior is documented by Intel (SDM Vol. 2C):
|
||||
// Use of the 16-bit operand size does not cause this address to be truncated to
|
||||
// 16 bits, unlike a near jump to a relative offset.
|
||||
if ((instruction->operand_width == 16) &&
|
||||
(instruction->mnemonic != ZYDIS_MNEMONIC_XBEGIN))
|
||||
{
|
||||
*result_address &= 0xFFFF;
|
||||
}
|
||||
break;
|
||||
case ZYDIS_MACHINE_MODE_LONG_64:
|
||||
break;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisCalcAbsoluteAddressEx(const ZydisDecodedInstruction* instruction,
|
||||
const ZydisDecodedOperand* operand, ZyanU64 runtime_address,
|
||||
const ZydisRegisterContext* register_context, ZyanU64* result_address)
|
||||
{
|
||||
// TODO: Test this with AGEN/MIB operands
|
||||
// TODO: Add support for Gather/Scatter instructions
|
||||
|
||||
if (!instruction || !operand || !register_context || !result_address)
|
||||
{
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
if ((operand->type != ZYDIS_OPERAND_TYPE_MEMORY) ||
|
||||
((operand->mem.base == ZYDIS_REGISTER_NONE) &&
|
||||
(operand->mem.index == ZYDIS_REGISTER_NONE)) ||
|
||||
(operand->mem.base == ZYDIS_REGISTER_EIP) ||
|
||||
(operand->mem.base == ZYDIS_REGISTER_RIP))
|
||||
{
|
||||
return ZydisCalcAbsoluteAddress(instruction, operand, runtime_address, result_address);
|
||||
}
|
||||
|
||||
ZyanU64 value = operand->mem.disp.value;
|
||||
if (operand->mem.base)
|
||||
{
|
||||
value += register_context->values[operand->mem.base];
|
||||
}
|
||||
if (operand->mem.index)
|
||||
{
|
||||
value += register_context->values[operand->mem.index] * operand->mem.scale;
|
||||
}
|
||||
|
||||
switch (instruction->address_width)
|
||||
{
|
||||
case 16:
|
||||
*result_address = value & 0x000000000000FFFF;
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
case 32:
|
||||
*result_address = value & 0x00000000FFFFFFFF;
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
case 64:
|
||||
*result_address = value;
|
||||
return ZYAN_STATUS_SUCCESS;
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
|
||||
/* ============================================================================================== */
|
86
libs/zydis/src/Zydis.c
Normal file
86
libs/zydis/src/Zydis.c
Normal file
|
@ -0,0 +1,86 @@
|
|||
/***************************************************************************************************
|
||||
|
||||
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.
|
||||
|
||||
***************************************************************************************************/
|
||||
|
||||
#include <Zydis/Zydis.h>
|
||||
|
||||
/* ============================================================================================== */
|
||||
/* Exported functions */
|
||||
/* ============================================================================================== */
|
||||
|
||||
ZyanU64 ZydisGetVersion(void)
|
||||
{
|
||||
return ZYDIS_VERSION;
|
||||
}
|
||||
|
||||
ZyanStatus ZydisIsFeatureEnabled(ZydisFeature feature)
|
||||
{
|
||||
switch (feature)
|
||||
{
|
||||
case ZYDIS_FEATURE_DECODER:
|
||||
#ifndef ZYDIS_DISABLE_DECODER
|
||||
return ZYAN_STATUS_TRUE;
|
||||
#else
|
||||
return ZYAN_STATUS_FALSE;
|
||||
#endif
|
||||
case ZYDIS_FEATURE_ENCODER:
|
||||
#ifndef ZYDIS_DISABLE_ENCODER
|
||||
return ZYAN_STATUS_TRUE;
|
||||
#else
|
||||
return ZYAN_STATUS_FALSE;
|
||||
#endif
|
||||
case ZYDIS_FEATURE_FORMATTER:
|
||||
#ifndef ZYDIS_DISABLE_FORMATTER
|
||||
return ZYAN_STATUS_TRUE;
|
||||
#else
|
||||
return ZYAN_STATUS_FALSE;
|
||||
#endif
|
||||
case ZYDIS_FEATURE_AVX512:
|
||||
#ifndef ZYDIS_DISABLE_AVX512
|
||||
return ZYAN_STATUS_TRUE;
|
||||
#else
|
||||
return ZYAN_STATUS_FALSE;
|
||||
#endif
|
||||
|
||||
case ZYDIS_FEATURE_KNC:
|
||||
#ifndef ZYDIS_DISABLE_KNC
|
||||
return ZYAN_STATUS_TRUE;
|
||||
#else
|
||||
return ZYAN_STATUS_FALSE;
|
||||
#endif
|
||||
|
||||
case ZYDIS_FEATURE_SEGMENT:
|
||||
#ifndef ZYDIS_DISABLE_SEGMENT
|
||||
return ZYAN_STATUS_TRUE;
|
||||
#else
|
||||
return ZYAN_STATUS_FALSE;
|
||||
#endif
|
||||
|
||||
default:
|
||||
return ZYAN_STATUS_INVALID_ARGUMENT;
|
||||
}
|
||||
}
|
||||
|
||||
/* ============================================================================================== */
|
Loading…
Add table
Reference in a new issue