MiFreePhysicalPages
INT64 __fastcall MiFreePhysicalPages(INT64 a1, INT64 a2){
INT64 v3;
__int64 *v4;
unsigned int v5;
UINT64 v6;
_QWORD *v7;
unsigned __int64 v8;
_ETHREAD *CurrentThread;
INT64 v10;
unsigned __int64 v11;
const signed __int64 *v12;
_MMPTE *PteBase;
__int64 v14;
unsigned __int64 v15;
char *v16;
VOID *v17;
unsigned __int64 v18;
UINT64 v19;
VOID *v20;
UINT8 v21;
char v22;
INT64 v23;
INT64 v24;
int v25;
INT64 v26;
INT64 a5;
INT64 a6;
UINT64 CommitSize;
unsigned __int64 v30;
signed __int64 *v31;
_ETHREAD *v32;
unsigned __int64 v33;
__int64 v35;
unsigned __int64 v36;
unsigned __int64 v37;
ULONG_PTR BugCheckParameter2;
int result;
__int16 result_4;
int v41;
__int64 v42;
__int64 v43;
v3 = a1;
memset((INT64)&result, 0i64);
result = 1;
result_4 = 0;
v4 = (__int64 *)(a2 + 48);
v42 = 0i64;
v5 = 0;
v43 = 0i64;
v6 = 0i64;
LODWORD(a6) = 0;
v7 = (_QWORD *)(a2 + 48);
v8 = (unsigned __int64)*(unsigned int *)(a2 + 40) >> 12;
v41 = 20;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
LOBYTE(a5) = 17;
v32 = CurrentThread;
v30 = a2 + 48 + 8 * v8;
v33 = *(_QWORD *)(v3 + 8);
v10 = *((_QWORD *)CurrentThread + 23) + 1664i64;
HIDWORD(a6) = *(_DWORD *)v3 & 1;
if( HIDWORD(a6) )
MiLockAweVadsExclusive((INT64)CurrentThread);
--*((_WORD *)CurrentThread + 243);
BugCheckParameter2 = v3 + 56;
ExAcquireAutoExpandPushLockExclusive(v3 + 56, 0i64);
v11 = *(_QWORD *)(v3 + 16);
v12 = *(const signed __int64 **)(v3 + 24);
v37 = v11;
v31 = (signed __int64 *)v12;
if( (unsigned __int64)v4 < v30 )
{
PteBase = MmGetPteBase();
while( 1 )
{
v35 = *v4;
v14 = *v4;
v15 = *v4 / v33;
v36 = v15;
if( *v4 % v33 )
break;
if( v15 >= v11 )
break;
if( !_bittest64(v12, v15) )
break;
v16 = (char *)MmGetPfnDb() + 48 * v35;
CommitSize = (UINT64)v16;
if( (*((_QWORD *)v16 + 3) & 0x4000000000000000i64) != 0 )
break;
v17 = (VOID *)(*((_QWORD *)v16 + 3) & 0x3FFFFFFFFFFFFFFFi64);
if( v17 != (VOID *)1 && (*(_DWORD *)v3 & 1) != 0 )
{
v18 = *((_QWORD *)v16 + 1);
v19 = (UINT64)PteBase + ((v18 >> 9) & 0x7FFFFFFFF8i64);
if( v6 != v19 )
{
if( v6 )
{
MiFlushTbList((__int64)&result);
MiUnlockPageTableInternal(v10, v6);
}
v6 = v19;
if( (_BYTE)a5 == 17 )
LOBYTE(a5) = MiLockWorkingSetShared(v10);
MiLockPageTableInternal(v10, v19, 0i64);
}
HIDWORD(a5) = 0;
*(_QWORD *)v18 = ZeroPte;
MiUpdateAwePageTable(v6, -1i64, 0xFFFFFFFFi64);
MiInsertTbFlushEntry((INT64)&result, (__int64)((v18 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, 1i64, 0i64);
MiDecrementAweMapCount(v20, CommitSize, (UINT64)MmBadPointer);
v16 = (char *)CommitSize;
v3 = a1;
v14 = v35;
}
if( !MiDecrementAweMapCount(v17, (UINT64)v16, (UINT64)MmBadPointer) )
{
*v7++ = v14;
_bittestandreset64(v31, v36);
}
v21 = a5;
v22 = a6 + 1;
LODWORD(a6) = a6 + 1;
if( (_BYTE)a5 != 17 && (v22 & 0x3F) == 0 )
{
if( MiWorkingSetIsContended(v10)
|| (MiPageTableLockIsContended(v10, v6, v23, v24, a5, a6, CommitSize), v25)
|| KeShouldYieldProcessor() )
{
MiFlushTbList((__int64)&result);
MiUnlockPageTableInternal(v10, v6);
MiUnlockWorkingSetShared(v10, v21);
v6 = 0i64;
LOBYTE(a5) = 17;
}
}
v12 = v31;
++v4;
v11 = v37;
PteBase = MmGetPteBase();
if( (unsigned __int64)v4 >= v30 )
goto LABEL_29;
}
v5 = -1073741800;
LABEL_29:
if( v6 )
{
MiFlushTbList((__int64)&result);
MiUnlockPageTableInternal(v10, v6);
MiUnlockWorkingSetShared(v10, a5);
}
CurrentThread = v32;
}
ExReleaseAutoExpandPushLockExclusive(BugCheckParameter2, 0i64);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( HIDWORD(a6) )
MiUnlockAweVadsExclusive((__int64)CurrentThread);
v26 = v5;
*(_DWORD *)(a2 + 44) = ((__int64)v4 - a2 - 48) >> 3;
*(_DWORD *)(a2 + 40) = ((__int64)v7 - a2 - 48) >> 3;
return v26;
}Referenced by:
NtFreeUserPhysicalPages