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