
    Xf                     r    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y)    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)offsetignore_errorsreturnc                 B   t        | j                  |d|            }t        |      dk(  rB|d   \  }}}}}||k7  r.t        j                  | j
                  d| j
                   d      ||fS |ryt        j                  | j
                  |d| d| j
                         )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%&( //II		{2VW  e## !44		6%6vhj#T     i   )maxsizelengthpadc           	         |}g }| j                  |||      D ]  \  }}}}}	|s6||kD  r1t        j                  | j                  |d| j                   d|       ||kD  r|d||z
  z  gz  }|}n%||k  r t        j                  | j                  d      |dkD  r,|| j
                  j                  j                  |	|||      gz  }||z  } dj                  |      }
|
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'   s6      >BllF# ?K ?
 	,:FA}mU 6N2 88II"TYYK';N;KL 
 .(7f~&=>??!'.( //IIH  q MM((--e]MSVW  m+N)	,* &)6C4G+G HHHr   valueNc           	      v   |}t        |      }| j                  ||      D ]  \  }}}}}||kD  r1t        j                  | j                  |d| j                   d|       ||k  r t        j
                  | j                  d      | j                  j                  j                  |||d|        ||d }||z  } y)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;||FF7S 	%3FA}fe& 88II"TYYK';N;KL 
 .( //IIH  MM  &&umU7F^L&'NEf$N	%r   scannerz"interfaces.layers.ScannerInterfacesectionslinearc                 &    t         |   |||      S )N)super_scan_iterator)r   r1   r2   r3   	__class__s       r   r6   z"LinearlyMappedLayer._scan_iteratorY   s     w%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
      s     27$$*.$	x}hsm+	,$, Y%I3 I I$ I5 I &I:%C % %$ %0 	A5A 5c?+A 	A
 
*##11	2A Ar   r
   )r?   typingr   r   r   r   volatility3.frameworkr   r   r'   TranslationLayerInterfacer
    r   r   <module>rH      s/   
  2 2 8TA*++EE TAr   