MiDeleteClusterSection
INT64 __fastcall MiDeleteClusterSection(INT64 rcx0, INT64 a2){
__int64 v3;
unsigned __int64 v4;
__int64 v5;
unsigned int v6;
unsigned __int64 v7;
unsigned int v8;
INT64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
char *v12;
UINT64 v13;
_MMPFN *PfnDb;
unsigned __int64 v15;
_MMPTE *v16;
unsigned __int64 v17;
UINT64 v18;
INT64 v19;
__int64 v20;
char v21;
unsigned int v22;
__int64 v23;
int v24;
unsigned int i;
unsigned int v26;
bool v27;
__int64 v28;
unsigned int v29;
unsigned int v30;
__int64 v31;
unsigned int v32;
bool v33;
char *v34;
__int64 v35;
UINT64 v36;
_MMPFN *v37;
char *v38;
__int64 v39;
UINT8 v40;
_QWORD *v41;
ULONG_PTR v43;
INT64 v44;
INT64 v45;
INT64 v46;
ULONG_PTR BugCheckParameter2;
_MI_PARTITION *Partition;
INT64 v49;
struct _KLOCK_QUEUE_HANDLE LockHandle;
INT64 a1[2];
__int64 v52;
__int128 v53;
v52 = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
v3 = -1i64;
*(_OWORD *)a1 = 0i64;
v4 = *(_QWORD *)(rcx0 + 40);
v5 = v4 & 0xFFFFFFFFFi64;
v6 = 0;
v7 = 0i64;
v8 = 0;
Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((v4 >> 39) & 0x3FF));
while( 1 )
{
v9 = MI_READ_PTE_LOCK_FREE(a2 + 8i64 * v8);
v10 = v9;
if( !v9 || (v9 & 0x800) == 0 )
return 0i64;
if( qword_140C4DC80 )
{
if( (v9 & 0x10) != 0 )
v10 = v9 & 0xFFFFFFFFFFFFFFEFui64;
else
v10 = ~qword_140C4DC80 & v9;
}
v11 = (v10 >> 12) & 0xFFFFFFFFFi64;
if( ((*((_QWORD *)MmGetPfnDb() + 6 * v11 + 5) >> 50) & 1) == 0 )
return 0i64;
v12 = (char *)MmGetPfnDb() + 48 * v11;
BugCheckParameter2 = (ULONG_PTR)v12;
if( MiIsPfnFromSlabAllocation((INT64)v12) || v8 && v11 != v3 )
return 0i64;
++v8;
v3 = v11 + 1;
if( v8 >= 0x10 )
{
v15 = v11 - 15;
v49 = (INT64)PfnDb + 48 * v5;
v16 = (_MMPTE *)(a2 + 120);
v53 = 0i64;
while( 1 )
{
v17 = 0x8000000000000000ui64;
if( v11 == v15 )
{
v18 = (UINT64)PfnDb + 48 * v15;
BugCheckParameter2 = v18;
}
else
{
MiTryLockLeafPage(v16, v13);
v18 = BugCheckParameter2;
if( !BugCheckParameter2 )
goto LABEL_35;
if( (char *)BugCheckParameter2 != v12 )
goto LABEL_34;
}
if( (_MMPTE *)(v17 | *(_QWORD *)(v18 + 8)) != v16 )
{
v43 = MI_READ_PTE_LOCK_FREE((INT64)v16);
KeBugCheckEx(0x1Au, 0x403ui64, (ULONG_PTR)v16, v43, *(_QWORD *)(v18 + 8));
}
if( (*(_BYTE *)(v18 + 34) & 7) == 6 )
MiBadShareCount((_MMPFN *)v18);
if( *(_WORD *)(v18 + 32)
|| (*(_BYTE *)(v18 + 35) & 0x40) != 0
|| MiIsPageOnBadList(v18)
|| MiIsPfnFromSlabAllocation(v19) )
{
break;
}
MiUnlinkPageFromList((_MMPFN *)v18, 0i64);
if( ((*(_QWORD *)(v18 + 40) >> 60) & 7) == 3 )
MiClearPfnImageVerified(v18, 12);
MiReleasePageFileSpace(Partition, *(_QWORD *)(v18 + 16), 1i64);
v20 = *(_QWORD *)(v18 + 16);
if( (v20 & 4) != 0 )
{
v20 &= ~4ui64;
*(_QWORD *)(v18 + 16) = v20;
}
if( (v20 & 2) != 0 )
*(_QWORD *)(v18 + 16) = v20 & 0xFFFFFFFFFFFFFFFDui64;
*(_BYTE *)(v18 + 35) &= 0xF8u;
*(_QWORD *)(v18 + 40) &= 0x8FFFFFFFFFFFFFFFui64;
++*((_DWORD *)&v53 + ((unsigned __int64)*(unsigned __int8 *)(v18 + 34) >> 6));
*(_QWORD *)(v18 + 40) &= ~0x8000000000000000ui64;
*(_BYTE *)(v18 + 34) &= 0xC7u;
*(_BYTE *)(v18 + 35) &= ~0x20u;
v21 = *(_BYTE *)(v18 + 34) & 0xEF;
*(_BYTE *)(v18 + 34) = v21;
*(_BYTE *)(v18 + 34) = v21 & 0xF8 | 1;
*(_QWORD *)(v18 + 8) = 0i64;
*(_QWORD *)(v18 + 24) &= 0x8000000000000000ui64;
*(_QWORD *)(v18 + 16) = 0i64;
*(_QWORD *)v16 = ZeroPte;
++v7;
--v11;
v12 -= 48;
v16 = (_MMPTE *)((char *)v16 - 8);
if( v11 < v15 )
goto LABEL_35;
PfnDb = MmGetPfnDb();
}
if( v11 == v15 )
goto LABEL_35;
LABEL_34:
_InterlockedAnd64((volatile signed __int64 *)(v18 + 24), 0x7FFFFFFFFFFFFFFFui64);
LABEL_35:
v22 = 0;
LODWORD(v23) = 1;
v24 = 0;
for( i = 0; i < 4; i += 4 )
{
v26 = *((_DWORD *)&v53 + i);
if( v26 && v22 )
v24 = 1;
v27 = v22 < v26;
v28 = i + 1;
v29 = i;
if( v22 >= v26 )
v26 = v22;
if( !v27 )
v29 = v23;
v30 = *((_DWORD *)&v53 + v28);
if( v30 && v26 )
v24 = 1;
if( v26 >= v30 )
LODWORD(v28) = v29;
if( v26 >= v30 )
v30 = v26;
v31 = i + 2;
v32 = *((_DWORD *)&v53 + v31);
if( v32 && v30 )
v24 = 1;
v33 = v30 < v32;
v23 = i + 3;
if( v30 >= v32 )
v32 = v30;
if( !v33 )
LODWORD(v31) = v28;
v22 = *((_DWORD *)&v53 + v23);
if( v22 && v32 )
v24 = 1;
if( v32 >= v22 )
LODWORD(v23) = v31;
if( v32 >= v22 )
v22 = v32;
}
if( v24 )
{
v34 = (char *)MmGetPfnDb() + 48 * v15;
v35 = 16i64;
do
{
if( (unsigned __int8)v34[34] >> 6 != (_DWORD)v23 )
MiChangePageAttribute((INT64)v34, (unsigned int)v23, 1);
v34 += 48;
--v35;
}
while( v35 );
}
v36 = v15 + 15;
v37 = MmGetPfnDb();
v38 = (char *)v37 + 48 * v15 + 720;
if( v7 == 16 )
{
a1[0] = v15;
a1[1] = 0x200000001i64;
LOBYTE(v52) = 2;
v39 = *((_QWORD *)Partition + 2) + 4544i64 * (unsigned int)MI_NODE_FROM_PFN((INT64)v37 + 48 * v15 + 720);
LODWORD(v46) = 1;
LODWORD(v44) = 1;
MiInitializeAllResidentPageBasePfns((UINT16 *)Partition, v15, 16i64, 2i64, v23, v44, v46);
LODWORD(v45) = 1;
MiCreateInitialLargeLeafPfns(v15, 16i64, 2i64, v23, *(_WORD *)Partition, v45);
KeAcquireInStackQueuedSpinLockAtDpcLevel((UINT64 *)(v39 + 4328), &LockHandle, v40);
LABEL_73:
v41 = v38 + 40;
do
{
if( v36 == v15 )
break;
if( !v39 )
{
*v41 &= 0xFFFFFFF000000000ui64;
MiInsertPageInFreeOrZeroedList(v36, 2ui64);
}
_InterlockedAnd64(v41 - 2, 0x7FFFFFFFFFFFFFFFui64);
++v6;
--v36;
v41 -= 6;
}
while( v6 < v7 );
MiLockNestedPageAtDpcInline(v49);
*(_QWORD *)(v49 + 24) ^= (*(_QWORD *)(v49 + 24) ^ (*(_QWORD *)(v49 + 24) - v7)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)(v49 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
else
{
v39 = 0i64;
if( v7 )
goto LABEL_73;
}
if( v39 )
{
MiInsertLargePageInNodeList((INT64)a1);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
return 1i64;
}
return 0i64;
}
}
}Referenced by:
MiDeleteSubsectionPages