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