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