HvlpLpCpuid

UINT64 __fastcall HvlpLpCpuid(INT64 a1, INT64 a2, INT64 a3, UINT64 *a4){
  int v5; 
  int v6; 
  int v7; 
  UINT64 result; 
  __int64 v9; 
  LONGLONG *v10; 
  LONGLONG *v11; 
  __int128 v12[2]; 
  __int128 v13[2]; 
  v5 = a3;
  v6 = a2;
  v7 = a1;
  memset(v13, 0, sizeof(v13));
  memset(v12, 0, sizeof(v12));
  if( (_DWORD)a1 == -1 )
  {
    result = (unsigned int)a2;
    v9 = __cpuid(a2, a3);
    LODWORD(result) = EAX(v9);
    *(_DWORD *)a4 = result;
    *((_DWORD *)a4 + 1) = EBX(v9);
    *((_DWORD *)a4 + 2) = ECX(v9);
    *((_DWORD *)a4 + 3) = EDX(v9);
  }
  else
  {
    v10 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v13, 1, 0i64, 16i64);
    v11 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v12, 2, 0i64, 16i64);
    *(_DWORD *)v10 = v7;
    *((_DWORD *)v10 + 1) = 0x10000;
    *((_DWORD *)v10 + 2) = v6;
    *((_DWORD *)v10 + 3) = v5;
    HvcallInitiateHypercall();
    *(_DWORD *)a4 = *(_DWORD *)v11;
    *((_DWORD *)a4 + 1) = *((_DWORD *)v11 + 1);
    *((_DWORD *)a4 + 2) = *((_DWORD *)v11 + 2);
    *((_DWORD *)a4 + 3) = *((_DWORD *)v11 + 3);
    HvlpReleaseHypercallPage((unsigned int *)v12);
    return(UINT64)HvlpReleaseHypercallPage((unsigned int *)v13);
  }
  return result;
}

Referenced by:

HvlpDiscoverTopologyAmd
HvlpDiscoverTopologyIntel