MiFreeSlabEntries
__int64 __fastcall MiFreeSlabEntries(INT64 a1, INT64 a2, int a3){
INT64 v4;
__int64 v6;
UINT64 *v7;
unsigned __int8 v8;
__int64 v9;
unsigned __int64 v10;
_QWORD *v11;
_QWORD *v12;
int v13;
UINT64 v14;
_QWORD *v15;
UINT64 *v16;
_MMPFN *v17;
volatile int *v18;
_MMPFN *v19;
__int64 v20;
unsigned __int8 CurrentIrql;
__int64 v22;
int v23;
int v24;
__int64 v25;
_MMPFN *PfnDb;
_QWORD *v27;
__int64 v28;
_MIPFNBLINK *p_u2;
unsigned __int64 v30;
int v31;
int v32;
UINT64 SpinCount;
unsigned __int64 v35;
v4 = a1;
if( (*(_DWORD *)(a2 + 56) & 1) == 0 )
return 0i64;
v6 = 0i64;
if( !a3 && KiQueryUnbiasedInterruptTime(1u) - *(_QWORD *)(a2 + 104) < 0x2FAF080 )
return 0i64;
v35 = 0i64;
if( !*(_QWORD *)(a2 + 64) )
goto LABEL_6;
v17 = 0i64;
v18 = (volatile int *)(a2 + 16);
v19 = 0i64;
v20 = 0i64;
do
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
ExAcquireSpinLockSharedAtDpcLevel(v18);
v22 = *(_QWORD *)a2;
if( (*(_BYTE *)(a2 + 8) & 1) != 0 )
{
if( v22 )
v22 ^= a2;
else
v22 = 0i64;
}
v23 = *(_BYTE *)(a2 + 8) & 1;
while( v22 )
{
v24 = MiCompareSlabEntry(&v35, v22);
if( !v24 )
goto LABEL_37;
if( v24 >= 0 )
{
v25 = *(_QWORD *)(v22 + 8);
}
else
{
v25 = *(_QWORD *)v22;
v6 = v22;
}
if( v23 && v25 )
v22 ^= v25;
else
v22 = v25;
}
v22 = v6;
LABEL_37:
v6 = 0i64;
while( v22 )
{
v20 = *(unsigned int *)(v22 + 136);
if( *(_DWORD *)(v22 + 136)
&& v20 + (unsigned __int64)*(unsigned int *)(v22 + 132) >= 0x200
&& (*(_DWORD *)(v22 + 140) & 1) == 0 )
{
PfnDb = MmGetPfnDb();
v17 = &PfnDb[*(_QWORD *)(v22 + 24)];
v19 = &PfnDb[*(_QWORD *)(v22 + 32)];
goto LABEL_50;
}
v27 = *(_QWORD **)(v22 + 8);
v28 = v22;
if( v27 )
{
do
{
v22 = (__int64)v27;
v27 = (_QWORD *)*v27;
}
while( v27 );
}
else
{
while( 1 )
{
v22 = *(_QWORD *)(v22 + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !v22 || *(_QWORD *)v22 == v28 )
break;
v28 = v22;
}
}
}
PfnDb = MmGetPfnDb();
LABEL_50:
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(a2 + 16));
if( !v22 )
break;
if( !v20 )
goto LABEL_68;
p_u2 = &v17->u2;
while( v17 <= v19 )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)p_u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( p_u2->_bf_0 < 0 );
}
v30 = ((char *)&p_u2[1]._bf_0 + 2 - (char *)(&MmGetPfnDb()->u3 + 1)) / 48;
if( v30 > 0xFFFFFFFFFi64
|| (MmGetPfnDb()[v30].u4._bf_0 & 0x4000000000000i64) == 0
|| (LOBYTE(v31) = MiIsPfnFromSlabAllocation((INT64)v17), !v31) )
{
LABEL_65:
v20 = 0i64;
goto LABEL_66;
}
if( (BYTE2(p_u2[1]._bf_0) & 7) != 2
|| LOWORD(p_u2[1]._bf_0)
|| v17->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 >= 0 )
{
LOBYTE(v32) = MiIsFreeSlabPage((INT64)v17);
if( !v32 )
goto LABEL_65;
}
else
{
MiUnlinkPageFromList(v17, 0i64);
MiDiscardTransitionPteEx(v17, 0i64);
--v20;
}
LABEL_66:
_InterlockedAnd64(&p_u2->Lock, 0x7FFFFFFFFFFFFFFFui64);
++v17;
p_u2 += 6;
if( !v20 )
break;
}
PfnDb = MmGetPfnDb();
LABEL_68:
v35 = ((__int64)((unsigned __int128)(((char *)v19 - (char *)PfnDb) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3)
+ ((unsigned __int64)((unsigned __int128)(((char *)v19 - (char *)PfnDb) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 63)
+ 1;
__writecr8(CurrentIrql);
v18 = (volatile int *)(a2 + 16);
CurrentIrql = 17;
}
while( *(_QWORD *)(a2 + 64) );
if( CurrentIrql != 17 )
__writecr8(CurrentIrql);
v4 = a1;
LABEL_6:
v7 = 0i64;
v8 = ExAcquireSpinLockExclusive((INT64 *)(a2 + 16));
*(_DWORD *)(a2 + 56) &= ~1u;
v9 = *(_QWORD *)(a2 + 8);
v10 = v8;
if( (v9 & 1) != 0 )
{
if( v9 != 1 )
{
v11 = (_QWORD *)(v9 ^ (a2 | 1));
goto LABEL_13;
}
}
else
{
v11 = *(_QWORD **)(a2 + 8);
LABEL_13:
while( v11 )
{
v12 = (_QWORD *)v11[1];
v14 = (UINT64)v11;
v15 = v11;
if( v12 )
{
do
{
v11 = v12;
v12 = (_QWORD *)*v12;
}
while( v12 );
}
else
{
while( 1 )
{
v11 = (_QWORD *)(v11[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !v11 || (_QWORD *)*v11 == v15 )
break;
v15 = v11;
}
}
if( (*(_DWORD *)(v14 + 140) & 1) == 0 )
{
v13 = *(_DWORD *)(v14 + 132);
if( v13 == 512 )
{
MiRemoveSlabEntry(v4, (UINT64 *)a2, v14);
*(_QWORD *)v14 = v7;
v7 = (UINT64 *)v14;
}
else if( (unsigned int)(v13 + *(_DWORD *)(v14 + 136)) >= 0x200 )
{
*(_DWORD *)(a2 + 56) |= 1u;
}
}
}
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(a2 + 16));
__writecr8(v10);
while( 1 )
{
v16 = v7;
if( !v7 )
break;
v7 = (UINT64 *)*v7;
MiFreeSlabEntry(a2, v16);
}
return 0i64;
}Referenced by:
MiDeleteSlabAllocator