IommuUnmapDevice

__int64 __fastcall IommuUnmapDevice(__int64 a1, PVOID *a2, __int64 a3){
  unsigned __int8 CurrentIrql; 
  UINT64 *v6; 
  __int64 *v7; 
  __int64 *i; 
  __int64 *v9; 
  __int64 *j; 
  __int64 *v11; 
  __int64 **v12; 
  PVOID *v13; 
  PVOID **v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  if( HalpHvIommu )
  {
    IommupHvUnmapDevice(a2[5]);
  }
  else
  {
    LOBYTE(a3) = 1;
    (*((void(__fastcall **)(_QWORD, PVOID, __int64))a2[3] + 25))(*((_QWORD *)a2[3] + 2), a2[5], a3);
  }
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  v6 = (UINT64 *)(a1 + 24);
  KxAcquireSpinLock((UINT64 *)(a1 + 24));
  v7 = 0i64;
  for( i = *(__int64 **)(a1 + 32); i != (__int64 *)(a1 + 32); i = (__int64 *)*i )
  {
    v7 = i;
    if( (PVOID)i[2] == a2[3] )
      break;
  }
  v9 = 0i64;
  for( j = (__int64 *)v7[3]; j != v7 + 3; j = (__int64 *)*j )
  {
    v9 = j;
    if( (PVOID *)j[5] == a2 )
      break;
  }
  v11 = (__int64 *)*v9;
  v12 = (__int64 **)v9[1];
  if( *(__int64 **)(*v9 + 8) != v9
    || *v12 != v9
    || (*v12 = v11, v11[1] = (__int64)v12, v13 = (PVOID *)*a2, v14 = (PVOID **)a2[1], *((PVOID **)*a2 + 1) != a2)
    || *v14 != a2 )
  {
    __fastfail(3u);
  }
  *v14 = v13;
  v13[1] = v14;
  KxReleaseSpinLock(v6);
  __writecr8(CurrentIrql);
  HalpMmAllocCtxFree(v15, (__int64)a2);
  v17 = v9[1544];
  if( v17 )
    HalpMmAllocCtxFree(v16, v17);
  HalpMmAllocCtxFree(v16, (__int64)v9);
  return 0i64;
}

Referenced by:

No references.