MiDeleteEmptySubsections
VOID __stdcall MiDeleteEmptySubsections(_MI_PARTITION *Partition){
INT64 *v1;
KIRQL v3;
_QWORD *v4;
KIRQL v5;
_QWORD *v6;
_QWORD *v7;
__int64 v8;
void *v9;
_QWORD *v10;
__int64 v11;
_QWORD *v12;
v1 = (INT64 *)((char *)Partition + 1344);
v3 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)Partition + 336);
v4 = (_QWORD *)((char *)Partition + 1736);
while( 1 )
{
v5 = v3;
v6 = (_QWORD *)*v4;
if( (_QWORD *)*v4 == v4 )
break;
v7 = v6 - 10;
v8 = *(v6 - 10);
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v8 + 72)) )
{
if( (*((_BYTE *)v7 + 34) & 8) != 0 )
{
v9 = (void *)v7[1];
MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)(v7 + 14), 0i64);
v7[1] = 0i64;
v10 = v7 + 10;
v11 = v7[10];
v12 = (_QWORD *)v7[11];
if( *(_QWORD **)(v11 + 8) != v7 + 10 || (_QWORD *)*v12 != v10 )
__fastfail(3u);
*v12 = v11;
*(_QWORD *)(v11 + 8) = v12;
*((_WORD *)v7 + 17) &= ~8u;
v7[11] = v7 + 10;
*v10 = v10;
MiReduceUnusedSubsectionCount((_MSUBSECTION *)v7);
}
else
{
v9 = 0i64;
}
ExReleaseSpinLockExclusiveFromDpcLevel(v1);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v8 + 72));
__writecr8(v5);
if( v9 )
ExFreePoolWithTag(v9, 0);
}
else
{
ExReleaseSpinLockExclusiveFromDpcLevel(v1);
__writecr8(v5);
}
v3 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v1);
}
*((_QWORD *)Partition + 178) = 0i64;
ExReleaseSpinLockExclusiveFromDpcLevel(v1);
__writecr8(v5);
}Referenced by:
MiDereferenceSegmentThread