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.