MiGetSlabStandbyPage

NTSTATUS __stdcall MiGetSlabStandbyPage(INT64 a1, INT64 a2, UINT8 *a3){
  unsigned __int8 CurrentIrql; 
  __int64 v6; 
  _MMPFN *v7; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  UINT64 SpinCount; 

  *(_QWORD *)&LockQueue.OldIrql = 0i64;
  if( *(_QWORD *)(a1 + 80) == 0xFFFFFFFFFi64 )
    return -1;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LockQueue.LockQueue.Next = 0i64;
  LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 96);
  KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 96));
  v6 = *(_QWORD *)(a1 + 80);
  if( v6 == 0xFFFFFFFFFi64 )
  {
LABEL_10:
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
    LODWORD(v6) = -1;
  }
  else
  {
    while( 1 )
    {
      v7 = &MmGetPfnDb()[v6];
      if( !_interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) )
        break;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( v7->u2._bf_0 < 0 );
      }
      LockQueue.LockQueue.Next = 0i64;
      LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 96);
      KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 96));
      if( v6 == *(_QWORD *)(a1 + 80) )
        break;
      _InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      v6 = *(_QWORD *)(a1 + 80);
      if( v6 == 0xFFFFFFFFFi64 )
        goto LABEL_10;
    }
    MiUnlinkPageFromList(v7, 1ui64);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
    MiDiscardTransitionPteEx(v7, 2048i64);
    MiReInitializeFreeSlabPfn((INT64)v7, a1);
    _InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  }
  __writecr8(CurrentIrql);
  return v6;
}

Referenced by:

MiGetPageFromSlabAllocator