MiReservePageFileSpace
VOID __stdcall MiReservePageFileSpace(_MI_PARTITION *Partition, _MMPTE *PointerPte, _MMSUPPORT_INSTANCE *WsInfo){
__int32 bf_0;
unsigned int v5;
_MMVAD *v6;
__int64 v7;
_MMVAD *Address;
__int64 v9;
union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v10;
unsigned __int64 v11;
__int64 v12;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v13;
unsigned __int64 v14;
unsigned __int64 v15;
_MMPTE *v16;
int v17;
_MMPTE *Long;
unsigned int v19;
INT64 v20;
_MMPTE *v21;
int v22;
INT64 v23;
_MMPTE *v24;
__int64 v25;
int v26;
unsigned int v27;
int v28;
unsigned int v29;
NTSTATUS FreePageFileSpace;
_MMPTE *v31;
char v32;
_MMPTE *i;
int v34;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v35;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v36;
unsigned __int64 v37;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v38;
unsigned __int64 v39;
unsigned __int64 v40;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v41;
int v42;
__int64 v43;
__int64 v44;
unsigned int v45;
__int64 v46;
int v47;
unsigned int v48;
int v49;
int v50;
unsigned int v51;
int v52;
_MMPTE PageFileInfo;
INT64 v54;
INT64 v55;
_MI_PAGEFILE_SECTION_RESERVE_INFO Info[4];
__int128 v57;
__int64 v58;
_MMSUPPORT_INSTANCE *v60;
v60 = WsInfo;
*(_OWORD *)Info = 0i64;
v58 = 0i64;
bf_0 = Partition->Modwriter.ModWriteData.ReservationClusterInfo._bf_0;
v5 = bf_0 & 0x3FF;
v57 = 0i64;
if( v5 >= 0x10 )
{
v6 = 0i64;
v52 = 0;
if( !WsInfo )
{
v17 = 1;
MiGetPageFileSectionForReservation(PointerPte, Info, 1ui64);
if( !v42 )
return;
v16 = (_MMPTE *)*((_QWORD *)&v57 + 1);
PageFileInfo.u.Long = v57;
v52 = 1;
goto LABEL_14;
}
if( (WsInfo->Flags._bf_0 & 7) != 0 )
{
PageFileInfo.u.Long = (unsigned __int64)PointerPte & 0xFFFFFFFFFFFFF000ui64;
v16 = (_MMPTE *)(((unsigned __int64)PointerPte & 0xFFFFFFFFFFFFF000ui64) + 4088);
v17 = 1;
LABEL_15:
Long = (_MMPTE *)PageFileInfo.u.Long;
v19 = ((__int64)((__int64)v16 - PageFileInfo.u.Long) >> 3) + 1;
if( v19 > v5 )
{
v43 = v16 - PointerPte;
v44 = (__int64)((__int64)PointerPte - PageFileInfo.u.Long) >> 3;
v45 = v19 - v5;
if( (unsigned int)v43 < v45 )
{
v47 = v45 - v43;
v46 = 0i64;
LODWORD(v44) = v44 - v47;
}
else
{
v46 = (unsigned int)v43 - v45;
}
v16 = &PointerPte[v46];
Long = &PointerPte[-(unsigned int)v44];
PageFileInfo.u.Long = (unsigned __int64)Long;
}
if( WsInfo )
v17 = 129;
if( v6 && (v6->Core.u1.LongFlags1 & 0x80000000) != 0 )
v17 |= (v6->Core.u.LongFlags & 0xF80 | 0x40) >> 5;
v20 = 0i64;
v21 = PointerPte - 1;
v22 = 0;
v54 = 0i64;
v50 = 0;
if( &PointerPte[-1] >= Long )
{
do
{
if( !(unsigned int)MiReservePageFileSpaceForPage(Partition, (unsigned __int64)v21, v17, (UINT64 *)&v54) )
break;
++v22;
--v21;
}
while( (unsigned __int64)v21 >= PageFileInfo.u.Long );
v20 = v54;
v50 = v22;
}
v23 = 0i64;
v24 = PointerPte + 1;
v25 = 0i64;
v55 = 0i64;
if( &PointerPte[1] <= v16 )
{
do
{
if( !(unsigned int)MiReservePageFileSpaceForPage(Partition, (unsigned __int64)v24, v17, (UINT64 *)&v55) )
break;
v25 = (unsigned int)(v25 + 1);
++v24;
}
while( v24 <= v16 );
v23 = v55;
}
v26 = v50;
v27 = v25 + v50 + 1;
v51 = v27;
if( v20 )
{
v37 = v20;
if( *(&stru_140C4DB30 + 42) && (v20 & 0x10) == 0 )
v37 = v20 & ~*(&stru_140C4DB30 + 42);
LODWORD(v38.Long) = MiUpdatePageFileHighInPte(v20, HIDWORD(v37) + 1);
PageFileInfo.u.Long = v38.Long;
}
else
{
if( !v23 )
goto LABEL_31;
v39 = v23;
v40 = v23;
if( *(&stru_140C4DB30 + 42) && (v23 & 0x10) == 0 )
v39 = v23 & ~*(&stru_140C4DB30 + 42);
if( v27 < HIDWORD(v39) )
{
if( *(&stru_140C4DB30 + 42) && (v23 & 0x10) == 0 )
v40 = ~*(&stru_140C4DB30 + 42) & v23;
LODWORD(v41.Long) = MiUpdatePageFileHighInPte(v23, HIDWORD(v40) - v27);
PageFileInfo.u.Long = v41.Long;
}
else
{
LABEL_31:
PageFileInfo.u.Long = 0i64;
}
}
if( MI_IS_PTE_IN_WS_SWAP_SET((_MMPTE *)Partition) )
{
PageFileInfo.u.Long = 0i64;
v28 = 16;
}
if( v29 == 1 )
{
if( v28 )
goto LABEL_47;
v28 = 64;
}
FreePageFileSpace = MiFindFreePageFileSpace(Partition, &PageFileInfo, v29, v28 | 1u);
if( FreePageFileSpace == v51 )
goto LABEL_36;
_InterlockedCompareExchange(
&Partition->Modwriter.ModWriteData.ReservationClusterInfo._bf_0,
bf_0 ^ ((unsigned __int16)FreePageFileSpace ^ (unsigned __int16)bf_0) & 0x3FF,
bf_0);
if( FreePageFileSpace )
{
v48 = v51 - FreePageFileSpace;
if( (unsigned int)v25 < v51 - FreePageFileSpace )
{
v49 = v48 - v25;
v25 = 0i64;
v26 -= v49;
}
else
{
v25 = (unsigned int)v25 - v48;
}
LABEL_36:
v31 = &PointerPte[v25];
v32 = v17 & 0xFE;
for( i = &PointerPte[-v26];
i <= v31;
PageFileInfo.u.Long = MiSwizzleInvalidPte((v35.Long + 0x100000000i64) ^ (unsigned int)(LODWORD(v35.Long) ^ LODWORD(v36.Long))) )
{
v34 = MiReservePageFileSpaceForPage(Partition, (unsigned __int64)i, v32, &PageFileInfo.u.Long);
v35.Long = PageFileInfo.u.Long;
if( !v34 )
MiReleasePageFileInfo(Partition, PageFileInfo, v60 != 0i64);
v36.Long = v35.Long;
if( *(&stru_140C4DB30 + 42) && (v35.Long & 0x10) == 0 )
v35.Long &= ~*(&stru_140C4DB30 + 42);
if( v36.Long && *(&stru_140C4DB30 + 42) )
{
if( (v36.Long & 0x10) != 0 )
LODWORD(v36.Long) &= ~0x10u;
else
LODWORD(v36.Long) &= ~*(&stru_140C4DB30 + 84);
}
++i;
}
}
LABEL_47:
if( v52 )
MiReleasePageFileSectionInfo(Info);
return;
}
v7 = (__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
Address = MiLocateAddress((VOID *)v7);
v6 = Address;
if( Address )
{
v10.LongFlags = (unsigned int)Address->Core.u;
if( (v10.LongFlags & 0x70) == 0
&& (v10.LongFlags & 0x100004) == 0x100000
&& ((v10.LongFlags & 0x100000) == 0 || (v10.LongFlags & 0x400000) == 0 && (v10.LongFlags & 0xC0000) < 0x80000) )
{
v11 = v7 & 0xFFFFFFFFFFE00000ui64;
if( v11 >= (Address->Core.StartingVpn | ((unsigned __int64)Address->Core.StartingVpnHigh << 32)) << 12 )
v12 = (v11 >> 9) & 0x7FFFFFFFF8i64;
else
v12 = 8
* ((Address->Core.StartingVpn | ((unsigned __int64)Address->Core.StartingVpnHigh << 32)) & 0xFFFFFFFFFi64);
v13.Long = v12 + v9;
v14 = v11 + 2093056;
v15 = Address->Core.EndingVpn | ((unsigned __int64)Address->Core.EndingVpnHigh << 32);
PageFileInfo.u.Long = v13.Long;
if( v14 <= v15 << 12 )
{
v16 = (_MMPTE *)(v9 + ((v14 >> 9) & 0x7FFFFFFFF8i64));
PageFileInfo.u.Long = v13.Long;
}
else
{
v16 = (_MMPTE *)(v9 + 8 * (v15 & 0xFFFFFFFFFi64));
}
v17 = 1;
LABEL_14:
WsInfo = v60;
goto LABEL_15;
}
}
}
}Referenced by:
MiFillNoReservationCluster
MiWsleFlush