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