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