MiGetPageFromSlabAllocator
NTSTATUS __stdcall MiGetPageFromSlabAllocator(INT64 a1){
unsigned __int8 v3;
INT64 v4;
unsigned __int64 v5;
INT64 v6;
INT64 v7;
INT64 v8;
UINT8 *v9;
_MMPFN *v10;
unsigned __int64 v11;
__int64 v12;
_QWORD *v13;
_QWORD *v14;
INT64 v15;
_QWORD *v16;
if( !(*(_QWORD *)(a1 + 32) + *(_QWORD *)(a1 + 64)) )
return -1;
v3 = ExAcquireSpinLockShared((INT64 *)(a1 + 16));
v4 = *(_QWORD *)(a1 + 24);
v5 = v3;
if( !v4 )
goto LABEL_9;
LODWORD(v6) = MiGetPageFromSlabEntry(v4, a1);
v7 = v6;
if( v6 == -1 )
{
*(_QWORD *)(a1 + 24) = 0i64;
LABEL_9:
v12 = *(_QWORD *)(a1 + 8);
if( (v12 & 1) != 0 )
{
if( v12 != 1 )
{
v13 = (_QWORD *)(v12 ^ (a1 | 1));
goto LABEL_13;
}
}
else
{
v13 = *(_QWORD **)(a1 + 8);
LABEL_13:
while( v13 )
{
LODWORD(v15) = MiGetPageFromSlabEntry((INT64)v13, a1);
v7 = v15;
if( v15 != -1 )
{
*(_QWORD *)(a1 + 24) = v13;
goto LABEL_5;
}
v14 = (_QWORD *)v13[1];
v16 = v13;
if( v14 )
{
do
{
v13 = v14;
v14 = (_QWORD *)*v14;
}
while( v14 );
}
else
{
while( 1 )
{
v13 = (_QWORD *)(v13[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !v13 || (_QWORD *)*v13 == v16 )
break;
v16 = v13;
}
}
}
}
v7 = -1i64;
}
LABEL_5:
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(a1 + 16));
__writecr8(v5);
if( v7 == -1 )
{
LODWORD(v7) = MiGetSlabStandbyPage(a1, v8, v9);
}
else
{
v10 = &MmGetPfnDb()[v7];
v11 = MiLockPageInline(v10);
MiUpdateSlabPagePlaceholderState(a1, v7, 1i64, 0);
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
}
return v7;
}Referenced by:
MiGetSlabPage