MiFreePageToSlabAllocator
NTSTATUS __stdcall MiFreePageToSlabAllocator(INT64 a1, INT64 a2, INT64 a3){
__int64 v3;
NTSTATUS v4;
unsigned __int8 v8;
__int64 v9;
unsigned __int64 v10;
int v11;
int v12;
__int64 v13;
INT64 v14;
v3 = *(_QWORD *)a2;
v4 = 0;
if( (*(_BYTE *)(a2 + 8) & 1) != 0 )
{
if( !v3 )
return 0;
v3 ^= a2;
}
if( !v3 )
return 0;
v14 = (a3 - (__int64)MmGetPfnDb()) / 48;
v8 = ExAcquireSpinLockShared((INT64 *)(a2 + 16));
v9 = *(_QWORD *)a2;
v10 = v8;
if( (*(_BYTE *)(a2 + 8) & 1) != 0 )
{
if( v9 )
v9 ^= a2;
else
v9 = 0i64;
}
v11 = *(_BYTE *)(a2 + 8) & 1;
if( v9 )
{
do
{
v12 = MiCompareSlabEntry(&v14, v9);
if( v12 >= 0 )
{
if( v12 <= 0 )
break;
v13 = *(_QWORD *)(v9 + 8);
}
else
{
v13 = *(_QWORD *)v9;
}
if( v11 && v13 )
v9 ^= v13;
else
v9 = v13;
}
while( v9 );
if( v9 )
{
MiReInitializeFreeSlabPfn(a3, a2);
MiUpdateSlabPagePlaceholderState(a2, v14, 1i64, 1);
MiFreePageToSlabEntry(a3, v9, a2);
}
}
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(a2 + 16));
__writecr8(v10);
LOBYTE(v4) = v9 != 0;
return v4;
}Referenced by:
No references.