RtlpHpSegPageRangeShrink

CHAR __stdcall RtlpHpSegPageRangeShrink(INT64 a1, INT64 a2, INT64 r8_0, CHAR a4){
  int v4; 
  UINT8 CurrentIrql; 
  unsigned int v9; 
  UINT64 v10; 
  UINT64 v11; 
  char v12; 
  UINT64 v13; 
  char v14; 
  UINT64 v15; 
  BOOL v16; 
  UINT64 v17; 
  _QWORD *v18; 
  char *v19; 
  __int64 v20; 
  char v21; 
  _ETHREAD *v22; 
  unsigned int SessionId; 
  unsigned __int8 v24; 
  int v25; 
  bool v26; 
  __int64 v27; 
  _KLOCK_ENTRY *v28; 
  __int64 v29; 
  _ETHREAD *CurrentThread; 
  __int64 v31; 
  UINT64 *BugCheckParameter4; 
  UINT64 a3; 
  int v35; 
  int v36; 

  v35 = r8_0;
  v4 = *(unsigned __int8 *)(a2 + 31);
  if( (unsigned int)(v4 - 1) > 1 )
  {
    v19 = (char *)(a2 + 56);
    v20 = (unsigned int)(v4 - 2);
    do
    {
      v21 = *v19;
      v19 += 32;
      *(v19 - 32) = v21 & 0xFE;
      --v20;
    }
    while( v20 );
  }
  CurrentIrql = -1;
  if( (a4 & 1) == 0 )
  {
    if( (*(_DWORD *)(a1 + 40) & 1) != 0 )
    {
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
      ExpAcquireSpinLockExclusive((INT64 *)(a1 + 64), CurrentIrql);
    }
    else
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.SpecialApcDisable;
      ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(a1 + 64), 0i64);
    }
  }
  v9 = *(_DWORD *)(a2 + 28);
  LOBYTE(v35) = CurrentIrql;
  if( HIBYTE(v9) != v4 )
  {
    *(_BYTE *)(a2 + 31) = 0;
    *(_WORD *)(a2 + 28) = -1;
  }
  *(_BYTE *)(a2 + 24) |= 2u;
  *(_BYTE *)(32i64 * (unsigned int)(v4 - 1) + a2 + 31) = v4 - 1;
  *(_WORD *)(a2 + 28) = v9;
  *(_BYTE *)(a2 + 31) = v4;
  *(_DWORD *)a2 = -857879331;
  *(_BYTE *)(a2 + 24) &= 0xF3u;
  LODWORD(v10) = RtlpHpSegPageRangeCoalesce(a1, a2, a4, 0i64, (CHAR *)&v35);
  v12 = *(_BYTE *)(a1 + 13);
  v13 = v10;
  if( (v12 & 0x10) != 0
    && (LODWORD(v10) = *(unsigned __int8 *)(v10 + 31), (_DWORD)v10 == 256 - *(unsigned __int8 *)(a1 + 10)) )
  {
    v18 = (_QWORD *)(v13 & *(_QWORD *)a1);
    *(_DWORD *)v13 = -857879297;
    if( v18 )
    {
      v31 = *v18;
      v10 = v18[1];
      if( *(_QWORD **)(*v18 + 8i64) != v18 || *(_QWORD **)v10 != v18 )
        __fastfail(3u);
      *(_QWORD *)v10 = v31;
      *(_QWORD *)(v31 + 8) = v10;
      --*(_QWORD *)(a1 + 88);
    }
  }
  else
  {
    if( (v12 & 7) != 0 )
      v14 = RtlpHpSegPageRangeComputeLargePageCost(
              (PVOID)a1,
              (_THREADINFOCLASS)(((__int64)(v13 - (v13 & *(_QWORD *)a1)) >> 5 << *(_BYTE *)(a1 + 8))
                               + (v13 & *(_DWORD *)a1)),
              (PVOID)(*(unsigned __int8 *)(v13 + 31) << *(_BYTE *)(a1 + 8)),
              v11,
              BugCheckParameter4);
    else
      v14 = 4;
    *(_BYTE *)(v13 + 30) = v14;
    v15 = *(_QWORD *)(a1 + 96);
    if( (*(_QWORD *)(a1 + 104) & 1) != 0 )
    {
      if( v15 )
        v15 ^= a1 + 96;
      else
        v15 = 0i64;
    }
    v16 = 0;
    if( v15 )
    {
      while( 1 )
      {
        if( *(_DWORD *)(v13 + 28) < *(_DWORD *)(v15 + 28) )
        {
          v17 = *(_QWORD *)v15;
          if( (*(_QWORD *)(a1 + 104) & 1) != 0 )
          {
            if( !v17 )
              goto LABEL_25;
            v17 ^= v15;
          }
          if( !v17 )
          {
LABEL_25:
            v16 = 0;
            break;
          }
        }
        else
        {
          v17 = *(_QWORD *)(v15 + 8);
          if( (*(_QWORD *)(a1 + 104) & 1) != 0 )
          {
            if( !v17 )
              goto LABEL_26;
            v17 ^= v15;
          }
          if( !v17 )
          {
LABEL_26:
            v16 = 1;
            break;
          }
        }
        v15 = v17;
      }
    }
    RtlRbInsertNodeEx((UINT64 *)(a1 + 96), v15, v16, v13);
    v10 = *(__int16 *)(a1 + 22);
    _InterlockedExchangeAdd64((volatile signed __int64 *)(v10 + a1 + 16), (unsigned __int16)~*(_WORD *)(v13 + 28));
    v18 = 0i64;
  }
  if( (a4 & 1) == 0 )
  {
    if( (*(_DWORD *)(a1 + 40) & 1) != 0 )
    {
      *(_DWORD *)(a1 + 64) = 0;
      LOBYTE(v10) = v35;
      __writecr8((unsigned __int8)v35);
    }
    else
    {
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 64), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a1 + 64));
      LODWORD(a3) = 0;
      v22 = (_ETHREAD *)KeGetCurrentThread();
      if( MiGetSystemRegionType(a1 + 64) == 1 )
        SessionId = MmGetSessionIdEx(v22->Tcb.ApcState.Process);
      else
        SessionId = -1;
      --v22->Tcb.SpecialApcDisable;
      v24 = ++v22->Tcb.AbAllocationRegionCount;
      v25 = ((char)v22->Tcb.AbEntrySummary | (char)v22->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
      v26 = !_BitScanReverse((unsigned int *)&v27, v25);
      v36 = v27;
      if( v26 )
        goto LABEL_59;
      while( 1 )
      {
        v28 = &v22->Tcb.LockEntries[v27];
        v25 &= ~(1 << v27);
        if( (v28->AcquiredByte & 1) != 0
          && (v28->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
          && (v28->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((a1 + 64) & 0x7FFFFFFFFFFFFFFCi64)
          && v28->LockState.SessionId == SessionId )
        {
          v28->AcquiredByte &= ~1u;
          if( v28->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
            break;
        }
        v26 = !_BitScanReverse((unsigned int *)&v27, v25);
        v36 = v27;
        if( v26 )
          goto LABEL_59;
      }
      if( !v28 )
      {
LABEL_59:
        if( (*(&v22->Tcb.MiscFlags + 1) & 0x10000) == 0 )
          KeBugCheckEx(0x162u, v22, (PVOID)(a1 + 64), (PVOID)SessionId, 0i64);
      }
      else
      {
        v28->CrossThreadReleasableAndBusyByte |= 2u;
        if( v28->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
          KiAbEntryRemoveFromTree(v28);
        LODWORD(a3) = v28->BoostBitmap.AllFields & 0x1FFFF;
        v28->BoostBitmap.AllFields &= 0xFFFE0000;
        v28->ThreadLocalFlags &= ~1u;
        v28->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
        v29 = v28 - v22->Tcb.LockEntries;
        if( v24 == 1 )
          v22->Tcb.AbEntrySummary |= 1 << v29;
        else
          _InterlockedOr8((volatile signed __int8 *)&v22->Tcb.AbOrphanedEntrySummary, 1 << v29);
      }
      --v22->Tcb.AbAllocationRegionCount;
      KiAbThreadRemoveBoosts(&v22->Tcb, (VOID *)(a1 + 64), &a3);
      v26 = v22->Tcb.SpecialApcDisable++ == -1;
      if( v26 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v22->Tcb.ApcState.ApcListHead[0].Flink != &v22->Tcb.152 )
        KiCheckForKernelApcDelivery();
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
  }
  if( v18 )
    LOBYTE(v10) = RtlpHpSegSegmentFree(a1, (INT64)v18, 0x7FFFFFFFi64, 1i64);
  return v10;
}

Referenced by:

ExFreeHeapPool
RtlpHpSegFree
RtlpHpSegPageRangeFree