MiFreeListPageContentsChanged
VOID __fastcall MiFreeListPageContentsChanged(UINT64 a1){
UINT64 v2;
_MMPFN *PfnDb;
INT64 v4;
__int64 v5;
int v6;
__int64 v7;
__int64 v8;
WORK_QUEUE_TYPE v9;
PVOID v10;
UINT64 v11;
unsigned __int64 v12;
volatile signed __int32 *v13;
int v14;
unsigned __int64 v15;
struct _KLOCK_QUEUE_HANDLE LockHandle;
*(_QWORD *)&LockHandle.OldIrql = 0i64;
v2 = 48 * a1;
PfnDb = MmGetPfnDb();
v4 = (INT64)PfnDb + v2;
LODWORD(v5) = MiSearchNumaNodeTable((PVOID)((v4 - (__int64)PfnDb) / 48));
v6 = *(_DWORD *)(v5 + 8);
v7 = ((unsigned int)MiGetPfnChannel(v4) << byte_140C4DBCD) | dword_140C4DC38 & (unsigned int)a1 | (v6 << byte_140C4DBCC);
v8 = *(_QWORD *)(*(_QWORD *)(qword_140C4E388 + 8 * ((*(_QWORD *)(v4 + 40) >> 39) & 0x3FFi64)) + 2184i64);
LockHandle.LockQueue.Next = 0i64;
LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(v8 + 8 * (v7 + 4 * (v7 + 1)));
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)LockHandle.LockQueue.Lock, v9, v10);
if( dword_140C4E40C == 1 )
{
v11 = a1 & 0x1F;
LOBYTE(v12) = 1;
v13 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (a1 >> 5));
if( v11 + 1 > 0x20 )
{
if( (a1 & 0x1F) == 0 )
goto LABEL_9;
v14 = a1 & 0x1F;
_InterlockedOr(v13++, ((1 << (32 - v14)) - 1) << v11);
v12 = 1i64 - (unsigned int)(32 - v14);
if( v12 >= 0x20 )
{
v15 = v12 >> 5;
v12 += -32i64 * (v12 >> 5);
do
{
*v13++ = -1;
--v15;
}
while( v15 );
}
if( v12 )
LABEL_9:
_InterlockedOr(v13, (1 << v12) - 1);
}
else
{
_InterlockedOr(v13, 1 << v11);
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
}Referenced by:
MiZeroPage