MiFreeSlabEntry
VOID __stdcall MiFreeSlabEntry(INT64 a1, UINT64 *a2){
_MMPFN *PfnDb;
__int64 v5;
_MMPFN *v6;
unsigned __int64 v7;
unsigned __int8 CurrentIrql;
__int16 v9;
_MIPFNBLINK *p_u2;
unsigned __int64 v11;
unsigned __int64 v12;
UINT64 v13;
char v14;
volatile signed __int32 *v15;
int v16;
int v17;
unsigned __int64 v18;
UINT64 SpinCount;
PfnDb = MmGetPfnDb();
v5 = 0i64;
v6 = &PfnDb[a2[3]];
v7 = (unsigned __int64)&PfnDb[a2[4]];
CurrentIrql = KeGetCurrentIrql();
v9 = 2;
__writecr8(2ui64);
if( (unsigned __int64)v6 <= v7 )
{
p_u2 = &v6->u2;
do
{
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset64((volatile signed __int32 *)p_u2, 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( p_u2->_bf_0 < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)p_u2, 0x3Fui64) );
v9 = 2;
}
if( !v5 )
v5 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)p_u2[2]._bf_0 >> 39) & 0x3FF));
if( !*(_DWORD *)(a1 + 48) )
p_u2[2]._bf_0 &= 0x8FFFFFFFFFFFFFFFui64;
v11 = p_u2->_bf_0 & 0xC000000000000001ui64;
LOWORD(p_u2[1]._bf_0) = v9;
p_u2->_bf_0 = v11 | 1;
MiSetPfnPageState((INT64)&p_u2[-3], 6);
_InterlockedAnd64(&p_u2->Lock, 0x7FFFFFFFFFFFFFFFui64);
p_u2 += 6;
}
while( (unsigned __int64)&p_u2[-3] <= v7 );
}
__writecr8(CurrentIrql);
MiUpdateSlabPagePlaceholderState(a1, a2[3], 512i64, 0);
LOBYTE(v12) = 1;
v13 = a2[3] >> 9;
v14 = v13 & 0x1F;
v15 = (volatile signed __int32 *)(*(&stru_140C50B28 + 756) + 4 * (a2[3] >> 14));
if( (v13 & 0x1F) + 1 <= 0x20 )
{
v16 = 1 << v14;
LABEL_20:
_InterlockedAnd(v15, ~v16);
goto LABEL_21;
}
if( (v13 & 0x1F) == 0 )
goto LABEL_19;
v17 = v13 & 0x1F;
_InterlockedAnd(v15++, ~(((1 << (32 - v17)) - 1) << v14));
v12 = 1i64 - (unsigned int)(32 - v17);
if( v12 >= 0x20 )
{
v18 = v12 >> 5;
v12 += -32i64 * (v12 >> 5);
do
{
*v15++ = 0;
--v18;
}
while( v18 );
}
if( v12 )
{
LABEL_19:
v16 = (1 << v12) - 1;
goto LABEL_20;
}
LABEL_21:
MiFreeLargePageMemory(a2[3], 1ui64, 6ui64);
ExFreePoolWithTag(a2, 0);
}Referenced by:
MiFreeSlabEntries