KiDetectHardwareSpecControlFeatures

_OWORD *__fastcall KiDetectHardwareSpecControlFeatures(INT64 a1, CHAR a2, _OWORD *a3, UINT64 a4){
  char v4; 
  char v6; 
  int v7; 
  _BYTE *v8; 
  __int64 v9; 
  bool v10; 
  bool v11; 
  __int64 v12; 
  int v13; 
  unsigned __int64 v14; 
  int v15; 
  __int64 v16; 
  __int32 v17; 
  __int64 v18; 
  int v19; 
  __int64 v20; 
  char v21; 
  bool v22; 
  int v23; 
  _OWORD *result; 
  __int128 v25; 
  INT32 v27[4]; 
  __int128 v28; 
  v4 = *(_BYTE *)(a1 + 141);
  v6 = *(_BYTE *)(a1 + 64);
  v7 = 0;
  v8 = (_BYTE *)a4;
  *(_QWORD *)&v25 = 0x4800000000i64;
  LOBYTE(a4) = *(_BYTE *)(a1 + 67);
  v9 = __cpuid(0, 0);
  *((_QWORD *)&v25 + 1) = 4i64;
  v27[0] = 0;
  v10 = 0;
  v27[1] = EBX(v9);
  v11 = 0;
  v27[2] = ECX(v9);
  v27[3] = EDX(v9);
  v28 = 0i64;
  if( (unsigned int)EAX(v9) < 7 )
  {
    v13 = 0;
  }
  else
  {
    v12 = __cpuid(7, 0);
    v27[0] = EAX(v12);
    v13 = EDX(v12);
    v27[1] = EBX(v12);
    v27[2] = ECX(v12);
    if( (v13 & 0x20000000) != 0 )
    {
      v14 = __readmsr(0x10Au);
      v15 = v14 & 2;
      if( (v14 & 2) != 0 )
        v7 = 512;
      LODWORD(v25) = v7;
      v11 = v15 != 0;
      v10 = v15 != 0;
      if( (v14 & 2) != 0 )
      {
        v7 |= 1u;
        v10 = 1;
        LODWORD(v25) = v7;
      }
      if( (v14 & 0x10) != 0 )
      {
        v7 |= 0x100u;
        v10 = 1;
        LODWORD(v25) = v7;
      }
      if( (v14 & 4) != 0 )
      {
        v7 |= 0x200u;
        v10 = 1;
        LODWORD(v25) = v7;
      }
    }
  }
  if( v4 == 1 )
  {
    v16 = __cpuid(0x80000000, 0);
    v27[1] = EBX(v16);
    v27[2] = ECX(v16);
    v27[3] = EDX(v16);
    if( (unsigned int)EAX(v16) < 0x80000008 )
    {
      v17 = 0;
    }
    else
    {
      v18 = __cpuid(-2147483640, 0);
      v17 = EBX(v18);
      v27[0] = EAX(v18);
      v27[2] = ECX(v18);
      v27[3] = EDX(v18);
    }
    if( (v17 & 0x1000) != 0 )
    {
      v7 |= 4u;
      v10 = 1;
      LODWORD(v25) = v7;
    }
    if( (v17 & 0x4000) != 0 )
    {
      v7 |= 0x10u;
      v10 = 1;
      LODWORD(v25) = v7;
    }
    if( (v17 & 0x8000) != 0 )
    {
      v7 |= 0x40u;
      v10 = 1;
      LODWORD(v25) = v7;
    }
    if( (v17 & 0x1000000) != 0 )
    {
      v7 |= 0x80u;
      LODWORD(v25) = v7;
    }
    if( (v17 & 0x4000000) != 0 )
    {
      v7 |= 0x180u;
      LODWORD(v25) = v7;
    }
    if( (v7 & 0x80u) != 0 )
      goto LABEL_34;
  }
  else
  {
    if( (v13 & 0x4000000) != 0 )
    {
      v7 |= 0x14u;
      v10 = 1;
      LODWORD(v25) = v7;
    }
    if( (v13 & 0x8000000) != 0 )
    {
      v7 |= 0x44u;
      v10 = 1;
      LODWORD(v25) = v7;
    }
    if( v13 < 0 )
    {
      v7 |= 0x80u;
      LODWORD(v25) = v7;
LABEL_34:
      v10 = 1;
    }
  }
  if( (a2 & 1) != 0 || KiKvaShadowMode == 1 )
  {
    v7 |= 0x20u;
    LODWORD(v25) = v7;
  }
  if( v4 == 2 && v6 == 6 )
  {
    if( (unsigned __int8)(a4 - 78) <= 0x19u && (v19 = 50397313, _bittest(&v19, a4 - 78))
      || (_BYTE)a4 == 0x8E
      || (_BYTE)a4 == 0x9E )
    {
      v7 |= 0x200u;
      LODWORD(v25) = v7;
    }
    LOBYTE(a4) = a4 - 55;
    if( (unsigned __int8)a4 <= 0x3Eu )
    {
      v20 = 0x4080404800680001i64;
      if( _bittest64(&v20, a4) )
      {
        v7 |= 0x200u;
        LODWORD(v25) = v7;
      }
    }
  }
  if( (v7 & 0x10) != 0 && (v7 & 4) != 0 )
  {
    v21 = 1;
    if( HviIsHypervisorMicrosoftCompatible() )
    {
      HviGetEnlightenmentInformation((__int32 *)&v28);
      *(_OWORD *)v27 = 0i64;
      HviGetHypervisorFeatures(v27);
      if( (*(_QWORD *)v27 & 0x100000000000i64) == 0 )
        goto LABEL_56;
      v22 = (v28 & 0x1000) == 0;
    }
    else
    {
      v22 = (unsigned __int8)HviIsAnyHypervisorPresent() == 0;
    }
    if( v22 )
    {
      v21 = 0;
      goto LABEL_57;
    }
LABEL_56:
    if( (KiFeatureSettings & 0x8000) == 0 )
    {
LABEL_67:
      if( v4 == 1 )
      {
        v7 |= 0x1000u;
        LODWORD(v25) = v7;
        if( (v7 & 0x40) != 0 )
        {
          v7 |= 0x4000u;
          LODWORD(v25) = v7;
        }
      }
      goto LABEL_70;
    }
LABEL_57:
    v23 = *(_DWORD *)(a1 + 1740);
    if( (v23 & 2) != 0 )
    {
      v7 |= 0x400u;
      LODWORD(v25) = v7;
    }
    if( (v23 & 4) != 0 )
    {
      v7 |= 0x800u;
      LODWORD(v25) = v7;
      if( (KiFeatureSettings & 0x4000) != 0 )
      {
        v7 |= 1u;
        LODWORD(v25) = v7;
      }
    }
    if( v4 == 2 )
    {
      if( (v21 || v11) && (v23 & 3) == 0 )
        goto LABEL_70;
      v7 |= 0x1000u;
      LODWORD(v25) = v7;
    }
    goto LABEL_67;
  }
LABEL_70:
  if( (KeFeatureBits2 & 0x20000) != 0 && (KiFeatureSettings & 0x400000) == 0 )
  {
    v7 |= 0x2000u;
    LODWORD(v25) = v7;
  }
  if( v4 != 1 || (KeFeatureBits2 & 0x2000000) != 0 )
  {
    v7 |= 8u;
    LODWORD(v25) = v7;
  }
  if( (KiFeatureSettings & 0x10000) != 0 )
    LODWORD(v25) = v7 & 0xFFFFF7FE;
  result = a3;
  *a3 = v25;
  if( v8 )
    *v8 = v10;
  return result;
}

Referenced by:

KiDetermineRetpolineEnablement
KiIsKvaShadowNeededForBranchConfusion
KiSetHardwareSpeculationControlFeatures