KiTpEmulateGroup1Instruction
NTSTATUS __stdcall KiTpEmulateGroup1Instruction(INT64 a1, INT64 a2, INT64 *a3){
NTSTATUS ImmediateOperand;
INT64 v7;
__int64 v8;
INT64 v9;
INT64 v10;
INT64 v11;
INT64 v12;
INT64 v13;
INT64 v14;
NTSTATUS v15;
CHAR v17;
INT64 v18;
UINT64 v19[2];
CHAR v20;
v18 = 0i64;
v19[0] = 0i64;
v20 = 0;
v17 = 0;
ImmediateOperand = KiTpDecodeModRm((UINT8 *)a1, a2, a3);
if( ImmediateOperand >= 0 )
{
ImmediateOperand = KiTpFetchImmediateOperand(a1, a2, a3);
if( ImmediateOperand >= 0 )
{
if( !a2 )
return 0;
KiTpDecodeModRmOperand(a1, a2, (UINT64)v19, (CHAR)&v20, (CHAR)&v17);
LOBYTE(v7) = v20;
ImmediateOperand = KiTpReadOperandValue(a1, a2, v19[0], v7, v17, (INT64)&v18);
if( ImmediateOperand < 0 )
return ImmediateOperand;
v8 = *(_QWORD *)(a1 + 32);
if( ((*(unsigned __int8 *)(a1 + 26) >> 3) & 7) != 0 )
{
if( ((*(unsigned __int8 *)(a1 + 26) >> 3) & 7) == 1 )
{
v10 = v18 | v8;
goto LABEL_19;
}
if( ((*(unsigned __int8 *)(a1 + 26) >> 3) & 7) != 2 )
{
if( ((*(unsigned __int8 *)(a1 + 26) >> 3) & 7) == 3 )
{
v12 = v18;
v13 = v18 - (*(_DWORD *)(*(_QWORD *)(a2 + 8) + 68i64) & 1);
goto LABEL_17;
}
if( ((*(unsigned __int8 *)(a1 + 26) >> 3) & 7) != 4 )
{
if( ((*(unsigned __int8 *)(a1 + 26) >> 3) & 7) != 5 )
{
v9 = a1;
if( ((*(unsigned __int8 *)(a1 + 26) >> 3) & 7) != 6 )
{
KiTpSetFlagsSub(a1, a2, v18 - v8, v18, *(_QWORD *)(a1 + 32));
return ImmediateOperand;
}
v10 = v18 ^ v8;
v11 = v18 ^ v8;
goto LABEL_15;
}
v12 = v18;
v13 = v18;
LABEL_17:
v10 = v13 - v8;
KiTpSetFlagsSub(a1, a2, v10, v12, *(_QWORD *)(a1 + 32));
goto LABEL_25;
}
v10 = v18 & v8;
LABEL_19:
v11 = v10;
v9 = a1;
LABEL_15:
*(_DWORD *)(*(_QWORD *)(a2 + 8) + 68i64) &= 0xFFFFF7FE;
KiTpSetFlagsZeroSignParity(v9, a2, v11);
LABEL_25:
v19[1] = v10;
KiTpAccessMemory();
return v15;
}
v14 = v18;
v10 = v18 + v8 + (*(_DWORD *)(*(_QWORD *)(a2 + 8) + 68i64) & 1);
}
else
{
v14 = v18;
v10 = v8 + v18;
}
KiTpSetFlagsAdd(a1, a2, v10, v14, *(_QWORD *)(a1 + 32));
goto LABEL_25;
}
}
return ImmediateOperand;
}Referenced by:
KiTpEmulateInstruction