MiMoveLargeFreePage

UINT64 __stdcall MiMoveLargeFreePage(UINT64 PageFrameIndex, UINT64 LargePageIndex, _MI_PARTITION *FromPartition){
  UINT64 *v3; 
  unsigned int v5; 
  UINT64 *v6; 
  __int64 v7; 
  UINT64 v8; 
  UINT64 result; 
  char *v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  _DWORD SpinCount[7]; 
  v5 = 0;
  v6 = v3;
  v7 = MiLargePageSizes[(unsigned int)LargePageIndex];
  v8 = PageFrameIndex & ~(v7 - 1);
  result = MiTryUnlinkNodeLargePage((UINT64)FromPartition, v8);
  if( (_DWORD)result )
  {
    v10 = (char *)MmGetPfnDb() + 48 * v8;
    v11 = *((_QWORD *)v10 + 2);
    *(_QWORD *)&SpinCount[1] = 0i64;
    *(_QWORD *)&SpinCount[5] = (unsigned __int8)MiLockPageInline((INT64)v10);
    *(_QWORD *)&SpinCount[3] = (v11 & 0x3E0) != 0;
    v12 = (*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64;
    *(_QWORD *)&SpinCount[1] = v8;
    if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * v12) == FromPartition )
    {
      _InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
      v13 = (unsigned __int64)&v10[48 * v7 - 48];
      if( v13 >= (unsigned __int64)v10 )
      {
        v14 = v13 + 24;
        v15 = (unsigned __int64)(*(_WORD *)v6 & 0x3FF) << 39;
        do
        {
          SpinCount[0] = 0;
          while( _interlockedbittestandset64((volatile signed __int32 *)v14, 0x3Fui64) )
          {
            do
              KeYieldProcessorEx((UINT64 *)SpinCount);
            while( *(__int64 *)v14 < 0 );
          }
          if( (*(_BYTE *)(v14 + 11) & 0x40) != 0 )
            MiMoveBadPageCrossPartition(v13, (INT64)FromPartition, v6);
          *(_QWORD *)(v14 + 16) = v15 | *(_QWORD *)(v14 + 16) & 0xFFFE007FFFFFFFFFui64;
          if( (char *)v13 != v10 )
            _InterlockedAnd64((volatile signed __int64 *)v14, 0x7FFFFFFFFFFFFFFFui64);
          v13 -= 48i64;
          v14 -= 48i64;
        }
        while( v13 >= (unsigned __int64)v10 );
      }
      v5 = 1;
    }
    MiInsertLargePageInNodeList((INT64)&SpinCount[1]);
    return v5;
  }
  return result;
}

Referenced by:

MiTransferPartitionPageRun