mirror of https://github.com/x64dbg/zydis
				
				
				
			altered directory structure to use C implementation of library as the default
This commit is contained in:
		
							parent
							
								
									30b60c7dc4
								
							
						
					
					
						commit
						c912af00f9
					
				| 
						 | 
					@ -1,304 +0,0 @@
 | 
				
			||||||
/**************************************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Verteron Disassembler Engine
 | 
					 | 
				
			||||||
  Version 1.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Remarks         : Freeware, Copyright must be included
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Original Author : Florian Bernd
 | 
					 | 
				
			||||||
  Modifications   : athre0z
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Last change     : 14. 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
 | 
					 | 
				
			||||||
 * 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 _VDE_VXINSTRUCTIONDECODERC_H_
 | 
					 | 
				
			||||||
#define _VDE_VXINSTRUCTIONDECODERC_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "VXDisassemblerTypesC.h"
 | 
					 | 
				
			||||||
#include "VXDisassemblerUtilsC.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdbool.h>
 | 
					 | 
				
			||||||
#include <stddef.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C"
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* VXBaseDataSource ============================================================================ */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _VXBaseDataSourceContext { VXContextDescriptor d; } VXBaseDataSourceContext;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief Releases a data source. 
 | 
					 | 
				
			||||||
 * @param ctx The context to release.
 | 
					 | 
				
			||||||
 * The context may no longer be used after it was released.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXBaseDataSource_Release(
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Reads the next byte from the data source without altering the current input position 
 | 
					 | 
				
			||||||
 *          or the @c length field of the @c info parameter. 
 | 
					 | 
				
			||||||
 * @param   ctx  The data source context.
 | 
					 | 
				
			||||||
 * @param   info The instruction info struct.
 | 
					 | 
				
			||||||
 * @return  The current input byte. If the result is zero, you should always check the @c flags 
 | 
					 | 
				
			||||||
 *          field of the @c info parameter for error flags. Possible error values are 
 | 
					 | 
				
			||||||
 *          @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT uint8_t VXBaseDataSource_InputPeek(
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *ctx, 
 | 
					 | 
				
			||||||
    VXInstructionInfo *info);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
  * @brief   Reads the next byte from the data source.
 | 
					 | 
				
			||||||
  * @param   ctx  The data soruce context.
 | 
					 | 
				
			||||||
  * @param   info The instruction info.
 | 
					 | 
				
			||||||
  * @return  The current input byte. If the result is zero, you should always check the 
 | 
					 | 
				
			||||||
  *          @c flags field of the @c info parameter for error flags.
 | 
					 | 
				
			||||||
  *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.        
 | 
					 | 
				
			||||||
  * This method increases the current input position and the @c length field of the @c info 
 | 
					 | 
				
			||||||
  * parameter. This function also appends the new byte to to @c data field of the @c info 
 | 
					 | 
				
			||||||
  * parameter.
 | 
					 | 
				
			||||||
  */
 | 
					 | 
				
			||||||
VX_EXPORT uint8_t VXBaseDataSource_InputNext8(
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *ctx, 
 | 
					 | 
				
			||||||
    VXInstructionInfo *info);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @copydoc VXBaseDataSource_InputNext8
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT uint16_t VXBaseDataSource_InputNext16(
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *ctx, 
 | 
					 | 
				
			||||||
    VXInstructionInfo *info);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @copydoc VXBaseDataSource_InputNext8
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT uint32_t VXBaseDataSource_InputNext32(
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *ctx, 
 | 
					 | 
				
			||||||
    VXInstructionInfo *info);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @copydoc VXBaseDataSource_InputNext8
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT uint64_t VXBaseDataSource_InputNext64(
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *ctx, 
 | 
					 | 
				
			||||||
    VXInstructionInfo *info);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Returns the current input byte.
 | 
					 | 
				
			||||||
 * @param   ctx  The data soruce context.
 | 
					 | 
				
			||||||
 * @return  The current input byte.
 | 
					 | 
				
			||||||
 * The current input byte is set everytime the @c inputPeek or @c inputNext method is called.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
// TODO: check long descr
 | 
					 | 
				
			||||||
VX_EXPORT uint8_t VXBaseDataSource_InputCurrent(
 | 
					 | 
				
			||||||
    const VXBaseDataSourceContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Queries if the end of the data source is reached.
 | 
					 | 
				
			||||||
 * @param   ctx  The data soruce context.
 | 
					 | 
				
			||||||
 * @return  @c true if end of input, @c false if not.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT bool VXBaseDataSource_IsEndOfInput(
 | 
					 | 
				
			||||||
    const VXBaseDataSourceContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Returns the current input position.
 | 
					 | 
				
			||||||
 * @param   ctx  The data soruce context.
 | 
					 | 
				
			||||||
 * @return  The current input position.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT uint64_t VXBaseDataSource_GetPosition(
 | 
					 | 
				
			||||||
    const VXBaseDataSourceContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Sets a new input position.
 | 
					 | 
				
			||||||
 * @param   ctx  The data soruce context.
 | 
					 | 
				
			||||||
 * @param   position    The new input position.
 | 
					 | 
				
			||||||
 * @return  @c false if the new position exceeds the maximum input length.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT bool VXBaseDataSource_SetPosition(
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *ctx, 
 | 
					 | 
				
			||||||
    uint64_t position);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* VXMemoryDataSource ========================================================================== */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Creates a memory data source.
 | 
					 | 
				
			||||||
 * @param   buffer      The input buffer.
 | 
					 | 
				
			||||||
 * @param   bufferLen   THe length of the input buffer.
 | 
					 | 
				
			||||||
 * @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);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Enums ======================================================================================= */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Values that represent a disassembler mode.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
typedef enum _VXDisassemblerMode /* : uint8_t */
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    DM_M16BIT,
 | 
					 | 
				
			||||||
    DM_M32BIT,
 | 
					 | 
				
			||||||
    DM_M64BIT
 | 
					 | 
				
			||||||
} VXDisassemblerMode;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Values that represent an instruction-set vendor.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
typedef enum _VXInstructionSetVendor /* : uint8_t */
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ISV_ANY,
 | 
					 | 
				
			||||||
    ISV_INTEL,
 | 
					 | 
				
			||||||
    ISV_AMD
 | 
					 | 
				
			||||||
} VXInstructionSetVendor;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* VXInstructionDecoder ======================================================================== */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _VXInstructionDecoderContext 
 | 
					 | 
				
			||||||
{ 
 | 
					 | 
				
			||||||
    VXContextDescriptor d; 
 | 
					 | 
				
			||||||
} VXInstructionDecoderContext;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Creates an instruction decoder.
 | 
					 | 
				
			||||||
 * @return  @c NULL if it fails, else an instruction decoder context.
 | 
					 | 
				
			||||||
 * @see     VXInstructionDecoder_Release
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
// TODO: verify return value
 | 
					 | 
				
			||||||
VX_EXPORT VXInstructionDecoderContext* VXInstructionDecoder_Create(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Creates an instruction decoder.
 | 
					 | 
				
			||||||
 * @param   input               A reference to the input data source.
 | 
					 | 
				
			||||||
 * @param   disassemblerMode    The disassembler mode.
 | 
					 | 
				
			||||||
 * @param   preferredVendor     The preferred instruction-set vendor.
 | 
					 | 
				
			||||||
 * @param   instructionPointer  The initial instruction pointer.
 | 
					 | 
				
			||||||
 * @return  @c NULL if it fails, else an instruction decoder context.
 | 
					 | 
				
			||||||
 * @see     VXInstructionDecoder_Release
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT VXInstructionDecoderContext* VXInstructionDecoder_CreateEx(
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *input, 
 | 
					 | 
				
			||||||
    VXDisassemblerMode disassemblerMode,
 | 
					 | 
				
			||||||
    VXInstructionSetVendor preferredVendor, 
 | 
					 | 
				
			||||||
    uint64_t instructionPointer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Releases an instruction decoder.
 | 
					 | 
				
			||||||
 * @param   ctx The context of the instruction decoder to release.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXInstructionDecoder_Release(
 | 
					 | 
				
			||||||
    VXInstructionDecoderContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Decodes the next instruction from the input data source.
 | 
					 | 
				
			||||||
 * @param   ctx  The instruction decoder context.
 | 
					 | 
				
			||||||
 * @param   info The @c VXInstructionInfo struct that receives the information about the decoded 
 | 
					 | 
				
			||||||
 *               instruction.
 | 
					 | 
				
			||||||
 * @return  This function returns @c false if the current position exceeds the maximum input
 | 
					 | 
				
			||||||
 *          length. In all other cases (valid and invalid instructions) the return value is 
 | 
					 | 
				
			||||||
 *          @c true.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT bool VXInstructionDecoder_DecodeInstruction(
 | 
					 | 
				
			||||||
    VXInstructionDecoderContext *ctx, 
 | 
					 | 
				
			||||||
    VXInstructionInfo *info);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Returns a pointer to the current data source.
 | 
					 | 
				
			||||||
 * @param   ctx The instruction decoder context.
 | 
					 | 
				
			||||||
 * @return  The context of the data source.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT VXBaseDataSourceContext* VXInstructionDecoder_GetDataSource(
 | 
					 | 
				
			||||||
    const VXInstructionDecoderContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Sets a new data source.
 | 
					 | 
				
			||||||
 * @param   ctx   The instruction decoder context.
 | 
					 | 
				
			||||||
 * @param   input The context of the new input data source.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXInstructionDecoder_SetDataSource(
 | 
					 | 
				
			||||||
    VXInstructionDecoderContext *ctx, 
 | 
					 | 
				
			||||||
    VXBaseDataSourceContext *input);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Returns the current disassembler mode.
 | 
					 | 
				
			||||||
 * @param   ctx The instruction decoder context.
 | 
					 | 
				
			||||||
 * @return  The current disassembler mode.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT VXDisassemblerMode VXInstructionDecoder_GetDisassemblerMode(
 | 
					 | 
				
			||||||
    const VXInstructionDecoderContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Sets the current disassembler mode.
 | 
					 | 
				
			||||||
 * @param   ctx                 The instruction decoder context.
 | 
					 | 
				
			||||||
 * @param   disassemblerMode    The new disassembler mode.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXInstructionDecoder_SetDisassemblerMode(
 | 
					 | 
				
			||||||
    VXInstructionDecoderContext *ctx,
 | 
					 | 
				
			||||||
    VXDisassemblerMode disassemblerMode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Returns the preferred instruction-set vendor.
 | 
					 | 
				
			||||||
 * @param   ctx The instruction decoder context.
 | 
					 | 
				
			||||||
 * @return  The preferred instruction-set vendor.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT VXInstructionSetVendor VXInstructionDecoder_GetPreferredVendor(
 | 
					 | 
				
			||||||
    const VXInstructionDecoderContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Sets the preferred instruction-set vendor.
 | 
					 | 
				
			||||||
 * @param   ctx             The instruction decoder context.
 | 
					 | 
				
			||||||
 * @param   preferredVendor The new preferred instruction-set vendor.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXInstructionDecoder_SetPreferredVendor(
 | 
					 | 
				
			||||||
    VXInstructionDecoderContext *ctx,
 | 
					 | 
				
			||||||
    VXInstructionSetVendor preferredVendor);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Returns the current instruction pointer.
 | 
					 | 
				
			||||||
 * @param   ctx The instruction decoder context.
 | 
					 | 
				
			||||||
 * @return  The current instruction pointer.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT uint64_t VXInstructionDecoder_GetInstructionPointer(
 | 
					 | 
				
			||||||
    const VXInstructionDecoderContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Sets a new instruction pointer.
 | 
					 | 
				
			||||||
 * @param   ctx                 The instruction decoder context.
 | 
					 | 
				
			||||||
 * @param   instructionPointer  The new instruction pointer.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXInstructionDecoder_SetInstructionPointer(
 | 
					 | 
				
			||||||
    VXInstructionDecoderContext *ctx,
 | 
					 | 
				
			||||||
    uint64_t instructionPointer);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* ============================================================================================= */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _VDE_VXINSTRUCTIONDECODERC_H_ */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,161 +0,0 @@
 | 
				
			||||||
/**************************************************************************************************
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Verteron Disassembler Engine
 | 
					 | 
				
			||||||
  Version 1.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Remarks         : Freeware, Copyright must be included
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Original Author : Florian Bernd
 | 
					 | 
				
			||||||
  Modifications   : athre0z
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Last change     : 14. 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
 | 
					 | 
				
			||||||
 * 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 _VDE_VXINSTRUCTIONFORMATTERC_H_
 | 
					 | 
				
			||||||
#define _VDE_VXINSTRUCTIONFORMATTERC_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "VXDisassemblerTypesC.h"
 | 
					 | 
				
			||||||
#include "VXDisassemblerUtilsC.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C"
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* VXBaseSymbolResolver ======================================================================== */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _VXBaseSymbolResolverContext 
 | 
					 | 
				
			||||||
{ 
 | 
					 | 
				
			||||||
    VXContextDescriptor d; 
 | 
					 | 
				
			||||||
} VXBaseSymbolResolverContext;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Releases a symbol resolver.
 | 
					 | 
				
			||||||
 * @param   ctx The context of the symbol resolver to free.
 | 
					 | 
				
			||||||
 * The context may no longer used after it was released.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXBaseSymbolResolver_Release(
 | 
					 | 
				
			||||||
    VXBaseSymbolResolverContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Resolves a symbol.
 | 
					 | 
				
			||||||
 * @param   ctx     The symbol resolver context.
 | 
					 | 
				
			||||||
 * @param   info    The instruction info.
 | 
					 | 
				
			||||||
 * @param   address The address.
 | 
					 | 
				
			||||||
 * @param   offset  Pointer to an unsigned 64 bit integer that receives an offset relative to 
 | 
					 | 
				
			||||||
 *                  the base address of the symbol.
 | 
					 | 
				
			||||||
 * @return  The name of the symbol if the symbol was found, else @c NULL.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT const char* VXBaseSymbolResolver_ResolveSymbol(
 | 
					 | 
				
			||||||
    VXBaseSymbolResolverContext *ctx,
 | 
					 | 
				
			||||||
    const VXInstructionInfo *info, 
 | 
					 | 
				
			||||||
    uint64_t address, 
 | 
					 | 
				
			||||||
    uint64_t *offset);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* VXCustomSymbolResolver ====================================================================== */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef const char* (*VXCustomSymbolResolver_ResolveSymbolCallback)(
 | 
					 | 
				
			||||||
    const VXInstructionInfo *info, 
 | 
					 | 
				
			||||||
    uint64_t address, 
 | 
					 | 
				
			||||||
    uint64_t *offset,
 | 
					 | 
				
			||||||
    void *userData);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Creates a custom symbol resolver.
 | 
					 | 
				
			||||||
 * @param   resolverCb  The resolver callback consulted when symbols need to be resolved.
 | 
					 | 
				
			||||||
 * @param   userData    A pointer to arbitrary data passed to the resolver callback.
 | 
					 | 
				
			||||||
 *                      May also be @c NULL.
 | 
					 | 
				
			||||||
 * @return  @c NULL if it fails, else a symbol resolver context.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT VXBaseSymbolResolverContext* VXCustomSymbolResolver_Create(
 | 
					 | 
				
			||||||
    VXCustomSymbolResolver_ResolveSymbolCallback resolverCb,
 | 
					 | 
				
			||||||
    void *userData);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* VXBaseInstructionFormatter ================================================================== */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _VXBaseInstructionFormatterContext
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    VXContextDescriptor d;
 | 
					 | 
				
			||||||
} VXBaseInstructionFormatterContext;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Formats a decoded instruction.
 | 
					 | 
				
			||||||
 * @param   ctx     The instruction formatter context.
 | 
					 | 
				
			||||||
 * @param   info    The instruction info.
 | 
					 | 
				
			||||||
 * @return  Pointer to the formatted instruction string. This pointer remains valid until 
 | 
					 | 
				
			||||||
 *          this function is called again or the context is released.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT const char* VXBaseInstructionFormatter_FormatInstruction(
 | 
					 | 
				
			||||||
    VXBaseInstructionFormatterContext *ctx,
 | 
					 | 
				
			||||||
    const VXInstructionInfo *info);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Returns a pointer to the current symbol resolver.
 | 
					 | 
				
			||||||
 * @param   ctx     The instruction formatter context.
 | 
					 | 
				
			||||||
 * @return  Pointer to the current symbol resolver or @c NULL if no symbol resolver is used.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT VXBaseSymbolResolverContext* VXBaseInstructionFormatter_GetSymbolResolver(
 | 
					 | 
				
			||||||
    const VXBaseInstructionFormatterContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Sets a new symbol resolver.
 | 
					 | 
				
			||||||
 * @param   ctx             The instruction formatter context.
 | 
					 | 
				
			||||||
 * @param   symbolResolver  Pointer to a symbol resolver instance or @c NULL, if no smybol
 | 
					 | 
				
			||||||
 *                          resolver should be used.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXBaseInstructionFormatter_SetSymbolResolver(
 | 
					 | 
				
			||||||
    VXBaseInstructionFormatterContext *ctx,
 | 
					 | 
				
			||||||
    VXBaseSymbolResolverContext *resolver);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Releases an instruction formatter.
 | 
					 | 
				
			||||||
 * @param   ctx The context of the instruction formatter to release.
 | 
					 | 
				
			||||||
 * The context may no longer used after it has been released.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT void VXBaseInstructionFormatter_Release(
 | 
					 | 
				
			||||||
    VXBaseInstructionFormatterContext *ctx);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* VXIntelInstructionFormatter ================================================================ */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Creates an Intel-syntax instruction formatter.
 | 
					 | 
				
			||||||
 * @return  @c NULL if it fails, else an Intel instruction formatter context.
 | 
					 | 
				
			||||||
 * @see     VXBaseInstructionFormatter_Release
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_Create(void);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Creates an Intel-syntax instruction formatter.
 | 
					 | 
				
			||||||
 * @param   resolver The symbol resolver consulted to resolve symbols on formatting.
 | 
					 | 
				
			||||||
 * @return  @c NULL if it fails, else an Intel instruction formatter context.
 | 
					 | 
				
			||||||
 * @see     VXBaseInstructionFormatter_Release
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
VX_EXPORT VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CreateEx(
 | 
					 | 
				
			||||||
    VXBaseSymbolResolverContext *resolver);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* ============================================================================================= */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _VDE_VXINSTRUCTIONFORMATTERC_H_ */
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -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   : athre0z
 | 
					  Modifications   :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Last change     : 04. February 2015
 | 
					  Last change     : 29. October 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
 | 
				
			||||||
| 
						 | 
					@ -30,12 +30,9 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _VDE_VXDISASSEMBLERC_H_
 | 
					#pragma once
 | 
				
			||||||
#define _VDE_VXDISASSEMBLERC_H_
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "VXDisassemblerTypesC.h"
 | 
					#include "VXDisassemblerTypes.hpp"
 | 
				
			||||||
#include "VXInstructionDecoderC.h"
 | 
					#include "VXInstructionDecoder.hpp"
 | 
				
			||||||
#include "VXInstructionFormatterC.h"
 | 
					#include "VXInstructionFormatter.hpp"
 | 
				
			||||||
#include "VXDisassemblerUtilsC.h"
 | 
					#include "VXDisassemblerUtils.hpp"
 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _VDE_VXDISASSEMBLERC_H_ */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -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   : athre0z
 | 
					  Modifications   :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Last change     : 04. February 2015
 | 
					  Last change     : 22. October 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
 | 
				
			||||||
| 
						 | 
					@ -29,23 +29,18 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
#ifndef _VDE_VXDISASSEMBLERTYPESC_H_
 | 
					 | 
				
			||||||
#define _VDE_VXDISASSEMBLERTYPESC_H_
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include "VXOpcodeTable.hpp"
 | 
				
			||||||
#include "VXOpcodeTableC.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					namespace Verteron
 | 
				
			||||||
extern "C"
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent additional flags of a decoded instruction.
 | 
					 * @brief   Values that represent additional flags of a decoded instruction.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef enum _VXInstructionFlags /* : uint32_t */
 | 
					enum InstructionFlags : uint32_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    IF_NONE                         = 0x00000000,
 | 
					    IF_NONE                         = 0x00000000,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
| 
						 | 
					@ -127,157 +122,149 @@ typedef enum _VXInstructionFlags /* : uint32_t */
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   An error occured while decoding the instruction operands.  
 | 
					     * @brief   An error occured while decoding the instruction operands.  
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    IF_ERROR_OPERAND                = 0x01000000,
 | 
					    IF_ERROR_OPERAND                = 0x01000000
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
    IF_FORCE_DWORD                  = 0x7FFFFFFF
 | 
					 | 
				
			||||||
} VXInstructionFlags;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent a cpu register.
 | 
					 * @brief   Values that represent a cpu register.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef enum _VXRegister /* : uint16_t */
 | 
					enum class VXRegister : uint16_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    REG_NONE,
 | 
					    NONE,
 | 
				
			||||||
    /* 8 bit general purpose registers */
 | 
					    /* 8 bit general purpose registers */
 | 
				
			||||||
    REG_AL,     REG_CL,     REG_DL,     REG_BL,
 | 
					    AL,     CL,     DL,     BL,
 | 
				
			||||||
    REG_AH,     REG_CH,     REG_DH,     REG_BH,
 | 
					    AH,     CH,     DH,     BH,
 | 
				
			||||||
    REG_SPL,    REG_BPL,    REG_SIL,    REG_DIL,
 | 
					    SPL,    BPL,    SIL,    DIL,
 | 
				
			||||||
    REG_R8B,    REG_R9B,    REG_R10B,   REG_R11B,
 | 
					    R8B,    R9B,    R10B,   R11B,
 | 
				
			||||||
    REG_R12B,   REG_R13B,   REG_R14B,   REG_R15B,
 | 
					    R12B,   R13B,   R14B,   R15B,
 | 
				
			||||||
    /* 16 bit general purpose registers */
 | 
					    /* 16 bit general purpose registers */
 | 
				
			||||||
    REG_AX,     REG_CX,     REG_DX,     REG_BX,
 | 
					    AX,     CX,     DX,     BX,
 | 
				
			||||||
    REG_SP,     REG_BP,     REG_SI,     REG_DI,
 | 
					    SP,     BP,     SI,     DI,
 | 
				
			||||||
    REG_R8W,    REG_R9W,    REG_R10W,   REG_R11W,
 | 
					    R8W,    R9W,    R10W,   R11W,
 | 
				
			||||||
    REG_R12W,   REG_R13W,   REG_R14W,   REG_R15W,
 | 
					    R12W,   R13W,   R14W,   R15W,
 | 
				
			||||||
    /* 32 bit general purpose registers */
 | 
					    /* 32 bit general purpose registers */
 | 
				
			||||||
    REG_EAX,    REG_ECX,    REG_EDX,    REG_EBX,
 | 
					    EAX,    ECX,    EDX,    EBX,
 | 
				
			||||||
    REG_ESP,    REG_EBP,    REG_ESI,    REG_EDI,
 | 
					    ESP,    EBP,    ESI,    EDI,
 | 
				
			||||||
    REG_R8D,    REG_R9D,    REG_R10D,   REG_R11D,
 | 
					    R8D,    R9D,    R10D,   R11D,
 | 
				
			||||||
    REG_R12D,   REG_R13D,   REG_R14D,   REG_R15D,
 | 
					    R12D,   R13D,   R14D,   R15D,
 | 
				
			||||||
    /* 64 bit general purpose registers */
 | 
					    /* 64 bit general purpose registers */
 | 
				
			||||||
    REG_RAX,    REG_RCX,    REG_RDX,    REG_RBX,
 | 
					    RAX,    RCX,    RDX,    RBX,
 | 
				
			||||||
    REG_RSP,    REG_RBP,    REG_RSI,    REG_RDI,
 | 
					    RSP,    RBP,    RSI,    RDI,
 | 
				
			||||||
    REG_R8,     REG_R9,     REG_R10,    REG_R11,
 | 
					    R8,     R9,     R10,    R11,
 | 
				
			||||||
    REG_R12,    REG_R13,    REG_R14,    REG_R15,
 | 
					    R12,    R13,    R14,    R15,
 | 
				
			||||||
    /* segment registers */
 | 
					    /* segment registers */
 | 
				
			||||||
    REG_ES,     REG_CS,     REG_SS,     
 | 
					    ES,     CS,     SS,     
 | 
				
			||||||
    REG_DS,     REG_FS,     REG_GS,
 | 
					    DS,     FS,     GS,
 | 
				
			||||||
    /* control registers */
 | 
					    /* control registers */
 | 
				
			||||||
    REG_CR0,    REG_CR1,    REG_CR2,    REG_CR3,
 | 
					    CR0,    CR1,    CR2,    CR3,
 | 
				
			||||||
    REG_CR4,    REG_CR5,    REG_CR6,    REG_CR7,
 | 
					    CR4,    CR5,    CR6,    CR7,
 | 
				
			||||||
    REG_CR8,    REG_CR9,    REG_CR10,   REG_CR11,
 | 
					    CR8,    CR9,    CR10,   CR11,
 | 
				
			||||||
    REG_CR12,   REG_CR13,   REG_CR14,   REG_CR15,
 | 
					    CR12,   CR13,   CR14,   CR15,
 | 
				
			||||||
    /* debug registers */
 | 
					    /* debug registers */
 | 
				
			||||||
    REG_DR0,    REG_DR1,    REG_DR2,    REG_DR3,
 | 
					    DR0,    DR1,    DR2,    DR3,
 | 
				
			||||||
    REG_DR4,    REG_DR5,    REG_DR6,    REG_DR7,
 | 
					    DR4,    DR5,    DR6,    DR7,
 | 
				
			||||||
    REG_DR8,    REG_DR9,    REG_DR10,   REG_DR11,
 | 
					    DR8,    DR9,    DR10,   DR11,
 | 
				
			||||||
    REG_DR12,   REG_DR13,   REG_DR14,   REG_DR15,
 | 
					    DR12,   DR13,   DR14,   DR15,
 | 
				
			||||||
    /* mmx registers */
 | 
					    /* mmx registers */
 | 
				
			||||||
    REG_MM0,    REG_MM1,    REG_MM2,    REG_MM3,
 | 
					    MM0,    MM1,    MM2,    MM3,
 | 
				
			||||||
    REG_MM4,    REG_MM5,    REG_MM6,    REG_MM7,
 | 
					    MM4,    MM5,    MM6,    MM7,
 | 
				
			||||||
    /* x87 registers */
 | 
					    /* x87 registers */
 | 
				
			||||||
    REG_ST0,    REG_ST1,    REG_ST2,    REG_ST3,
 | 
					    ST0,    ST1,    ST2,    ST3,
 | 
				
			||||||
    REG_ST4,    REG_ST5,    REG_ST6,    REG_ST7,
 | 
					    ST4,    ST5,    ST6,    ST7,
 | 
				
			||||||
    /* extended multimedia registers */
 | 
					    /* extended multimedia registers */
 | 
				
			||||||
    REG_XMM0,   REG_XMM1,   REG_XMM2,   REG_XMM3,
 | 
					    XMM0,   XMM1,   XMM2,   XMM3,
 | 
				
			||||||
    REG_XMM4,   REG_XMM5,   REG_XMM6,   REG_XMM7,
 | 
					    XMM4,   XMM5,   XMM6,   XMM7,
 | 
				
			||||||
    REG_XMM8,   REG_XMM9,   REG_XMM10,  REG_XMM11,
 | 
					    XMM8,   XMM9,   XMM10,  XMM11,
 | 
				
			||||||
    REG_XMM12,  REG_XMM13,  REG_XMM14,  REG_XMM15,
 | 
					    XMM12,  XMM13,  XMM14,  XMM15,
 | 
				
			||||||
    /* 256 bit multimedia registers */
 | 
					    /* 256 bit multimedia registers */
 | 
				
			||||||
    REG_YMM0,   REG_YMM1,   REG_YMM2,   REG_YMM3,
 | 
					    YMM0,   YMM1,   YMM2,   YMM3,
 | 
				
			||||||
    REG_YMM4,   REG_YMM5,   REG_YMM6,   REG_YMM7,
 | 
					    YMM4,   YMM5,   YMM6,   YMM7,
 | 
				
			||||||
    REG_YMM8,   REG_YMM9,   REG_YMM10,  REG_YMM11,
 | 
					    YMM8,   YMM9,   YMM10,  YMM11,
 | 
				
			||||||
    REG_YMM12,  REG_YMM13,  REG_YMM14,  YMM15,
 | 
					    YMM12,  YMM13,  YMM14,  YMM15,
 | 
				
			||||||
    /* instruction pointer register */
 | 
					    /* instruction pointer register */
 | 
				
			||||||
    REG_RIP,
 | 
					    RIP
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
    REG_FORCE_WORD = 0x7FFF
 | 
					 | 
				
			||||||
} VXRegister;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent the type of a decoded operand.
 | 
					 * @brief   Values that represent the type of a decoded operand.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef enum _VXOperandType /*: uint8_t*/
 | 
					enum class VXOperandType : uint8_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is not used.
 | 
					     * @brief   The operand is not used.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPTYPE_NONE,
 | 
					    NONE,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a register operand.
 | 
					     * @brief   The operand is a register operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPTYPE_REGISTER,
 | 
					    REGISTER,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a memory operand.
 | 
					     * @brief   The operand is a memory operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPTYPE_MEMORY,
 | 
					    MEMORY,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a pointer operand.
 | 
					     * @brief   The operand is a pointer operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPTYPE_POINTER,
 | 
					    POINTER,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is an immediate operand.
 | 
					     * @brief   The operand is an immediate operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPTYPE_IMMEDIATE,
 | 
					    IMMEDIATE,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a relative immediate operand.
 | 
					     * @brief   The operand is a relative immediate operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPTYPE_REL_IMMEDIATE,
 | 
					    REL_IMMEDIATE,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a constant value.
 | 
					     * @brief   The operand is a constant value.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPTYPE_CONSTANT
 | 
					    CONSTANT
 | 
				
			||||||
} VXOperandType;
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent the operand access mode.
 | 
					 * @brief   Values that represent the operand access mode.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef enum _VXOperandAccessMode /* : uint8_t */
 | 
					enum class VXOperandAccessMode : uint8_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    OPACCESSMODE_NA,
 | 
					    NA,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is accessed in read-only mode.
 | 
					     * @brief   The operand is accessed in read-only mode.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPACCESSMODE_READ,
 | 
					    READ,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is accessed in write mode.
 | 
					     * @brief   The operand is accessed in write mode.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPACCESSMODE_WRITE,
 | 
					    WRITE,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is accessed in read-write mode.
 | 
					     * @brief   The operand is accessed in read-write mode.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    OPACCESSMODE_READWRITE
 | 
					    READWRITE
 | 
				
			||||||
} VXOperandAccessMode;
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   This struct holds information about a decoded operand.
 | 
					 * @brief   This struct holds information about a decoded operand.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef struct _VXOperandInfo
 | 
					struct VXOperandInfo
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The type of the operand.
 | 
					     * @brief   The type of the operand.
 | 
				
			||||||
     * @see     VXOperandType
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint8_t type;
 | 
					    VXOperandType type;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The size of the operand.
 | 
					     * @brief   The size of the operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint16_t size;
 | 
					    uint16_t size;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand access mode.
 | 
					     * @brief   The operand access mode.
 | 
				
			||||||
     * @see     VXOperandAccessMode
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint8_t access_mode;
 | 
					    VXOperandAccessMode access_mode;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The base register.
 | 
					     * @brief   The base register.
 | 
				
			||||||
     * @see     VXRegister
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint16_t base;
 | 
					    VXRegister base;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The index register.
 | 
					     * @brief   The index register.
 | 
				
			||||||
     * @see     VXRegister
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint16_t index;
 | 
					    VXRegister index;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The scale factor.
 | 
					     * @brief   The scale factor.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
| 
						 | 
					@ -308,12 +295,12 @@ typedef struct _VXOperandInfo
 | 
				
			||||||
            uint32_t off;
 | 
					            uint32_t off;
 | 
				
			||||||
        } ptr;
 | 
					        } ptr;
 | 
				
			||||||
    } lval;   
 | 
					    } lval;   
 | 
				
			||||||
} VXOperandInfo;
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   This struct holds information about a decoded instruction.
 | 
					 * @brief   This struct holds information about a decoded instruction.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef struct _VXInstructionInfo
 | 
					struct VXInstructionInfo
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The instruction flags.
 | 
					     * @brief   The instruction flags.
 | 
				
			||||||
| 
						 | 
					@ -321,9 +308,8 @@ typedef struct _VXInstructionInfo
 | 
				
			||||||
    uint32_t flags;
 | 
					    uint32_t flags;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The instruction mnemonic.
 | 
					     * @brief   The instruction mnemonic.
 | 
				
			||||||
     * @see     VXInstructionMnemonic
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint16_t mnemonic;
 | 
					    VXInstructionMnemonic mnemonic;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The total length of the instruction.
 | 
					     * @brief   The total length of the instruction.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
| 
						 | 
					@ -355,9 +341,8 @@ typedef struct _VXInstructionInfo
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The segment register. This value will default to @c NONE, if no segment register 
 | 
					     * @brief   The segment register. This value will default to @c NONE, if no segment register 
 | 
				
			||||||
     *          prefix is present.
 | 
					     *          prefix is present.
 | 
				
			||||||
     * @see     VXRegister
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint16_t segment;
 | 
					    VXRegister segment;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The rex prefix byte.
 | 
					     * @brief   The rex prefix byte.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
| 
						 | 
					@ -539,10 +524,6 @@ typedef struct _VXInstructionInfo
 | 
				
			||||||
     *          This field is used to properly format relative instructions.         
 | 
					     *          This field is used to properly format relative instructions.         
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint64_t instrPointer;
 | 
					    uint64_t instrPointer;
 | 
				
			||||||
} VXInstructionInfo;
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _VDE_VXDISASSEMBLERTYPESC_H_ */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#include "VXDisassemblerUtils.h"
 | 
					#include "VXDisassemblerUtils.hpp"
 | 
				
			||||||
