MiDeleteSubsectionLargePages
NTSTATUS __stdcall MiDeleteSubsectionLargePages(INT64 a1, CHAR *a2, INT64 a3){
__int64 v3;
NTSTATUS v4;
_MMPFN *v5;
INT64 v6;
__int64 v8;
unsigned __int64 LeafPfnBuddy;
int v10;
__int64 v11;
unsigned __int64 v12;
_MIPFNBLINK *p_u2;
unsigned __int64 v14;
bool v15;
INT64 v16;
UINT64 v17;
UINT64 v18;
NTSTATUS result;
int v20[8];
UINT64 BitsMustBeChanged;
UINT64 v22;
UINT8 OldIrql;
v3 = 0i64;
v4 = 0;
v5 = (_MMPFN *)a2;
v6 = a1;
if( a2 )
{
do
{
v8 = v5 - MmGetPfnDb();
LeafPfnBuddy = MiGetLeafPfnBuddy(v5);
if( a3 )
{
v11 = ((unsigned __int64)v5->u4._bf_0 >> 39) & 0x3FF;
LODWORD(BitsMustBeChanged) = 1;
MiUpdateLargePageBitMap(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * v11), v8, 0x200ui64, 0i64, BitsMustBeChanged);
v12 = (unsigned __int64)&v5[512];
if( v5 < &v5[512] )
{
p_u2 = &v5->u2;
v3 += 512i64;
do
{
OldIrql = MiLockPageInline((_MMPFN *)&p_u2[-3]);
v14 = p_u2->_bf_0 & 0xC000000000000000ui64;
v15 = LOWORD(p_u2[1]._bf_0) == 2;
LOWORD(p_u2[1]._bf_0) -= 2;
p_u2->_bf_0 = v14;
if( v15 )
{
_InterlockedOr(v20, 0);
MiSetPfnTbFlushStamp((_MMPFN *)&p_u2[-3], (unsigned int)KiTbFlushTimeStamp, 1ui64);
MiInsertPageInFreeOrZeroedList(v8, 2ui64, v16, v17, BitsMustBeChanged, v22);
}
else
{
if( (v14 & 0x4000000000000000i64) == 0 )
p_u2->_bf_0 = v14 | 0x4000000000000000i64;
BYTE2(p_u2[1]._bf_0) |= 7u;
}
MiUnlockPage((_MMPFN *)&p_u2[-3], OldIrql);
p_u2 += 6;
++v8;
}
while( (unsigned __int64)&p_u2[-3] < v12 );
}
}
else
{
MiConvertSmallPageRangeToLarge(v8, 1i64);
MiFreeLargePages(v5);
v4 += v10;
v3 += 512i64;
}
v5 = (_MMPFN *)LeafPfnBuddy;
}
while( LeafPfnBuddy );
v6 = a1;
}
v18 = 8i64 * *(unsigned int *)(v6 + 44);
MmUnlockPreChargedPagedPool(*(_QWORD *)(v6 + 8));
MmReturnChargesToLockPagedPool(*(VOID **)(v6 + 8), v18);
result = v4;
*(_QWORD *)(*(_QWORD *)v6 + 120i64) ^= (*(_QWORD *)(*(_QWORD *)v6 + 120i64) ^ (*(_QWORD *)(*(_QWORD *)v6 + 120i64) - v3)) & 0xFFFFFFFFFi64;
return result;
}Referenced by:
MiDeleteSubsectionPages