MiPurgeImageSection

VOID __stdcall MiPurgeImageSection(_CONTROL_AREA *ControlArea){
  __int64 v1; 
  __int64 v2; 
  _MMINPAGE_SUPPORT *v3; 
  _CONTROL_AREA *v4; 
  _MI_PARTITION *v5; 
  __int64 v6; 
  __int64 v7; 
  ULONG_PTR v8; 
  __int64 v9; 
  unsigned int v10; 
  unsigned __int64 v11; 
  _MMPFN *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; 
  UINT64 v14; 
  _MMPTE v15; 
  _DWORD *v16; 
  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;} v17; 
  INT64 v18; 
  UINT64 v19; 
  unsigned __int64 v20; 
  int v21; 
  _MMPFN *v22; 
  unsigned __int64 v23; 
  int v24; 
  UINT64 SpinCount; 
  UINT64 v26; 
  _MI_PARTITION *Partition; 
  __int64 v28; 
  __int64 v29; 
  __int64 v30; 
  unsigned __int64 v31; 
  UINT8 PageIrql; 
  unsigned int v34; 
  unsigned int v35; 

  v1 = (__int64)&ControlArea[1];
  v2 = ControlArea->u1.Flags._bf_0 & 0x3FF;
  v3 = 0i64;
  PageIrql = 17;
  v4 = ControlArea;
  v26 = 0i64;
  v5 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v2);
  Partition = v5;
  while( 1 )
  {
    v28 = v1;
    if( !v1 )
      break;
    if( (*(_WORD *)(v1 + 34) & 2) == 0 )
      goto LABEL_4;
    v7 = MiSwizzleInvalidPte(16i64 * (*(_WORD *)(v1 + 32) & 0x3E));
    v29 = v7;
    v9 = v7;
    v35 = 0;
    v34 = 0;
    if( *(_DWORD *)(v1 + 36) )
    {
      v9 = MiSwizzleInvalidPte(16 * (v6 | (v1 << 12) | 0x40));
      v35 = (*(_DWORD *)(v1 + 40) << 9) | (v10 >> 4);
    }
    v11 = *(_QWORD *)(v1 + 8);
    v31 = v11 + 8i64 * *(unsigned int *)(v1 + 44);
    if( v11 < v31 )
    {
      while( 1 )
      {
        if( (v11 & 0xFFF) == 0 || PageIrql == 17 )
        {
          if( PageIrql != 17 )
            MiUnlockProtoPoolPage(v8, PageIrql);
          while( 1 )
          {
            v26 = (UINT64)MiLockProtoPoolPage((_MMPTE *)v11, &PageIrql);
            if( v26 )
              break;
            MmAccessFault(2ui64, (PVOID)v11, 0, 0i64);
          }
          v7 = v29;
        }
        v12 = MiLockLeafPage((_MMPTE *)v11, 0i64);
        LODWORD(v13.Long) = MI_READ_PTE_LOCK_FREE(v11);
        v15.u.Long = v13.Long;
        if( !v13.Long )
        {
LABEL_20:
          v1 = v28;
          v8 = v26;
          goto LABEL_21;
        }
        if( !v12 )
          break;
        if( (*(_BYTE *)(&v12->u3 + 1) & 0x10) != 0 || (*(_DWORD *)(&v12->3 + 1) & 0x400i64) == 0 )
        {
          v16 = &v12->3 + 1;
          if( (*(_DWORD *)(&v12->3 + 1) & 0x400i64) != 0 )
            MiDereferenceControlAreaPfnList(v4, 0i64, v14, 2ui64);
          v17.Long = 0i64;
          v30 = v12->u4._bf_0 & 0xFFFFFFFFFi64;
          if( v12->u3.ReferenceCount )
          {
            v12->u2._bf_0 |= 0x4000000000000000ui64;
            if( (*(_BYTE *)(&v12->u3 + 1) & 0x28) == 32 )
            {
              v3 = (_MMINPAGE_SUPPORT *)(v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0
                                       - 32);
              if( v3->ListHead[0].Flink == v3->ListHead )
                v3 = 0i64;
            }
            if( (*v16 & 0x400i64) == 0 )
              MiChargeCommit(Partition, 1ui64, 4ui64);
          }
          else
          {
            MiUnlinkPageFromList(v12, 0i64);
            if( (*v16 & 0x400i64) == 0 )
              v17.Long = MiCapturePageFileInfoInline(&v12->OriginalPte, 0i64, 1ui64).u.Long;
            if( *(&stru_140C4DB30 + 42) )
            {
              if( (v15.u.Long & 0x10) != 0 )
                v15.u.Long &= ~0x10ui64;
              else
                v15.u.Long &= ~*(&stru_140C4DB30 + 42);
            }
            MiInsertPageInFreeOrZeroedList((v15.u.Long >> 12) & 0xFFFFFFFFFi64, 2ui64, v18, v19, SpinCount, v26);
          }
          v20 = v9;
          LOBYTE(v21) = MiPteInShadowRange(v11);
          if( v21 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v9 & 1) != 0 )
            v20 = v9 | 0x8000000000000000ui64;
          *(_QWORD *)v11 = v20;
          _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          if( v3 )
            MiInvalidateCollidedIos(v3);
          v22 = &MmGetPfnDb()[v30];
          v3 = 0i64;
          LODWORD(SpinCount) = 0;
          while( _interlockedbittestandset64((volatile signed __int32 *)&v22->u2, 0x3Fui64) )
          {
            do
              KeYieldProcessorEx(&SpinCount);
            while( v22->u2._bf_0 < 0 );
          }
          MiDecrementShareCount(v22);
          _InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          v5 = Partition;
          if( v17.Long )
            MiReleasePageFileInfo(Partition, (_MMPTE)v17.Long, 1ui64);
LABEL_60:
          v4 = ControlArea;
          goto LABEL_17;
        }
        _InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_17:
        v11 += 8i64;
        v8 = v26;
        v34 += 4096;
        if( v34 >= v35 )
          v9 = v7;
        if( v11 >= v31 )
          goto LABEL_20;
      }
      if( (v13.Long & 0x400) != 0 || v13.Long == MiSwizzleInvalidPte(768i64) )
        goto LABEL_17;
      MiReleasePageFileSpace(v5, v15, 1ui64);
      v23 = v9;
      LOBYTE(v24) = MiPteInShadowRange(v11);
      if( v24 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v9 & 1) != 0 )
        v23 = v9 | 0x8000000000000000ui64;
      *(_QWORD *)v11 = v23;
      goto LABEL_60;
    }
LABEL_21:
    if( PageIrql != 17 )
    {
      MiUnlockProtoPoolPage(v8, PageIrql);
      PageIrql = 17;
    }
LABEL_4:
    v1 = *(_QWORD *)(v1 + 16);
  }
}

Referenced by:

MiCheckControlArea