mirror of
https://github.com/volatilityfoundation/volatility3.git
synced 2026-09-10 11:47:38 +02:00
Convert mapping to a generator rather than a list. It must still return in sorted order.
This commit is contained in:
@@ -95,7 +95,7 @@ class TranslationLayerInterface(DataLayerInterface, metaclass = ABCMeta):
|
||||
|
||||
@abstractmethod
|
||||
def mapping(self, offset, length, ignore_errors = False):
|
||||
"""Returns a sorted list of (offset, mapped_offset, length, layer) mappings
|
||||
"""Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings
|
||||
|
||||
ignore_errors will provide all available maps with gaps, but their total length may not add up to the requested length
|
||||
This allows translation layers to provide maps of contiguous regions in one layer
|
||||
|
||||
@@ -109,29 +109,29 @@ class Intel(interfaces.layers.TranslationLayerInterface):
|
||||
return False
|
||||
|
||||
def mapping(self, offset, length, ignore_errors = False):
|
||||
"""Returns a sorted list of (offset, mapped_offset, length, layer) mappings
|
||||
"""Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings
|
||||
|
||||
This allows translation layers to provide maps of contiguous regions in one layer
|
||||
"""
|
||||
result = []
|
||||
if length == 0:
|
||||
if ignore_errors and not self.is_valid(offset):
|
||||
return result
|
||||
raise StopIteration
|
||||
mapped_offset, _ = self._translate(offset)
|
||||
return [(offset, mapped_offset, length, self._base_layer)]
|
||||
yield (offset, mapped_offset, length, self._base_layer)
|
||||
raise StopIteration
|
||||
while length > 0:
|
||||
if ignore_errors:
|
||||
while not self.is_valid(offset) and length > 0:
|
||||
length -= 1 << self._page_size_in_bits
|
||||
offset += 1 << self._page_size_in_bits
|
||||
if length <= 0:
|
||||
return result
|
||||
raise StopIteration
|
||||
chunk_offset, page_size = self._translate(offset)
|
||||
chunk_size = min(page_size - (chunk_offset % page_size), length)
|
||||
result.append((offset, chunk_offset, chunk_size, self._base_layer))
|
||||
yield (offset, chunk_offset, chunk_size, self._base_layer)
|
||||
length -= chunk_size
|
||||
offset += chunk_size
|
||||
return result
|
||||
|
||||
@property
|
||||
def dependencies(self):
|
||||
|
||||
@@ -105,7 +105,7 @@ class LimeLayer(interfaces.layers.TranslationLayerInterface):
|
||||
return False
|
||||
|
||||
def mapping(self, offset, length, ignore_errors = False):
|
||||
"""Returns a sorted list of (offset, mapped_offset, length, layer) mappings"""
|
||||
"""Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings"""
|
||||
result = []
|
||||
if ignore_errors:
|
||||
for (seg_offset, mapped_seg_offset, seg_length) in self._segments:
|
||||
@@ -118,20 +118,20 @@ class LimeLayer(interfaces.layers.TranslationLayerInterface):
|
||||
seg_offset += diff
|
||||
if offset + length < seg_offset + seg_length:
|
||||
seg_length = offset + length - seg_offset
|
||||
result.append((seg_offset, mapped_seg_offset, seg_length, self._base_layer))
|
||||
return result
|
||||
yield (seg_offset, mapped_seg_offset, seg_length, self._base_layer)
|
||||
raise StopIteration
|
||||
if length == 0:
|
||||
logical_start, base_start, size = self._find_segment(offset)
|
||||
mapped_offset = offset - logical_start + base_start
|
||||
return [(offset, mapped_offset, 0, self._base_layer)]
|
||||
yield (offset, mapped_offset, 0, self._base_layer)
|
||||
raise StopIteration
|
||||
while length > 0:
|
||||
logical_start, base_start, size = self._find_segment(offset)
|
||||
chunk_offset = offset - logical_start + base_start
|
||||
chunk_size = min(size - (offset - logical_start), length)
|
||||
result.append((offset, chunk_offset, chunk_size, self._base_layer))
|
||||
yield (offset, chunk_offset, chunk_size, self._base_layer)
|
||||
length -= chunk_size
|
||||
offset += chunk_size
|
||||
return result
|
||||
|
||||
@property
|
||||
def dependencies(self):
|
||||
|
||||
Reference in New Issue
Block a user