MiGetSlabStandbyPage

INT64 __fastcall MiGetSlabStandbyPage(INT64 a1, INT64 a2, UINT8 *a3){
  void *v3; 
  unsigned __int8 CurrentIrql; 
  INT64 v7; 
  volatile signed __int32 *v8; 
  WORK_QUEUE_TYPE v9; 
  void *v10; 
  _BYTE LockHandle[72]; 
  UINT64 SpinCount; 
  *(_QWORD *)&LockHandle[16] = 0i64;
  if( *(_QWORD *)(a1 + 80) == 0xFFFFFFFFFi64 )
    return -1i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  *(_QWORD *)LockHandle = 0i64;
  *(_QWORD *)&LockHandle[8] = a1 + 96;
  KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 96), (WORK_QUEUE_TYPE)a3, v3);
  v7 = *(_QWORD *)(a1 + 80);
  if( v7 == 0xFFFFFFFFFi64 )
  {
LABEL_10:
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
    v7 = -1i64;
  }
  else
  {
    while( 1 )
    {
      v8 = (volatile signed __int32 *)((char *)MmGetPfnDb() + 48 * v7);
      if( !_interlockedbittestandset64(v8 + 6, 0x3Fui64) )
        break;
      KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64(v8 + 6, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *((__int64 *)v8 + 3) < 0 );
      }
      *(_QWORD *)LockHandle = 0i64;
      *(_QWORD *)&LockHandle[8] = a1 + 96;
      KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 96), v9, v10);
      if( v7 == *(_QWORD *)(a1 + 80) )
        break;
      _InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
      v7 = *(_QWORD *)(a1 + 80);
      if( v7 == 0xFFFFFFFFFi64 )
        goto LABEL_10;
    }
    MiUnlinkPageFromList((_MMPFN *)v8, 1ui64);
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
    MiDiscardTransitionPteEx((UINT64)v8, 2048i64);
    MiReInitializeFreeSlabPfn((INT64)v8, a1);
    _InterlockedAnd64((volatile signed __int64 *)v8 + 3, 0x7FFFFFFFFFFFFFFFui64);
  }
  __writecr8(CurrentIrql);
  return v7;
}

Referenced by:

MiGetPageFromSlabAllocator