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