
    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y)    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.                  j0                     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         |   ||||       || _        y )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                 2    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                      yz4Returns the smallest available address in the space.r    r#   s    r   minimum_addresszBufferDataLayer.minimum_address%        r   offsetlengthc                     t        | j                  |cxk  xr | j                  k  nc xr. | j                  ||z   dz
  cxk  xr | j                  k        S c       S )+Returns whether the offset is valid or not.r!   )boolr(   r$   r   r*   r+   s      r   is_validzBufferDataLayer.is_valid*   s]      FBd.B.BB T$$!(;St?S?SS
 	
S
 	
r   addresspadc                     | j                  ||      sT|}| 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   su    }}Wf-%O##gE1E1EE"&"6"6":44		?,U  ||Gg&677r   datac                 j    | j                   d| |z   | j                   |t        |      z   d z   | _         y)z#Writes the data from to the buffer.N)r   r"   )r   r1   r8   s      r   writezBufferDataLayer.write<   s8     LL'"T)DLL3t99L9N,OO 	r   c                 4    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  	
  4S>* 
 % % %   
s 
C 
 
	8C 	8 	84 	8E 	8
S 
 
 
j&>&>&S&S!T 
 
r   r   c                       e Zd ZddZddZy)	DummyLockNc                      y rB   r'   r#   s    r   	__enter__zDummyLock.__enter__O       r   c                      y 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&                  }y )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35)-$(
/37@{
  I$9$9$C$CC")DJJJr   c                     | j                   S )z3Returns the location on which this Layer abstracts.)re   r#   s    r   rb   zFileLayer.locationq   s     ~~r   c                     d}| j                   xs& | j                  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   s8    
 kkNT^^%8%8%N{{r   c                    | j                   r| j                   S | j                  5  | j                  j                         }| j                  j	                  dd       | j                  j                         | _        | j                  j	                  |       | j
                  dz
  | _         ddd       | j                   S # 1 sw Y   | j                   S xY w)r    r      r!   N)rj   rk   rq   tellseekri   )r   origs     r   r$   zFileLayer.maximum_address   s       (((ZZ 	3::??$DJJOOAq!*DJJJOOD!$(JJND!	3 $$$	3 $$$s   BB>>Cc                      yr&   r'   r#   s    r   r(   zFileLayer.minimum_address   r)   r   r*   r+   c                     |dk  rt        d      t        | j                  |cxk  xr | j                  k  nc xr. | j                  ||z   dz
  cxk  xr | j                  k        S c       S )r-   r   zLength must be positiver!   )
ValueErrorr.   r(   r$   r/   s      r   r0   zFileLayer.is_valid   sp    Q;677  FBd.B.BB T$$!(;St?S?SS
 	
S
 	
r   r2   c                 F   | j                  ||      sT|}| j                  |cxk  r| j                  k  rn n| j                  dz   }t        j                  | j
                  |d      | j                  5  | j                  j                  |       | j                  j                  |      }ddd       t              |k  rU|r|d|t        |      z
  z  z  }|S t        j                  | j
                  |t        |      z   d| j
                  z   dz         |S # 1 sw Y   nxY w)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   s   }}VV,$O##fD0D0DD"&"6"6":44		?,U 
 ZZ 	+JJOOF#::??6*D	+ t9v6CI#566  !88IISY&?$))KgU 
 	+ 	+s   37DD r8   c                 P   | j                   j                         s6| j                  s)d| _        t        j	                  d| j
                          y| j                  |t        |            sd|}| 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                  |       | j                   j                  |       ddd       y# 1 sw Y   yxY w)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   s    
 zz""$&&&*#!CDII;OP}}VSY/$O##fD0D0DD"&"6"6":44		.:=OO 
 ZZ 	#JJOOF#JJT"	# 	# 	#s   7D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                   j                          y)zCloses the file handle.N)rq   closer#   s    r   destroyzFileLayer.destroy   s    

r   c                 $    | j                          y rB   )r   rY   s       r   r]   zFileLayer.__exit__   s    r   c                 2    t        j                  dd      gS )Nrb   F)r   r=   )r   StringRequirementr?   s    r   rA   zFileLayer.get_requirements   s    ..J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   sk   9 .2##44  	
 4S>* 
0 #   r#w   % % %   
s 
C 
 
3  $ 5 4#C #u # #.d38n  Qj&>&>&S&S!T 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      sp      7 7 C C < 2			8	$<
j'':: <
~ HQ
!!44 HQr   