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