KiInitializeKernel

VOID __fastcall KiInitializeKernel(
        _EPROCESS *Process,
        _ETHREAD *Thread,
        VOID *IdleStack,
        _KPRCB *Prcb,
        UINT64 Number,
        _LOADER_PARAMETER_BLOCK *LoaderBlock){
  int v7; 
  ULONG_PTR v8; 
  _KPRCB *v9; 
  unsigned int *v10; 
  int v11; 
  unsigned int v12; 
  int v13; 
  unsigned int v14; 
  int v15; 
  INT64 v16; 
  __int64 v17; 
  int v18; 
  ULONG_PTR v19; 
  char v20; 
  _KPRCB *v21; 
  unsigned int v22; 
  unsigned int v23; 
  int v24; 
  ULONG_PTR v25; 
  char XSaveFeatureFlags; 
  INT64 v27; 
  ULONG_PTR v28; 
  ULONG_PTR v29; 
  _EPROCESS *v30; 
  _ETHREAD *v31; 
  INT64 v32; 
  int v33; 
  unsigned __int64 v34; 
  ULONG_PTR v35; 
  unsigned __int64 v36; 
  unsigned __int64 v37; 
  UINT8 v38; 
  int v39; 
  unsigned __int64 v40; 
  unsigned __int64 v41; 
  unsigned __int64 v42; 
  unsigned __int64 v43; 
  unsigned __int64 v44; 
  unsigned __int64 v45; 
  ULONG_PTR BugCheckParameter4; 
  UINT64 Flags; 
  INT64 v48; 
  char v49; 
  char v50; 
  ULONG_PTR BugCheckParameter1; 
  INT64 v52; 
  _KPRCB *v53; 
  INT64 v54; 
  INT64 v55; 
  INT64 v56; 
  _KPROCESS *Processa; 
  INT64 a15; 
  INT64 a16[2]; 
  _KPRCB *v60; 
  VOID *KernelStack; 
  _KTHREAD *Threada; 
  INT64 a21; 
  INT64 a22; 
  INT64 a23; 
  INT64 a24[2]; 
  INT64 v67; 
  INT64 result[3]; 
  CHAR v69; 
  int v70; 
  INT64 v71; 
  INT64 v72; 
  INT64 v73; 
  INT64 v74; 
  INT64 v75; 
  INT64 v76; 
  INT64 v77; 
  INT64 v78; 
  INT64 v79; 
  INT16 v80; 
  KernelStack = IdleStack;
  Threada = Thread;
  Processa = Process;
  a21 = (INT64)Thread;
  a22 = (INT64)Prcb;
  a15 = (INT64)LoaderBlock;
  a23 = (INT64)LoaderBlock;
  *(_OWORD *)a16 = 0i64;
  *(_OWORD *)a24 = 0i64;
  v7 = Number;
  if( !(_DWORD)Number )
    HvlPhase0Initialize(
      (INT64)LoaderBlock,
      (INT64)Thread,
      (INT64)IdleStack,
      (INT64)Prcb,
      BugCheckParameter4,
      Flags,
      v48,
      BugCheckParameter1,
      v52,
      (INT64)v53,
      v54,
      v55,
      v56,
      (INT64)Processa,
      a15,
      a16[0],
      a16[1],
      (INT64)v60,
      (INT64)KernelStack,
      (INT64)Threada,
      a21,
      a22,
      a23,
      a24[0],
      (__m128i *)a24[1],
      v67,
      result[0],
      result[1],
      result[2],
      v69,
      v71,
      v72,
      v73,
      v74,
      v75,
      v76,
      v77,
      v78,
      v79,
      v80);
  v8 = *((_QWORD *)Prcb + 4276);
  BugCheckParameter1 = v8;
  if( (unsigned __int8)(*((_BYTE *)Prcb + 141) - 1) <= 2u )
    KiSetHardwareSpeculationControlFeatures((INT64)Prcb, v8);
  KiCheckMicrocode((INT64)Prcb);
  memset((INT64)result, 0i64);
  _fxsave(result);
  if( (_DWORD)Number )
  {
    if( KiFpuLeakage )
      BugCheckParameter1 = v8 | 0x20000000000i64;
    KiSetPageAttributesTable();
    *((_DWORD *)Prcb + 8420) = 1310721;
    *((_DWORD *)Prcb + 8421) = 0;
    memset((INT64)Prcb + 33688, 0i64);
    KeAddProcessorAffinityEx((_WORD *)Prcb + 16840, Number);
    v9 = Prcb;
    v53 = Prcb;
    v10 = (unsigned int *)((char *)Prcb + 156);
    if( *((_QWORD *)Prcb + 19) == 0x100000001i64 )
    {
      *((_QWORD *)Prcb + 4235) = *((_QWORD *)Prcb + 25);
      *((_DWORD *)Prcb + 8462) = *((_DWORD *)Prcb + 53);
    }
    else
    {
      v11 = *v10;
      v12 = *v10 * *((_DWORD *)Prcb + 38);
      LODWORD(v54) = v12;
      v13 = ~(v12 - 1);
      HIDWORD(v54) = v13;
      v14 = *((_DWORD *)Prcb + 53);
      v15 = v13 & v14;
      LODWORD(v55) = v13 & v14;
      *((_DWORD *)Prcb + 8462) = v13 & v14;
      HIDWORD(v55) = ~(v11 - 1);
      v52 = HIDWORD(v55) & v14;
      v16 = *((_QWORD *)Prcb + 25);
      v56 = v16;
      v49 = 0;
      v17 = 0i64;
      if( (_DWORD)KeNumberProcessors_0 )
      {
        v18 = v52;
        do
        {
          v60 = v9;
          v50 = v49;
          v19 = (ULONG_PTR)*(&KiProcessorBlock + v17);
          if( (*(_DWORD *)(v19 + 212) & v13) == v15 )
          {
            KeAddProcessorAffinityEx((_WORD *)Prcb + 16840, v17);
            KeAddProcessorAffinityEx((_WORD *)(v19 + 33680), Number);
            v20 = v49;
            if( !v49 )
              v20 = 1;
            v49 = v20;
            v21 = (_KPRCB *)v19;
            if( v50 )
              v21 = v60;
            v53 = v21;
            v22 = KeCountSetBitsAffinityEx((_KAFFINITY_EX *)(v19 + 33680));
            v12 = v54;
            if( v22 > (unsigned int)v54 )
              KeBugCheckEx(0x3Eu, v19, v22, *(unsigned int *)(v19 + 152), *(unsigned int *)(v19 + 156));
            LODWORD(v17) = HIDWORD(v52);
            v16 = v56;
            v18 = v52;
            v13 = HIDWORD(v54);
            v15 = v55;
            v9 = v53;
          }
          if( (*(_DWORD *)(v19 + 212) & HIDWORD(v55)) == v18 && *(_QWORD *)(v19 + 192) == *((_QWORD *)Prcb + 24) )
          {
            v16 |= *(_QWORD *)(v19 + 200);
            v56 = v16;
            *(_QWORD *)(v19 + 33880) |= v16;
          }
          v17 = (unsigned int)(v17 + 1);
          HIDWORD(v52) = v17;
        }
        while( (unsigned int)v17 < (unsigned int)KeNumberProcessors_0 );
      }
      v23 = KeCountSetBitsAffinityEx((_KAFFINITY_EX *)((char *)Prcb + 33680));
      if( v23 > v12 )
        KeBugCheckEx(0x3Eu, (ULONG_PTR)Prcb, v23, *((unsigned int *)Prcb + 38), *v10);
      *((_QWORD *)Prcb + 4235) = v56;
    }
    v7 = Number;
    v24 = 65471;
  }
  else
  {
    KiDetectFpuLeakage();
    KiFpuLeakage = v33;
    if( v33 )
      v8 |= 0x20000000000ui64;
    if( KiFlushPcid )
    {
      v34 = __readcr3();
      __writecr3(v34);
      if( !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
        KiSetUserTbFlushPending();
    }
    else
    {
      v42 = __readcr4();
      if( (v42 & 0x20080) != 0 )
      {
        __writecr4(v42 ^ 0x80);
        __writecr4(v42);
      }
      else
      {
        v43 = __readcr3();
        __writecr3(v43);
      }
    }
    KiSetPageAttributesTable();
    if( KUSER_SHARED_DATA.ProcessorFeatures[12] )
      v35 = v8 | 0x80000000;
    else
      v35 = v8 & 0xFFFFFFFF3FFFFFFFui64 | 0x40000000;
    BugCheckParameter1 = v35;
    v36 = __readcr4();
    __writecr4(v36 | 0x18);
    if( KiFlushPcid )
    {
      v37 = __readcr3();
      __writecr3(v37);
      if( !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
        KiSetUserTbFlushPending();
    }
    else
    {
      v44 = __readcr4();
      if( (v44 & 0x20080) != 0 )
      {
        __writecr4(v44 ^ 0x80);
        __writecr4(v44);
      }
      else
      {
        v45 = __readcr3();
        __writecr3(v45);
      }
    }
    KiConfigureInitialNodes((__int64)Prcb);
    KiConfigureProcessorBlock(Prcb, v38);
    v10 = (unsigned int *)((char *)Prcb + 156);
    *((_DWORD *)Prcb + 8462) = -(*((_DWORD *)Prcb + 38) * *((_DWORD *)Prcb + 39)) & *((_DWORD *)Prcb + 53);
    *((_DWORD *)Prcb + 8420) = 1310721;
    *((_DWORD *)Prcb + 8421) = 0;
    memset((INT64)Prcb + 33688, 0i64);
    KeAddProcessorAffinityEx((_WORD *)Prcb + 16840, 0);
    *((_QWORD *)Prcb + 4235) = *((_QWORD *)Prcb + 25);
    v53 = Prcb;
    v24 = 65471;
    v39 = 65471;
    if( v70 )
      v39 = v70;
    KiMxCsrMask = v39;
    KeCompactServiceTable(KiServiceTable, KiArgumentTable, (unsigned int)KiServiceLimit, 0i64, 0x140000000ui64);
  }
  KiSetCacheInformation();
  PoInitializePrcb(Prcb);
  *((_QWORD *)Prcb + 4243) = 0i64;
  *((_QWORD *)Prcb + 4244) = (char *)Prcb + 33952;
  if( KUSER_SHARED_DATA.XState.EnabledFeatures )
  {
    v25 = BugCheckParameter1 | 0x800000;
    BugCheckParameter1 |= 0x800000ui64;
    XSaveFeatureFlags = KeGetXSaveFeatureFlags();
    if( (XSaveFeatureFlags & 8) != 0 )
    {
      v25 |= 0x8000ui64;
      BugCheckParameter1 = v25;
    }
    if( (XSaveFeatureFlags & 0x10) != 0 )
      BugCheckParameter1 = v25 | 0x4000000000i64;
  }
  KiSetControlEnforcement((INT64)Prcb, &BugCheckParameter1);
  v28 = BugCheckParameter1;
  if( v7 )
  {
    if( v70 )
      v24 = v70;
    v29 = KeFeatureBits & 0xFFFFFFFF37FFFFFFui64 | 0x8000000;
    if( (BugCheckParameter1 & 0x8000000) == 0 )
      v29 = KeFeatureBits & 0xFFFFFFFF37FFFFFFui64;
    if( *((_BYTE *)Prcb + 141) == 2
      && *((_BYTE *)Prcb + 64) == 6
      && *((_BYTE *)Prcb + 67) == 23
      && *((_BYTE *)Prcb + 66) == 10 )
    {
      v28 = BugCheckParameter1 & 0xFFFFFFFFFFEFFFFFui64;
      BugCheckParameter1 &= ~0x100000ui64;
      if( (*((_DWORD *)v53 + 8552) & 0x100000) != 0 )
      {
        v28 |= 0x100000ui64;
        BugCheckParameter1 = v28;
      }
    }
    if( v28 != v29
      || v24 != KiMxCsrMask
      || *((_DWORD *)KiProcessorBlock + 58) != *((_DWORD *)Prcb + 58)
      || *((_DWORD *)KiProcessorBlock + 38) != *((_DWORD *)Prcb + 38)
      || *((_DWORD *)KiProcessorBlock + 39) != *v10 )
    {
      KeBugCheckEx(0x3Eu, v28, v29, 0i64, 0i64);
    }
    __writecr8(2ui64);
    HvlEnlightenProcessor(0, v27, v29, (INT64 *)2);
    v30 = Processa;
  }
  else
  {
    KeProcessorArchitecture = 9;
    KeProcessorLevel = *((char *)Prcb + 64);
    KeProcessorRevision = *((_WORD *)Prcb + 33);
    KeFeatureBits = BugCheckParameter1;
    __writecr8(1ui64);
    KiFreezeExecutionLock = 0i64;
    KiInitSystem();
    qword_140C319F8 = (__int64)&KiProcessListHead;
    KiProcessListHead = (__int64)&KiProcessListHead;
    a16[1] = (unsigned __int16)((unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6);
    a16[0] = 1i64 << (KiProcessorIndexToNumberMappingTable[0] & 0x3F);
    LODWORD(Flags) = 1;
    v30 = Processa;
    KeInitializeProcess((_KPROCESS *)Processa, 0i64, (_GROUP_AFFINITY *)a16, 0i64, 0i64, Flags);
    *((_BYTE *)v30 + 641) = 127;
    v40 = __rdtsc();
    KiWaitNever = __ROR8__(v40 ^ __ROL8__(v40, 43), v40 & 0xF);
    v41 = __rdtsc();
    KiWaitAlways = __ROL8__(__ROR8__(v41, 47) ^ v41, v41 & 0xF);
    HviGetHypervisorFeatures((INT32 *)a24);
    if( (a24[1] & 0x100000000000i64) != 0 )
      KiNPIEPEnabled = 1;
  }
  if( KiNPIEPEnabled )
    __writemsr(0x40000040u, 0xFui64);
  KiEnableXSave();
  KUSER_SHARED_DATA.TestRetInstruction = 195i64;
  KUSER_SHARED_DATA.ProcessorFeatures[2] = 1;
  KUSER_SHARED_DATA.ProcessorFeatures[3] = 1;
  KUSER_SHARED_DATA.ProcessorFeatures[6] = 1;
  KUSER_SHARED_DATA.ProcessorFeatures[8] = 1;
  KUSER_SHARED_DATA.ProcessorFeatures[9] = 1;
  KUSER_SHARED_DATA.ProcessorFeatures[10] = 1;
  KUSER_SHARED_DATA.ProcessorFeatures[14] = 1;
  if( (v28 & 0x80000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[13] = 1;
  if( (v28 & 0x4000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[7] = 1;
  if( (v28 & 0x800000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[17] = 1;
  if( (v28 & 0x10000000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[22] = 1;
  if( (v28 & 0x4000000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[20] = 1;
  if( (v28 & 0x8000000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[21] = 1;
  if( (v28 & 0x100000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[28] = 1;
  if( (v28 & 0x400000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[32] = 1;
  if( (v28 & 0x800000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[36] = 1;
  if( (v28 & 0x1000000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[37] = 1;
  if( (v28 & 0x2000000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[38] = 1;
  if( (KUSER_SHARED_DATA.XState.EnabledFeatures & 4) != 0 && (v28 & 0x4000000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[39] = 1;
  if( (KUSER_SHARED_DATA.XState.EnabledFeatures & 4) != 0 && (v28 & 0x8000000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[40] = 1;
  if( (v28 & 0x10000000000000i64) != 0 && (KUSER_SHARED_DATA.XState.EnabledFeatures & 0xE0) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[41] = 1;
  KUSER_SHARED_DATA.VirtualizationFlags = KiVirtFlags;
  v31 = Threada;
  KiInitializeIdleThread((_KTHREAD *)Threada, KernelStack, (_KPROCESS *)v30, Prcb);
  if( v7 )
  {
    if( !HalpInitSystemPhase1(0i64) )
      KeBugCheck(0x5Cui64);
    v32 = a15;
  }
  else
  {
    v32 = a15;
    InitBootProcessor((_LOADER_PARAMETER_BLOCK *)a15);
  }
  KiCompleteKernelInit((__int64)Prcb, (__int64)v31, v7);
  *(_QWORD *)(v32 + 136) = 0i64;
}

Referenced by:

KiSystemStartup