MiInsertProtectedStandbyPage

VOID __fastcall MiInsertProtectedStandbyPage(INT64 a1, UINT64 a2){
  _MMPFN *PfnDb; 
  unsigned __int64 v5; 
  UINT8 *v6; 
  __int64 v7; 
  __int64 v8; 
  UINT64 v9; 
  __int64 v10; 
  __int64 v11; 
  INT64 v12; 
  KSPIN_LOCK_QUEUE *v13; 
  int v14; 
  WORK_QUEUE_TYPE v15; 
  void *v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  struct _KEVENT *v20; 
  unsigned __int64 v21; 
  char v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  unsigned __int64 *v27; 
  _KSPIN_LOCK_QUEUE *volatile Next; 
  int v29[8]; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  _BYTE v31[64]; 
  PfnDb = MmGetPfnDb();
  memset(&LockHandle, 0, sizeof(LockHandle));
  v5 = *(_QWORD *)(a2 + 40);
  v6 = (UINT8 *)(a2 - (_QWORD)PfnDb);
  v7 = 0x2AAAAAAAAAAAAAABi64;
  v8 = (unsigned __int128)((__int64)(a2 - (_QWORD)PfnDb) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64;
  v9 = ((unsigned __int64)v8 >> 63) + (v8 >> 3);
  if( (v5 & 0x2000000000000i64) != 0 || byte_140C51D9E && _bittest64((const signed __int64 *)qword_140C522C8, v9 >> 9) )
    goto LABEL_13;
  if( !a1 )
    goto LABEL_13;
  v6 = (UINT8 *)*(unsigned __int8 *)(a2 + 35);
  if( ((unsigned __int8)v6 & 0x10) != 0 )
    goto LABEL_13;
  if( ((unsigned __int8)v6 & 0x40) != 0 )
    goto LABEL_13;
  v10 = *(_QWORD *)(qword_140C4E388 + 8 * ((v5 >> 39) & 0x3FF));
  if( *(_QWORD *)(qword_140C4E388 + 8 * ((*(_QWORD *)(a1 + 40) >> 39) & 0x3FFi64)) != v10
    || ((unsigned __int8)v6 & 7u) >= 5 )
  {
    goto LABEL_13;
  }
  LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(v10 + 2664);
  LockHandle.LockQueue.Next = 0i64;
  v11 = *((_QWORD *)KeGetCurrentPrcb() + 4247);
  v12 = (a1 - (__int64)PfnDb) / 48;
  v13 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)(v10 + 2664), (__int64)&LockHandle);
  if( v13 )
    KxWaitForLockOwnerShip(&LockHandle.LockQueue, v13);
  if( (*(_BYTE *)(a1 + 35) & 8) == 0 )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
LABEL_13:
    MiPfnReferenceCountIsZero((_MMPFN *)a2, v9, v6);
    return;
  }
  *(_BYTE *)(a2 + 35) |= 8u;
  LOBYTE(v14) = MI_PFN_IS_PROTO((UNICODE_STRING *)a2, (UNICODE_STRING *)v13, v11, (PWCHAR)v7);
  v17 = 4352i64;
  if( !v14 )
    v17 = 5056i64;
  _InterlockedIncrement64((volatile signed __int64 *)(v17 + v10));
  memset(v31, 0, 24);
  v18 = _InterlockedIncrement64((volatile signed __int64 *)(v10 + 7104));
  if( v18 <= 0x420 )
  {
    switch( v18 )
    {
      case 0xA0ui64:
        v19 = 4968i64;
LABEL_23:
        *(_QWORD *)v31 = 0i64;
        *(_QWORD *)&v31[8] = v10 + 4928;
        v20 = (struct _KEVENT *)(v10 + v19);
        KxAcquireQueuedSpinLock((PIO_WORKITEM)v31, (PIO_WORKITEM_ROUTINE)(v10 + 4928), v15, v16);
        KeSetEvent(v20, 0);
        ++v20[1].Header.LockNV;
        KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)v31);
        break;
      case 0x420ui64:
        v19 = 5000i64;
        goto LABEL_23;
      case 0x22ui64:
        v19 = 4936i64;
        goto LABEL_23;
    }
  }
  v21 = v18 - 1;
  if( v21 == *(_QWORD *)(v10 + 5168) || v21 == *(_QWORD *)(v10 + 5176) )
    MiUpdateAvailableEvents((_MI_PARTITION *)v10);
  _InterlockedOr(v29, 0);
  v22 = *(_BYTE *)(a2 + 34);
  *(_QWORD *)(a2 + 24) ^= (*(_QWORD *)(a2 + 24) ^ ((unsigned __int64)(unsigned int)KiTbFlushTimeStamp << 56)) & 0xF00000000000000i64;
  *(_BYTE *)(a2 + 34) = v22 & 0xF8 | 2;
  v23 = *(_QWORD *)(a1 + 16);
  if( qword_140C4DC80 && (v23 & 0x10) == 0 )
    v23 &= ~qword_140C4DC80;
  v24 = *(_QWORD *)(a1 + 40) & 0xFFFFFFFFFi64;
  v25 = 0xFFFFFFF000000000ui64;
  *(_QWORD *)a2 ^= (v12 ^ *(_QWORD *)a2) & 0xFFFFFFFFFi64;
  v26 = v9 & 0xFFFFFFFFFi64;
  *(_QWORD *)(a2 + 24) = v24 | *(_QWORD *)(a2 + 24) & 0xFFFFFFF000000000ui64;
  if( ((v23 >> 12) & 0xFFFFFFFFFi64) == v12 )
  {
    *(_QWORD *)(a1 + 16) = MiMakeTransitionPte(v9, 4ui64, v26);
  }
  else
  {
    v27 = (unsigned __int64 *)((char *)MmGetPfnDb() + 48 * v24);
    *v27 = v26 | *v27 & 0xFFFFFFF000000000ui64;
  }
  *(_QWORD *)(a1 + 40) = v26 | v25 & *(_QWORD *)(a1 + 40);
  MiInsertNumaStandbyPage((_MMPFN *)a2);
  ++*(_QWORD *)(v10 + 2632);
  _m_prefetchw(&LockHandle);
  Next = LockHandle.LockQueue.Next;
  if( !LockHandle.LockQueue.Next )
  {
    if( (struct _KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                         (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                         0i64,
                                         (signed __int64)&LockHandle) == &LockHandle )
      return;
    Next = KxWaitForLockChainValid(&LockHandle.LockQueue);
  }
  LockHandle.LockQueue.Next = 0i64;
  _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
}

Referenced by:

MiDeletePteRun
MiInsertAndUnlockStandbyPages