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.