MiExtendPagingFileMaximum
void __fastcall MiExtendPagingFileMaximum(__int64 a1, __int64 a2, unsigned __int64 a3){
RTL_BITMAP *v3;
KIRQL v7;
__int64 v8;
unsigned __int64 v9;
_MMPTE *PteBase;
unsigned int v11;
UINT8 *v12;
unsigned int v13;
UINT64 v14;
unsigned int v15;
__int128 v16;
_DWORD *v17;
INT64 v18;
unsigned int v19;
unsigned __int64 v20;
UINT64 v21;
UINT64 v22;
char *v23;
unsigned __int64 v24;
unsigned __int64 v25;
UINT64 v26;
UINT8 *v27;
volatile LONG *SpinLock;
_DWORD *v29[2];
__int128 v30;
__int64 v31;
unsigned int v32;
UINT64 v33;
UINT64 v34;
UINT64 v35;
INT64 v36;
v35 = a3;
v3 = (RTL_BITMAP *)(a2 + 8);
RtlSetAllBits((RTL_BITMAP *)(a2 + 8));
RtlSetAllBits((RTL_BITMAP *)(a2 + 24));
SpinLock = (volatile LONG *)(a1 + 232);
v7 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a1 + 232));
v8 = *(_QWORD *)(a1 + 112);
v9 = v7;
PteBase = MmGetPteBase();
v11 = *(_DWORD *)(v8 + 8);
v32 = v11;
if( a3 )
{
v12 = (UINT8 *)PteBase + ((*(_QWORD *)(a1 + 216) >> 9) & 0x7FFFFFFFF8i64);
v36 = (INT64)v12;
v27 = (UINT8 *)PteBase + ((a3 >> 9) & 0x7FFFFFFFF8i64);
v34 = ((4 * (unsigned __int64)v11) >> 12) + (((4i64 * v11) & 0xFFF) != 0);
memmove(v27, v12, 8 * v34);
memset((INT64)v12, 0i64);
v11 = v32;
}
else
{
v36 = 0i64;
v27 = 0i64;
v34 = 0i64;
}
v13 = 8 * ((v11 >> 6) + ((v11 & 0x3F) != 0));
memmove(*(UINT8 **)(a2 + 16), *(UINT8 **)(v8 + 16), v13);
memmove(*(UINT8 **)(a2 + 32), *(UINT8 **)(v8 + 32), v13);
v14 = *(unsigned int *)(v8 + 8);
v15 = 8 * v13 - v14;
if( v15 )
{
RtlSetBits(v3, v14, v15);
RtlSetBits((RTL_BITMAP *)(a2 + 24), *(unsigned int *)(v8 + 24), v15);
}
*(_QWORD *)(a1 + 8) = v3->SizeOfBitMap;
v16 = *(_OWORD *)(v8 + 16);
v29[1] = *(_DWORD **)(v8 + 8);
v29[0] = (_DWORD *)v8;
v31 = *(_QWORD *)(v8 + 32);
v30 = v16;
v17 = MiDerefPageFileSpaceBitmaps(a1, v29, 1);
*(_QWORD *)(a1 + 112) = a2;
*(_QWORD *)(a1 + 216) = v35;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(a1 + 232));
__writecr8(v9);
if( v17 )
ExFreePoolWithTag(v17, 0);
v18 = v36;
if( v36 )
{
v19 = v34;
if( v34 )
{
v20 = (unsigned __int64)v27;
v21 = v34;
v33 = v34;
do
{
v35 = MI_READ_PTE_LOCK_FREE(v20);
v22 = v35;
if( (v35 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v35);
v23 = (char *)MmGetPfnDb() + 48 * ((v22 >> 12) & 0xFFFFFFFFFi64);
if( (*((_QWORD *)v23 + 1) | 0x8000000000000000ui64) != v20 )
{
v24 = (unsigned __int8)MiLockPageInline((INT64)v23);
v25 = ExAcquireSpinLockExclusive(SpinLock);
v35 = MI_READ_PTE_LOCK_FREE(v20);
if( (v35 & 1) != 0
&& v23 == (char *)MmGetPfnDb() + 48 * ((v35 >> 12) & 0xFFFFFFFFFi64)
&& (*((_QWORD *)v23 + 1) | 0x8000000000000000ui64) != v20 )
{
v35 = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v20 >> 9) & 0x7FFFFFFFF8i64));
v26 = (*((_QWORD *)v23 + 5) ^ (v35 >> 12)) & 0xFFFFFFFFFi64;
*((_QWORD *)v23 + 1) = v20;
*((_QWORD *)v23 + 5) ^= v26;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)SpinLock);
__writecr8(v25);
_InterlockedAnd64((volatile signed __int64 *)v23 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v24);
v21 = v33;
}
}
v20 += 8i64;
v33 = --v21;
}
while( v21 );
v19 = v34;
v18 = v36;
}
MiReleasePtes((INT64)&qword_140C4EC80, v18, v19);
}
}Referenced by:
MiCreatePagingFile