
    vf                         d dl mZmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZmZ d dlmZ d dlmZ  G d dej&                  j(                  e	      Z G d
 deej,                  e	      Zy)    )ABCMetaabstractmethod)bisect_right)AnyDictIterableListOptionalTuple)
exceptions
interfaces)requirements)linearc                       e Zd ZdZ	 ddej
                  j                  dededee	ee
f      ddf
 fdZedd	       Zdd
ededefdZ	 dd
ededeeeeef   fdZdZ	 dd
edededeeeeeeef      fdZedefd       Zedefd       Zedee   fd       Zedeej8                  j:                     fd       Z xZS )NonLinearlySegmentedLayerzA class to handle a single run-based layer-to-layer mapping.

    In the documentation "mapped address" or "mapped offset" refers to
    an offset once it has been mapped to the underlying layer
    Ncontextconfig_pathnamemetadatareturnc                     t         |   ||||       | j                  d   | _        g | _        d | _        d | _        | j                          y )N)r   r   r   r   
base_layer)super__init__config_base_layer	_segments_minaddr_maxaddr_load_segments)selfr   r   r   r   	__class__s        X/home/panchajanya/Development/work/volatility3/volatility3/framework/layers/segmented.pyr   z"NonLinearlySegmentedLayer.__init__   sT     	4( 	 	
  ;;|4:<'+'+    c                      y)zPopulates the _segments variable.

        Segments must be (address, mapped address, length, mapped_length) and must be
        sorted by address when this method exits
        N r!   s    r#   r    z(NonLinearlySegmentedLayer._load_segments(   s    r$   offsetlengthc                    	 | j                   j                  | j                     }t        | j	                  ||      D cg c]  \  }}}}}|j                  |       c}}}      S c c}}}w # t        j                  $ r Y yw xY w)zPReturns whether the address offset can be translated to a valid
        address.F)_contextlayersr   allmappingis_validr   InvalidAddressException)r!   r(   r)   r   _imapped_offset_ss          r#   r/   z"NonLinearlySegmentedLayer.is_valid0   s    		--d.>.>?J :>ff9U 5Br2 ''6 
 11 		s#   >A.  A'A. 'A. .BBFnextc                    | j                   s| j                          t        | j                   || j                  j                  | j
                     j                  f      }|r.|s,| j                   |dz
     }|d   |cxk  r|d   |d   z   k  r|S  |r'|t        | j                         k  r| j                   |   S t        j                  | j                  |d|d      )zFinds the segment containing a given offset.

        Returns the segment tuple (offset, mapped_offset, length, mapped_length)
           r      zInvalid address at 0x)r   r    r   r   r,   r   maximum_addresslenr   r0   r   )r!   r(   r4   isegments        r#   _find_segmentz'NonLinearlySegmentedLayer._find_segment>   s     ~~! NNT\\(()9)9:JJK
 TnnQU+GqzV=gaj71:&== >3t~~&&~~a((00IIv!4VBK@
 	
r$   ignore_errorsc              #     K   d}|}|st	 | j                  |      \  }}}}	||kD  r ||z
  }
||
z  }| j                  r||
z  }||
z  }t	        |||z   |z
        }||||	| j
                  f ||z  }|||z   k\  rd}|ssyy# t        j                  $ rF |s 	 | j                  |d      \  }}}}	|}|||z   kD  rY yn# t        j                  $ r Y Y yw xY wY w xY ww)zdReturns a sorted iterable of (offset, length, mapped_offset, mapped_length, layer)
        mappings.FT)r4   N)r=   _track_offsetr   r0   minr   )r!   r(   r)   r>   donecurrent_offsetlogical_offsetr2   sizemapped_size
difference
chunk_sizes               r#   r.   z!NonLinearlySegmentedLayer.mapping]   s@    
  CGCUCU"D@t[ "N2!/.!@J"j0N))%3J&D* T6F?^#CDJ *m[$JZJZZZj(N&0M  55  $  **>*E&%# &4N%7# 8!99    8 s^   C;A> 6C<C>C"B:7C9C:CCCCCCCCc                     | j                   st        d      | j                  | j                   d   \  }}}}|| _        | j                  S )N)SegmentedLayer must contain some segmentsr   )r   
ValueErrorr   )r!   mapped_s      r#   minimum_addressz)NonLinearlySegmentedLayer.minimum_address   sF    ~~HII== "nnQ/OFAq!"DM}}r$   c                     | j                   st        d      | j                  !| j                   d   \  }}}}||z   dz
  | _        | j                  S )NrJ   r6   )r   rK   r   )r!   rL   rM   r)   s       r#   r9   z)NonLinearlySegmentedLayer.maximum_address   sP    ~~HII== #'>>"#5 FAvq"VOa/DM}}r$   c                     | j                   gS )zMReturns a list of the lower layers that this layer is dependent
        upon.)r   r'   s    r#   dependenciesz&NonLinearlySegmentedLayer.dependencies   s       !!r$   c                 2    t        j                  dd      gS )Nr   F)r   optional)r   TranslationLayerRequirement)clss    r#   get_requirementsz*NonLinearlySegmentedLayer.get_requirements   s     44,QVW
 	
r$   N)r   N)r6   F) __name__
__module____qualname____doc__r   r   ContextInterfacestrr
   r   r   r   r   r    intboolr/   r   r=   r@   r   r.   propertyrN   r9   r	   rR   classmethodconfigurationRequirementInterfacerW   __classcell__r"   s   @r#   r   r      s    .2##44  	
 4S>* 
$  s C   ).

!%
	sCc!	"
: M ?D--#&-7;-	%S#sC/0	1-^       "d3i " "
 
j&>&>&S&S!T 
 
r$   r   )	metaclassc                   N     e Zd ZdZ	 ddedededeeeeeeef      f fdZ	 xZ
S )SegmentedLayerTr(   r)   r>   r   c              #   X   K   t         |   |||      D ]  \  }}}}}|||||f  y wrX   )r   r.   )r!   r(   r)   r>   r2   mapped_lengthlayerr"   s          r#   r.   zSegmentedLayer.mapping   sI      DI7?FMD
 	??FFM=% &->>	?s   '*rY   )rZ   r[   r\   r@   r`   ra   r   r   r_   r.   rf   rg   s   @r#   rj   rj      sO     M ?D??#&?7;?	%S#sC/0	1? ?r$   rj   N)abcr   r   bisectr   typingr   r   r   r	   r
   r   volatility3.frameworkr   r   #volatility3.framework.configurationr   volatility3.framework.layersr   r,   TranslationLayerInterfacer   LinearlyMappedLayerrj   r&   r$   r#   <module>rv      sQ    (  = = 8 < /[
//7[
|?v99W?r$   