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