HalpIommuDeleteDevice

NTSTATUS __stdcall HalpIommuDeleteDevice(UINT64 *Memory){
  NTSTATUS v2; 
  char v3; 
  _LIST_ENTRY *v4; 
  _LIST_ENTRY *i; 
  __int64 v6; 
  _LIST_ENTRY *v8; 
  _LIST_ENTRY *v9; 
  _HALP_ALLOC_CONTEXT *v10; 
  _LIST_ENTRY *Flink; 
  _HALP_ALLOC_CONTEXT *v13; 
  VOID *v14; 

  v2 = 0;
  v3 = 0;
  v4 = 0i64;
  ExAcquirePushLockExclusiveEx(&stru_140C49BA8, 0i64);
  for( i = stru_140C49BB0.BufferList.Flink; i != (_LIST_ENTRY *)&stru_140C49BB0; i = *(_LIST_ENTRY **)v6 )
  {
    v4 = i;
    if( IidAreIdsStrictlyEqual((INT64 *)i[1].Flink, Memory[4]) )
    {
      if( (*(_DWORD *)(v6 + 32))-- == 1 )
      {
        v8 = *(_LIST_ENTRY **)v6;
        if( *(_QWORD *)(*(_QWORD *)v6 + 8i64) != v6 || (v9 = *(_LIST_ENTRY **)(v6 + 8), v9->Flink != (_LIST_ENTRY *)v6) )
          __fastfail(3u);
        v9->Flink = v8;
        v3 = 1;
        v8->Blink = v9;
        break;
      }
    }
  }
  if( (_InterlockedExchangeAdd64(&stru_140C49BA8._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&stru_140C49BA8);
  KeAbPostRelease(&stru_140C49BA8);
  if( !v3 )
    return 0;
  if( v4 )
  {
    Flink = v4[1].Flink;
    if( Flink )
      HalpMmAllocCtxFree(v10, Flink);
    HalpMmAllocCtxFree(v10, v4);
  }
  if( byte_140C49B2C )
    v2 = IommupHvUnregisterDeviceId();
  else(*(void(__fastcall **)(_QWORD, UINT64, _QWORD))(Memory[1] + 96))(*(_QWORD *)(Memory[1] + 16), *Memory, 0i64);
  v14 = (VOID *)Memory[4];
  if( v14 )
    HalpMmAllocCtxFree(v13, v14);
  HalpMmAllocCtxFree(v13, Memory);
  return v2;
}

Referenced by:

HalpDmaAllocateChildAdapterV3
HalpDmaFreeChildAdapter
HalpIommuBlockDevice
HalpIommuUnblockDevice
IommuDomainDetachDevice