MiMirrorGatherBrownPages
__int64 __fastcall MiMirrorGatherBrownPages(UINT64 *a1, __int64 a2, int a3, unsigned int a4){
__int64 v4;
unsigned int v5;
__int64 v6;
__int64 v7;
unsigned int v8;
_QWORD *v9;
unsigned int v10;
__int64 v11;
_MMPFN *PfnDb;
$559D8309DABD45803AD694472C7FC28A *v13;
int v14;
__int64 *v15;
__int64 v16;
_MMPFN *v17;
__int64 i;
$559D8309DABD45803AD694472C7FC28A *v19;
__int64 result;
unsigned __int64 bf_0;
__int64 v22;
_MMPFN *v23;
$559D8309DABD45803AD694472C7FC28A *v24;
$559D8309DABD45803AD694472C7FC28A *v25;
UINT64 PhaseNumber;
_KLOCK_QUEUE_HANDLE LockHandle;
unsigned int v28;
int v30;
unsigned int v31;
v31 = a4;
v4 = a3;
v30 = 0;
PhaseNumber = *a1;
v5 = a4;
v6 = 16i64;
v7 = a2;
v8 = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
if( a3 <= 4i64 )
{
while( 1 )
{
v9 = *(_QWORD **)(v7 + 8 * v4 + 4216);
v10 = v5;
v28 = v5;
if( v4 <= 1 )
v9 = (_QWORD *)(*(_QWORD *)(v7 + 8 * v4 + 2176) + 40i64 * v8);
if( v4 == 2 )
v9 = (_QWORD *)(v7 + 40i64 * v5 + 2432);
if( v4 != 3 )
goto LABEL_7;
if( *v9 != *(_QWORD *)(v7 + 7600) )
break;
LABEL_22:
if( ++v4 > 4 )
goto LABEL_23;
}
v9 = (_QWORD *)(v7 + 40i64 * v5 + 3456);
LABEL_7:
KeAcquireInStackQueuedSpinLock(v9 + 4, &LockHandle);
if( *v9 )
{
v11 = v9[2];
PfnDb = MmGetPfnDb();
do
{
v13 = ($559D8309DABD45803AD694472C7FC28A *)&PfnDb[v11];
LOBYTE(v14) = MiIsPfnFileOnly((INT64)v13);
if( !v14 )
{
if( v4 == 2 && MiIsDecayPfn(v11) == 1 )
{
bf_0 = v13[2]._bf_0;
if( *(&stru_140C4DB30 + 42) && (bf_0 & 0x10) == 0 )
bf_0 &= ~*(&stru_140C4DB30 + 42);
v22 = (bf_0 >> 12) & 0xFFFFFFFFFi64;
if( v22 != v11 )
{
v23 = MmGetPfnDb();
do
{
v24 = ($559D8309DABD45803AD694472C7FC28A *)&v23[v22];
MiMirrorAddPagesToBrownList(v22, 1ui64);
v22 = v24->_bf_0 & 0xFFFFFFFFFi64;
}
while( v22 != v11 );
PfnDb = MmGetPfnDb();
v6 = 16i64;
}
}
else
{
MiMirrorAddPagesToBrownList(v11, 1ui64);
}
}
v11 = v13->_bf_0 & 0xFFFFFFFFFi64;
}
while( v11 != 0xFFFFFFFFFi64 );
v7 = a2;
v5 = v31;
v8 = v30;
v10 = v28;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v4 <= 1 )
{
v30 = ++v8;
if( v8 >= *(&stru_140C4DB30 + 67) )
{
v30 = 0;
v8 = 0;
if( v4 == 1 )
MiMirrorNodeLargePages(PhaseNumber, (_MM_MIRROR_DISPATCH *)v7, 0);
}
else
{
--v4;
}
}
else if( v4 == 2 )
{
++v5;
if( v10 == 7 )
v5 = 0;
if( v10 != 7 )
v4 = 1i64;
v31 = v5;
}
else if( v4 == 3 )
{
v31 = ++v5;
if( v5 != 16 )
v4 = 2i64;
}
goto LABEL_22;
}
LABEL_23:
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v7 + 7520), &LockHandle);
v15 = (__int64 *)(v7 + 2832);
do
{
v16 = *v15;
v17 = MmGetPfnDb();
while( v16 != 0xFFFFFFFFFi64 )
{
v25 = ($559D8309DABD45803AD694472C7FC28A *)&v17[v16];
MiMirrorAddPagesToBrownList(v16, 1ui64);
v16 = v25->_bf_0 & 0xFFFFFFFFFi64;
}
v15 += 5;
--v6;
}
while( v6 );
for( i = *(_QWORD *)(v7 + 2768); i != 0xFFFFFFFFFi64; i = v19->_bf_0 & 0xFFFFFFFFFi64 )
{
v19 = ($559D8309DABD45803AD694472C7FC28A *)&v17[i];
MiMirrorAddPagesToBrownList(i, 1ui64);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
MiMirrorBrownPhase