HvlMapDeviceInterrupt
__int64 __fastcall HvlMapDeviceInterrupt(__int64 a1, _OWORD *a2, __int64 *a3, _OWORD *a4){
__int64 v7;
__int64 v8;
char v9;
char *v10;
_QWORD *v11;
int v12;
__int64 v13;
UINT16 v14;
INT16 v15;
NTSTATUS v16;
INT64 v17;
UINT64 v18;
int v19;
PHYSICAL_ADDRESS v22[2];
__int128 v23;
PHYSICAL_ADDRESS PageInfo[2];
__int128 v25;
_HV_IOMMU_EXTENDED_STATUS IommuStatus;
_KAFFINITY_EX Affinity;
char StackBuffer[112];
char v29[288];
memset(&IommuStatus, 0, sizeof(IommuStatus));
*(_OWORD *)&v22[0].anonymous_0.LowPart = 0i64;
v23 = 0i64;
*(_OWORD *)&PageInfo[0].anonymous_0.LowPart = 0i64;
v25 = 0i64;
memset(&Affinity, 0i64, sizeof(Affinity));
if( a3 )
{
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
v7 = *((unsigned __int16 *)a3 + 4);
v8 = *a3;
if( (_WORD)v7 )
Affinity.Count = v7 + 1;
Affinity.Bitmap[v7] |= v8;
}
v9 = 0;
while( 1 )
{
v10 = (char *)HvlpAcquireHypercallPage(PageInfo, 2ui64, StackBuffer, 0x38ui64);
v11 = HvlpAcquireHypercallPage(v22, 1ui64, v29, 0x90ui64);
memset(v11, 0i64, 0x48u);
*(_OWORD *)(v11 + 5) = *a2;
*(_OWORD *)(v11 + 7) = a2[1];
if( a3 )
{
HvlpAffinityToHvProcessorSet(
&Affinity,
(_HV_GENERIC_SET *)v11 + 4,
(v22[0].anonymous_0.LowPart & 2) != 0 ? 64 : 4016);
if( v12 == -1 )
{
HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)v22);
v11 = HvlpAcquireHypercallPage(v22, 1ui64, 0i64, 0i64);
memset(v11, 0i64, 0x48u);
*(_OWORD *)(v11 + 5) = *a2;
*(_OWORD *)(v11 + 7) = a2[1];
HvlpAffinityToHvProcessorSet(&Affinity, (_HV_GENERIC_SET *)v11 + 4, 0xFB0ui64);
}
*((_DWORD *)v11 + 15) |= 2u;
}
else
{
*(_OWORD *)(v11 + 7) = 0i64;
}
*v11 = -1i64;
v11[1] = a1;
v11[2] = 1i64;
v13 = v11[2];
if( v9 )
v13 = 3i64;
v11[2] = v13;
HvcallInitiateHypercall();
v15 = v14;
if( v14 )
{
v16 = HvlpHvToNtStatus(v14);
}
else
{
*a4 = *(_OWORD *)v10;
IommuStatus = *(_HV_IOMMU_EXTENDED_STATUS *)(v10 + 16);
v16 = 0;
}
HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)v22);
HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)PageInfo);
if( !HvlpHvStatusIsInsufficientMemory(v15) )
break;
HvlpHandleInsufficientMemory(v18, v17);
if( v19 < 0 )
v9 = 1;
}
if( v16 >= 0 )
HvlpLogIommuEvent(&IommuStatus);
return(unsigned int)v16;
}Referenced by:
No references.