#include <cassert>
 | 
					#include <cassert>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Verteron
 | 
					namespace Verteron
 | 
				
			||||||
| 
						 | 
					@ -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   : athre0z
 | 
					  Modifications   :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Last change     : 04. February 2015
 | 
					  Last change     : 30. October 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
 | 
				
			||||||
| 
						 | 
					@ -29,26 +29,13 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
#ifndef _VDE_VXDISASSEMBLERUTILSC_H_
 | 
					 | 
				
			||||||
#define _VDE_VXDISASSEMBLERUTILSC_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "VXDisassemblerTypesC.h"
 | 
					 | 
				
			||||||
#include "VXInternalConfig.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include "VXDisassemblerTypes.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Verteron
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C"
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _VXContextDescriptor
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    uint8_t type;
 | 
					 | 
				
			||||||
    void *ptr;
 | 
					 | 
				
			||||||
} VXContextDescriptor;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Calculates the absolute target address of a relative instruction operand.
 | 
					 * @brief   Calculates the absolute target address of a relative instruction operand.
 | 
				
			||||||
| 
						 | 
					@ -56,12 +43,6 @@ typedef struct _VXContextDescriptor
 | 
				
			||||||
 * @param   operand The operand.
 | 
					 * @param   operand The operand.
 | 
				
			||||||
 * @return  The absolute target address.
 | 
					 * @return  The absolute target address.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
VX_EXPORT uint64_t VXCalcAbsoluteTarget(
 | 
					uint64_t VDECalcAbsoluteTarget(const VXInstructionInfo &info, const VXOperandInfo &operand);
 | 
				
			||||||
    const VXInstructionInfo *info, 
 | 
					 | 
				
			||||||
    const VXOperandInfo *operand);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _VDE_VXDISASSEMBLERUTILSC_H_ */
 | 
					 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#include "VXInstructionDecoder.h"
 | 
					#include "VXInstructionDecoder.hpp"
 | 
				
			||||||
