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