KiInitializeKernel

VOID __stdcall KiInitializeKernel(
        _EPROCESS *Process,
        _ETHREAD *Thread,
        VOID *IdleStack,
        _KPRCB *Prcb,
        INT8 Number,
        _LOADER_PARAMETER_BLOCK *LoaderBlock){
  unsigned int v7; 
  unsigned __int64 FeatureBits; 
  _KPRCB *v9; 
  unsigned int CoresPerPhysicalProcessor; 
  unsigned int *p_LogicalProcessorsPerCore; 
  unsigned int v12; 
  unsigned int v13; 
  int v14; 
  unsigned int InitialApicId; 
  int v16; 
  unsigned __int64 GroupSetMember; 
  __int64 v18; 
  int v19; 
  _KPRCB *v20; 
  char v21; 
  _KPRCB *v22; 
  unsigned int v23; 
  unsigned int v24; 
  int v25; 
  unsigned __int64 v26; 
  char XSaveFeatureFlags; 
  INT64 v28; 
  unsigned __int64 v29; 
  void *v30; 
  _EPROCESS *v31; 
  _ETHREAD *v32; 
  _LOADER_PARAMETER_BLOCK *v33; 
  unsigned __int64 v34; 
  void *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; 
  char v46; 
  char v47; 
  PVOID BugCheckParameter1; 
  int v49; 
  int v50; 
  _KPRCB *v51; 
  unsigned int v52; 
  int v53; 
  int v54; 
  unsigned int v55; 
  unsigned __int64 v56; 
  _EPROCESS *Processa; 
  _LOADER_PARAMETER_BLOCK *v58; 
  _GROUP_AFFINITY GroupAffinity; 
  _KPRCB *v60; 
  VOID *KernelStack; 
  _ETHREAD *Threada; 
  _ETHREAD *v63; 
  _KPRCB *v64; 
  _LOADER_PARAMETER_BLOCK *v65; 
  _HV_X64_HYPERVISOR_FEATURES HvFeaturesOut; 
  int v67[128]; 

  KernelStack = IdleStack;
  Threada = Thread;
  Processa = Process;
  v63 = Thread;
  v64 = Prcb;
  v58 = LoaderBlock;
  v65 = LoaderBlock;
  GroupAffinity = 0i64;
  HvFeaturesOut = 0i64;
  v7 = Number;
  if( !Number )
    HvlPhase0Initialize(LoaderBlock);
  FeatureBits = Prcb->FeatureBits;
  BugCheckParameter1 = (PVOID)FeatureBits;
  if( (unsigned __int8)(Prcb->CpuVendor - 1) <= 2u )
    KiSetHardwareSpeculationControlFeatures((__int64)Prcb, FeatureBits);
  KiCheckMicrocode((INT64)Prcb);
  memset(v67, 0i64, sizeof(v67));
  _fxsave(v67);
  if( Number )
  {
    if( KiFpuLeakage )
      BugCheckParameter1 = (PVOID)(FeatureBits | 0x20000000000i64);
    KiSetPageAttributesTable();
    *(_DWORD *)&Prcb->PackageProcessorSet.Count = 1310721;
    Prcb->PackageProcessorSet.Reserved = 0;
    memset(Prcb->PackageProcessorSet.Bitmap, 0i64, sizeof(Prcb->PackageProcessorSet.Bitmap));
    KeAddProcessorAffinityEx(&Prcb->PackageProcessorSet.Count, (unsigned int)Number);
    v9 = Prcb;
    v51 = Prcb;
    CoresPerPhysicalProcessor = Prcb->CoresPerPhysicalProcessor;
    p_LogicalProcessorsPerCore = &Prcb->LogicalProcessorsPerCore;
    if( CoresPerPhysicalProcessor == 1 && *p_LogicalProcessorsPerCore == 1 )
    {
      Prcb->CoreProcessorSet = Prcb->GroupSetMember;
      Prcb->PackageId = Prcb->InitialApicId;
    }
    else
    {
      v12 = *p_LogicalProcessorsPerCore;
      v13 = *p_LogicalProcessorsPerCore * CoresPerPhysicalProcessor;
      v52 = v13;
      v14 = ~(v13 - 1);
      v53 = v14;
      InitialApicId = Prcb->InitialApicId;
      v16 = v14 & InitialApicId;
      v54 = v14 & InitialApicId;
      Prcb->PackageId = v14 & InitialApicId;
      v55 = ~(v12 - 1);
      v49 = v55 & InitialApicId;
      GroupSetMember = Prcb->GroupSetMember;
      v56 = GroupSetMember;
      v46 = 0;
      v18 = 0i64;
      v50 = 0;
      if( (_DWORD)KeNumberProcessors_0 )
      {
        v19 = v49;
        do
        {
          v60 = v9;
          v47 = v46;
          v20 = *(&KiProcessorBlock + v18);
          if( (v20->InitialApicId & v14) == v16 )
          {
            KeAddProcessorAffinityEx(&Prcb->PackageProcessorSet.Count, (unsigned int)v18);
            KeAddProcessorAffinityEx(&v20->PackageProcessorSet.Count, (unsigned int)Number);
            v21 = v46;
            if( !v46 )
              v21 = 1;
            v46 = v21;
            v22 = v20;
            if( v47 )
              v22 = v60;
            v51 = v22;
            v23 = KeCountSetBitsAffinityEx(&v20->PackageProcessorSet.Count);
            v13 = v52;
            if( v23 > v52 )
              KeBugCheckEx(
                0x3Eu,
                v20,
                (PVOID)v23,
                (PVOID)v20->CoresPerPhysicalProcessor,
                (PVOID)v20->LogicalProcessorsPerCore);
            LODWORD(v18) = v50;
            GroupSetMember = v56;
            v19 = v49;
            v14 = v53;
            v16 = v54;
            v9 = v51;
          }
          if( (v20->InitialApicId & v55) == v19 && v20->ParentNode == Prcb->ParentNode )
          {
            GroupSetMember |= v20->GroupSetMember;
            v56 = GroupSetMember;
            v20->CoreProcessorSet |= GroupSetMember;
          }
          v18 = (unsigned int)(v18 + 1);
          v50 = v18;
        }
        while( (unsigned int)v18 < (unsigned int)KeNumberProcessors_0 );
      }
      v24 = KeCountSetBitsAffinityEx(&Prcb->PackageProcessorSet.Count);
      if( v24 > v13 )
        KeBugCheckEx(
          0x3Eu,
          Prcb,
          (PVOID)v24,
          (PVOID)Prcb->CoresPerPhysicalProcessor,
          (PVOID)*p_LogicalProcessorsPerCore);
      Prcb->CoreProcessorSet = v56;
    }
    v7 = Number;
    v25 = 65471;
  }
  else
  {
    KiFpuLeakage = KiDetectFpuLeakage();
    if( KiFpuLeakage )
      FeatureBits |= 0x20000000000ui64;
    if( KiFlushPcid )
    {
      v34 = __readcr3();
      __writecr3(v34);
      if( !KeGetCurrentThread()->ApcState.Process->Pcb.AddressPolicy )
        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 = (void *)(FeatureBits | 0x80000000);
    else
      v35 = (void *)(FeatureBits & 0xFFFFFFFF3FFFFFFFui64 | 0x40000000);
    BugCheckParameter1 = v35;
    v36 = __readcr4();
    __writecr4(v36 | 0x18);
    if( KiFlushPcid )
    {
      v37 = __readcr3();
      __writecr3(v37);
      if( !KeGetCurrentThread()->ApcState.Process->Pcb.AddressPolicy )
        KiSetUserTbFlushPending();
    }
    else
    {
      v44 = __readcr4();
      if( (v44 & 0x20080) != 0 )
      {
        __writecr4(v44 ^ 0x80);
        __writecr4(v44);
      }
      else
      {
        v45 = __readcr3();
        __writecr3(v45);
      }
    }
    KiConfigureInitialNodes(Prcb);
    KiConfigureProcessorBlock(Prcb, v38);
    p_LogicalProcessorsPerCore = &Prcb->LogicalProcessorsPerCore;
    Prcb->PackageId = -(Prcb->CoresPerPhysicalProcessor * Prcb->LogicalProcessorsPerCore) & Prcb->InitialApicId;
    *(_DWORD *)&Prcb->PackageProcessorSet.Count = 1310721;
    Prcb->PackageProcessorSet.Reserved = 0;
    memset(Prcb->PackageProcessorSet.Bitmap, 0i64, sizeof(Prcb->PackageProcessorSet.Bitmap));
    KeAddProcessorAffinityEx(&Prcb->PackageProcessorSet.Count, 0i64);
    Prcb->CoreProcessorSet = Prcb->GroupSetMember;
    v51 = Prcb;
    v25 = 65471;
    v39 = 65471;
    if( v67[7] )
      v39 = v67[7];
    KiMxCsrMask = v39;
    KeCompactServiceTable(KiServiceTable, KiArgumentTable, (unsigned int)KiServiceLimit, 0i64, 0x140000000ui64);
  }
  KiSetCacheInformation();
  PoInitializePrcb(Prcb);
  Prcb->ProcessorProfileControlArea = 0i64;
  Prcb->ProfileEventIndexAddress = &Prcb->ProfileEventIndexAddress;
  if( KUSER_SHARED_DATA.XState.EnabledFeatures )
  {
    v26 = (unsigned __int64)BugCheckParameter1 | 0x800000;
    BugCheckParameter1 = (PVOID)((unsigned __int64)BugCheckParameter1 | 0x800000);
    XSaveFeatureFlags = KeGetXSaveFeatureFlags();
    if( (XSaveFeatureFlags & 8) != 0 )
    {
      v26 |= 0x8000ui64;
      BugCheckParameter1 = (PVOID)v26;
    }
    if( (XSaveFeatureFlags & 0x10) != 0 )
      BugCheckParameter1 = (PVOID)(v26 | 0x4000000000i64);
  }
  KiSetControlEnforcement((__int64)Prcb, &BugCheckParameter1);
  v29 = (unsigned __int64)BugCheckParameter1;
  if( v7 )
  {
    if( v67[7] )
      v25 = v67[7];
    v30 = (void *)((unsigned __int64)KeFeatureBits & 0xFFFFFFFF37FFFFFFui64 | 0x8000000);
    if( ((unsigned int)BugCheckParameter1 & 0x8000000) == 0 )
      v30 = (void *)((unsigned __int64)KeFeatureBits & 0xFFFFFFFF37FFFFFFui64);
    if( Prcb->CpuVendor == 2 && Prcb->CpuType == 6 && Prcb->CpuModel == 23 && Prcb->CpuStepping == 10 )
    {
      v29 = (unsigned __int64)BugCheckParameter1 & 0xFFFFFFFFFFEFFFFFui64;
      BugCheckParameter1 = (PVOID)((unsigned __int64)BugCheckParameter1 & 0xFFFFFFFFFFEFFFFFui64);
      if( (v51->FeatureBits & 0x100000) != 0 )
      {
        v29 |= 0x100000ui64;
        BugCheckParameter1 = (PVOID)v29;
      }
    }
    if( (void *)v29 != v30
      || v25 != KiMxCsrMask
      || KiProcessorBlock->CFlushSize != Prcb->CFlushSize
      || KiProcessorBlock->CoresPerPhysicalProcessor != Prcb->CoresPerPhysicalProcessor
      || KiProcessorBlock->LogicalProcessorsPerCore != *p_LogicalProcessorsPerCore )
    {
      KeBugCheckEx(0x3Eu, (PVOID)v29, v30, 0i64, 0i64);
    }
    __writecr8(2ui64);
    HvlEnlightenProcessor(0, v28, (INT64)v30, (INT64 *)2);
    v31 = Processa;
  }
  else
  {
    KeProcessorArchitecture = 9;
    KeProcessorLevel = Prcb->CpuType;
    KeProcessorRevision = Prcb->CpuStep;
    KeFeatureBits = BugCheckParameter1;
    __writecr8(1ui64);
    KiFreezeExecutionLock = 0i64;
    KiInitSystem();
    qword_140C319F8 = (__int64)&KiProcessListHead;
    KiProcessListHead = (__int64)&KiProcessListHead;
    GroupAffinity.Reserved[1] = 0;
    GroupAffinity.Reserved[2] = 0;
    *(_DWORD *)&GroupAffinity.Group = (unsigned __int16)((unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6);
    GroupAffinity.Mask = 1i64 << (KiProcessorIndexToNumberMappingTable[0] & 0x3F);
    v31 = Processa;
    KeInitializeProcess(Processa, 0i64, &GroupAffinity, 0i64);
    v31->Pcb.QuantumReset = 127;
    v40 = __rdtsc();
    KiWaitNever = __ROR8__(v40 ^ __ROL8__(v40, 43), v40 & 0xF);
    v41 = __rdtsc();
    KiWaitAlways = __ROL8__(__ROR8__(v41, 47) ^ v41, v41 & 0xF);
    HviGetHypervisorFeatures(&HvFeaturesOut);
    if( (HvFeaturesOut._bf_8 & 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( (v29 & 0x80000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[13] = 1;
  if( (v29 & 0x4000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[7] = 1;
  if( (v29 & 0x800000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[17] = 1;
  if( (v29 & 0x10000000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[22] = 1;
  if( (v29 & 0x4000000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[20] = 1;
  if( (v29 & 0x8000000) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[21] = 1;
  if( (v29 & 0x100000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[28] = 1;
  if( (v29 & 0x400000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[32] = 1;
  if( (v29 & 0x800000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[36] = 1;
  if( (v29 & 0x1000000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[37] = 1;
  if( (v29 & 0x2000000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[38] = 1;
  if( (KUSER_SHARED_DATA.XState.EnabledFeatures & 4) != 0 && (v29 & 0x4000000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[39] = 1;
  if( (KUSER_SHARED_DATA.XState.EnabledFeatures & 4) != 0 && (v29 & 0x8000000000000i64) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[40] = 1;
  if( (v29 & 0x10000000000000i64) != 0 && (KUSER_SHARED_DATA.XState.EnabledFeatures & 0xE0) != 0 )
    KUSER_SHARED_DATA.ProcessorFeatures[41] = 1;
  KUSER_SHARED_DATA.VirtualizationFlags = byte_140C50A87;
  v32 = Threada;
  KiInitializeIdleThread(&Threada->Tcb, KernelStack, &v31->Pcb, Prcb);
  if( v7 )
  {
    if( !HalpInitSystemPhase1(0i64) )
      KeBugCheck(0x5Cu);
    v33 = v58;
  }
  else
  {
    v33 = v58;
    InitBootProcessor(v58);
  }
  KiCompleteKernelInit(Prcb, &v32->Tcb, v7);
  v33->Prcb = 0i64;
}

Referenced by:

KiSystemStartup