KxInitializeProcessorState

__int64 __fastcall KxInitializeProcessorState(
        VOID *a1,
        _QWORD *a2,
        __int64 a3,
        unsigned int a4,
        size_t Size,
        int a6,
        int a7,
        int a8,
        int a9,
        int a10,
        __int64 a11,
        __int64 a12,
        __int64 a13,
        __int64 a14,
        __int64 a15,
        __int64 a16,
        __int64 a17,
        __int64 a18){
  KPCR *Pcr; 
  __int64 v22; 
  unsigned __int16 Limit; 
  const VOID *v24; 
  VOID *v25; 
  __int64 v26; 
  __int64 v27; 
  _KNODE *v28; 
  _KNODE *v29; 
  int v30; 
  int v31; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  char v34; 
  unsigned __int64 v35; 
  __int64 result; 
  __int64 v37; 
  _OWORD *v38; 
  __int128 v39; 

  Pcr = KeGetPcr();
  memset((VOID *)a3, 0i64, Size);
  memset(a1, 0i64, 0x5C0u);
  *((_WORD *)a1 + 43) = Pcr->Prcb.ProcessorState.SpecialRegisters.Gdtr.Limit;
  v22 = a3 + (unsigned int)a9;
  *((_QWORD *)a1 + 11) = v22;
  memmove(
    (VOID *)v22,
    Pcr->Prcb.ProcessorState.SpecialRegisters.Gdtr.Base,
    Pcr->Prcb.ProcessorState.SpecialRegisters.Gdtr.Limit + 1);
  Limit = Pcr->Prcb.ProcessorState.SpecialRegisters.Idtr.Limit;
  v24 = KiBootProcessorIdt;
  v25 = (VOID *)(a3 + (unsigned int)a10);
  *((_QWORD *)a1 + 13) = v25;
  *((_WORD *)a1 + 51) = Limit;
  memmove(v25, v24, ::Size);
  v26 = v22 - 8112;
  *(_BYTE *)(a3 + 82) = a7;
  v27 = a3 + (((a8 << 6) + 45183) & 0xFFFFFFC0);
  *(_DWORD *)(a3 + 420) = a7;
  *(_DWORD *)(a3 + 452) = KeGetCurrentPrcb()->MHz;
  v28 = (_KNODE *)KeNodeBlock[a6];
  *(_QWORD *)(a3 + 11904) = KeGetCurrentPrcb()->MsrIa32TsxCtrl;
  *(_QWORD *)(v22 - 8000) = a3;
  *(_BYTE *)(v22 + 68) = (unsigned int)(v22 - 8112) >> 16;
  *(_BYTE *)(v22 + 71) = (unsigned int)(v22 - 8112) >> 24;
  *(_DWORD *)(v22 + 72) = (unsigned __int64)(v22 - 8112) >> 32;
  *(_WORD *)(v22 + 66) = v22 - 8112;
  *(_QWORD *)(v26 + 36) = a16;
  *(_QWORD *)(v26 + 44) = a17;
  *(_QWORD *)(v26 + 60) = a18;
  *(_QWORD *)(v26 + 52) = a15;
  *(_QWORD *)(a14 - 80 + 40) = &KiExceptionDispatchOnExceptionStackContinue;
  *(_QWORD *)(a3 + 34648) = a13;
  *(_QWORD *)(a3 + 32936) = a14 - 80;
  *(_QWORD *)(v26 + 4) = a11;
  v29 = (_KNODE *)((char *)&KiNodeInit + 384 * (unsigned int)a6);
  if( v28 == v29 )
  {
    v37 = 3i64;
    v28 = (_KNODE *)(v27 + 2240);
    v38 = (_OWORD *)(v27 + 2240);
    do
    {
      *v38 = *(_OWORD *)&v29->IdleNonParkedCpuSet;
      v38[1] = *(_OWORD *)&v29->NonPairedSmtSet;
      v38[2] = *(_OWORD *)(&v29->IdleCpuSet + 1);
      v38[3] = *(_OWORD *)(&v29->IdleCpuSet + 3);
      v38[4] = *(_OWORD *)&v29->DeepIdleSet;
      v38[5] = *(_OWORD *)&v29->NonParkedSet;
      v38[6] = *(_OWORD *)&v29->NonIsrTargetedSet;
      v38 += 8;
      v39 = *(_OWORD *)(&v29->ProcessSeed + 1);
      v29 = (_KNODE *)((char *)v29 + 128);
      *(v38 - 1) = v39;
      --v37;
    }
    while( v37 );
    KeNodeBlock[a6] = (__int64)v28;
  }
  if( (v28->Flags._bf_0 & 4) == 0 )
    KiCommitNodeAssignment(v28);
  if( !KiEnableKvaShadowing(a3 + 384) )
    return 0i64;
  *(_QWORD *)(a3 + 576) = v28;
  KiAddProcessorToGroupDatabase((_KPRCB *)(a3 + 384), a4);
  v30 = *(unsigned __int8 *)(a3 + 592) | (*(unsigned __int8 *)(a3 + 593) << 14) | 0x3C00;
  v31 = *(_DWORD *)(v22 + 84);
  *(_WORD *)(v22 + 80) = v30;
  *(_DWORD *)(v22 + 84) ^= (v30 ^ v31) & 0xF0000;
  *(_QWORD *)(a11 - 8) = 0i64;
  *((_QWORD *)a1 + 46) = a2;
  *((_QWORD *)a1 + 61) = KiSystemStartup;
  *((_QWORD *)a1 + 49) = a11 - 8;
  *((_DWORD *)a1 + 74) = 2818064;
  *((_DWORD *)a1 + 75) = 5439531;
  *((_QWORD *)a1 + 38) = 1572907i64;
  if( KeSmapEnabled )
    *((_DWORD *)a1 + 77) = 0x40000;
  v32 = __readcr0();
  *(_QWORD *)a1 = v32;
  v33 = __readcr3();
  *((_QWORD *)a1 + 2) = v33 & 0xFFFFFFFFFFFFF000ui64;
  *((_WORD *)a1 + 56) = 64;
  *(_BYTE *)(v22 + 69) = -119;
  v34 = *(_BYTE *)(v22 + 69);
  if( VslVsmEnabled )
    v34 = -117;
  *(_BYTE *)(v22 + 69) = v34;
  v35 = __readcr4();
  *((_QWORD *)a1 + 3) = v35 & 0xFFFFFFFFFF7FFFFFui64;
  a2[18] = &KiInitialProcess;
  result = a3 + 384;
  a2[16] = a12;
  a2[19] = v27;
  a2[17] = a3 + 384;
  return result;
}

Referenced by:

KeStartAllProcessors
KiStartDynamicProcessor