MiFreeSlabEntry
VOID __fastcall MiFreeSlabEntry(INT64 a1, UINT64 *a2){
_MMPFN *PfnDb;
__int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int8 CurrentIrql;
__int16 v9;
unsigned __int64 v10;
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 = (unsigned __int64)PfnDb + 48 * a2[3];
v7 = (unsigned __int64)PfnDb + 48 * a2[4];
CurrentIrql = KeGetCurrentIrql();
v9 = 2;
__writecr8(2ui64);
if( v6 <= v7 )
{
v10 = v6 + 24;
do
{
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset64((volatile signed __int32 *)v10, 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)v10 < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)v10, 0x3Fui64) );
v9 = 2;
}
if( !v5 )
v5 = *(_QWORD *)(qword_140C4E388 + 8 * ((*(_QWORD *)(v10 + 16) >> 39) & 0x3FFi64));
if( !*(_DWORD *)(a1 + 48) )
*(_QWORD *)(v10 + 16) &= 0x8FFFFFFFFFFFFFFFui64;
v11 = *(_QWORD *)v10 & 0xC000000000000001ui64;
*(_WORD *)(v10 + 8) = v9;
*(_QWORD *)v10 = v11 | 1;
MiSetPfnPageState(v10 - 24, 6);
_InterlockedAnd64((volatile signed __int64 *)v10, 0x7FFFFFFFFFFFFFFFui64);
v10 += 48i64;
}
while( v10 - 24 <= v7 );
}
__writecr8(CurrentIrql);
MiUpdateSlabPagePlaceholderState(a1, a2[3], 512i64, 0i64);
LOBYTE(v12) = 1;
v13 = a2[3] >> 9;
v14 = v13 & 0x1F;
v15 = (volatile signed __int32 *)(qword_140C522C8 + 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