MiTransferPartitionPageRun
UINT64 __stdcall MiTransferPartitionPageRun(
_MI_PARTITION *FromPartition,
_MI_PARTITION *ToPartition,
UINT64 BasePage,
UINT64 NumberOfPages,
UINT8 OldIrql){
ULONG_PTR v5;
__int16 v8;
UINT64 v9;
unsigned __int16 v10;
int v11;
char *v12;
unsigned __int8 v13;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned int v16;
_RTL_ATOM_TABLE *v17;
unsigned __int64 v18;
unsigned __int64 v19;
struct _KPRCB *CurrentPrcb;
__int64 v21;
bool v22;
signed __int32 v23;
_MMPFN *BaseResidentPage;
__int64 v25;
__int64 PfnPageSizeIndex;
__int64 v27;
UINT64 v29;
__int16 v30;
unsigned __int16 v31;
int v32;
v5 = BasePage;
if( ToPartition == (_MI_PARTITION *)&MiSystemPartition )
_InterlockedExchangeAdd64(&qword_140C4E390, -(__int64)NumberOfPages);
v8 = *(_WORD *)FromPartition;
v9 = 0i64;
v10 = *(_WORD *)ToPartition;
v11 = 0;
v30 = *(_WORD *)FromPartition;
v31 = *(_WORD *)ToPartition;
v29 = BasePage + NumberOfPages;
if( BasePage != BasePage + NumberOfPages )
{
while( 1 )
{
v32 = v11 + 1;
if( (((_BYTE)v11 + 1) & 0xF) == 0 && (*((_DWORD *)FromPartition + 50) & 0x40000000) != 0 )
break;
if( KeShouldYieldProcessor() )
break;
v12 = (char *)MmGetPfnDb() + 48 * v5;
v13 = MiLockPageInline((INT64)v12);
v14 = *((_QWORD *)v12 + 5);
v15 = v13;
if( ((v14 >> 39) & 0x3FF) == v8 )
{
v16 = v12[34] & 7;
if( v16 == 5 )
{
if( !MiIsPageOnBadList((INT64)v12) )
{
if( !MiInvalidPteConforms(*((_QWORD *)v12 + 2)) )
goto LABEL_55;
if( qword_140C4DC80 )
{
if( (v18 & 0x10) != 0 )
v18 &= ~0x10ui64;
else
v18 &= ~qword_140C4DC80;
}
if( HIDWORD(v18) != 4294967294 )
goto LABEL_55;
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v15);
MiDrainZeroLookasides(FromPartition, 0i64, 0i64, 0i64);
goto LABEL_51;
}
MiUnlinkPageFromBadList(v17);
MiAcquireNonPagedResources(ToPartition, 1ui64);
MiReturnCommit(FromPartition, 1ui64);
v19 = 1i64;
if( FromPartition != (_MI_PARTITION *)&MiSystemPartition )
goto LABEL_30;
CurrentPrcb = KeGetCurrentPrcb();
v21 = *((int *)CurrentPrcb + 8391);
if( (_DWORD)v21 == -1 )
goto LABEL_30;
do
{
if( (unsigned __int64)(v21 + 1) > 0x100 )
break;
v23 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v21 + 1, v21);
v22 = (_DWORD)v21 == v23;
v21 = v23;
if( v22 )
goto LABEL_31;
}
while( v23 != -1 );
if( (int)v21 > 192
&& (_DWORD)v21 != -1
&& (_DWORD)v21 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v21) )
{
v19 = (int)v21 - 192 + 1i64;
}
if( v19 )
LABEL_30:
_InterlockedExchangeAdd64((volatile signed __int64 *)FromPartition + 896, v19);
LABEL_31:
*((_QWORD *)v12 + 5) ^= (*((_QWORD *)v12 + 5) ^ ((unsigned __int64)v10 << 39)) & 0x1FF8000000000i64;
if( ToPartition != (_MI_PARTITION *)&MiSystemPartition )
{
++*((_QWORD *)ToPartition + 866);
*((_BYTE *)ToPartition + 12) = 1;
}
--*((_QWORD *)FromPartition + 866);
*((_BYTE *)FromPartition + 12) = 1;
MiInsertPageInList((_MMPFN *)v12, 0x20ui64);
++v9;
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v15);
}
else if( (v14 & 0x1000000000i64) != 0 )
{
BaseResidentPage = MiGetBaseResidentPage((_MMPFN *)v12);
v16 = *((_BYTE *)BaseResidentPage + 34) & 7;
PfnPageSizeIndex = (unsigned int)MiGetPfnPageSizeIndex((INT64)BaseResidentPage);
if( (char *)v25 != v12 )
_InterlockedAnd64((volatile signed __int64 *)(v25 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( v16 > 1 )
{
LABEL_55:
MiUnlockPage((_MMPFN *)v12, v15);
KeBugCheckEx(0x1Au, 0x41000ui64, v5, v16, 0i64);
}
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v15);
v27 = MiLargePageSizes[PfnPageSizeIndex];
if( ToPartition != (_MI_PARTITION *)&MiSystemPartition )
{
*((_QWORD *)ToPartition + 866) += v27;
*((_BYTE *)ToPartition + 12) = 1;
}
if( (unsigned int)MiMoveLargeFreePage(v5, (unsigned int)PfnPageSizeIndex, FromPartition) == 1 )
{
v5 += v27;
*((_BYTE *)FromPartition + 12) = 1;
v9 += v27;
*((_QWORD *)FromPartition + 866) -= v27;
}
else if( ToPartition != (_MI_PARTITION *)&MiSystemPartition )
{
*((_QWORD *)ToPartition + 866) -= v27;
*((_BYTE *)ToPartition + 12) = 1;
}
v10 = v31;
LABEL_51:
--v5;
}
else
{
if( v16 > 1 )
goto LABEL_55;
MiUnlinkFreeOrZeroedPage(v5, 0i64, 0i64);
if( ToPartition != (_MI_PARTITION *)&MiSystemPartition )
{
++*((_QWORD *)ToPartition + 866);
*((_BYTE *)ToPartition + 12) = 1;
}
--*((_QWORD *)FromPartition + 866);
*((_BYTE *)FromPartition + 12) = 1;
if( (v12[35] & 0x40) != 0 )
MiMoveBadPageCrossPartition((INT64)v12, (INT64)FromPartition, (UINT64 *)ToPartition);
*((_QWORD *)v12 + 5) ^= (*((_QWORD *)v12 + 5) ^ ((unsigned __int64)v10 << 39)) & 0x1FF8000000000i64;
MiInsertPageInFreeOrZeroedList(v5, (unsigned int)((*((_DWORD *)v12 + 4) & 0x3E0) != 0i64) + 1);
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v15);
++v9;
}
LABEL_52:
v8 = v30;
goto LABEL_53;
}
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v13);
LABEL_53:
v11 = v32;
if( ++v5 == v29 )
return v9;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)FromPartition + 25);
__writecr8(OldIrql);
--v5;
OldIrql = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)FromPartition + 50);
goto LABEL_52;
}
return v9;
}Referenced by:
MiActOnPartitionNodePages