1010from volatility .framework .configuration import requirements
1111from volatility .framework .renderers import format_hints
1212from volatility .framework .objects import utility
13- from typing import List , Tuple , Type
13+ from typing import List , Tuple , Type , Optional
1414vollog = logging .getLogger (__name__ )
1515
1616FILE_DEVICE_DISK = 0x7
@@ -48,11 +48,13 @@ def get_requirements(cls) -> List[interfaces.configuration.RequirementInterface]
4848 requirements .VersionRequirement (name = 'handles' , component = handles .Handles , version = (1 , 0 , 0 ))
4949 ]
5050
51- def dump_file_producer (self , file_object : interfaces .objects .ObjectInterface ,
51+ @classmethod
52+ def dump_file_producer (cls ,
53+ file_object : interfaces .objects .ObjectInterface ,
5254 memory_object : interfaces .objects .ObjectInterface ,
5355 open_method : Type [interfaces .plugins .FileHandlerInterface ],
5456 layer : interfaces .layers .DataLayerInterface ,
55- desired_file_name : str ) -> str :
57+ desired_file_name : str ) -> Optional [ interfaces . plugins . FileHandlerInterface ] :
5658 """Produce a file from the memory object's get_available_pages() interface.
5759
5860 :param file_object: the parent _FILE_OBJECT
@@ -77,13 +79,15 @@ def dump_file_producer(self, file_object: interfaces.objects.ObjectInterface,
7779 filedata .write (data )
7880
7981 if not bytes_written :
80- result_text = "No data is cached for the file at {0:#x}" .format (file_object .vol .offset )
82+ #vollog.debug("No data is cached for the file at {0:#x}".format(file_object.vol.offset))
83+ return None
8184 else :
82- result_text = "Stored {}" .format (filedata .preferred_filename )
85+ vollog .debug ("Stored {}" .format (filedata .preferred_filename ))
86+ return filedata
8387 except exceptions .InvalidAddressException :
84- result_text = "Unable to dump file at {0:#x}" .format (file_object . vol . offset )
85-
86- return result_text
88+ #vollog.debug( "Unable to dump file at {0:#x}".format(
89+ #file_object.vol.offset))
90+ return None
8791
8892 def process_file_object (self , file_obj : interfaces .objects .ObjectInterface ) -> Tuple :
8993 """Given a FILE_OBJECT, dump data to separate files for each of the three file caches.
@@ -144,11 +148,16 @@ def process_file_object(self, file_obj: interfaces.objects.ObjectInterface) -> T
144148 ntpath .basename (obj_name ),
145149 extension )
146150
147- result_text = self .dump_file_producer (file_obj , memory_object , self .open , layer , desired_file_name )
151+ file_handle = self .dump_file_producer (file_obj , memory_object , self .open , layer , desired_file_name )
152+
153+ file_output = "Error dumping file"
154+ if file_handle :
155+ file_handle .close ()
156+ file_output = file_handle .preferred_filename
148157
149158 yield (cache_name , format_hints .Hex (file_obj .vol .offset ),
150159 ntpath .basename (obj_name ), # temporary, so its easier to visualize output
151- result_text )
160+ file_output )
152161
153162 def _generator (self , procs : List , offsets : List ):
154163
0 commit comments