RtlpHpLargeAllocSize

UINT64 __stdcall RtlpHpLargeAllocSize(INT64 a1, UINT64 a2, CHAR a3, INT64 *a4){
  unsigned __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  UINT64 v12; 
  int v13; 
  int v15[18]; 

  v8 = RtlpHpLargeLockAcquireShared(a1, a3);
  v9 = *(_QWORD *)(a1 + 72);
  if( (*(_BYTE *)(a1 + 80) & 1) != 0 )
  {
    if( v9 )
      v9 ^= a1 + 72;
    else
      v9 = 0i64;
  }
  while( v9 )
  {
    v10 = *(_QWORD *)(v9 + 24) & 0xFFFFFFFFFFFF0000ui64;
    if( a2 < v10 )
    {
      v11 = *(_QWORD *)v9;
    }
    else
    {
      if( a2 <= v10 )
        goto LABEL_16;
      v11 = *(_QWORD *)(v9 + 8);
    }
    if( (*(_BYTE *)(a1 + 80) & 1) != 0 && v11 )
      v9 ^= v11;
    else
      v9 = v11;
  }
  v9 = 0i64;
LABEL_16:
  if( v9 )
  {
    if( a4 )
    {
      if( (*(_BYTE *)(v9 + 32) & 1) != 0 )
      {
        _InterlockedOr(v15, 0);
        v13 = 1;
      }
      else
      {
        v13 = 0;
      }
      *(_DWORD *)a4 = v13;
    }
    v12 = (*(_QWORD *)(v9 + 32) & 0xFFFFFFFFFFFFF000ui64) - (unsigned __int16)*(_DWORD *)(v9 + 24);
  }
  else
  {
    v12 = -1i64;
  }
  if( (a3 & 1) == 0 )
  {
    if( (*(_DWORD *)a1 & 1) != 0 )
    {
      ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(a1 + 64));
      __writecr8(v8);
    }
    else
    {
      if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 64), 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 64));
      KeAbPostRelease((VOID *)(a1 + 64));
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
  }
  return v12;
}

Referenced by:

RtlpHpSizeHeapInternal