#include <cstring>
 | 
					#include <cstring>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Verteron
 | 
					namespace Verteron
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,718 @@
 | 
				
			||||||
 | 
					/**************************************************************************************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Verteron Disassembler Engine
 | 
				
			||||||
 | 
					  Version 1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Remarks         : Freeware, Copyright must be included
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Original Author : Florian Bernd
 | 
				
			||||||
 | 
					  Modifications   :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Last change     : 29. October 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
 | 
				
			||||||
 | 
					 * 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <type_traits>
 | 
				
			||||||
 | 
					#include <istream>
 | 
				
			||||||
 | 
					#include "VXDisassemblerTypes.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Verteron
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   The base class for all data-source implementations.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class VXBaseDataSource 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    uint8_t m_currentInput;
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Override this method in your custom data source implementations.
 | 
				
			||||||
 | 
					     *          Reads the next byte from the data source. This method increases the current
 | 
				
			||||||
 | 
					     *          input position by one.  
 | 
				
			||||||
 | 
					     * @return  The current input byte.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual uint8_t internalInputPeek() = 0;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Override this method in your custom data source implementations.
 | 
				
			||||||
 | 
					     *          Reads the next byte from the data source. This method does NOT increase the 
 | 
				
			||||||
 | 
					     *          current input position.
 | 
				
			||||||
 | 
					     * @return  The current input byte.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual uint8_t internalInputNext() = 0;
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Default constructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXBaseDataSource() { };
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Destructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual ~VXBaseDataSource() { };
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte from the data source. This method does NOT increase the 
 | 
				
			||||||
 | 
					     *          current input position or the @c length field of the @c info parameter. 
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @return  The current input byte. If the result is zero, you should always check the 
 | 
				
			||||||
 | 
					     *          @c flags field of the @c info parameter for error flags.
 | 
				
			||||||
 | 
					     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t inputPeek(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte from the data source. This method increases the current
 | 
				
			||||||
 | 
					     *          input position and the @c length field of the @c info parameter. 
 | 
				
			||||||
 | 
					     *          This method also appends the new byte to to @c data field of the @c info 
 | 
				
			||||||
 | 
					     *          parameter.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @return  The current input byte. If the result is zero, you should always check the 
 | 
				
			||||||
 | 
					     *          @c flags field of the @c info parameter for error flags.
 | 
				
			||||||
 | 
					     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t inputNext(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte(s) from the data source. This method increases the current
 | 
				
			||||||
 | 
					     *          input position and the @c length field of the @c info parameter. 
 | 
				
			||||||
 | 
					     *          This method also appends the new byte(s) to to @c data field of the @c info 
 | 
				
			||||||
 | 
					     *          parameter.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @return  The current input data. If the result is zero, you should always check the 
 | 
				
			||||||
 | 
					     *          @c flags field of the @c info parameter for error flags.
 | 
				
			||||||
 | 
					     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    template <typename T>
 | 
				
			||||||
 | 
					    T inputNext(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the current input byte. The current input byte is set everytime the 
 | 
				
			||||||
 | 
					     *          @c inputPeek or @c inputNext method is called.
 | 
				
			||||||
 | 
					     * @return  The current input byte.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t inputCurrent() const;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Override this method in your custom data source implementations.
 | 
				
			||||||
 | 
					     *          Signals, if the end of the data source is reached.
 | 
				
			||||||
 | 
					     * @return  True if end of input, false if not.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual bool isEndOfInput() const = 0;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Override this method in your custom data source implementations.
 | 
				
			||||||
 | 
					     *          Returns the current input position.
 | 
				
			||||||
 | 
					     * @return  The current input position.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual uint64_t getPosition() const = 0;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Override this method in your custom data source implementations.
 | 
				
			||||||
 | 
					     *          Sets a new input position.
 | 
				
			||||||
 | 
					     * @param   position    The new input position.
 | 
				
			||||||
 | 
					     * @return  Returns false, if the new position exceeds the maximum input length.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual bool setPosition(uint64_t position) = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXBaseDataSource::inputPeek(VXInstructionInfo &info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (info.length == 15)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        info.flags |= IF_ERROR_LENGTH;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (isEndOfInput())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    m_currentInput = internalInputPeek();
 | 
				
			||||||
 | 
					    return m_currentInput;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXBaseDataSource::inputNext(VXInstructionInfo &info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (info.length == 15)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        info.flags |= IF_ERROR_LENGTH;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (isEndOfInput())
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    m_currentInput = internalInputNext();
 | 
				
			||||||
 | 
					    info.data[info.length] = m_currentInput;
 | 
				
			||||||
 | 
					    info.length++;
 | 
				
			||||||
 | 
					    return m_currentInput;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					inline T VXBaseDataSource::inputNext(VXInstructionInfo &info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    static_assert(std::is_integral<T>::value, "integral type required");
 | 
				
			||||||
 | 
					    T result = 0;
 | 
				
			||||||
 | 
					    for (unsigned i = 0; i < (sizeof(T) / sizeof(uint8_t)); ++i)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        T b = inputNext(info);
 | 
				
			||||||
 | 
					        if (!b && (info.flags & IF_ERROR_MASK))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        result |= (b << (i * 8));   
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXBaseDataSource::inputCurrent() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_currentInput;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   A memory-buffer based data source for the @c VXInstructionDecoder class.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class VXMemoryDataSource : public VXBaseDataSource
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    const void *m_inputBuffer;
 | 
				
			||||||
 | 
					    uint64_t    m_inputBufferLen;
 | 
				
			||||||
 | 
					    uint64_t    m_inputBufferPos;
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte from the data source. This method increases the current
 | 
				
			||||||
 | 
					     *          input position by one.  
 | 
				
			||||||
 | 
					     * @return  The current input byte.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t internalInputPeek() override;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte from the data source. This method does NOT increase the 
 | 
				
			||||||
 | 
					     *          current input position.
 | 
				
			||||||
 | 
					     * @return  The current input byte.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t internalInputNext() override;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Constructor.
 | 
				
			||||||
 | 
					     * @param   buffer      The input buffer.
 | 
				
			||||||
 | 
					     * @param   bufferLen   The length of the input buffer.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXMemoryDataSource(const void* buffer, size_t bufferLen)
 | 
				
			||||||
 | 
					        : m_inputBuffer(buffer)
 | 
				
			||||||
 | 
					        , m_inputBufferLen(bufferLen)
 | 
				
			||||||
 | 
					        , m_inputBufferPos(0) { };
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Signals, if the end of the data source is reached.
 | 
				
			||||||
 | 
					     * @return  True if end of input, false if not.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool isEndOfInput() const override;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the current input position.
 | 
				
			||||||
 | 
					     * @return  The current input position.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint64_t getPosition() const override;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Sets a new input position.
 | 
				
			||||||
 | 
					     * @param   position    The new input position.
 | 
				
			||||||
 | 
					     * @return  Returns false, if the new position exceeds the maximum input length.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool setPosition(uint64_t position) override;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXMemoryDataSource::internalInputPeek()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return *(static_cast<const uint8_t*>(m_inputBuffer) + m_inputBufferPos);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXMemoryDataSource::internalInputNext()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ++m_inputBufferPos;
 | 
				
			||||||
 | 
					    return *(static_cast<const uint8_t*>(m_inputBuffer) + m_inputBufferPos - 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline bool VXMemoryDataSource::isEndOfInput() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return (m_inputBufferPos >= m_inputBufferLen);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint64_t VXMemoryDataSource::getPosition() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_inputBufferPos;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline bool VXMemoryDataSource::setPosition(uint64_t position)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_inputBufferPos = position;
 | 
				
			||||||
 | 
					    return isEndOfInput();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   A stream based data source for the @c VXInstructionDecoder class.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class VXStreamDataSource : public VXBaseDataSource
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    std::istream *m_inputStream;
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte from the data source. This method increases the current
 | 
				
			||||||
 | 
					     *          input position by one.  
 | 
				
			||||||
 | 
					     * @return  The current input byte.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t internalInputPeek() override;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte from the data source. This method does NOT increase the 
 | 
				
			||||||
 | 
					     *          current input position.
 | 
				
			||||||
 | 
					     * @return  The current input byte.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t internalInputNext() override;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Constructor.
 | 
				
			||||||
 | 
					     * @param   stream  The input stream.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    explicit VXStreamDataSource(std::istream *stream)
 | 
				
			||||||
 | 
					        : m_inputStream(stream) { };
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Signals, if the end of the data source is reached.
 | 
				
			||||||
 | 
					     * @return  True if end of input, false if not.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool isEndOfInput() const override;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the current input position.
 | 
				
			||||||
 | 
					     * @return  The current input position.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint64_t getPosition() const override;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Sets a new input position.
 | 
				
			||||||
 | 
					     * @param   position    The new input position.
 | 
				
			||||||
 | 
					     * @return  Returns false, if the new position exceeds the maximum input length.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool setPosition(uint64_t position) override;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXStreamDataSource::internalInputPeek()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_inputStream)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_inputStream->peek();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXStreamDataSource::internalInputNext()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_inputStream)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_inputStream->get();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline bool VXStreamDataSource::isEndOfInput() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_inputStream)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // We use good() instead of eof() to make sure the decoding will fail, if an stream internal
 | 
				
			||||||
 | 
					    // error occured.
 | 
				
			||||||
 | 
					    return !m_inputStream->good();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint64_t VXStreamDataSource::getPosition() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_inputStream)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_inputStream->tellg();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline bool VXStreamDataSource::setPosition(uint64_t position)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_inputStream)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    m_inputStream->seekg(position);
 | 
				
			||||||
 | 
					    return isEndOfInput();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Values that represent a disassembler mode.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum class VXDisassemblerMode : uint8_t
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    M16BIT,
 | 
				
			||||||
 | 
					    M32BIT,
 | 
				
			||||||
 | 
					    M64BIT
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Values that represent an instruction-set vendor.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					enum class VXInstructionSetVendor : uint8_t
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ANY,
 | 
				
			||||||
 | 
					    INTEL,
 | 
				
			||||||
 | 
					    AMD
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   The @c VXInstructionDecoder class decodes x86/x86-64 assembly instructions from a 
 | 
				
			||||||
 | 
					 *          given data source.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class VXInstructionDecoder
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    enum class RegisterClass : uint8_t
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        GENERAL_PURPOSE,
 | 
				
			||||||
 | 
					        MMX,
 | 
				
			||||||
 | 
					        CONTROL,
 | 
				
			||||||
 | 
					        DEBUG,
 | 
				
			||||||
 | 
					        SEGMENT,
 | 
				
			||||||
 | 
					        XMM
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    VXBaseDataSource      *m_dataSource;
 | 
				
			||||||
 | 
					    VXDisassemblerMode     m_disassemblerMode;
 | 
				
			||||||
 | 
					    VXInstructionSetVendor m_preferredVendor;
 | 
				
			||||||
 | 
					    uint64_t               m_instructionPointer;
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte from the data source. This method does NOT increase the 
 | 
				
			||||||
 | 
					     *          current input position or the @c length field of the @c info parameter. 
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @return  The current input byte. If the result is zero, you should always check the 
 | 
				
			||||||
 | 
					     *          @c flags field of the @c info parameter for error flags.
 | 
				
			||||||
 | 
					     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t inputPeek(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte from the data source. This method increases the current
 | 
				
			||||||
 | 
					     *          input position and the @c length field of the @info parameter. 
 | 
				
			||||||
 | 
					     *          This method also appends the new byte to to @c data field of the @c info 
 | 
				
			||||||
 | 
					     *          parameter.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @return  The current input byte. If the result is zero, you should always check the 
 | 
				
			||||||
 | 
					     *          @c flags field of the @c info parameter for error flags.
 | 
				
			||||||
 | 
					     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t inputNext(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Reads the next byte(s) from the data source. This method increases the current
 | 
				
			||||||
 | 
					     *          input position and the @c length field of the @info parameter. 
 | 
				
			||||||
 | 
					     *          This method also appends the new byte(s) to to @c data field of the @c info 
 | 
				
			||||||
 | 
					     *          parameter.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @return  The current input data. If the result is zero, you should always check the 
 | 
				
			||||||
 | 
					     *          @c flags field of the @c info parameter for error flags.
 | 
				
			||||||
 | 
					     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    template <typename T>
 | 
				
			||||||
 | 
					    T inputNext(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the current input byte. The current input byte is set everytime the 
 | 
				
			||||||
 | 
					     *          @c inputPeek or @c inputNext method is called.
 | 
				
			||||||
 | 
					     * @return  The current input byte.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint8_t inputCurrent() const;
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes a register operand.
 | 
				
			||||||
 | 
					     * @param   info            The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand         The @c VXOperandInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @param   registerClass   The register class to use.
 | 
				
			||||||
 | 
					     * @param   registerId      The register id.
 | 
				
			||||||
 | 
					     * @param   operandSize     The defined size of the operand.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeRegisterOperand(VXInstructionInfo &info, VXOperandInfo &operand, 
 | 
				
			||||||
 | 
					        RegisterClass registerClass, uint8_t registerId, VXDefinedOperandSize operandSize) const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes a register/memory operand.
 | 
				
			||||||
 | 
					     * @param   info            The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand         The @c VXOperandInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @param   registerClass   The register class to use.
 | 
				
			||||||
 | 
					     * @param   operandSize     The defined size of the operand.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeRegisterMemoryOperand(VXInstructionInfo &info, VXOperandInfo &operand,
 | 
				
			||||||
 | 
					        RegisterClass registerClass, VXDefinedOperandSize operandSize);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes an immediate operand.
 | 
				
			||||||
 | 
					     * @param   info        The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand     The @c VXOperandInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @param   operandSize The defined size of the operand.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeImmediate(VXInstructionInfo &info, VXOperandInfo &operand, 
 | 
				
			||||||
 | 
					        VXDefinedOperandSize operandSize);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes a displacement operand.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand The @c VXOperandInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @param   size    The size of the displacement data.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeDisplacement(VXInstructionInfo &info, VXOperandInfo &operand, uint8_t size);
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes the modrm field of the instruction. This method reads an additional 
 | 
				
			||||||
 | 
					     *          input byte.
 | 
				
			||||||
 | 
					     * @param   The @c VXInstructionInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeModrm(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes the sib field of the instruction. This method reads an additional 
 | 
				
			||||||
 | 
					     *          input byte.
 | 
				
			||||||
 | 
					     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeSIB(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes vex prefix of the instruction. This method takes the current input byte
 | 
				
			||||||
 | 
					     *          to determine the vex prefix type and reads one or two additional input bytes
 | 
				
			||||||
 | 
					     *          on demand.
 | 
				
			||||||
 | 
					     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeVex(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the effective operand size.
 | 
				
			||||||
 | 
					     * @param   info        The instruction info.
 | 
				
			||||||
 | 
					     * @param   operandSize The defined operand size.
 | 
				
			||||||
 | 
					     * @return  The effective operand size.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint16_t getEffectiveOperandSize(const VXInstructionInfo &info, 
 | 
				
			||||||
 | 
					        VXDefinedOperandSize operandSize) const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes all instruction operands.
 | 
				
			||||||
 | 
					     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeOperands(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes the specified instruction operand.
 | 
				
			||||||
 | 
					     * @param   info        The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand     The @c VXOperandInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @param   operandType The defined type of the operand.
 | 
				
			||||||
 | 
					     * @param   operandSize The defined size of the operand.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeOperand(VXInstructionInfo &info, VXOperandInfo &operand, 
 | 
				
			||||||
 | 
					        VXDefinedOperandType operandType, VXDefinedOperandSize operandSize);
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Resolves the effective operand and address mode of the instruction.
 | 
				
			||||||
 | 
					     *          This method requires a non-null value in the @c instrDefinition field of the 
 | 
				
			||||||
 | 
					     *          @c info struct.
 | 
				
			||||||
 | 
					     * @param   info    The @c VXInstructionInfo struct that receives the effective operand and
 | 
				
			||||||
 | 
					     *                  address mode.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void resolveOperandAndAddressMode(VXInstructionInfo &info) const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Calculates the effective REX/VEX.w, r, x, b, l values.
 | 
				
			||||||
 | 
					     *          This method requires a non-null value in the @c instrDefinition field of the 
 | 
				
			||||||
 | 
					     *          @c info struct.
 | 
				
			||||||
 | 
					     * @param   info    The @c VXInstructionInfo struct that receives the effective operand and
 | 
				
			||||||
 | 
					     *                  address mode.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void calculateEffectiveRexVexValues(VXInstructionInfo &info) const;
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Collects and decodes optional instruction prefixes.
 | 
				
			||||||
 | 
					     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodePrefixes(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Collects and decodes the instruction opcodes using the opcode tree.
 | 
				
			||||||
 | 
					     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
				
			||||||
 | 
					     * @return  True if it succeeds, false if it fails.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeOpcode(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Default constructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXInstructionDecoder();
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Constructor.
 | 
				
			||||||
 | 
					     * @param   input               A reference to the input data source.
 | 
				
			||||||
 | 
					     * @param   disassemblerMode    The disasasembler mode.                            
 | 
				
			||||||
 | 
					     * @param   preferredVendor     The preferred instruction-set vendor.
 | 
				
			||||||
 | 
					     * @param   instructionPointer  The initial instruction pointer.                            
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    explicit VXInstructionDecoder(VXBaseDataSource *input, 
 | 
				
			||||||
 | 
					        VXDisassemblerMode disassemblerMode = VXDisassemblerMode::M32BIT,
 | 
				
			||||||
 | 
					        VXInstructionSetVendor preferredVendor = VXInstructionSetVendor::ANY, 
 | 
				
			||||||
 | 
					        uint64_t instructionPointer = 0);
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Decodes the next instruction from the input data source.
 | 
				
			||||||
 | 
					     * @param   info    The @c VXInstructionInfo struct that receives the information about the
 | 
				
			||||||
 | 
					     *                  decoded instruction.
 | 
				
			||||||
 | 
					     * @return  This method returns false, if the current position has exceeded the maximum input 
 | 
				
			||||||
 | 
					     *          length.
 | 
				
			||||||
 | 
					     *          In all other cases (valid and invalid instructions) the return value is true.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool decodeInstruction(VXInstructionInfo &info);
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns a pointer to the current data source.
 | 
				
			||||||
 | 
					     * @return  A pointer to the current data source.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXBaseDataSource* getDataSource() const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Sets a new data source.
 | 
				
			||||||
 | 
					     * @param   input   A reference to the new input data source.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void setDataSource(VXBaseDataSource *input);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the current disassembler mode.
 | 
				
			||||||
 | 
					     * @return  The current disassembler mode.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXDisassemblerMode getDisassemblerMode() const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Sets the current disassembler mode.
 | 
				
			||||||
 | 
					     * @param   disassemblerMode    The new disassembler mode.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void setDisassemblerMode(VXDisassemblerMode disassemblerMode);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the preferred instruction-set vendor.
 | 
				
			||||||
 | 
					     * @return  The preferred instruction-set vendor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXInstructionSetVendor getPreferredVendor() const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Sets the preferred instruction-set vendor.
 | 
				
			||||||
 | 
					     * @param   preferredVendor The new preferred instruction-set vendor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void setPreferredVendor(VXInstructionSetVendor preferredVendor);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the current instruction pointer.
 | 
				
			||||||
 | 
					     * @return  The current instruction pointer.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    uint64_t getInstructionPointer() const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Sets a new instruction pointer.
 | 
				
			||||||
 | 
					     * @param   instructionPointer  The new instruction pointer.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void setInstructionPointer(uint64_t instructionPointer);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXInstructionDecoder::inputPeek(VXInstructionInfo &info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_dataSource)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_dataSource->inputPeek(info);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXInstructionDecoder::inputNext(VXInstructionInfo &info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_dataSource)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_dataSource->inputNext(info);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template <typename T>
 | 
				
			||||||
 | 
					inline T VXInstructionDecoder::inputNext(VXInstructionInfo &info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_dataSource)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_dataSource->inputNext<T>(info);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint8_t VXInstructionDecoder::inputCurrent() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!m_dataSource)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_dataSource->inputCurrent();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline VXBaseDataSource* VXInstructionDecoder::getDataSource() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_dataSource;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void VXInstructionDecoder::setDataSource(VXBaseDataSource *input)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_dataSource = input;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline VXDisassemblerMode VXInstructionDecoder::getDisassemblerMode() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_disassemblerMode;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void VXInstructionDecoder::setDisassemblerMode(VXDisassemblerMode disassemblerMode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_disassemblerMode = disassemblerMode;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline VXInstructionSetVendor VXInstructionDecoder::getPreferredVendor() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_preferredVendor;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void VXInstructionDecoder::setPreferredVendor(VXInstructionSetVendor preferredVendor)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_preferredVendor = preferredVendor;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline uint64_t VXInstructionDecoder::getInstructionPointer() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_instructionPointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void VXInstructionDecoder::setInstructionPointer(uint64_t instructionPointer)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_instructionPointer = instructionPointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -29,8 +29,8 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#include "VXInstructionFormatter.h"
 | 
					#include "VXInstructionFormatter.hpp"
 | 
				
			||||||
#include "VXDisassemblerUtils.h"
 | 
					#include "VXDisassemblerUtils.hpp"
 | 
				
			||||||
#include <cstdarg>
 | 
					#include <cstdarg>
 | 
				
			||||||
#include <cctype>
 | 
					#include <cctype>
 | 
				
			||||||
#include <cstring>
 | 
					#include <cstring>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,320 @@
 | 
				
			||||||
 | 
					/**************************************************************************************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Verteron Disassembler Engine
 | 
				
			||||||
 | 
					  Version 1.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Remarks         : Freeware, Copyright must be included
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Original Author : Florian Bernd
 | 
				
			||||||
 | 
					  Modifications   :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Last change     : 22. October 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
 | 
				
			||||||
 | 
					 * 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <unordered_map>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include "VXDisassemblerTypes.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Verteron
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Base class for all symbol resolver implementations.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class VXBaseSymbolResolver
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Destructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual ~VXBaseSymbolResolver();
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Resolves a symbol.
 | 
				
			||||||
 | 
					     * @param   info        The instruction info.
 | 
				
			||||||
 | 
					     * @param   address     The address.
 | 
				
			||||||
 | 
					     * @param   offset      Reference to an unsigned 64 bit integer that receives an offset 
 | 
				
			||||||
 | 
					     *                      relative to the base address of the symbol.
 | 
				
			||||||
 | 
					     * @return  The name of the symbol, if the symbol was found, @c NULL if not.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual const char* resolveSymbol(const VXInstructionInfo &info, uint64_t address, 
 | 
				
			||||||
 | 
					        uint64_t &offset);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Base class for all instruction formatter implementations.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class VXBaseInstructionFormatter
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    static const char    *m_registerStrings[];
 | 
				
			||||||
 | 
					    VXBaseSymbolResolver *m_symbolResolver;
 | 
				
			||||||
 | 
					    std::vector<char>     m_outputBuffer;
 | 
				
			||||||
 | 
					    size_t                m_outputStringLen;
 | 
				
			||||||
 | 
					    bool                  m_outputUppercase;
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Clears the output string buffer.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void outputClear();
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the content of the output string buffer.
 | 
				
			||||||
 | 
					     * @return  Pointer to the content of the ouput string buffer.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    const char* outputString();
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Appends text to the ouput string buffer.
 | 
				
			||||||
 | 
					     * @param   text    The text.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void outputAppend(const char *text);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Appends formatted text to the output string buffer.
 | 
				
			||||||
 | 
					     * @param   format  The format string.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void outputAppendFormatted(const char *format, ...);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Changes automatic conversion of characters to uppercase.
 | 
				
			||||||
 | 
					     * @param   uppercase   Set true to enable automatic uppercase conversion.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void outputSetUppercase(bool uppercase);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Appends a formatted address to the output string buffer.
 | 
				
			||||||
 | 
					     * @param   info            The instruction info.
 | 
				
			||||||
 | 
					     * @param   address         The address.
 | 
				
			||||||
 | 
					     * @param   resolveSymbols  If this parameter is true, the method will try to display a
 | 
				
			||||||
 | 
					     *                          smybol name instead of the numeric value.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void outputAppendAddress(const VXInstructionInfo &info, uint64_t address, 
 | 
				
			||||||
 | 
					        bool resolveSymbols = true);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Appends a formatted immediate value to the output string buffer.
 | 
				
			||||||
 | 
					     * @param   info            The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand         The immediate operand.
 | 
				
			||||||
 | 
					     * @param   resolveSymbols  If this parameter is true, the method will try to display a
 | 
				
			||||||
 | 
					     *                          smybol name instead of the numeric value.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void outputAppendImmediate(const VXInstructionInfo &info, const VXOperandInfo &operand,
 | 
				
			||||||
 | 
					        bool resolveSymbols = false);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Appends a formatted memory displacement value to the output string buffer.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand The memory operand.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void outputAppendDisplacement(const VXInstructionInfo &info, const VXOperandInfo &operand);
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns the string representation of a given register.
 | 
				
			||||||
 | 
					     * @param   reg The register.
 | 
				
			||||||
 | 
					     * @return  The string representation of the given register.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    const char* registerToString(VXRegister reg) const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Resolves a symbol.
 | 
				
			||||||
 | 
					     * @param   info        The instruction info.
 | 
				
			||||||
 | 
					     * @param   address     The address.
 | 
				
			||||||
 | 
					     * @param   offset      Reference to an unsigned 64 bit integer that receives an offset 
 | 
				
			||||||
 | 
					     *                      relative to the base address of the symbol.
 | 
				
			||||||
 | 
					     * @return  The name of the symbol, if the symbol was found, @c NULL if not.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    const char* resolveSymbol(const VXInstructionInfo &info, uint64_t address, 
 | 
				
			||||||
 | 
					        uint64_t &offset) const;
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Override this method to implement a custom disassembly syntax. Use the 
 | 
				
			||||||
 | 
					     *          @c outputAppend and @c outputAppendFormatted methods to fill the internal
 | 
				
			||||||
 | 
					     *          string buffer.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual void internalFormatInstruction(const VXInstructionInfo &info);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Default constructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXBaseInstructionFormatter();
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Constructor.
 | 
				
			||||||
 | 
					     * @param   symbolResolver  Pointer to a symbol resolver instance or @c NULL, if no smybol
 | 
				
			||||||
 | 
					     *                          resolver should be used.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    explicit VXBaseInstructionFormatter(VXBaseSymbolResolver *symbolResolver);
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Destructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual ~VXBaseInstructionFormatter();
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Formats a decoded instruction.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @return  Pointer to the formatted instruction string.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    const char* formatInstruction(const VXInstructionInfo &info);
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Returns a pointer to the current symbol resolver.
 | 
				
			||||||
 | 
					     * @return  Pointer to the current symbol resolver or @c NULL, if no symbol resolver is used.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXBaseSymbolResolver* getSymbolResolver() const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Sets a new symbol resolver.
 | 
				
			||||||
 | 
					     * @param   symbolResolver  Pointer to a symbol resolver instance or @c NULL, if no smybol
 | 
				
			||||||
 | 
					     *                          resolver should be used.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void setSymbolResolver(VXBaseSymbolResolver *symbolResolver);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void VXBaseInstructionFormatter::outputSetUppercase(bool uppercase)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_outputUppercase = uppercase;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline char const* VXBaseInstructionFormatter::registerToString(VXRegister reg) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (reg == VXRegister::NONE)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return "error";   
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return m_registerStrings[static_cast<uint16_t>(reg) - 1]; 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline char const* VXBaseInstructionFormatter::resolveSymbol(const VXInstructionInfo &info, 
 | 
				
			||||||
 | 
					    uint64_t address, uint64_t &offset) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (m_symbolResolver)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return m_symbolResolver->resolveSymbol(info, address, offset);    
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return nullptr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline VXBaseSymbolResolver* VXBaseInstructionFormatter::getSymbolResolver() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return m_symbolResolver;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void VXBaseInstructionFormatter::setSymbolResolver(VXBaseSymbolResolver *symbolResolver)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    m_symbolResolver = symbolResolver;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Intel syntax instruction formatter.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class VXIntelInstructionFormatter : public VXBaseInstructionFormatter
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Appends an operand cast to the output string buffer.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand The operand.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void outputAppendOperandCast(const VXInstructionInfo &info, const VXOperandInfo &operand);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Formats the specified operand and appends the resulting string to the output
 | 
				
			||||||
 | 
					     *          buffer.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     * @param   operand The operand.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void formatOperand(const VXInstructionInfo &info, const VXOperandInfo &operand);
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Fills the internal string buffer with an intel style formatted instruction string.
 | 
				
			||||||
 | 
					     * @param   info    The instruction info.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void internalFormatInstruction(const VXInstructionInfo &info) override;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Default constructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    VXIntelInstructionFormatter();
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Constructor.
 | 
				
			||||||
 | 
					     * @param   symbolResolver  Pointer to a symbol resolver instance or @c NULL, if no smybol
 | 
				
			||||||
 | 
					     *                          resolver should be used.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    explicit VXIntelInstructionFormatter(VXBaseSymbolResolver *symbolResolver);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Destructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ~VXIntelInstructionFormatter() override;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Simple symbol resolver that only matches exact addresses.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class VXExactSymbolResolver : public VXBaseSymbolResolver
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    std::unordered_map<uint64_t, std::string> m_symbolMap;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Destructor.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ~VXExactSymbolResolver() override;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Resolves a symbol.
 | 
				
			||||||
 | 
					     * @param   info        The instruction info.
 | 
				
			||||||
 | 
					     * @param   address     The address.
 | 
				
			||||||
 | 
					     * @param   offset      Reference to an unsigned 64 bit integer that receives an offset 
 | 
				
			||||||
 | 
					     *                      relative to the base address of the symbol.
 | 
				
			||||||
 | 
					     * @return  The name of the symbol, if the symbol was found, @c NULL if not.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    const char* resolveSymbol(const VXInstructionInfo &info, uint64_t address, 
 | 
				
			||||||
 | 
					        uint64_t &offset) override;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Query if the given address is a known symbol.
 | 
				
			||||||
 | 
					     * @param   address The address.
 | 
				
			||||||
 | 
					     * @return  True if the address is known, false if not.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    bool containsSymbol(uint64_t address) const;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Adds or changes a symbol.
 | 
				
			||||||
 | 
					     * @param   address The address.
 | 
				
			||||||
 | 
					     * @param   name    The symbol name.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void setSymbol(uint64_t address, const char* name);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Removes the symbol described by address. This will invalidate all char pointers 
 | 
				
			||||||
 | 
					     *          to the specific symbol name.
 | 
				
			||||||
 | 
					     * @param   address The address.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void removeSymbol(uint64_t address);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @brief   Clears the symbol tree.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void clear();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#include "VXOpcodeTable.h"
 | 
					#include "VXOpcodeTable.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Verteron
 | 
					namespace Verteron
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -2,8 +2,9 @@ cmake_minimum_required(VERSION 2.8.12)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
project(VerteronDisassemblerEngine)
 | 
					project(VerteronDisassemblerEngine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					option(BUILD_SHARED "Build shared libraries rather than static ones" FALSE)
 | 
				
			||||||
option(BUILD_EXAMPLES "Build examples" TRUE)
 | 
					option(BUILD_EXAMPLES "Build examples" TRUE)
 | 
				
			||||||
option(BUILD_C_BINDINGS "Build C bindings" TRUE) # TODO: default to FALSE when ready
 | 
					option(BUILD_CPP_BINDINGS "Build C++ bindings" TRUE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (NOT CONFIGURED_ONCE)
 | 
					if (NOT CONFIGURED_ONCE)
 | 
				
			||||||
    if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
 | 
					    if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
 | 
				
			||||||
| 
						 | 
					@ -27,57 +28,62 @@ set(vde_headers
 | 
				
			||||||
    "VerteronDisassemblerEngine/VXDisassemblerUtils.h"
 | 
					    "VerteronDisassemblerEngine/VXDisassemblerUtils.h"
 | 
				
			||||||
    "VerteronDisassemblerEngine/VXInstructionDecoder.h"
 | 
					    "VerteronDisassemblerEngine/VXInstructionDecoder.h"
 | 
				
			||||||
    "VerteronDisassemblerEngine/VXInstructionFormatter.h"
 | 
					    "VerteronDisassemblerEngine/VXInstructionFormatter.h"
 | 
				
			||||||
    "VerteronDisassemblerEngine/VXOpcodeTable.h")
 | 
					    "VerteronDisassemblerEngine/VXOpcodeTable.h"
 | 
				
			||||||
 | 
					    "VerteronDisassemblerEngine/VXOpcodeTableInternal.h"
 | 
				
			||||||
 | 
					    "VerteronDisassemblerEngine/VXInternalHelpers.h"
 | 
				
			||||||
 | 
					    "VerteronDisassemblerEngine/VXInternalConfig.h")
 | 
				
			||||||
set(vde_sources
 | 
					set(vde_sources
 | 
				
			||||||
    "VerteronDisassemblerEngine/VXDisassemblerUtils.cpp"
 | 
					    "VerteronDisassemblerEngine/VXDisassemblerUtils.c"
 | 
				
			||||||
    "VerteronDisassemblerEngine/VXInstructionFormatter.cpp"
 | 
					    "VerteronDisassemblerEngine/VXInstructionFormatter.c"
 | 
				
			||||||
    "VerteronDisassemblerEngine/VXOpcodeTable.cpp"
 | 
					    "VerteronDisassemblerEngine/VXOpcodeTable.c"
 | 
				
			||||||
    "VerteronDisassemblerEngine/VXInstructionDecoder.cpp")
 | 
					    "VerteronDisassemblerEngine/VXInstructionDecoder.c")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_library("VerteronDisassemblerEngine" ${vde_headers} ${vde_sources})
 | 
					#if (BUILD_SHARED)
 | 
				
			||||||
 | 
					#    add_definitions("-DVX_BUILD_SHARED")
 | 
				
			||||||
 | 
					#    add_library("VerteronDisassemblerEngine" SHARED ${vde_headers} ${vde_sources})
 | 
				
			||||||
 | 
					#else ()
 | 
				
			||||||
 | 
					    add_library("VerteronDisassemblerEngine" STATIC ${vde_headers} ${vde_sources})
 | 
				
			||||||
 | 
					#endif ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# C bindings
 | 
					# C++ bindings
 | 
				
			||||||
if (BUILD_C_BINDINGS)
 | 
					if (BUILD_CPP_BINDINGS)
 | 
				
			||||||
    set(vdec_headers
 | 
					    set(vdecpp_headers
 | 
				
			||||||
        "Bindings/C/VXDisassemblerC.h"
 | 
					        "Bindings/Cpp/VXDisassembler.hpp"
 | 
				
			||||||
        "Bindings/C/VXDisassemblerTypesC.h"
 | 
					        "Bindings/Cpp/VXDisassemblerTypes.hpp"
 | 
				
			||||||
        "Bindings/C/VXDisassemblerUtilsC.h"
 | 
					        "Bindings/Cpp/VXDisassemblerUtils.hpp"
 | 
				
			||||||
        "Bindings/C/VXInstructionDecoderC.h"
 | 
					        "Bindings/Cpp/VXInstructionDecoder.hpp"
 | 
				
			||||||
        "Bindings/C/VXInstructionFormatterC.h"
 | 
					        "Bindings/Cpp/VXInstructionFormatter.hpp"
 | 
				
			||||||
        "Bindings/C/VXOpcodeTableC.h"
 | 
					        "Bindings/Cpp/VXOpcodeTable.hpp")
 | 
				
			||||||
        "Bindings/C/VXOpcodeTableInternalC.h"
 | 
					    set(vdecpp_sources
 | 
				
			||||||
        "Bindings/C/VXInternalHelpersC.h"
 | 
					        "Bindings/Cpp/VXDisassemblerUtils.cpp"
 | 
				
			||||||
        "Bindings/C/VXInternalConfig.h")
 | 
					        "Bindings/Cpp/VXInstructionFormatter.cpp"
 | 
				
			||||||
    set(vdec_sources
 | 
					        "Bindings/Cpp/VXOpcodeTable.cpp"
 | 
				
			||||||
        "Bindings/C/VXDisassemblerUtilsC.c"
 | 
					        "Bindings/Cpp/VXInstructionDecoder.cpp")
 | 
				
			||||||
        "Bindings/C/VXInstructionFormatterC.c"
 | 
					    add_library("VerteronDisassemblerEngineCpp" ${vdecpp_headers} ${vdecpp_sources})
 | 
				
			||||||
        "Bindings/C/VXOpcodeTableC.c"
 | 
					    target_link_libraries("VerteronDisassemblerEngineCpp" "VerteronDisassemblerEngine")
 | 
				
			||||||
        "Bindings/C/VXInstructionDecoderC.c")
 | 
					 | 
				
			||||||
    add_library("VerteronDisassemblerEngineC" ${vdec_headers} ${vdec_sources})
 | 
					 | 
				
			||||||
    target_link_libraries("VerteronDisassemblerEngineC" "VerteronDisassemblerEngine")
 | 
					 | 
				
			||||||
endif ()
 | 
					endif ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Examples
 | 
					# Examples
 | 
				
			||||||
if (BUILD_EXAMPLES)
 | 
					if (BUILD_EXAMPLES)
 | 
				
			||||||
    include_directories("VerteronDisassemblerEngine")
 | 
					    include_directories("VerteronDisassemblerEngine")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    add_executable("CustomDataSource" "Examples/CustomDataSource/Main.cpp")
 | 
					    add_executable("CustomDataSource" "Examples/CustomDataSource/Main.c")
 | 
				
			||||||
    target_link_libraries("CustomDataSource" "VerteronDisassemblerEngine")
 | 
					    target_link_libraries("CustomDataSource" "VerteronDisassemblerEngine")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    add_executable("PerformanceTest" "Examples/PerformanceTest/Main.cpp")
 | 
					    add_executable("PerformanceTest" "Examples/PerformanceTest/Main.c")
 | 
				
			||||||
    target_link_libraries("PerformanceTest" "VerteronDisassemblerEngine")
 | 
					    target_link_libraries("PerformanceTest" "VerteronDisassemblerEngine")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    add_executable("SimpleDemo" "Examples/SimpleDemo/Main.cpp")
 | 
					    add_executable("SimpleDemo" "Examples/SimpleDemo/Main.c")
 | 
				
			||||||
    target_link_libraries("SimpleDemo" "VerteronDisassemblerEngine")
 | 
					    target_link_libraries("SimpleDemo" "VerteronDisassemblerEngine")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (BUILD_C_BINDINGS)
 | 
					    if (BUILD_CPP_BINDINGS)
 | 
				
			||||||
        add_executable("CBindingsTest" "Examples/CBindings/test.c")
 | 
					        add_executable("CppBindingsTest" "Examples/CppBindings/Main.cpp")
 | 
				
			||||||
        include_directories("Bindings/C")
 | 
					        include_directories("Bindings/Cpp")
 | 
				
			||||||
        target_link_libraries("CBindingsTest" "VerteronDisassemblerEngineC")
 | 
					        target_link_libraries("CppBindingsTest" "VerteronDisassemblerEngineCpp")
 | 
				
			||||||
    endif ()
 | 
					    endif ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (WIN32)
 | 
					    if (WIN32)
 | 
				
			||||||
        add_executable("SymbolResolver" "Examples/SymbolResolver/Main.cpp")
 | 
					        add_executable("SymbolResolver" "Examples/SymbolResolver/Main.c")
 | 
				
			||||||
        target_link_libraries("SymbolResolver" "VerteronDisassemblerEngine")
 | 
					        target_link_libraries("SymbolResolver" "VerteronDisassemblerEngine")
 | 
				
			||||||
    else ()
 | 
					    else ()
 | 
				
			||||||
        message(STATUS "Example 'SymbolResolver' not compatible with platform, ignoring.")
 | 
					        message(STATUS "Example 'SymbolResolver' not compatible with platform, ignoring.")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,8 @@
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <iomanip>
 | 
					#include <iomanip>
 | 
				
			||||||
#include <VXDisassembler.h>
 | 
					
 | 
				
			||||||
 | 
					#include <VXDisassembler.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace Verteron;
 | 
					using namespace Verteron;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,157 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup Label="ProjectConfigurations">
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|x64">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|x64">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="Globals">
 | 
					 | 
				
			||||||
    <ProjectGuid>{EB0F5A04-EE14-4779-9B29-322876CD45C8}</ProjectGuid>
 | 
					 | 
				
			||||||
    <Keyword>Win32Proj</Keyword>
 | 
					 | 
				
			||||||
    <RootNamespace>CustomDataSource</RootNamespace>
 | 
					 | 
				
			||||||
    <ProjectName>2 - Custom DataSource</ProjectName>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionSettings">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="UserMacros" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <LinkIncremental>true</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <LinkIncremental>true</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <LinkIncremental>false</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <LinkIncremental>false</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="Main.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ProjectReference Include="..\..\VerteronDisassemblerEngine\VerteronDisassemblerEngine.vcxproj">
 | 
					 | 
				
			||||||
      <Project>{f5c6f0a7-f75d-42bd-a8ab-a2d1d5f67099}</Project>
 | 
					 | 
				
			||||||
    </ProjectReference>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionTargets">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,6 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="Main.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,90 +0,0 @@
 | 
				
			||||||
 | 
					 | 
				
			||||||
Microsoft Visual Studio Solution File, Format Version 12.00
 | 
					 | 
				
			||||||
# Visual Studio 2013
 | 
					 | 
				
			||||||
VisualStudioVersion = 12.0.30723.0
 | 
					 | 
				
			||||||
MinimumVisualStudioVersion = 10.0.40219.1
 | 
					 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "1 - Simple Demo", "SimpleDemo\SimpleDemo.vcxproj", "{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}"
 | 
					 | 
				
			||||||
EndProject
 | 
					 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "2 - Custom DataSource", "CustomDataSource\CustomDataSource.vcxproj", "{EB0F5A04-EE14-4779-9B29-322876CD45C8}"
 | 
					 | 
				
			||||||
EndProject
 | 
					 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "3 - Symbol Resolver", "SymbolResolver\SymbolResolver.vcxproj", "{B6CA4362-2714-451C-8063-12195ABD7CD7}"
 | 
					 | 
				
			||||||
EndProject
 | 
					 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VerteronDisassemblerEngine", "..\VerteronDisassemblerEngine\VerteronDisassemblerEngine.vcxproj", "{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}"
 | 
					 | 
				
			||||||
EndProject
 | 
					 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "4 - Performance Test", "PerformanceTest\PerformanceTest.vcxproj", "{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}"
 | 
					 | 
				
			||||||
EndProject
 | 
					 | 
				
			||||||
Global
 | 
					 | 
				
			||||||
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
					 | 
				
			||||||
		Debug|Mixed Platforms = Debug|Mixed Platforms
 | 
					 | 
				
			||||||
		Debug|Win32 = Debug|Win32
 | 
					 | 
				
			||||||
		Debug|x64 = Debug|x64
 | 
					 | 
				
			||||||
		Release|Mixed Platforms = Release|Mixed Platforms
 | 
					 | 
				
			||||||
		Release|Win32 = Release|Win32
 | 
					 | 
				
			||||||
		Release|x64 = Release|x64
 | 
					 | 
				
			||||||
	EndGlobalSection
 | 
					 | 
				
			||||||
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|Win32.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|x64.ActiveCfg = Debug|x64
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Debug|x64.Build.0 = Debug|x64
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|Mixed Platforms.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|Mixed Platforms.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|Win32.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|Win32.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|x64.ActiveCfg = Release|x64
 | 
					 | 
				
			||||||
		{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}.Release|x64.Build.0 = Release|x64
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|Win32.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|x64.ActiveCfg = Debug|x64
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Debug|x64.Build.0 = Debug|x64
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|Mixed Platforms.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|Mixed Platforms.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|Win32.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|Win32.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|x64.ActiveCfg = Release|x64
 | 
					 | 
				
			||||||
		{EB0F5A04-EE14-4779-9B29-322876CD45C8}.Release|x64.Build.0 = Release|x64
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|Win32.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|x64.ActiveCfg = Debug|x64
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Debug|x64.Build.0 = Debug|x64
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|Mixed Platforms.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|Mixed Platforms.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|Win32.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|Win32.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|x64.ActiveCfg = Release|x64
 | 
					 | 
				
			||||||
		{B6CA4362-2714-451C-8063-12195ABD7CD7}.Release|x64.Build.0 = Release|x64
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Win32.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|x64.ActiveCfg = Debug|x64
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|x64.Build.0 = Debug|x64
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Mixed Platforms.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Mixed Platforms.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Win32.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Win32.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|x64.ActiveCfg = Release|x64
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|x64.Build.0 = Release|x64
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|Mixed Platforms.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|Win32.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|x64.ActiveCfg = Debug|x64
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Debug|x64.Build.0 = Debug|x64
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|Mixed Platforms.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|Mixed Platforms.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|Win32.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|Win32.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|x64.ActiveCfg = Release|x64
 | 
					 | 
				
			||||||
		{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}.Release|x64.Build.0 = Release|x64
 | 
					 | 
				
			||||||
	EndGlobalSection
 | 
					 | 
				
			||||||
	GlobalSection(SolutionProperties) = preSolution
 | 
					 | 
				
			||||||
		HideSolutionNode = FALSE
 | 
					 | 
				
			||||||
	EndGlobalSection
 | 
					 | 
				
			||||||
EndGlobal
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,157 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup Label="ProjectConfigurations">
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|x64">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|x64">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="Globals">
 | 
					 | 
				
			||||||
    <ProjectGuid>{4A0B7BE7-72C9-4A95-90CA-D56C50F10401}</ProjectGuid>
 | 
					 | 
				
			||||||
    <Keyword>Win32Proj</Keyword>
 | 
					 | 
				
			||||||
    <RootNamespace>PerformanceTest</RootNamespace>
 | 
					 | 
				
			||||||
    <ProjectName>4 - Performance Test</ProjectName>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionSettings">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="UserMacros" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <LinkIncremental>true</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <LinkIncremental>true</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <LinkIncremental>false</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <LinkIncremental>false</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="Main.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ProjectReference Include="..\..\VerteronDisassemblerEngine\VerteronDisassemblerEngine.vcxproj">
 | 
					 | 
				
			||||||
      <Project>{f5c6f0a7-f75d-42bd-a8ab-a2d1d5f67099}</Project>
 | 
					 | 
				
			||||||
    </ProjectReference>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionTargets">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,6 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="Main.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <VXDisassemblerC.h>
 | 
					#include <VXDisassembler.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
| 
						 | 
					@ -1,157 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup Label="ProjectConfigurations">
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|x64">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|x64">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="Globals">
 | 
					 | 
				
			||||||
    <ProjectGuid>{BC5CDE9B-9F84-453E-8131-B56F67FD0E4D}</ProjectGuid>
 | 
					 | 
				
			||||||
    <Keyword>Win32Proj</Keyword>
 | 
					 | 
				
			||||||
    <RootNamespace>SimpleDemo</RootNamespace>
 | 
					 | 
				
			||||||
    <ProjectName>1 - Simple Demo</ProjectName>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionSettings">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="UserMacros" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <LinkIncremental>true</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <LinkIncremental>true</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <LinkIncremental>false</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <LinkIncremental>false</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="Main.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ProjectReference Include="..\..\VerteronDisassemblerEngine\VerteronDisassemblerEngine.vcxproj">
 | 
					 | 
				
			||||||
      <Project>{f5c6f0a7-f75d-42bd-a8ab-a2d1d5f67099}</Project>
 | 
					 | 
				
			||||||
    </ProjectReference>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionTargets">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,6 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="Main.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -29,27 +29,27 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#include <fstream>
 | 
					
 | 
				
			||||||
#include <iomanip>
 | 
					 | 
				
			||||||
#include <string>
 | 
					 | 
				
			||||||
#include <VXDisassembler.h>
 | 
					#include <VXDisassembler.h>
 | 
				
			||||||
#include <Windows.h>
 | 
					#include <Windows.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace Verteron;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(int argc, char* argv[])
 | 
					int main(int argc, char* argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    // TODO: port to C
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Find module base in memory
 | 
					    // Find module base in memory
 | 
				
			||||||
    void *moduleBase = GetModuleHandle("kernel32.dll");
 | 
					    void *moduleBase = GetModuleHandle("kernel32.dll");
 | 
				
			||||||
    uintptr_t baseAddress = reinterpret_cast<uintptr_t>(moduleBase);
 | 
					    uintptr_t baseAddress = (uintptr_t)moduleBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Parse PE headers
 | 
					    // Parse PE headers
 | 
				
			||||||
    PIMAGE_DOS_HEADER dosHeader = static_cast<PIMAGE_DOS_HEADER>(moduleBase);
 | 
					    PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)moduleBase;
 | 
				
			||||||
    if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)
 | 
					    if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    PIMAGE_NT_HEADERS ntHeaders = 
 | 
					
 | 
				
			||||||
        reinterpret_cast<PIMAGE_NT_HEADERS>(baseAddress + dosHeader->e_lfanew);
 | 
					    PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)(baseAddress + dosHeader->e_lfanew);
 | 
				
			||||||
    if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)
 | 
					    if (ntHeaders->Signature != IMAGE_NT_SIGNATURE)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
| 
						 | 
					@ -187,5 +187,7 @@ int main(int argc, char* argv[])
 | 
				
			||||||
        sectionHeader++;
 | 
					        sectionHeader++;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    out.close();
 | 
					    out.close();
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,157 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup Label="ProjectConfigurations">
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|x64">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|x64">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="Globals">
 | 
					 | 
				
			||||||
    <ProjectGuid>{B6CA4362-2714-451C-8063-12195ABD7CD7}</ProjectGuid>
 | 
					 | 
				
			||||||
    <Keyword>Win32Proj</Keyword>
 | 
					 | 
				
			||||||
    <RootNamespace>SymbolResolver</RootNamespace>
 | 
					 | 
				
			||||||
    <ProjectName>3 - Symbol Resolver</ProjectName>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>Application</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionSettings">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="UserMacros" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <LinkIncremental>true</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <LinkIncremental>true</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <LinkIncremental>false</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <LinkIncremental>false</LinkIncremental>
 | 
					 | 
				
			||||||
    <IncludePath>..\..\VerteronDisassemblerEngine\;$(IncludePath)</IncludePath>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Console</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="Main.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ProjectReference Include="..\..\VerteronDisassemblerEngine\VerteronDisassemblerEngine.vcxproj">
 | 
					 | 
				
			||||||
      <Project>{f5c6f0a7-f75d-42bd-a8ab-a2d1d5f67099}</Project>
 | 
					 | 
				
			||||||
    </ProjectReference>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionTargets">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,6 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="Main.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,38 +0,0 @@
 | 
				
			||||||
 | 
					 | 
				
			||||||
Microsoft Visual Studio Solution File, Format Version 12.00
 | 
					 | 
				
			||||||
# Visual Studio 2013
 | 
					 | 
				
			||||||
VisualStudioVersion = 12.0.30723.0
 | 
					 | 
				
			||||||
MinimumVisualStudioVersion = 10.0.40219.1
 | 
					 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VerteronDisassemblerEngine", "VerteronDisassemblerEngine\VerteronDisassemblerEngine.vcxproj", "{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}"
 | 
					 | 
				
			||||||
EndProject
 | 
					 | 
				
			||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OptableGenerator", "OptableGenerator\OptableGenerator.vcxproj", "{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}"
 | 
					 | 
				
			||||||
EndProject
 | 
					 | 
				
			||||||
Global
 | 
					 | 
				
			||||||
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
					 | 
				
			||||||
		Debug|Win32 = Debug|Win32
 | 
					 | 
				
			||||||
		Debug|x64 = Debug|x64
 | 
					 | 
				
			||||||
		Release|Win32 = Release|Win32
 | 
					 | 
				
			||||||
		Release|x64 = Release|x64
 | 
					 | 
				
			||||||
	EndGlobalSection
 | 
					 | 
				
			||||||
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|Win32.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|x64.ActiveCfg = Debug|x64
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Debug|x64.Build.0 = Debug|x64
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Win32.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|Win32.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|x64.ActiveCfg = Release|x64
 | 
					 | 
				
			||||||
		{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}.Release|x64.Build.0 = Release|x64
 | 
					 | 
				
			||||||
		{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}.Debug|Win32.ActiveCfg = Debug|Win32
 | 
					 | 
				
			||||||
		{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}.Debug|Win32.Build.0 = Debug|Win32
 | 
					 | 
				
			||||||
		{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}.Debug|x64.ActiveCfg = Debug|x64
 | 
					 | 
				
			||||||
		{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}.Debug|x64.Build.0 = Debug|x64
 | 
					 | 
				
			||||||
		{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}.Release|Win32.ActiveCfg = Release|Win32
 | 
					 | 
				
			||||||
		{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}.Release|Win32.Build.0 = Release|Win32
 | 
					 | 
				
			||||||
		{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}.Release|x64.ActiveCfg = Release|x64
 | 
					 | 
				
			||||||
		{EFA075B8-AFB9-4E06-99AD-BD58F50A9500}.Release|x64.Build.0 = Release|x64
 | 
					 | 
				
			||||||
	EndGlobalSection
 | 
					 | 
				
			||||||
	GlobalSection(SolutionProperties) = preSolution
 | 
					 | 
				
			||||||
		HideSolutionNode = FALSE
 | 
					 | 
				
			||||||
	EndGlobalSection
 | 
					 | 
				
			||||||
EndGlobal
 | 
					 | 
				
			||||||
| 
						 | 
					@ -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     : 04. February 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
 | 
				
			||||||
| 
						 | 
					@ -29,9 +29,13 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 **************************************************************************************************/
 | 
					 **************************************************************************************************/
 | 
				
			||||||
