MiLargePagePromote

INT64 __fastcall MiLargePagePromote(INT64 a1, UINT64 a2, INT64 a3, _DWORD *a4){
  __int64 v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  int v7; 
  char v8; 
  char *v9; 
  unsigned int v10; 
  __int64 v11; 
  UINT8 v12; 
  unsigned int v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  unsigned int PfnChannel; 
  char v18; 
  char v19; 
  char *v20; 
  INT64 v21; 
  int v22; 
  __int64 v23; 
  _MI_NODE_INFORMATION *NodeInformation; 
  unsigned __int64 v25; 
  INT64 a1a; 
  int v27; 
  int v28; 
  __int16 v29; 
  int v30; 
  __int16 v31; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  unsigned int LargePageIndex; 
  int v35; 
  LargePageIndex = a2;
  v4 = (unsigned int)(a2 - 1);
  v30 = 0;
  v31 = 0;
  v5 = MiLargePageSizes[(unsigned int)a2];
  v6 = MiLargePageSizes[v4];
  v7 = 0;
  v25 = v6;
  v8 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  *a4 = 0;
  v35 = 0;
  v9 = (char *)MmGetPfnDb() + 48 * a1;
  v23 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v9 + 5) >> 39) & 0x3FFi64));
  MiPageToNode(48 * a1 / 48, (__int64)((unsigned __int128)(48 * a1 * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3);
  v11 = 4544i64 * v10;
  NodeInformation = (_MI_NODE_INFORMATION *)(v11 + *(_QWORD *)(v23 + 16));
  KeAcquireInStackQueuedSpinLockAtDpcLevel((UINT64 *)NodeInformation + 541, &LockHandle, v12);
  if( *((_QWORD *)NodeInformation + 544) )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    _InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
    return 0i64;
  }
  ++*(_DWORD *)(v11 + *(_QWORD *)(v23 + 16) + 4284);
  v14 = 0;
  v15 = v6 / v5;
  if( v15 )
  {
    v16 = 48 * v5;
    do
    {
      PfnChannel = MiGetPfnChannel((INT64)v9);
      MiUnlinkNodeLargePageHelper(NodeInformation, (_MMPFN *)v9, LargePageIndex, PfnChannel);
      v8 |= ((*((_DWORD *)v9 + 4) & 0x3E0) != 0i64) + 1;
      v7 |= 2 - MiIsFreeZeroPfnCold((INT64)v9);
      v18 = v9[39] & 0xFC;
      if( v14 )
      {
        v19 = v9[34] & 0xFE;
        v9[39] = v18;
        v9[34] = v19 | 6;
      }
      else
      {
        v9[39] = v18 | ~(_BYTE)v4 & 3;
      }
      ++v14;
      v9 += v16;
    }
    while( v14 < v15 );
  }
  v20 = &v9[-48 * v25];
  if( (v8 & 2) == 0 )
  {
    if( (v7 & 2) != 0 && (unsigned int)MiColdPageSizeSupported() )
    {
      *a4 = 1;
    }
    else
    {
      if( !(unsigned int)MiDetermineNewPfnHeatState(0i64) )
        goto LABEL_11;
      if( (v7 & 1) == 0 )
        goto LABEL_13;
    }
    v21 = 4294967293i64;
    goto LABEL_12;
  }
  v35 = 1;
LABEL_11:
  v21 = 0i64;
LABEL_12:
  *((_QWORD *)v20 + 2) = MiUpdatePageFileHighInPte(*((_QWORD *)v20 + 2), v21);
LABEL_13:
  a1a = a1;
  v27 = v35;
  v30 = v22;
  v31 = v22;
  v28 = 6;
  v29 = 258;
  MiInsertLargePageInNodeList((INT64)&a1a);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  return 1i64;
}

Referenced by:

MiCoalesceFreeLargePages