MiCoalesceFreeLargePages

VOID __stdcall MiCoalesceFreeLargePages(INT64 rcx0, INT64 rdx0, UINT64 a3){
  unsigned __int64 v3; 
  unsigned __int64 v4; 
  __int64 v5; 
  INT64 v6; 
  INT64 v7; 
  UINT8 v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  INT64 v11; 
  int v12; 
  int v13; 
  unsigned int v14; 
  __int128 *v15; 
  int v16; 
  _MI_PFN_CACHE_ATTRIBUTE v17; 
  __int64 v18; 
  unsigned int v19; 
  _MI_PFN_CACHE_ATTRIBUTE v20; 
  unsigned int v21; 
  unsigned int v22; 
  _MMPFN *v23; 
  __int64 v24; 
  INT64 v25; 
  INT64 v26; 
  int v27; 
  int v28; 
  __int64 v29; 
  unsigned __int64 j; 
  unsigned int LargePageIndex; 
  int v33; 
  INT64 i; 
  INT64 v35; 
  INT64 v36; 
  INT64 CurrentThread; 
  __int128 v38; 

  LargePageIndex = a3;
  v36 = rcx0;
  v3 = MiLargePageSizes[(unsigned int)a3];
  v4 = MiLargePageSizes[(unsigned int)(a3 - 1)];
  LODWORD(v35) = a3 - 1;
  v38 = 0i64;
  v5 = (__int64)&MmGetPfnDb()[rdx0];
  v6 = rdx0;
  v33 = 0;
  v7 = v5;
  i = v5;
  v8 = 17;
  CurrentThread = (INT64)KeGetCurrentThread();
  --*(_WORD *)(CurrentThread + 486);
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(rcx0 + 192), 0i64);
  v9 = 0;
  v10 = v4 / v3;
  if( v4 / v3 )
  {
    v11 = v36;
    do
    {
      MiIsPfn(v6);
      if( !v12 )
        break;
      LOBYTE(v13) = MiLargePfnPromoteCandidate(v11, v7);
      if( !v13 )
        break;
      ++v9;
      v6 += v3;
      ++*((_DWORD *)&v38 + ((unsigned __int64)*(unsigned __int8 *)(v7 + 34) >> 6));
      v7 += 48 * v3;
    }
    while( v9 < v10 );
    v5 = i;
    v8 = 17;
  }
  if( v9 == v10 )
  {
    v14 = 0;
    v15 = &v38;
    v16 = 0;
    v17 = MiCached;
    LODWORD(v18) = 0;
    do
    {
      v19 = *(_DWORD *)v15;
      v20 = v17;
      v21 = v14;
      if( *(_DWORD *)v15 && v14 )
        v16 = 1;
      v17 = (int)v18;
      v14 = *(_DWORD *)v15;
      if( v21 >= v19 )
        v17 = v20;
      v18 = (unsigned int)(v18 + 1);
      v15 = (__int128 *)((char *)v15 + 4);
      if( v21 >= v19 )
        v14 = v21;
    }
    while( (unsigned int)v18 < 4 );
    if( v16 && (v22 = 0, v23 = (_MMPFN *)v5, v10) )
    {
      while( MiChangePageAttributeLargeFreeZeroPage(v23, LargePageIndex, v17) )
      {
        ++v22;
        v23 += v3;
        if( v22 >= v10 )
          goto LABEL_21;
      }
    }
    else
    {
LABEL_21:
      v24 = 0i64;
      v25 = rdx0;
      v26 = v5;
      for( i = rdx0; (unsigned int)v24 < v10; i += v3 )
      {
        MiIsPfn(v25);
        if( !v27 )
          break;
        if( v26 == v5 )
        {
          v8 = MiLockPageInline((_MMPFN *)v26);
        }
        else if( _interlockedbittestandset64((volatile signed __int32 *)(v26 + 24), 0x3Fui64) )
        {
          break;
        }
        LOBYTE(v28) = MiLargePfnPromoteCandidate(v36, v26);
        if( !v28 || *(unsigned __int8 *)(v26 + 34) >> 6 != v17 )
        {
          _InterlockedAnd64((volatile signed __int64 *)(v26 + 24), 0x7FFFFFFFFFFFFFFFui64);
          if( v26 == v5 )
            __writecr8(v8);
          break;
        }
        v24 = (unsigned int)(v24 + 1);
        v26 += 48 * v3;
        v25 = v3 + i;
      }
      if( (unsigned int)v24 == v10 )
      {
        MiLargePagePromote(rdx0, LargePageIndex, v18, &v33);
        v29 = v5 + 48 * v3;
      }
      else
      {
        v29 = v5 & -(__int64)((_DWORD)v24 != 0);
      }
      if( (_DWORD)v24 )
      {
        for( j = v5 + v3 * (48 * v24 - 48); j != v29; j -= 48 * v3 )
          _InterlockedAnd64((volatile signed __int64 *)(j + 24), 0x7FFFFFFFFFFFFFFFui64);
        _InterlockedAnd64((volatile signed __int64 *)(j + 24), 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v8);
      }
      if( v33 )
        MiChangePageHeatImmediate(rdx0, (unsigned int)v35, 0i64);
    }
  }
  MiUnlockDynamicMemoryShared(v36, CurrentThread);
}

Referenced by:

MiRebuildLargeZeroPage