
    Xf                         d dl Z d dlZd dlmZmZmZmZmZmZ d dl	m
Z
mZmZ d dlmZ d dlmZ  e j        e          Z G d dej        j                  Z G d d	          Z G d
 dej        j                  ZdS )    N)AnyDictIOListOptionalUnion)	constants
exceptions
interfaces)requirements)	resourcesc                   $    e Zd ZdZ	 ddej        j        dededede	e
eef                  ddf fd	Zedefd
            Zedefd            ZddededefdZddedededefdZdedefdZedeej        j                 fd            Z xZS )BufferDataLayerz_A DataLayer class backed by a buffer in memory, designed for testing and
    swift data access.Ncontextconfig_pathnamebuffermetadatareturnc                 `    t                                          ||||           || _        d S )Nr   r   r   r   )super__init___buffer)selfr   r   r   r   r   	__class__s         W/home/panchajanya/Development/work/volatility3/volatility3/framework/layers/physical.pyr   zBufferDataLayer.__init__   s<     	4( 	 	
 	
 	
     c                 0    t          | j                  dz
  S )3Returns the largest available address in the space.   )lenr   r   s    r   maximum_addresszBufferDataLayer.maximum_address    s     4<  1$$r   c                     dS z4Returns the smallest available address in the space.r    r#   s    r   minimum_addresszBufferDataLayer.minimum_address%   	     qr   r!   offsetlengthc                     t          | j        |cxk    o
| j        k    nc o| j        ||z   dz
  cxk    o
| j        k    nc           S )+Returns whether the offset is valid or not.r!   )boolr(   r$   r   r*   r+   s      r   is_validzBufferDataLayer.is_valid*   sm     FBBBBd.BBBBB T$!(;SSSSt?SSSSS
 
 	
r   Faddresspadc                     |                      ||          sA|}| j        |cxk     r| j        k    rn n
| j        dz   }t          j        | j        |d          | j        |||z            S )zReads the data from the buffer.r!   'Offset outside of the buffer boundaries)r0   r(   r$   r
   InvalidAddressExceptionr   r   )r   r1   r+   r2   invalid_addresss        r   readzBufferDataLayer.read1   s    }}Wf-- 	%O#gEEEE1EEEEEE"&"6":4	?,U   |Gg&6677r   datac                 t    | j         d|         |z   | j         |t          |          z   d         z   | _         dS )z#Writes the data from to the buffer.N)r   r"   )r   r1   r8   s      r   writezBufferDataLayer.write<   s?     L'"T)DL3t999L9N9N,OO 	r   c                 2    t          j        ddd          gS )Nr   z!The direct bytes to interact withF)r   descriptionoptional)r   BytesRequirementclss    r   get_requirementsz BufferDataLayer.get_requirementsB   s,     )?  
 	
r   Nr!   F)__name__
__module____qualname____doc__r   r   ContextInterfacestrbytesr   r   r   r   propertyintr$   r(   r.   r0   r7   r:   classmethodr   configurationRequirementInterfacerA   __classcell__r   s   @r   r   r      s         .2 #4  	
  4S>* 
      % % % % X%     X
 
s 
C 
 
 
 
 
	8 	8C 	8 	84 	8E 	8 	8 	8 	8
S 
 
 
 
 
 
j&>&S!T 
 
 
 [
 
 
 
 
r   r   c                       e Zd ZddZddZdS )	DummyLockr   Nc                     d S rB   r'   r#   s    r   	__enter__zDummyLock.__enter__O       r   c                     d S rB   r'   r   typevalue	tracebacks       r   __exit__zDummyLock.__exit__R   rW   r   r   N)rE   rF   rG   rV   r]   r'   r   r   rT   rT   N   s<                r   rT   c                       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efd	            Zedee
         fd
            Zedefd            Zedefd            ZddededefdZddedededefdZdededdfdZde	ee
f         fdZddZddZedeej        j                 fd            Z xZ S )	FileLayerz/a DataLayer backed by a file on the filesystem.Nr   r   r   r   r   c                    t                                          ||||           d| _        | j        d         | _        t          j                    | _        d | _        d | _	        d | _
        t                      | _        t          j        t          j        j        k    rt#          j                    | _        | j        }d S )Nr   Flocation)r   r   _write_warningconfig	_locationr   ResourceAccessor	_accessor_file__size_maximum_addressrT   _lockr	   PARALLELISMParallelism	Threading	threadingLock_file)r   r   r   r   r   _r   s         r   r   zFileLayer.__init__Y   s     	4( 	 	
 	
 	
 $Z0"355)-$(
/37@{{
 I$9$CCC"))DJJr   c                     | j         S )z3Returns the location on which this Layer abstracts.)re   r#   s    r   rb   zFileLayer.locationq   s     ~r   c                 l    d}| j         p| j                            | j        |          | _         | j         S )zeProperty to prevent the initializer storing an unserializable open
        file (for context cloning)rb)rh   rg   openre   )r   modes     r   rq   zFileLayer._filev   s3    
 kNT^%8%8%N%N{r   c                 `   | j         r| j         S | j        5  | j                                        }| j                            dd           | j                                        | _        | j                            |           | j        dz
  | _         ddd           n# 1 swxY w Y   | j         S )r    r      r!   N)rj   rk   rq   tellseekri   )r   origs     r   r$   zFileLayer.maximum_address   s       	)((Z 	3 	3:??$$DJOOAq!!!**DJJOOD!!!$(JND!	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 $$s   A<BB"%B"c                     dS r&   r'   r#   s    r   r(   zFileLayer.minimum_address   r)   r   r!   r*   r+   c                     |dk    rt          d          t          | j        |cxk    o
