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