HvlEnlightenProcessor

VOID __fastcall HvlEnlightenProcessor(CHAR a1, INT64 a2, INT64 a3, INT64 *a4){
  struct _KPRCB *CurrentPrcb; 
  int v5; 
  unsigned int v6; 
  char v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  UINT64 v11; 
  char v12; 
  WCHAR *LpcbByLpIndex; 
  unsigned int v14; 
  unsigned int LpIndexFromProcessorIndex; 
  __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  v20 = 0i64;
  v22 = 0i64;
  if( (_BYTE)HvlHypervisorConnected && (!a1 || (HvlpFlags & 2) == 0) )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    if( !a1 )
    {
      HvlpGetRegister64(589827, &v20);
      v5 = v20;
      v6 = (unsigned int)v20 >> 6;
      v7 = v20 & 0x3F;
      HvlpVirtualProcessorMapping[2 * *((unsigned int *)CurrentPrcb + 9)] = (unsigned int)v20 >> 6;
      HvlpVirtualProcessorMapping[2 * *((unsigned int *)CurrentPrcb + 9) + 1] = v7;
      if( v5 != *((_DWORD *)CurrentPrcb + 9) )
        HvlpVirtualProcessorsIdentityMapped = 0;
      if( v6 < 0x10 )
      {
        if( v6 > (((unsigned int)HvlpFlags >> 8) & 0xF) )
          LODWORD(HvlpFlags) = ((unsigned __int16)HvlpFlags ^ (unsigned __int16)((_WORD)v6 << 8)) & 0xF00 ^ HvlpFlags;
      }
      else
      {
        HvlEnlightenments &= ~0x80u;
        HvlpEnlightenments &= ~0x80u;
      }
    }
    if( (HvlpFlags & 0x80000) != 0 )
    {
      v21 = 0i64;
      if( (HvlpFlags & 2) != 0 )
      {
        HvlpGetRegister64(589843, &v21);
        v8 = v21;
        v9 = v21 & 0xFFFFFFFFFFFFF000ui64;
        if( *((_DWORD *)CurrentPrcb + 9) )
          MmMapIoSpaceEx((_LARGE_INTEGER)v9, 0x1000ui64, 4ui64);
        else
          v10 = ((__int64(__fastcall *)(unsigned __int64, __int64, __int64))qword_140C00720)(v9, 1i64, 4i64);
        *((_QWORD *)CurrentPrcb + 4209) = v10;
      }
      else
      {
        v8 = MmGetPhysicalAddress(*((PVOID *)CurrentPrcb + 4209)).QuadPart & 0xFFFFFFFFFFFFF000ui64;
      }
      HvlpSetRegister64(589843, v8 | 1);
    }
    HvlpSetupSchedulerAssist((INT64)CurrentPrcb);
    v12 = HvlpFlags;
    LpcbByLpIndex = 0i64;
    v14 = ((unsigned int)HvlpFlags >> 1) & 1;
    if( v14 )
    {
      LpIndexFromProcessorIndex = HvlGetLpIndexFromProcessorIndex(*((unsigned int *)CurrentPrcb + 9));
      LpcbByLpIndex = HvlpGetLpcbByLpIndex(LpIndexFromProcessorIndex);
    }
    if( v14 && (v12 & 0x20) != 0 )
    {
      HvlpGetRegister64(655379, &v22);
      v16 = v22;
      if( (v22 & 1) == 0 )
      {
        v16 = v22 | 1;
        HvlpSetRegister64(655379, v22 | 1);
      }
      v17 = v16 & 0xFFFFFFFFFFFFF000ui64;
      if( *((_DWORD *)CurrentPrcb + 9) )
        MmMapIoSpaceEx((_LARGE_INTEGER)v17, 0x1000ui64, 4ui64);
      else
        v18 = ((__int64(__fastcall *)(unsigned __int64, __int64))qword_140C00720)(v17, 1i64);
      *((_QWORD *)LpcbByLpIndex + 5) = v18;
    }
    if( (HvlpFlags & 2) != 0 && (HvlpFlags & 0x20) != 0 )
    {
      v19 = ((unsigned __int64)((HvlpFlags & 0x10) == 0) << 17) | 0x30;
      HvlpSetRegister64(655360, v19);
      HvlpSetRegister64(655364, v19);
      HvlSharedIsr();
    }
    if( (HvlpFlags & 2) != 0 )
    {
      if( *((_DWORD *)CurrentPrcb + 9) )
        HvlpDiscoverTopologyLocal(
          v11,
          *((unsigned int *)LpcbByLpIndex + 2),
          (UINT64 *)LpcbByLpIndex + 2,
          (UINT64 *)(LpcbByLpIndex + 10));
    }
  }
}

Referenced by:

HvlpInitializeBootProcessor
KiInitializeKernel
PopHandleNextState