MiDeleteClusterSection
NTSTATUS __stdcall MiDeleteClusterSection(_MMPFN *Pfn1, _MMPTE *ProtoPte){
__int64 v3;
unsigned __int64 EntireField;
__int64 v5;
unsigned int v6;
unsigned __int64 v7;
unsigned int v8;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
_MMPFN *v12;
int v13;
UINT64 v14;
_MMPFN *PfnDb;
unsigned __int64 v16;
_MMPTE *v17;
unsigned __int64 v18;
INT64 v19;
int v20;
INT64 v21;
int v22;
__int64 v23;
char v24;
unsigned __int64 Long;
int v26;
INT64 v27;
__int64 v28;
int v29;
UINT64 v30;
unsigned int v31;
bool v32;
__int64 v33;
int v34;
unsigned int v35;
__int64 v36;
unsigned int v37;
bool v38;
_MMPFN *v39;
__int64 v40;
UINT64 v41;
_MMPFN *v42;
_MMPFN *v43;
__int64 v44;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
PVOID v47;
UINT64 v48;
INT64 v49;
INT64 v50;
INT64 v51;
INT64 v52;
_MI_PARTITION *Partition;
_MMPFN *Pfn1a;
_KLOCK_QUEUE_HANDLE LockHandle;
__int128 v56;
__int64 v57;
__int128 v58;
v57 = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
v3 = -1i64;
v56 = 0i64;
EntireField = Pfn1->u4.EntireField;
v5 = EntireField & 0xFFFFFFFFFi64;
v6 = 0;
v7 = 0i64;
v8 = 0;
Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((EntireField >> 39) & 0x3FF));
while( 1 )
{
LODWORD(v9) = MI_READ_PTE_LOCK_FREE((INT64)&ProtoPte[v8]);
v10 = v9;
if( !v9 || (v9 & 0x800) == 0 )
return 0;
if( *(&stru_140C4DB30 + 42) )
{
if( (v9 & 0x10) != 0 )
v10 = v9 & 0xFFFFFFFFFFFFFFEFui64;
else
v10 = ~*(&stru_140C4DB30 + 42) & v9;
}
v11 = (v10 >> 12) & 0xFFFFFFFFFi64;
if( (((unsigned __int64)MmGetPfnDb()[v11].u4._bf_0 >> 50) & 1) == 0 )
return 0;
v12 = &MmGetPfnDb()[v11];
v52 = (INT64)v12;
LOBYTE(v13) = MiIsPfnFromSlabAllocation((INT64)v12);
if( v13 || v8 && v11 != v3 )
return 0;
++v8;
v3 = v11 + 1;
if( v8 >= 0x10 )
{
v16 = v11 - 15;
Pfn1a = &PfnDb[v5];
v17 = ProtoPte + 15;
v58 = 0i64;
while( 1 )
{
v18 = 0x8000000000000000ui64;
if( v11 == v16 )
{
v19 = (INT64)&PfnDb[v16];
v52 = v19;
}
else
{
MiTryLockLeafPage(v17, v14);
v19 = v52;
if( !v52 )
goto LABEL_39;
if( (_MMPFN *)v52 != v12 )
goto LABEL_38;
}
if( (_MMPTE *)(v18 | *(_QWORD *)(v19 + 8)) != v17 )
{
LODWORD(v47) = MI_READ_PTE_LOCK_FREE((INT64)v17);
KeBugCheckEx(0x1Au, (PVOID)0x403, v17, v47, *(PVOID *)(v19 + 8));
}
if( (*(_BYTE *)(v19 + 34) & 7) == 6 )
MiBadShareCount();
if( *(_WORD *)(v19 + 32) )
break;
if( (*(_BYTE *)(v19 + 35) & 0x40) != 0 )
break;
LOBYTE(v20) = MiIsPageOnBadList(v19);
if( v20 )
break;
LOBYTE(v22) = MiIsPfnFromSlabAllocation(v21);
if( v22 )
break;
MiUnlinkPageFromList((_MMPFN *)v19, 0i64);
if( ((*(_QWORD *)(v19 + 40) >> 60) & 7) == 3 )
MiClearPfnImageVerified((PVOID)v19, 0xCui64);
MiReleasePageFileSpace(Partition, *(_MMPTE *)(v19 + 16), 1ui64);
v23 = *(_QWORD *)(v19 + 16);
if( (v23 & 4) != 0 )
{
v23 &= ~4ui64;
*(_QWORD *)(v19 + 16) = v23;
}
if( (v23 & 2) != 0 )
*(_QWORD *)(v19 + 16) = v23 & 0xFFFFFFFFFFFFFFFDui64;
*(_BYTE *)(v19 + 35) &= 0xF8u;
*(_QWORD *)(v19 + 40) &= 0x8FFFFFFFFFFFFFFFui64;
++*((_DWORD *)&v58 + ((unsigned __int64)*(unsigned __int8 *)(v19 + 34) >> 6));
*(_QWORD *)(v19 + 40) &= ~0x8000000000000000ui64;
*(_BYTE *)(v19 + 34) &= 0xC7u;
*(_BYTE *)(v19 + 35) &= ~0x20u;
v24 = *(_BYTE *)(v19 + 34) & 0xEF;
*(_BYTE *)(v19 + 34) = v24;
*(_BYTE *)(v19 + 34) = v24 & 0xF8 | 1;
*(_QWORD *)(v19 + 8) = 0i64;
*(_QWORD *)(v19 + 24) &= 0x8000000000000000ui64;
*(_QWORD *)(v19 + 16) = 0i64;
Long = ZeroPte.u.Long;
LOBYTE(v26) = MiPteInShadowRange((UINT64)v17);
if( v26 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
v17->u.Long = Long;
++v7;
--v11;
--v12;
--v17;
if( v11 < v16 )
goto LABEL_39;
PfnDb = MmGetPfnDb();
}
if( v11 == v16 )
goto LABEL_39;
LABEL_38:
_InterlockedAnd64((volatile signed __int64 *)(v19 + 24), 0x7FFFFFFFFFFFFFFFui64);
LABEL_39:
LODWORD(v27) = 0;
LODWORD(v28) = 1;
v29 = 0;
LODWORD(v30) = 0;
do
{
v31 = *((_DWORD *)&v58 + (unsigned int)v30);
if( v31 && (_DWORD)v27 )
v29 = 1;
v32 = (unsigned int)v27 < v31;
v33 = (unsigned int)(v30 + 1);
v34 = v30;
if( (unsigned int)v27 >= v31 )
v31 = v27;
if( !v32 )
v34 = v28;
v35 = *((_DWORD *)&v58 + v33);
if( v35 && v31 )
v29 = 1;
if( v31 >= v35 )
LODWORD(v33) = v34;
if( v31 >= v35 )
v35 = v31;
v36 = (unsigned int)(v30 + 2);
v37 = *((_DWORD *)&v58 + v36);
if( v37 && v35 )
v29 = 1;
v38 = v35 < v37;
v28 = (unsigned int)(v30 + 3);
if( v35 >= v37 )
v37 = v35;
if( !v38 )
LODWORD(v36) = v33;
v27 = *((unsigned int *)&v58 + v28);
if( (_DWORD)v27 && v37 )
v29 = 1;
if( v37 >= (unsigned int)v27 )
LODWORD(v28) = v36;
v30 = (unsigned int)(v30 + 4);
if( v37 >= (unsigned int)v27 )
v27 = v37;
}
while( (unsigned int)v30 < 4 );
if( v29 )
{
v39 = &MmGetPfnDb()[v16];
v40 = 16i64;
do
{
if( *((unsigned __int8 *)&v39->u3 + 2) >> 6 != (_DWORD)v28 )
MiChangePageAttribute(v39, (_MI_PFN_CACHE_ATTRIBUTE)v28, 1ui64);
++v39;
--v40;
}
while( v40 );
}
v41 = v16 + 15;
v42 = MmGetPfnDb();
v43 = &v42[v16 + 15];
if( v7 == 16 )
{
*(_QWORD *)&v56 = v16;
*((_QWORD *)&v56 + 1) = 0x200000001i64;
LOBYTE(v57) = 2;
v44 = (__int64)&Partition->Core.NodeInformation[MI_NODE_FROM_PFN((INT64)&v42[v16 + 15])];
LODWORD(v51) = 1;
LODWORD(v49) = 1;
MiInitializeAllResidentPageBasePfns(&Partition->Core.PartitionId, v16, 16i64, 2i64, v28, v49, v51);
LODWORD(v50) = 1;
MiCreateInitialLargeLeafPfns(v16, 16i64, 2i64, v28, Partition->Core.PartitionId, v50);
KeAcquireInStackQueuedSpinLockAtDpcLevel((PKSPIN_LOCK)(v44 + 4328), &LockHandle);
LABEL_77:
p_u4 = &v43->u4;
do
{
if( v41 == v16 )
break;
if( !v44 )
{
p_u4->_bf_0 &= 0xFFFFFFF000000000ui64;
MiInsertPageInFreeOrZeroedList(v41, 2ui64, v27, v30, v48, v49);
}
_InterlockedAnd64(&p_u4[-2]._bf_0, 0x7FFFFFFFFFFFFFFFui64);
++v6;
--v41;
p_u4 -= 6;
}
while( v6 < v7 );
MiLockNestedPageAtDpcInline(Pfn1a);
Pfn1a->u2._bf_0 ^= (Pfn1a->u2._bf_0 ^ (Pfn1a->u2._bf_0 - v7)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&Pfn1a->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
else
{
v44 = 0i64;
if( v7 )
goto LABEL_77;
}
if( v44 )
{
MiInsertLargePageInNodeList((__int64)&v56);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
return 1;
}
return 0;
}
}
}Referenced by:
MiDeleteSubsectionPages