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