IommuDomainDetachDevice

INT64 __fastcall IommuDomainDetachDevice(LONGLONG a1, INT64 a2, INT64 a3){
  char v3; 
  __int32 v4; 
  __int64 v5; 
  int v6; 
  __int64 v7; 
  unsigned __int8 CurrentIrql; 
  __int64 v10; 
  UINT8 v11; 
  int v12; 
  __int64 v13; 
  __int64 *v14; 
  __int64 v15; 
  __int64 v16; 
  v3 = 0;
  v4 = 0;
  v5 = 0i64;
  v6 = a3;
  v7 = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xCui64);
  KxAcquireSpinLock(&HalpIommuParaVirtDeviceCacheLock);
  v10 = HalpIommuParaVirtDeviceCache;
  if( (__int64 *)HalpIommuParaVirtDeviceCache != &HalpIommuParaVirtDeviceCache )
  {
    while( 1 )
    {
      v5 = v10;
      if( *(_QWORD *)(v10 + 40) == a1 && *(_QWORD *)(v10 + 16) == a2 && *(_DWORD *)(v10 + 24) == v6 )
        break;
      v10 = *(_QWORD *)v10;
      if( (__int64 *)v10 == &HalpIommuParaVirtDeviceCache )
        goto LABEL_6;
    }
    v7 = *(_QWORD *)(v10 + 32);
    v3 = 1;
    v4 = _InterlockedExchange((volatile __int32 *)(v7 + 208), 1);
    v13 = *(_QWORD *)v10;
    v14 = *(__int64 **)(v10 + 8);
    if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) != v10 || *v14 != v10 )
      __fastfail(3u);
    *v14 = v13;
    *(_QWORD *)(v13 + 8) = v14;
  }
LABEL_6:
  KxReleaseSpinLock(&HalpIommuParaVirtDeviceCacheLock);
  __writecr8(CurrentIrql);
  if( v3 )
  {
    v12 = (unsigned int)HalpIommuLeaveDmaDomain((KDEVICE_QUEUE *)v7, a1, v11);
    if( v12 >= 0 )
    {
      if( v4 != 2 )
        v12 = HalpIommuDeleteDevice((UINT64 *)v7);
      HalpMmAllocCtxFree(v15, *(_QWORD *)(v5 + 48));
      HalpMmAllocCtxFree(v16, v5);
    }
  }
  else
  {
    return(unsigned int)-1073741584;
  }
  return(unsigned int)v12;
}

Referenced by:

No references.