MiDeleteSubsectionLargePages
INT64 __fastcall MiDeleteSubsectionLargePages(INT64 a1, CHAR *a2, INT64 a3){
__int64 v3;
INT64 v4;
CHAR *v5;
INT64 v6;
__int64 v8;
UINT64 LeafPfnBuddy;
__int64 v10;
__int64 v11;
unsigned __int64 v12;
CHAR *v13;
unsigned __int64 v14;
bool v15;
UINT64 v16;
INT64 result;
int v18[8];
UINT64 BitsMustBeChanged;
UINT8 OldIrql;
v3 = 0i64;
v4 = 0i64;
v5 = a2;
v6 = a1;
if( a2 )
{
do
{
v8 = (v5 - (CHAR *)MmGetPfnDb()) / 48;
LeafPfnBuddy = MiGetLeafPfnBuddy(v5);
if( a3 )
{
v11 = (*((_QWORD *)v5 + 5) >> 39) & 0x3FFi64;
LODWORD(BitsMustBeChanged) = 1;
MiUpdateLargePageBitMap(*(_QWORD *)(qword_140C4E388 + 8 * v11), v8, 0x200ui64, 0i64, BitsMustBeChanged);
v12 = (unsigned __int64)(v5 + 24576);
if( v5 < v5 + 24576 )
{
v13 = v5 + 24;
v3 += 512i64;
do
{
OldIrql = MiLockPageInline((INT64)(v13 - 24));
v14 = *(_QWORD *)v13 & 0xC000000000000000ui64;
v15 = *((_WORD *)v13 + 4) == 2;
*((_WORD *)v13 + 4) -= 2;
*(_QWORD *)v13 = v14;
if( v15 )
{
_InterlockedOr(v18, 0);
MiSetPfnTbFlushStamp((_MMPFN *)(v13 - 24), (unsigned int)KiTbFlushTimeStamp, 1ui64);
MiInsertPageInFreeOrZeroedList(v8, 2ui64);
}
else
{
if( (v14 & 0x4000000000000000i64) == 0 )
*(_QWORD *)v13 = v14 | 0x4000000000000000i64;
v13[10] |= 7u;
}
MiUnlockPage((_MMPFN *)(v13 - 24), OldIrql);
v13 += 48;
++v8;
}
while( (unsigned __int64)(v13 - 24) < v12 );
}
}
else
{
MiConvertSmallPageRangeToLarge(v8, 1i64);
MiFreeLargePages((_MMPFN *)v5);
v4 += v10;
v3 += 512i64;
}
v5 = (CHAR *)LeafPfnBuddy;
}
while( LeafPfnBuddy );
v6 = a1;
}
v16 = 8i64 * *(unsigned int *)(v6 + 44);
MmUnlockPreChargedPagedPool(*(PVOID *)(v6 + 8), v16);
MmReturnChargesToLockPagedPool(*(PVOID *)(v6 + 8), v16);
result = v4;
*(_QWORD *)(*(_QWORD *)v6 + 120i64) ^= (*(_QWORD *)(*(_QWORD *)v6 + 120i64) ^ (*(_QWORD *)(*(_QWORD *)v6 + 120i64) - v3)) & 0xFFFFFFFFFi64;
return result;
}Referenced by:
MiDeleteSubsectionPages