MiReservePageFileSpaceForPage
INT64 __fastcall MiReservePageFileSpaceForPage(INT64 rcx0, UINT64 a2, CHAR a3, UINT64 *a4){
INT64 v4;
INT64 v5;
unsigned int v6;
int v7;
UINT64 v10;
int v11;
_MMPFN *v12;
unsigned __int64 v13;
UNICODE_STRING *v14;
UINT8 v15;
WCHAR *v16;
UINT64 v17;
UNICODE_STRING *v18;
UINT8 v19;
WCHAR *v20;
int v21;
INT64 v22;
bool v23;
int v24;
char v25;
__int64 v26;
__int64 v27;
INT64 v28;
bool v29;
UINT64 v30;
INT64 updated;
__int16 v32;
UINT64 PteBase;
_MMPFN *UsedPtesHandle;
INT64 a5;
UINT64 SpinCount;
UINT64 v38;
UINT64 v39;
INT64 a9;
INT64 v41;
INT64 v42;
INT64 v43;
int v45;
v6 = 0;
v7 = a3 & 0x80;
v43 = v4;
HIDWORD(a5) = 0;
v45 = v7;
v10 = 0i64;
v42 = v5;
do
{
LODWORD(a5) = 0;
v11 = 0;
if( v7 )
{
v12 = 0i64;
}
else
{
v12 = MiLockLeafPage((_MMPTE *)a2, 0i64);
if( v12 )
v11 = 1;
LODWORD(a5) = v11;
}
v13 = MI_READ_PTE_LOCK_FREE(a2);
v38 = v13;
v17 = v13;
if( (v13 & 1) != 0 )
{
if( v45 )
{
v12 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * ((v13 >> 12) & 0xFFFFFFFFFi64));
if( (a3 & 1) == 0 )
{
LODWORD(SpinCount) = 0;
LODWORD(a5) = 1;
while( _interlockedbittestandset64((volatile signed __int32 *)v12 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v12 + 3) < 0 );
}
LOBYTE(v17) = v38;
}
LOBYTE(v24) = MI_PFN_IS_PROTO((UNICODE_STRING *)v12, v14, v15, v16);
if( v24 )
goto LABEL_76;
}
if( (*(_BYTE *)v12 & 1) == 0 )
goto LABEL_76;
if( *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v12 + 5) >> 39) & 0x3FFi64)) != rcx0 )
goto LABEL_76;
if( (*((_BYTE *)v12 + 35) & 8) != 0 )
goto LABEL_76;
v25 = v17;
v17 = *((_QWORD *)v12 + 2);
LODWORD(a9) = (_DWORD)v12 + 16;
v38 = v17;
if( (v17 & 1) != 0 || v17 && qword_140C4DC80 && (v17 & qword_140C4DC80) == 0 )
goto LABEL_76;
if( !MI_IS_RESET_PTE(v17) || (*((_BYTE *)v12 + 34) & 0x10) != 0 )
{
LABEL_41:
v22 = rcx0;
goto LABEL_42;
}
if( !v45 )
goto LABEL_76;
v23 = (v25 & 0x42) == 0;
LABEL_40:
if( v23 )
goto LABEL_76;
goto LABEL_41;
}
if( (v13 & 0x400) != 0 )
goto LABEL_76;
if( (v13 & 0x800) == 0 )
{
if( !v13 )
{
if( (a3 & 2) == 0 )
goto LABEL_76;
v17 = MiSwizzleInvalidPte(8i64 * (a3 & 0x7C));
v38 = v17;
HIDWORD(a5) = 1;
goto LABEL_41;
}
if( !MiInvalidPteConforms(v13) )
goto LABEL_76;
v23 = ((v17 >> 5) & 0xF) == 0;
goto LABEL_40;
}
if( !v45 )
goto LABEL_13;
v12 = MiLockTransitionLeafPage((_MMPTE *)a2, 0i64);
v7 = v45;
}
while( !v12 );
LODWORD(a5) = 1;
LOBYTE(v21) = MI_PFN_IS_PROTO((UNICODE_STRING *)v12, v18, v19, v20);
if( v21 )
goto LABEL_77;
LABEL_13:
v22 = rcx0;
if( *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v12 + 5) >> 39) & 0x3FFi64)) == rcx0 )
{
v38 = MI_READ_PTE_LOCK_FREE((INT64)v12 + 16);
v17 = v38;
if( !MI_IS_RESET_PTE(v38) || (*((_BYTE *)v12 + 34) & 0x10) != 0 )
{
LABEL_42:
if( (v17 & 2) != 0 )
{
if( (a3 & 1) != 0 )
*a4 = v17;
goto LABEL_76;
}
if( v12 && (*((_BYTE *)v12 + 34) & 0x28) != 0 )
goto LABEL_76;
if( (v17 & 4) != 0 )
{
if( !v12 )
goto LABEL_76;
if( (a3 & 1) == 0 )
{
if( !*((_WORD *)v12 + 16) )
{
if( !(unsigned int)MiUnlinkPageFromList(v12, 0i64) )
{
MiDiscardTransitionPteEx((UINT64)v12, 0i64);
goto LABEL_76;
}
v6 = 1;
}
v10 = MiCapturePageFileInfoInline((UINT64 *)v12 + 2, 1i64, 0i64);
*((_BYTE *)v12 + 34) |= 0x10u;
goto LABEL_55;
}
}
else
{
LABEL_55:
if( (a3 & 1) == 0 )
{
v26 = *(_QWORD *)(v22 + 8i64 * ((unsigned __int8)HIBYTE(*(_WORD *)a4) >> 4) + 6944);
v39 = v17;
MiSetNonResidentPteHeat(&v39, 0i64);
v29 = (v17 & 0x400) != 0;
v30 = v39;
if( !v29 )
{
v30 = v39 & 0xFFFFFFFFFFFFFFF9ui64;
v39 &= 0xFFFFFFFFFFFFFFF9ui64;
}
if( v26 )
{
if( v30 )
updated = MiUpdatePageFileHighInPte(v30, v28);
else
updated = MiSwizzleInvalidPte(v27 & 0xFFFFFFFF00000000ui64);
v30 = updated ^ (unsigned __int16)(updated ^ (v32 << 12)) & 0xF000 | 2;
v39 = v30;
}
if( v12 )
{
if( !*((_WORD *)v12 + 16) && (*((_BYTE *)v12 + 34) & 0x10) != 0 && !v6 )
{
MiUnlinkPageFromList(v12, 0i64);
v6 = 1;
}
*((_QWORD *)v12 + 2) = v30;
if( v6 )
MiInsertPageInList(v12, 8ui64);
}
else
{
*(_QWORD *)a2 = v30;
}
if( HIDWORD(a5) )
{
PteBase = (UINT64)MmGetPteBase();
if( a2 <= PteBase + 0x3FFFFFFF78i64 && a2 >= PteBase )
{
UsedPtesHandle = MiGetUsedPtesHandle((__int64)((a2 << 25) - (PteBase << 25)) >> 16);
MiIncreaseUsedPtesCount(UsedPtesHandle, 1ui64);
}
}
}
}
v6 = 1;
}
}
LABEL_76:
if( (_DWORD)a5 != 1 )
goto LABEL_78;
LABEL_77:
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_78:
if( v10 )
MiReleasePageFileInfo(rcx0, v10, 1, (INT64)v16, a5, SpinCount, v38, v39, a9, v41, v42, v43);
return v6;
}Referenced by:
MiOutSwapWorkingSetPte
MiReservePageFileSpace