HvlpStartLogicalProcessor

NTSTATUS __fastcall HvlpStartLogicalProcessor(INT64 a1, INT64 a2, UINT16 a3, INT64 a4){
  int v5; 
  int v6; 
  __int64 v7; 
  NTSTATUS result; 
  LONGLONG *v9; 
  LONGLONG *v10; 
  __int64 v11; 
  LONGLONG *v12; 
  __int16 v13; 
  __int16 v14; 
  __int128 v15[2]; 
  __int128 v16[2]; 
  *(_OWORD *)a4 = 0i64;
  v5 = a2;
  memset(v16, 0, sizeof(v16));
  v6 = a1;
  *(_OWORD *)(a4 + 16) = 0i64;
  memset(v15, 0, sizeof(v15));
  *(_OWORD *)(a4 + 32) = 0i64;
  *(_QWORD *)(a4 + 48) = 0i64;
  v7 = *(unsigned __int16 *)(*((_QWORD *)&KeNodeBlock + a3) + 148i64);
  while( 1 )
  {
    result = HvlpDepositPages(v7);
    if( result )
      break;
    v9 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v16, 1, 0i64, 24i64);
    v10 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v15, 2, 0i64, 56i64);
    v11 = *((_QWORD *)&KeNodeBlock + v7);
    v12 = v10;
    v9[2] = 0i64;
    *(_DWORD *)v9 = v6;
    *((_DWORD *)v9 + 1) = v5;
    *((_DWORD *)v9 + 2) = *(_DWORD *)(v11 + 168);
    *((_DWORD *)v9 + 3) = -2147483647;
    HvcallInitiateHypercall();
    v14 = v13;
    if( v13 != 11 )
    {
      *(_OWORD *)a4 = *(_OWORD *)v12;
      *(_OWORD *)(a4 + 16) = *((_OWORD *)v12 + 1);
      *(_OWORD *)(a4 + 32) = *((_OWORD *)v12 + 2);
      *(_QWORD *)(a4 + 48) = v12[6];
      *(_WORD *)a4 = v13;
    }
    HvlpReleaseHypercallPage((unsigned int *)v15);
    HvlpReleaseHypercallPage((unsigned int *)v16);
    if( v14 != 11 )
      return v14 != 0 ? 0xC0000001 : 0;
  }
  return result;
}

Referenced by:

HvlpEnableNextLogicalProcessor