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