MiTradePage
INT64 __fastcall MiTradePage(INT64 a1, ULONG_PTR BugCheckParameter2){
unsigned int v2;
_MI_PARTITION *v4;
ULONG_PTR v6;
char *v7;
__int64 CurrentIrql;
UINT8 v9;
char *v10;
unsigned __int64 v11;
int v12;
unsigned int v13;
_MMPFN *BaseResidentPage;
unsigned int PfnPageSizeIndex;
__int64 v16;
unsigned __int64 v17;
__int64 v18;
int v19;
unsigned int v20;
unsigned int v21;
unsigned __int64 v22;
char v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
UINT64 v27;
UINT64 v28;
INT64 v29;
__int64 v30;
UINT8 v31;
unsigned int *v32;
char v33;
int v34;
bool v35;
UINT64 active;
UNICODE_STRING *v37;
UINT8 v38;
WCHAR *v39;
int v40;
__int64 v41;
int v42;
INT64 v43;
INT64 result;
_MMPFN *v45;
__int64 v46;
int v47[8];
INT64 a5;
int v49;
_DWORD v50[3];
UINT64 PageFrameIndex;
ULONG_PTR v52;
INT64 a6;
char *v54;
INT64 a3;
int v56;
int v57;
INT64 a4;
UINT64 SpinCount;
v2 = *(_DWORD *)(a1 + 24);
v4 = *(_MI_PARTITION **)a1;
a3 = *(_QWORD *)(a1 + 8);
v50[0] = *(_DWORD *)(a1 + 32);
v49 = 0;
v56 = v2 & 0x400000;
v57 = 0;
*(_QWORD *)(a1 + 48) = 0i64;
PageFrameIndex = (UINT64)v4;
if( (v2 & 0x400000) != 0 )
LODWORD(a4) = *(_DWORD *)(a1 + 28);
else
LODWORD(a4) = -1;
v54 = 0i64;
v6 = 48 * BugCheckParameter2;
v52 = 48 * BugCheckParameter2;
a6 = -1i64;
v7 = (char *)MmGetPfnDb() + 48 * BugCheckParameter2;
CurrentIrql = KeGetCurrentIrql();
*(_QWORD *)&v50[1] = CurrentIrql;
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v7 + 3) < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) );
LOBYTE(CurrentIrql) = v50[1];
v6 = v52;
}
v9 = CurrentIrql;
while( 1 )
{
while( 1 )
{
while( 1 )
{
v10 = (char *)MmGetPfnDb() + 40;
if( BugCheckParameter2 > 0xFFFFFFFFFi64 || (*(_QWORD *)&v10[v6] & 0x4000000000000i64) == 0 )
goto LABEL_113;
v11 = *((_QWORD *)v7 + 5);
if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((v11 >> 39) & 0x3FF)) != v4 )
{
v46 = (unsigned int)MiPfnLargeBitSet((UINT64)&MiSystemPartition);
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
v29 = 0i64;
if( (_DWORD)v46 != -1 )
*(_QWORD *)(a1 + 48) = MiLargePageSizes[v46];
goto LABEL_99;
}
v12 = v7[34] & 7;
v13 = -1;
if( (v11 & 0x1000000000i64) != 0 )
{
BaseResidentPage = MiGetBaseResidentPage((_MMPFN *)v7);
PfnPageSizeIndex = MiGetPfnPageSizeIndex((INT64)BaseResidentPage);
v13 = PfnPageSizeIndex;
if( (char *)v16 != v7 )
_InterlockedAnd64((volatile signed __int64 *)(v16 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( v12 == 6 )
{
*(_QWORD *)(a1 + 48) = MiLargePageSizes[PfnPageSizeIndex];
LABEL_113:
v29 = 0i64;
LABEL_114:
if( v9 != 17 )
{
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
}
goto LABEL_99;
}
}
if( v12 != 5 )
break;
if( MiIsPageOnBadList((INT64)v7) )
goto LABEL_113;
if( v13 != -1 )
break;
if( !MiInvalidPteConforms(*((_QWORD *)v7 + 2)) )
goto LABEL_113;
if( qword_140C4DC80 )
{
if( (v17 & 0x10) != 0 )
v17 &= ~0x10ui64;
else
v17 &= ~qword_140C4DC80;
}
if( HIDWORD(v17) != 4294967294 || v54 == v7 )
goto LABEL_113;
LODWORD(v18) = MiSearchNumaNodeTable((PVOID)((v7 - (char *)MmGetPfnDb()) / 48));
v19 = *(_DWORD *)(v18 + 8);
v20 = ((unsigned int)MiGetPfnChannel((INT64)v7) << byte_140C4DBCD) | dword_140C4DC38 & BugCheckParameter2 | (v19 << byte_140C4DBCC);
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
MiDrainZeroLookasides(v4, (_MMPFN *)v7, *(_QWORD *)(a1 + 16), v20);
v54 = v7;
MiLockPageInline((INT64)v7);
v6 = v52;
}
if( MiIsPfnFileOnly((INT64)v7) || MiIsPfnFromSlabAllocation((INT64)v7) )
goto LABEL_113;
if( v21 > 1 )
break;
if( v13 == -1 )
{
if( !v56 && !MiUnlinkFreeOrZeroedPage(BugCheckParameter2, 0i64, 0i64) )
{
LABEL_93:
MiReturnFreeZeroPage((INT64)v7);
goto LABEL_113;
}
v29 = 1i64;
v43 = 0i64;
LABEL_95:
MiAddMdlPageToTradeBlock(a1, BugCheckParameter2, v43);
goto LABEL_114;
}
v25 = v13;
v26 = MiLargePageSizes[v13];
if( (v2 & 0x2000000) != 0 && v26 >= 0x200 || (v2 & 0x1000000) != 0 && v26 == 16 )
goto LABEL_113;
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, v22);
__writecr8(v9);
if( v56 || BugCheckParameter2 != (BugCheckParameter2 & ~(v26 - 1)) || *(_QWORD *)(a1 + 16) < v26 )
{
v27 = PageFrameIndex;
}
else
{
v27 = PageFrameIndex;
v28 = v26 + BugCheckParameter2 - 1;
if( v28 <= *(_QWORD *)(a1 + 56) )
{
LODWORD(a5) = v2;
if( (unsigned int)MiLargeFreePageToMdl(PageFrameIndex, v28, (UINT64 *)v13) == 1 )
{
v29 = v26;
if( *(_QWORD *)(a1 + 64) && MiPfnZeroingNeeded((INT64)v7, v50[0]) )
*(_QWORD *)(v30 + 24) = 1i64;
goto LABEL_99;
}
}
}
a5 = (INT64)&v57;
if( !(unsigned int)MiDemoteLargeFreePage(v27, BugCheckParameter2) && !v57 )
{
v29 = 0i64;
if( !MiLargePageMovesInProgress((INT64)v7) )
*(_QWORD *)(a1 + 48) = MiLargePageSizes[v25];
goto LABEL_99;
}
v31 = MiLockPageInline((INT64)v7);
v4 = (_MI_PARTITION *)PageFrameIndex;
LABEL_87:
v9 = v31;
v6 = v52;
}
v32 = (unsigned int *)a3;
if( !*(_QWORD *)(a3 + 16) )
break;
v33 = v7[35];
if( v33 < 0 )
break;
if( v21 > 4 )
{
v35 = v21 == 6;
goto LABEL_68;
}
if( (v2 & 0x4000000) == 0 && (v24 & *((_QWORD *)v7 + 5)) == 0 && *((__int64 *)v7 + 1) > 0
|| (v2 & 0x200000) != 0 && ((v33 & 0x40) != 0 || MiIsPageOnBadList((INT64)v7)) )
{
goto LABEL_113;
}
LODWORD(a5) = v2;
v34 = MiTradeTransitionPage((UINT64)v7, v9, (INT64)v32, (unsigned int)a4, a5, (INT64)&a6);
if( v34 == 3 )
{
if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64)) != v4 )
goto LABEL_97;
if( !v56 )
goto LABEL_106;
v45 = (_MMPFN *)v7;
goto LABEL_102;
}
if( v34 != 2 )
goto LABEL_98;
LABEL_59:
v9 = MiLockPageInline((INT64)v7);
v6 = v52;
}
if( v21 == 2 )
{
if( *((_WORD *)v7 + 16) )
goto LABEL_113;
if( !(unsigned int)MiReuseStandbyPage((UINT64)v7) )
goto LABEL_93;
v29 = 1i64;
v43 = 1i64;
goto LABEL_95;
}
if( v21 != 6
|| (v7[34] & 0x10) != 0
|| *((_WORD *)v7 + 16) != 1
|| ((*((_QWORD *)v7 + 5) >> 60) & 7) == 2
|| (*v7 & 1) == 0 )
{
goto LABEL_113;
}
v33 = v7[35];
v35 = (v33 & 8) == 0;
LABEL_68:
if( !v35 || (v2 & 0x200000) != 0 && ((v33 & 0x40) != 0 || MiIsPageOnBadList((INT64)v7)) )
goto LABEL_113;
if( ((*((_QWORD *)v7 + 5) >> 60) & 7) == 2 )
{
if( v23 == 2 || (v2 & 8) != 0 )
goto LABEL_113;
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, v22);
__writecr8(v9);
if( (unsigned int)MiSwapStackPage((__int64)v4, (__int64)v7, v32, *(_DWORD *)(a1 + 28), v2, &a6, &v49) )
goto LABEL_104;
if( ((*((_QWORD *)v7 + 5) >> 60) & 7) == 2 )
goto LABEL_98;
goto LABEL_59;
}
active = MiActivePageClaimCandidate(v4, (_MMPFN *)v7, 1ui64, v22);
if( active )
{
*(_QWORD *)(a1 + 48) = active;
goto LABEL_113;
}
if( LOBYTE(v50[1]) == 2 || (v2 & 8) != 0 )
goto LABEL_113;
LOBYTE(v40) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, v37, v38, v39);
if( v40 )
v42 = MiTrimSharedPage(v41, v9, v2);
else
v42 = MiStealPage(v41, v9, v2, (_DWORD)v32, *(_DWORD *)(a1 + 28), (__int64)&a6);
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
if( !v42 )
goto LABEL_98;
if( v42 == 2 )
{
v31 = MiLockPageInline((INT64)v7);
goto LABEL_87;
}
if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64)) != v4 )
{
LABEL_97:
MiLockAndInsertPageInFreeList((_MMPFN *)v7);
LABEL_98:
v29 = 0i64;
goto LABEL_99;
}
LABEL_104:
*((_QWORD *)v7 + 2) = ZeroPte;
MiSetOriginalPtePfnFromFreeList((UINT64 *)v7 + 2);
v45 = (_MMPFN *)v7;
if( v56 )
{
LABEL_102:
MiLockAndInsertPageInFreeList(v45);
goto LABEL_106;
}
_InterlockedOr(v47, 0);
MiSetPfnTbFlushStamp((_MMPFN *)v7, (unsigned int)KiTbFlushTimeStamp, 0i64);
LABEL_106:
v29 = 1i64;
MiAddMdlPageToTradeBlock(a1, BugCheckParameter2, 1i64);
LABEL_99:
result = v29;
*(_QWORD *)(a1 + 40) = a6;
return result;
}Referenced by:
MiClaimPhysicalRun