
    Xf                     f    d dl Z d dlmZmZmZmZ d dlmZmZ  G d dej	        j
                  ZdS )    N)ListOptionalTupleIterable)
exceptions
interfacesc            
           e Zd ZdZ	 ddededeee         ee         f         fdZ	 e
j        d          dded	ed
edefd            ZdededdfdZ	 ddddeeeef                  dedeej        j                 f fdZ xZS )LinearlyMappedLayerz\Class to differentiate Linearly Mapped layers (where a => b implies that
    a + c => b + c)Foffsetignore_errorsreturnc                 <   t          |                     |d|                    }t          |          dk    r8|d         \  }}}}}||k    r#t          j        | j        d| j         d          n*|rdS t          j        | j        |d| d| j                   ||fS )Nr      Layer z$ claims to map linearly but does not)NNzCannot translate z
 in layer )listmappinglenr   LayerExceptionnameInvalidAddressException)selfr   r   r   original_offset_mapped_offsetlayers           U/home/panchajanya/Development/work/volatility3/volatility3/framework/layers/linear.py	translatezLinearlyMappedLayer.translate   s     t||FA}==>>w<<1:A!*7OQq%&(( /IW	WWW   )
  "!z4	6#Tv#T#T#T#T   e##    i   )maxsizelengthpadc           	         |}g }|                      |||          D ]\  }}}}}	|s,||k    r&t          j        | j        |d| j         d|           ||k    r|d||z
  z  gz  }|}n ||k     rt          j        | j        d          |dk    r&|| j        j                            |	|||          gz  }||z  }d                    |          }
|
d|t          |
          z
  z  z   S )zXReads an offset for length bytes and returns 'bytes' (not 'str') of
        length size.)r   r    cannot map offset:     'Mapping returned an overlapping elementr   r   )
r   r   r   r   r   _contextlayersreadjoinr   )r   r   r    r!   current_offsetoutputr   r   mapped_lengthr   recovered_datas              r   r(   zLinearlyMappedLayer.read'   sQ      >BllF# ?K ?
 ?
 	, 	,:FA}mU  6N22 8I"LTYLLNLL  
 .((7f~&=>??!'.(( /IH   q  M(--e]MSVWW  m+NN&))6C4G4G+G HHHr   valueNc           	      n   |}t          |          }|                     ||          D ]\  }}}}}||k    r&t          j        | j        |d| j         d|           ||k     rt          j        | j        d          | j        j                            |||d|                    ||d         }||z  }dS )zYWrites a value at offset, distributing the writing across any
        underlying mapping.r   r#   r%   N)	r   r   r   r   r   r   r&   r'   write)r   r   r.   r*   r    r   r   r   s           r   r0   zLinearlyMappedLayer.writeE   s      U7;||FF7S7S 	% 	%3FA}fe&& 8I"LTYLLNLL  
 .(( /IH   M &&umU7F7^LLL&''NEf$NN	% 	%r   Tscannerz"interfaces.layers.ScannerInterfacesectionslinearc                 J    t                                          |||          S )N)super_scan_iterator)r   r1   r2   r3   	__class__s       r   r6   z"LinearlyMappedLayer._scan_iteratorY   s!     ww%%gx@@@r   )F)T)__name__
__module____qualname____doc__intboolr   r   strr   	functools	lru_cachebytesr(   r0   r   r   r'   IteratorValuer6   __classcell__)r7   s   @r   r
   r
      sj         27$ $$*.$	x}hsm+	,$ $ $ $, Y%%%I I3 I I$ I5 I I I &%I:%C % %$ % % % %0 	A A5A 5c?+A 	A
 
*#1	2A A A A A A A A A Ar   r
   )r?   typingr   r   r   r   volatility3.frameworkr   r   r'   TranslationLayerInterfacer
    r   r   <module>rH      s   
     2 2 2 2 2 2 2 2 2 2 2 2 8 8 8 8 8 8 8 8TA TA TA TA TA*+E TA TA TA TA TAr   