HvlpDetermineEnlightenments

VOID __stdcall HvlpDetermineEnlightenments(){
  int v0; 
  int v1; 
  __int64 v2; 
  INT32 v3; 
  unsigned __int64 v4; 
  int v5; 
  int v6; 
  unsigned __int32 v7; 
  int v8; 
  int v9; 
  int v10; 
  unsigned int v11; 
  char v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  int v17; 
  LONGLONG *v18; 
  int v19; 
  int v20; 
  int v21; 
  CHAR ExtendedCapabilities; 
  __int64 v23; 
  int v24; 
  _QWORD a1[2]; 
  __int128 v26[2]; 
  __int128 v27; 
  _DWORD a2[4]; 
  INT64 v29[2]; 
  INT32 v30[4]; 
  INT32 v31[4]; 
  char v32[16]; 
  a1[0] = 0i64;
  v0 = 0;
  *(_OWORD *)a2 = 0i64;
  HvlEnableIdleYield = 0;
  v27 = 0i64;
  *(_OWORD *)v31 = 0i64;
  *(_OWORD *)v29 = 0i64;
  memset(v26, 0, sizeof(v26));
  HviGetEnlightenmentInformation((__int32 *)&v27);
  *(_OWORD *)v30 = 0i64;
  HviGetHypervisorFeatures(v30);
  HviGetHypervisorFeatures(v31);
  HviGetHardwareFeatures((INT64)v29);
  v1 = v27;
  if( (v27 & 1) != 0 )
  {
    v0 = 8388615;
  }
  else if( (v27 & 2) != 0 )
  {
    v0 = 8388614;
  }
  else if( (v27 & 4) != 0 )
  {
    if( (v27 & 0x20000) != 0 || (v0 = 8388612, v1 = v27, *((_BYTE *)KeGetCurrentPrcb() + 141) == 2) )
      v0 = 4;
  }
  v2 = *(_QWORD *)v30;
  if( (v30[0] & 0x10) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x80000;
  if( (v1 & 8) != 0 )
  {
    v0 |= 0x10u;
    LODWORD(HvlpFlags) = HvlpFlags | 1;
  }
  if( (v1 & 0x200) != 0 )
  {
    v0 |= 0x1000u;
    LODWORD(HvlpFlags) = HvlpFlags | 0x10;
  }
  v3 = v31[3];
  if( (v31[3] & 0x40000) != 0 )
  {
    v4 = __readmsr(0x40000001u);
    if( (v4 & 2) == 0 )
      __writemsr(0x40000001u, v4 | 2);
    v0 |= 0x100000u;
  }
  if( (v1 & 0x40000) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x400000;
  if( (v1 & 0x10000) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x800000;
  v5 = v0 | 0x20000000;
  if( (v1 & 0x100000) == 0 )
    v5 = v0;
  v6 = v5 | 0x80;
  v7 = ((unsigned __int32)v31[3] >> 4) & 1;
  if( !v7 )
    v6 = v5;
  if( (v1 & 0x800) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x80;
  v8 = v6 | 0x20;
  if( (v1 & 0x20) == 0 )
    v8 = v6;
  v9 = v8 | 0x4000;
  if( (v1 & 0x400) == 0 )
    v9 = v8;
  v10 = v9 | 0x200;
  if( (v31[3] & 0x20) == 0 )
    v10 = v9;
  if( SDWORD1(v27) > 0 )
  {
    _BitScanReverse(&v11, DWORD1(v27));
    v10 |= 0x40u;
    HvlLongSpinCountMask = DWORD1(v27) | ((1 << v11) - 1);
  }
  if( (*(_QWORD *)v30 & 0x100000000000i64) != 0 && (unsigned __int8)HvlpTryToLockCpuManagementVersion() )
    LODWORD(HvlpFlags) = HvlpFlags | 2;
  if( (v3 & 0x10000000) != 0 )
  {
    v10 |= 0x4000000u;
    if( !v7 )
      v10 &= ~0x4000000u;
  }
  if( (HvlpFlags & 2) != 0 )
  {
    HvlpGetRegister128(516i64, a2);
    v12 = a2[0];
    v13 = v10 | 0x400;
    if( (a2[1] & 1) == 0 )
      v13 = v10;
    v14 = v13 | 0x20000;
    if( (a2[1] & 2) == 0 )
      v14 = v13;
    v10 = v14 | 0x40000;
    if( (a2[1] & 4) == 0 )
      v10 = v14;
    if( (a2[0] & 1) != 0 )
      HvlpRootFlags |= 0x20u;
    if( (a2[0] & 2) != 0 )
      HvlpRootFlags |= 0x40u;
    if( a2[0] < 0 )
    {
      HvlpRootFlags |= 0x187u;
      v10 |= 0x10008u;
      BYTE5(Mm64BitPhysicalAddress) = 1;
      if( (unsigned int)HvlpQueryHypervisorSchedulerType() == 4 )
        v10 |= 0x40000u;
    }
    v15 = HvlpRootFlags;
    if( (HvlpRootFlags & 1) != 0 && (v12 & 4) != 0 )
    {
      v15 = HvlpRootFlags | 0x200;
      HvlpRootFlags |= 0x200u;
    }
    if( (v2 & 0x10000000000i64) != 0 )
    {
      v15 |= 0x10u;
      HvlpRootFlags = v15;
    }
    if( (v1 & 0x1000) != 0 )
      HvlpRootFlags = v15 | 0x400;
  }
  v16 = v10 | 0x800;
  if( (v3 & 0x80u) == 0 )
    v16 = v10;
  if( (v3 & 8) == 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 4;
  v17 = v16 | 0x100;
  if( (v2 & 0x202) != 514 )
    v17 = v16;
  if( (v2 & 0x200000000i64) != 0 )
  {
    v18 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v26, 2, (__int64)v32, 8i64);
    HvcallInitiateHypercall();
    HvlpReleaseHypercallPage((unsigned int *)v26);
    HvlPartitionId = *v18;
  }
  v19 = v17 | 0x2000;
  if( (v3 & 0x400) == 0 )
    v19 = v17;
  if( (v2 & 4) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x20;
  if( (v3 & 0x4000) == 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x2000;
  if( (v2 & 0x1000000000000i64) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x40;
  v20 = v19 | 0x8000;
  if( (v2 & 0x20000000000000i64) == 0 )
    v20 = v19;
  if( (v1 & 0x2000) != 0 )
  {
    v21 = v20 | 0x80000;
    if( (VslGetNestedPageProtectionFlags() & 2) == 0 )
      v21 = v20;
  }
  else
  {
    v21 = v20;
    if( (HvlpFlags & 0x40) != 0 )
      LODWORD(HvlpFlags) = HvlpFlags | 0x20000;
  }
  if( (v29[0] & 0x800000) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x1000000;
  if( (v1 & 0x8000) != 0 && (v21 & 0x100) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x4000;
  if( (v29[0] & 0x10000) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x40000;
  ExtendedCapabilities = HvlpQueryExtendedCapabilities(a1);
  v23 = a1[0] & -(__int64)(ExtendedCapabilities != 0);
  if( (v23 & 0x10) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x8000;
  if( (v23 & 0x20) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x10000;
  if( (v23 & 8) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x100000;
  if( (v23 & 0x40) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x200000;
  v24 = v21 | 0x200000;
  if( (v23 & 2) == 0 )
    v24 = v21;
  if( (v23 & 4) != 0 )
  {
    v24 |= 0x400000u;
    if( (v23 & 0x80u) != 0i64 )
      v24 |= 0x8000000u;
  }
  qword_140C00710 = (__int64(__fastcall *)(_QWORD))HvlGetEnlightenmentInfo;
  HvlpEnlightenments = ~HvlpRescindedEnlightenments & v24;
  HvlEnlightenments = ~HvlpRescindedEnlightenments & v24;
}

Referenced by:

HvlPhase0Initialize