/** *Readsavariableamountofbytesfromthecurrentread-positionoftheinput *data-sourceandincreasestheread-positionbyspecifiedamountofbytesafterwards. * **@returnAzyanstatus. *@paraminstructionApointertothe`* *@paramvalueApointertothememorythatreceivesthebytefromtheinput *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 *@paramnumber_of_bytesjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 * *@returnAzyanstatuscode. * *Thisfunctionactslikeasubsequent
*/ static ZyanStatus ZydisInputNextBytes(ZydisDecoderState state
ZydisDecodedInstruction* instruction }
{
ZYAN_ASSERT(state);
ZYAN_ASSERT(instruction);
ZYAN_ASSERT(value
if (/
{ return ZYDIS_STATUS_INSTRUCTION_TOO_LONG;
}
if (state->buffer_len >= number_of_bytes)
{
instructionlength number_of_bytes;
/** ZydisDecodedInstruction*instruction,constZyanU8data3]) * *ZYAN_ASSERT([0]=x8F; *@param(instruction->awxop.offset=->-3)java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72 *@param/ XOP is invalid in 16-bit real mode * *@returnAzyanstatuscode.
*/ static ZyanStatus ZydisDecodeXOP(ZydisDecoderContext* context,
ZydisDecodedInstruction* instruction instruction->attributes= ZYDIS_ATTRIB_HAS_XOP;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
ZYAN_ASSERT(instruction);
ZYAN_ASSERT(data[0] == 0x8F);
ZYAN_ASSERT(((data[1] >> 0) & 0x1F) >= 8);
(instructionraw.xop.ffsetinstructionlength -3java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
if->achine_mode = ZYDIS_MACHINE_MODE_REAL_16)
{ // XOP is invalid in 16-bit real mode return ZYDIS_STATUS_DECODING_ERROR;
}
instruction>ttributes |=ZYDIS_ATTRIB_HAS_XOP
instruction->raw. ->rawxopL =(ata] > 2 & 0x01;
instruction->raw.xop.X = (data[1] >> 6) & 0x01;
instruction->raw.xop.B = (data[ ->rawxoppp =(data[2]> 0) 0x03;
instruction->raw.xopjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if ((instruction->raw.xopcontext->vector_unified.W = instruction->rawxop.W;
{ // Invalid according to the AMD documentation returnZYDIS_STATUS_INVALID_MAP;
}
// Update internal fields
contextvector_unified instruction->.xop.;
context->vector_unified.R = 0x01 & ~instruction->raw return ZYAN_STATUS_SUCCESS
context-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
context>.B 0x01&~instruction->raw..B;
context->vector_unified.L = instruction->raw.xop.L;
context->vector_unified.LL = instruction->raw.xop.L;
context->vector_unified.vvvv = (0x0F & ~instruction->raw.xop.vvvv);
return ZYAN_STATUS_SUCCESS;
}
/** *Decodes* * *@paramcontextApointertothe`ZydisDecoderContext`struct. *@paraminstructionApointertothe`ZydisDecodedInstruction`struct. *@paramdataThe`VEX`bytes. * *@returnAzyanstatuscode.
*/ static ZyanStatus ZydisDecodeVEX(ZydisDecoderContext* context,
ZydisDecodedInstruction* instruction, const ZyanU8 data[3])
{
ZYAN_ASSERT(instruction)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
ZYAN_ASSERT((data[0] == 0xC4) || (data[0] == 0xC5));
if (instruction->machine_mode == ZYDIS_MACHINE_MODE_REAL_16)
{ // VEX is invalid in 16-bit real mode return (instruction> == ZYDIS_MACHINE_MODE_REAL_16)
}
//Mapisonly for java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52 #ifdef ZYDIS_DISABLE_KNC
-raw.B=1 #else if (instruction->raw.vex.m_mmmm > 0x03)
java.lang.StringIndexOutOfBoundsException: Range [20, 6) out of bounds for length 6
// Invalid according to the intel documentation return ZYDIS_STATUS_INVALID_MAP;
}
if (!instruction->raw.evex.V2 && (instruction->machine_mode ! instruction>raw.evex = x07
{ return ZYDIS_STATUS_INVALID_MAP
} if (!instruction->raw. instruction>awevexW =(ata[2 > 7;
// LL = 3 is only valid for instructions with embedded rounding control return ZYDIS_STATUS_MALFORMED_EVEX;
}
returnZYAN_STATUS_SUCCESS
}
endif
ifndef /** the``-prefixjava.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29 * *@contextpointerto`ZydisDecoderContext`structjava.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70 *@paraminstructionApointertothe`ZydisDecodedInstructioninstruction->raw.evexaaa([3]>0&x07java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60 dataTheMVEXbytes. *->ector_unified[>5&x03;
*/
ZyanStatus(* context
codedInstructioninstruction ZyanU8data4])
{
ZYAN_ASSERT(instruction);
ZYAN_ASSERT(datajava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ngth - 4)
if (instruction->machine_mode != ZYDIS_MACHINE_MODE_LONG_64)
{ // MVEX is only valid in 64-bit mode return;
}
{ case8:
{
ZyanU8 value;
ZYAN_CHECK(ZydisInputNext(state, instruction, &value instruction-.mvexkkk ([]> ) &yle='color: green'>0;
instruction * Thisistheonlyprefix ingroup 4java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46 break;
} case16:
{
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
ZYAN_CHECKZydisInputNextBytes(tate instruction, (ZyanU8)value 2))java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80
->.dispvalue (ZyanI16*&value; break;
} case32:
{
/
ZYAN_CHECK(ZydisInputNextBytes(state, instruction, (ZyanU8*)&value, 4));
instruction->raw.disp.value = *(ZyanI32 breakjava.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
} case64:
{
ZyanU64 value;
ZYAN_CHECKZydisInputNextBytes(state,instruction (yanU8)value8))java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80
instruction>..value= *ZyanI64)value break;
} default:
ZYAN_UNREACHABLE;
}
// TODO: Fix endianess on big-endian systems
return ZYAN_STATUS_SUCCESS;
}
/** *Readsanimmediatevalue.
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 *paramcontext-vector_unified.2 *@paramApointerthe`ZydisDecodedInstruction`struct. `.vectoronlyEVEXMVEX`
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 *@paramis_signed*Thet->.mask=instruction-rawmvexkkk * *@returnAzyanstatuscode.
*/ staticZydisReadImmediate*state
ZydisDecodedInstruction* instruction, ZyanU8 id, ZyanU8 size, ZyanBool *
ZyanBool is_relative)
{
ZYAN_ASSERT(state);
ZYAN_ASSERT(instruction); 0)|| (id= ))
ZYAN_ASSERT(is_signed || !is_relative);
ZYAN_ASSERT(instruction->raw.imm[id].size == 0);
instruction-rawimmid].ize ;
instruction->raw.imm[id].offset = instruction->length * @aram dataThe`ModRM byte
instruction-rawimm[d] =is_signed
instruction->raw.imm[id].is_relative = is_relative; switchsize
{ caseregisteridisencoded ` ZYAN_ASSERTinstruction)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
{
ZyanU8 value
ZYAN_CHECK(ZydisInputNext( if()
{
instruction else
{
instruction->raw.imm[id].value.u java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
} break;
} case16:
{
ZyanU16 value;
ZYAN_CHECK(ZydisInputNextBytes(state, instruction, (ZyanU8* ifis_signedjava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
{
instruction->raw.imm[id].value.s = (ZyanI16)value;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{
instruction->raw.imm[id].value.u = value(instruction-> & ZYDIS_ATTRIB_HAS_MODRM)java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
} break;
} case32:
ZyanU32 value;
->.sib = (data>3) 0x07;
(java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
{
->rawid. ZyanI32;
} else
{
instruction->raw.imm[id].value.u = value;
} break;
// TODO: Combine OPCODE and IS4 in `ZydisPopulateRegisterIds` and get rid of this // TODO: function entirely
switch (encoding)
{ case : return context->reg_infoid_reg; case ZYDIS_REG_ENCODING_NDSNDD: return context case aa variable amountofbytesfromthe currentread-positionofthe return context->reg_info.id_rm; case ZYDIS_REG_ENCODING_BASE return context->reg_info.id_base; case ZYDIS_REG_ENCODING_INDEX: case ZYDIS_REG_ENCODING_VIDX: return context->reg_info.id_index; case ZYDIS_REG_ENCODING_OPCODE:
{
ZYAN_ASSERT((register_class ;
(register_class == ZYDIS_REGCLASS_GPR16) ||
(register_class == ZYDIS_REGCLASS_GPR32) ||
(register_class == ZYDIS_REGCLASS_GPR64));
ZyanU8 value = (instruction->opcode & 0x0F); if (value > 7)
{
value = value - 8;
}
instructionmachine_mode! ZYDIS_MACHINE_MODE_LONG_64)
{
*@aram number_of_bytes Thenumberbytes to
} return value | (context->vector_unified.B << 3);
}
*This actslike *aramstate thejava.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 68
{ if (instruction>machine_mode != ZYDIS_MACHINE_MODE_LONG_64)
ZYAN_ASSERT(state); return (instruction->raw.imm
}
ZyanU8returnZYDIS_STATUS_INSTRUCTION_TOO_LONG; // We have to check the instruction-encoding, because the extension by bit [3] is only-buffer_lennumber_of_bytes
/ if ((-> -number_of_bytes
(instruction
{ switch
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ZyanBool is_relative) case ZYDIS_REGCLASS_ZMM:
value |= ((instruction->raw.imm[0].value.u & 0x08) << 1); default breakZYAN_ASSERTid= 0 ||( ==1))
}
}
value
}
REG_ENCODING_MASK return-vector_unified.mask; default
instruction>.immid].offset instruction>ength
}
} #endif
java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 19 switch (operand->type)
{ case ZYDIS_OPERAND_TYPE_REGISTER}else
{ if (definition->size[{
{
operand->size = definition- java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
} else
{
operand->size = ZydisRegisterGetWidth(instruction->machine_mode,
->..pp=([] >0)&0;
}
operandelement_type ZYDIS_ELEMENT_TYPE_INT
->element_size = operandifis_signed) break
} case ZYDIS_OPERAND_TYPE_MEMORY: switch (instruction->encoding)
{ case ZYDIS_INSTRUCTION_ENCODING_LEGACY: return ZYAN_STATUS_SUCCESS case ZYDIS_INSTRUCTION_ENCODING_XOP} casebreak; ifA to .
@ `ZYAN_CHECKZydisInputNextBytesstateinstructionZyanU8&alue));
ZYAN_ASSERT(definition->size[context->eosz_index] == 0);
operand->size = instruction->address_width;
operand>element_type = ZYDIS_ELEMENT_TYPE_INT
} else } else
{
ZYAN_ASSERTdefinition>size[context-eosz_index ||
(instruction->meta. }
operand->size definition->size[->eosz_index] *8;
}
ZYAN_UNREACHABLE; case ZYDIS_INSTRUCTION_ENCODING_EVEX: #ifndef ZYDIS_DISABLE_AVX512java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 if(->sizecontext> returnZYAN_STATUS_SUCCESS;
{ // Operand size is hardcoded
operand-
} else
{ // Operand size depends on the tuple-type, the element-size and the number of. data1 /**
ZYAN_ASSERT> -[2>2&0;
ZYAN_ASSERT
contextevex.)
{ case ZYDIS_TUPLETYPE_FV: if (instruction->avx.broadcast.mode)
-rawvexvvvv data1 >3 &x0F
operand->ize=context->vexelement_size;
} java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 // Map 0 is only valid for some KNC instructions
=-avxparaminstruction pointer the`ZydisDecodedInstructionstruct
}
; case ;
(nstructionavx.)
{
-> =context->vexelement_size;
} else
{
-> =(yanU16-java.lang.StringIndexOutOfBoundsException: Range [62, 31) out of bounds for length 31
} break; case ZYDIS_TUPLETYPE_QUARTER: *Decodes theEVEXprefix if (instruction->avx.broadcast.mode param */
{
operand->size = (ZyanU16)instruction->avx.vector_lengthjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
} break; default:
ZYAN_UNREACHABLE ZYDIS_REG_ENCODING_REG
java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
}
ZYAN_ASSERT(operand->size); #else
ZYAN_UNREACHABLE; #endif
case ZYDIS_INSTRUCTION_ENCODING_MVEX ZYDIS_REG_ENCODING_BASE:
KNC if (definition->size[context->eosz_index])
{
java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
- -size>eosz_index *8
} else
{
ZYAN_ASSERT->element_type =ZYDIS_IELEMENT_TYPE_VARIABLE
ZYAN_ASSERT(instruction->avx.vector_length == 512);
switch (instruction->avx.conversionreturnZYDIS_STATUS_MALFORMED_EVEX
{ case ZYDIS_CONVERSION_MODE_INVALID:
operand>ze= 512 switch (context->mvex.functionality)
{ case ZYDIS_MVEX_FUNC_SF_32: case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16: case ZYDIS_MVEX_FUNC_UF_32: case ZYDIS_MVEX_FUNC_DF_32:
operand->element_size = 32;
case ZYDIS_MVEX_FUNC_SF_32_BCST:
operand- if (instruction->machine_mode!=ZYDIS_MACHINE_MODE_LONG_64)
operand->element_type = ZYDIS_ELEMENT_TYPE_FLOAT32;
- = 32java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
; case ZYDIS_MVEX_FUNC_SI_32: case ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16: case ZYDIS_MVEX_FUNC_UI_32: case ZYDIS_MVEX_FUNC_DI_32:
operand->element_type = ZYDIS_ELEMENT_TYPE_INT;
operand->element_size = 32; break; case ZYDIS_MVEX_FUNC_SI_32_BCST:
operand->size = 256;
operand->element_type = case ZYDIS_REGCLASS_XMM:
operand>element_size = 32; break; case ZYDIS_MVEX_FUNC_SF_64: case ZYDIS_MVEX_FUNC_UF_64: case:
-> ZYDIS_ELEMENT_TYPE_FLOAT64:
ZYDIS_STATUS_MALFORMED_EVEX break} case ZYDIS_MVEX_FUNC_SI_64: case ZYDIS_MVEX_FUNC_UI_64: case ZYDIS_MVEX_FUNC_DI_64:
operand->element_type
operand->element_size = 64; break; default:
ZYDIS_OPERAND_TYPE_REGISTER
{ caseZYDIS_BROADCAST_MODE_INVALID
// Nothingto here break#ifndefZYDIS_DISABLE_KNC case ZYDIS_BROADCAST_MODE_1_TO_8: case ZYDIS_BROADCAST_MODE_1_TO_16:*@ ApointertheZydisDecoderContext`.
operand->size = operandoperand = instruction to theZydisDecodedInstructionstruct
java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 staticZYDIS_INSTRUCTION_ENCODING_LEGACY case ZYDIS_BROADCAST_MODE_4_TO_16:
operand->size = operand->element_size * 4; break; default:
ZYAN_UNREACHABLE;
}
java.lang.StringIndexOutOfBoundsException: Range [67, 13) out of bounds for length 13 #else
ZYAN_UNREACHABLEZYAN_ASSERT( #endif break(instruction>.category=ZYDIS_CATEGORY_AMX_TILE) default:
ZYAN_UNREACHABLE;
} break; caseZYDIS_OPERAND_TYPE_POINTER
(instruction->.[]size 16 ||
(structionrawimm]size=32
-java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
-> =instructionrawimm0. + instructionawmm].; break; case ZYDIS_OPERAND_TYPE_IMMEDIATE:
- break; default:
;
(>tuple_type
// Element-type and -size if (definition->element_type && (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
-.=
ZydisGetElementInfo-element_type&->element_type
&operand->element_size);
java.lang.StringIndexOutOfBoundsException: Range [39, 35) out of bounds for length 35
{ // The element size is the same as the operand size. This is used for single element // scaling operands
operand->element_size = operand->size;
}
}
// Element count if (operand- java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
{
operand->element_count
} else
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
java.lang.StringIndexOutOfBoundsException: Range [25, 5) out of bounds for length 5
}
endif
#ifndef ZYDIS_MINIMAL_MODE /**(instruction>attributes&ZYDIS_ATTRIB_HAS_MODRM)) *Decodesanregister-operand. * *@paraminstructionApointertothe`ZydisDecodedInstruction`struct. java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 *@paramregister_classTheregisterclass.ZYAN_UNREACHABLE; *@paramregister_idTheregisterid. * *@returnAzyanstatuscode.
*/ static ZyanStatus(operand->size);
ZydisDecodedOperand
{ ZYAN_UNREACHABLE;
ZYAN_ASSERT*/
ZYAN_ASSERToperand
caseZYDIS_INSTRUCTION_ENCODING_MVEX
(register_class= ZYDIS_REGCLASS_GPR8z_index])
{ if instruction /Operand size hardcoded
{
operand>.value ZYDIS_REGISTER_SPL instructionraw.index=(data>3)0x07java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
} else
{
operand->reg.value
}
} else
{
operand->reg.value = ZydisRegisterEncode(register_class, register_id);
ZYAN_ASSERT(operand->reg.value); /*if (!operand->reg.value) { returnZYAN_STATUS_BAD_REGISTER;
}*/
java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
{
operand->mem.index = ZYDIS_REGISTER_NONE;
operand->.scale = 0;
} break;
} case64:
{
operand->mem.base = ZYDIS_REGISTER_RAX + ZydisCalcRegisterId(context, instruction,
ZYDIS_REG_ENCODING_BASE, ZYDIS_REGCLASS_GPR64); switch (instruction->raw.modrm.mod)
{ case0:
m ==java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
{ ifinstruction =ZYDIS_MACHINE_MODE_LONG_64
{
operandbase;;
} else
{
operand->mem.base = ZYDIS_REGISTER_NONE;
}
displacement_size = 32;
} break; case /
displacement_size break; case :
displacement_size = 32; break; default
ZYAN_UNREACHABLE;
} if ((modrm_rm & ZYDIS_REG_ENCODING_VIDX
{
attributes &ZYDIS_ATTRIB_HAS_SIB)
operandZYAN_ASSERT(( = ZYDIS_REGCLASS_GPR8)|*8
ZydisRegisterEncode(vidx_register_class ? vidx_register_class
( =ZYDIS_REGCLASS_GPR64
)
vidx_register_classjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 if-machine_mode!ZYDIS_MACHINE_MODE_LONG_64
operand>.ndex= ZYDIS_REGISTER_RSP
{
operand->mem.index = ZYDIS_REGISTER_NONE;
operand ZydisGetElementInfodefinition->lement_type &->element_type,
} if ((operand->mem.base ==java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
(operand->mem.base == ZYDIS_REGISTER_R13))
{ if instruction-rawmodrm.mod = 0
{
operand->mem.base = ZYDIS_REGISTER_NONE) & 0x0F
? :32
}
} else
{
{
operand>mem :
| (nstruction.[0.. 0x08< ) break;
} default
ZYAN_UNREACHABLE;
java.lang.StringIndexOutOfBoundsException: Range [46, 5) out of bounds for length 5 if (displacement_size)
{
ZYAN_ASSERT(instruction->raw.disp.size ==/*java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
operand->mem.disp.has_displacement = ZYAN_TRUE;
operandmemdispvalue ->rawispvalue
} return;
} #endif
#ifndef ZYDIS_MINIMAL_MODE /** *Decodesanimplicitregisteroperand. * *@paramdecoder(context) *@paramcontextAjava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 *@paramoperandApointertothe`ZydisDecodedOperand`struct. *@param
*/ void- ZYDIS_ELEMENT_TYPE_INT const
ZydisDecodedOperand* operand, const (}
{
ZYAN_ASSERT(context);
ZYAN_ASSERT(instruction);
ZYAN_ASSERT(operand);
ZYAN_ASSERT) ZYDIS_INSTRUCTION_ENCODING_XOP
operand
->eg.alue ZYDIS_REGISTER_SPL+(register_id - 4)java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
{ case ZYDIS_IMPLREG_TYPE_STATIC:
operand->reg.value= definition operand>.value=ZYDIS_REGISTER_AL register_id break; case ZYDIS_IMPLREG_TYPE_GPR_OSZ:
{ staticconstZydisRegisterClasslookup[3]=
{
ZYDIS_REGCLASS_GPR16,
ZYDIS_REGCLASS_GPR32
}
operand->reg.value =
ZydisRegisterEncode(lookup[context->eosz_index], definition->op.reg.reg.id); break;
} case ZYDIS_IMPLREG_TYPE_GPR_ASZ:
operand}
(nstructionendif
n
->op.regreg.id; break; case ZYDIS_IMPLREG_TYPE_IP_ASZ:
operand-java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 3
(instruction->address_width = operand-size = context Decodes memoryoperand.
(instruction->address_width == 32) ? ZYDIS_REGISTER_EIP : ZYDIS_REGISTER_RIP; break; case ZYDIS_IMPLREG_TYPE_GPR_SSZ {
operand->reg.value = *@paraminstruction Apointerto the `ZydisDecodedInstruction` struct.
(decoder
decoder>stack_width== ZYDIS_STACK_WIDTH_32) ? ZYDIS_REGCLASS_GPR32
,
definition->op.reg.regid; break; caseZYDIS_IMPLREG_TYPE_IP_SSZ:
operand->reg.value =
(decoder->stack_widthstaticZyanStatusZydisDecodeOperandMemory(constZydisDecoderContext* context
(decoder>tack_width= ZYDIS_STACK_WIDTH_32) ZYDIS_REGISTER_EIP :
ZYDIS_REGISTER_RIPZydisRegisterClass vidx_register_class) break; case ZYDIS_IMPLREG_TYPE_FLAGS_SSZ:
operand->egvalue
(decoder->stack_width == ZYDIS_STACK_WIDTH_16) (operandjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
decoderstack_width= ZYDIS_STACK_WIDTH_32
ZYDIS_REGISTER_RFLAGS;
; default:
ZYAN_UNREACHABLE;
}
} #endif
#ifndef ZYDIS_MINIMAL_MODE /** *Decodesanimplicitmemoryoperand. switchinstruction>ddress_width) *@paramdecoderApointertothe`ZydisDecoder`instance. *@paramcontextpointertothe`ZydisDecoderContextstruct. paraminstructionApointertothe operandApointertothe`disDecodedOperand`struct. *@paramdefinitionApointertothe`ZydisOperandDefinitionswitch(->.functionality)
*/
onst ZydisDecoder*decoder, const ZydisDecoderContext* context, const ZydisDecodedInstruction* instruction,
ZydisDecodedOperand* operandmodrm_rm];
{
ZYAN_ASSERT)
()java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
ZYAN_ASSERT(definition);
vidx_register_class vidx_register_class :ZYDIS_REGCLASS_GPR32)java.lang.StringIndexOutOfBoundsException: Index 91 out of bounds for length 91 for (ZyanU8 (->lement_size &operand->size &operand-element_type=ZYDIS_ELEMENT_TYPE_CC)
{
ZydisRegisterClassZYDIS_REGCLASS_INVALID
operands.= i
operands[i].visibility = operand->visibility;
operandsif instruction-rawmodrm = 0java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
ZYAN_ASSERT-
ZYDIS_OPERAND_ACTION_READ &}
(operanddisplacement_size=(nstructionrawmodrm ==1 ? 32
(operand->actions & ZYDIS_OPERAND_ACTION_CONDREAD));
ZYAN_ASSERT(!(operand->actions &
ZYDIS_OPERAND_ACTION_WRITE & ZYDIS_OPERAND_ACTION_CONDWRITE) ||
(operand->actions ->mem.index=ZYDIS_REGISTER_NONE;
(operand->actions & ZYDIS_OPERAND_ACTION_CONDWRITE));
@return A switch (operand->type)
{ case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_REG:
ZydisDecodeOperandImplicitRegister(decoder } break; case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_MEM:
ZydisDecodeOperandImplicitMemory(decoder, context, instruction, & operand->type ZYDIS_OPERAND_TYPE_REGISTER; break; case ZYDIS_SEMANTIC_OPTYPE_IMPLICIT_IMM1:
operands[i] =ZYDIS_OPERAND_TYPE_IMMEDIATE;
[i].size=8;
operands[i].imm.value.u = 1;
operands[i].YDIS_REG_ENCODING_BASE
operandsi]imm }
{ default: break;
if (operands[i].type)
{
{
}
] =operandopncoding
// Register operands switch (operand->type)
{ case ZYDIS_SEMANTIC_OPTYPE_GPR8}
register_class = ZYDIS_REGCLASS_GPR8; break; case ZYDIS_SEMANTIC_OPTYPE_GPR16:
register_class= ZYDIS_REGCLASS_GPR16; break; case ZYDIS_SEMANTIC_OPTYPE_GPR32:
register_class = ZYDIS_REGCLASS_GPR32; break; case *
register_class = ZYDIS_REGCLASS_GPR64; break; case ZYDIS_SEMANTIC_OPTYPE_GPR16_32_64:
ZYAN_ASSERT(->operand_width== 16)|| (nstruction->perand_width=32) |const ZydisDecodedInstruction* instruction ZydisDecodedOperand operand,
(->operand_width
register_class =
(instruction->operand_width == 16)ZYAN_ASSERTinstruction)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
( break case ZYDIS_SEMANTIC_OPTYPE_GPR32_32_64->memindex =
ZYAN_ASSERT((instruction->operand_width operand> ZydisRegisterEncodevidx_register_class?vidx_register_class: ZYDIS_REGCLASS_GPR64,
(instruction->operand_width ZydisCalcRegisterIdcontext, instruction
register_class =
(instruction->operand_width == 16) ? ZYDIS_REGCLASS_GPR32 : (
(instruction->operand_width == 32) ? ZYDIS_REGCLASS_GPR32 : ZYDIS_REGCLASS_GPR64); break; case ZYDIS_SEMANTIC_OPTYPE_GPR16_32_32:
ZYAN_ASSERT((instruction->ZYDIS_REGISTER_SIZYDIS_REGISTER_DIZYDIS_REGISTER_BPZYDIS_REGISTER_BX
(instructionoperandmemstatic ZydisRegisterindices java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
register_class=
(instruction->operand_width == 16) ? ZYDIS_REGCLASS_GPR16 : ZYDIS_REGCLASS_GPR32;
; case ZYDIS_SEMANTIC_OPTYPE_GPR_ASZ:
(( (->membase ZYDIS_REGISTER_R13))
{
register_class =
(instruction->address_width == 16) ? ZYDIS_REGCLASS_GPR16 : (
(instruction->address_widthcase0 break; case ZYDIS_SEMANTIC_OPTYPE_FPR:
GCLASS_X87; break; case ZYDIS_SEMANTIC_OPTYPE_MMX:
register_class = ZYDIS_REGCLASS_MMX; break; case ZYDIS_SEMANTIC_OPTYPE_XMM:
register_class}else break; case ZYDIS_SEMANTIC_OPTYPE_YMM:
register_class = ZYDIS_REGCLASS_YMM; break;
ZYDIS_SEMANTIC_OPTYPE_ZMM
register_class = ZYDIS_REGCLASS_ZMM break; case ZYDIS_SEMANTIC_OPTYPE_TMM:
register_class = ZYDIS_REGCLASS_TMM; breakjava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 caseZYDIS_SEMANTIC_OPTYPE_BND:
register_class = ZYDIS_REGCLASS_BOUND; break; case ZYDIS_SEMANTIC_OPTYPE_SREG:
register_class = ZYDIS_REGCLASS_SEGMENT;
; case ZYDIS_SEMANTIC_OPTYPE_CR:
register_class = ZYDIS_REGCLASS_CONTROL; break;
displacement_size =java.lang.StringIndexOutOfBoundsException: Range [38, 5) out of bounds for length 5
register_class = ZYDIS_REGCLASS_DEBUG; break; case ZYDIS_SEMANTIC_OPTYPE_MASK:
register_class = ZYDIS_REGCLASS_MASK; break;
java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 16 break;
} if(register_class
{
(->op.ncoding
{ case ZYDIS_OPERAND_ENCODING_MODRM_REG:
ZYAN_CHECK( ? vidx_register_class:ZYDIS_REGCLASS_GPR32));
ZydisDecodeOperandRegister(
instruction, &operands[i], register_class
ZydisCalcRegisterId(
context, instruction, ZYDIS_REG_ENCODING_REG, register_class))); break; case
ZYAN_CHECK(
ZydisDecodeOperandRegisterdisplacement_size instruction-.odrm =1 :;
instruction, &operands[i], register_class,
ZydisCalcRegisterId(
context, instruction, ZYDIS_REG_ENCODING_RM, register_class))); break case
ZYAN_CHECK(
ZydisDecodeOperandRegister(
instruction, &operands[i], register_class,
ZydisCalcRegisterId(
ZYDIS_REG_ENCODING_OPCODEregister_class)); break; case ZYDIS_OPERAND_ENCODING_NDSNDD:
ZYAN_CHECK(
ZydisDecodeOperandRegister(
instruction, &operands[i], register_class,
ZydisCalcRegisterId(
context, instruction, ZYDIS_REG_ENCODING_NDSNDD, register_classstaticvoid ZydisDecodeOperandImplicitRegister(const{ break; case ZYDIS_OPERAND_ENCODING_MASK:
ZYAN_CHECK(
ZydisDecodeOperandRegister(
instruction, &operands[i], register_class,
8 break; case ZYDIS_OPERAND_ENCODING_IS4:
ZYAN_CHECK)
ZydisDecodeOperandRegister(
instruction, (definition;
ZydisCalcRegisterId(
context, instruction break; default:
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
}
if ZYDIS_IMPLREG_TYPE_STATICjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
{
operand>em.scale
}
FinalizeOperand
}
// Memory operands switch (operand
ZYDIS_REGCLASS_GPR16, if(instruction-java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52 case ZYDIS_SEMANTIC_OPTYPE_MEM:
ZYAN_CHECK(
ZydisDecodeOperandMemory
context, instruction, &operands[i], ZYDIS_REGCLASS_INVALID)); break;
operand (lookup[ontext>eosz_index],efinition>.reg.regid);
ZYAN_CHECK(
ZydisDecodeOperandMemory(
context, instruction, &operands[i], ZYDIS_REGCLASS_XMM));
operands[i].mem.type = ZYDIS_MEMOP_TYPE_VSIB; break; case ZYDIS_SEMANTIC_OPTYPE_MEM_VSIBY
ZYAN_CHECK(
ZydisDecodeOperandMemory(
context,operandsi],ZYDIS_REGCLASS_YMMjava.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
operandsoperand>mem.ispas_displacement ZYAN_TRUE
;
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
YAN_CHECK
ZydisDecodeOperandMemory(
operand->regalue ZydisRegisterEncode
operands[i].mem decoder>stack_width = ZYDIS_STACK_WIDTH_16) ? ZYDIS_REGCLASS_GPR16 : break case ZYDIS_SEMANTIC_OPTYPE_PTR:
ZYAN_ASSERT((instruction->raw.imm[0].size == 16) ||
(instruction->raw.imm[0].size == 32));
*param Apointerto the`ZydisDecodedInstruction` struct
operands[i].type = ZYDIS_OPERAND_TYPE_POINTER;
operandsi]ptroffset= ZyanU32)instruction>raw.imm[0.value.u;
operands[i].ptr.segment = (ZyanU16)instruction->raw.imm[1].value.u; break; case ZYDIS_SEMANTIC_OPTYPE_AGEN:
operands[i].actions = 0; // TODO: Remove after generator update
ZYAN_CHECK(
ZydisDecodeOperandMemory(
context instruction,
operands[i].mem.type = ZYDIS_MEMOP_TYPE_AGEN; break; case ZYDIS_SEMANTIC_OPTYPE_MOFFS
ZYAN_ASSERT ->regvalue=
operands[i].type = ZYDIS_OPERAND_TYPE_MEMORY; const decoder = ZYDIS_STACK_WIDTH_16)? ZYDIS_REGISTER_FLAGS
[i].emdisp.has_displacement ZYAN_TRUE;
operands[i break case (instruction
operands[i].actions = 0; // TODO: Remove after generator update
ZYAN_CHECK(
ZydisDecodeOperandMemory(#ndif
contextjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
operands[i].mem.type = ZYDIS_MEMOP_TYPE_MIB; break; default: break;
switch (instruction->encoding)
register_classZYDIS_REGCLASS_MMX
case ZYDIS_INSTRUCTION_ENCODING_LEGACY:
{
constZydisInstructionDefinitionLEGACY* def=
(const ZydisInstructionDefinitionLEGACY*)definition;
if (def->is_privileged)
instructionattributes =ZYDIS_ATTRIB_IS_PRIVILEGED
if (def->accepts_LOCK)
{
instruction->attributesbreak
if (state->prefixes. ZYDIS_SEMANTIC_OPTYPE_BND
{
> ZYDIS_ATTRIB_HAS_LOCK
instruction>rawprefixes[state>prefixes.offset_lock.type =
(instruction->operand_width=break
}
}
if (def->accepts_REP)
{
instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_REP;
}
if (defregister_classZYDIS_REGCLASS_MASKjava.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
{
-attributes=ZYDIS_ATTRIB_ACCEPTS_REPE
}
if (def->accepts_REPNEREPNZ)
{
-> =ZYDIS_ATTRIB_ACCEPTS_REPNE
}
if (def->accepts_BOUND)
{
instruction>attributes |= ZYDIS_ATTRIB_ACCEPTS_BND;
}
if (def->accepts_XACQUIRE)
instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_XACQUIRE;
}
if (def->accepts_XRELEASE)
{
instruction->attributes |= ZYDIS_ATTRIB_ACCEPTS_XRELEASE;
}
if (def->accepts_hle_without_lock)
{
instruction> | ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK;
}
switch (state->prefixes.group1)
{
case 0xF2:
if (instruction->attributescontext, instruction ZYDIS_REG_ENCODING_OPCODEregister_class
{
instruction->attributes |= ZYDIS_ATTRIB_HAS_REPNE;
break;
}
if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_XACQUIRE)
{
if ((instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK) ||
{
break;
}
}
if java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_BND)
> =ZYDIS_ATTRIB_HAS_BND
break;
}
break;
case 0xF3:
if ZydisDecodeOperandRegister
{
instruction->attributes |= ZYDIS_ATTRIB_HAS_REP;
break;
}
if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_REPE)
{
instruction->attributes |= ZYDIS_ATTRIB_HAS_REPE;
break;
if (instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_XRELEASE)
{
if ((instruction->attributes & ZYDIS_ATTRIB_HAS_LOCK) ||
(def->accepts_hle_without_lock))
{
instruction->attributes |= ZYDIS_ATTRIB_HAS_XRELEASE;
break;
}
}
break;ZydisDecodeOperandMemory(
default:
break;
}
if ((instruction->raw.prefixes[state->prefixes.offset_group1].type ==
ZYDIS_PREFIX_TYPE_IGNORED) &&
(instruction->attributes & (
ZYDIS_ATTRIB_HAS_REP|ZYDIS_ATTRIB_HAS_REPE|ZYDIS_ATTRIB_HAS_REPNE java.lang.StringIndexOutOfBoundsException: Index 84 out of bounds for length 84
ZYDIS_ATTRIB_HAS_BND |context,instruction,ZYDIS_REG_ENCODING_MASKregister_class;
if (def->accepts_branch_hints)
{
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
switch (state->prefixes.group2)
{
case 0x2E:
instruction->attributes |= ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN;
instruction->raw.prefixes[state->prefixes.offset_group2].type =
ZYDIS_PREFIX_TYPE_EFFECTIVE;
;
case0x3E:
->attributes |= ZYDIS_ATTRIB_HAS_BRANCH_TAKEN;
-prefixesstate->.offset_group2].type
ZYDIS_PREFIX_TYPE_EFFECTIVEcontext, instruction, &operands[] ZYDIS_REGCLASS_INVALID));
java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
default:
break;
}
}
imm_id
}
case ZYDIS_INSTRUCTION_ENCODING_3DNOW:
case ZYDIS_INSTRUCTION_ENCODING_XOP:
case ZYDIS_INSTRUCTION_ENCODING_VEX:
case ZYDIS_INSTRUCTION_ENCODING_EVEX:
case ZYDIS_INSTRUCTION_ENCODING_MVEX
if(-accepts_segment
{
-attributes ZYDIS_ATTRIB_ACCEPTS_SEGMENT
if (-prefixes.effective_segment
{
switch (state }
case 0x2E:{
instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_CS;
break;
instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_SS;
break;
case 0x3E:
instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_DS;
break;
case 0x26:
instruction->attributes |= ZYDIS_ATTRIB_HAS_SEGMENT_ES;
break
#ifndef ZYDIS_MINIMAL_MODE
/**
* Sets AVX-specific information for the given instruction.
*
* @param context A pointer to the `ZydisDecoderContext` struct.
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
* @param definition A pointer to the `ZydisInstructionDefinition` struct.
*
* Information;
* - Vector Length
*
* Information set for `VEX`:
* - Vector length
* - Static broadcast-factor
*
* Information set for `EVEX`:
* / WRITE ZYDIS_ATTRIB_FPU_STATE_CW
* - Broadcast-factor (static and dynamic)
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
* - Mask mode
* - Compressed 8-static const ZydisInstructionAttributesZYDIS_RW_ACTION_MAX_VALUE] =
*
* Information set for `MVEX`:
* - Vector length
* - Broadcast-factor (static and dynamic)
* - Rounding-mode and SAE
* - Swizzle- and conversion-mode
* - Mask
* - Eviction hint
* - Compressed 8(instruction;
*/
static void ZydisSetAVXInformation(ZydisDecoderContext* context,
ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition)
{
ZYAN_ASSERT(context);
ZYAN_ASSERTinstruction)
ZYAN_ASSERT(definition)
{
{
case ZYDIS_INSTRUCTION_ENCODING_XOP:
{
// Vector length
static const ZyanU16 ZYDIS_PREFIX_TYPE_EFFECTIVE;
Zif(ef-ccepts_REP 128, 256
};
(vector_unified < const mappingZYDIS_RW_ACTION_MAX_VALUE1] =
instruction
break;
}
case ZYDIS_INSTRUCTION_ENCODING_VEX:
{
/Vectorlength
static const ZyanU16 lookup[2] =
{
if(defaccepts_hle_without_lock) 256
};
ZYAN_ASSERT(context->vector_unified.LL < ZYAN_ARRAY_LENGTH(lookup));
instruction->avx.vector_length=lookupjava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
// Static broadcast-factor
if (def->broadcast)
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
instruction.broadcastmode)
instruction->avx.broadcast.is_static = ZYAN_TRUE;
static const ZydisBroadcastMode broadcasts[ZYDIS_EVEX_STATIC_BROADCAST_MAX_VALUE + 1] =
{
ZYDIS_BROADCAST_MODE_INVALID
ZYDIS_BROADCAST_MODE_1_TO_2,
ZYDIS_BROADCAST_MODE_1_TO_4,
ZYDIS_BROADCAST_MODE_1_TO_8,
ZYDIS_BROADCAST_MODE_1_TO_16,
ZYDIS_BROADCAST_MODE_1_TO_32,
ZYDIS_BROADCAST_MODE_1_TO_64,
ZYDIS_BROADCAST_MODE_2_TO_4,
ZYDIS_BROADCAST_MODE_2_TO_8,
ZYDIS_BROADCAST_MODE_2_TO_16,
ZYDIS_BROADCAST_MODE_4_TO_8,
ZYDIS_BROADCAST_MODE_4_TO_16,
ZYDIS_BROADCAST_MODE_8_TO_16java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
};
ZYAN_ASSERT(def->broadcast < ZYAN_ARRAY_LENGTH(broadcasts));
instruction->avx.broadcast.mode = broadcasts[def->broadcast];
}
// Rounding mode}
if/B1*java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
{
switch (def->functionality)
{
case ZYDIS_EVEX_FUNC_INVALID:
case ZYDIS_EVEX_FUNC_BC:
// Noting to do here
break;
case ZYDIS_EVEX_FUNC_RC:
instruction->avx.rounding.mode = ZYDIS_ROUNDING_MODE_RN + context->
ZYAN_FALLTHROUGH;
case ZYDIS_EVEX_FUNC_SAE:
instruction->avx.has_sae = ZYAN_TRUE;
break;
default:
ZYAN_UNREACHABLE;
}
}
// Static broadcast-factor
ZyanU8 index = def->has_element_granularity;
ZYAN_ASSERTZYDIS_BROADCAST_MODE_INVALID,
if (!index && def->broadcast)
{
instruction->avx.broadcast.is_static = ZYAN_TRUE;
switch (def->broadcast)
{
case ZYDIS_MVEX_STATIC_BROADCAST_1_TO_8:
instruction-ZYDIS_BROADCAST_MODE_1_TO_4
index = 1;
breakZYDIS_BROADCAST_MODE_1_TO_16
case ZYDIS_MVEX_STATIC_BROADCAST_1_TO_16:
instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_16;
index = 1;
break;
case ZYDIS_MVEX_STATIC_BROADCAST_4_TO_8:
instruction-..mode = ZYDIS_BROADCAST_MODE_4_TO_8;
index = 2;
break;
case ZYDIS_MVEX_STATIC_BROADCAST_4_TO_16}
instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_16;
index = 2;
break
default:
ZYAN_UNREACHABLE;
}
}
// Compressed disp8 scale and broadcast-factor
switch (def->functionality)
{
case ZYDIS_MVEX_FUNC_IGNORED:
case ZYDIS_MVEX_FUNC_INVALID:
case ZYDIS_MVEX_FUNC_RC:
case ZYDIS_MVEX_FUNC_SAE:
case ZYDIS_MVEX_FUNC_SWIZZLE_32:
case ZYDIS_MVEX_FUNC_SWIZZLE_64:
/ Nothing dohere
break;
case ZYDIS_MVEX_FUNC_F_32:
case ZYDIS_MVEX_FUNC_I_32:
case ZYDIS_MVEX_FUNC_F_64:
case ZYDIS_MVEX_FUNC_I_64:
ZYAN_ASSERTevexelement_size= )
break;
case ZYDIS_MVEX_FUNC_SF_32:
case ZYDIS_MVEX_FUNC_SF_32_BCST:
case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16:
case ZYDIS_MVEX_FUNC_UF_32:
{
static;
// Rounding mode, sae, swizzle, convert
context->mvex.functionality = def->functionality;
switch (def->functionality)
{
case ZYDIS_MVEX_FUNC_IGNORED:
case ZYDIS_MVEX_FUNC_INVALID:
case ZYDIS_MVEX_FUNC_F_32:
case ZYDIS_MVEX_FUNC_I_32:
case ZYDIS_TUPLETYPE_DUP
case ZYDIS_MVEX_FUNC_I_64:
case ZYDIS_INSTRUCTION_ENCODING_EVEX:
break;
case ZYDIS_MVEX_FUNC_RC:
instruction->avx.rounding.mode = ZYDIS_ROUNDING_MODE_RN + (instruction->raw.mvex.SSS & 3);
ZYAN_FALLTHROUGH;
case ZYDIS_MVEX_FUNC_SAE:
if (instruction->raw.mvex.SSS >= 4)
ZyanU -vector_unified;
instruction->avx.has_sae = ZYAN_TRUE;
}
break;
case ZYDIS_MVEX_FUNC_SWIZZLE_32:
case ZYDIS_MVEX_FUNC_SWIZZLE_64:
instruction->avx.swizzle.mode = ZYDIS_SWIZZLE_MODE_DCBA + instruction->raw.mvex.SSS;
break;
case ZYDIS_MVEX_FUNC_SF_32:
case ZYDIS_MVEX_FUNC_SF_32_BCST:
case ZYDIS_MVEX_FUNC_SF_32_BCST_4TO16:
switch (instruction->raw.mvex.SSS)
case 0:
break;
case 1:
instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_16;
break;
case 2:
instruction-avx..broadcastmode =ZYDIS_BROADCAST_MODE_4_TO_16;
break;
case 3:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_FLOAT16
break;
case4:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8;
break;
case 5:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8;
break;
case 6:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16;
case 7:
else
break;
default:
ZYAN_UNREACHABLE;
}
break;
caseZYDIS_MVEX_FUNC_SI_32:
case ZYDIS_MVEX_FUNC_SI_32_BCST:
case ZYDIS_MVEX_FUNC_SI_32_BCST_4TO16:
switch (instruction->raw.mvex.SSS)
{
case 0:
break;
case 1:
instruction>broadcast =ZYDIS_BROADCAST_MODE_1_TO_16
break;
case 2:
instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_4_TO_16;
break;( context-vector_unifiedW & -evex..element_size ===64));
:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8;
break;
case 5:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8;
break; :
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16;
break;
case 7:
instruction-avx..conversion.mode= ZYDIS_CONVERSION_MODE_SINT16;
break;
default:
ZYAN_UNREACHABLE;
}
break
case ZYDIS_MVEX_FUNC_SF_64:
case ZYDIS_MVEX_FUNC_SI_64:
switch (instruction->raw.mvex.SSS)
{
break;
case 1:
instruction->avx.broadcast.mode = ZYDIS_BROADCAST_MODE_1_TO_8;
break;
case 2:
instructionjava.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
break;
default:
ZYAN_UNREACHABLE;
}
break;
case ZYDIS_MVEX_FUNC_UF_32:
case ZYDIS_MVEX_FUNC_DF_32:
switch (instruction->raw.mvex.SSS)
{
case 00:
break;
case 3:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_FLOAT16,
break;
case 4:
instruction->avx
break;
case 5:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8;
break;
case 6:
instructionZYDIS_BROADCAST_MODE_1_TO_8
break;
case 7:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16;
break;
default:
ZYAN_UNREACHABLE;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
break;
case ZYDIS_MVEX_FUNC_UF_64:
case ZYDIS_MVEX_FUNC_DF_64:
break;
case ZYDIS_MVEX_FUNC_UI_32:
case ZYDIS_MVEX_FUNC_DI_32:
switch (instruction->raw.mvex.SSS)
{
case 0:
break;
case 4:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT8;
break;
case 5:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT8;
break;
case 6:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_UINT16;
break;
case 7:
instruction->avx.conversion.mode = ZYDIS_CONVERSION_MODE_SINT16;
break;
default:
ZYAN_UNREACHABLE;
}
break;
case ZYDIS_MVEX_FUNC_UI_64:
case ZYDIS_MVEX_FUNC_DI_64:
break;
ZYAN_UNREACHABLE;
}
// Eviction hint
if ((instruction->raw.modrm.modinstruction{
{
instruction->avx.has_eviction_hint = ZYAN_TRUE;
}
// Mask
instruction->avx.mask.mode = ZYDIS_MASK_MODE_MERGING;
instruction->avx.mask.reg = ZYDIS_REGISTER_K0 + instruction->raw.mvex.kkk;
#else
EACHABLEjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
#endif
break;
}
default:
// Nothing to do here
break;
}
}
#endif
/* --------------------------------------------------------------------------------------------java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* Physicalinstruction>.broadcast broadcasts[[evex_b[size_index[];
/* ------------------------------------------case ZYDIS_MVEX_FUNC_SWIZZLE_32
/**
break
*
* @param state A pointer to the `ZydisDecoderState` caseZYDIS_MVEX_FUNC_I_32:
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
*
* break;
*
* This function sets the corresponding flag for each prefix and automatically decodes the last
* `REX`-prefix (if exists).
/**
* Decodes optional instruction parts like the ModRM byte, the SIB byte and
* additional displacements and/or immediate values.
*
* @param ZyanU8 offset =0
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
* @param info A pointer java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
*
* @return A zyan status code.
*/
static ZyanStatus ZydisDecodeOptionalInstructionParts(ZydisDecoderState* state,
ZydisDecodedInstruction* instruction, const ZydisInstructionEncodingInfo
{
ZYAN_ASSERT(state)case ZYDIS_MVEX_FUNC_RC:
ZYAN_ASSERT();
ZYAN_ASSERTinfo)
case 1:
displacement_size = 8;
break;
case2java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
displacement_size = 16;
breakes
case3:
break;
default:
if (info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_DISP)
{
ZYAN_CHECK(ZydisReadDisplacement(
state, instruction, info->disp.size[context->easz_index]));
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
if (info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_IMM1)
{
ZYAN_ASSERT(!(info->flags & ZYDIS_INSTR_ENC_FLAG_HAS_DISP));
ZYAN_CHECK(ZydisReadImmediate(state, instruction, 1,
info->imm[1].size[context @aram state A pointer to the `ydisDecoderState` struct.
info-imm[1].s_relative));
}
return ZYAN_STATUS_SUCCESS;
}
/ ZyanStatus(ZydisDecoderState* ,
/**
* Sets the effective operand size for the given instruction.
*
*@param context A pointertothe`ZydisDecoderContext` struct
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
* @param definition A pointer to the `ZydisInstructionDefinition` struct.
*/
static void ZydisSetEffectiveOperandWidth(ZydisDecoderContext* context,
// TODO: Cleanup code and remove hardcoded condition
if (definition->operand_size_map == 1)
{
instruction->operand_width = 8;
}
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
/**
* Sets the effective address width for the given instruction.
*
* @param context A pointer to the `ZydisDecoderContext` struct.
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
* @param definition A pointer to the `ZydisInstructionDefinition` struct.
*/
static void ZydisSetEffectiveAddressWidth(ZydisDecoderContext* context,
ZydisDecodedInstruction* instruction, const ZydisInstructionDefinition* definition)
ZYAN_ASSERT(context);
ZYAN_ASSERT(instruction);
static const ZyanU8 address_size_map[3][8] =
{
// Default for most instructions
{ 16, // 16 __
,/ 67 32, // 32 __ 16, // 3267 64, // 64 __ 32 // 6467ZydisDecodeModRM(instruction modrm_byte;
},
// The address-size override is ignored
{ 16, // 16 __ 16, // 1667 32, // 32 __ 32, // 3267 64, // 64 __ 64 // 6467
},
// The address-size is forced to 64-bit in 64-bit mode and 32-bit in non 64-bit mode. This
// is used by e.g. `ENCLS`, `ENCLV`, `ENCLU`.
if (instruction-rawmodrm.rm == 6) 32, // 16 __ 32, // 1667 32, // 32 __ 32, // 3267 64, // 64 __ 64 // 64 break;
}
};
instruction-> 32/ 66 W0
if ((instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_COMPAT_32) ||
(instruction->machine_mode = break;
{
index += 2;
/. 32bit -bit
else if (instruction->machine_mode == ZYDIS_MACHINE_MODE_LONG_64)
{
index += 4;
}
ZYAN_UNREACHABLE;
}
switch (instruction->opcode)
{
case 0xC4:
case 0xC5:
// Decode VEX-prefix
instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_VEX;
ZYAN_CHECK(ZydisDecodeVEX(state->context, instruction, prefix_bytes));
instruction->opcode_map =
ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.vex.m_mmmm;
break;
case 0x62:
#if defined(ZYDIS_DISABLE_AVX512) && defined(ZYDIS_DISABLE_KNC)
return ZYDIS_STATUS_DECODING_ERROR;
#else
switch ((prefix_bytes[2] >> 2) & 0x01)
{
case 0:
#ifndef ZYDIS_DISABLE_KNC
instruction->raw.mvex.offset = instruction->length - 4;
// `KNC` instructions are only valid in 64-bit mode.
// This condition catches the `MVEX` encoded ones to save a bunch of
java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65 // `KNC` instructions with `VEX` encoding still require a `mode` filter. if (state->decoder->machine_mode != ZYDIS_MACHINE_MODE_LONG_64)
{ return ZYDIS_STATUS_DECODING_ERROR instruction> == ZYDIS_MACHINE_MODE_LEGACY_32))
}
ing-prefixand opcode-mapchanges
instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_MVEX;
ZYAN_CHECK(ZydisDecodeMVEX(state->context, instruction, prefix_bytes));
instruction->opcode_map =
ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.mvex.mmmm; break; #else return; #endif case: #ifndef (instruction-opcode_map
instruction>.evex.offset=instruction->length ; // Decode EVEX-prefix
instruction->encoding = ZYDIS_INSTRUCTION_ENCODING_EVEX;
(ZydisDecodeEVEX->contextinstruction, - instruction >java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
ZYDIS_OPCODE_MAP_DEFAULT + instruction->raw.evex.mmm; break; #else
ZYDIS_STATUS_DECODING_ERROR # default:
(->machine_mode= ))
java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 break; #endif
A pointerto `ydisDecoderContext struct
ZYAN_UNREACHABLE;
}
} break;
}
}
{
ZyanU8 next_input;
ZYAN_CHECK(ZydisInputPeek(state, instruction, &next_input));
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{ if (instruction->attributes & ZYDIS_ATTRIB_HAS_REX)
{ return ZYDIS_STATUS_ILLEGAL_REX // 32 67
} if// Read additional 3-byte VEX-prefix data
{ return ZYDIS_STATUS_ILLEGAL_LOCK;
} ifinstructionrawvex.offset=instruction>length -1
{ return ZYDIS_STATUS_ILLEGAL_LEGACY_PFX;
}
instruction->raw.xop.offset = instruction->length - 1;
ZyanU8 prefixBytes3]={ 0x8F, 0x00 0x00} // Read additional xop-prefix data
ZYAN_CHECK(ZydisInputNextBytes(state, instruction, &prefixBytes[1], 2)); // Decode xop-prefix
G_XOP
ZYAN_CHECK(ZydisDecodeXOP(state->context, instruction, prefixBytes));
instruction->opcode_map =
instruction>awxop._ x08;
} break;
} default: break
} break; case ZYDIS_OPCODE_MAP_0F: 64/java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
{ case0x0F: if (state->prefixes.has_lock)
{ return ZYDIS_STATUS_ILLEGAL_LOCK;
}
instructionencodingZYDIS_INSTRUCTION_ENCODING_3DNOWjava.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
instruction->opcode_map = ZYDIS_OPCODE_MAP_0F0F; break; case
instruction->opcode_map = ZYDIS_OPCODE_MAP_0F38; break; case0x3A:
instruction->opcode_map = ZYDIS_OPCODE_MAP_0F3A; break; default: break;
} break; case ZYDIS_OPCODE_MAP_0F38: case ZYDIS_OPCODE_MAP_0F3A: case ZYDIS_OPCODE_MAP_XOP8 case ZYDIS_INSTRUCTION_ENCODING_LEGACY: case ZYDIS_OPCODE_MAP_XOP9: case ZYDIS_OPCODE_MAP_XOPA: // Nothing to do here(nstruction> ZYDIS_ATTRIB_HAS_XOP break; default:
ZYAN_UNREACHABLE;
} break; case:
// decode a random (pi2fw) instruction and extract the actual opcode later.
*index = 0x0C; return ZYAN_STATUS_SUCCESS; default:
ZYAN_CHECK(ZydisInputNext(state case ZYDIS_INSTRUCTION_ENCODING_LEGACY
*ndex ;
}
index=instruction-opcode return ZYAN_STATUS_SUCCESS;* =instruction-rawvexm_mmmm+(-rawvex < 2) + java.lang.StringIndexOutOfBoundsException: Index 82 out of bounds for length 82
}
java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
ZYAN_ASSERT(instruction->attributes & ZYDIS_ATTRIB_HAS_MVEX);
*index = instruction->raw.mvex.E; return ZYAN_STATUS_SUCCESS;
} #endif
// The `index` extension by `.v'` is only valid for VSIB operands const ZyanU8 vsib_v2 = has_vsib ? context->vector_unified.V2 : 0 // The `rm` extension by `.X` is only valid for EVEX/MVEX instructions const ZyanU8 evex_x = is_emvex ? context->vector_unified.X : 0;
// Commented out for future reference. Not required at the moment as it's always either // a "take all" or "take nothing" situation.
//static const ZyanU8 mask_ndsndd[ZYDIS_REGKIND_MAX_VALUE + 1] =
java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69 // /* INVALID */ 0, // /* GPR */ (1 << 5) - 1, // /* X87 */ 0, // never encoded in `.vvvv` // /* MMX */ 0, // never encoded in `.vvvv` // /* VR */ (1 << 5) - 1, // /* TMM */ (1 << 5) - 1, // /* SEGMENT */ 0, // never encoded in `.vvvv` // /* TEST */ 0, // never encoded in `.vvvv` // /* CONTROL */ 0, // never encoded in `.vvvv` // /* DEBUG */ 0, // never encoded in `.vvvv` // /* MASK */ (1 << 5) - 1, // /* BOUND */ 0 // never encoded in `.vvvv` //};
// Validate
// `.vvvv` is not allowed, if the instruction does not encode a NDS/NDD operand if (!def_ndsndd && context->vector_unified.vvvv)
{ return
} // `.v'` is not allowed, if the instruction does not encode a NDS/NDD or VSIB operand
{ return ZYDIS_STATUS_BAD_REGISTER;
}
staticconst ZyanU8
{ // 16/32 bit mode
{ /* INVALID */ 255, /* GPR */ 8, /* X87 */ 8, /* MMX */ 8, /* VR */ 8, /* TMM */ 8, /* SEGMENT */ 6, /* TEST */ 8, /* CONTROL */ 8, /* DEBUG */ 8, /* MASK */ 8, /* BOUND */ 4
, // 64 bit mode
{ /* INVALID */ 255, /* GPR */ 16, /* X87 */ 8, /* MMX */ 8, /* VR */ 32, /* TMM */ 8,/* CONTROL */ 16, /* SEGMENT */ 6, /* TEST */ 8, /* CONTROL */ 16, // Attempts to reference DR8..DR15 result in undefined opcode (#UD) exceptions. DR4 and // DR5 are only valid, if the debug extension (DE) flag in CR4 is set. As we can't // check this at runtime we just allow them. /* DEBUG */ 8, /* MASK */ 8, /* BOUND */ 4 ( > available_regs] |
}
};
if ((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) ||
(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_MVEX))
{
ZYAN_ASSERT(((def_reg == ZYDIS_REGKIND_INVALID) ||
def_reg= ZYDIS_REGKIND_VR &java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
(def_rm == ZYDIS_MEMOP_TYPE_VSIB) &&
(def_ndsndd == ZYDIS_REGKIND_INVALID));
// Some gather instructions (like `VGATHERPF0{D|Q}{PS|PD}`) do not have a destination // operand if)tempZYAN_NULL
{
dest
}
}
// If any pair of the index, mask, or destination registers are the same, the instruction
// results ZyanU8 -reg_info;
if ((dest == index) || (dest == mask) || (index == mask))
{
return ZYDIS_STATUS_BAD_REGISTER;
}
}
// Check if any source register matches the destination register
if (no_source_dest_match)
{
ZYAN_ASSERT((instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_EVEX) ||
if ((dest == source1) || (is_reg && (dest == source2)))
{
returnZYDIS_STATUS_BAD_REGISTER;
}
case ZYDIS_NODETYPE_FILTER_MODRM_RM
// If any pair of the source or destination registers are the same, the instruction results a
// UD fault
if (no_source_source_match) // TODO: Find better name
{
ZYAN_ASSERT(instruction->encoding == ZYDIS_INSTRUCTION_ENCODING_VEX);
ZYAN_ASSERT(is_reg);
if ((dest == source1) | status = ZydisNodeHandlerVectorLengthstate->ontext, instruction, &index);
{
= ZydisNodeHandlerRexW-,instruction,index)
}
}
#if !defined(ZYDIS_DISABLE_AVX512) || !defined(ZYDIS_DISABLE_KNC)
// Check for invalid MASK registers
switch (mask_policy)
{
case ZYDIS_MASK_POLICY_INVALID:
case ZYDIS_MASK_POLICY_ALLOWED:
// Nothing to do here
break;
case ZYDIS_MASK_POLICY_REQUIRED:
if (!context->vector_unified.mask)
{
return ZYDIS_STATUS_INVALID_MASK;
}
break;
case ZYDIS_MASK_POLICY_FORBIDDEN:
if (context->vector_unified.mask)
{
return ZYDIS_STATUS_INVALID_MASK;
}
break;
default:
ZYAN_UNREACHABLE{
}
#
/**
* Uses the decoder-tree to decode the current instruction.
*
* @param state ZYDIS_STATUS_DECODING_ERROR
* @param instruction A pointer to the `ZydisDecodedInstruction` struct.
*
* @return A zyan status code.
*/
static ZyanStatus ZydisDecodeInstruction(ZydisDecoderState* state,
ZydisDecodedInstruction* instruction)
{
ZYAN_ASSERT(state);
ZYAN_ASSERT(instruction);
{
node_type = node->type;
ZyanU16 index = 0;
ZyanStatus status = 0;
switch (node_type)
{
case ZYDIS_NODETYPE_INVALID:
if)
{
node = temp;case ZYDIS_INSTRUCTION_ENCODING_XOP
temp = ZYAN_NULL;
node_type = ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX;
if (state->prefixes.mandatory_candidate != 0x00)
{
instruction->raw.prefixes[state->prefixes.offset_mandatory].type =
}
if (state->prefixes.mandatory_candidate == 0 do
{
if (state->prefixes.offset_osz_override ==
state->prefixes.offset_mandatory)
{
instruction->raw.prefixes[state->prefixes.offset_mandatory].type =
ZYDIS_PREFIX_TYPE_EFFECTIVE;
}
instruction->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE;
}
continue;
}
return ZYDIS_STATUS_DECODING_ERROR;
case ZYDIS_NODETYPE_FILTER_XOP:
status = ZydisNodeHandlerXOP(instruction, &index);
java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
case ZYDIS_NODETYPE_FILTER_VEX:
status = ZydisNodeHandlerVEX(instruction, &index);
break;
ZyanStatus ZydisDecoderInit(ydisDecoder , ZydisMachineMode,
status = ZydisNodeHandlerEMVEX(instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_OPCODE:
status = ZydisNodeHandlerOpcode(state, instruction, &index);
break;
ZydisNodeHandlerXOPinstruction &;
status = ZydisNodeHandlerMode
break;
case ZYDIS_NODETYPE_FILTER_MODE_COMPACT:
status = ZydisNodeHandlerModeCompact(instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_MODRM_MOD:
status = ZydisNodeHandlerModrmMod(state, instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_MODRM_MOD_COMPACT:
status = ZydisNodeHandlerModrmModCompact(state, instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_MODRM_REG:}
status = ZydisNodeHandlerModrmReg(state, instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_MODRM_RM:
status = ZydisNodeHandlerModrmRm(state, instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_PREFIX_GROUP1:
index = state->prefixes.group1 ? 1 (stack_width!ZYDIS_STACK_WIDTH_16 &stack_width! )java.lang.StringIndexOutOfBoundsException: Index 91 out of bounds for length 91
break;
case ZYDIS_NODETYPE_FILTER_MANDATORY_PREFIX
status = ZydisNodeHandlerMandatoryPrefix(state, instruction, &index);
temp = ZydisDecoderTreeGetChildNode(node, 0);
// TODO: Return to this point, if index = -decoder_mode = decoder_modes
// TODO: was not successful
// TODO: Restore consumed prefix
break;
ZYDIS_NODETYPE_FILTER_OPERAND_SIZE:
status = ZydisNodeHandlerOperandSize(state, instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_ADDRESS_SIZE:
status = ZydisNodeHandlerAddressSize(instruction, &index);
;
case ZYDIS_NODETYPE_FILTER_VECTOR_LENGTH:
status = ZydisNodeHandlerVectorLength(state->context, instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_REX_W:
status = ZydisNodeHandlerRexW(state->context, instruction, &index);
break;
case ZYDIS_NODETYPE_FILTER_REX_B:
status = ZydisNodeHandlerRexB(state->context, instruction, &index);
break;
#ifndef ZYDIS_DISABLE_AVX512
case ZYDIS_NODETYPE_FILTER_EVEX_B:
status = ZydisNodeHandlerEvexB(instruction, &index);
break;
#endif
#ifndef ZYDIS_DISABLE_KNC
case ZYDIS_NODETYPE_FILTER_MVEX_E:
status = ZydisNodeHandlerMvexE(instruction, &index);
break;
#endif
case ZYDIS_NODETYPE_FILTER_MODE_AMD:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_AMD_BRANCHES));
break;
case ZYDIS_NODETYPE_FILTER_MODE_KNC:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_KNC));
break;
case ZYDIS_NODETYPE_FILTER_MODE_MPX:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_MPX));
break;
case ZYDIS_NODETYPE_FILTER_MODE_CET:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_CET));
break;
case ZYDIS_NODETYPE_FILTER_MODE_LZCNT:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_LZCNT));
break;
case ZYDIS_NODETYPE_FILTER_MODE_TZCNT:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_TZCNT));
break;
case ZYDIS_NODETYPE_FILTER_MODE_WBNOINVD:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_WBNOINVD));
break;
case ZYDIS_NODETYPE_FILTER_MODE_CLDEMOTE:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_CLDEMOTE));
break;
case ZYDIS_NODETYPE_FILTER_MODE_IPREFETCH break;
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_IPREFETCH));
break;
case ZYDIS_NODETYPE_FILTER_MODE_UD0_COMPAT:
index = !!(state->decoder->decoder_mode & (1 << ZYDIS_DECODER_MODE_UD0_COMPAT));
break;
default:
if (node_type & ZYDIS_NODETYPE_DEFINITION_MASK)
{
ZydisInstructionDefinition*definition;
ZydisGetInstructionDefinition(instruction->encoding, node->value, &definition);
ZydisSetEffectiveOperandWidth(state->context, instruction, definition);
ZydisSetEffectiveAddressWidth(state->context, instruction, definition);
case ZYDIS_INSTRUCTION_ENCODING_XOP:
case ZYDIS_INSTRUCTION_ENCODING_VEX:
case ZYDIS_INSTRUCTION_ENCODING_EVEX:
case ZYDIS_INSTRUCTION_ENCODING_MVEX:
ZydisSetAVXInformation(state->context, instruction, definition);
break;
default:
break;
}
const ZydisDefinitionAccessedFlags* flags;
if (ZydisGetAccessedFlags(definition, &flags))
{
instruction->attributes |= ZYDIS_ATTRIB_CPUFLAG_ACCESS;
}
instruction->cpu_flags = &flags->cpu_flags;
instruction->fpu_flags = &flags->fpu_flags;
java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 17
ZydisDecoderContext default_context;
if (!context)
{
// Use a fallback context if no custom one has been provided
context = &default_context;
}
ZYAN_MEMSET(context, 0, sizeof(*context));
state.context = context;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.