MiDecrementLargeSubsections

NTSTATUS __stdcall MiDecrementLargeSubsections(_CONTROL_AREA **a1, INT64 a2){
  _CONTROL_AREA **v2; 
  INT64 *p_ControlAreaLock; 
  unsigned __int64 v4; 
  INT64 v5; 
  unsigned int v6; 
  unsigned int v7; 
  _MMPTE *v8; 
  _MMPFN *v9; 
  _MI_CONTROL_AREA_WAIT_BLOCK *v10; 
  NTSTATUS result; 
  _CONTROL_AREA *ControlArea; 
  _CONTROL_AREA **v13; 
  INT64 *v15; 

  v13 = a1;
  v2 = a1;
  ControlArea = *a1;
  p_ControlAreaLock = (INT64 *)&(*a1)->ControlAreaLock;
  v15 = p_ControlAreaLock;
  v4 = (unsigned __int8)ExAcquireSpinLockExclusive(p_ControlAreaLock);
  v5 = a2;
  while( 1 )
  {
    if( --*((_DWORD *)v2 + 27) == 1 )
    {
      ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
      __writecr8(2ui64);
      v6 = *((_DWORD *)v2 + 11);
      v7 = 0;
      v8 = (_MMPTE *)v2[1];
      if( v6 )
      {
        do
        {
          v9 = MiLockLeafPage(v8, 0i64);
          MiDecrementShareCount(v9);
          _InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          if( (++v7 & 0xF) == 0 && v7 != v6 && (unsigned int)KeShouldYieldProcessor() )
          {
            __writecr8(v4);
            KeGetCurrentIrql();
            __writecr8(2ui64);
          }
          ++v8;
        }
        while( v7 < v6 );
        v2 = v13;
        p_ControlAreaLock = v15;
      }
      MiChargeLargeProtoSubsection((INT64)v2, 0i64);
      ExAcquireSpinLockExclusive(p_ControlAreaLock);
      --*((_DWORD *)v2 + 27);
      v10 = MiBuildWakeList(ControlArea, 0x200ui64);
      MiReleaseControlAreaWaiters(v10);
      v5 = a2;
    }
    if( v2 == (_CONTROL_AREA **)v5 )
      break;
    v2 = (_CONTROL_AREA **)v2[2];
    v13 = v2;
  }
  ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
  result = KiIrqlFlags;
  __writecr8(v4);
  return result;
}

Referenced by:

MiDeletePartialCloneVads
MiDeleteVad
MiDereferenceDataSubsections
MiIncrementLargeSubsections
MiMapViewOfDataSection
MiReferenceDataSubsections
MiRemoveMappedPtes