mirror of https://github.com/x64dbg/zydis
Fixed priority of mandatory-prefixes
This commit is contained in:
parent
58b15163f2
commit
f20dc484cd
|
@ -61,8 +61,9 @@ typedef struct ZydisDecoderContext_
|
||||||
/**
|
/**
|
||||||
* @brief Contains the prefix that should be traited as the mandatory-prefix, if the current
|
* @brief Contains the prefix that should be traited as the mandatory-prefix, if the current
|
||||||
* instruction needs one.
|
* instruction needs one.
|
||||||
* 0x66 has precedence over 0xF3/0xF2 and the last 0xF3/0xF2 has precedence over
|
*
|
||||||
* previous ones.
|
* The last 0xF3/0xF2 prefix has precedence over previous ones and 0xF3/0xF2 in
|
||||||
|
* general has precedence over 0x66.
|
||||||
*/
|
*/
|
||||||
uint8_t mandatoryCandidate;
|
uint8_t mandatoryCandidate;
|
||||||
/**
|
/**
|
||||||
|
@ -462,6 +463,7 @@ static ZydisStatus ZydisDecodeMVEX(ZydisDecoderContext* context, ZydisInstructio
|
||||||
context->cache.B = 0x01 & ~info->details.mvex.B;
|
context->cache.B = 0x01 & ~info->details.mvex.B;
|
||||||
context->cache.R2 = 0x01 & ~info->details.mvex.R2;
|
context->cache.R2 = 0x01 & ~info->details.mvex.R2;
|
||||||
context->cache.V2 = 0x01 & ~info->details.mvex.V2;
|
context->cache.V2 = 0x01 & ~info->details.mvex.V2;
|
||||||
|
context->cache.LL = 2;
|
||||||
context->cache.v_vvvv =
|
context->cache.v_vvvv =
|
||||||
((0x01 & ~info->details.mvex.V2) << 4) | (0x0F & ~info->details.mvex.vvvv);
|
((0x01 & ~info->details.mvex.V2) << 4) | (0x0F & ~info->details.mvex.vvvv);
|
||||||
|
|
||||||
|
@ -706,17 +708,11 @@ static ZydisStatus ZydisCollectOptionalPrefixes(ZydisDecoderContext* context,
|
||||||
++info->details.prefixes.hasF0;
|
++info->details.prefixes.hasF0;
|
||||||
break;
|
break;
|
||||||
case 0xF2:
|
case 0xF2:
|
||||||
if (context->mandatoryCandidate != 0x66)
|
context->mandatoryCandidate = 0xF2;
|
||||||
{
|
|
||||||
context->mandatoryCandidate = 0xF2;
|
|
||||||
}
|
|
||||||
++info->details.prefixes.hasF2;
|
++info->details.prefixes.hasF2;
|
||||||
break;
|
break;
|
||||||
case 0xF3:
|
case 0xF3:
|
||||||
if (context->mandatoryCandidate != 0x66)
|
context->mandatoryCandidate = 0xF3;
|
||||||
{
|
|
||||||
context->mandatoryCandidate = 0xF3;
|
|
||||||
}
|
|
||||||
++info->details.prefixes.hasF3;
|
++info->details.prefixes.hasF3;
|
||||||
break;
|
break;
|
||||||
case 0x2E:
|
case 0x2E:
|
||||||
|
@ -744,7 +740,10 @@ static ZydisStatus ZydisCollectOptionalPrefixes(ZydisDecoderContext* context,
|
||||||
context->lastSegmentPrefix = 0x65;
|
context->lastSegmentPrefix = 0x65;
|
||||||
break;
|
break;
|
||||||
case 0x66:
|
case 0x66:
|
||||||
context->mandatoryCandidate = 0x66;
|
if (!context->mandatoryCandidate)
|
||||||
|
{
|
||||||
|
context->mandatoryCandidate = 0x66;
|
||||||
|
}
|
||||||
++info->details.prefixes.has66;
|
++info->details.prefixes.has66;
|
||||||
info->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE;
|
info->attributes |= ZYDIS_ATTRIB_HAS_OPERANDSIZE;
|
||||||
break;
|
break;
|
||||||
|
@ -2401,10 +2400,6 @@ static void ZydisSetAVXInformation(ZydisDecoderContext* context,
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
// TODO: Update attributes after a valid instruction was found
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
static ZydisStatus ZydisNodeHandlerXOP(ZydisInstructionInfo* info, uint16_t* index)
|
static ZydisStatus ZydisNodeHandlerXOP(ZydisInstructionInfo* info, uint16_t* index)
|
||||||
{
|
{
|
||||||
ZYDIS_ASSERT(info);
|
ZYDIS_ASSERT(info);
|
||||||
|
@ -2625,7 +2620,6 @@ static ZydisStatus ZydisNodeHandlerOpcode(ZydisDecoderContext* context,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ZYDIS_INSTRUCTION_ENCODING_3DNOW:
|
case ZYDIS_INSTRUCTION_ENCODING_3DNOW:
|
||||||
// TODO: We need to change this
|
|
||||||
// All 3DNOW (0x0F 0x0F) instructions are using the same operand encoding. We just
|
// All 3DNOW (0x0F 0x0F) instructions are using the same operand encoding. We just
|
||||||
// decode a random (pi2fw) instruction and extract the actual opcode later.
|
// decode a random (pi2fw) instruction and extract the actual opcode later.
|
||||||
*index = 0x0C;
|
*index = 0x0C;
|
||||||
|
|
Loading…
Reference in New Issue