#pragma once
 | 
					
 | 
				
			||||||
 | 
					#ifndef _VDE_VXDISASSEMBLERC_H_
 | 
				
			||||||
 | 
					#define _VDE_VXDISASSEMBLERC_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "VXDisassemblerTypes.h"
 | 
					#include "VXDisassemblerTypes.h"
 | 
				
			||||||
#include "VXInstructionDecoder.h"
 | 
					#include "VXInstructionDecoder.h"
 | 
				
			||||||
#include "VXInstructionFormatter.h"
 | 
					#include "VXInstructionFormatter.h"
 | 
				
			||||||
#include "VXDisassemblerUtils.h"
 | 
					#include "VXDisassemblerUtils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* _VDE_VXDISASSEMBLERC_H_ */
 | 
				
			||||||
| 
						 | 
					@ -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     : 22. October 2014
 | 
					  Last change     : 04. February 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
 | 
				
			||||||
| 
						 | 
					@ -29,18 +29,23 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#pragma once
 | 
					
 | 
				
			||||||
 | 
					#ifndef _VDE_VXDISASSEMBLERTYPESC_H_
 | 
				
			||||||
 | 
					#define _VDE_VXDISASSEMBLERTYPESC_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include "VXOpcodeTable.h"
 | 
					#include "VXOpcodeTable.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Verteron
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C"
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent additional flags of a decoded instruction.
 | 
					 * @brief   Values that represent additional flags of a decoded instruction.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
