#include <Zydis/Disassembler.h>
#include <Zycore/LibC.h>
static ZyanStatus ZydisDisassemble(ZydisMachineMode machine_mode,
ZyanU64 runtime_address, const void* buffer, ZyanUSize length,
ZydisDisassembledInstruction *instruction, ZydisFormatterStyle style)
{
if (!buffer || !instruction)
{
return ZYAN_STATUS_INVALID_ARGUMENT;
}
*instruction = (ZydisDisassembledInstruction)
{
.runtime_address = runtime_address
};
ZydisStackWidth stack_width;
switch (machine_mode)
{
case ZYDIS_MACHINE_MODE_LONG_64:
stack_width = ZYDIS_STACK_WIDTH_64;
break;
case ZYDIS_MACHINE_MODE_LONG_COMPAT_32:
case ZYDIS_MACHINE_MODE_LEGACY_32:
stack_width = ZYDIS_STACK_WIDTH_32;
break;
case ZYDIS_MACHINE_MODE_LONG_COMPAT_16:
case ZYDIS_MACHINE_MODE_LEGACY_16:
case ZYDIS_MACHINE_MODE_REAL_16:
stack_width = ZYDIS_STACK_WIDTH_16;
break;
default:
return ZYAN_STATUS_INVALID_ARGUMENT;
}
ZydisDecoder decoder;
ZYAN_CHECK(ZydisDecoderInit(&decoder, machine_mode, stack_width));
ZydisDecoderContext ctx;
ZYAN_CHECK(ZydisDecoderDecodeInstruction(&decoder, &ctx, buffer, length, &instruction->info));
ZYAN_CHECK(ZydisDecoderDecodeOperands(&decoder, &ctx, &instruction->info,
instruction->operands, instruction->info.operand_count));
ZydisFormatter formatter;
ZYAN_CHECK(ZydisFormatterInit(&formatter, style));
ZYAN_CHECK(ZydisFormatterFormatInstruction(&formatter, &instruction->info,
instruction->operands, instruction->info.operand_count_visible, instruction->text,
sizeof(instruction->text), runtime_address, ZYAN_NULL));
return ZYAN_STATUS_SUCCESS;
}
ZyanStatus ZydisDisassembleIntel(ZydisMachineMode machine_mode,
ZyanU64 runtime_address, const void* buffer, ZyanUSize length,
ZydisDisassembledInstruction *instruction)
{
return ZydisDisassemble(machine_mode, runtime_address, buffer, length, instruction,
ZYDIS_FORMATTER_STYLE_INTEL);
}
ZyanStatus ZydisDisassembleATT(ZydisMachineMode machine_mode,
ZyanU64 runtime_address, const void* buffer, ZyanUSize length,
ZydisDisassembledInstruction *instruction)
{
return ZydisDisassemble(machine_mode, runtime_address, buffer, length, instruction,
ZYDIS_FORMATTER_STYLE_ATT);
}