KiTpEmulateGroup0Instruction
NTSTATUS __stdcall KiTpEmulateGroup0Instruction(UINT8 *a1, INT64 a2, CHAR a3, INT64 *a4){
int OperandValue;
bool v8;
INT64 v9;
INT64 *v10;
INT64 v11;
UINT8 *v12;
INT64 v13;
INT64 v14;
int v15;
INT64 v16;
INT64 v17;
INT64 v18;
NTSTATUS v19;
CHAR v21;
INT64 v22;
UINT64 v23[2];
CHAR v24;
v22 = 0i64;
v23[0] = 0i64;
v24 = 0;
v21 = 0;
if( !a2 && (a3 & 1) == 0 )
a1[1] = 8;
OperandValue = KiTpDecodeModRm(a1, a2, a4);
if( OperandValue >= 0 )
{
if( !a2 )
return 0;
v8 = (a3 & 2) != 0;
KiTpDecodeModRmOperand((INT64)a1, a2, (UINT64)v23, (CHAR)&v24, (CHAR)&v21);
LOBYTE(v9) = v24;
OperandValue = KiTpReadOperandValue((INT64)a1, a2, v23[0], v9, v21, (INT64)&v22);
if( OperandValue < 0 )
return OperandValue;
LODWORD(v10) = KiTpGetRegisterAddressByIndex((INT64)a1, a2, (a1[26] >> 3) & 7, (a1[25] & 4) != 0, 1);
LODWORD(v11) = KiTpSignExtendOperandValue((INT64)a1, *v10);
v13 = v11;
if( (a3 & 2) != 0 )
{
v13 = v22;
v14 = v11;
}
else
{
v14 = v22;
}
v15 = a3 & 0x38;
if( v15 )
{
if( v15 == 8 )
{
v16 = v14 | v13;
goto LABEL_24;
}
if( v15 != 16 )
{
if( v15 == 24 )
{
v18 = v14 - (*(_DWORD *)(*(_QWORD *)(a2 + 8) + 68i64) & 1);
v12 = a1;
LABEL_22:
v16 = v18 - v13;
KiTpSetFlagsSub((INT64)v12, a2, v16, v14, v13);
goto LABEL_30;
}
if( v15 != 32 )
{
if( v15 != 40 )
{
if( v15 != 48 )
{
KiTpSetFlagsSub((INT64)v12, a2, v14 - v13, v14, v13);
return OperandValue;
}
v16 = v14 ^ v13;
v17 = v14 ^ v13;
goto LABEL_20;
}
v18 = v14;
goto LABEL_22;
}
v16 = v14 & v13;
LABEL_24:
v17 = v16;
LABEL_20:
*(_DWORD *)(*(_QWORD *)(a2 + 8) + 68i64) &= 0xFFFFF7FE;
KiTpSetFlagsZeroSignParity((INT64)v12, a2, v17);
goto LABEL_30;
}
v16 = v14 + v13 + (*(_DWORD *)(*(_QWORD *)(a2 + 8) + 68i64) & 1);
}
else
{
v16 = v13 + v14;
}
KiTpSetFlagsAdd((INT64)v12, a2, v16, v14, v13);
LABEL_30:
if( v8 )
{
KiTpWriteRegisterValue((INT64)a1, a2, (a1[26] >> 3) & 7, (a1[25] & 4) != 0, v16);
}
else
{
v23[1] = v16;
KiTpAccessMemory();
return v19;
}
}
return OperandValue;
}Referenced by:
KiTpEmulateInstruction