enum InstructionFlags : uint32_t
 | 
					typedef enum _VXInstructionFlags /* : uint32_t */
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    IF_NONE                         = 0x00000000,
 | 
					    IF_NONE                         = 0x00000000,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
| 
						 | 
					@ -122,149 +127,157 @@ enum InstructionFlags : uint32_t
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   An error occured while decoding the instruction operands.  
 | 
					     * @brief   An error occured while decoding the instruction operands.  
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    IF_ERROR_OPERAND                = 0x01000000
 | 
					    IF_ERROR_OPERAND                = 0x01000000,
 | 
				
			||||||
};
 | 
					
 | 
				
			||||||
 | 
					    IF_FORCE_DWORD                  = 0x7FFFFFFF
 | 
				
			||||||
 | 
					} VXInstructionFlags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent a cpu register.
 | 
					 * @brief   Values that represent a cpu register.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
enum class VXRegister : uint16_t
 | 
					typedef enum _VXRegister /* : uint16_t */
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    NONE,
 | 
					    REG_NONE,
 | 
				
			||||||
    /* 8 bit general purpose registers */
 | 
					    /* 8 bit general purpose registers */
 | 
				
			||||||
    AL,     CL,     DL,     BL,
 | 
					    REG_AL,     REG_CL,     REG_DL,     REG_BL,
 | 
				
			||||||
    AH,     CH,     DH,     BH,
 | 
					    REG_AH,     REG_CH,     REG_DH,     REG_BH,
 | 
				
			||||||
    SPL,    BPL,    SIL,    DIL,
 | 
					    REG_SPL,    REG_BPL,    REG_SIL,    REG_DIL,
 | 
				
			||||||
    R8B,    R9B,    R10B,   R11B,
 | 
					    REG_R8B,    REG_R9B,    REG_R10B,   REG_R11B,
 | 
				
			||||||
    R12B,   R13B,   R14B,   R15B,
 | 
					    REG_R12B,   REG_R13B,   REG_R14B,   REG_R15B,
 | 
				
			||||||
    /* 16 bit general purpose registers */
 | 
					    /* 16 bit general purpose registers */
 | 
				
			||||||
    AX,     CX,     DX,     BX,
 | 
					    REG_AX,     REG_CX,     REG_DX,     REG_BX,
 | 
				
			||||||
    SP,     BP,     SI,     DI,
 | 
					    REG_SP,     REG_BP,     REG_SI,     REG_DI,
 | 
				
			||||||
    R8W,    R9W,    R10W,   R11W,
 | 
					    REG_R8W,    REG_R9W,    REG_R10W,   REG_R11W,
 | 
				
			||||||
    R12W,   R13W,   R14W,   R15W,
 | 
					    REG_R12W,   REG_R13W,   REG_R14W,   REG_R15W,
 | 
				
			||||||
    /* 32 bit general purpose registers */
 | 
					    /* 32 bit general purpose registers */
 | 
				
			||||||
    EAX,    ECX,    EDX,    EBX,
 | 
					    REG_EAX,    REG_ECX,    REG_EDX,    REG_EBX,
 | 
				
			||||||
    ESP,    EBP,    ESI,    EDI,
 | 
					    REG_ESP,    REG_EBP,    REG_ESI,    REG_EDI,
 | 
				
			||||||
    R8D,    R9D,    R10D,   R11D,
 | 
					    REG_R8D,    REG_R9D,    REG_R10D,   REG_R11D,
 | 
				
			||||||
    R12D,   R13D,   R14D,   R15D,
 | 
					    REG_R12D,   REG_R13D,   REG_R14D,   REG_R15D,
 | 
				
			||||||
    /* 64 bit general purpose registers */
 | 
					    /* 64 bit general purpose registers */
 | 
				
			||||||
    RAX,    RCX,    RDX,    RBX,
 | 
					    REG_RAX,    REG_RCX,    REG_RDX,    REG_RBX,
 | 
				
			||||||
    RSP,    RBP,    RSI,    RDI,
 | 
					    REG_RSP,    REG_RBP,    REG_RSI,    REG_RDI,
 | 
				
			||||||
    R8,     R9,     R10,    R11,
 | 
					    REG_R8,     REG_R9,     REG_R10,    REG_R11,
 | 
				
			||||||
    R12,    R13,    R14,    R15,
 | 
					    REG_R12,    REG_R13,    REG_R14,    REG_R15,
 | 
				
			||||||
    /* segment registers */
 | 
					    /* segment registers */
 | 
				
			||||||
    ES,     CS,     SS,     
 | 
					    REG_ES,     REG_CS,     REG_SS,     
 | 
				
			||||||
    DS,     FS,     GS,
 | 
					    REG_DS,     REG_FS,     REG_GS,
 | 
				
			||||||
    /* control registers */
 | 
					    /* control registers */
 | 
				
			||||||
    CR0,    CR1,    CR2,    CR3,
 | 
					    REG_CR0,    REG_CR1,    REG_CR2,    REG_CR3,
 | 
				
			||||||
    CR4,    CR5,    CR6,    CR7,
 | 
					    REG_CR4,    REG_CR5,    REG_CR6,    REG_CR7,
 | 
				
			||||||
    CR8,    CR9,    CR10,   CR11,
 | 
					    REG_CR8,    REG_CR9,    REG_CR10,   REG_CR11,
 | 
				
			||||||
    CR12,   CR13,   CR14,   CR15,
 | 
					    REG_CR12,   REG_CR13,   REG_CR14,   REG_CR15,
 | 
				
			||||||
    /* debug registers */
 | 
					    /* debug registers */
 | 
				
			||||||
    DR0,    DR1,    DR2,    DR3,
 | 
					    REG_DR0,    REG_DR1,    REG_DR2,    REG_DR3,
 | 
				
			||||||
    DR4,    DR5,    DR6,    DR7,
 | 
					    REG_DR4,    REG_DR5,    REG_DR6,    REG_DR7,
 | 
				
			||||||
    DR8,    DR9,    DR10,   DR11,
 | 
					    REG_DR8,    REG_DR9,    REG_DR10,   REG_DR11,
 | 
				
			||||||
    DR12,   DR13,   DR14,   DR15,
 | 
					    REG_DR12,   REG_DR13,   REG_DR14,   REG_DR15,
 | 
				
			||||||
    /* mmx registers */
 | 
					    /* mmx registers */
 | 
				
			||||||
    MM0,    MM1,    MM2,    MM3,
 | 
					    REG_MM0,    REG_MM1,    REG_MM2,    REG_MM3,
 | 
				
			||||||
    MM4,    MM5,    MM6,    MM7,
 | 
					    REG_MM4,    REG_MM5,    REG_MM6,    REG_MM7,
 | 
				
			||||||
    /* x87 registers */
 | 
					    /* x87 registers */
 | 
				
			||||||
    ST0,    ST1,    ST2,    ST3,
 | 
					    REG_ST0,    REG_ST1,    REG_ST2,    REG_ST3,
 | 
				
			||||||
    ST4,    ST5,    ST6,    ST7,
 | 
					    REG_ST4,    REG_ST5,    REG_ST6,    REG_ST7,
 | 
				
			||||||
    /* extended multimedia registers */
 | 
					    /* extended multimedia registers */
 | 
				
			||||||
    XMM0,   XMM1,   XMM2,   XMM3,
 | 
					    REG_XMM0,   REG_XMM1,   REG_XMM2,   REG_XMM3,
 | 
				
			||||||
    XMM4,   XMM5,   XMM6,   XMM7,
 | 
					    REG_XMM4,   REG_XMM5,   REG_XMM6,   REG_XMM7,
 | 
				
			||||||
    XMM8,   XMM9,   XMM10,  XMM11,
 | 
					    REG_XMM8,   REG_XMM9,   REG_XMM10,  REG_XMM11,
 | 
				
			||||||
    XMM12,  XMM13,  XMM14,  XMM15,
 | 
					    REG_XMM12,  REG_XMM13,  REG_XMM14,  REG_XMM15,
 | 
				
			||||||
    /* 256 bit multimedia registers */
 | 
					    /* 256 bit multimedia registers */
 | 
				
			||||||
    YMM0,   YMM1,   YMM2,   YMM3,
 | 
					    REG_YMM0,   REG_YMM1,   REG_YMM2,   REG_YMM3,
 | 
				
			||||||
    YMM4,   YMM5,   YMM6,   YMM7,
 | 
					    REG_YMM4,   REG_YMM5,   REG_YMM6,   REG_YMM7,
 | 
				
			||||||
    YMM8,   YMM9,   YMM10,  YMM11,
 | 
					    REG_YMM8,   REG_YMM9,   REG_YMM10,  REG_YMM11,
 | 
				
			||||||
    YMM12,  YMM13,  YMM14,  YMM15,
 | 
					    REG_YMM12,  REG_YMM13,  REG_YMM14,  YMM15,
 | 
				
			||||||
    /* instruction pointer register */
 | 
					    /* instruction pointer register */
 | 
				
			||||||
    RIP
 | 
					    REG_RIP,
 | 
				
			||||||
};
 | 
					
 | 
				
			||||||
 | 
					    REG_FORCE_WORD = 0x7FFF
 | 
				
			||||||
 | 
					} VXRegister;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent the type of a decoded operand.
 | 
					 * @brief   Values that represent the type of a decoded operand.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
enum class VXOperandType : uint8_t
 | 
					typedef enum _VXOperandType /*: uint8_t*/
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is not used.
 | 
					     * @brief   The operand is not used.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    NONE,
 | 
					    OPTYPE_NONE,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a register operand.
 | 
					     * @brief   The operand is a register operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    REGISTER,
 | 
					    OPTYPE_REGISTER,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a memory operand.
 | 
					     * @brief   The operand is a memory operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    MEMORY,
 | 
					    OPTYPE_MEMORY,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a pointer operand.
 | 
					     * @brief   The operand is a pointer operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    POINTER,
 | 
					    OPTYPE_POINTER,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is an immediate operand.
 | 
					     * @brief   The operand is an immediate operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    IMMEDIATE,
 | 
					    OPTYPE_IMMEDIATE,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a relative immediate operand.
 | 
					     * @brief   The operand is a relative immediate operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    REL_IMMEDIATE,
 | 
					    OPTYPE_REL_IMMEDIATE,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is a constant value.
 | 
					     * @brief   The operand is a constant value.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    CONSTANT
 | 
					    OPTYPE_CONSTANT
 | 
				
			||||||
};
 | 
					} VXOperandType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent the operand access mode.
 | 
					 * @brief   Values that represent the operand access mode.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
enum class VXOperandAccessMode : uint8_t
 | 
					typedef enum _VXOperandAccessMode /* : uint8_t */
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    NA,
 | 
					    OPACCESSMODE_NA,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is accessed in read-only mode.
 | 
					     * @brief   The operand is accessed in read-only mode.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    READ,
 | 
					    OPACCESSMODE_READ,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is accessed in write mode.
 | 
					     * @brief   The operand is accessed in write mode.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    WRITE,
 | 
					    OPACCESSMODE_WRITE,
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand is accessed in read-write mode.
 | 
					     * @brief   The operand is accessed in read-write mode.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    READWRITE
 | 
					    OPACCESSMODE_READWRITE
 | 
				
			||||||
};
 | 
					} VXOperandAccessMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   This struct holds information about a decoded operand.
 | 
					 * @brief   This struct holds information about a decoded operand.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct VXOperandInfo
 | 
					typedef struct _VXOperandInfo
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The type of the operand.
 | 
					     * @brief   The type of the operand.
 | 
				
			||||||
 | 
					     * @see     VXOperandType
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    VXOperandType type;
 | 
					    uint8_t type;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The size of the operand.
 | 
					     * @brief   The size of the operand.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint16_t size;
 | 
					    uint16_t size;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The operand access mode.
 | 
					     * @brief   The operand access mode.
 | 
				
			||||||
 | 
					     * @see     VXOperandAccessMode
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    VXOperandAccessMode access_mode;
 | 
					    uint8_t access_mode;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The base register.
 | 
					     * @brief   The base register.
 | 
				
			||||||
 | 
					     * @see     VXRegister
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    VXRegister base;
 | 
					    uint16_t base;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The index register.
 | 
					     * @brief   The index register.
 | 
				
			||||||
 | 
					     * @see     VXRegister
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    VXRegister index;
 | 
					    uint16_t index;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The scale factor.
 | 
					     * @brief   The scale factor.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
| 
						 | 
					@ -295,12 +308,12 @@ struct VXOperandInfo
 | 
				
			||||||
            uint32_t off;
 | 
					            uint32_t off;
 | 
				
			||||||
        } ptr;
 | 
					        } ptr;
 | 
				
			||||||
    } lval;   
 | 
					    } lval;   
 | 
				
			||||||
};
 | 
					} VXOperandInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   This struct holds information about a decoded instruction.
 | 
					 * @brief   This struct holds information about a decoded instruction.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct VXInstructionInfo
 | 
					typedef struct _VXInstructionInfo
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The instruction flags.
 | 
					     * @brief   The instruction flags.
 | 
				
			||||||
