KxInitializeProcessorState

INT64 __fastcall KxInitializeProcessorState(
        VOID *a1,
        _QWORD *a2,
        INT64 a3,
        UINT64 a4,
        size_t Size,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        INT64 a9,
        INT64 a10,
        INT64 a11,
        INT64 a12,
        INT64 a13,
        INT64 a14,
        INT64 a15,
        INT64 a16,
        INT64 a17,
        INT64 a18){
  KPCR *Pcr; 
  INT64 v22; 
  __int16 v23; 
  UINT8 *v24; 
  UINT8 *v25; 
  INT64 v26; 
  INT64 v27; 
  INT64 v28; 
  __int64 *v29; 
  int v30; 
  int v31; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  char v34; 
  unsigned __int64 v35; 
  INT64 result; 
  __int64 v37; 
  _OWORD *v38; 
  __int128 v39; 
  int v40; 
  v40 = a4;
  Pcr = KeGetPcr();
  memset(a3, 0i64);
  memset((INT64)a1, 0i64);
  *((_WORD *)a1 + 43) = *((_WORD *)Pcr + 363);
  v22 = a3 + (unsigned int)a9;
  *((_QWORD *)a1 + 11) = v22;
  memmove((UINT8 *)v22, *((UINT8 **)Pcr + 91), *((unsigned __int16 *)Pcr + 363) + 1i64);
  v23 = *((_WORD *)Pcr + 371);
  v24 = KiBootProcessorIdt;
  v25 = (UINT8 *)(a3 + (unsigned int)a10);
  *((_QWORD *)a1 + 13) = v25;
  *((_WORD *)a1 + 51) = v23;
  memmove(v25, v24, (unsigned int)KiBootProcessorIdtSize);
  v26 = v22 - 8112;
  *(_BYTE *)(a3 + 82) = a7;
  v27 = a3 + ((((_DWORD)a8 << 6) + 45183) & 0xFFFFFFC0);
  *(_DWORD *)(a3 + 420) = a7;
  *(_DWORD *)(a3 + 452) = *((_DWORD *)KeGetCurrentPrcb() + 17);
  v28 = *((_QWORD *)&KeNodeBlock + (unsigned int)a6);
  *(_QWORD *)(a3 + 11904) = *((_QWORD *)KeGetCurrentPrcb() + 1440);
  *(_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 = &KiNodeInit[48 * (unsigned int)a6];
  if( (__int64 *)v28 == v29 )
  {
    v37 = 3i64;
    v28 = v27 + 2240;
    v38 = (_OWORD *)(v27 + 2240);
    do
    {
      *v38 = *(_OWORD *)v29;
      v38[1] = *((_OWORD *)v29 + 1);
      v38[2] = *((_OWORD *)v29 + 2);
      v38[3] = *((_OWORD *)v29 + 3);
      v38[4] = *((_OWORD *)v29 + 4);
      v38[5] = *((_OWORD *)v29 + 5);
      v38[6] = *((_OWORD *)v29 + 6);
      v38 += 8;
      v39 = *((_OWORD *)v29 + 7);
      v29 += 16;
      *(v38 - 1) = v39;
      --v37;
    }
    while( v37 );
    *((_QWORD *)&KeNodeBlock + (unsigned int)a6) = v28;
  }
  if( (*(_BYTE *)(v28 + 181) & 4) == 0 )
    KiCommitNodeAssignment((_KNODE *)v28);
  if( !(unsigned int)KiEnableKvaShadowing(a3 + 384) )
    return 0i64;
  *(_QWORD *)(a3 + 576) = v28;
  KiAddProcessorToGroupDatabase(a3 + 384, v40);
  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