66import logging
77from typing import Callable , Iterator , List , Optional , Type
88
9- from volatility3 .framework import renderers , interfaces , layers , exceptions , constants
9+ from volatility3 .framework import constants , exceptions , interfaces , layers , renderers
1010from volatility3 .framework .configuration import requirements
1111from volatility3 .framework .objects import utility
1212from volatility3 .framework .renderers import format_hints
1313from volatility3 .framework .symbols import intermed
14- from volatility3 .framework .symbols .windows .extensions import pe
1514from volatility3 .framework .symbols .windows import extensions
15+ from volatility3 .framework .symbols .windows .extensions import pe
1616from volatility3 .plugins import timeliner
1717
1818vollog = logging .getLogger (__name__ )
@@ -24,7 +24,7 @@ class PsList(interfaces.plugins.PluginInterface, timeliner.TimeLinerInterface):
2424 _required_framework_version = (2 , 0 , 0 )
2525
2626 # 3.0.0 - changed signature for `list_processes`
27- _version = (3 , 0 , 0 )
27+ _version = (3 , 0 , 1 )
2828 PHYSICAL_DEFAULT = False
2929
3030 @classmethod
@@ -261,9 +261,18 @@ def list_processes(
261261 absolute = True ,
262262 )
263263
264- for proc in eproc .ActiveProcessLinks :
265- if not filter_func (proc ):
266- yield proc
264+ seen = set ()
265+ for forward in (True , False ):
266+ for proc in eproc .ActiveProcessLinks .to_list (
267+ symbol_type = eproc .vol .type_name ,
268+ member = "ActiveProcessLinks" ,
269+ forward = forward ,
270+ ):
271+ if proc .vol .offset in seen :
272+ continue
273+ seen .add (proc .vol .offset )
274+ if not filter_func (proc ):
275+ yield proc
267276
268277 def _generator (self ):
269278 kernel = self .context .modules [self .config ["kernel" ]]
0 commit comments