HvlpStartLogicalProcessor

NTSTATUS __fastcall HvlpStartLogicalProcessor(int a1, int a2, unsigned __int16 a3, __int64 a4){
  __int64 v7; 
  NTSTATUS result; 
  _QWORD *v9; 
  _OWORD *v10; 
  __int64 v11; 
  _OWORD *v12; 
  __int16 v13; 
  __int16 v14; 
  PHYSICAL_ADDRESS v15[2]; 
  __int128 v16; 
  __int128 PageInfo[2]; 

  *(_OWORD *)a4 = 0i64;
  memset(PageInfo, 0, sizeof(PageInfo));
  *(_OWORD *)(a4 + 16) = 0i64;
  *(_OWORD *)&v15[0].anonymous_0.LowPart = 0i64;
  v16 = 0i64;
  *(_OWORD *)(a4 + 32) = 0i64;
  *(_QWORD *)(a4 + 48) = 0i64;
  v7 = *(unsigned __int16 *)(KeNodeBlock[a3] + 148);
  while( 1 )
  {
    result = HvlpDepositPages(v7);
    if( result )
      break;
    v9 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)PageInfo, 1ui64, 0i64, 0x18ui64);
    v10 = HvlpAcquireHypercallPage(v15, 2ui64, 0i64, 0x38ui64);
    v11 = KeNodeBlock[v7];
    v12 = v10;
    v9[2] = 0i64;
    *(_DWORD *)v9 = a1;
    *((_DWORD *)v9 + 1) = a2;
    *((_DWORD *)v9 + 2) = *(_DWORD *)(v11 + 168);
    *((_DWORD *)v9 + 3) = -2147483647;
    HvcallInitiateHypercall();
    v14 = v13;
    if( v13 != 11 )
    {
      *(_OWORD *)a4 = *v12;
      *(_OWORD *)(a4 + 16) = v12[1];
      *(_OWORD *)(a4 + 32) = v12[2];
      *(_QWORD *)(a4 + 48) = *((_QWORD *)v12 + 6);
      *(_WORD *)a4 = v13;
    }
    HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)v15);
    HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)PageInfo);
    if( v14 != 11 )
      return v14 != 0 ? 0xC0000001 : 0;
  }
  return result;
}

Referenced by:

HvlpEnableNextLogicalProcessor