MiLargePagePromote

__int64 __fastcall MiLargePagePromote(__int64 a1, unsigned int a2, __int64 a3, _DWORD *a4){
  __int64 v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  char v7; 
  char v8; 
  _MMPFN *v9; 
  unsigned int v10; 
  __int64 v11; 
  unsigned int v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  unsigned int PfnChannel; 
  int v17; 
  unsigned __int8 v18; 
  char v19; 
  _MMPFN *v20; 
  INT64 v21; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v22; 
  int v23; 
  UINT64 v24; 
  __int64 v25; 
  _MI_NODE_INFORMATION *NodeInformation; 
  unsigned __int64 v27; 
  __int64 v28; 
  int v29; 
  int v30; 
  __int16 v31; 
  int v32; 
  __int16 v33; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  int v37; 

  v4 = a2 - 1;
  v32 = 0;
  v33 = 0;
  v5 = MiLargePageSizes[a2];
  v6 = MiLargePageSizes[v4];
  v7 = 0;
  v27 = v6;
  v8 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  *a4 = 0;
  v37 = 0;
  v9 = &MmGetPfnDb()[a1];
  v25 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v9->u4._bf_0 >> 39) & 0x3FF));
  MiPageToNode(48 * a1 / 48, (__int64)((unsigned __int128)(48 * a1 * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3);
  v11 = 4544i64 * v10;
  NodeInformation = (_MI_NODE_INFORMATION *)(v11 + *(_QWORD *)(v25 + 16));
  KeAcquireInStackQueuedSpinLockAtDpcLevel(&NodeInformation->LargePageLock, &LockHandle);
  if( NodeInformation->NumberOfPagesGoingBad )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    _InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    return 0i64;
  }
  ++*(_DWORD *)(v11 + *(_QWORD *)(v25 + 16) + 4284);
  v13 = 0;
  v14 = v6 / v5;
  if( v14 )
  {
    v15 = 48 * v5;
    do
    {
      PfnChannel = MiGetPfnChannel((INT64)v9);
      LODWORD(v24) = 10;
      MiUnlinkNodeLargePageHelper(NodeInformation, v9, a2, PfnChannel, v24);
      v8 |= ((*(_DWORD *)(&v9->3 + 1) & 0x3E0) != 0i64) + 1;
      LOBYTE(v17) = MiIsFreeZeroPfnCold((INT64)v9);
      v7 |= 2 - (v17 != 0);
      v18 = v9->ViewCount & 0xFC;
      if( v13 )
      {
        v19 = *(_BYTE *)(&v9->u3 + 1) & 0xFE;
        v9->ViewCount = v18;
        *((_BYTE *)&v9->u3 + 2) = v19 | 6;
      }
      else
      {
        v9->ViewCount = v18 | ~(_BYTE)v4 & 3;
      }
      ++v13;
      v9 = (_MMPFN *)((char *)v9 + v15);
    }
    while( v13 < v14 );
  }
  v20 = &v9[-v27];
  if( (v8 & 2) == 0 )
  {
    if( (v7 & 2) != 0 && MiColdPageSizeSupported() )
    {
      *a4 = 1;
    }
    else
    {
      if( !MiDetermineNewPfnHeatState(0i64) )
        goto LABEL_11;
      if( (v7 & 1) == 0 )
        goto LABEL_13;
    }
    v21 = 4294967293i64;
    goto LABEL_12;
  }
  v37 = 1;
LABEL_11:
  v21 = 0i64;
LABEL_12:
  LODWORD(v22.Long) = MiUpdatePageFileHighInPte(
                        v20->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0,
                        v21);
  v20->OriginalPte.u = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v22.Long;
LABEL_13:
  v28 = a1;
  v29 = v37;
  v32 = v23;
  v33 = v23;
  v30 = 6;
  v31 = 258;
  MiInsertLargePageInNodeList((__int64)&v28);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  return 1i64;
}

Referenced by:

MiCoalesceFreeLargePages