MiFreePageToSlabEntry
NTSTATUS __stdcall MiFreePageToSlabEntry(UINT64 a1, INT64 a2, INT64 a3){
unsigned int v4;
__int64 v5;
volatile signed __int32 *v6;
int v7;
NTSTATUS result;
int v9;
unsigned __int64 v10;
v4 = (int)(a1 - (unsigned int)MmGetPfnDb()) / 48 - *(_DWORD *)(a2 + 24);
_InterlockedIncrement((volatile signed __int32 *)(a2 + 132));
_InterlockedIncrement((volatile signed __int32 *)(a3 + 32));
LOBYTE(a1) = 1;
v5 = v4 & 0x1F;
v6 = (volatile signed __int32 *)(*(_QWORD *)(a2 + 56) + 4 * ((unsigned __int64)v4 >> 5));
if( (unsigned __int64)(v5 + 1) <= 0x20 )
{
v7 = ~(1 << v5);
LABEL_3:
_InterlockedAnd(v6, v7);
goto LABEL_4;
}
v9 = v4 & 0x1F;
if( !v9 )
goto LABEL_12;
_InterlockedAnd(v6++, ~(((1 << (32 - v9)) - 1) << v5));
LODWORD(a1) = 1 - (32 - v9);
if( (unsigned int)a1 >= 0x20 )
{
v10 = (unsigned __int64)(unsigned int)a1 >> 5;
do
{
*v6 = 0;
LODWORD(a1) = a1 - 32;
++v6;
--v10;
}
while( v10 );
}
if( (_DWORD)a1 )
{
LABEL_12:
v7 = -1 << a1;
goto LABEL_3;
}
LABEL_4:
result = *(_DWORD *)(a2 + 132) + *(_DWORD *)(a2 + 136);
if( (unsigned int)result >= 0x200 )
_InterlockedOr((volatile signed __int32 *)(a3 + 56), 1u);
return result;
}Referenced by:
MiFreePageToSlabAllocator