
    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y)    N)OptionalTuple)
exceptions
interfaces	constants)	segmentedc                       e Zd ZdZy)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    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                 (    t         |   |||       y N)super__init__)selfr   r   r   	__class__s       r   r   zLimeLayer.__init__   s     	+t4r   c           
         | j                   j                  | j                     }|j                  }d}d}| j                  j
                  }g }||k  rq| j                  ||      \  }}||k  s||k  r"t        | j                  d|dd|dd|d      ||z
  dz   }	|j                  |||z   |	|	f       |}||z   |	z   }||k  rqt        |      dk(  r#t        | j                  d| j                         || _        y )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%   s,   ]]))$*:*:;
!11))..|#++J?JE3w#+)II&uQis3q'9KFST:V 
 !5[1_NOO,nnM Gk)N:F |#  x=A%		9$:J:J9KL  "r   r,   r/   c                    	 |j                  || j                  j                        }| j                  j                  |      \  }}}}}|| j                  k7  rt        |j                  d|dd|d      || j                  k7  rt        |j                  d|dd|d      ||fS # t        j                  $ r t        |j                  d|dd      w xY w)	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    	$//&#2D2D2I2IJK 251C1C1J1J;1W.XCII%<ay8J6RS*!U  ckk!%%ga[0B6!*M  cz 11 	%F2;&KL 	s   &B' '/C)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"> 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y)	LimeStacker
   Nr   
layer_nameprogress_callbackr   c                    	 t         j                  |j                  |          |j                  j	                  d      }||j
                  t        j                  j                  |d      <   t        |||      S # t        $ r Y y w xY w)Nr   r,   )	r   r(   r#   r
   free_layer_nameconfigr   configuration	path_join)r>   r   rN   rO   new_names        r   stackzLimeStacker.stack_   s}    	##GNN:$>? >>11+> 	z//99(LQR (H55 # 		s   "A9 9	BBr   )r   r   r   stack_orderrG   r   r   rE   rF   r   ProgressCallbackr   r#   rH   rV   r   r   r   rL   rL   \   sg    K
 9=	6##446 6 %55	6
 
*##66	76 6r   rL   )rC   typingr   r   volatility3.frameworkr   r   r   volatility3.framework.layersr   LayerExceptionr
   SegmentedLayerr   	automagicStackerLayerInterfacerL   r   r   r   <module>r`      sW   
  " C C 2L*33 LI	(( IX6*&&<< 6r   