HalFreeCommonBufferVector
VOID __stdcall HalFreeCommonBufferVector(INT64 a1, INT64 a2){
INT64 v2;
unsigned __int8 CurrentIrql;
unsigned __int8 v5;
_QWORD *v6;
unsigned __int64 v7;
__int64 v8;
UINT64 v9;
_HALP_ALLOC_CONTEXT *v10;
_HALP_ALLOC_CONTEXT *v11;
v2 = *(_QWORD *)(a2 + 32);
CurrentIrql = KeGetCurrentIrql();
if( CurrentIrql > 2u )
KeBugCheckEx(0x1DCu, (PVOID)1, (PVOID)CurrentIrql, 0i64, 0i64);
v5 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v2 + 120));
v6 = *(_QWORD **)(a2 + 8);
v7 = v5;
v8 = *(_QWORD *)a2;
if( *(_QWORD *)(*(_QWORD *)a2 + 8i64) != a2 || *v6 != a2 )
__fastfail(3u);
*v6 = v8;
*(_QWORD *)(v8 + 8) = v6;
KxReleaseSpinLock((UINT64 *)(v2 + 120));
__writecr8(v7);
if( *(_DWORD *)(v2 + 64) == 2 )
{
HalpIommuDomainUnmapLogicalRange(*(PVOID *)(v2 + 40), *(PVOID *)(a2 + 56));
HalpDomainLaDelete(v2, *(_QWORD *)(a2 + 56));
}
HalpDmaDereferenceDomainObject((PVOID)v2);
MmUnmapLockedPages(*(VOID **)(a2 + 48), *(_MDL **)(a2 + 40));
MiFreePagesFromMdl(*(PVOID *)(a2 + 40), 0i64, v9);
ExFreePoolWithTag(*(PVOID *)(a2 + 40), 0);
HalpMmAllocCtxFree(v10, *(VOID **)(a2 + 64));
HalpMmAllocCtxFree(v11, (VOID *)a2);
}Referenced by:
No references.