
    Xf                         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dS )    )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j        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 | _        |                                  d S )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__   sm     	4( 	 	
 	
 	
  ;|4:<'+'+    c                     dS )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          fd|                     ||          D                       S # t
          j        $ r Y dS w xY w)zPReturns whether the address offset can be translated to a valid
        address.c                 F    g | ]\  }}}}}                     |          S r&   )is_valid).0_imapped_offset_sr   s       r#   
<listcomp>z6NonLinearlySegmentedLayer.is_valid.<locals>.<listcomp>6   sA       5Br2 ''66  r$   F)_contextlayersr   allmappingr   InvalidAddressException)r!   r)   r*   r   s      @r#   r-   z"NonLinearlySegmentedLayer.is_valid0   s    		-d.>?J   9=ff9U9U     1 	 	 	55	s   AA	 	AAFnextc                    | j         s|                                  t          | j         || j        j        | j                 j        f          }|r9|s7| j         |dz
           }|d         |cxk    r|d         |d         z   k     rn n|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(   r      zInvalid address at 0x)r   r    r   r   r4   r   maximum_addresslenr   r7   r   )r!   r)   r8   isegments        r#   _find_segmentz'NonLinearlySegmentedLayer._find_segment>   s     ~ 	"!!! NT\()9:JK
 
  	T 	nQU+GqzV====gaj71:&====== 	)3t~&&&&~a((0Iv@V@@@
 
 	
r$   ignore_errorsc              #     K   d}|}|s	 |                      |          \  }}}}	||k    r||z
  }
||
z  }| j        r||
z  }||
z  }n[# t          j        $ rI |s 	 |                      |d          \  }}}}	|}|||z   k    rY dS n# t          j        $ r Y Y dS w xY wY nw xY wt	          |||z   |z
            }||||	| j        fV  ||z  }|||z   k    rd}|dS dS )zdReturns a sorted iterable of (offset, length, mapped_offset, mapped_length, layer)
        mappings.FT)r8   N)r@   _track_offsetr   r7   minr   )r!   r)   r*   rA   donecurrent_offsetlogical_offsetr0   sizemapped_size
difference
chunk_sizes               r#   r6   z!NonLinearlySegmentedLayer.mapping]   s     
  &	 CGCUCU"D D@t[ "N22!/.!@J"j0N) 4%3J&D5      $   **>*EE&%# &4N%77#tt 8!9      444  87 ( T6F?^#CDDJ *m[$JZZZZZj(N&00M  &	 &	 &	 &	 &	s5   ;A B'BBBBBBB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   sG    ~ 	JHIII= "nQ/OFAq!"DM}r$   c                     | j         st          d          | j        | j         d         \  }}}}||z   | _        | j        S )NrM   )r   rN   r   )r!   rO   rP   r*   s       r#   r<   z)NonLinearlySegmentedLayer.maximum_address   sL    ~ 	JHIII= #'>"#5 FAvq"VODM}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                 0    t          j        dd          gS )Nr   F)r   optional)r   TranslationLayerRequirement)clss    r#   get_requirementsz*NonLinearlySegmentedLayer.get_requirements   s"     4,QVWWW
 	
r$   N)r   N)r(   F) __name__
__module____qualname____doc__r   r   ContextInterfacestrr
   r   r   r   r   r    intboolr-   r   r@   rC   r   r6   propertyrQ   r<   r	   rU   classmethodconfigurationRequirementInterfacerZ   __classcell__r"   s   @r#   r   r      s-         .2 #4  	
 4S>* 
     $    ^ s C      ).
 

!%
	sCc!	"
 
 
 
: M ?D- --#&-7;-	%S#sC/0	1- - - -^     X     X "d3i " " " X"
 
j&>&S!T 
 
 
 [
 
 
 
 
r$   r   )	metaclassc                   Z     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 )	SegmentedLayerTFr)   r*   rA   r   c              #   v   K   t                                          |||          D ]\  }}}}}|||||fV  d S r[   )r   r6   )r!   r)   r*   rA   r0   mapped_lengthlayerr"   s          r#   r6   zSegmentedLayer.mapping   sf       DI77??FMD
 D
 	? 	??FFM=% &->>>>>	? 	?r$   r\   )r]   r^   r_   rC   rc   rd   r   r   rb   r6   ri   rj   s   @r#   rm   rm      s         M ?D? ??#&?7;?	%S#sC/0	1? ? ? ? ? ? ? ? ? ?r$   rm   N)abcr   r   bisectr   typingr   r   r   r	   r
   r   volatility3.frameworkr   r   #volatility3.framework.configurationr   volatility3.framework.layersr   r4   TranslationLayerInterfacer   LinearlyMappedLayerrm   r&   r$   r#   <module>ry      s    ( ' ' ' ' ' ' '       = = = = = = = = = = = = = = = = 8 8 8 8 8 8 8 8 < < < < < < / / / / / /[
 [
 [
 [
 [
/7[
 [
 [
 [
|? ? ? ? ?v9W? ? ? ? ? ?r$   