MiMirrorGatherBrownPages
INT64 __fastcall MiMirrorGatherBrownPages(INT64 *a1, _QWORD *a2, INT64 a3, UINT64 a4){
__int64 v4;
unsigned int v5;
__int64 v6;
_QWORD *v7;
unsigned int v8;
_QWORD *v9;
unsigned int v10;
__int64 v11;
_MMPFN *PfnDb;
_QWORD *v13;
__int64 *v14;
__int64 v15;
_MMPFN *v16;
__int64 i;
_QWORD *v18;
INT64 result;
unsigned __int64 v20;
__int64 v21;
_MMPFN *v22;
_QWORD *v23;
_QWORD *v24;
INT64 v25;
struct _KLOCK_QUEUE_HANDLE LockHandle;
unsigned int v27;
unsigned int v29;
int v30;
v30 = a4;
v4 = (int)a3;
v29 = 0;
v25 = *a1;
v5 = a4;
v6 = 16i64;
v7 = a2;
v8 = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
if( (int)a3 <= 4i64 )
{
while( 1 )
{
v9 = (_QWORD *)v7[v4 + 527];
v10 = v5;
v27 = v5;
if( v4 <= 1 )
v9 = (_QWORD *)(v7[v4 + 272] + 40i64 * v8);
if( v4 == 2 )
v9 = &v7[5 * v5 + 304];
if( v4 != 3 )
goto LABEL_7;
if( *v9 != v7[950] )
break;
LABEL_22:
if( ++v4 > 4 )
goto LABEL_23;
}
v9 = &v7[5 * v5 + 432];
LABEL_7:
KeAcquireInStackQueuedSpinLock(v9 + 4, &LockHandle);
if( *v9 )
{
v11 = v9[2];
PfnDb = MmGetPfnDb();
do
{
v13 = (_QWORD *)((char *)PfnDb + 48 * v11);
if( !MiIsPfnFileOnly((INT64)v13) )
{
if( v4 == 2 && (unsigned int)MiIsDecayPfn(v11) == 1 )
{
v20 = v13[2];
if( qword_140C4DC80 && (v20 & 0x10) == 0 )
v20 &= ~qword_140C4DC80;
v21 = (v20 >> 12) & 0xFFFFFFFFFi64;
if( v21 != v11 )
{
v22 = MmGetPfnDb();
do
{
v23 = (_QWORD *)((char *)v22 + 48 * v21);
MiMirrorAddPagesToBrownList(v21, 1ui64);
v21 = *v23 & 0xFFFFFFFFFi64;
}
while( v21 != v11 );
PfnDb = MmGetPfnDb();
v6 = 16i64;
}
}
else
{
MiMirrorAddPagesToBrownList(v11, 1ui64);
}
}
v11 = *v13 & 0xFFFFFFFFFi64;
}
while( v11 != 0xFFFFFFFFFi64 );
v7 = a2;
v5 = v30;
v8 = v29;
v10 = v27;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v4 <= 1 )
{
v29 = ++v8;
if( v8 >= dword_140C4DC3C )
{
v29 = 0;
v8 = 0;
if( v4 == 1 )
MiMirrorNodeLargePages(v25, (INT64)v7, 0i64);
}
else
{
--v4;
}
}
else if( v4 == 2 )
{
++v5;
if( v10 == 7 )
v5 = 0;
if( v10 != 7 )
v4 = 1i64;
v30 = v5;
}
else if( v4 == 3 )
{
v30 = ++v5;
if( v5 != 16 )
v4 = 2i64;
}
goto LABEL_22;
}
LABEL_23:
KeAcquireInStackQueuedSpinLock(v7 + 940, &LockHandle);
v14 = v7 + 354;
do
{
v15 = *v14;
v16 = MmGetPfnDb();
while( v15 != 0xFFFFFFFFFi64 )
{
v24 = (_QWORD *)((char *)v16 + 48 * v15);
MiMirrorAddPagesToBrownList(v15, 1ui64);
v15 = *v24 & 0xFFFFFFFFFi64;
}
v14 += 5;
--v6;
}
while( v6 );
for( i = v7[346]; i != 0xFFFFFFFFFi64; i = *v18 & 0xFFFFFFFFFi64 )
{
v18 = (_QWORD *)((char *)v16 + 48 * i);
MiMirrorAddPagesToBrownList(i, 1ui64);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
MiMirrorBrownPhase