MiScrubNode
VOID __fastcall MiScrubNode(INT64 a1){
_KEVENT *v1;
UINT64 v2;
_MI_PARTITION *v4;
unsigned int *v5;
unsigned int *v6;
_DWORD *v7;
__int64 v8;
UINT64 v9;
UINT64 v10;
char *i;
UINT64 v12;
int v13;
unsigned __int64 v14;
UINT64 *ZeroFreeCount;
UINT64 DrainStacks;
_MI_PARTITION *v17;
v2 = *(unsigned int *)(a1 + 8);
v4 = *(_MI_PARTITION **)(*(_QWORD *)a1 + 48i64);
v5 = *(unsigned int **)(a1 + 216);
v17 = v4;
v6 = &v5[4 * *v5 + 4];
MiScrubNodeLargePages((PVOID)a1, v4, v2, v1);
v7 = *(_DWORD **)(a1 + 216);
v8 = 0i64;
if( *v7 )
{
while( v6[2 * v8] != *(_DWORD *)(a1 + 8) )
{
LABEL_19:
v7 = *(_DWORD **)(a1 + 216);
v8 = (unsigned int)(v8 + 1);
if( (unsigned int)v8 >= *v7 )
return;
}
v9 = *(_QWORD *)&v7[4 * (unsigned int)v8 + 4];
v10 = v9 + *(_QWORD *)&v7[4 * (unsigned int)v8 + 6] - 1i64;
for( i = (char *)MmGetPfnDb() + 48 * v10; ; i -= 48 )
{
if( v10 < v9 || !v9 )
goto LABEL_19;
if( MiScrubInterrupted(a1) )
return;
LODWORD(DrainStacks) = 0;
v12 = MiPfnsWorthTrying(v4, (_MMPFN *)i, 1ui64, 0x7000000ui64, &DrainStacks, ZeroFreeCount);
if( v12 )
{
if( v12 >= v10 - v9 + 1 )
goto LABEL_19;
i += 48 - 48 * v12;
v10 += 1 - v12;
}
else
{
if( (_DWORD)DrainStacks == 1 )
MiEmptyKernelStackCache();
if( !MiClaimPhysicalRun(
(__int64)v4,
v10,
1i64,
0xFFFFFFFFFi64,
a1 + 176,
117440512,
-1,
0i64,
(unsigned __int8)i[34] >> 6,
0i64) )
{
v13 = MiScrubPage((UINT64 *)a1, (INT64)i, 0i64, 0);
v14 = (unsigned __int8)MiLockPageInline((INT64)i);
if( v13 < 0 || (i[35] & 0x40) != 0 )
{
v4 = v17;
if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)i + 5) >> 39) & 0x3FFi64)) == v17 )
{
MiMakePageBad((UINT64)i, 2);
LABEL_16:
_InterlockedAnd64((volatile signed __int64 *)i + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
goto LABEL_17;
}
}
else
{
v4 = v17;
}
MiInsertPageInFreeOrZeroedList(v10, 2ui64);
goto LABEL_16;
}
}
LABEL_17:
--v10;
}
}
}Referenced by:
MiScrubMemoryWorker