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