HalpInterruptBuildStartupStub
_LIST_ENTRY *__fastcall HalpInterruptBuildStartupStub(PVOID *a1, PHYSICAL_ADDRESS **a2, const VOID *a3, __int64 a4){
PHYSICAL_ADDRESS *v8;
char *v9;
PHYSICAL_ADDRESS *v10;
char *v11;
UINT8 v12;
char v13;
int v14;
int v15;
VOID *v16;
INT64 v17;
unsigned int v18;
INT64 v19;
INT64 v20;
_LIST_ENTRY *result;
unsigned __int64 v22;
LODWORD(v8) = MmGetPhysicalAddress((UINT64)*a1);
v9 = (char *)*a1;
v10 = v8;
memmove(*a1, HalpRMStub, 0x67Cu);
v11 = v9 + 1660;
*(_OWORD *)v11 = HalpPMStub;
*((_OWORD *)v11 + 1) = xmmword_14001E920;
*((_OWORD *)v11 + 2) = xmmword_14001E930;
*((_OWORD *)v11 + 3) = xmmword_14001E940;
*((_OWORD *)v11 + 4) = xmmword_14001E950;
*((_QWORD *)v11 + 10) = 0x90878B300Fi64;
*((_DWORD *)v11 + 22) = -4185585;
*((_WORD *)v11 + 46) = 26223;
v12 = KeForceEnableNx();
v13 = HalpInterruptProcessorHidden;
v14 = v12 != 0;
if( HalpInterruptProcessorHidden )
v14 |= 4u;
*((_DWORD *)*a1 + 2) = v14;
*((_WORD *)*a1 + 50) = 48;
v15 = (_DWORD)v11 - *(_DWORD *)a1;
v16 = v11 + 94;
*((_DWORD *)*a1 + 24) = (_DWORD)v10 + v15;
memmove(v16, HalpLMIdentityStub, HalpLMIdentityStubEnd - (char *)HalpLMIdentityStub);
*((_WORD *)*a1 + 53) = 16;
*(_DWORD *)((char *)*a1 + 102) = (_DWORD)v10 + (_DWORD)v16 - *(_DWORD *)a1;
*((_QWORD *)*a1 + 15) = *a1;
*((_QWORD *)*a1 + 14) = HalpLMStub;
HalpInterruptCreateGdtEntry32((INT64)*a1 + 24, 48i64, v17, 0xFFFFFFFFui64, 27, 0);
HalpInterruptCreateGdtEntry32((INT64)*a1 + 24, 32i64, v19, v18, 19, 0);
HalpInterruptCreateGdtEntry32((INT64)*a1 + 24, 16i64, v20, 0i64, 27, 1);
*((_WORD *)*a1 + 6) = 63;
*(_DWORD *)((char *)*a1 + 14) = (_DWORD)v10 + 24;
*((_QWORD *)*a1 + 16) = __readmsr(0x277u);
*((_QWORD *)*a1 + 17) = __readmsr(0xC0000080);
*((_QWORD *)*a1 + 17) &= ~0x400ui64;
memmove((char *)*a1 + 144, a3, 0x5C0u);
*((_DWORD *)*a1 + 1) = 0;
if( v13 )
{
result = (_LIST_ENTRY *)*(&CmpDummyThreadEvent + 489);
*((_QWORD *)*a1 + 11) = *(&CmpDummyThreadEvent + 489);
}
else
{
result = (_LIST_ENTRY *)*a1;
v22 = (unsigned int)dword_140C49D18;
if( !HalpInterruptProcessorRestarting )
v22 = *(unsigned int *)(a4 + 4);
result[5].Blink = (_LIST_ENTRY *)v22;
}
if( a2 )
*a2 = v10;
return result;
}Referenced by:
HalpInterruptStartProcessor
HalpSetupRealModeResume