| 
						 | 
					@ -308,8 +321,9 @@ struct VXInstructionInfo
 | 
				
			||||||
    uint32_t flags;
 | 
					    uint32_t flags;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The instruction mnemonic.
 | 
					     * @brief   The instruction mnemonic.
 | 
				
			||||||
 | 
					     * @see     VXInstructionMnemonic
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    VXInstructionMnemonic mnemonic;
 | 
					    uint16_t mnemonic;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The total length of the instruction.
 | 
					     * @brief   The total length of the instruction.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
| 
						 | 
					@ -341,8 +355,9 @@ struct VXInstructionInfo
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The segment register. This value will default to @c NONE, if no segment register 
 | 
					     * @brief   The segment register. This value will default to @c NONE, if no segment register 
 | 
				
			||||||
     *          prefix is present.
 | 
					     *          prefix is present.
 | 
				
			||||||
 | 
					     * @see     VXRegister
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    VXRegister segment;
 | 
					    uint16_t segment;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @brief   The rex prefix byte.
 | 
					     * @brief   The rex prefix byte.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
| 
						 | 
					@ -524,6 +539,10 @@ struct VXInstructionInfo
 | 
				
			||||||
     *          This field is used to properly format relative instructions.         
 | 
					     *          This field is used to properly format relative instructions.         
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    uint64_t instrPointer;
 | 
					    uint64_t instrPointer;
 | 
				
			||||||
};
 | 
					} VXInstructionInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* _VDE_VXDISASSEMBLERTYPESC_H_ */
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "VXDisassemblerUtilsC.h"
 | 
					#include "VXDisassemblerUtils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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     : 30. October 2014
 | 
					  Last change     : 04. February 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
 | 
				
			||||||
| 
						 | 
					@ -29,13 +29,26 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#pragma once
 | 
					
 | 
				
			||||||
 | 
					#ifndef _VDE_VXDISASSEMBLERUTILSC_H_
 | 
				
			||||||
 | 
					#define _VDE_VXDISASSEMBLERUTILSC_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "VXDisassemblerTypes.h"
 | 
				
			||||||
 | 
					#include "VXInternalConfig.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include "VXDisassemblerTypes.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Verteron
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C"
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _VXContextDescriptor
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t type;
 | 
				
			||||||
 | 
					    void *ptr;
 | 
				
			||||||
 | 
					} VXContextDescriptor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Calculates the absolute target address of a relative instruction operand.
 | 
					 * @brief   Calculates the absolute target address of a relative instruction operand.
 | 
				
			||||||
| 
						 | 
					@ -43,6 +56,12 @@ namespace Verteron
 | 
				
			||||||
 * @param   operand The operand.
 | 
					 * @param   operand The operand.
 | 
				
			||||||
 * @return  The absolute target address.
 | 
					 * @return  The absolute target address.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
uint64_t VDECalcAbsoluteTarget(const VXInstructionInfo &info, const VXOperandInfo &operand);
 | 
					VX_EXPORT uint64_t VXCalcAbsoluteTarget(
 | 
				
			||||||
 | 
					    const VXInstructionInfo *info, 
 | 
				
			||||||
 | 
					    const VXOperandInfo *operand);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* _VDE_VXDISASSEMBLERUTILSC_H_ */
 | 
				
			||||||
| 
						 | 
					@ -30,9 +30,9 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "VXInstructionDecoderC.h"
 | 
					#include "VXInstructionDecoder.h"
 | 
				
			||||||
#include "VXInternalHelpersC.h"
 | 
					#include "VXInternalHelpers.h"
 | 
				
			||||||
#include "VXOpcodeTableInternalC.h"
 | 
					#include "VXOpcodeTableInternal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
| 
						 | 
					@ -1605,7 +1605,8 @@ static bool VXInstructionDecoder_DecodeOpcode(VXInstructionDecoderContext *ctx,
 | 
				
			||||||
                    if (info->instrDefinition->flags & IDF_OPERAND1_WRITE)
 | 
					                    if (info->instrDefinition->flags & IDF_OPERAND1_WRITE)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        info->operand[0].access_mode = OPACCESSMODE_WRITE;
 | 
					                        info->operand[0].access_mode = OPACCESSMODE_WRITE;
 | 
				
			||||||
                    } else if (info->instrDefinition->flags & IDF_OPERAND1_READWRITE)
 | 
					                    } 
 | 
				
			||||||
 | 
					                    else if (info->instrDefinition->flags & IDF_OPERAND1_READWRITE)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        info->operand[0].access_mode = OPACCESSMODE_READWRITE;
 | 
					                        info->operand[0].access_mode = OPACCESSMODE_READWRITE;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					@ -1615,7 +1616,8 @@ static bool VXInstructionDecoder_DecodeOpcode(VXInstructionDecoderContext *ctx,
 | 
				
			||||||
                    if (info->instrDefinition->flags & IDF_OPERAND2_WRITE)
 | 
					                    if (info->instrDefinition->flags & IDF_OPERAND2_WRITE)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        info->operand[1].access_mode = OPACCESSMODE_WRITE;
 | 
					                        info->operand[1].access_mode = OPACCESSMODE_WRITE;
 | 
				
			||||||
                    } else if (info->instrDefinition->flags & IDF_OPERAND2_READWRITE)
 | 
					                    } 
 | 
				
			||||||
 | 
					                    else if (info->instrDefinition->flags & IDF_OPERAND2_READWRITE)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        info->operand[1].access_mode = OPACCESSMODE_READWRITE;
 | 
					                        info->operand[1].access_mode = OPACCESSMODE_READWRITE;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					@ -1654,7 +1656,8 @@ static bool VXInstructionDecoder_DecodeOpcode(VXInstructionDecoderContext *ctx,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Set child node index for next iteration
 | 
					                // Set child node index for next iteration
 | 
				
			||||||
                index = info->vex_m_mmmm + (info->vex_pp << 2);
 | 
					                index = info->vex_m_mmmm + (info->vex_pp << 2);
 | 
				
			||||||
            } else
 | 
					            } 
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                index = 0;
 | 
					                index = 0;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -1672,6 +1675,7 @@ static bool VXInstructionDecoder_DecodeOpcode(VXInstructionDecoderContext *ctx,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        node = VXGetOpcodeTreeChild(node, index);
 | 
					        node = VXGetOpcodeTreeChild(node, index);
 | 
				
			||||||
    } while (nodeType != OTNT_INSTRUCTION_DEFINITION);
 | 
					    } while (nodeType != OTNT_INSTRUCTION_DEFINITION);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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     : 14. 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
 | 
				
			||||||
| 
						 | 
					@ -29,690 +29,276 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#pragma once
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <type_traits>
 | 
					#ifndef _VDE_VXINSTRUCTIONDECODERC_H_
 | 
				
			||||||
#include <istream>
 | 
					#define _VDE_VXINSTRUCTIONDECODERC_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "VXDisassemblerTypes.h"
 | 
					#include "VXDisassemblerTypes.h"
 | 
				
			||||||
 | 
					#include "VXDisassemblerUtils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Verteron
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include <stddef.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C"
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					/* VXBaseDataSource ============================================================================ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _VXBaseDataSourceContext { VXContextDescriptor d; } VXBaseDataSourceContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   The base class for all data-source implementations.
 | 
					 * @brief Releases a data source. 
 | 
				
			||||||
 | 
					 * @param ctx The context to release.
 | 
				
			||||||
 | 
					 * The context may no longer be used after it was released.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class VXBaseDataSource 
 | 
					VX_EXPORT void VXBaseDataSource_Release(
 | 
				
			||||||
{
 | 
					    VXBaseDataSourceContext *ctx);
 | 
				
			||||||
private:
 | 
					
 | 
				
			||||||
    uint8_t m_currentInput;
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
     * @brief   Override this method in your custom data source implementations.
 | 
					 * @brief   Reads the next byte from the data source without altering the current input position 
 | 
				
			||||||
     *          Reads the next byte from the data source. This method increases the current
 | 
					 *          or the @c length field of the @c info parameter. 
 | 
				
			||||||
     *          input position by one.  
 | 
					 * @param   ctx  The data source context.
 | 
				
			||||||
     * @return  The current input byte.
 | 
					 * @param   info The instruction info struct.
 | 
				
			||||||
 | 
					 * @return  The current input byte. If the result is zero, you should always check the @c flags 
 | 
				
			||||||
 | 
					 *          field of the @c info parameter for error flags. Possible error values are 
 | 
				
			||||||
 | 
					 *          @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    virtual uint8_t internalInputPeek() = 0;
 | 
					VX_EXPORT uint8_t VXBaseDataSource_InputPeek(
 | 
				
			||||||
 | 
					    VXBaseDataSourceContext *ctx, 
 | 
				
			||||||
 | 
					    VXInstructionInfo *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
     * @brief   Override this method in your custom data source implementations.
 | 
					  * @brief   Reads the next byte from the data source.
 | 
				
			||||||
     *          Reads the next byte from the data source. This method does NOT increase the 
 | 
					  * @param   ctx  The data soruce context.
 | 
				
			||||||
     *          current input position.
 | 
					 | 
				
			||||||
     * @return  The current input byte.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual uint8_t internalInputNext() = 0;
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Default constructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    VXBaseDataSource() { };
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Destructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual ~VXBaseDataSource() { };
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Reads the next byte from the data source. This method does NOT increase the 
 | 
					 | 
				
			||||||
     *          current input position or the @c length field of the @c info parameter. 
 | 
					 | 
				
			||||||
  * @param   info The instruction info.
 | 
					  * @param   info The instruction info.
 | 
				
			||||||
  * @return  The current input byte. If the result is zero, you should always check the 
 | 
					  * @return  The current input byte. If the result is zero, you should always check the 
 | 
				
			||||||
  *          @c flags field of the @c info parameter for error flags.
 | 
					  *          @c flags field of the @c info parameter for error flags.
 | 
				
			||||||
  *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.        
 | 
					  *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.        
 | 
				
			||||||
     */
 | 
					  * This method increases the current input position and the @c length field of the @c info 
 | 
				
			||||||
    uint8_t inputPeek(VXInstructionInfo &info);
 | 
					  * parameter. This function also appends the new byte to to @c data field of the @c info 
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Reads the next byte from the data source. This method increases the current
 | 
					 | 
				
			||||||
     *          input position and the @c length field of the @c info parameter. 
 | 
					 | 
				
			||||||
     *          This method also appends the new byte to to @c data field of the @c info 
 | 
					 | 
				
			||||||
  * parameter.
 | 
					  * parameter.
 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @return  The current input byte. If the result is zero, you should always check the 
 | 
					 | 
				
			||||||
     *          @c flags field of the @c info parameter for error flags.
 | 
					 | 
				
			||||||
     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
					 | 
				
			||||||
  */
 | 
					  */
 | 
				
			||||||
    uint8_t inputNext(VXInstructionInfo &info);
 | 
					VX_EXPORT uint8_t VXBaseDataSource_InputNext8(
 | 
				
			||||||
 | 
					    VXBaseDataSourceContext *ctx, 
 | 
				
			||||||
 | 
					    VXInstructionInfo *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
     * @brief   Reads the next byte(s) from the data source. This method increases the current
 | 
					 * @copydoc VXBaseDataSource_InputNext8
 | 
				
			||||||
     *          input position and the @c length field of the @c info parameter. 
 | 
					 | 
				
			||||||
     *          This method also appends the new byte(s) to to @c data field of the @c info 
 | 
					 | 
				
			||||||
     *          parameter.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @return  The current input data. If the result is zero, you should always check the 
 | 
					 | 
				
			||||||
     *          @c flags field of the @c info parameter for error flags.
 | 
					 | 
				
			||||||
     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    template <typename T>
 | 
					VX_EXPORT uint16_t VXBaseDataSource_InputNext16(
 | 
				
			||||||
    T inputNext(VXInstructionInfo &info);
 | 
					    VXBaseDataSourceContext *ctx, 
 | 
				
			||||||
 | 
					    VXInstructionInfo *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
     * @brief   Returns the current input byte. The current input byte is set everytime the 
 | 
					 * @copydoc VXBaseDataSource_InputNext8
 | 
				
			||||||
     *          @c inputPeek or @c inputNext method is called.
 | 
					 */
 | 
				
			||||||
 | 
					VX_EXPORT uint32_t VXBaseDataSource_InputNext32(
 | 
				
			||||||
 | 
					    VXBaseDataSourceContext *ctx, 
 | 
				
			||||||
 | 
					    VXInstructionInfo *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @copydoc VXBaseDataSource_InputNext8
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					VX_EXPORT uint64_t VXBaseDataSource_InputNext64(
 | 
				
			||||||
 | 
					    VXBaseDataSourceContext *ctx, 
 | 
				
			||||||
 | 
					    VXInstructionInfo *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Returns the current input byte.
 | 
				
			||||||
 | 
					 * @param   ctx  The data soruce context.
 | 
				
			||||||
 * @return  The current input byte.
 | 
					 * @return  The current input byte.
 | 
				
			||||||
 | 
					 * The current input byte is set everytime the @c inputPeek or @c inputNext method is called.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    uint8_t inputCurrent() const;
 | 
					// TODO: check long descr
 | 
				
			||||||
public:
 | 
					VX_EXPORT uint8_t VXBaseDataSource_InputCurrent(
 | 
				
			||||||
 | 
					    const VXBaseDataSourceContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
     * @brief   Override this method in your custom data source implementations.
 | 
					 * @brief   Queries if the end of the data source is reached.
 | 
				
			||||||
     *          Signals, if the end of the data source is reached.
 | 
					 * @param   ctx  The data soruce context.
 | 
				
			||||||
     * @return  True if end of input, false if not.
 | 
					 * @return  @c true if end of input, @c false if not.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    virtual bool isEndOfInput() const = 0;
 | 
					VX_EXPORT bool VXBaseDataSource_IsEndOfInput(
 | 
				
			||||||
 | 
					    const VXBaseDataSourceContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
     * @brief   Override this method in your custom data source implementations.
 | 
					 * @brief   Returns the current input position.
 | 
				
			||||||
     *          Returns the current input position.
 | 
					 * @param   ctx  The data soruce context.
 | 
				
			||||||
 * @return  The current input position.
 | 
					 * @return  The current input position.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    virtual uint64_t getPosition() const = 0;
 | 
					VX_EXPORT uint64_t VXBaseDataSource_GetPosition(
 | 
				
			||||||
 | 
					    const VXBaseDataSourceContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
     * @brief   Override this method in your custom data source implementations.
 | 
					 * @brief   Sets a new input position.
 | 
				
			||||||
     *          Sets a new input position.
 | 
					 * @param   ctx  The data soruce context.
 | 
				
			||||||
 * @param   position    The new input position.
 | 
					 * @param   position    The new input position.
 | 
				
			||||||
     * @return  Returns false, if the new position exceeds the maximum input length.
 | 
					 * @return  @c false if the new position exceeds the maximum input length.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    virtual bool setPosition(uint64_t position) = 0;
 | 
					VX_EXPORT bool VXBaseDataSource_SetPosition(
 | 
				
			||||||
};
 | 
					    VXBaseDataSourceContext *ctx, 
 | 
				
			||||||
 | 
					    uint64_t position);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline uint8_t VXBaseDataSource::inputPeek(VXInstructionInfo &info)
 | 
					/* VXMemoryDataSource ========================================================================== */
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (info.length == 15)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        info.flags |= IF_ERROR_LENGTH;
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (isEndOfInput())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    m_currentInput = internalInputPeek();
 | 
					 | 
				
			||||||
    return m_currentInput;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint8_t VXBaseDataSource::inputNext(VXInstructionInfo &info)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (info.length == 15)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        info.flags |= IF_ERROR_LENGTH;
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (isEndOfInput())
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    m_currentInput = internalInputNext();
 | 
					 | 
				
			||||||
    info.data[info.length] = m_currentInput;
 | 
					 | 
				
			||||||
    info.length++;
 | 
					 | 
				
			||||||
    return m_currentInput;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template <typename T>
 | 
					 | 
				
			||||||
inline T VXBaseDataSource::inputNext(VXInstructionInfo &info)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    static_assert(std::is_integral<T>::value, "integral type required");
 | 
					 | 
				
			||||||
    T result = 0;
 | 
					 | 
				
			||||||
    for (unsigned i = 0; i < (sizeof(T) / sizeof(uint8_t)); ++i)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        T b = inputNext(info);
 | 
					 | 
				
			||||||
        if (!b && (info.flags & IF_ERROR_MASK))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        result |= (b << (i * 8));   
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return result;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint8_t VXBaseDataSource::inputCurrent() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return m_currentInput;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   A memory-buffer based data source for the @c VXInstructionDecoder class.
 | 
					 * @brief   Creates a memory data source.
 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
class VXMemoryDataSource : public VXBaseDataSource
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    const void *m_inputBuffer;
 | 
					 | 
				
			||||||
    uint64_t    m_inputBufferLen;
 | 
					 | 
				
			||||||
    uint64_t    m_inputBufferPos;
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Reads the next byte from the data source. This method increases the current
 | 
					 | 
				
			||||||
     *          input position by one.  
 | 
					 | 
				
			||||||
     * @return  The current input byte.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint8_t internalInputPeek() override;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Reads the next byte from the data source. This method does NOT increase the 
 | 
					 | 
				
			||||||
     *          current input position.
 | 
					 | 
				
			||||||
     * @return  The current input byte.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint8_t internalInputNext() override;
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Constructor.
 | 
					 | 
				
			||||||
 * @param   buffer      The input buffer.
 | 
					 * @param   buffer      The input buffer.
 | 
				
			||||||
     * @param   bufferLen   The length of the input buffer.
 | 
					 * @param   bufferLen   THe length of the input buffer.
 | 
				
			||||||
 | 
					 * @return  @c NULL if it fails, else a data source context.
 | 
				
			||||||
 | 
					 * @see     VXBaseDataSource_Release
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    VXMemoryDataSource(const void* buffer, size_t bufferLen)
 | 
					// TODO: verify return value
 | 
				
			||||||
        : m_inputBuffer(buffer)
 | 
					VX_EXPORT VXBaseDataSourceContext* VXMemoryDataSource_Create(
 | 
				
			||||||
        , m_inputBufferLen(bufferLen)
 | 
					    const void* buffer,
 | 
				
			||||||
        , m_inputBufferPos(0) { };
 | 
					    size_t bufferLen);
 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Signals, if the end of the data source is reached.
 | 
					 | 
				
			||||||
     * @return  True if end of input, false if not.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool isEndOfInput() const override;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Returns the current input position.
 | 
					 | 
				
			||||||
     * @return  The current input position.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint64_t getPosition() const override;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Sets a new input position.
 | 
					 | 
				
			||||||
     * @param   position    The new input position.
 | 
					 | 
				
			||||||
     * @return  Returns false, if the new position exceeds the maximum input length.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool setPosition(uint64_t position) override;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline uint8_t VXMemoryDataSource::internalInputPeek()
 | 
					/* Enums ======================================================================================= */
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return *(static_cast<const uint8_t*>(m_inputBuffer) + m_inputBufferPos);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint8_t VXMemoryDataSource::internalInputNext()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    ++m_inputBufferPos;
 | 
					 | 
				
			||||||
    return *(static_cast<const uint8_t*>(m_inputBuffer) + m_inputBufferPos - 1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline bool VXMemoryDataSource::isEndOfInput() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return (m_inputBufferPos >= m_inputBufferLen);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint64_t VXMemoryDataSource::getPosition() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return m_inputBufferPos;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline bool VXMemoryDataSource::setPosition(uint64_t position)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    m_inputBufferPos = position;
 | 
					 | 
				
			||||||
    return isEndOfInput();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   A stream based data source for the @c VXInstructionDecoder class.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
class VXStreamDataSource : public VXBaseDataSource
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    std::istream *m_inputStream;
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Reads the next byte from the data source. This method increases the current
 | 
					 | 
				
			||||||
     *          input position by one.  
 | 
					 | 
				
			||||||
     * @return  The current input byte.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint8_t internalInputPeek() override;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Reads the next byte from the data source. This method does NOT increase the 
 | 
					 | 
				
			||||||
     *          current input position.
 | 
					 | 
				
			||||||
     * @return  The current input byte.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint8_t internalInputNext() override;
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Constructor.
 | 
					 | 
				
			||||||
     * @param   stream  The input stream.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    explicit VXStreamDataSource(std::istream *stream)
 | 
					 | 
				
			||||||
        : m_inputStream(stream) { };
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Signals, if the end of the data source is reached.
 | 
					 | 
				
			||||||
     * @return  True if end of input, false if not.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool isEndOfInput() const override;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Returns the current input position.
 | 
					 | 
				
			||||||
     * @return  The current input position.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint64_t getPosition() const override;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Sets a new input position.
 | 
					 | 
				
			||||||
     * @param   position    The new input position.
 | 
					 | 
				
			||||||
     * @return  Returns false, if the new position exceeds the maximum input length.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool setPosition(uint64_t position) override;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint8_t VXStreamDataSource::internalInputPeek()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_inputStream)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return m_inputStream->peek();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint8_t VXStreamDataSource::internalInputNext()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_inputStream)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return m_inputStream->get();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline bool VXStreamDataSource::isEndOfInput() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_inputStream)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // We use good() instead of eof() to make sure the decoding will fail, if an stream internal
 | 
					 | 
				
			||||||
    // error occured.
 | 
					 | 
				
			||||||
    return !m_inputStream->good();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint64_t VXStreamDataSource::getPosition() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_inputStream)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return m_inputStream->tellg();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline bool VXStreamDataSource::setPosition(uint64_t position)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_inputStream)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    m_inputStream->seekg(position);
 | 
					 | 
				
			||||||
    return isEndOfInput();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent a disassembler mode.
 | 
					 * @brief   Values that represent a disassembler mode.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
enum class VXDisassemblerMode : uint8_t
 | 
					typedef enum _VXDisassemblerMode /* : uint8_t */
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    M16BIT,
 | 
					    DM_M16BIT,
 | 
				
			||||||
    M32BIT,
 | 
					    DM_M32BIT,
 | 
				
			||||||
    M64BIT
 | 
					    DM_M64BIT
 | 
				
			||||||
};
 | 
					} VXDisassemblerMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Values that represent an instruction-set vendor.
 | 
					 * @brief   Values that represent an instruction-set vendor.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
