MiGetPageFromSlabAllocator
INT64 __fastcall MiGetPageFromSlabAllocator(INT64 a1){
KIRQL v3;
INT64 v4;
unsigned __int64 v5;
INT64 PageFromSlabEntry;
INT64 v7;
UINT8 *v8;
volatile signed __int64 *v9;
unsigned __int64 v10;
__int64 v11;
_QWORD *v12;
_QWORD *v13;
_QWORD *v14;
if( !(*(_QWORD *)(a1 + 32) + *(_QWORD *)(a1 + 64)) )
return -1i64;
v3 = ExAcquireSpinLockShared((PEX_SPIN_LOCK)(a1 + 16));
v4 = *(_QWORD *)(a1 + 24);
v5 = v3;
if( !v4 )
goto LABEL_9;
PageFromSlabEntry = MiGetPageFromSlabEntry(v4, a1);
if( PageFromSlabEntry == -1 )
{
*(_QWORD *)(a1 + 24) = 0i64;
LABEL_9:
v11 = *(_QWORD *)(a1 + 8);
if( (v11 & 1) != 0 )
{
if( v11 != 1 )
{
v12 = (_QWORD *)(v11 ^ (a1 | 1));
goto LABEL_13;
}
}
else
{
v12 = *(_QWORD **)(a1 + 8);
LABEL_13:
while( v12 )
{
PageFromSlabEntry = MiGetPageFromSlabEntry((INT64)v12, a1);
if( PageFromSlabEntry != -1 )
{
*(_QWORD *)(a1 + 24) = v12;
goto LABEL_5;
}
v13 = (_QWORD *)v12[1];
v14 = v12;
if( v13 )
{
do
{
v12 = v13;
v13 = (_QWORD *)*v13;
}
while( v13 );
}
else
{
while( 1 )
{
v12 = (_QWORD *)(v12[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !v12 || (_QWORD *)*v12 == v14 )
break;
v14 = v12;
}
}
}
}
PageFromSlabEntry = -1i64;
}
LABEL_5:
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(a1 + 16));
__writecr8(v5);
if( PageFromSlabEntry == -1 )
return MiGetSlabStandbyPage(a1, v7, v8);
v9 = (volatile signed __int64 *)((char *)MmGetPfnDb() + 48 * PageFromSlabEntry);
v10 = (unsigned __int8)MiLockPageInline((INT64)v9);
MiUpdateSlabPagePlaceholderState(a1, PageFromSlabEntry, 1i64, 0i64);
_InterlockedAnd64(v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v10);
return PageFromSlabEntry;
}Referenced by:
MiGetSlabPage