HalFreeCommonBufferV3

VOID __stdcall HalFreeCommonBufferV3(
        _ADAPTER_OBJECT *ChildAdapter,
        _LARGE_INTEGER LogicalAddress,
        PVOID VirtualAddress,
        UINT8 CacheEnabled){
  unsigned __int64 v4; 
  unsigned __int64 v6; 
  _HALP_DMA_DOMAIN_OBJECT *DomainPointer; 
  UINT64 Root; 
  void *v9; 
  unsigned __int64 v10; 
  UINT64 v11; 
  _HALP_DMA_DOMAIN_OBJECT *Flink; 
  UINT64 v13; 
  _EXT_IOMMU_TRANSLATION_TYPE TranslationType; 
  unsigned __int64 v15; 

  v15 = CacheEnabled;
  v4 = CacheEnabled;
  LOBYTE(v6) = KeGetCurrentIrql();
  DomainPointer = 0i64;
  if( ChildAdapter )
    DomainPointer = ChildAdapter->DomainPointer;
  Root = 0i64;
  v9 = 0i64;
  v10 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&stru_140C49BB0.Lock);
  if( !DomainPointer )
    goto LABEL_21;
  v6 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&DomainPointer->CommonBufferTreeLock);
  Root = (UINT64)DomainPointer->CommonBufferRoot.Root;
  if( (DomainPointer->CommonBufferRoot._bf_0 & 1) != 0 && Root )
    Root ^= (unsigned __int64)&DomainPointer->CommonBufferRoot;
  while( Root && *(_QWORD *)(Root + 24) != v4 )
  {
    if( *(_QWORD *)(Root + 24) <= v4 )
      v11 = *(_QWORD *)(Root + 8);
    else
      v11 = *(_QWORD *)Root;
    if( (DomainPointer->CommonBufferRoot._bf_0 & 1) != 0 && v11 )
      Root ^= v11;
    else
      Root = v11;
  }
  if( Root )
  {
    v9 = (void *)Root;
  }
  else
  {
    KxReleaseSpinLock(&DomainPointer->CommonBufferTreeLock);
    __writecr8(v6);
    DomainPointer = 0i64;
  }
  if( !DomainPointer )
  {
LABEL_21:
    Flink = (_HALP_DMA_DOMAIN_OBJECT *)qword_140C49BD0;
    if( (_QWORD *)qword_140C49BD0 != &qword_140C49BD0 )
    {
      while( 1 )
      {
        DomainPointer = Flink;
        v6 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&Flink->CommonBufferTreeLock);
        Root = (UINT64)Flink->CommonBufferRoot.Root;
        if( (Flink->CommonBufferRoot._bf_0 & 1) != 0 && Root )
          Root ^= (unsigned __int64)&Flink->CommonBufferRoot;
        if( Root )
        {
          do
          {
            if( *(_QWORD *)(Root + 24) == v15 )
              break;
            v13 = *(_QWORD *)(Root + 24) <= v15 ? *(_QWORD *)(Root + 8) : *(_QWORD *)Root;
            if( (Flink->CommonBufferRoot._bf_0 & 1) != 0 && v13 )
              Root ^= v13;
            else
              Root = v13;
          }
          while( Root );
          if( Root )
            break;
        }
        KxReleaseSpinLock(&Flink->CommonBufferTreeLock);
        __writecr8(v6);
        Flink = (_HALP_DMA_DOMAIN_OBJECT *)Flink->ListEntry.Flink;
        if( Flink == (_HALP_DMA_DOMAIN_OBJECT *)&qword_140C49BD0 )
          goto LABEL_40;
      }
      v9 = (void *)Root;
    }
    if( !DomainPointer )
    {
LABEL_40:
      KxReleaseSpinLock(&stru_140C49BB0.Lock);
      __writecr8(v10);
      return;
    }
    v4 = v15;
  }
  TranslationType = DomainPointer->TranslationType;
  if( TranslationType )
  {
    HalpIommuDomainUnmapLogicalRange(DomainPointer->IommuDomainPointer, VirtualAddress);
    TranslationType = DomainPointer->TranslationType;
  }
  if( TranslationType == ExtTranslationTypeTranslate )
    HalpDomainLaDelete((INT64)DomainPointer, (UINT64)VirtualAddress);
  RtlRbRemoveNode((UINT64 *)&DomainPointer->CommonBufferRoot, Root);
  KxReleaseSpinLock(&DomainPointer->CommonBufferTreeLock);
  __writecr8((unsigned __int8)v6);
  KxReleaseSpinLock(&stru_140C49BB0.Lock);
  __writecr8(v10);
  HalpDmaDereferenceDomainObject(DomainPointer);
  ExFreePoolWithTag(v9, 0);
  MmFreeContiguousMemory((VOID *)v4);
}

Referenced by:

No references.