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