
    Xf                         d dl Z d dlmZmZ d dlmZmZmZ d dlm	Z	  G d dej
                  Z G d de	j                  Z G d	 d
ej        j                  ZdS )    N)OptionalTuple)
exceptions
interfaces	constants)	segmentedc                       e Zd ZdZdS )LimeFormatExceptionzAThrown when an error occurs with the underlying Lime file format.N)__name__
__module____qualname____doc__     S/home/panchajanya/Development/work/volatility3/volatility3/framework/layers/lime.pyr
   r
      s        KKKKr   r
   c            
            e Zd ZdZdZdZ ej        d          Zde	j
        j        dededd	f fd
ZddZe	 dde	j        j        dedeeef         fd            Z xZS )	LimeLayerzA Lime format TranslationLayer.

    Lime is generally used to store physical memory images where there
    are large holes in the physical layer
    iEMiL   z<IIQQQcontextconfig_pathnamereturnNc                 N    t                                          |||           d S N)super__init__)selfr   r   r   	__class__s       r   r   zLimeLayer.__init__   s'     	+t44444r   c           
         | j         j        | j                 }|j        }d}d}| j        j        }g }||k     rz|                     ||          \  }}||k     s||k     r!t          | j        d|dd|dd|d          ||z
  dz   }	|	                    |||z   |	|	f           |}||z   |	z   }||k     zt          |          dk    rt          | j        d| j                   || _        d S )Nr   zBad start/end 0xxz/0x at file offset 0xr   zNo LiME segments defined in )_contextlayers_base_layermaximum_address_header_structsize_check_headerr
   r   appendlen	_segments)
r   
base_layerbase_maxaddrmaxaddroffsetheader_sizesegmentsstartendsegment_lengths
             r   _load_segmentszLimeLayer._load_segments%   sD   ])$*:;
!1).|##++J??JE3w#++)IVuVVV3VVVFVVV  
 !5[1_NOO,nnM   Gk)N:F |##  x==A%	L$:JLL   "r   r   r,   r/   c                    	 |                     || j        j                  }n-# t          j        $ r t          |j        d|dd          w xY w| j                            |          \  }}}}}|| j        k    rt          |j        d|dd|d          || j	        k    rt          |j        d|dd|d          ||fS )	Nz	Offset 0x0xz% does not exist within the base layerzBad magic 0xr    r!   zUnexpected version d)
readr&   r'   r   InvalidAddressExceptionr
   r   unpackMAGICVERSION)	clsr,   r/   header_datamagicversionr2   r3   reserveds	            r   r(   zLimeLayer._check_headerD   s   	$//&#2D2IJJKK1 	 	 	%LFLLLL  	
 251C1J1J;1W1W.XCI%!U!U!U!U6!U!U!U   ck!!%MgMMM6MMM   czs	    # *A)r   N)r   )r   r   r   r   r<   r=   structStructr&   r   r   ContextInterfacestrr   r5   classmethodr#   DataLayerInterfaceintr   r(   __classcell__)r   s   @r   r   r      s          EG #V]8,,N5!):5IL5TW5	5 5 5 5 5 5" " " "> MN #*=GJ	sCx   [    r   r   c                   |    e Zd ZdZe	 ddej        j        dede	j
        deej        j                 fd            ZdS )	LimeStacker
   Nr   
layer_nameprogress_callbackr   c                    	 t                               |j        |                    n# t          $ r Y d S w xY w|j                            d          }||j        t          j                            |d          <   t          |||          S )Nr   r,   )	r   r(   r#   r
   free_layer_nameconfigr   configuration	path_join)r>   r   rN   rO   new_names        r   stackzLimeStacker.stack_   s    	##GN:$>????" 	 	 	44	>11+>> 	z/99(LQQR (H555s   %( 
66r   )r   r   r   stack_orderrG   r   r   rE   rF   r   ProgressCallbackr   r#   rH   rV   r   r   r   rL   rL   \   s{        K
 9=	6 6#46 6 %5	6
 
*#6	76 6 6 [6 6 6r   rL   )rC   typingr   r   volatility3.frameworkr   r   r   volatility3.framework.layersr   LayerExceptionr
   SegmentedLayerr   	automagicStackerLayerInterfacerL   r   r   r   <module>r`      s   
  " " " " " " " " C C C C C C C C C C 2 2 2 2 2 2L L L L L*3 L L LI I I I I	( I I IX6 6 6 6 6*&< 6 6 6 6 6r   