MiDeleteClusterPage
INT64 __fastcall MiDeleteClusterPage(UINT64 P2, UINT8 *a2){
UINT64 v2;
__int64 v3;
unsigned __int64 v5;
INT64 v6;
unsigned __int64 i;
INT64 v8;
UNICODE_STRING *v9;
unsigned __int64 v10;
UNICODE_STRING *v11;
int v12;
__int64 v13;
__int64 v14;
unsigned __int64 v15;
__int64 v16;
char *v17;
INT64 v18;
unsigned __int64 v19;
INT64 v20;
bool v21;
unsigned __int64 v22;
ULONG_PTR v23;
unsigned int v24;
volatile signed __int64 *j;
unsigned int v27;
char *v28;
unsigned __int64 *v29;
UINT64 v30;
unsigned int v31;
INT64 v32;
char v33;
INT64 v34;
char v35;
unsigned __int64 v36;
char *v37;
ULONG_PTR v38;
ULONG_PTR BugCheckParameter4;
INT64 v40;
INT64 v41;
unsigned __int64 v42;
INT64 v43;
UINT64 v44;
INT64 a1;
INT64 v46;
UINT64 v47;
__int64 v48;
INT64 v49[2];
__int64 v50;
__int128 v51;
v2 = P2;
v50 = 0i64;
v3 = -1i64;
v41 = -1i64;
*(_OWORD *)v49 = 0i64;
v5 = -1i64;
v48 = *((_QWORD *)KeGetCurrentThread() + 23);
a1 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v48 + 1838));
v44 = *(_QWORD *)((char *)MmGetPteBase() + ((P2 >> 9) & 0x7FFFFFFFF8i64));
v6 = P2;
v47 = (v44 >> 12) & 0xFFFFFFFFFi64;
for( i = 0i64; i < 0x10; ++i )
{
v8 = MI_READ_PTE_LOCK_FREE(v6);
if( !v8 )
return 0i64;
if( (v8 & 0x400) == 0 )
return 0i64;
v42 = v8 & 0xFFFFFFFFFFFFFBFEui64 | 1;
v10 = (v42 >> 12) & 0xFFFFFFFFFi64;
if( i )
{
if( v10 != v5 )
return 0i64;
}
v11 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 48 * v10);
if( byte_140C51D9E )
{
v9 = (UNICODE_STRING *)((unsigned __int64)((__int64)(48 * v10) / 48) >> 9);
if( _bittest64((const signed __int64 *)qword_140C522C8, (unsigned __int64)v9) )
return 0i64;
}
LOBYTE(v12) = MI_PFN_IS_PROTO(v11, v9, v42 >> 12, &v11->Length);
if( v12 || *(_QWORD *)(qword_140C4E388 + 8 * ((*(_QWORD *)(v14 + 40) >> 39) & 0x3FFi64)) != a1 )
return 0i64;
v5 = v13 + 1;
v6 += 8i64;
}
MiDeleteBatch(a2);
v46 = v5 - 16;
v15 = v5 - 16;
v16 = 48 * (v5 - 16);
v17 = (char *)MmGetPfnDb() + v16;
v18 = (INT64)v17;
v19 = (__int64)((unsigned __int128)(v16 * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3;
MiSearchNumaNodeTable((PVOID)(v19 + (v19 >> 63)));
v51 = 0i64;
v21 = v5 - 16 == v5;
if( v5 - 16 < v5 )
{
v22 = v5 - 16;
v46 = v5 - 16;
while( 1 )
{
if( v15 == v22 )
{
MiLockPageAtDpc((INT64)v17);
}
else if( !MiTryLockNestedPageAtDpcInline((INT64)v17) )
{
goto LABEL_22;
}
v23 = *((_QWORD *)v17 + 1);
v41 = v15;
if( (v23 | 0x8000000000000000ui64) != v2 )
{
v38 = MI_READ_PTE_LOCK_FREE(v2);
KeBugCheckEx(0x1Au, 0x403ui64, v2, v38, v23);
}
v24 = (unsigned __int8)v17[34];
if( (v24 & 7) != 6 )
MiBadShareCount((_MMPFN *)v17);
if( *((_WORD *)v17 + 16) != 1 || (v17[35] & 0x40) != 0 )
break;
++v15;
v17 += 48;
v2 += 8i64;
++*((_DWORD *)&v51 + ((unsigned __int64)v24 >> 6));
if( v15 >= v5 )
{
LABEL_22:
v3 = v41;
goto LABEL_24;
}
v22 = v5 - 16;
}
v3 = v15;
LABEL_24:
v21 = v15 == v5;
}
if( !v21 )
{
if( v3 != -1 )
{
for( j = (volatile signed __int64 *)((char *)MmGetPfnDb() + 48 * v3); j != (volatile signed __int64 *)v18; j -= 6 )
_InterlockedAnd64(j + 3, 0x7FFFFFFFFFFFFFFFui64);
_InterlockedAnd64(j + 3, 0x7FFFFFFFFFFFFFFFui64);
}
return 0i64;
}
v27 = 0;
v28 = v17;
v29 = (unsigned __int64 *)(v2 - 128);
v30 = (UINT64)(v17 - 768);
v31 = 1;
if( (_DWORD)v51 )
{
v27 = v51;
v31 = 0;
}
if( v27 < DWORD1(v51) )
{
v27 = DWORD1(v51);
v31 = 1;
}
if( v27 < DWORD2(v51) )
{
v27 = DWORD2(v51);
v31 = 2;
}
v32 = a1;
if( v27 < HIDWORD(v51) )
v31 = 3;
do
{
v33 = (*(_QWORD *)(v30 + 40) >> 60) & 7;
*(_WORD *)(v30 + 32) = 2;
if( v33 == 3 )
MiClearPfnImageVerified(v30, 12);
v43 = *(_QWORD *)(v30 + 16);
if( (v43 & 0x400) == 0 )
{
v34 = (v43 & 4) != 0 || (v43 & 2) != 0 ? MI_READ_PTE_LOCK_FREE((INT64)&v43) : 0i64;
v43 = v34;
if( v34 )
MiReleasePageFileInfo(v32, v34, 0, v20, BugCheckParameter4, v40, v41, v42, v43, v44, a1, v46);
}
*(_QWORD *)(v30 + 16) = ZeroPte;
if( *(unsigned __int8 *)(v30 + 34) >> 6 != v31 )
MiChangePageAttribute(v30, v31, 1);
v35 = *(_BYTE *)(v30 + 35);
if( (v35 & 0x10) != 0 )
*(_BYTE *)(v30 + 35) = v35 & 0xEF;
MiConvertLockedSmallPageToLarge(v30, v18, 2, 0i64);
if( v30 != v18 )
_InterlockedAnd64((volatile signed __int64 *)(v30 + 24), 0x7FFFFFFFFFFFFFFFui64);
v36 = ZeroPte;
if( v29 >= (unsigned __int64 *)MmGetPml4eBase()
&& v29 <= (unsigned __int64 *)MmGetPxeUserLimit()
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (ZeroPte & 1) != 0 )
{
v36 = ZeroPte | 0x8000000000000000ui64;
}
*v29 = v36;
v30 += 48i64;
++v29;
}
while( v30 < (unsigned __int64)v28 );
v49[0] = v46;
v49[1] = 1i64;
LOBYTE(v50) = 2;
MiInsertLargePageInNodeList((INT64)v49);
v37 = (char *)MmGetPfnDb() + 48 * v47;
MiLockPageAtDpc((INT64)v37);
*((_QWORD *)v37 + 3) ^= (*((_QWORD *)v37 + 3) ^ (*((_QWORD *)v37 + 3) - 16i64)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v37 + 3, 0x7FFFFFFFFFFFFFFFui64);
_InterlockedExchangeAdd64((volatile signed __int64 *)(v48 + 1272), 0xFFFFFFFFFFFFFFF0ui64);
return 1i64;
}Referenced by:
MiDeletePteRun