HalpInterruptBuildStartupStub
_QWORD *__fastcall HalpInterruptBuildStartupStub(PVOID *a1, PHYSICAL_ADDRESS *a2, const void *a3, __int64 a4){
PHYSICAL_ADDRESS PhysicalAddress;
char *v9;
LONGLONG QuadPart;
char *v11;
CHAR v12;
char v13;
int v14;
int v15;
UINT8 *v16;
__int64 v17;
__int64 v18;
unsigned int v19;
__int64 v20;
_QWORD *result;
__int64 v22;
PhysicalAddress = MmGetPhysicalAddress(*a1);
v9 = (char *)*a1;
QuadPart = PhysicalAddress.QuadPart;
memmove((UINT8 *)*a1, (UINT8 *)&HalpRMStub, 0x67Cui64);
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 = (UINT8 *)(v11 + 94);
*((_DWORD *)*a1 + 24) = QuadPart + v15;
memmove(v16, (UINT8 *)HalpLMIdentityStub, HalpLMIdentityStubEnd - (char *)HalpLMIdentityStub);
*((_WORD *)*a1 + 53) = 16;
*(_DWORD *)((char *)*a1 + 102) = QuadPart + (_DWORD)v16 - *(_DWORD *)a1;
*((_QWORD *)*a1 + 15) = *a1;
*((_QWORD *)*a1 + 14) = HalpLMStub;
HalpInterruptCreateGdtEntry32((__int64)*a1 + 24, 48, v17, 0xFFFFFFFF, 27, 0);
HalpInterruptCreateGdtEntry32((__int64)*a1 + 24, 32, v18, v19, 19, 0);
HalpInterruptCreateGdtEntry32((__int64)*a1 + 24, 16, v20, 0, 27, 1);
*((_WORD *)*a1 + 6) = 63;
*(_DWORD *)((char *)*a1 + 14) = QuadPart + 24;
*((_QWORD *)*a1 + 16) = __readmsr(0x277u);
*((_QWORD *)*a1 + 17) = __readmsr(0xC0000080);
*((_QWORD *)*a1 + 17) &= ~0x400ui64;
memmove((UINT8 *)*a1 + 144, (UINT8 *)a3, 0x5C0ui64);
*((_DWORD *)*a1 + 1) = 0;
if( v13 )
{
result = (_QWORD *)HalpBlkTiledMemoryMapPa;
*((_QWORD *)*a1 + 11) = HalpBlkTiledMemoryMapPa;
}
else
{
result = *a1;
v22 = (unsigned int)CurTiledCr3LowPart;
if( !HalpInterruptProcessorRestarting )
v22 = *(unsigned int *)(a4 + 4);
result[11] = v22;
}
if( a2 )
a2->QuadPart = QuadPart;
return result;
}Referenced by:
HalpInterruptStartProcessor
HalpSetupRealModeResume