MiReservePageFileSpace
VOID __fastcall MiReservePageFileSpace(INT64 rcx0, UINT64 rdx0, INT64 a3){
signed __int32 v4;
unsigned int v5;
RTL_BALANCED_NODE *v6;
__int64 v7;
RTL_BALANCED_NODE *Address;
__int64 v9;
int v10;
unsigned __int64 v11;
__int64 v12;
UINT64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
UINT64 v16;
int v17;
UINT64 v18;
unsigned int v19;
INT64 v20;
UINT64 v21;
unsigned int v22;
INT64 v23;
UINT64 v24;
__int64 v25;
unsigned int v26;
unsigned int v27;
int v28;
unsigned int v29;
int FreePageFileSpace;
UINT64 v31;
CHAR v32;
UINT64 i;
int v34;
INT64 v35;
UINT64 v36;
UINT64 v37;
unsigned __int64 v38;
unsigned __int64 v39;
unsigned __int64 v40;
__int64 v41;
__int64 v42;
unsigned int v43;
__int64 v44;
int v45;
int v46;
int v47;
INT64 v48;
unsigned int v49;
unsigned int v50;
UINT64 a2;
UINT64 v52;
UINT64 v53;
INT64 v54[2];
__int128 v55;
__int64 v56;
INT64 v58;
v58 = a3;
*(_OWORD *)v54 = 0i64;
v56 = 0i64;
v4 = *(_DWORD *)(rcx0 + 872);
v5 = v4 & 0x3FF;
v55 = 0i64;
if( v5 >= 0x10 )
{
v6 = 0i64;
HIDWORD(v48) = 0;
if( !a3 )
{
v17 = 1;
if( !(unsigned int)MiGetPageFileSectionForReservation(rdx0, (__int64)v54, 1) )
return;
v16 = *((_QWORD *)&v55 + 1);
a2 = v55;
HIDWORD(v48) = 1;
goto LABEL_14;
}
if( (*(_BYTE *)(a3 + 184) & 7) != 0 )
{
a2 = rdx0 & 0xFFFFFFFFFFFFF000ui64;
v16 = (rdx0 & 0xFFFFFFFFFFFFF000ui64) + 4088;
v17 = 1;
LABEL_15:
v18 = a2;
v19 = ((__int64)(v16 - a2) >> 3) + 1;
if( v19 > v5 )
{
v41 = (__int64)(v16 - rdx0) >> 3;
v42 = (__int64)(rdx0 - a2) >> 3;
v43 = v19 - v5;
if( (unsigned int)v41 < v43 )
{
v45 = v43 - v41;
v44 = 0i64;
LODWORD(v42) = v42 - v45;
}
else
{
v44 = (unsigned int)v41 - v43;
}
v16 = rdx0 + 8 * v44;
v18 = rdx0 - 8i64 * (unsigned int)v42;
a2 = v18;
}
if( a3 )
v17 = 129;
if( v6 && SHIDWORD(v6[2].Left) < 0 )
v17 |= (unsigned __int64)((__int64)v6[2].Children[0] & 0xF80 | 0x40u) >> 5;
v20 = 0i64;
v21 = rdx0 - 8;
v22 = 0;
v52 = 0i64;
v49 = 0;
if( rdx0 - 8 >= v18 )
{
do
{
if( !(unsigned int)MiReservePageFileSpaceForPage(rcx0, v21, v17, &v52) )
break;
++v22;
v21 -= 8i64;
}
while( v21 >= a2 );
v20 = v52;
v49 = v22;
}
v23 = 0i64;
v24 = rdx0 + 8;
v25 = 0i64;
v53 = 0i64;
if( rdx0 + 8 <= v16 )
{
do
{
if( !(unsigned int)MiReservePageFileSpaceForPage(rcx0, v24, v17, &v53) )
break;
v25 = (unsigned int)(v25 + 1);
v24 += 8i64;
}
while( v24 <= v16 );
v23 = v53;
}
v26 = v49;
v27 = v25 + v49 + 1;
v50 = v27;
if( v20 )
{
v38 = v20;
if( qword_140C4DC80 && (v20 & 0x10) == 0 )
v38 = v20 & ~qword_140C4DC80;
a2 = MiUpdatePageFileHighInPte(v20, HIDWORD(v38) + 1);
}
else
{
if( !v23 )
goto LABEL_31;
v39 = v23;
v40 = v23;
if( qword_140C4DC80 && (v23 & 0x10) == 0 )
v39 = v23 & ~qword_140C4DC80;
if( v27 < HIDWORD(v39) )
{
if( qword_140C4DC80 && (v23 & 0x10) == 0 )
v40 = ~qword_140C4DC80 & v23;
a2 = MiUpdatePageFileHighInPte(v23, HIDWORD(v40) - v27);
}
else
{
LABEL_31:
a2 = 0i64;
}
}
if( (unsigned int)MI_IS_PTE_IN_WS_SWAP_SET((MMPTE *)rcx0) )
{
a2 = 0i64;
v28 = 16;
}
if( v29 == 1 )
{
if( v28 )
goto LABEL_47;
v28 = 64;
}
FreePageFileSpace = MiFindFreePageFileSpace((_MI_PARTITION *)rcx0, (_MMPTE *)&a2, v29, v28 | 1u, v50);
if( FreePageFileSpace == (_DWORD)v48 )
goto LABEL_36;
_InterlockedCompareExchange(
(volatile signed __int32 *)(rcx0 + 872),
v4 ^ ((unsigned __int16)FreePageFileSpace ^ (unsigned __int16)v4) & 0x3FF,
v4);
if( FreePageFileSpace )
{
v46 = v48 - FreePageFileSpace;
if( (unsigned int)v25 < (int)v48 - FreePageFileSpace )
{
v47 = v46 - v25;
v25 = 0i64;
v26 -= v47;
}
else
{
v25 = (unsigned int)(v25 - v46);
}
LABEL_36:
v31 = rdx0 + 8 * v25;
v32 = v17 & 0xFE;
for( i = rdx0 - 8i64 * v26;
i <= v31;
a2 = MiSwizzleInvalidPte((v36 + 0x100000000i64) ^ (unsigned int)v36 ^ (unsigned int)v37) )
{
v34 = MiReservePageFileSpaceForPage(rcx0, i, v32, &a2);
v36 = a2;
if( !v34 )
MiReleasePageFileInfo(rcx0, a2, v58 != 0, v35, v48, a2, v52, v53, v54[0], v54[1], v55, *((INT64 *)&v55 + 1));
v37 = v36;
if( qword_140C4DC80 && (v36 & 0x10) == 0 )
v36 &= ~qword_140C4DC80;
if( v37 && qword_140C4DC80 )
{
if( (v37 & 0x10) != 0 )
LODWORD(v37) = v37 & 0xFFFFFFEF;
else
LODWORD(v37) = ~(_DWORD)qword_140C4DC80 & v37;
}
i += 8i64;
}
}
LABEL_47:
if( HIDWORD(v48) )
MiReleasePageFileSectionInfo((INT64)v54);
return;
}
v7 = (__int64)((rdx0 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
Address = MiLocateAddress(v7);
v6 = Address;
if( Address )
{
v10 = (int)Address[2].Children[0];
if( (v10 & 0x70) == 0
&& (v10 & 0x100004) == 0x100000
&& ((v10 & 0x100000) == 0 || (v10 & 0x400000) == 0 && (v10 & 0xC0000u) < 0x80000) )
{
v11 = v7 & 0xFFFFFFFFFFE00000ui64;
if( v11 >= (LODWORD(Address[1].Children[0]) | ((unsigned __int64)LOBYTE(Address[1].Right) << 32)) << 12 )
v12 = (v11 >> 9) & 0x7FFFFFFFF8i64;
else
v12 = 8
* ((LODWORD(Address[1].Children[0]) | ((unsigned __int64)LOBYTE(Address[1].Right) << 32)) & 0xFFFFFFFFFi64);
v13 = v12 + v9;
v14 = v11 + 2093056;
v15 = HIDWORD(Address[1].Left) | ((unsigned __int64)BYTE1(Address[1].Right) << 32);
a2 = v13;
if( v14 <= v15 << 12 )
{
v16 = v9 + ((v14 >> 9) & 0x7FFFFFFFF8i64);
a2 = v13;
}
else
{
v16 = v9 + 8 * (v15 & 0xFFFFFFFFFi64);
}
v17 = 1;
LABEL_14:
a3 = v58;
goto LABEL_15;
}
}
}
}Referenced by:
MiFillNoReservationCluster
MiWsleFlush