MiScrubLargeMappedPage
INT64 __fastcall MiScrubLargeMappedPage(UINT64 *a1, INT64 rdx0, INT64 a3){
unsigned int v5;
unsigned __int64 v6;
_MMPTE *PdeBase;
unsigned __int64 v8;
unsigned __int64 v9;
INT64 v10;
_MMPTE *PteBase;
__int64 v12;
char *v13;
INT64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
__int64 v17;
unsigned int v18;
unsigned __int64 v19;
unsigned __int64 v20;
_MMPTE *v21;
__int64 v22;
_MMPFN *PfnDb;
unsigned __int64 v24;
UINT64 v25;
UINT64 v26;
INT64 v27;
INT64 v28;
INT64 v29;
int v30;
INT64 a5;
INT64 a6;
CHAR a7[8];
UINT64 v35;
int v36;
int v37;
UINT64 a2;
unsigned __int64 v39;
unsigned __int64 v40;
unsigned __int64 v41;
INT64 v42;
INT64 v43;
UINT64 *v44;
int result;
__int16 result_4;
int v47;
__int64 v48;
__int64 v49;
v42 = (INT64)a1;
v44 = a1;
memset((INT64)&result, 0i64);
v5 = 1;
HIDWORD(a5) = 1;
result = 1;
result_4 = 0;
v48 = 0i64;
v47 = 20;
v49 = 0i64;
*(_QWORD *)a7 = 0i64;
v6 = ((*(unsigned int *)(a3 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a3 + 33) << 32)) << 12) | 0xFFF;
PdeBase = MmGetPdeBase();
v8 = (unsigned __int64)PdeBase
+ ((((unsigned __int64)*(unsigned int *)(a3 + 24) >> 6) | ((unsigned __int64)*(unsigned __int8 *)(a3 + 32) << 26)) & 0x3FFFFFF8);
v39 = v8;
v9 = (unsigned __int64)PdeBase + ((v6 >> 18) & 0x3FFFFFF8);
v41 = v9;
v10 = rdx0 + 1664;
v43 = v10;
LOWORD(a5) = (unsigned __int8)MiLockWorkingSetShared(v10);
LABEL_2:
PteBase = MmGetPteBase();
while( v8 <= v9 )
{
a6 = v8;
v40 = (_QWORD)PteBase << 25;
v12 = (((__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16 << 25) - ((_QWORD)PteBase << 25)) >> 16;
a2 = (UINT64)MiLockLowestValidPageTable(v10, (INT64 *)v8, (INT64 **)&a6);
v13 = (char *)v9;
if( a6 != v8 )
v13 = (char *)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64);
do
{
v14 = MI_READ_PTE_LOCK_FREE(a6);
v15 = v14;
v35 = v14;
if( v14 )
break;
*(_QWORD *)a7 = 0i64;
v16 = a6 + 8;
a6 = v16;
if( (v16 & 0xFFF) == 0 )
break;
}
while( v16 <= (unsigned __int64)v13 );
if( !v14 )
{
MiUnlockPageTableInternal(v10, a2);
v8 = (unsigned __int64)MmGetPdeBase() + ((MiGetLeafVa(a6) >> 18) & 0x3FFFFFF8);
v39 = v8;
v5 = HIDWORD(a5);
goto LABEL_2;
}
if( (v14 & 1) != 0 && (v14 & 0x80u) != 0i64 )
{
MiPteInShadowRange((UINT64)&v35);
v17 = (v15 >> 12) & 0xFFFFFFFFFi64;
v18 = 1;
v19 = 512i64;
v20 = (__int64)(((__int64)((a6 << 25) - v40) >> 16 << 25) - v40) >> 16;
v21 = MmGetPteBase();
while( v20 >= (unsigned __int64)v21 && v20 <= (unsigned __int64)MmGetPteLimit() )
{
v20 = (__int64)((v20 << 25) - v40) >> 16;
v19 <<= 9;
++v18;
}
MiRewritePteWithLockBit(v10, (volatile INT64 *)a6, ZeroPte);
v35 &= 0xCFFFFFFFFFFFFFFFui64;
MiInsertTbFlushEntry((INT64)&result, v12, 1i64, v18);
MiFlushTbList((__int64)&result);
v22 = *(_QWORD *)a7 & -(__int64)(*(_QWORD *)a7 < v19);
*(_QWORD *)a7 = v22;
v37 = 0;
PfnDb = MmGetPfnDb();
v24 = (unsigned __int64)PfnDb + 48 * v17 + 48 * v19;
v40 = v24;
v25 = (UINT64)PfnDb + 48 * v22 + 48 * v17;
v26 = a2;
while( v25 < v24 )
{
*(_QWORD *)a7 = ++v22;
if( *(_WORD *)(v25 + 32) == 2 )
{
v27 = v42;
if( (int)MiScrubPage((UINT64 *)v42, v25, 0i64, 1) < 0 )
MiMakePageBad(v25, 1);
if( MiWorkingSetIsContended(v10)
|| (MiPageTableLockIsContended(v10, v26, v28, v29, a5, a6, a7[0]), v30)
|| KeShouldYieldProcessor() )
{
v37 = 1;
break;
}
if( MiScrubInterrupted(v27) )
{
BYTE1(a5) = 1;
break;
}
v24 = v40;
v22 = *(_QWORD *)a7;
}
v25 += 48i64;
}
v35 |= 0x20ui64;
v36 = 0;
*(_QWORD *)a6 = v35;
if( v36 )
MiWritePteShadow();
MiUnlockPageTableInternal(v10, a2);
if( v25 == v40 )
{
v8 += 8 * (v19 >> 9);
v39 = v8;
*(_QWORD *)a7 = 0i64;
}
if( BYTE1(a5) == 1 )
{
v5 = 0;
break;
}
v9 = v41;
v5 = HIDWORD(a5);
PteBase = MmGetPteBase();
if( v37 )
{
MiUnlockWorkingSetShared(v10, a5);
MiLockWorkingSetShared(v10);
goto LABEL_2;
}
}
else
{
MiUnlockPageTableInternal(v10, a2);
MiUnlockWorkingSetShared(v10, a5);
v5 = HIDWORD(a5);
PteBase = MmGetPteBase();
MiLockWorkingSetShared(v10);
}
}
MiUnlockWorkingSetShared(v10, a5);
return v5;
}Referenced by:
MiScrubProcessLargePages