MiReturnPhysicalPoolPages
VOID __stdcall MiReturnPhysicalPoolPages(_MMPFN *PfnList){
char v1;
_MMPFN *PfnDb;
_MMPFN *v3;
$559D8309DABD45803AD694472C7FC28A *v4;
__int64 v5;
char v6;
__int64 v7;
__int64 v8;
INT64 v9;
UINT64 v10;
unsigned __int64 v11;
_MMPFN *v12;
unsigned __int64 v13;
_QWORD *v14;
$559D8309DABD45803AD694472C7FC28A *v15;
$559D8309DABD45803AD694472C7FC28A *v16;
_MMPFN *bf_0;
_KLOCK_QUEUE_HANDLE LockHandle;
UINT64 v19[2];
__int128 v20;
__int128 v21;
int v22;
int v23;
unsigned int v24;
_MMPFN *v25;
PfnDb = MmGetPfnDb();
v3 = PfnList;
v25 = 0i64;
v4 = 0i64;
v5 = 0i64;
v6 = v1;
memset(&LockHandle, 0, sizeof(LockHandle));
*(_OWORD *)v19 = 0i64;
v20 = 0i64;
v21 = 0i64;
LODWORD(v7) = MiSearchNumaNodeTable((PVOID)(PfnList - PfnDb));
v24 = *(_DWORD *)(v7 + 8);
v23 = v6 & 1;
v22 = v6 & 2;
do
{
bf_0 = (_MMPFN *)v3->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
v16 = v4;
v15 = v4;
v8 = v3 - PfnDb;
v11 = MiLockPageInline(v3);
if( !v22 )
{
v13 = v3->u2._bf_0 & 0xC000000000000001ui64;
v3->u3.ReferenceCount = 1;
v3->u2._bf_0 = v13 | 1;
}
if( !v23 && (*((_BYTE *)&v3->u3 + 3) & 0x10) != 0 )
{
++v5;
v4 = ($559D8309DABD45803AD694472C7FC28A *)v3;
v12 = v3;
*((_BYTE *)&v3->u3 + 2) = *(_BYTE *)(&v3->u3 + 1) & 0xF8 | 5;
v3->u2._bf_0 &= 0xC000000000000000ui64;
v3->u3.ReferenceCount = 0;
if( v15 )
v4 = v16;
v3->PteLong = -8i64;
v3->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (__int64)v25;
v25 = v3;
}
else
{
v3->u3.ReferenceCount = 0;
v3->u2._bf_0 &= 0xC000000000000000ui64;
MiInsertPageInFreeOrZeroedList(v8, 2ui64, v9, v10, (UINT64)v4, (UINT64)v4);
v12 = v25;
++v19[0];
++*((_QWORD *)&v20 + 1);
}
_InterlockedAnd64(&v3->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
PfnDb = MmGetPfnDb();
v3 = bf_0;
}
while( bf_0 );
if( v5 )
{
v14 = (_QWORD *)(*(&stru_140C4DB30 + 22) + 176i64 * v24);
KeAcquireInStackQueuedSpinLock(v14 + 18, &LockHandle);
v4->_bf_0 = v14[19];
v14[17] += v5;
v14[19] = v12;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
MiReturnPoolCharges(v19, (unsigned int)(2 * v23));
}Referenced by:
MiAddExpansionNonPagedPool
MiClearNonPagedPtes
MiGetPoolPages
MiReturnExcessPoolCommit