FsRtlPruneTunnelCache

VOID __stdcall FsRtlPruneTunnelCache(TUNNEL *Cache, _LIST_ENTRY *FreePoolList){
  LIST_ENTRY *p_TimerQueue; 
  __int64 v5; 
  __int64 v6; 
  _LIST_ENTRY *Flink; 
  TUNNEL_NODE *p_Blink; 
  _LIST_ENTRY *v9; 
  UINT8 Splay; 

  Splay = 1;
  p_TimerQueue = &Cache->TimerQueue;
  v5 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
  v6 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart - (unsigned int)TunnelMaxAge;
  while( 1 )
  {
    Flink = p_TimerQueue->Flink;
    if( p_TimerQueue->Flink == p_TimerQueue )
      break;
    p_Blink = (TUNNEL_NODE *)&Flink[-2].Blink;
    v9 = Flink[1].Flink;
    if( (__int64)v9 >= v6 && (__int64)v9 <= v5 )
      break;
    FsRtlRemoveNodeFromTunnel(Cache, p_Blink, FreePoolList, &Splay);
  }
  while( Cache->NumEntries > (unsigned int)TunnelMaxEntries )
    FsRtlRemoveNodeFromTunnel(Cache, (TUNNEL_NODE *)&p_TimerQueue->Flink[-2].Blink, FreePoolList, &Splay);
}

Referenced by:

FsRtlAddToTunnelCacheEx
FsRtlFindInTunnelCacheEx