MiDeleteEmptySubsections
VOID __stdcall MiDeleteEmptySubsections(_MI_PARTITION *Partition){
_MI_PARTITION_SEGMENTS *p_Segments;
unsigned __int8 v3;
_LIST_ENTRY *DeleteSubsectionList;
unsigned __int8 v5;
_LIST_ENTRY *Flink;
_MSUBSECTION *v7;
_LIST_ENTRY *v8;
_MMPTE *SubsectionBase;
_LIST_ENTRY *p_DereferenceList;
_LIST_ENTRY *v11;
_LIST_ENTRY *Blink;
p_Segments = &Partition->Segments;
v3 = ExAcquireSpinLockExclusive((INT64 *)&Partition->Segments.SegmentListLock);
DeleteSubsectionList = Partition->Segments.DeleteSubsectionList;
while( 1 )
{
v5 = v3;
Flink = DeleteSubsectionList->Flink;
if( DeleteSubsectionList->Flink == DeleteSubsectionList )
break;
v7 = (_MSUBSECTION *)&Flink[-5];
v8 = Flink[-5].Flink;
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&v8[4].Blink) )
{
if( (v7->Core.u.SubsectionFlags._bf_2 & 8) != 0 )
{
SubsectionBase = v7->Core.SubsectionBase;
MiUpdateSystemProtoPtesTree(&v7->ProtosNode.Node, 0i64);
v7->Core.SubsectionBase = 0i64;
p_DereferenceList = &v7->DereferenceList;
v11 = v7->DereferenceList.Flink;
Blink = v7->DereferenceList.Blink;
if( v11->Blink != &v7->DereferenceList || Blink->Flink != p_DereferenceList )
__fastfail(3u);
Blink->Flink = v11;
v11->Blink = Blink;
v7->Core.u.SubsectionFlags._bf_2 &= ~8u;
v7->DereferenceList.Blink = &v7->DereferenceList;
p_DereferenceList->Flink = p_DereferenceList;
MiReduceUnusedSubsectionCount(v7);
}
else
{
SubsectionBase = 0i64;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&v8[4].Blink);
__writecr8(v5);
if( SubsectionBase )
ExFreePoolWithTag(SubsectionBase, 0);
}
else
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
__writecr8(v5);
}
v3 = ExAcquireSpinLockExclusive((INT64 *)&p_Segments->SegmentListLock);
}
Partition->Segments.SubsectionDeletePtes = 0i64;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
__writecr8(v5);
}Referenced by:
MiDereferenceSegmentThread