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