MiTradePage
NTSTATUS __stdcall MiTradePage(INT64 a1, ULONG_PTR BugCheckParameter2){
unsigned int v2;
UINT64 v3;
_MI_PARTITION *v4;
__int64 v6;
_MMPFN *v7;
__int64 CurrentIrql;
UINT8 v9;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
unsigned __int64 EntireField;
int v12;
unsigned int v13;
_MMPFN *BaseResidentPage;
NTSTATUS PfnPageSizeIndex;
_MMPFN *v16;
int v17;
INT64 *v18;
int v19;
unsigned __int64 v20;
__int64 v21;
int v22;
unsigned int v23;
int v24;
int v25;
unsigned int v26;
unsigned __int64 v27;
char v28;
__int64 v29;
__int64 v30;
unsigned __int64 v31;
UINT64 v32;
UINT64 v33;
NTSTATUS v34;
__int64 v35;
UINT8 v36;
_MMPTE_COPY_LIST *v37;
char v38;
int v39;
NTSTATUS v40;
bool v41;
int v42;
UINT64 *v43;
__int64 v44;
_UNICODE_STRING *v45;
UINT8 v46;
wchar_t *v47;
int v48;
_MMPFN *v49;
__int32 v50;
int v51;
INT64 v52;
NTSTATUS result;
_MMPFN *v54;
__int64 v55;
int v56[8];
INT64 a5;
INT64 a6;
int *v59;
int v60;
_MI_PFN_CACHE_ATTRIBUTE FinalCacheAttribute;
__int64 v62;
UINT64 PageFrameIndex;
__int64 v64;
INT64 v65;
_MMPFN *v66;
INT64 a3;
int v68;
int v69;
INT64 a4;
UINT64 SpinCount;
v2 = *(_DWORD *)(a1 + 24);
v3 = *(_QWORD *)&BugCheckParameter2;
v4 = *(_MI_PARTITION **)a1;
a3 = *(_QWORD *)(a1 + 8);
FinalCacheAttribute = *(_DWORD *)(a1 + 32);
v60 = 0;
v68 = v2 & 0x400000;
v69 = 0;
*(_QWORD *)(a1 + 48) = 0i64;
PageFrameIndex = (UINT64)v4;
if( (v2 & 0x400000) != 0 )
LODWORD(a4) = *(_DWORD *)(a1 + 28);
else
LODWORD(a4) = -1;
v66 = 0i64;
v6 = 48i64 * *(_QWORD *)&BugCheckParameter2;
v64 = 48i64 * *(_QWORD *)&BugCheckParameter2;
v65 = -1i64;
v7 = &MmGetPfnDb()[*(_QWORD *)&BugCheckParameter2];
CurrentIrql = KeGetCurrentIrql();
v62 = CurrentIrql;
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( v7->u2._bf_0 < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) );
LOBYTE(CurrentIrql) = v62;
v6 = v64;
}
v9 = CurrentIrql;
while( 1 )
{
while( 1 )
{
while( 1 )
{
p_u4 = &MmGetPfnDb()->u4;
if( v3 > 0xFFFFFFFFFi64 || (*(__int64 *)((_BYTE *)&p_u4->_bf_0 + v6) & 0x4000000000000i64) == 0 )
goto LABEL_113;
EntireField = v7->u4.EntireField;
if( *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((EntireField >> 39) & 0x3FF)) != v4 )
{
v55 = (unsigned int)MiPfnLargeBitSet((UINT64)&Irp);
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
v34 = 0;
if( (_DWORD)v55 != -1 )
*(_QWORD *)(a1 + 48) = MiLargePageSizes[v55];
goto LABEL_99;
}
v12 = *(_BYTE *)(&v7->u3 + 1) & 7;
v13 = -1;
if( (EntireField & 0x1000000000i64) != 0 )
{
BaseResidentPage = MiGetBaseResidentPage(v7);
PfnPageSizeIndex = MiGetPfnPageSizeIndex((INT64)BaseResidentPage);
v13 = PfnPageSizeIndex;
if( v16 != v7 )
_InterlockedAnd64(&v16->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v12 == 6 )
{
*(_QWORD *)(a1 + 48) = MiLargePageSizes[PfnPageSizeIndex];
LABEL_113:
v34 = 0;
LABEL_114:
if( v9 != 17 )
{
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
}
goto LABEL_99;
}
}
if( v12 != 5 )
break;
LOBYTE(v17) = MiIsPageOnBadList((INT64)v7);
if( v17 )
goto LABEL_113;
if( v13 != -1 )
break;
LOBYTE(v19) = MiInvalidPteConforms(
v7->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0,
v18);
if( !v19 )
goto LABEL_113;
if( *(&stru_140C4DB30 + 42) )
{
if( (v20 & 0x10) != 0 )
v20 &= ~0x10ui64;
else
v20 &= ~*(&stru_140C4DB30 + 42);
}
if( HIDWORD(v20) != 4294967294 || v66 == v7 )
goto LABEL_113;
LODWORD(v21) = MiSearchNumaNodeTable((PVOID)(v7 - MmGetPfnDb()));
v22 = *(_DWORD *)(v21 + 8);
v23 = (MiGetPfnChannel((INT64)v7) << *(&stru_140C4DB30 + 157)) | *(&stru_140C4DB30 + 66) & v3 | (v22 << *(&stru_140C4DB30 + 156));
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
MiDrainZeroLookasides(v4, v7, *(_QWORD *)(a1 + 16), v23);
v66 = v7;
MiLockPageInline(v7);
v6 = v64;
}
LOBYTE(v24) = MiIsPfnFileOnly((INT64)v7);
if( v24 == 1 )
goto LABEL_113;
LOBYTE(v25) = MiIsPfnFromSlabAllocation((INT64)v7);
if( v25 )
goto LABEL_113;
if( v26 > 1 )
break;
if( v13 == -1 )
{
if( !v68 && !MiUnlinkFreeOrZeroedPage(v3, 0i64, 0i64) )
{
LABEL_93:
MiReturnFreeZeroPage((INT64)v7);
goto LABEL_113;
}
v34 = 1;
v52 = 0i64;
LABEL_95:
MiAddMdlPageToTradeBlock(a1, v3, v52);
goto LABEL_114;
}
v30 = v13;
v31 = MiLargePageSizes[v13];
if( (v2 & 0x2000000) != 0 && v31 >= 0x200 || (v2 & 0x1000000) != 0 && v31 == 16 )
goto LABEL_113;
_InterlockedAnd64(&v7->u2.Lock, v27);
__writecr8(v9);
if( v68 || v3 != (v3 & ~(v31 - 1)) || *(_QWORD *)(a1 + 16) < v31 )
{
v32 = PageFrameIndex;
}
else
{
v32 = PageFrameIndex;
v33 = v31 + v3 - 1;
if( v33 <= *(_QWORD *)(a1 + 56) )
{
LODWORD(a5) = v2;
if( MiLargeFreePageToMdl(PageFrameIndex, v33, (UINT64 *)v13) == 1 )
{
v34 = v31;
if( *(_QWORD *)(a1 + 64) && MiPfnZeroingNeeded(v7, FinalCacheAttribute) )
*(_QWORD *)(v35 + 24) = 1i64;
goto LABEL_99;
}
}
}
a5 = (INT64)&v69;
if( !MiDemoteLargeFreePage(v32, v3) && !v69 )
{
LOBYTE(v51) = MiLargePageMovesInProgress((INT64)v7);
v34 = 0;
if( !v51 )
*(_QWORD *)(a1 + 48) = MiLargePageSizes[v30];
goto LABEL_99;
}
v36 = MiLockPageInline(v7);
v4 = (_MI_PARTITION *)PageFrameIndex;
LABEL_87:
v9 = v36;
v6 = v64;
}
v37 = (_MMPTE_COPY_LIST *)a3;
if( !*(_QWORD *)(a3 + 16) )
break;
v38 = *((_BYTE *)&v7->u3 + 3);
if( v38 < 0 )
break;
if( v26 > 4 )
{
v41 = v26 == 6;
goto LABEL_68;
}
if( (v2 & 0x4000000) == 0 && (v29 & v7->u4._bf_0) == 0 && (__int64)v7->ListEntry.Blink > 0 )
goto LABEL_113;
if( (v2 & 0x200000) != 0 )
{
if( (v38 & 0x40) != 0 )
goto LABEL_113;
LOBYTE(v39) = MiIsPageOnBadList((INT64)v7);
if( v39 )
goto LABEL_113;
}
LODWORD(a5) = v2;
v40 = MiTradeTransitionPage(v7, v9, (INT64)v37, (unsigned int)a4, a5, (INT64)&v65);
if( v40 == 3 )
{
if( *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v7->u4._bf_0 >> 39) & 0x3FF)) != v4 )
goto LABEL_97;
if( !v68 )
goto LABEL_106;
v54 = v7;
goto LABEL_102;
}
if( v40 != 2 )
goto LABEL_98;
LABEL_59:
v9 = MiLockPageInline(v7);
v6 = v64;
}
if( v26 == 2 )
{
if( v7->u3.ReferenceCount )
goto LABEL_113;
if( !MiReuseStandbyPage(v7) )
goto LABEL_93;
v34 = 1;
v52 = 1i64;
goto LABEL_95;
}
if( v26 != 6
|| (*(_BYTE *)(&v7->u3 + 1) & 0x10) != 0
|| v7->u3.ReferenceCount != 1
|| (((unsigned __int64)v7->u4._bf_0 >> 60) & 7) == 2
|| (v7->$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::gap0[0] & 1) == 0 )
{
goto LABEL_113;
}
v38 = *((_BYTE *)&v7->u3 + 3);
v41 = (v38 & 8) == 0;
LABEL_68:
if( !v41 )
goto LABEL_113;
if( (v2 & 0x200000) != 0 )
{
if( (v38 & 0x40) != 0 )
goto LABEL_113;
LOBYTE(v42) = MiIsPageOnBadList((INT64)v7);
if( v42 )
goto LABEL_113;
}
if( (((unsigned __int64)v7->u4._bf_0 >> 60) & 7) == 2 )
{
if( v28 == 2 || (v2 & 8) != 0 )
goto LABEL_113;
_InterlockedAnd64(&v7->u2.Lock, v27);
__writecr8(v9);
v43 = (UINT64 *)*(unsigned int *)(a1 + 28);
v59 = &v60;
a6 = (INT64)&v65;
LODWORD(a5) = v2;
if( MiSwapStackPage((_MMPFN *)v4, (_MMPTE_COPY_LIST *)v7, (UINT64)v37, v43, (UINT64 *)a5) )
goto LABEL_104;
if( (((unsigned __int64)v7->u4._bf_0 >> 60) & 7) == 2 )
goto LABEL_98;
goto LABEL_59;
}
MiActivePageClaimCandidate(v4, v7, 1ui64, v27);
if( v44 )
{
*(_QWORD *)(a1 + 48) = v44;
goto LABEL_113;
}
if( (_BYTE)v62 == 2 || (v2 & 8) != 0 )
goto LABEL_113;
LOBYTE(v48) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v7, v45, v46, v47);
if( v48 )
{
v50 = MiTrimSharedPage(v49, v9, v2);
}
else
{
a6 = (INT64)&v65;
LODWORD(a5) = *(_DWORD *)(a1 + 28);
v50 = MiStealPage(v49, v9, v2, v37, a5, (UINT64 *)&v65);
}
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v9);
if( !v50 )
goto LABEL_98;
if( v50 == 2 )
{
v36 = MiLockPageInline(v7);
goto LABEL_87;
}
if( *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v7->u4._bf_0 >> 39) & 0x3FF)) != v4 )
{
LABEL_97:
MiLockAndInsertPageInFreeList(v7);
LABEL_98:
v34 = 0;
goto LABEL_99;
}
LABEL_104:
v7->OriginalPte = ZeroPte;
MiSetOriginalPtePfnFromFreeList(&v7->OriginalPte.u.Long);
v54 = v7;
if( v68 )
{
LABEL_102:
MiLockAndInsertPageInFreeList(v54);
goto LABEL_106;
}
_InterlockedOr(v56, 0);
MiSetPfnTbFlushStamp(v7, (unsigned int)KiTbFlushTimeStamp, 0i64);
LABEL_106:
v34 = 1;
MiAddMdlPageToTradeBlock(a1, v3, 1i64);
LABEL_99:
result = v34;
*(_QWORD *)(a1 + 40) = v65;
return result;
}Referenced by:
MiClaimPhysicalRun