From f94792e4f9a11f9210f6afc9149e2e426fa16859 Mon Sep 17 00:00:00 2001 From: Ende! Date: Thu, 19 Mar 2015 17:13:37 +0100 Subject: [PATCH] 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 --- Bindings/Cpp/VXInstructionDecoder.hpp | 4 +- CMakeLists.txt | 2 +- Examples/CppBindings/Main.cpp | 2 + Examples/CustomDataSource/Main.c | 8 +- Examples/PerformanceTest/Main.c | 8 +- Examples/SymbolResolver/Main.c | 6 +- .../VXInstructionDecoder.c | 108 +++++++++++++++--- .../VXInstructionDecoder.h | 30 ++++- .../VXInstructionFormatter.c | 32 +++--- VerteronDisassemblerEngine/VXInternalConfig.h | 2 + .../VXInternalHelpers.h | 23 +++- .../VXOpcodeTableInternal.h | 8 +- 12 files changed, 185 insertions(+), 48 deletions(-) diff --git a/Bindings/Cpp/VXInstructionDecoder.hpp b/Bindings/Cpp/VXInstructionDecoder.hpp index 7ecf592..216b4d0 100644 --- a/Bindings/Cpp/VXInstructionDecoder.hpp +++ b/Bindings/Cpp/VXInstructionDecoder.hpp @@ -323,7 +323,7 @@ inline uint8_t VXStreamDataSource::internalInputPeek() { return 0; } - return m_inputStream->peek(); + return static_cast(m_inputStream->peek()); } inline uint8_t VXStreamDataSource::internalInputNext() @@ -332,7 +332,7 @@ inline uint8_t VXStreamDataSource::internalInputNext() { return 0; } - return m_inputStream->get(); + return static_cast(m_inputStream->get()); } inline bool VXStreamDataSource::isEndOfInput() const diff --git a/CMakeLists.txt b/CMakeLists.txt index 454168b..3cec443 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ if (NOT CONFIGURED_ONCE) set(compiler_specific "-Werror") set(compiler_specific_cxx "-std=c++0x") elseif (MSVC) - set(compiler_specific "/WX /D_CRT_SECURE_NO_WARNINGS") + set(compiler_specific "/WX /W4 /D_CRT_SECURE_NO_WARNINGS") endif () set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${compiler_specific} ${compiler_specific_cxx}" diff --git a/Examples/CppBindings/Main.cpp b/Examples/CppBindings/Main.cpp index 3f67a61..7cadb0c 100644 --- a/Examples/CppBindings/Main.cpp +++ b/Examples/CppBindings/Main.cpp @@ -39,6 +39,8 @@ using namespace Verteron; int main(int argc, char* argv[]) { + (void)argc; (void)argv; + uint8_t data32[] = { 0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x6A, 0xFE, 0x68, 0xD8, 0x18, 0x09, 0x77, 0x68, 0x85, 0xD2, diff --git a/Examples/CustomDataSource/Main.c b/Examples/CustomDataSource/Main.c index a08a382..4db36ce 100644 --- a/Examples/CustomDataSource/Main.c +++ b/Examples/CustomDataSource/Main.c @@ -6,9 +6,9 @@ Remarks : Freeware, Copyright must be included 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 * of this software and associated documentation files (the "Software"), to deal @@ -30,8 +30,12 @@ **************************************************************************************************/ +#include + int main(int argc, char* argv[]) { + VX_UNUSED(argc); VX_UNUSED(argv); + // TODO: return 0; } diff --git a/Examples/PerformanceTest/Main.c b/Examples/PerformanceTest/Main.c index a08a382..4db36ce 100644 --- a/Examples/PerformanceTest/Main.c +++ b/Examples/PerformanceTest/Main.c @@ -6,9 +6,9 @@ Remarks : Freeware, Copyright must be included 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 * of this software and associated documentation files (the "Software"), to deal @@ -30,8 +30,12 @@ **************************************************************************************************/ +#include + int main(int argc, char* argv[]) { + VX_UNUSED(argc); VX_UNUSED(argv); + // TODO: return 0; } diff --git a/Examples/SymbolResolver/Main.c b/Examples/SymbolResolver/Main.c index f73c8dc..ec98236 100644 --- a/Examples/SymbolResolver/Main.c +++ b/Examples/SymbolResolver/Main.c @@ -6,9 +6,9 @@ Remarks : Freeware, Copyright must be included 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 * of this software and associated documentation files (the "Software"), to deal @@ -35,6 +35,8 @@ int main(int argc, char* argv[]) { + VX_UNUSED(argc); VX_UNUSED(argv); + // TODO: port to C /* diff --git a/VerteronDisassemblerEngine/VXInstructionDecoder.c b/VerteronDisassemblerEngine/VXInstructionDecoder.c index 9f93bc6..d9aa5c1 100644 --- a/VerteronDisassemblerEngine/VXInstructionDecoder.c +++ b/VerteronDisassemblerEngine/VXInstructionDecoder.c @@ -8,7 +8,7 @@ Original Author : Florian Bernd 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 * of this software and associated documentation files (the "Software"), to deal @@ -42,13 +42,6 @@ /* 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 { uint8_t currentInput; @@ -128,6 +121,38 @@ static uint64_t VXMemoryDataSource_GetPosition(const VXBaseDataSourceContext *ct */ 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 ------------------------------------------------------------------------ */ typedef struct _VXInstructionDecoder @@ -367,7 +392,7 @@ static void VXBaseDataSource_Construct(VXBaseDataSourceContext *ctx) static void VXBaseDataSource_Destruct(VXBaseDataSourceContext *ctx) { - + VX_UNUSED(ctx); } void VXBaseDataSource_Release(VXBaseDataSourceContext *ctx) @@ -543,6 +568,61 @@ static bool VXMemoryDataSource_SetPosition(VXBaseDataSourceContext *ctx, uint64_ 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 ------------------------------------------------------------------------ */ void VXInstructionDecoder_Construct(VXInstructionDecoderContext *ctx, @@ -559,7 +639,7 @@ void VXInstructionDecoder_Construct(VXInstructionDecoderContext *ctx, void VXInstructionDecoder_Destruct(VXInstructionDecoderContext *ctx) { - + VX_UNUSED(ctx); } VXInstructionDecoderContext* VXInstructionDecoder_Create(void) @@ -1377,7 +1457,7 @@ static bool VXInstructionDecoder_DecodeOperand(VXInstructionDecoderContext *ctx, case DOT_R6: case DOT_R7: 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_AX: case DOT_EAX: @@ -1411,7 +1491,7 @@ static bool VXInstructionDecoder_DecodeOperand(VXInstructionDecoderContext *ctx, } } operand->type = OPTYPE_REGISTER; - operand->base = operandType - DOT_ES + REG_ES; + operand->base = (uint16_t)(operandType - DOT_ES + REG_ES); operand->size = 16; break; case DOT_ST0: @@ -1423,7 +1503,7 @@ static bool VXInstructionDecoder_DecodeOperand(VXInstructionDecoderContext *ctx, case DOT_ST6: case DOT_ST7: operand->type = OPTYPE_REGISTER; - operand->base = operandType - DOT_ST0 + REG_ST0; + operand->base = (uint16_t)(operandType - DOT_ST0 + REG_ST0); operand->size = 80; break; default: @@ -1472,6 +1552,8 @@ static void VXInstructionDecoder_ResolveOperandAndAddressMode( static void VXInstructionDecoder_CalculateEffectiveRexVexValues( const VXInstructionDecoderContext *ctx, VXInstructionInfo *info) { + VX_UNUSED(ctx); + assert(info->instrDefinition); uint8_t rex = info->rex; if (info->flags & IF_PREFIX_VEX) diff --git a/VerteronDisassemblerEngine/VXInstructionDecoder.h b/VerteronDisassemblerEngine/VXInstructionDecoder.h index c19efc0..34a04d0 100644 --- a/VerteronDisassemblerEngine/VXInstructionDecoder.h +++ b/VerteronDisassemblerEngine/VXInstructionDecoder.h @@ -48,6 +48,13 @@ extern "C" 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. * @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. * @see VXBaseDataSource_Release */ -// TODO: verify return value VX_EXPORT VXBaseDataSourceContext* VXMemoryDataSource_Create( const void* buffer, 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 ======================================================================================= */ /** diff --git a/VerteronDisassemblerEngine/VXInstructionFormatter.c b/VerteronDisassemblerEngine/VXInstructionFormatter.c index 4ad27a5..84113dd 100644 --- a/VerteronDisassemblerEngine/VXInstructionFormatter.c +++ b/VerteronDisassemblerEngine/VXInstructionFormatter.c @@ -8,7 +8,7 @@ Original Author : Florian Bernd 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 * 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. * @param ctx The context. - * @param info The instruction info. * @param operand The memory operand. */ static void VXBaseInstructionFormatter_OutputAppendDisplacement( - VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, - const VXOperandInfo *operand); + VXBaseInstructionFormatterContext *ctx, const VXOperandInfo *operand); /* VXCustomSymbolResolver ---------------------------------------------------------------------- */ @@ -245,12 +243,10 @@ static void VXIntelInstructionFormatter_Destruct(VXBaseInstructionFormatterConte /** * @brief Appends an operand cast to the output string buffer. * @param ctx The context. - * @param info The instruction info. * @param operand The operand. */ static void VXIntelInstructionFormatter_OutputAppendOperandCast( - VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, - const VXOperandInfo *operand); + VXBaseInstructionFormatterContext *ctx, const VXOperandInfo *operand); /** * @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) { - + VX_UNUSED(ctx); } void VXBaseSymbolResolver_Release(VXBaseSymbolResolverContext *ctx) @@ -454,6 +450,8 @@ static void VXBaseInstructionFormatter_OutputSetUppercase(VXBaseInstructionForma static char const* VXBaseInstructionFormatter_RegisterToString( const VXBaseInstructionFormatterContext *ctx, VXRegister reg) { + VX_UNUSED(ctx); + if (reg == REG_NONE) { return "error"; @@ -553,7 +551,7 @@ static void VXBaseInstructionFormatter_OutputAppend( { 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) { - 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( - VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, - const VXOperandInfo *operand) + VXBaseInstructionFormatterContext *ctx, const VXOperandInfo *operand) { assert(operand->offset > 0); if ((operand->base == REG_NONE) && (operand->index == REG_NONE)) @@ -821,8 +818,7 @@ VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CreateEx( } static void VXIntelInstructionFormatter_OutputAppendOperandCast( - VXBaseInstructionFormatterContext *ctx, const VXInstructionInfo *info, - const VXOperandInfo *operand) + VXBaseInstructionFormatterContext *ctx, const VXOperandInfo *operand) { switch(operand->size) { @@ -895,7 +891,7 @@ static void VXIntelInstructionFormatter_FormatOperand(VXBaseInstructionFormatter if (operand->offset) { - VXBaseInstructionFormatter_OutputAppendDisplacement(ctx, info, operand); + VXBaseInstructionFormatter_OutputAppendDisplacement(ctx, operand); } } VXBaseInstructionFormatter_OutputAppend(ctx, "]"); @@ -996,7 +992,7 @@ static void VXIntelInstructionFormatter_InternalFormatInstruction( if (cast) { - VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, info, &info->operand[0]); + VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, &info->operand[0]); } VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[0]); } @@ -1021,7 +1017,7 @@ static void VXIntelInstructionFormatter_InternalFormatInstruction( if (cast) { - VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, info, &info->operand[1]); + VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, &info->operand[1]); } VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[1]); } @@ -1039,7 +1035,7 @@ static void VXIntelInstructionFormatter_InternalFormatInstruction( if (cast) { - VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, info, &info->operand[2]); + VXIntelInstructionFormatter_OutputAppendOperandCast(ctx, &info->operand[2]); } VXIntelInstructionFormatter_FormatOperand(ctx, info, &info->operand[2]); diff --git a/VerteronDisassemblerEngine/VXInternalConfig.h b/VerteronDisassemblerEngine/VXInternalConfig.h index ba4c6b2..2e88351 100644 --- a/VerteronDisassemblerEngine/VXInternalConfig.h +++ b/VerteronDisassemblerEngine/VXInternalConfig.h @@ -45,4 +45,6 @@ # define VX_INLINE static inline #endif +#define VX_UNUSED(x) ((void)x) + #endif /* _VDE_VXINTERNALCONFIG_H_ */ diff --git a/VerteronDisassemblerEngine/VXInternalHelpers.h b/VerteronDisassemblerEngine/VXInternalHelpers.h index 9e17910..e310bbe 100644 --- a/VerteronDisassemblerEngine/VXInternalHelpers.h +++ b/VerteronDisassemblerEngine/VXInternalHelpers.h @@ -8,7 +8,7 @@ Original Author : athre0z Modifications : - Last change : 13. March 2015 + Last change : 19. March 2015 * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -45,6 +45,7 @@ typedef enum _VXTypeId { TYPE_BASEDATASOURCE, TYPE_MEMORYDATASOURCE, + TYPE_CUSTOMDATASOURCE, TYPE_INSTRUCTIONDECODER, TYPE_BASESYMBOLRESOLVER, TYPE_CUSTOMSYMBOLRESOLVER, @@ -58,7 +59,8 @@ VX_INLINE struct _VXBaseDataSource* VXBaseDataSource_thiz( VXBaseDataSourceContext *ctx) { 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; } @@ -66,7 +68,8 @@ VX_INLINE const struct _VXBaseDataSource* VXBaseDataSource_cthiz( const VXBaseDataSourceContext *ctx) { 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; } @@ -84,6 +87,20 @@ VX_INLINE const struct _VXMemoryDataSource* VXMemoryDataSource_cthiz( 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( VXInstructionDecoderContext *ctx) { diff --git a/VerteronDisassemblerEngine/VXOpcodeTableInternal.h b/VerteronDisassemblerEngine/VXOpcodeTableInternal.h index 06c4c08..347f079 100644 --- a/VerteronDisassemblerEngine/VXOpcodeTableInternal.h +++ b/VerteronDisassemblerEngine/VXOpcodeTableInternal.h @@ -5,10 +5,10 @@ Remarks : Freeware, Copyright must be included - Original Author : athre0z - Modifications : + Original Author : Florian Bernd + 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 * 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 }; - uint16_t index = operandSize - DOS_B; + uint16_t index = (uint16_t)(operandSize - DOS_B); assert(index < 8); return operandSizes[index]; }