HvlpDetermineEnlightenments

VOID __stdcall HvlpDetermineEnlightenments(){
  int v0; 
  int v1; 
  _HV_PARTITION_PRIVILEGE_MASK v2; 
  int bf_8_high; 
  unsigned __int64 v4; 
  int v5; 
  int v6; 
  int v7; 
  int v8; 
  int v9; 
  int v10; 
  unsigned int v11; 
  char v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  int v17; 
  __int64 *v18; 
  int v19; 
  int v20; 
  int v21; 
  char v22; 
  __int64 v23; 
  int v24; 
  __int64 v25; 
  PHYSICAL_ADDRESS PageInfo[2]; 
  __int128 v27; 
  __int128 v28; 
  __int128 v29; 
  INT64 v30[2]; 
  _HV_X64_HYPERVISOR_FEATURES HvFeaturesOut; 
  _HV_X64_HYPERVISOR_FEATURES v32; 
  char StackBuffer[16]; 

  v25 = 0i64;
  v0 = 0;
  v29 = 0i64;
  HvlEnableIdleYield = 0;
  v28 = 0i64;
  v32 = 0i64;
  *(_OWORD *)v30 = 0i64;
  *(_OWORD *)&PageInfo[0].anonymous_0.LowPart = 0i64;
  v27 = 0i64;
  HviGetEnlightenmentInformation((__int32 *)&v28);
  HvFeaturesOut = 0i64;
  HviGetHypervisorFeatures(&HvFeaturesOut);
  HviGetHypervisorFeatures(&v32);
  HviGetHardwareFeatures((INT64)v30);
  v1 = v28;
  if( (v28 & 1) != 0 )
  {
    v0 = 8388615;
  }
  else if( (v28 & 2) != 0 )
  {
    v0 = 8388614;
  }
  else if( (v28 & 4) != 0 )
  {
    if( (v28 & 0x20000) != 0 || (v0 = 8388612, v1 = v28, KeGetCurrentPrcb()->CpuVendor == 2) )
      v0 = 4;
  }
  v2.AsUINT64 = (unsigned __int64)HvFeaturesOut.PartitionPrivileges;
  if( (HvFeaturesOut.PartitionPrivileges.AsUINT64 & 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;
  }
  bf_8_high = HIDWORD(v32._bf_8);
  if( (v32._bf_8 & 0x4000000000000i64) != 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 = (HIDWORD(v32._bf_8) >> 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( (v32._bf_8 & 0x2000000000i64) == 0 )
    v10 = v9;
  if( SDWORD1(v28) > 0 )
  {
    _BitScanReverse(&v11, DWORD1(v28));
    v10 |= 0x40u;
    HvlLongSpinCountMask = DWORD1(v28) | ((1 << v11) - 1);
  }
  if( (HvFeaturesOut.PartitionPrivileges.AsUINT64 & 0x100000000000i64) != 0 && HvlpTryToLockCpuManagementVersion() )
    LODWORD(HvlpFlags) = HvlpFlags | 2;
  if( (bf_8_high & 0x10000000) != 0 )
  {
    v10 |= 0x4000000u;
    if( !v7 )
      v10 &= ~0x4000000u;
  }
  if( (HvlpFlags & 2) != 0 )
  {
    HvlpGetRegister128(516, &v29);
    v12 = v29;
    v13 = v10 | 0x400;
    if( (BYTE4(v29) & 1) == 0 )
      v13 = v10;
    v14 = v13 | 0x20000;
    if( (BYTE4(v29) & 2) == 0 )
      v14 = v13;
    v10 = v14 | 0x40000;
    if( (BYTE4(v29) & 4) == 0 )
      v10 = v14;
    if( (v29 & 1) != 0 )
      HvlpRootFlags |= 0x20u;
    if( (v29 & 2) != 0 )
      HvlpRootFlags |= 0x40u;
    if( (int)v29 < 0 )
    {
      HvlpRootFlags |= 0x187u;
      v10 |= 0x10008u;
      BYTE5(Mm64BitPhysicalAddress) = 1;
      if( HvlpQueryHypervisorSchedulerType() == 4 )
        v10 |= 0x40000u;
    }
    v15 = HvlpRootFlags;
    if( (HvlpRootFlags & 1) != 0 && (v12 & 4) != 0 )
    {
      v15 = HvlpRootFlags | 0x200;
      HvlpRootFlags |= 0x200u;
    }
    if( (v2.AsUINT64 & 0x10000000000i64) != 0 )
    {
      v15 |= 0x10u;
      HvlpRootFlags = v15;
    }
    if( (v1 & 0x1000) != 0 )
      HvlpRootFlags = v15 | 0x400;
  }
  v16 = v10 | 0x800;
  if( (bf_8_high & 0x80u) == 0 )
    v16 = v10;
  if( (bf_8_high & 8) == 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 4;
  v17 = v16 | 0x100;
  if( (v2.AsUINT64 & 0x202) != 514i64 )
    v17 = v16;
  if( (v2.AsUINT64 & 0x200000000i64) != 0 )
  {
    v18 = (__int64 *)HvlpAcquireHypercallPage(PageInfo, 2ui64, StackBuffer, 8ui64);
    HvcallInitiateHypercall();
    HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)PageInfo);
    HvlPartitionId = *v18;
  }
  v19 = v17 | 0x2000;
  if( (bf_8_high & 0x400) == 0 )
    v19 = v17;
  if( (v2.AsUINT64 & 4) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x20;
  if( (bf_8_high & 0x4000) == 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x2000;
  if( (v2.AsUINT64 & 0x1000000000000i64) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x40;
  v20 = v19 | 0x8000;
  if( (v2.AsUINT64 & 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( (v30[0] & 0x800000) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x1000000;
  if( (v1 & 0x8000) != 0 && (v21 & 0x100) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x4000;
  if( (v30[0] & 0x10000) != 0 )
    LODWORD(HvlpFlags) = HvlpFlags | 0x40000;
  v22 = HvlpQueryExtendedCapabilities(&v25);
  v23 = v25 & -(__int64)(v22 != 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