mirror of https://github.com/x64dbg/zydis
added custom data source and made some fixes
- added "class" VXCustomDataSource allowing a user to write a custom data source - increased warning level on MSVC to /W4 and resolved warnings arising from that - added VX_UNUSED macro that allows shutting up unused-arg warnings explicitly when needed
This commit is contained in:
parent
9e2cceb2be
commit
f94792e4f9
|
@ -323,7 +323,7 @@ inline uint8_t VXStreamDataSource::internalInputPeek()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return m_inputStream->peek();
|
return static_cast<uint8_t>(m_inputStream->peek());
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint8_t VXStreamDataSource::internalInputNext()
|
inline uint8_t VXStreamDataSource::internalInputNext()
|
||||||
|
@ -332,7 +332,7 @@ inline uint8_t VXStreamDataSource::internalInputNext()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return m_inputStream->get();
|
return static_cast<uint8_t>(m_inputStream->get());
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool VXStreamDataSource::isEndOfInput() const
|
inline bool VXStreamDataSource::isEndOfInput() const
|
||||||
|
|
|
@ -16,7 +16,7 @@ if (NOT CONFIGURED_ONCE)
|
||||||
set(compiler_specific "-Werror")
|
set(compiler_specific "-Werror")
|
||||||
set(compiler_specific_cxx "-std=c++0x")
|
set(compiler_specific_cxx "-std=c++0x")
|
||||||
elseif (MSVC)
|
elseif (MSVC)
|
||||||
set(compiler_specific "/WX /D_CRT_SECURE_NO_WARNINGS")
|
set(compiler_specific "/WX /W4 /D_CRT_SECURE_NO_WARNINGS")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${compiler_specific} ${compiler_specific_cxx}"
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${compiler_specific} ${compiler_specific_cxx}"
|
||||||
|
|
|
@ -39,6 +39,8 @@ using namespace Verteron;
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
(void)argc; (void)argv;
|
||||||
|
|
||||||
uint8_t data32[] =
|
uint8_t data32[] =
|
||||||
{
|
{
|
||||||
0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x6A, 0xFE, 0x68, 0xD8, 0x18, 0x09, 0x77, 0x68, 0x85, 0xD2,
|
0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x6A, 0xFE, 0x68, 0xD8, 0x18, 0x09, 0x77, 0x68, 0x85, 0xD2,
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
Remarks : Freeware, Copyright must be included
|
Remarks : Freeware, Copyright must be included
|
||||||
|
|
||||||
Original Author : Florian Bernd
|
Original Author : Florian Bernd
|
||||||
Modifications :
|
Modifications : athre0z
|
||||||
|
|
||||||
Last change : 29. October 2014
|
Last change : 19. March 2015
|
||||||
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -30,8 +30,12 @@
|
||||||
|
|
||||||
**************************************************************************************************/
|
**************************************************************************************************/
|
||||||
|
|
||||||
|
#include <VXDisassembler.h>
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
VX_UNUSED(argc); VX_UNUSED(argv);
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
Remarks : Freeware, Copyright must be included
|
Remarks : Freeware, Copyright must be included
|
||||||
|
|
||||||
Original Author : Florian Bernd
|
Original Author : Florian Bernd
|
||||||
Modifications :
|
Modifications : athre0z
|
||||||
|
|
||||||
Last change : 29. October 2014
|
Last change : 19. March 2015
|
||||||
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -30,8 +30,12 @@
|
||||||
|
|
||||||
**************************************************************************************************/
|
**************************************************************************************************/
|
||||||
|
|
||||||
|
#include <VXDisassembler.h>
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
VX_UNUSED(argc); VX_UNUSED(argv);
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
Remarks : Freeware, Copyright must be included
|
Remarks : Freeware, Copyright must be included
|
||||||
|
|
||||||
Original Author : Florian Bernd
|
Original Author : Florian Bernd
|
||||||
Modifications :
|
Modifications : athre0z
|
||||||
|
|
||||||
Last change : 29. October 2014
|
Last change : 19. March 2015
|
||||||
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -35,6 +35,8 @@
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
VX_UNUSED(argc); VX_UNUSED(argv);
|
||||||
|
|
||||||
// TODO: port to C
|
// TODO: port to C
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
Original Author : Florian Bernd
|
Original Author : Florian Bernd
|
||||||
Modifications : athre0z
|
Modifications : athre0z
|
||||||
|
|
||||||
Last change : 13. March 2015
|
Last change : 19. March 2015
|
||||||
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -42,13 +42,6 @@
|
||||||
|
|
||||||
/* VXBaseDataSource ---------------------------------------------------------------------------- */
|
/* VXBaseDataSource ---------------------------------------------------------------------------- */
|
||||||
|
|
||||||
typedef void(*VXBaseDataSource_DestructionCallback)(VXBaseDataSourceContext *ctx);
|
|
||||||
typedef uint8_t(*VXBaseDataSource_InputCallback)(VXBaseDataSourceContext *ctx);
|
|
||||||
typedef bool(*VXBaseDataSource_IsEndOfInputCallback)(const VXBaseDataSourceContext *ctx);
|
|
||||||
typedef uint64_t(*VXBaseDataSource_GetPositionCallback)(const VXBaseDataSourceContext *ctx);
|
|
||||||
typedef bool(*VXBaseDataSource_SetPositionCallback)(
|
|
||||||
VXBaseDataSourceContext *ctx, uint64_t position);
|
|
||||||
|
|
||||||
typedef struct _VXBaseDataSource
|
typedef struct _VXBaseDataSource
|
||||||
{
|
{
|
||||||
uint8_t currentInput;
|
uint8_t currentInput;
|
||||||
|
@ -128,6 +121,38 @@ static uint64_t VXMemoryDataSource_GetPosition(const VXBaseDataSourceContext *ct
|
||||||
*/
|
*/
|
||||||
static bool VXMemoryDataSource_SetPosition(VXBaseDataSourceContext *ctx, uint64_t position);
|
static bool VXMemoryDataSource_SetPosition(VXBaseDataSourceContext *ctx, uint64_t position);
|
||||||
|
|
||||||
|
/* VXCustomDataSource -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
typedef struct _VXCustomDataSource
|
||||||
|
{
|
||||||
|
VXBaseDataSource super;
|
||||||
|
VXBaseDataSource_DestructionCallback userDestruct; // may be NULL
|
||||||
|
} VXCustomDataSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor.
|
||||||
|
* @param ctx The context.
|
||||||
|
* @param inputPeekCb The callback peeking the next input byte.
|
||||||
|
* @param inputNextCb The callback consuming the next input byte.
|
||||||
|
* @param isEndOfInputCb The callback determining if the end of input was reached.
|
||||||
|
* @param getPositionCb The callback obtaining the current input position.
|
||||||
|
* @param setPositionCb The callback setting the current input position.
|
||||||
|
* @param destructionCb The destruction callback. May be @c NULL.
|
||||||
|
*/
|
||||||
|
static void VXCustomDataSource_Construct(VXBaseDataSourceContext *ctx,
|
||||||
|
VXBaseDataSource_InputCallback inputPeekCb,
|
||||||
|
VXBaseDataSource_InputCallback inputNextCb,
|
||||||
|
VXBaseDataSource_IsEndOfInputCallback isEndOfInputCb,
|
||||||
|
VXBaseDataSource_GetPositionCallback getPositionCb,
|
||||||
|
VXBaseDataSource_SetPositionCallback setPositionCb,
|
||||||
|
VXBaseDataSource_DestructionCallback destructionCb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructor.
|
||||||
|
* @param The context.
|
||||||
|
*/
|
||||||
|
static void VXCustomDataSource_Destruct(VXBaseDataSourceContext *ctx);
|
||||||
|
|
||||||
/* VXInstructionDecoder ------------------------------------------------------------------------ */
|
/* VXInstructionDecoder ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
typedef struct _VXInstructionDecoder
|
typedef struct _VXInstructionDecoder
|
||||||
|
@ -367,7 +392,7 @@ static void VXBaseDataSource_Construct(VXBaseDataSourceContext *ctx)
|
||||||
|
|
||||||
static void VXBaseDataSource_Destruct(VXBaseDataSourceContext *ctx)
|
static void VXBaseDataSource_Destruct(VXBaseDataSourceContext *ctx)
|
||||||
{
|
{
|
||||||
|
VX_UNUSED(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VXBaseDataSource_Release(VXBaseDataSourceContext *ctx)
|
void VXBaseDataSource_Release(VXBaseDataSourceContext *ctx)
|
||||||
|
@ -543,6 +568,61 @@ static bool VXMemoryDataSource_SetPosition(VXBaseDataSourceContext *ctx, uint64_
|
||||||
return thiz->super.isEndOfInput(ctx);
|
return thiz->super.isEndOfInput(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* VXCustomDataSource -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static void VXCustomDataSource_Construct(VXBaseDataSourceContext *ctx,
|
||||||
|
VXBaseDataSource_InputCallback inputPeekCb,
|
||||||
|
VXBaseDataSource_InputCallback inputNextCb,
|
||||||
|
VXBaseDataSource_IsEndOfInputCallback isEndOfInputCb,
|
||||||
|
VXBaseDataSource_GetPositionCallback getPositionCb,
|
||||||
|
VXBaseDataSource_SetPositionCallback setPositionCb,
|
||||||
|
VXBaseDataSource_DestructionCallback destructionCb)
|
||||||
|
{
|
||||||
|
VXBaseDataSource_Construct(ctx);
|
||||||
|
|
||||||
|
VXCustomDataSource *thiz = VXCustomDataSource_thiz(ctx);
|
||||||
|
thiz->super.destruct = &VXCustomDataSource_Destruct;
|
||||||
|
thiz->super.internalInputPeek = inputPeekCb;
|
||||||
|
thiz->super.internalInputNext = inputNextCb;
|
||||||
|
thiz->super.isEndOfInput = isEndOfInputCb;
|
||||||
|
thiz->super.getPosition = getPositionCb;
|
||||||
|
thiz->super.setPosition = setPositionCb;
|
||||||
|
|
||||||
|
thiz->userDestruct = destructionCb;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void VXCustomDataSource_Destruct(VXBaseDataSourceContext *ctx)
|
||||||
|
{
|
||||||
|
VXCustomDataSource *thiz = VXCustomDataSource_thiz(ctx);
|
||||||
|
|
||||||
|
if (thiz->userDestruct)
|
||||||
|
{
|
||||||
|
thiz->userDestruct(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
VXBaseDataSource_Destruct(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
VXBaseDataSourceContext* VXCustomDataSource_Create(
|
||||||
|
VXBaseDataSource_InputCallback inputPeekCb,
|
||||||
|
VXBaseDataSource_InputCallback inputNextCb,
|
||||||
|
VXBaseDataSource_IsEndOfInputCallback isEndOfInputCb,
|
||||||
|
VXBaseDataSource_GetPositionCallback getPositionCb,
|
||||||
|
VXBaseDataSource_SetPositionCallback setPositionCb,
|
||||||
|
VXBaseDataSource_DestructionCallback destructionCb)
|
||||||
|
{
|
||||||
|
VXCustomDataSource *thiz = malloc(sizeof(VXCustomDataSource));
|
||||||
|
VXBaseDataSourceContext *ctx = malloc(sizeof(VXBaseDataSourceContext));
|
||||||
|
|
||||||
|
ctx->d.type = TYPE_CUSTOMDATASOURCE;
|
||||||
|
ctx->d.ptr = thiz;
|
||||||
|
|
||||||
|
VXCustomDataSource_Construct(ctx, inputPeekCb, inputNextCb, isEndOfInputCb, getPositionCb,
|
||||||
|
setPositionCb, destructionCb);
|
||||||
|
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
|
|
||||||
/* VXInstructionDecoder ------------------------------------------------------------------------ */
|
/* VXInstructionDecoder ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
void VXInstructionDecoder_Construct(VXInstructionDecoderContext *ctx,
|
void VXInstructionDecoder_Construct(VXInstructionDecoderContext *ctx,
|
||||||
|
@ -559,7 +639,7 @@ void VXInstructionDecoder_Construct(VXInstructionDecoderContext *ctx,
|
||||||
|
|
||||||
void VXInstructionDecoder_Destruct(VXInstructionDecoderContext *ctx)
|
void VXInstructionDecoder_Destruct(VXInstructionDecoderContext *ctx)
|
||||||
{
|
{
|
||||||
|
VX_UNUSED(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
VXInstructionDecoderContext* VXInstructionDecoder_Create(void)
|
VXInstructionDecoderContext* VXInstructionDecoder_Create(void)
|
||||||
|
@ -1377,7 +1457,7 @@ static bool VXInstructionDecoder_DecodeOperand(VXInstructionDecoderContext *ctx,
|
||||||
case DOT_R6:
|
case DOT_R6:
|
||||||
case DOT_R7:
|
case DOT_R7:
|
||||||
return VXInstructionDecoder_DecodeRegisterOperand(ctx, info, operand, RC_GENERAL_PURPOSE,
|
return VXInstructionDecoder_DecodeRegisterOperand(ctx, info, operand, RC_GENERAL_PURPOSE,
|
||||||
((info->eff_rexvex_b << 3) | operandType - DOT_R0), operandSize);
|
(uint8_t)((info->eff_rexvex_b << 3) | operandType - DOT_R0), operandSize);
|
||||||
case DOT_AL:
|
case DOT_AL:
|
||||||
case DOT_AX:
|
case DOT_AX:
|
||||||
case DOT_EAX:
|
case DOT_EAX:
|
||||||
|
@ -1411,7 +1491,7 @@ static bool VXInstructionDecoder_DecodeOperand(VXInstructionDecoderContext *ctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
operand->type = OPTYPE_REGISTER;
|
operand->type = OPTYPE_REGISTER;
|
||||||
operand->base = operandType - DOT_ES + REG_ES;
|
operand->base = (uint16_t)(operandType - DOT_ES + REG_ES);
|
||||||
operand->size = 16;
|
operand->size = 16;
|
||||||
break;
|
break;
|
||||||
case DOT_ST0:
|
case DOT_ST0:
|
||||||
|
@ -1423,7 +1503,7 @@ static bool VXInstructionDecoder_DecodeOperand(VXInstructionDecoderContext *ctx,
|
||||||
case DOT_ST6:
|
case DOT_ST6:
|
||||||
case DOT_ST7:
|
case DOT_ST7:
|
||||||
operand->type = OPTYPE_REGISTER;
|
operand->type = OPTYPE_REGISTER;
|
||||||
operand->base = operandType - DOT_ST0 + REG_ST0;
|
operand->base = (uint16_t)(operandType - DOT_ST0 + REG_ST0);
|
||||||
operand->size = 80;
|
operand->size = 80;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1472,6 +1552,8 @@ static void VXInstructionDecoder_ResolveOperandAndAddressMode(
|
||||||
static void VXInstructionDecoder_CalculateEffectiveRexVexValues(
|
static void VXInstructionDecoder_CalculateEffectiveRexVexValues(
|
||||||
const VXInstructionDecoderContext *ctx, VXInstructionInfo *info)
|
const VXInstructionDecoderContext *ctx, VXInstructionInfo *info)
|
||||||
{
|
{
|
||||||
|
VX_UNUSED(ctx);
|
||||||
|
|
||||||
assert(info->instrDefinition);
|
assert(info->instrDefinition);
|
||||||
uint8_t rex = info->rex;
|
uint8_t rex = info->rex;
|
||||||
if (info->flags & IF_PREFIX_VEX)
|
if (info->flags & IF_PREFIX_VEX)
|
||||||
|
|
|
@ -48,6 +48,13 @@ extern "C"
|
||||||
|
|
||||||
typedef struct _VXBaseDataSourceContext { VXContextDescriptor d; } VXBaseDataSourceContext;
|
typedef struct _VXBaseDataSourceContext { VXContextDescriptor d; } VXBaseDataSourceContext;
|
||||||
|
|
||||||
|
typedef void(*VXBaseDataSource_DestructionCallback)(VXBaseDataSourceContext *ctx);
|
||||||
|
typedef uint8_t(*VXBaseDataSource_InputCallback)(VXBaseDataSourceContext *ctx);
|
||||||
|
typedef bool(*VXBaseDataSource_IsEndOfInputCallback)(const VXBaseDataSourceContext *ctx);
|
||||||
|
typedef uint64_t(*VXBaseDataSource_GetPositionCallback)(const VXBaseDataSourceContext *ctx);
|
||||||
|
typedef bool(*VXBaseDataSource_SetPositionCallback)(
|
||||||
|
VXBaseDataSourceContext *ctx, uint64_t position);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Releases a data source.
|
* @brief Releases a data source.
|
||||||
* @param ctx The context to release.
|
* @param ctx The context to release.
|
||||||
|
@ -150,11 +157,32 @@ VX_EXPORT bool VXBaseDataSource_SetPosition(
|
||||||
* @return @c NULL if it fails, else a data source context.
|
* @return @c NULL if it fails, else a data source context.
|
||||||
* @see VXBaseDataSource_Release
|
* @see VXBaseDataSource_Release
|
||||||
*/
|
*/
|
||||||
// TODO: verify return value
|
|
||||||
VX_EXPORT VXBaseDataSourceContext* VXMemoryDataSource_Create(
|
VX_EXPORT VXBaseDataSourceContext* VXMemoryDataSource_Create(
|
||||||
const void* buffer,
|
const void* buffer,
|
||||||
size_t bufferLen);
|
size_t bufferLen);
|
||||||
|
|
||||||
|
/* VXCustomDataSource ========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a custom daat source.
|
||||||
|
* @param ctx The context.
|
||||||
|
* @param inputPeekCb The callback peeking the next input byte.
|
||||||
|
* @param inputNextCb The callback consuming the next input byte.
|
||||||
|
* @param isEndOfInputCb The callback determining if the end of input was reached.
|
||||||
|
* @param getPositionCb The callback obtaining the current input position.
|
||||||
|
* @param setPositionCb The callback setting the current input position.
|
||||||
|
* @param destructionCb The destruction callback. May be @c NULL.
|
||||||
|
* @return @c NULL if it fails, else a data source context.
|
||||||
|
* @see VXBaseDataSource_Release
|
||||||
|
*/
|
||||||
|
VX_EXPORT VXBaseDataSourceContext* VXCustomDataSource_Create(
|
||||||
|
VXBaseDataSource_InputCallback inputPeekCb,
|
||||||
|
VXBaseDataSource_InputCallback inputNextCb,
|
||||||
|
VXBaseDataSource_IsEndOfInputCallback isEndOfInputCb,
|
||||||
|
VXBaseDataSource_GetPositionCallback getPositionCb,
|
||||||
|
VXBaseDataSource_SetPositionCallback setPositionCb,
|
||||||
|
VXBaseDataSource_DestructionCallback destructionCb);
|
||||||
|
|
||||||
/* Enums ======================================================================================= */
|
/* Enums ======================================================================================= */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
Original Author : Florian Bernd
|
Original Author : Florian Bernd
|
||||||
Modifications : athre0z
|
Modifications : athre0z
|
||||||
|
|
||||||
Last change : 14. March 2014
|
Last change : 19. March 2014
|
||||||
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -183,12 +183,10 @@ static void VXBaseInstructionFormatter_OutputAppendImmediate(
|
||||||
/**
|
/**
|
||||||
* @brief Appends a formatted memory displacement value to the output string buffer.
|
* @brief Appends a formatted memory displacement value to the output string buffer.
|
||||||
* @param ctx The context.
|
* @param ctx The context.
|
||||||
* @param info The instruction info.
|
|
||||||
* @param operand The memory operand.
|
* @param operand The memory operand.
|
||||||
*/
|
*/
|
||||||
static void VXBaseInstructionFormatter_OutputAppendDisplacement(
|
static void VXBaseInstructionFormatter_OutputAppendDisplacement(
|
||||||
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info,
|
VXBaseInstructionFormatterContext *ctx, const VXOperandInfo *operand);
|
||||||
const VXOperandInfo *operand);
|
|
||||||
|
|
||||||
/* VXCustomSymbolResolver ---------------------------------------------------------------------- */
|
/* VXCustomSymbolResolver ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -245,12 +243,10 @@ static void VXIntelInstructionFormatter_Destruct(VXBaseInstructionFormatterConte
|
||||||
/**
|
/**
|
||||||
* @brief Appends an operand cast to the output string buffer.
|
* @brief Appends an operand cast to the output string buffer.
|
||||||
* @param ctx The context.
|
* @param ctx The context.
|
||||||
* @param info The instruction info.
|
|
||||||
* @param operand The operand.
|
* @param operand The operand.
|
||||||
*/
|
*/
|
||||||
static void VXIntelInstructionFormatter_OutputAppendOperandCast(
|
static void VXIntelInstructionFormatter_OutputAppendOperandCast(
|
||||||
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info,
|
VXBaseInstructionFormatterContext *ctx, const VXOperandInfo *operand);
|
||||||
const VXOperandInfo *operand);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Formats the specified operand and appends it to the output buffer.
|
* @brief Formats the specified operand and appends it to the output buffer.
|
||||||
|
@ -278,7 +274,7 @@ void VXBaseSymbolResolver_Construct(VXBaseSymbolResolverContext *ctx)
|
||||||
|
|
||||||
void VXBaseSymbolResolver_Destruct(VXBaseSymbolResolverContext *ctx)
|
void VXBaseSymbolResolver_Destruct(VXBaseSymbolResolverContext *ctx)
|
||||||
{
|
{
|
||||||
|
VX_UNUSED(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VXBaseSymbolResolver_Release(VXBaseSymbolResolverContext *ctx)
|
void VXBaseSymbolResolver_Release(VXBaseSymbolResolverContext *ctx)
|
||||||
|
@ -454,6 +450,8 @@ static void VXBaseInstructionFormatter_OutputSetUppercase(VXBaseInstructionForma
|
||||||
static char const* VXBaseInstructionFormatter_RegisterToString(
|
static char const* VXBaseInstructionFormatter_RegisterToString(
|
||||||
const VXBaseInstructionFormatterContext *ctx, VXRegister reg)
|
const VXBaseInstructionFormatterContext *ctx, VXRegister reg)
|
||||||
{
|
{
|
||||||
|
VX_UNUSED(ctx);
|
||||||
|
|
||||||
if (reg == REG_NONE)
|
if (reg == REG_NONE)
|
||||||
{
|
{
|
||||||
return "error";
|
return "error";
|
||||||
|
@ -553,7 +551,7 @@ static void VXBaseInstructionFormatter_OutputAppend(
|
||||||
{
|
{
|
||||||
for (size_t i = offset; i < thiz->outputStringLen - 1; ++i)
|
for (size_t i = offset; i < thiz->outputStringLen - 1; ++i)
|
||||||
{
|
{
|
||||||
thiz->outputBuffer[i] = toupper(thiz->outputBuffer[i]);
|
thiz->outputBuffer[i] = (char)toupper(thiz->outputBuffer[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -605,7 +603,7 @@ static void VXBaseInstructionFormatter_OutputAppendFormatted(
|
||||||
{
|
{
|
||||||
for (size_t i = offset; i < thiz->outputStringLen - 1; ++i)
|
for (size_t i = offset; i < thiz->outputStringLen - 1; ++i)
|
||||||
{
|
{
|
||||||
thiz->outputBuffer[i] = toupper(thiz->outputBuffer[i]);
|
thiz->outputBuffer[i] = (char)toupper(thiz->outputBuffer[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -725,8 +723,7 @@ static void VXBaseInstructionFormatter_OutputAppendImmediate(
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VXBaseInstructionFormatter_OutputAppendDisplacement(
|
static void VXBaseInstructionFormatter_OutputAppendDisplacement(
|
||||||
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info,
|
VXBaseInstructionFormatterContext *ctx, const VXOperandInfo *operand)
|
||||||
const VXOperandInfo *operand)
|
|
||||||
{
|
{
|
||||||
assert(operand->offset > 0);
|
assert(operand->offset > 0);
|
||||||
if ((operand->base == REG_NONE) && (operand->index == REG_NONE))
|
if ((operand->base == REG_NONE) && (operand->index == REG_NONE))
|
||||||
|
@ -821,8 +818,7 @@ VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CreateEx(
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VXIntelInstructionFormatter_OutputAppendOperandCast(
|
static void VXIntelInstructionFormatter_OutputAppendOperandCast(
|
||||||
VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info,
|
VXBaseInstructionFormatterContext *ctx, const VXOperandInfo *operand)
|
||||||
const VXOperandInfo *operand)
|
|
||||||
{
|
{
|
||||||
switch(operand->size)
|
switch(operand->size)
|
||||||
{
|
{
|
||||||
|
@ -895,7 +891,7 @@ static void VXIntelInstructionFormatter_FormatOperand(VXBaseInstructionFormatter
|
||||||
|
|
||||||
if (operand->offset)
|
if (operand->offset)
|
||||||
{
|
{
|
||||||
VXBaseInstructionFormatter_OutputAppendDisplacement(ctx, info, operand);
|
VXBaseInstructionFormatter_OutputAppendDisplacement(ctx, operand);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VXBaseInstructionFormatter_OutputAppend(ctx, "]");
|
VXBaseInstructionFormatter_OutputAppend(ctx, "]");
|
||||||
|
@ -996,7 +992,7 @@ static void VXIntelInstructionFormatter_InternalFormatInstruction(
|
||||||
|
|
||||||
if (cast)
|
if (cast)
|
||||||
{
|
{
|
||||||
VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, info, &info->operand[0]);
|
VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, &info->operand[0]);
|
||||||
}
|
}
|
||||||
VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[0]);
|
VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[0]);
|
||||||
}
|
}
|
||||||
|
@ -1021,7 +1017,7 @@ static void VXIntelInstructionFormatter_InternalFormatInstruction(
|
||||||
|
|
||||||
if (cast)
|
if (cast)
|
||||||
{
|
{
|
||||||
VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, info, &info->operand[1]);
|
VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, &info->operand[1]);
|
||||||
}
|
}
|
||||||
VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[1]);
|
VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[1]);
|
||||||
}
|
}
|
||||||
|
@ -1039,7 +1035,7 @@ static void VXIntelInstructionFormatter_InternalFormatInstruction(
|
||||||
|
|
||||||
if (cast)
|
if (cast)
|
||||||
{
|
{
|
||||||
VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, info, &info->operand[2]);
|
VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, &info->operand[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[2]);
|
VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[2]);
|
||||||
|
|
|
@ -45,4 +45,6 @@
|
||||||
# define VX_INLINE static inline
|
# define VX_INLINE static inline
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define VX_UNUSED(x) ((void)x)
|
||||||
|
|
||||||
#endif /* _VDE_VXINTERNALCONFIG_H_ */
|
#endif /* _VDE_VXINTERNALCONFIG_H_ */
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
Original Author : athre0z
|
Original Author : athre0z
|
||||||
Modifications :
|
Modifications :
|
||||||
|
|
||||||
Last change : 13. March 2015
|
Last change : 19. March 2015
|
||||||
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -45,6 +45,7 @@ typedef enum _VXTypeId
|
||||||
{
|
{
|
||||||
TYPE_BASEDATASOURCE,
|
TYPE_BASEDATASOURCE,
|
||||||
TYPE_MEMORYDATASOURCE,
|
TYPE_MEMORYDATASOURCE,
|
||||||
|
TYPE_CUSTOMDATASOURCE,
|
||||||
TYPE_INSTRUCTIONDECODER,
|
TYPE_INSTRUCTIONDECODER,
|
||||||
TYPE_BASESYMBOLRESOLVER,
|
TYPE_BASESYMBOLRESOLVER,
|
||||||
TYPE_CUSTOMSYMBOLRESOLVER,
|
TYPE_CUSTOMSYMBOLRESOLVER,
|
||||||
|
@ -58,7 +59,8 @@ VX_INLINE struct _VXBaseDataSource* VXBaseDataSource_thiz(
|
||||||
VXBaseDataSourceContext *ctx)
|
VXBaseDataSourceContext *ctx)
|
||||||
{
|
{
|
||||||
assert(ctx->d.type == TYPE_BASEDATASOURCE
|
assert(ctx->d.type == TYPE_BASEDATASOURCE
|
||||||
|| ctx->d.type == TYPE_MEMORYDATASOURCE);
|
|| ctx->d.type == TYPE_MEMORYDATASOURCE
|
||||||
|
|| ctx->d.type == TYPE_CUSTOMDATASOURCE);
|
||||||
return (struct _VXBaseDataSource*)ctx->d.ptr;
|
return (struct _VXBaseDataSource*)ctx->d.ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,7 +68,8 @@ VX_INLINE const struct _VXBaseDataSource* VXBaseDataSource_cthiz(
|
||||||
const VXBaseDataSourceContext *ctx)
|
const VXBaseDataSourceContext *ctx)
|
||||||
{
|
{
|
||||||
assert(ctx->d.type == TYPE_BASEDATASOURCE
|
assert(ctx->d.type == TYPE_BASEDATASOURCE
|
||||||
|| ctx->d.type == TYPE_MEMORYDATASOURCE);
|
|| ctx->d.type == TYPE_MEMORYDATASOURCE
|
||||||
|
|| ctx->d.type == TYPE_CUSTOMDATASOURCE);
|
||||||
return (const struct _VXBaseDataSource*)ctx->d.ptr;
|
return (const struct _VXBaseDataSource*)ctx->d.ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +87,20 @@ VX_INLINE const struct _VXMemoryDataSource* VXMemoryDataSource_cthiz(
|
||||||
return (const struct _VXMemoryDataSource*)ctx->d.ptr;
|
return (const struct _VXMemoryDataSource*)ctx->d.ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VX_INLINE struct _VXCustomDataSource* VXCustomDataSource_thiz(
|
||||||
|
VXBaseDataSourceContext *ctx)
|
||||||
|
{
|
||||||
|
assert(ctx->d.type == TYPE_CUSTOMDATASOURCE);
|
||||||
|
return (struct _VXCustomDataSource*)ctx->d.ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
VX_INLINE const struct _VXCustomDataSource* VXCustomDataSource_cthiz(
|
||||||
|
const VXBaseDataSourceContext *ctx)
|
||||||
|
{
|
||||||
|
assert(ctx->d.type == TYPE_CUSTOMDATASOURCE);
|
||||||
|
return (const struct _VXCustomDataSource*)ctx->d.ptr;
|
||||||
|
}
|
||||||
|
|
||||||
VX_INLINE struct _VXInstructionDecoder* VXInstructionDecoder_thiz(
|
VX_INLINE struct _VXInstructionDecoder* VXInstructionDecoder_thiz(
|
||||||
VXInstructionDecoderContext *ctx)
|
VXInstructionDecoderContext *ctx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
|
|
||||||
Remarks : Freeware, Copyright must be included
|
Remarks : Freeware, Copyright must be included
|
||||||
|
|
||||||
Original Author : athre0z
|
Original Author : Florian Bernd
|
||||||
Modifications :
|
Modifications : athre0z
|
||||||
|
|
||||||
Last change : 14. March 2015
|
Last change : 19. March 2015
|
||||||
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -285,7 +285,7 @@ VX_INLINE uint16_t VXGetSimpleOperandSize(VXDefinedOperandSize operandSize)
|
||||||
8, 16, 32, 64, 80, 12, 128, 256
|
8, 16, 32, 64, 80, 12, 128, 256
|
||||||
};
|
};
|
||||||
|
|
||||||
uint16_t index = operandSize - DOS_B;
|
uint16_t index = (uint16_t)(operandSize - DOS_B);
|
||||||
assert(index < 8);
|
assert(index < 8);
|
||||||
return operandSizes[index];
|
return operandSizes[index];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue