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