HalpIommuDereferenceHardwareDomain

__int64 __fastcall HalpIommuDereferenceHardwareDomain(__int64 a1, INT64 *a2){
  unsigned __int64 v4; 
  INT64 v5; 
  INT64 **v6; 
  _HALP_ALLOC_CONTEXT *v7; 
  __int64 result; 

  v4 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 16));
  if( a1 != SortKey )
    --a2[2];
  if( !a2[2] )
  {
    v5 = *a2;
    v6 = (INT64 **)a2[1];
    if( *(INT64 **)(*a2 + 8) != a2 || *v6 != a2 )
      __fastfail(3u);
    *v6 = (INT64 *)v5;
    *(_QWORD *)(v5 + 8) = v6;
    HalpIommuFreeDomain((INT64 *)a2[3], a2 + 4);
    HalpMmAllocCtxFree(v7, a2);
  }
  KxReleaseSpinLock((UINT64 *)(a1 + 16));
  result = (unsigned int)KiIrqlFlags;
  __writecr8(v4);
  return result;
}

Referenced by:

HalpIommuJoinDmaDomain
HalpIommuLeaveDmaDomain