MiDeleteSegmentPages

VOID __fastcall MiDeleteSegmentPages(_CONTROL_AREA *ControlArea){
  _SUBSECTION *v1; 
  __int64 v2; 
  __int64 v4; 
  _MI_PARTITION *v5; 
  _SEGMENT *Segment; 
  _SEGMENT_FLAGS SegmentFlags; 
  __int64 v8; 
  unsigned __int64 v9; 
  __int64 CommittedPages; 
  unsigned __int64 v11; 
  struct _KPRCB *CurrentPrcb; 
  __int64 CachedResidentAvailable; 
  bool v14; 
  signed __int32 v15; 
  UINT64 DanglingPageCount; 
  _MI_PARTITION *v17; 

  v1 = (_SUBSECTION *)&ControlArea[1];
  v2 = ControlArea->u1.Flags._bf_0 & 0x3FF;
  DanglingPageCount = 0i64;
  v4 = 0i64;
  v5 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v2);
  Segment = ControlArea->Segment;
  v17 = v5;
  SegmentFlags = Segment->SegmentFlags;
  while( v1 )
  {
    LODWORD(v8) = MiDeleteSubsectionPages(v1, &DanglingPageCount);
    v1 = v1->NextSubsection;
    v4 += v8;
  }
  v9 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
  if( ControlArea->NumberOfPfnReferences )
  {
    do
    {
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
      __writecr8(v9);
      _mm_pause();
      ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
    }
    while( ControlArea->NumberOfPfnReferences );
    v5 = v17;
  }
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
  __writecr8(v9);
  CommittedPages = MiGetCommittedPages(ControlArea);
  if( CommittedPages )
  {
    if( (SegmentFlags.Short0 & 0x1000) != 0 )
    {
      v11 = CommittedPages - DanglingPageCount;
      if( v5 == &Irp )
      {
        CurrentPrcb = KeGetCurrentPrcb();
        CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
        if( (_DWORD)CachedResidentAvailable != -1 )
        {
          if( v11 + CachedResidentAvailable <= 0x100 )
          {
            do
            {
              if( v11 >= 0x80000 )
                break;
              v15 = _InterlockedCompareExchange(
                      (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                      CachedResidentAvailable + v11,
                      CachedResidentAvailable);
              v14 = (_DWORD)CachedResidentAvailable == v15;
              LODWORD(CachedResidentAvailable) = v15;
              if( v14 )
                goto LABEL_7;
            }
            while( v15 != -1 && v11 + v15 <= 0x100 );
          }
          if( (int)CachedResidentAvailable > 192
            && (_DWORD)CachedResidentAvailable != -1
            && (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
                                                    (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                                                    192,
                                                    CachedResidentAvailable) )
          {
            v11 += (int)CachedResidentAvailable - 192;
          }
        }
      }
      if( v11 )
        _InterlockedExchangeAdd64((volatile signed __int64 *)&v5->Vp.ResidentAvailablePages, v11);
    }
LABEL_7:
    MiReturnCommit(v5, CommittedPages - DanglingPageCount);
    _InterlockedExchangeAdd64((volatile signed __int64 *)&v5->Vp.SharedCommit, -CommittedPages);
  }
}

Referenced by:

MiInitializeImageExtents
MiSegmentDelete