MiPurgeSubsection

NTSTATUS __stdcall MiPurgeSubsection(_MSUBSECTION *MappedSubsection){
  unsigned __int64 SubsectionBase; 
  __int64 PtesInSubsection; 
  _CONTROL_AREA *ControlArea; 
  UINT8 v5; 
  NTSTATUS v6; 
  _MMPFN *v7; 
  _MMPFN *v8; 
  unsigned __int64 v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v13; 
  int v14; 
  INT64 v15; 
  UINT64 v16; 
  unsigned __int64 v17; 
  PVOID BugCheckParameter4; 
  UINT64 v20; 
  UINT8 PageIrql; 
  UINT64 SpinCount; 
  _CONTROL_AREA *v23; 
  unsigned __int64 v24; 

  SubsectionBase = (unsigned __int64)MappedSubsection->Core.SubsectionBase;
  PtesInSubsection = MappedSubsection->Core.PtesInSubsection;
  ControlArea = MappedSubsection->Core.ControlArea;
  v5 = 17;
  v23 = MappedSubsection->Core.ControlArea;
  v6 = 1;
  PageIrql = 17;
  v7 = 0i64;
  v24 = SubsectionBase + 8 * PtesInSubsection;
  if( SubsectionBase >= v24 )
    return v6;
  while( (SubsectionBase & 0xFFF) == 0 || v5 == 17 )
  {
    if( v5 != 17 )
      MiUnlockProtoPoolPage((ULONG_PTR)v7, v5);
    v7 = MiCheckProtoPtePageState((VOID *)SubsectionBase, &PageIrql);
    if( v7 )
    {
      ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
      if( MappedSubsection->NumberOfMappedViews != 1 || (MappedSubsection->Core.u.LongFlags & 1) != 0 )
      {
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
        MiUnlockProtoPoolPage((ULONG_PTR)v7, PageIrql);
        return 0;
      }
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
      v5 = PageIrql;
      break;
    }
    SubsectionBase = (SubsectionBase & 0xFFFFFFFFFFFFF000ui64) + 4096;
LABEL_30:
    v5 = PageIrql;
LABEL_31:
    if( SubsectionBase >= v24 )
      goto LABEL_35;
  }
  v8 = MiLockLeafPage((_MMPTE *)SubsectionBase, 0i64);
  LODWORD(v9) = MI_READ_PTE_LOCK_FREE(SubsectionBase);
  v11 = v9;
  if( !v8 )
  {
    if( (v9 & 0xC00) == 0 && v9 )
      KeBugCheckEx(0xDEu, (PVOID)4, MappedSubsection, (PVOID)SubsectionBase, (PVOID)v9);
    SubsectionBase += 8i64;
    goto LABEL_31;
  }
  if( (v9 & 1) == 0 )
  {
    if( *(&stru_140C4DB30 + 42) )
    {
      if( (v9 & 0x10) != 0 )
        v11 = v9 & 0xFFFFFFFFFFFFFFEFui64;
      else
        v11 = ~*(&stru_140C4DB30 + 42) & v9;
    }
    v12 = (v11 >> 12) & 0xFFFFFFFFFi64;
    v8 = &MmGetPfnDb()[v12];
    if( (*(_BYTE *)(&v8->u3 + 1) & 0x10) == 0 && !v8->u3.ReferenceCount )
    {
      MiDereferenceControlAreaPfnList(ControlArea, &MappedSubsection->Core, v10, 2ui64);
      v13.Long = (unsigned __int64)v8->OriginalPte.u;
      LOBYTE(v14) = MiPteInShadowRange(SubsectionBase);
      if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v13.Long & 1) != 0 )
        v13.Long |= 0x8000000000000000ui64;
      *(union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} *)SubsectionBase = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v13.Long;
      MiUnlinkPageFromList(v8, 0i64);
      MiInsertPageInFreeOrZeroedList(v12, 2ui64, v15, v16, (UINT64)BugCheckParameter4, v20);
      _InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( v7->u2._bf_0 < 0 );
      }
      MiDecrementShareCount(v7);
      _InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      ControlArea = v23;
      SubsectionBase += 8i64;
      goto LABEL_30;
    }
  }
  _InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  v5 = PageIrql;
  v6 = 0;
LABEL_35:
  if( v5 != 17 )
    MiUnlockProtoPoolPage((ULONG_PTR)v7, v5);
  if( !v6 )
  {
    v17 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
    MappedSubsection->Core.u.SubsectionFlags._bf_0 |= 1u;
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
    __writecr8(v17);
  }
  return v6;
}

Referenced by:

MiDeleteCachedSubsection