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.