MiFreePageToSlabAllocator
INT64 __fastcall MiFreePageToSlabAllocator(INT64 rcx0, INT64 a2, INT64 a3){
INT64 v3;
unsigned int v4;
KIRQL v8;
INT64 v9;
unsigned __int64 v10;
int v11;
int v12;
INT64 v13;
INT64 a1;
v3 = *(_QWORD *)a2;
v4 = 0;
if( (*(_BYTE *)(a2 + 8) & 1) != 0 )
{
if( !v3 )
return 0i64;
v3 ^= a2;
}
if( !v3 )
return 0i64;
a1 = (a3 - (__int64)MmGetPfnDb()) / 48;
v8 = ExAcquireSpinLockShared((PEX_SPIN_LOCK)(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(&a1, 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, a1, 1i64, 1i64);
MiFreePageToSlabEntry(a3, v9, a2);
}
}
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(a2 + 16));
__writecr8(v10);
LOBYTE(v4) = v9 != 0;
return v4;
}Referenced by:
No references.