RtlpHpLfhOwnerCompact

NTSTATUS __stdcall RtlpHpLfhOwnerCompact(INT64 a1, INT64 a2, UINT64 a3){
  unsigned int v3; 
  __int64 v6; 
  __int64 v7; 
  _QWORD **v8; 
  _EX_PUSH_LOCK *v9; 
  UINT8 v10; 
  _QWORD *v11; 
  unsigned __int64 v12; 
  _QWORD *v13; 

  v3 = a3;
  if( (*(_BYTE *)a2 & 1) != 0 && *(_BYTE *)(a2 + 2) )
  {
    v6 = 0i64;
    v7 = *(unsigned __int8 *)(a2 + 2);
    do
    {
      RtlpHpLfhOwnerCompact(a1, *(_QWORD *)(*(_QWORD *)(a2 + 96) + v6), v3);
      v6 += 8i64;
      --v7;
    }
    while( v7 );
  }
  v8 = (_QWORD **)(a2 + 24);
  if( *v8 != v8 || (v13 = (_QWORD *)(a2 + 40), (_QWORD *)*v13 != v13) )
  {
    v9 = (_EX_PUSH_LOCK *)(a2 + 16);
    v10 = RtlpHpAcquireLockShared(v9, *(unsigned __int8 *)(a1 + 57));
    v11 = *v8;
    v12 = v10;
    while( v11 != v8 )
    {
      RtlpHpLfhSubsegmentDecommitPages(a1, (INT64)v11, 0xFFFFFFFFi64, 1ui64, v3);
      v11 = (_QWORD *)*v11;
    }
    if( *(_BYTE *)(a1 + 57) )
    {
      ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v9);
      LODWORD(v13) = KiIrqlFlags;
      __writecr8(v12);
    }
    else
    {
      if( _InterlockedCompareExchange64(&v9->_bf_0, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v9);
      KeAbPostRelease(v9);
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
  }
  return(int)v13;
}

Referenced by:

RtlpHpLfhContextCompact
RtlpHpLfhOwnerCompact