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