KiSetFeatureBits
CHAR __fastcall KiSetFeatureBits(INT64 a1){
char v2;
unsigned __int8 v3;
char v4;
unsigned int ProcessorSignature;
__int64 v6;
char v7;
unsigned __int32 v8;
__int64 v9;
ULONG_PTR v10;
__int64 v11;
unsigned __int32 v12;
ULONG_PTR v13;
char v14;
int v15;
__int64 v16;
char v17;
unsigned int v18;
__int32 v19;
__int64 v20;
int v21;
unsigned int v22;
__int64 v23;
char v24;
unsigned int v25;
char v26;
unsigned int v27;
char v28;
int v29;
CHAR IsHyperThreadingEnabled;
unsigned __int64 v31;
__int64 v32;
__int64 v33;
unsigned __int64 v34;
__int64 v35;
unsigned __int64 v36;
char v37;
__int64 v38;
__int64 v39;
__int64 v40;
__int64 v41;
unsigned __int64 v42;
__int64 v43;
__int64 v44;
__int64 v45;
char v46;
unsigned __int64 v47;
char v48;
char v49;
unsigned __int8 v50;
__int64 v51;
int v52;
unsigned __int16 v53;
unsigned __int8 v54;
int v55;
__int64 v56;
unsigned int v57;
__int64 v58;
unsigned int v59;
unsigned int v60;
unsigned int v61;
__int64 v62;
__int32 v63;
unsigned __int64 v64;
char v65;
unsigned __int32 v67;
bool v68;
unsigned __int32 v69;
unsigned __int32 v70;
__int32 v71;
__int16 v72;
unsigned __int32 v73;
__int16 v74;
v2 = *(_BYTE *)(a1 + 64);
v3 = *(_BYTE *)(a1 + 67);
v4 = *(_BYTE *)(a1 + 141);
v68 = (unsigned __int8)(v4 - 1) <= 1u;
if( *(_DWORD *)(a1 + 36) )
{
ProcessorSignature = KiGetProcessorSignature(0i64, 0i64, 0i64, 0i64);
KiSetProcessorSignature(a1, ProcessorSignature);
goto LABEL_3;
}
if( v4 == 2 )
{
if( v2 != 6 )
goto LABEL_3;
KiLastExceptionFromBaseMSR = 477;
KiLastExceptionToBaseMSR = 478;
if( v3 <= 0x27u )
{
if( v3 < 0x26u && v3 != 15 && v3 != 23 )
{
if( v3 == 26 )
goto LABEL_89;
if( v3 != 28 && v3 != 29 )
{
if( v3 > 0x1Du && (v3 <= 0x1Fu || v3 == 37) )
goto LABEL_89;
goto LABEL_90;
}
}
}
else
{
if( v3 > 0x3Au )
{
if( v3 == 60 )
{
LABEL_89:
KiLastBranchFromBaseMSR = 1664;
KiLastBranchToBaseMSR = 1728;
goto LABEL_90;
}
if( v3 > 0x44u )
{
if( v3 <= 0x46u )
goto LABEL_89;
if( v3 == 77 )
goto LABEL_121;
}
LABEL_90:
if( KiLastBranchFromBaseMSR )
KiLastBranchTOSMSR = 457;
goto LABEL_3;
}
if( v3 == 58 || v3 == 42 )
goto LABEL_89;
if( v3 <= 0x2Bu )
goto LABEL_90;
if( v3 <= 0x2Fu )
goto LABEL_89;
if( v3 <= 0x34u || v3 > 0x37u )
goto LABEL_90;
}
LABEL_121:
KiLastBranchFromBaseMSR = 64;
KiLastBranchToBaseMSR = 96;
goto LABEL_90;
}
if( v4 == 1 )
{
KiLastBranchFromBaseMSR = 475;
KiLastBranchToBaseMSR = 476;
KiLastExceptionFromBaseMSR = 477;
KiLastExceptionToBaseMSR = 478;
}
LABEL_3:
v6 = __cpuid(0, 0);
v71 = EDX(v6);
v67 = EAX(v6);
v7 = *(_BYTE *)(a1 + 141);
if( v7 == 2 )
{
__writemsr(0x8Bu, 0i64);
v71 = EDX(__cpuid(1, 0));
LABEL_5:
*(_QWORD *)(a1 + 34216) = __readmsr(0x8Bu);
goto LABEL_6;
}
if( v7 == 1 )
{
v7 = 1;
goto LABEL_5;
}
LABEL_6:
v9 = __cpuid(1, 0);
v8 = EDX(v9);
v10 = v8;
v70 = v8;
v72 = ECX(v9);
v73 = EBX(v9);
v69 = EAX(__cpuid(0x80000000, 0));
v11 = __cpuid(-2147483647, 0);
v12 = EDX(v11);
v13 = (unsigned int)ECX(v11);
if( !*(_DWORD *)(a1 + 36) )
{
if( v7 == 1 )
{
v48 = *(_BYTE *)(a1 + 64);
v49 = *(_BYTE *)(a1 + 67);
v50 = *(_BYTE *)(a1 + 66);
if( v48 == 15 && (v49 == 107 || v49 == 104) && v50 == 1 )
{
KiCacheErrataMonitor |= 1ui64;
}
else if( v48 == 16 && (!v49 && v50 <= 2u || v49 == 2 && (v50 <= 2u || v50 == 10) || v49 == 4 && !v50) )
{
KiCacheErrataMonitor |= 2ui64;
}
}
if( !*(_DWORD *)(a1 + 36) )
{
v46 = *(_BYTE *)(a1 + 141);
if( v46 == 1 )
{
if( *(_BYTE *)(a1 + 64) == 23 )
KiAccessBitErrata = 1;
}
else if( v46 == 2 && *(_BYTE *)(a1 + 64) == 6 )
{
if( (v47 = *(unsigned __int8 *)(a1 + 67), (unsigned __int8)v47 <= 0x36u)
&& (v51 = 0x6000C010000000i64, _bittest64(&v51, v47))
|| (LOBYTE(v47) = v47 - 55, (unsigned __int8)v47 <= 0x16u)
&& (v52 = 4718593, _bittest(&v52, v47))
&& *(_BYTE *)(a1 + 66) <= 7u )
{
KiAccessBitErrata = 2;
}
}
}
}
KiDetectKvaLeakage(a1);
_m_prefetchw((const void *)a1);
v14 = 1;
if( *(_BYTE *)(a1 + 141) == 1 )
v12 |= 0x100000u;
*(_DWORD *)(a1 + 212) = HIBYTE(v73);
*(_DWORD *)(a1 + 232) = (v73 >> 5) & 0x7F8;
v15 = 0;
if( (v10 & 0x789F3FD) != 126481405
|| (v12 & 0x800) == 0
|| (v12 & 0x100000) == 0
|| (v72 & 0x2000) == 0
|| (v13 & 1) == 0
|| (_DWORD)KiOpPrefetchPatchSkip )
{
if( !*(_DWORD *)(a1 + 36) )
KdInitSystem(0i64, KeLoaderBlock_0);
KeBugCheckEx(0x5Du, v10, v12, v13, (unsigned int)KiOpPrefetchPatchSkip);
}
v16 = *(_QWORD *)(a1 + 34208) | 0x20113DFEi64;
if( (*(_QWORD *)(a1 + 34208) & 0x400000000i64) != 0 )
__writemsr(0xC0000103, *(unsigned __int8 *)(a1 + 209) | ((unsigned __int64)*(unsigned __int8 *)(a1 + 208) << 8));
__writemsr(0x174u, 0i64);
__writemsr(0x176u, 0i64);
__writemsr(0x175u, 0i64);
if( (v12 & 0x2000000) != 0 )
__writemsr(0xC0000080, __readmsr(0xC0000080) | 0x4000);
*(_DWORD *)(a1 + 152) = 1;
*(_DWORD *)(a1 + 156) = 1;
v17 = *(_BYTE *)(a1 + 141);
if( (unsigned __int8)(v17 - 2) > 1u )
{
v27 = v69;
if( v17 == 1 && v69 >= 0x80000008 )
{
v53 = ECX(__cpuid(-2147483640, 0));
v54 = v53;
v55 = v53 >> 12;
if( !v55 )
_BitScanReverse((unsigned int *)&v55, 2 * v54 + 1);
*(_DWORD *)(a1 + 152) = 1 << v55;
if( v69 >= 0x8000001E && (v13 & 0x400000) != 0 )
{
v56 = __cpuid(-2147483618, 0);
v57 = (unsigned __int8)((unsigned __int16)EBX(v56) >> 8) + 1;
*(_DWORD *)(a1 + 156) = v57;
*(_DWORD *)(a1 + 152) /= v57;
*(_DWORD *)(a1 + 212) = EAX(v56);
}
}
v18 = v67;
}
else
{
v18 = v67;
if( v67 >= 0x1F )
{
v58 = __cpuid(31, 0);
v19 = EDX(v58);
if( EBX(v58) )
v15 = 31;
}
else
{
v19 = v71;
}
if( v15 )
goto LABEL_27;
if( v67 >= 0xB )
{
v20 = __cpuid(11, 0);
v19 = EDX(v20);
if( EBX(v20) )
v15 = 11;
}
if( v15 )
{
LABEL_27:
*(_DWORD *)(a1 + 212) = v19;
v21 = 0;
v22 = 1;
do
{
v23 = __cpuid(v15, v21);
v24 = EAX(v23);
v74 = EBX(v23);
++v21;
v25 = (unsigned int)ECX(v23) >> 8;
if( v25 )
{
v26 = v24 & 0x1F;
if( v25 == 1 )
*(_DWORD *)(a1 + 156) = 1 << v26;
else
v22 = 1 << v26;
}
}
while( v74 );
*(_DWORD *)(a1 + 152) = v22 / *(_DWORD *)(a1 + 156);
v18 = v67;
v14 = 1;
}
else
{
v59 = 1;
if( v67 >= 4 )
{
_BitScanReverse(&v60, 2 * ((unsigned int)EAX(__cpuid(4, 0)) >> 26) + 1);
v59 = 1 << v60;
*(_DWORD *)(a1 + 152) = 1 << v60;
}
if( (v70 & 0x10000000) != 0 )
{
_BitScanReverse(&v61, 2 * BYTE2(v73) - 1);
*(_DWORD *)(a1 + 156) = (1 << v61) / v59;
}
}
v27 = v69;
}
v28 = *(_BYTE *)(a1 + 141);
if( v28 == 1 )
{
v16 |= 0x200000ui64;
}
else if( v28 == 2 )
{
v16 |= 0x1000000ui64;
}
*(_BYTE *)(a1 + 142) = *(_BYTE *)(a1 + 152);
*(_BYTE *)(a1 + 143) = *(_BYTE *)(a1 + 156);
v29 = *(_DWORD *)(a1 + 156);
if( *(_DWORD *)(a1 + 36) )
{
IsHyperThreadingEnabled = HalIsHyperThreadingEnabled();
v14 = 1;
if( !IsHyperThreadingEnabled )
v29 *= *(_DWORD *)(a1 + 152);
}
*(_DWORD *)(a1 + 220) = -v29;
if( (unsigned __int8)(*(_BYTE *)(a1 + 141) - 1) > 2u || v27 < 0x80000008 )
{
if( *(_BYTE *)(a1 + 141) == 1 )
*(_BYTE *)KiMtrrMaxRangeShift = 40;
}
else
{
*(_BYTE *)KiMtrrMaxRangeShift = EAX(__cpuid(-2147483640, 0));
}
KiMtrrMaskBase = ((1i64 << *(char *)KiMtrrMaxRangeShift) - 1) & 0xFFFFFFFFFFFFF000ui64;
KiMtrrMaskMask = ((1i64 << *(char *)KiMtrrMaxRangeShift) - 1) & 0xFFFFFFFFFFFFF000ui64;
v31 = __readcr4();
if( (v16 & 1) != 0 )
v31 |= 0x100000ui64;
v32 = v31 | 0x10000;
if( (v16 & 0x10000000) == 0 )
v32 = v31;
if( KeSmapEnabled )
v32 |= 0x200000ui64;
v33 = v32 | 0x800;
LOBYTE(v34) = KeFeatureBits2 & 4;
if( (KeFeatureBits2 & 4) == 0 )
v33 = v32;
v35 = v33;
if( *(_DWORD *)(a1 + 36) )
{
LOBYTE(v34) = 0;
if( (v16 & 0x40000000000i64) != 0 )
{
if( KiFlushPcid )
v35 = v33 | 0x20000;
}
}
__writecr4(v35);
if( KeSmapEnabled )
__stac();
if( (v35 & 0x20000) != 0 )
{
v36 = __readcr3();
v34 = v36 | 2;
__writecr3(v34);
}
v37 = *(_BYTE *)(a1 + 141);
if( v37 == 2 && v18 >= 7 )
{
v38 = __cpuid(7, 0);
LOBYTE(v34) = EAX(v38);
if( (EBX(v38) & 0x8000) != 0 )
{
v62 = __cpuid(16, 0);
LOBYTE(v34) = EAX(v62);
if( (EBX(v62) & 2) != 0 )
{
LOBYTE(v34) = 0;
v16 |= 0x100000000000ui64;
}
}
}
v39 = v16 | 0x20000;
if( !v68 )
v39 = v16;
v40 = v39;
if( v37 != 2 )
{
if( v37 == 1 )
{
if( (unsigned int)EAX(__cpuid(0x80000000, 0)) >= 0x8000000A )
{
v63 = EDX(__cpuid(-2147483638, 0));
v40 = v39 | 0x4000000;
if( (v63 & 1) == 0 )
v40 = v39;
if( (v63 & 0x20000) != 0 )
HvlSetHardwareMbecAvailable();
if( (v63 & 0x2000) != 0 )
HvlSetApicVirtualizationAvailable();
}
v34 = __readmsr(0xC0010114);
if( (v34 & 0x10) == 0 )
{
v40 |= 0x8000000ui64;
KiVirtFlags |= v14;
}
}
goto LABEL_179;
}
v41 = __cpuid(1, 0);
LOBYTE(v34) = EAX(v41);
if( (ECX(v41) & 0x20) == 0 )
{
LABEL_179:
v44 = 0x10000000000i64;
goto LABEL_79;
}
if( (__readmsr(0x482u) & 0x8000000000000000ui64) == 0i64 )
{
v44 = 0x10000000000i64;
}
else
{
v42 = __readmsr(0x48Bu);
v43 = v39 | 0x4000000;
if( (v42 & 0x200000000i64) == 0 )
v43 = v39;
v39 = v43;
if( (v43 & 1) != 0 && (v42 & 0x40000000000000i64) != 0 )
HvlSetHardwareMbecAvailable();
v44 = 0x10000000000i64;
if( (v42 & 0x10000000000i64) != 0 )
HvlSetApicVirtualizationAvailable();
}
v34 = __readmsr(0x3Au);
v40 = v39 | 0x8000000;
if( (v34 & 5) != 5 )
v40 = v39;
if( (v34 & 4) != 0 )
KiVirtFlags |= v14;
if( ((unsigned __int8)v34 & (unsigned __int8)v14) != 0 )
KiVirtFlags |= 2u;
LABEL_79:
if( *(_BYTE *)(a1 + 141) == 2 )
{
v45 = __cpuid(7, 0);
LOBYTE(v34) = EAX(v45);
if( (EBX(v45) & 4) != 0 )
{
v64 = __readmsr(0x3Au);
v34 = v64 & 0x40001;
if( v34 == 262145 )
{
LOBYTE(v34) = EAX(__cpuid(18, 0));
v65 = v34;
if( ((unsigned __int8)v34 & (unsigned __int8)v14) != 0 )
{
v40 |= v44;
LODWORD(v34) = KUSER_SHARED_DATA.EnclaveFeatureMask[0] | 2;
KUSER_SHARED_DATA.EnclaveFeatureMask[0] |= 2u;
if( (v65 & 2) != 0 )
{
v40 |= 0x80000000000ui64;
LODWORD(v34) = v34 | 4;
KUSER_SHARED_DATA.EnclaveFeatureMask[0] = v34;
}
}
}
}
}
if( *(_BYTE *)(a1 + 141) == v14 )
{
LOBYTE(v34) = *(_BYTE *)(a1 + 64);
if( (char)v34 > 15 && (_BYTE)v34 != 17 )
{
LOBYTE(v34) = HviIsAnyHypervisorPresent();
if( !(_BYTE)v34 )
{
v34 = __readmsr(0xC0011029) | 2;
__writemsr(0xC0011029, v34);
}
}
}
*(_QWORD *)(a1 + 34208) = v40;
return v34;
}Referenced by:
KiInitializeBootStructures