enum class VXInstructionSetVendor : uint8_t
 | 
					typedef enum _VXInstructionSetVendor /* : uint8_t */
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ANY,
 | 
					    ISV_ANY,
 | 
				
			||||||
    INTEL,
 | 
					    ISV_INTEL,
 | 
				
			||||||
    AMD
 | 
					    ISV_AMD
 | 
				
			||||||
};
 | 
					} VXInstructionSetVendor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* VXInstructionDecoder ======================================================================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _VXInstructionDecoderContext 
 | 
				
			||||||
 | 
					{ 
 | 
				
			||||||
 | 
					    VXContextDescriptor d; 
 | 
				
			||||||
 | 
					} VXInstructionDecoderContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   The @c VXInstructionDecoder class decodes x86/x86-64 assembly instructions from a 
 | 
					 * @brief   Creates an instruction decoder.
 | 
				
			||||||
 *          given data source.
 | 
					 * @return  @c NULL if it fails, else an instruction decoder context.
 | 
				
			||||||
 | 
					 * @see     VXInstructionDecoder_Release
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class VXInstructionDecoder
 | 
					// TODO: verify return value
 | 
				
			||||||
{
 | 
					VX_EXPORT VXInstructionDecoderContext* VXInstructionDecoder_Create(void);
 | 
				
			||||||
private:
 | 
					
 | 
				
			||||||
    enum class RegisterClass : uint8_t
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        GENERAL_PURPOSE,
 | 
					 | 
				
			||||||
        MMX,
 | 
					 | 
				
			||||||
        CONTROL,
 | 
					 | 
				
			||||||
        DEBUG,
 | 
					 | 
				
			||||||
        SEGMENT,
 | 
					 | 
				
			||||||
        XMM
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    VXBaseDataSource      *m_dataSource;
 | 
					 | 
				
			||||||
    VXDisassemblerMode     m_disassemblerMode;
 | 
					 | 
				
			||||||
    VXInstructionSetVendor m_preferredVendor;
 | 
					 | 
				
			||||||
    uint64_t               m_instructionPointer;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
     * @brief   Reads the next byte from the data source. This method does NOT increase the 
 | 
					 * @brief   Creates an instruction decoder.
 | 
				
			||||||
     *          current input position or the @c length field of the @c info parameter. 
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @return  The current input byte. If the result is zero, you should always check the 
 | 
					 | 
				
			||||||
     *          @c flags field of the @c info parameter for error flags.
 | 
					 | 
				
			||||||
     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint8_t inputPeek(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Reads the next byte from the data source. This method increases the current
 | 
					 | 
				
			||||||
     *          input position and the @c length field of the @info parameter. 
 | 
					 | 
				
			||||||
     *          This method also appends the new byte to to @c data field of the @c info 
 | 
					 | 
				
			||||||
     *          parameter.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @return  The current input byte. If the result is zero, you should always check the 
 | 
					 | 
				
			||||||
     *          @c flags field of the @c info parameter for error flags.
 | 
					 | 
				
			||||||
     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint8_t inputNext(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Reads the next byte(s) from the data source. This method increases the current
 | 
					 | 
				
			||||||
     *          input position and the @c length field of the @info parameter. 
 | 
					 | 
				
			||||||
     *          This method also appends the new byte(s) to to @c data field of the @c info 
 | 
					 | 
				
			||||||
     *          parameter.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @return  The current input data. If the result is zero, you should always check the 
 | 
					 | 
				
			||||||
     *          @c flags field of the @c info parameter for error flags.
 | 
					 | 
				
			||||||
     *          Possible error values are @c IF_ERROR_END_OF_INPUT or @c IF_ERROR_LENGTH.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    template <typename T>
 | 
					 | 
				
			||||||
    T inputNext(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Returns the current input byte. The current input byte is set everytime the 
 | 
					 | 
				
			||||||
     *          @c inputPeek or @c inputNext method is called.
 | 
					 | 
				
			||||||
     * @return  The current input byte.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint8_t inputCurrent() const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes a register operand.
 | 
					 | 
				
			||||||
     * @param   info            The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand         The @c VXOperandInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @param   registerClass   The register class to use.
 | 
					 | 
				
			||||||
     * @param   registerId      The register id.
 | 
					 | 
				
			||||||
     * @param   operandSize     The defined size of the operand.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeRegisterOperand(VXInstructionInfo &info, VXOperandInfo &operand, 
 | 
					 | 
				
			||||||
        RegisterClass registerClass, uint8_t registerId, VXDefinedOperandSize operandSize) const;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes a register/memory operand.
 | 
					 | 
				
			||||||
     * @param   info            The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand         The @c VXOperandInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @param   registerClass   The register class to use.
 | 
					 | 
				
			||||||
     * @param   operandSize     The defined size of the operand.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeRegisterMemoryOperand(VXInstructionInfo &info, VXOperandInfo &operand,
 | 
					 | 
				
			||||||
        RegisterClass registerClass, VXDefinedOperandSize operandSize);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes an immediate operand.
 | 
					 | 
				
			||||||
     * @param   info        The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand     The @c VXOperandInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @param   operandSize The defined size of the operand.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeImmediate(VXInstructionInfo &info, VXOperandInfo &operand, 
 | 
					 | 
				
			||||||
        VXDefinedOperandSize operandSize);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes a displacement operand.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand The @c VXOperandInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @param   size    The size of the displacement data.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeDisplacement(VXInstructionInfo &info, VXOperandInfo &operand, uint8_t size);
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes the modrm field of the instruction. This method reads an additional 
 | 
					 | 
				
			||||||
     *          input byte.
 | 
					 | 
				
			||||||
     * @param   The @c VXInstructionInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeModrm(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes the sib field of the instruction. This method reads an additional 
 | 
					 | 
				
			||||||
     *          input byte.
 | 
					 | 
				
			||||||
     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeSIB(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes vex prefix of the instruction. This method takes the current input byte
 | 
					 | 
				
			||||||
     *          to determine the vex prefix type and reads one or two additional input bytes
 | 
					 | 
				
			||||||
     *          on demand.
 | 
					 | 
				
			||||||
     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeVex(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Returns the effective operand size.
 | 
					 | 
				
			||||||
     * @param   info        The instruction info.
 | 
					 | 
				
			||||||
     * @param   operandSize The defined operand size.
 | 
					 | 
				
			||||||
     * @return  The effective operand size.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    uint16_t getEffectiveOperandSize(const VXInstructionInfo &info, 
 | 
					 | 
				
			||||||
        VXDefinedOperandSize operandSize) const;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes all instruction operands.
 | 
					 | 
				
			||||||
     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeOperands(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Decodes the specified instruction operand.
 | 
					 | 
				
			||||||
     * @param   info        The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand     The @c VXOperandInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @param   operandType The defined type of the operand.
 | 
					 | 
				
			||||||
     * @param   operandSize The defined size of the operand.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeOperand(VXInstructionInfo &info, VXOperandInfo &operand, 
 | 
					 | 
				
			||||||
        VXDefinedOperandType operandType, VXDefinedOperandSize operandSize);
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Resolves the effective operand and address mode of the instruction.
 | 
					 | 
				
			||||||
     *          This method requires a non-null value in the @c instrDefinition field of the 
 | 
					 | 
				
			||||||
     *          @c info struct.
 | 
					 | 
				
			||||||
     * @param   info    The @c VXInstructionInfo struct that receives the effective operand and
 | 
					 | 
				
			||||||
     *                  address mode.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void resolveOperandAndAddressMode(VXInstructionInfo &info) const;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Calculates the effective REX/VEX.w, r, x, b, l values.
 | 
					 | 
				
			||||||
     *          This method requires a non-null value in the @c instrDefinition field of the 
 | 
					 | 
				
			||||||
     *          @c info struct.
 | 
					 | 
				
			||||||
     * @param   info    The @c VXInstructionInfo struct that receives the effective operand and
 | 
					 | 
				
			||||||
     *                  address mode.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void calculateEffectiveRexVexValues(VXInstructionInfo &info) const;
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Collects and decodes optional instruction prefixes.
 | 
					 | 
				
			||||||
     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodePrefixes(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Collects and decodes the instruction opcodes using the opcode tree.
 | 
					 | 
				
			||||||
     * @param   info    The @c VXInstructionInfo struct that receives the decoded data.
 | 
					 | 
				
			||||||
     * @return  True if it succeeds, false if it fails.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool decodeOpcode(VXInstructionInfo &info);
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Default constructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    VXInstructionDecoder();
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Constructor.
 | 
					 | 
				
			||||||
 * @param   input               A reference to the input data source.
 | 
					 * @param   input               A reference to the input data source.
 | 
				
			||||||
     * @param   disassemblerMode    The disasasembler mode.                            
 | 
					 * @param   disassemblerMode    The disassembler mode.
 | 
				
			||||||
 * @param   preferredVendor     The preferred instruction-set vendor.
 | 
					 * @param   preferredVendor     The preferred instruction-set vendor.
 | 
				
			||||||
 * @param   instructionPointer  The initial instruction pointer.
 | 
					 * @param   instructionPointer  The initial instruction pointer.
 | 
				
			||||||
 | 
					 * @return  @c NULL if it fails, else an instruction decoder context.
 | 
				
			||||||
 | 
					 * @see     VXInstructionDecoder_Release
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    explicit VXInstructionDecoder(VXBaseDataSource *input, 
 | 
					VX_EXPORT VXInstructionDecoderContext* VXInstructionDecoder_CreateEx(
 | 
				
			||||||
        VXDisassemblerMode disassemblerMode = VXDisassemblerMode::M32BIT,
 | 
					    VXBaseDataSourceContext *input, 
 | 
				
			||||||
        VXInstructionSetVendor preferredVendor = VXInstructionSetVendor::ANY, 
 | 
					    VXDisassemblerMode disassemblerMode,
 | 
				
			||||||
        uint64_t instructionPointer = 0);
 | 
					    VXInstructionSetVendor preferredVendor, 
 | 
				
			||||||
public:
 | 
					    uint64_t instructionPointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Releases an instruction decoder.
 | 
				
			||||||
 | 
					 * @param   ctx The context of the instruction decoder to release.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					VX_EXPORT void VXInstructionDecoder_Release(
 | 
				
			||||||
 | 
					    VXInstructionDecoderContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Decodes the next instruction from the input data source.
 | 
					 * @brief   Decodes the next instruction from the input data source.
 | 
				
			||||||
     * @param   info    The @c VXInstructionInfo struct that receives the information about the
 | 
					 * @param   ctx  The instruction decoder context.
 | 
				
			||||||
     *                  decoded instruction.
 | 
					 * @param   info The @c VXInstructionInfo struct that receives the information about the decoded 
 | 
				
			||||||
     * @return  This method returns false, if the current position has exceeded the maximum input 
 | 
					 *               instruction.
 | 
				
			||||||
     *          length.
 | 
					 * @return  This function returns @c false if the current position exceeds the maximum input
 | 
				
			||||||
     *          In all other cases (valid and invalid instructions) the return value is true.
 | 
					 *          length. In all other cases (valid and invalid instructions) the return value is 
 | 
				
			||||||
 | 
					 *          @c true.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    bool decodeInstruction(VXInstructionInfo &info);
 | 
					VX_EXPORT bool VXInstructionDecoder_DecodeInstruction(
 | 
				
			||||||
public:
 | 
					    VXInstructionDecoderContext *ctx, 
 | 
				
			||||||
 | 
					    VXInstructionInfo *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Returns a pointer to the current data source.
 | 
					 * @brief   Returns a pointer to the current data source.
 | 
				
			||||||
     * @return  A pointer to the current data source.
 | 
					 * @param   ctx The instruction decoder context.
 | 
				
			||||||
 | 
					 * @return  The context of the data source.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    VXBaseDataSource* getDataSource() const;
 | 
					VX_EXPORT VXBaseDataSourceContext* VXInstructionDecoder_GetDataSource(
 | 
				
			||||||
 | 
					    const VXInstructionDecoderContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Sets a new data source.
 | 
					 * @brief   Sets a new data source.
 | 
				
			||||||
     * @param   input   A reference to the new input data source.
 | 
					 * @param   ctx   The instruction decoder context.
 | 
				
			||||||
 | 
					 * @param   input The context of the new input data source.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    void setDataSource(VXBaseDataSource *input);
 | 
					VX_EXPORT void VXInstructionDecoder_SetDataSource(
 | 
				
			||||||
 | 
					    VXInstructionDecoderContext *ctx, 
 | 
				
			||||||
 | 
					    VXBaseDataSourceContext *input);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Returns the current disassembler mode.
 | 
					 * @brief   Returns the current disassembler mode.
 | 
				
			||||||
 | 
					 * @param   ctx The instruction decoder context.
 | 
				
			||||||
 * @return  The current disassembler mode.
 | 
					 * @return  The current disassembler mode.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    VXDisassemblerMode getDisassemblerMode() const;
 | 
					VX_EXPORT VXDisassemblerMode VXInstructionDecoder_GetDisassemblerMode(
 | 
				
			||||||
 | 
					    const VXInstructionDecoderContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Sets the current disassembler mode.
 | 
					 * @brief   Sets the current disassembler mode.
 | 
				
			||||||
 | 
					 * @param   ctx                 The instruction decoder context.
 | 
				
			||||||
 * @param   disassemblerMode    The new disassembler mode.
 | 
					 * @param   disassemblerMode    The new disassembler mode.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    void setDisassemblerMode(VXDisassemblerMode disassemblerMode);
 | 
					VX_EXPORT void VXInstructionDecoder_SetDisassemblerMode(
 | 
				
			||||||
 | 
					    VXInstructionDecoderContext *ctx,
 | 
				
			||||||
 | 
					    VXDisassemblerMode disassemblerMode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Returns the preferred instruction-set vendor.
 | 
					 * @brief   Returns the preferred instruction-set vendor.
 | 
				
			||||||
 | 
					 * @param   ctx The instruction decoder context.
 | 
				
			||||||
 * @return  The preferred instruction-set vendor.
 | 
					 * @return  The preferred instruction-set vendor.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    VXInstructionSetVendor getPreferredVendor() const;
 | 
					VX_EXPORT VXInstructionSetVendor VXInstructionDecoder_GetPreferredVendor(
 | 
				
			||||||
 | 
					    const VXInstructionDecoderContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Sets the preferred instruction-set vendor.
 | 
					 * @brief   Sets the preferred instruction-set vendor.
 | 
				
			||||||
 | 
					 * @param   ctx             The instruction decoder context.
 | 
				
			||||||
 * @param   preferredVendor The new preferred instruction-set vendor.
 | 
					 * @param   preferredVendor The new preferred instruction-set vendor.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    void setPreferredVendor(VXInstructionSetVendor preferredVendor);
 | 
					VX_EXPORT void VXInstructionDecoder_SetPreferredVendor(
 | 
				
			||||||
 | 
					    VXInstructionDecoderContext *ctx,
 | 
				
			||||||
 | 
					    VXInstructionSetVendor preferredVendor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Returns the current instruction pointer.
 | 
					 * @brief   Returns the current instruction pointer.
 | 
				
			||||||
 | 
					 * @param   ctx The instruction decoder context.
 | 
				
			||||||
 * @return  The current instruction pointer.
 | 
					 * @return  The current instruction pointer.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    uint64_t getInstructionPointer() const;
 | 
					VX_EXPORT uint64_t VXInstructionDecoder_GetInstructionPointer(
 | 
				
			||||||
 | 
					    const VXInstructionDecoderContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Sets a new instruction pointer.
 | 
					 * @brief   Sets a new instruction pointer.
 | 
				
			||||||
 | 
					 * @param   ctx                 The instruction decoder context.
 | 
				
			||||||
 * @param   instructionPointer  The new instruction pointer.
 | 
					 * @param   instructionPointer  The new instruction pointer.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    void setInstructionPointer(uint64_t instructionPointer);
 | 
					VX_EXPORT void VXInstructionDecoder_SetInstructionPointer(
 | 
				
			||||||
};
 | 
					    VXInstructionDecoderContext *ctx,
 | 
				
			||||||
 | 
					    uint64_t instructionPointer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline uint8_t VXInstructionDecoder::inputPeek(VXInstructionInfo &info)
 | 
					/* ============================================================================================= */
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_dataSource)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return m_dataSource->inputPeek(info);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline uint8_t VXInstructionDecoder::inputNext(VXInstructionInfo &info)
 | 
					#ifdef __cplusplus
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_dataSource)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return m_dataSource->inputNext(info);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename T>
 | 
					#endif /* _VDE_VXINSTRUCTIONDECODERC_H_ */
 | 
				
			||||||
inline T VXInstructionDecoder::inputNext(VXInstructionInfo &info)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_dataSource)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        info.flags |= IF_ERROR_END_OF_INPUT;
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return m_dataSource->inputNext<T>(info);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint8_t VXInstructionDecoder::inputCurrent() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (!m_dataSource)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return m_dataSource->inputCurrent();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline VXBaseDataSource* VXInstructionDecoder::getDataSource() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return m_dataSource;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline void VXInstructionDecoder::setDataSource(VXBaseDataSource *input)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    m_dataSource = input;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline VXDisassemblerMode VXInstructionDecoder::getDisassemblerMode() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return m_disassemblerMode;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline void VXInstructionDecoder::setDisassemblerMode(VXDisassemblerMode disassemblerMode)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    m_disassemblerMode = disassemblerMode;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline VXInstructionSetVendor VXInstructionDecoder::getPreferredVendor() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return m_preferredVendor;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline void VXInstructionDecoder::setPreferredVendor(VXInstructionSetVendor preferredVendor)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    m_preferredVendor = preferredVendor;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline uint64_t VXInstructionDecoder::getInstructionPointer() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return m_instructionPointer;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline void VXInstructionDecoder::setInstructionPointer(uint64_t instructionPointer)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    m_instructionPointer = instructionPointer;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,10 +30,10 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "VXInstructionFormatterC.h"
 | 
					#include "VXInstructionFormatter.h"
 | 
				
			||||||
#include "VXDisassemblerUtilsC.h"
 | 
					#include "VXDisassemblerUtils.h"
 | 
				
			||||||
#include "VXInternalHelpersC.h"
 | 
					#include "VXInternalHelpers.h"
 | 
				
			||||||
#include "VXOpcodeTableInternalC.h"
 | 
					#include "VXOpcodeTableInternal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
| 
						 | 
					@ -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     : 22. October 2014
 | 
					  Last change     : 14. 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
 | 
				
			||||||
| 
						 | 
					@ -29,292 +29,133 @@
 | 
				
			||||||
 * SOFTWARE.
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
#pragma once
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <vector>
 | 
					#ifndef _VDE_VXINSTRUCTIONFORMATTERC_H_
 | 
				
			||||||
#include <unordered_map>
 | 
					#define _VDE_VXINSTRUCTIONFORMATTERC_H_
 | 
				
			||||||
#include <string>
 | 
					
 | 
				
			||||||
#include "VXDisassemblerTypes.h"
 | 
					#include "VXDisassemblerTypes.h"
 | 
				
			||||||
 | 
					#include "VXDisassemblerUtils.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Verteron
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C"
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					/* VXBaseSymbolResolver ======================================================================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _VXBaseSymbolResolverContext 
 | 
				
			||||||
 | 
					{ 
 | 
				
			||||||
 | 
					    VXContextDescriptor d; 
 | 
				
			||||||
 | 
					} VXBaseSymbolResolverContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Base class for all symbol resolver implementations.
 | 
					 * @brief   Releases a symbol resolver.
 | 
				
			||||||
 | 
					 * @param   ctx The context of the symbol resolver to free.
 | 
				
			||||||
 | 
					 * The context may no longer used after it was released.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class VXBaseSymbolResolver
 | 
					VX_EXPORT void VXBaseSymbolResolver_Release(
 | 
				
			||||||
{
 | 
					    VXBaseSymbolResolverContext *ctx);
 | 
				
			||||||
public:
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Destructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual ~VXBaseSymbolResolver();
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Resolves a symbol.
 | 
					 * @brief   Resolves a symbol.
 | 
				
			||||||
 | 
					 * @param   ctx     The symbol resolver context.
 | 
				
			||||||
 * @param   info    The instruction info.
 | 
					 * @param   info    The instruction info.
 | 
				
			||||||
 * @param   address The address.
 | 
					 * @param   address The address.
 | 
				
			||||||
     * @param   offset      Reference to an unsigned 64 bit integer that receives an offset 
 | 
					 * @param   offset  Pointer to an unsigned 64 bit integer that receives an offset relative to 
 | 
				
			||||||
     *                      relative to the base address of the symbol.
 | 
					 *                  the base address of the symbol.
 | 
				
			||||||
     * @return  The name of the symbol, if the symbol was found, @c NULL if not.
 | 
					 * @return  The name of the symbol if the symbol was found, else @c NULL.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    virtual const char* resolveSymbol(const VXInstructionInfo &info, uint64_t address, 
 | 
					VX_EXPORT const char* VXBaseSymbolResolver_ResolveSymbol(
 | 
				
			||||||
        uint64_t &offset);
 | 
					    VXBaseSymbolResolverContext *ctx,
 | 
				
			||||||
};
 | 
					    const VXInstructionInfo *info, 
 | 
				
			||||||
 | 
					    uint64_t address, 
 | 
				
			||||||
 | 
					    uint64_t *offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					/* VXCustomSymbolResolver ====================================================================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef const char* (*VXCustomSymbolResolver_ResolveSymbolCallback)(
 | 
				
			||||||
 | 
					    const VXInstructionInfo *info, 
 | 
				
			||||||
 | 
					    uint64_t address, 
 | 
				
			||||||
 | 
					    uint64_t *offset,
 | 
				
			||||||
 | 
					    void *userData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Base class for all instruction formatter implementations.
 | 
					 * @brief   Creates a custom symbol resolver.
 | 
				
			||||||
 | 
					 * @param   resolverCb  The resolver callback consulted when symbols need to be resolved.
 | 
				
			||||||
 | 
					 * @param   userData    A pointer to arbitrary data passed to the resolver callback.
 | 
				
			||||||
 | 
					 *                      May also be @c NULL.
 | 
				
			||||||
 | 
					 * @return  @c NULL if it fails, else a symbol resolver context.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class VXBaseInstructionFormatter
 | 
					VX_EXPORT VXBaseSymbolResolverContext* VXCustomSymbolResolver_Create(
 | 
				
			||||||
 | 
					    VXCustomSymbolResolver_ResolveSymbolCallback resolverCb,
 | 
				
			||||||
 | 
					    void *userData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* VXBaseInstructionFormatter ================================================================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _VXBaseInstructionFormatterContext
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
private:
 | 
					    VXContextDescriptor d;
 | 
				
			||||||
    static const char    *m_registerStrings[];
 | 
					} VXBaseInstructionFormatterContext;
 | 
				
			||||||
    VXBaseSymbolResolver *m_symbolResolver;
 | 
					
 | 
				
			||||||
    std::vector<char>     m_outputBuffer;
 | 
					 | 
				
			||||||
    size_t                m_outputStringLen;
 | 
					 | 
				
			||||||
    bool                  m_outputUppercase;
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Clears the output string buffer.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void outputClear();
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Returns the content of the output string buffer.
 | 
					 | 
				
			||||||
     * @return  Pointer to the content of the ouput string buffer.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    const char* outputString();
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Appends text to the ouput string buffer.
 | 
					 | 
				
			||||||
     * @param   text    The text.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void outputAppend(const char *text);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Appends formatted text to the output string buffer.
 | 
					 | 
				
			||||||
     * @param   format  The format string.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void outputAppendFormatted(const char *format, ...);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Changes automatic conversion of characters to uppercase.
 | 
					 | 
				
			||||||
     * @param   uppercase   Set true to enable automatic uppercase conversion.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void outputSetUppercase(bool uppercase);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Appends a formatted address to the output string buffer.
 | 
					 | 
				
			||||||
     * @param   info            The instruction info.
 | 
					 | 
				
			||||||
     * @param   address         The address.
 | 
					 | 
				
			||||||
     * @param   resolveSymbols  If this parameter is true, the method will try to display a
 | 
					 | 
				
			||||||
     *                          smybol name instead of the numeric value.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void outputAppendAddress(const VXInstructionInfo &info, uint64_t address, 
 | 
					 | 
				
			||||||
        bool resolveSymbols = true);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Appends a formatted immediate value to the output string buffer.
 | 
					 | 
				
			||||||
     * @param   info            The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand         The immediate operand.
 | 
					 | 
				
			||||||
     * @param   resolveSymbols  If this parameter is true, the method will try to display a
 | 
					 | 
				
			||||||
     *                          smybol name instead of the numeric value.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void outputAppendImmediate(const VXInstructionInfo &info, const VXOperandInfo &operand,
 | 
					 | 
				
			||||||
        bool resolveSymbols = false);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Appends a formatted memory displacement value to the output string buffer.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand The memory operand.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void outputAppendDisplacement(const VXInstructionInfo &info, const VXOperandInfo &operand);
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Returns the string representation of a given register.
 | 
					 | 
				
			||||||
     * @param   reg The register.
 | 
					 | 
				
			||||||
     * @return  The string representation of the given register.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    const char* registerToString(VXRegister reg) const;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Resolves a symbol.
 | 
					 | 
				
			||||||
     * @param   info        The instruction info.
 | 
					 | 
				
			||||||
     * @param   address     The address.
 | 
					 | 
				
			||||||
     * @param   offset      Reference to an unsigned 64 bit integer that receives an offset 
 | 
					 | 
				
			||||||
     *                      relative to the base address of the symbol.
 | 
					 | 
				
			||||||
     * @return  The name of the symbol, if the symbol was found, @c NULL if not.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    const char* resolveSymbol(const VXInstructionInfo &info, uint64_t address, 
 | 
					 | 
				
			||||||
        uint64_t &offset) const;
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Override this method to implement a custom disassembly syntax. Use the 
 | 
					 | 
				
			||||||
     *          @c outputAppend and @c outputAppendFormatted methods to fill the internal
 | 
					 | 
				
			||||||
     *          string buffer.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual void internalFormatInstruction(const VXInstructionInfo &info);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Default constructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    VXBaseInstructionFormatter();
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Constructor.
 | 
					 | 
				
			||||||
     * @param   symbolResolver  Pointer to a symbol resolver instance or @c NULL, if no smybol
 | 
					 | 
				
			||||||
     *                          resolver should be used.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    explicit VXBaseInstructionFormatter(VXBaseSymbolResolver *symbolResolver);
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Destructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    virtual ~VXBaseInstructionFormatter();
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Formats a decoded instruction.
 | 
					 * @brief   Formats a decoded instruction.
 | 
				
			||||||
 | 
					 * @param   ctx     The instruction formatter context.
 | 
				
			||||||
 * @param   info    The instruction info.
 | 
					 * @param   info    The instruction info.
 | 
				
			||||||
     * @return  Pointer to the formatted instruction string.
 | 
					 * @return  Pointer to the formatted instruction string. This pointer remains valid until 
 | 
				
			||||||
 | 
					 *          this function is called again or the context is released.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    const char* formatInstruction(const VXInstructionInfo &info);
 | 
					VX_EXPORT const char* VXBaseInstructionFormatter_FormatInstruction(
 | 
				
			||||||
public:
 | 
					    VXBaseInstructionFormatterContext *ctx,
 | 
				
			||||||
 | 
					    const VXInstructionInfo *info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Returns a pointer to the current symbol resolver.
 | 
					 * @brief   Returns a pointer to the current symbol resolver.
 | 
				
			||||||
     * @return  Pointer to the current symbol resolver or @c NULL, if no symbol resolver is used.
 | 
					 * @param   ctx     The instruction formatter context.
 | 
				
			||||||
 | 
					 * @return  Pointer to the current symbol resolver or @c NULL if no symbol resolver is used.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    VXBaseSymbolResolver* getSymbolResolver() const;
 | 
					VX_EXPORT VXBaseSymbolResolverContext* VXBaseInstructionFormatter_GetSymbolResolver(
 | 
				
			||||||
 | 
					    const VXBaseInstructionFormatterContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Sets a new symbol resolver.
 | 
					 * @brief   Sets a new symbol resolver.
 | 
				
			||||||
 | 
					 * @param   ctx             The instruction formatter context.
 | 
				
			||||||
 * @param   symbolResolver  Pointer to a symbol resolver instance or @c NULL, if no smybol
 | 
					 * @param   symbolResolver  Pointer to a symbol resolver instance or @c NULL, if no smybol
 | 
				
			||||||
 *                          resolver should be used.
 | 
					 *                          resolver should be used.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    void setSymbolResolver(VXBaseSymbolResolver *symbolResolver);
 | 
					VX_EXPORT void VXBaseInstructionFormatter_SetSymbolResolver(
 | 
				
			||||||
};
 | 
					    VXBaseInstructionFormatterContext *ctx,
 | 
				
			||||||
 | 
					    VXBaseSymbolResolverContext *resolver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void VXBaseInstructionFormatter::outputSetUppercase(bool uppercase)
 | 
					/**
 | 
				
			||||||
{
 | 
					 * @brief   Releases an instruction formatter.
 | 
				
			||||||
    m_outputUppercase = uppercase;
 | 
					 * @param   ctx The context of the instruction formatter to release.
 | 
				
			||||||
 | 
					 * The context may no longer used after it has been released.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					VX_EXPORT void VXBaseInstructionFormatter_Release(
 | 
				
			||||||
 | 
					    VXBaseInstructionFormatterContext *ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* VXIntelInstructionFormatter ================================================================ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Creates an Intel-syntax instruction formatter.
 | 
				
			||||||
 | 
					 * @return  @c NULL if it fails, else an Intel instruction formatter context.
 | 
				
			||||||
 | 
					 * @see     VXBaseInstructionFormatter_Release
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					VX_EXPORT VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_Create(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @brief   Creates an Intel-syntax instruction formatter.
 | 
				
			||||||
 | 
					 * @param   resolver The symbol resolver consulted to resolve symbols on formatting.
 | 
				
			||||||
 | 
					 * @return  @c NULL if it fails, else an Intel instruction formatter context.
 | 
				
			||||||
 | 
					 * @see     VXBaseInstructionFormatter_Release
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					VX_EXPORT VXBaseInstructionFormatterContext* VXIntelInstructionFormatter_CreateEx(
 | 
				
			||||||
 | 
					    VXBaseSymbolResolverContext *resolver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ============================================================================================= */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline char const* VXBaseInstructionFormatter::registerToString(VXRegister reg) const
 | 
					#endif /* _VDE_VXINSTRUCTIONFORMATTERC_H_ */
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (reg == VXRegister::NONE)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return "error";   
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return m_registerStrings[static_cast<uint16_t>(reg) - 1]; 
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline char const* VXBaseInstructionFormatter::resolveSymbol(const VXInstructionInfo &info, 
 | 
					 | 
				
			||||||
    uint64_t address, uint64_t &offset) const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (m_symbolResolver)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return m_symbolResolver->resolveSymbol(info, address, offset);    
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return nullptr;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline VXBaseSymbolResolver* VXBaseInstructionFormatter::getSymbolResolver() const
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return m_symbolResolver;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inline void VXBaseInstructionFormatter::setSymbolResolver(VXBaseSymbolResolver *symbolResolver)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    m_symbolResolver = symbolResolver;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Intel syntax instruction formatter.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
class VXIntelInstructionFormatter : public VXBaseInstructionFormatter
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Appends an operand cast to the output string buffer.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand The operand.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void outputAppendOperandCast(const VXInstructionInfo &info, const VXOperandInfo &operand);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Formats the specified operand and appends the resulting string to the output
 | 
					 | 
				
			||||||
     *          buffer.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     * @param   operand The operand.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void formatOperand(const VXInstructionInfo &info, const VXOperandInfo &operand);
 | 
					 | 
				
			||||||
protected:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Fills the internal string buffer with an intel style formatted instruction string.
 | 
					 | 
				
			||||||
     * @param   info    The instruction info.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void internalFormatInstruction(const VXInstructionInfo &info) override;
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Default constructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    VXIntelInstructionFormatter();
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Constructor.
 | 
					 | 
				
			||||||
     * @param   symbolResolver  Pointer to a symbol resolver instance or @c NULL, if no smybol
 | 
					 | 
				
			||||||
     *                          resolver should be used.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    explicit VXIntelInstructionFormatter(VXBaseSymbolResolver *symbolResolver);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Destructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    ~VXIntelInstructionFormatter() override;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @brief   Simple symbol resolver that only matches exact addresses.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
class VXExactSymbolResolver : public VXBaseSymbolResolver
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    std::unordered_map<uint64_t, std::string> m_symbolMap;
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Destructor.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    ~VXExactSymbolResolver() override;
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Resolves a symbol.
 | 
					 | 
				
			||||||
     * @param   info        The instruction info.
 | 
					 | 
				
			||||||
     * @param   address     The address.
 | 
					 | 
				
			||||||
     * @param   offset      Reference to an unsigned 64 bit integer that receives an offset 
 | 
					 | 
				
			||||||
     *                      relative to the base address of the symbol.
 | 
					 | 
				
			||||||
     * @return  The name of the symbol, if the symbol was found, @c NULL if not.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    const char* resolveSymbol(const VXInstructionInfo &info, uint64_t address, 
 | 
					 | 
				
			||||||
        uint64_t &offset) override;
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Query if the given address is a known symbol.
 | 
					 | 
				
			||||||
     * @param   address The address.
 | 
					 | 
				
			||||||
     * @return  True if the address is known, false if not.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    bool containsSymbol(uint64_t address) const;
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Adds or changes a symbol.
 | 
					 | 
				
			||||||
     * @param   address The address.
 | 
					 | 
				
			||||||
     * @param   name    The symbol name.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void setSymbol(uint64_t address, const char* name);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Removes the symbol described by address. This will invalidate all char pointers 
 | 
					 | 
				
			||||||
     *          to the specific symbol name.
 | 
					 | 
				
			||||||
     * @param   address The address.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void removeSymbol(uint64_t address);
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * @brief   Clears the symbol tree.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void clear();
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -39,6 +39,14 @@
 | 
				
			||||||
#   define VX_INLINE extern inline
 | 
					#   define VX_INLINE extern inline
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef VX_BUILD_SHARED /* set by CMake */
 | 
				
			||||||
 | 
					#   if defined(_MSC_VER)
 | 
				
			||||||
 | 
					#       define VX_EXPORT __declspec(dllexport)
 | 
				
			||||||
 | 
					#   elif defined(__GNUC__) || defined(__clang__) 
 | 
				
			||||||
 | 
					#       define VX_EXPORT __attribute__((dllexport))
 | 
				
			||||||
 | 
					#   endif
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#   define VX_EXPORT
 | 
					#   define VX_EXPORT
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _VDE_VXINTERNALCONFIG_H_ */
 | 
					#endif /* _VDE_VXINTERNALCONFIG_H_ */
 | 
				
			||||||
| 
						 | 
					@ -33,8 +33,8 @@
 | 
				
			||||||
#ifndef _VDE_VXINTERNALHELPERS_H_
 | 
					#ifndef _VDE_VXINTERNALHELPERS_H_
 | 
				
			||||||
#define _VDE_VXINTERNALHELPERS_H_
 | 
					#define _VDE_VXINTERNALHELPERS_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "VXInstructionDecoderC.h"
 | 
					#include "VXInstructionDecoder.h"
 | 
				
			||||||
#include "VXInstructionFormatterC.h"
 | 
					#include "VXInstructionFormatter.h"
 | 
				
			||||||
#include "VXInternalConfig.h"
 | 
					#include "VXInternalConfig.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**************************************************************************************************/
 | 
					**************************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "VXOpcodeTableC.h"
 | 
					#include "VXOpcodeTable.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VX_INVALID 0
 | 
					#define VX_INVALID 0
 | 
				
			||||||
#define VX_NODE(type, n) ((VXOpcodeTreeNode)type << 12 | (n))
 | 
					#define VX_NODE(type, n) ((VXOpcodeTreeNode)type << 12 | (n))
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -34,7 +34,7 @@
 | 
				
			||||||
#define _VDE_VXOPCODETABLEINTERNAL_H_
 | 
					#define _VDE_VXOPCODETABLEINTERNAL_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include "VXOpcodeTableC.h"
 | 
					#include "VXOpcodeTable.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @brief   Contains all opcode tables.
 | 
					 * @brief   Contains all opcode tables.
 | 
				
			||||||
| 
						 | 
					@ -1,147 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup Label="ProjectConfigurations">
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Debug|x64">
 | 
					 | 
				
			||||||
      <Configuration>Debug</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|Win32">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>Win32</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
    <ProjectConfiguration Include="Release|x64">
 | 
					 | 
				
			||||||
      <Configuration>Release</Configuration>
 | 
					 | 
				
			||||||
      <Platform>x64</Platform>
 | 
					 | 
				
			||||||
    </ProjectConfiguration>
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClInclude Include="VXDisassembler.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXDisassemblerUtils.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXDisassemblerTypes.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXInstructionDecoder.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXInstructionFormatter.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXOpcodeTable.h" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="VXDisassemblerUtils.cpp" />
 | 
					 | 
				
			||||||
    <ClCompile Include="VXInstructionDecoder.cpp" />
 | 
					 | 
				
			||||||
    <ClCompile Include="VXInstructionFormatter.cpp" />
 | 
					 | 
				
			||||||
    <ClCompile Include="VXOpcodeTable.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="Globals">
 | 
					 | 
				
			||||||
    <ProjectGuid>{F5C6F0A7-F75D-42BD-A8AB-A2D1D5F67099}</ProjectGuid>
 | 
					 | 
				
			||||||
    <Keyword>Win32Proj</Keyword>
 | 
					 | 
				
			||||||
    <RootNamespace>VerteronDisassemblerEngine</RootNamespace>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>StaticLibrary</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>StaticLibrary</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>StaticLibrary</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
 | 
					 | 
				
			||||||
    <ConfigurationType>StaticLibrary</ConfigurationType>
 | 
					 | 
				
			||||||
    <UseDebugLibraries>false</UseDebugLibraries>
 | 
					 | 
				
			||||||
    <PlatformToolset>v120</PlatformToolset>
 | 
					 | 
				
			||||||
    <WholeProgramOptimization>true</WholeProgramOptimization>
 | 
					 | 
				
			||||||
    <CharacterSet>Unicode</CharacterSet>
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionSettings">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
 | 
					 | 
				
			||||||
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
  <PropertyGroup Label="UserMacros" />
 | 
					 | 
				
			||||||
  <PropertyGroup />
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <Optimization>Disabled</Optimization>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
 | 
					 | 
				
			||||||
    <ClCompile>
 | 
					 | 
				
			||||||
      <WarningLevel>Level3</WarningLevel>
 | 
					 | 
				
			||||||
      <PrecompiledHeader>
 | 
					 | 
				
			||||||
      </PrecompiledHeader>
 | 
					 | 
				
			||||||
      <Optimization>MaxSpeed</Optimization>
 | 
					 | 
				
			||||||
      <FunctionLevelLinking>true</FunctionLevelLinking>
 | 
					 | 
				
			||||||
      <IntrinsicFunctions>true</IntrinsicFunctions>
 | 
					 | 
				
			||||||
      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
 | 
					 | 
				
			||||||
    </ClCompile>
 | 
					 | 
				
			||||||
    <Link>
 | 
					 | 
				
			||||||
      <SubSystem>Windows</SubSystem>
 | 
					 | 
				
			||||||
      <GenerateDebugInformation>true</GenerateDebugInformation>
 | 
					 | 
				
			||||||
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
 | 
					 | 
				
			||||||
      <OptimizeReferences>true</OptimizeReferences>
 | 
					 | 
				
			||||||
    </Link>
 | 
					 | 
				
			||||||
  </ItemDefinitionGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
 | 
					 | 
				
			||||||
  <ImportGroup Label="ExtensionTargets">
 | 
					 | 
				
			||||||
  </ImportGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,17 +0,0 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClInclude Include="VXDisassembler.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXDisassemblerTypes.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXDisassemblerUtils.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXInstructionDecoder.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXInstructionFormatter.h" />
 | 
					 | 
				
			||||||
    <ClInclude Include="VXOpcodeTable.h" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					 | 
				
			||||||
    <ClCompile Include="VXDisassemblerUtils.cpp" />
 | 
					 | 
				
			||||||
    <ClCompile Include="VXInstructionDecoder.cpp" />
 | 
					 | 
				
			||||||
    <ClCompile Include="VXInstructionFormatter.cpp" />
 | 
					 | 
				
			||||||
    <ClCompile Include="VXOpcodeTable.cpp" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
</Project>
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue