MiScrubProcessLargePages
VOID __fastcall MiScrubProcessLargePages(UINT64 *a1){
_ETHREAD *CurrentThread;
__int64 v2;
int v3;
_QWORD *v4;
_QWORD *v5;
_QWORD *v6;
_QWORD *i;
unsigned int v8;
_QWORD **v9;
INT64 v10;
_QWORD *v11;
_QWORD *v12;
_QWORD *v13;
__int64 v14;
int v15;
_DWORD **v16;
unsigned int j;
_DWORD *v18;
_QWORD *v20;
_QWORD *v21;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v2 = *((_QWORD *)CurrentThread + 23);
--*((_WORD *)CurrentThread + 242);
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx(v2 + 1224, 0i64);
*((_BYTE *)CurrentThread + 1304) |= 2u;
if( (*(_DWORD *)(v2 + 1124) & 0x20) != 0 )
{
UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, v2);
}
else
{
v3 = *(_DWORD *)(v2 + 2140);
v4 = 0i64;
v20 = 0i64;
v5 = 0i64;
v6 = *(_QWORD **)(v2 + 2008);
i = 0i64;
v8 = 13;
while( v6 )
{
i = v6;
v6 = (_QWORD *)*v6;
}
while( v3 && i )
{
v9 = (_QWORD **)i[1];
v10 = (INT64)i;
v11 = i;
if( v9 )
{
v12 = *v9;
for( i = (_QWORD *)i[1]; v12; v12 = (_QWORD *)*v12 )
i = v12;
}
else
{
while( 1 )
{
i = (_QWORD *)(i[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !i || (_QWORD *)*i == v11 )
break;
v11 = i;
}
}
if( MiIsVadLargePrivate(v10) && (*(_DWORD *)(v10 + 48) & 0x500000) != 5242880 )
{
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx(v10 + 40, 0i64);
*((_BYTE *)CurrentThread + 1305) |= 0x40u;
if( (*(_DWORD *)(v10 + 48) & 4) != 0 )
{
MiUnlockVadShared((INT64)CurrentThread, v10);
}
else
{
if( v8 >= 0xD )
{
LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
v4 = v13;
if( !v13 )
{
MiUnlockVadShared((INT64)CurrentThread, v10);
break;
}
v8 = 0;
if( v5 )
*v20 = v13;
else
v5 = v13;
v20 = v13;
}
v14 = v8++;
v4[v14 + 1] = v10;
if( !_InterlockedIncrement((volatile signed __int32 *)(v10 + 36)) )
__fastfail(0xEu);
MiUnlockVadShared((INT64)CurrentThread, v10);
--v3;
}
}
}
UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, v2);
v15 = 1;
if( v5 )
{
do
{
v16 = (_DWORD **)(v5 + 1);
v21 = (_QWORD *)*v5;
for( j = 0; j < 0xD; ++j )
{
v18 = *v16;
if( !*v16 )
break;
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)(v18 + 10), 0i64);
*((_BYTE *)CurrentThread + 1304) |= 0x80u;
if( (v18[12] & 4) == 0 && v15 == 1 )
v15 = MiScrubLargeMappedPage(a1, v2, (INT64)v18);
MiUnlockAndDereferenceVad(v18);
++v16;
}
ExFreePoolWithTag(v5, 0);
v5 = v21;
}
while( v21 );
}
}
KeLeaveCriticalRegionThread((__int64)CurrentThread);
}Referenced by:
MiScrubProcesses