MiFreeWsleList

INT64 __fastcall MiFreeWsleList(INT64 a1, INT64 a2, CHAR a3){
  unsigned __int64 v6; 
  unsigned int v7; 
  bool v8; 
  INT64 v9; 
  unsigned int i; 
  unsigned __int64 j; 
  _BYTE *v12; 
  unsigned __int64 v13; 
  UINT64 v14; 
  char *v15; 
  INT64 v16; 
  INT64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  INT64 result[20]; 
  __int64 v23[20]; 
  memset((INT64)result, 0i64);
  v6 = *(unsigned int *)(a2 + 12);
  v19 = 20i64;
  v7 = MiTbFlushType(a1);
  v8 = (*(_BYTE *)(a1 + 184) & 7) == 0;
  v9 = 0i64;
  v18 = v7;
  v20 = 0i64;
  v21 = 0i64;
  if( v8 && *(_QWORD *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1680i64) + 360i64) )
    a3 |= 2u;
  for( i = 0; i < 2; ++i )
  {
    for( j = 0i64; j < v6; ++j )
    {
      v12 = (char *)&v23[j] + 1;
      v13 = *(_QWORD *)&v12[a2 - ((_QWORD)v23 + 1) + 24] & 0xFFFFFFFFFFFFF000ui64;
      if( i )
      {
        if( v23[j] )
          LOWORD(v23[j]) = MiWsleFree(a1, v13, a3);
        else
          *v12 &= ~1u;
      }
      else
      {
        v14 = MiWsleFlush(a1, v13, a3, (INT64)&v18);
        v23[j] = v14;
        if( !v14 )
          ++v9;
      }
    }
    if( !i )
      MiFlushTbList((__int64)&v18);
  }
  if( v9 != v6 )
  {
    v15 = MiRemoveWsleList(a1, a2, (char *)v23, v6, v18, v19, v20, v21);
    if( v15 )
    {
      v16 = (_QWORD)MmGetPteBase() << 25;
      MiRebuildPageTableLeafAges(v16, (((((_QWORD)v15 << 25) - v16) >> 16 << 25) - v16) >> 16);
    }
  }
  *(_DWORD *)(a2 + 12) = 0;
  return v9;
}

Referenced by:

MiAgePteWorker
MiAgeWorkingSetTail
MiConvertAndFlushWsleVas
MiDeprioritizeVirtualAddresses
MiEmptyWorkingSetHelper
MiEmptyWorkingSetTail
MiMakeVaRangeNoAccess
MiSetProtectionOnSection
MiSharePages
MiTrimSharedPageFromViews
MiTrimWorkingSetBuildup
MiUpdateOldWorkingSetPagesTail
MmProtectPool
NtUnlockVirtualMemory