HvlMapDeviceInterrupt

__int64 __fastcall HvlMapDeviceInterrupt(__int64 a1, _OWORD *a2, __int64 *a3, _OWORD *a4){
  __int64 v7; 
  __int64 v8; 
  char v9; 
  LONGLONG *v10; 
  LONGLONG *v11; 
  __int64 v12; 
  UINT16 v13; 
  INT16 v14; 
  NTSTATUS v15; 
  __int128 v18[2]; 
  __int128 v19[2]; 
  INT64 v20[2]; 
  __int128 v21; 
  LONGLONG v22; 
  int result; 
  _BYTE result_4[172]; 
  char v25[112]; 
  char v26[288]; 
  v22 = 0i64;
  *(_OWORD *)v20 = 0i64;
  v21 = 0i64;
  memset(v18, 0, sizeof(v18));
  memset(v19, 0, sizeof(v19));
  memset((INT64)&result, 0i64);
  if( a3 )
  {
    result = 1310721;
    memset((INT64)result_4, 0i64);
    v7 = *((unsigned __int16 *)a3 + 4);
    v8 = *a3;
    if( (unsigned __int16)result <= (unsigned __int16)v7 )
      LOWORD(result) = v7 + 1;
    *(_QWORD *)&result_4[8 * v7 + 4] |= v8;
  }
  v9 = 0;
  while( 1 )
  {
    v10 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v19, 2, (__int64)v25, 56i64);
    v11 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v18, 1, (__int64)v26, 144i64);
    memset((INT64)v11, 0i64);
    *(_OWORD *)(v11 + 5) = *a2;
    *(_OWORD *)(v11 + 7) = a2[1];
    if( a3 )
    {
      if( (unsigned int)HvlpAffinityToHvProcessorSet((__int64)&result, v11 + 8, (v18[0] & 2) != 0 ? 64 : 4016) == -1 )
      {
        HvlpReleaseHypercallPage((unsigned int *)v18);
        v11 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v18, 1, 0i64, 0i64);
        memset((INT64)v11, 0i64);
        *(_OWORD *)(v11 + 5) = *a2;
        *(_OWORD *)(v11 + 7) = a2[1];
        HvlpAffinityToHvProcessorSet((__int64)&result, v11 + 8, 0xFB0u);
      }
      *((_DWORD *)v11 + 15) |= 2u;
    }
    else
    {
      *(_OWORD *)(v11 + 7) = 0i64;
    }
    *v11 = -1i64;
    v11[1] = a1;
    v11[2] = 1i64;
    v12 = v11[2];
    if( v9 )
      v12 = 3i64;
    v11[2] = v12;
    HvcallInitiateHypercall();
    v14 = v13;
    if( v13 )
    {
      v15 = HvlpHvToNtStatus(v13);
    }
    else
    {
      *a4 = *(_OWORD *)v10;
      *(_OWORD *)v20 = *((_OWORD *)v10 + 1);
      v21 = *((_OWORD *)v10 + 2);
      v15 = 0;
      v22 = v10[6];
    }
    HvlpReleaseHypercallPage((unsigned int *)v18);
    HvlpReleaseHypercallPage((unsigned int *)v19);
    if( !HvlpHvStatusIsInsufficientMemory(v14) )
      break;
    if( HvlpHandleInsufficientMemory() < 0 )
      v9 = 1;
  }
  if( v15 >= 0 )
    HvlpLogIommuEvent((INT64)v20);
  return(unsigned int)v15;
}

Referenced by:

No references.