HvlInitializeProcessor

NTSTATUS __stdcall HvlInitializeProcessor(_SLIST_HEADER *Prcb, UINT64 ApicId){
  NTSTATUS result; 
  __int64 v4; 
  VOID *v5; 
  VOID *v6; 
  VOID *OverlayPages; 
  VOID *v8; 
  UINT64 v9; 
  _MEMORY_CACHING_TYPE v10; 
  __int64 IndependentPages; 
  UINT64 v12; 
  __int64 v13; 

  if( !(_BYTE)HvlHypervisorConnected )
    return 0;
  v4 = 2i64;
  if( (HvlpFlags & 2) == 0 || (result = HvlpEnableRootVirtualProcessor((_KPRCB *)Prcb, ApicId), result >= 0) )
  {
    v5 = 0i64;
    v6 = 0i64;
    if( (HvlpFlags & 0x80000) != 0 && (HvlpFlags & 2) == 0 )
    {
      OverlayPages = HvlpAllocateOverlayPages((UINT64)Prcb);
      v6 = OverlayPages;
      if( !OverlayPages )
        return -1073741670;
      Prcb[2104].Region = (unsigned __int64)OverlayPages;
    }
    if( (HvlpFlags & 2) == 0 && (HvlpFlags & 0x8000) != 0 )
    {
      v8 = HvlpAllocateOverlayPages((unsigned int)HvlpFlags);
      v5 = v8;
      if( !v8 )
      {
LABEL_18:
        if( v6 )
        {
          HvlpFreeOverlayPages(v6, v9, v10);
          Prcb[2104].Region = 0i64;
        }
        if( v5 )
        {
          HvlpFreeOverlayPages(v5, v9, v10);
          Prcb[2123].Region = 0i64;
        }
        return -1073741670;
      }
      Prcb[2123].Region = (unsigned __int64)v8;
    }
    IndependentPages = MmAllocateIndependentPagesEx(
                         0x6000ui64,
                         *(unsigned __int16 *)(Prcb[12].Alignment + 146),
                         0i64,
                         0);
    v12 = IndependentPages;
    if( IndependentPages )
    {
      Prcb[2104].Alignment = IndependentPages;
      do
      {
        LODWORD(v13) = MmGetPhysicalAddress(v12);
        *(_QWORD *)(v12 + 16) = v13;
        v12 += 4096i64;
        --v4;
      }
      while( v4 );
      HvlpSetupCachedHypercallPages((_KPRCB *)Prcb);
      return 0;
    }
    goto LABEL_18;
  }
  return result;
}

Referenced by:

KeStartAllProcessors
KiStartDynamicProcessor