MiTransferPartitionPageRun

NTSTATUS __stdcall MiTransferPartitionPageRun(
        _MI_PARTITION *FromPartition,
        _MI_PARTITION *ToPartition,
        ULONG_PTR BasePage,
        UINT64 NumberOfPages,
        _KIRQL OldIrql){
  UINT64 v5; 
  unsigned __int16 PartitionId; 
  __int64 v9; 
  unsigned __int16 v10; 
  int v11; 
  _MMPFN *v12; 
  UINT8 v13; 
  unsigned __int64 EntireField; 
  unsigned __int64 v15; 
  unsigned int v16; 
  int v17; 
  INT64 *v18; 
  _MMPFN *v19; 
  int v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  struct _KPRCB *CurrentPrcb; 
  __int64 CachedResidentAvailable; 
  bool v25; 
  signed __int32 v26; 
  INT64 v27; 
  UINT64 v28; 
  _MMPFN *BaseResidentPage; 
  _MMPFN *v30; 
  __int64 PfnPageSizeIndex; 
  __int64 v32; 
  UINT64 v34; 
  UINT64 v35; 
  UINT64 v36; 
  unsigned __int16 v37; 
  unsigned __int16 v38; 
  int v39; 

  v5 = *(_QWORD *)&BasePage;
  if( ToPartition == &Irp )
    _InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 268, -(__int64)NumberOfPages);
  PartitionId = FromPartition->Core.PartitionId;
  v9 = 0i64;
  v10 = ToPartition->Core.PartitionId;
  v11 = 0;
  v37 = FromPartition->Core.PartitionId;
  v38 = ToPartition->Core.PartitionId;
  v36 = *(_QWORD *)&BasePage + NumberOfPages;
  if( *(_QWORD *)&BasePage != *(_QWORD *)&BasePage + NumberOfPages )
  {
    while( 1 )
    {
      v39 = v11 + 1;
      if( (((_BYTE)v11 + 1) & 0xF) == 0 && (FromPartition->Core.DynamicMemoryLock & 0x40000000) != 0 )
        break;
      if( (unsigned int)KeShouldYieldProcessor() )
        break;
      v12 = &MmGetPfnDb()[v5];
      v13 = MiLockPageInline(v12);
      EntireField = v12->u4.EntireField;
      v15 = v13;
      if( ((EntireField >> 39) & 0x3FF) == PartitionId )
      {
        v16 = *(_BYTE *)(&v12->u3 + 1) & 7;
        if( v16 == 5 )
        {
          LOBYTE(v17) = MiIsPageOnBadList((INT64)v12);
          if( !v17 )
          {
            LOBYTE(v20) = MiInvalidPteConforms(
                            v12->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0,
                            v18);
            if( !v20 )
              goto LABEL_55;
            if( *(&stru_140C4DB30 + 42) )
            {
              if( (v21 & 0x10) != 0 )
                v21 &= ~0x10ui64;
              else
                v21 &= ~*(&stru_140C4DB30 + 42);
            }
            if( HIDWORD(v21) != 4294967294 )
              goto LABEL_55;
            _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            __writecr8(v15);
            MiDrainZeroLookasides(FromPartition, 0i64, 0i64, 0i64);
            goto LABEL_51;
          }
          MiUnlinkPageFromBadList(v19);
          MiAcquireNonPagedResources(ToPartition, 1ui64);
          MiReturnCommit(FromPartition, 1ui64);
          v22 = 1i64;
          if( FromPartition != &Irp )
            goto LABEL_30;
          CurrentPrcb = KeGetCurrentPrcb();
          CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
          if( (_DWORD)CachedResidentAvailable == -1 )
            goto LABEL_30;
          do
          {
            if( (unsigned __int64)(CachedResidentAvailable + 1) > 0x100 )
              break;
            v26 = _InterlockedCompareExchange(
                    (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                    CachedResidentAvailable + 1,
                    CachedResidentAvailable);
            v25 = (_DWORD)CachedResidentAvailable == v26;
            CachedResidentAvailable = v26;
            if( v25 )
              goto LABEL_31;
          }
          while( v26 != -1 );
          if( (int)CachedResidentAvailable > 192
            && (_DWORD)CachedResidentAvailable != -1
            && (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
                                                    (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                                                    192,
                                                    CachedResidentAvailable) )
          {
            v22 = (int)CachedResidentAvailable - 192 + 1i64;
          }
          if( v22 )
LABEL_30:
            LOBYTE(v22) = _InterlockedExchangeAdd64(
                            (volatile signed __int64 *)&FromPartition->Vp.ResidentAvailablePages,
                            v22);
LABEL_31:
          v12->u4._bf_0 ^= (v12->u4._bf_0 ^ ((unsigned __int64)v10 << 39)) & 0x1FF8000000000i64;
          if( ToPartition != &Irp )
          {
            ++ToPartition->Vp.NumberOfPhysicalPages;
            ToPartition->Core.MemoryConfigurationChanged = 1;
          }
          --FromPartition->Vp.NumberOfPhysicalPages;
          FromPartition->Core.MemoryConfigurationChanged = 1;
          MiInsertPageInList(v12, 0x20ui64, v22);
          ++v9;
          _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          __writecr8(v15);
        }
        else if( (EntireField & 0x1000000000i64) != 0 )
        {
          BaseResidentPage = MiGetBaseResidentPage(v12);
          v16 = *(_BYTE *)(&BaseResidentPage->u3 + 1) & 7;
          PfnPageSizeIndex = (unsigned int)MiGetPfnPageSizeIndex((INT64)BaseResidentPage);
          if( v30 != v12 )
            _InterlockedAnd64(&v30->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          if( v16 > 1 )
          {
LABEL_55:
            MiUnlockPage(v12, v15);
            KeBugCheckEx(0x1Au, (PVOID)0x41000, (PVOID)v5, (PVOID)v16, 0i64);
          }
          _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          __writecr8(v15);
          v32 = MiLargePageSizes[PfnPageSizeIndex];
          if( ToPartition != &Irp )
          {
            ToPartition->Vp.NumberOfPhysicalPages += v32;
            ToPartition->Core.MemoryConfigurationChanged = 1;
          }
          if( MiMoveLargeFreePage(v5, (unsigned int)PfnPageSizeIndex, FromPartition, (PVOID *)ToPartition) == 1 )
          {
            v5 += v32;
            FromPartition->Core.MemoryConfigurationChanged = 1;
            v9 += v32;
            FromPartition->Vp.NumberOfPhysicalPages -= v32;
          }
          else if( ToPartition != &Irp )
          {
            ToPartition->Vp.NumberOfPhysicalPages -= v32;
            ToPartition->Core.MemoryConfigurationChanged = 1;
          }
          v10 = v38;
LABEL_51:
          --v5;
        }
        else
        {
          if( v16 > 1 )
            goto LABEL_55;
          MiUnlinkFreeOrZeroedPage(v5, 0i64, 0i64);
          if( ToPartition != &Irp )
          {
            ++ToPartition->Vp.NumberOfPhysicalPages;
            ToPartition->Core.MemoryConfigurationChanged = 1;
          }
          --FromPartition->Vp.NumberOfPhysicalPages;
          FromPartition->Core.MemoryConfigurationChanged = 1;
          if( (*((_BYTE *)&v12->u3 + 3) & 0x40) != 0 )
            MiMoveBadPageCrossPartition((INT64)v12, (INT64)FromPartition, (UINT64 *)&ToPartition->Core.PartitionId);
          v12->u4._bf_0 ^= (v12->u4._bf_0 ^ ((unsigned __int64)v10 << 39)) & 0x1FF8000000000i64;
          MiInsertPageInFreeOrZeroedList(
            v5,
            (unsigned int)((*(_DWORD *)(&v12->3 + 1) & 0x3E0) != 0i64) + 1,
            v27,
            v28,
            v34,
            v35);
          _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          __writecr8(v15);
          ++v9;
        }
LABEL_52:
        PartitionId = v37;
        goto LABEL_53;
      }
      _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v13);
LABEL_53:
      v11 = v39;
      if( ++v5 == v36 )
        return v9;
    }
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&FromPartition->Core.DynamicMemoryLock);
    __writecr8((unsigned __int8)OldIrql);
    --v5;
    LOBYTE(OldIrql) = ExAcquireSpinLockExclusive((INT64 *)&FromPartition->Core.DynamicMemoryLock);
    goto LABEL_52;
  }
  return v9;
}

Referenced by:

MiActOnPartitionNodePages