| j        k    nc o| j        ||z   dz
  cxk    o
| j        k    nc           S )r-   r   zLength must be positiver!   )
ValueErrorr.   r(   r$   r/   s      r   r0   zFileLayer.is_valid   s    Q;;6777 FBBBBd.BBBBB T$!(;SSSSt?SSSSS
 
 	
r   Fr2   c                 "   |                      ||          sA|}| j        |cxk     r| j        k    rn n
| j        dz   }t          j        | j        |d          | j        5  | j                            |           | j        	                    |          }ddd           n# 1 swxY w Y   t          |          |k     rQ|r|d|t          |          z
  z  z  }n6t          j        | j        |t          |          z   d| j        z   dz             |S )z)Reads from the file at offset for length.r!   r4   N    z)Could not read sufficient bytes from the z file)r0   r(   r$   r
   r5   r   rk   rq   r{   r7   r"   )r   r*   r+   r2   r6   r8   s         r   r7   zFileLayer.read   sl   }}VV,, 	$O#fDDDD0DDDDDD"&"6":4	?,U  
 Z 	+ 	+JOOF###:??6**D	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ t99v 6CII#566 8ISYY&?$)KgU  
 s   5B  B$'B$r8   c                 "   | j                                         s2| j        s)d| _        t                              d| j                    dS |                     |t          |                    sL|}| j        |cxk     r| j	        k    rn n
| j	        dz   }t          j        | j        |d| j        z   dz             | j        5  | j                             |           | j                             |           ddd           dS # 1 swxY w Y   dS )zfWrites to the file.

        This will technically allow writes beyond the extent of the file
        Tz"Try to write to unwritable layer: Nr!   zData segment outside of the z file boundaries)rq   writablerc   vollogwarningr   r0   r"   r(   r$   r
   r5   rk   r{   r:   )r   r*   r8   r6   s       r   r:   zFileLayer.write   sk   
 z""$$ 	& Q&*#ODIOOPPP4}}VSYY// 	$O#fDDDD0DDDDDD"&"6":4	.:=OO  
 Z 	# 	#JOOF###JT"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   5DDDc                     d| _         | j        S )zDo not store the open _file_ attribute, our property will ensure the
        file is open when needed.

        This is necessary for multi-processing
        N)rh   __dict__r#   s    r   __getstate__zFileLayer.__getstate__   s     }r   c                 8    | j                                          dS )zCloses the file handle.N)rq   closer#   s    r   destroyzFileLayer.destroy   s    
r   c                 .    |                                   d S rB   )r   rY   s       r   r]   zFileLayer.__exit__   s    r   c                 0    t          j        dd          gS )Nrb   F)r   r=   )r   StringRequirementr?   s    r   rA   zFileLayer.get_requirements   s    .JOOOPPr   rB   rC   rD   r^   )!rE   rF   rG   rH   r   r   rI   rJ   r   r   r   r   rL   rb   r   rq   rM   r$   r(   r.   r0   rK   r7   r:   r   r   r]   rN   r   rO   rP   rA   rQ   rR   s   @r   r`   r`   V   sB       99 .2 #4  	
 4S>* 
     0 #    X r#w    X % % % % X%     X
 
s 
C 
 
 
 
 
 3  $ 5    4#C #u # # # # #.d38n           Qj&>&S!T Q Q Q [Q Q Q Q Qr   r`   )loggingro   typingr   r   r   r   r   r   volatility3.frameworkr	   r
   r   #volatility3.framework.configurationr   volatility3.framework.layersr   	getLoggerrE   r   layersDataLayerInterfacer   rT   r`   r'   r   r   <module>r      sG        7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 C C C C C C C C C C < < < < < < 2 2 2 2 2 2		8	$	$<
 <
 <
 <
 <
j': <
 <
 <
~       HQ HQ HQ HQ HQ
!4 HQ HQ HQ HQ HQr   