o
    j%                     @   sP   G d d dZ G dd dZG dd dZG dd dZdddZdddZdS )c                   @   sD   e Zd Zdd Zdd Zdd Zedd Zed	d
 Zdd Z	dS )MINIDUMP_LOCATION_DESCRIPTORc                 C      d | _ d | _d S NDataSizeRvaself r	   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minidump/common_structs.py__init__      
z%MINIDUMP_LOCATION_DESCRIPTOR.__init__c                 C      dS )N   r	   r   r	   r	   r
   get_size      z%MINIDUMP_LOCATION_DESCRIPTOR.get_sizec                 C   ,   | j jdddd}|| jjdddd7 }|S N   littleF	byteordersignedr   to_bytesr   r   tr	   r	   r
   r         z%MINIDUMP_LOCATION_DESCRIPTOR.to_bytesc                 C   :   t  }tj| dddd|_tj| dddd|_|S r   )r   int
from_bytesreadr   r   buffmldr	   r	   r
   parse      z"MINIDUMP_LOCATION_DESCRIPTOR.parsec                    sP   t  }| dI d H }tj|ddd|_| dI d H }tj|ddd|_|S r   )r   r    r   r   r   r   )r"   r#   r   r	   r	   r
   aparse   s   z#MINIDUMP_LOCATION_DESCRIPTOR.aparsec                 C      d| j | jf }|S NzSize: %s File offset: %sr   r   r	   r	   r
   __str__       z$MINIDUMP_LOCATION_DESCRIPTOR.__str__N)
__name__
__module____qualname__r   r   r   staticmethodr$   r&   r)   r	   r	   r	   r
   r      s    

r   c                   @   s8   e Zd Zdd Zdd Zdd Zedd Zd	d
 ZdS )MINIDUMP_LOCATION_DESCRIPTOR64c                 C   r   r   r   r   r	   r	   r
   r   %   r   z'MINIDUMP_LOCATION_DESCRIPTOR64.__init__c                 C   r   )N   r	   r   r	   r	   r
   r   )   r   z'MINIDUMP_LOCATION_DESCRIPTOR64.get_sizec                 C   r   Nr   r   Fr   r   r   r	   r	   r
   r   ,   r   z'MINIDUMP_LOCATION_DESCRIPTOR64.to_bytesc                 C   r   r1   )r/   r   r   r    r   r   r!   r	   r	   r
   r$   1   r%   z$MINIDUMP_LOCATION_DESCRIPTOR64.parsec                 C   r'   r(   r   r   r	   r	   r
   r)   8   r*   z&MINIDUMP_LOCATION_DESCRIPTOR64.__str__N)	r+   r,   r-   r   r   r   r.   r$   r)   r	   r	   r	   r
   r/   $   s    
r/   c                   @   sD   e Zd Zdd Zedd Zedd Zedd Zed	d
 ZdS )MINIDUMP_STRINGc                 C   r   r   )LengthBufferr   r	   r	   r
   r   =   r   zMINIDUMP_STRING.__init__c                 C   s0   t  }tj| dddd|_| |j|_|S r   )r2   r   r   r    r3   r4   )r"   msr	   r	   r
   r$   A   s   zMINIDUMP_STRING.parsec                    sB   t  }| dI d H }tj|ddd|_| |jI d H |_|S r   )r2   r    r   r   r3   r4   )r"   r5   r   r	   r	   r
   r&   H   s   zMINIDUMP_STRING.aparsec                 C   sF   |  }|| d t|}||d z|jdW S    Y dS N    z	utf-16-lez<STRING_DECODE_FAILED>)tellseekr2   r$   r4   decodervar"   posr5   r	   r	   r
   get_from_rvaP   s   
zMINIDUMP_STRING.get_from_rvac                    sZ   |  }|| dI d H  t|I d H }||dI d H  z|jdW S    Y dS r6   )r8   r9   r2   r&   r4   r:   r;   r	   r	   r
   aget_from_rva[   s   zMINIDUMP_STRING.aget_from_rvaN)	r+   r,   r-   r   r.   r$   r&   r>   r?   r	   r	   r	   r
   r2   <   s    



r2   c                   @   st   e Zd Zdd Zedd Zedd Zdd Zd	d
 Zdd Z	dddZ
dddZedd Zdd Zdd ZdS )MinidumpMemorySegmentc                 C   s   d | _ d | _d | _d | _d S r   )start_virtual_addresssizeend_virtual_addressstart_file_addressr   r	   r	   r
   r   g   s   
zMinidumpMemorySegment.__init__c                 C   s0   t  }| j|_| j|_| j|_|j|j |_|S )zG
		memory_descriptor: MINIDUMP_MEMORY_DESCRIPTOR
		buff: file_handle
		)r@   StartOfMemoryRangerA   r   rB   r   rD   rC   )memory_decriptorr"   mmsr	   r	   r
   
parse_minim   s   z MinidumpMemorySegment.parse_minic                 C   s.   t  }| j|_| j|_||_|j|j |_|S r   )r@   rE   rA   r   rB   rD   rC   )rF   r<   rG   r	   r	   r
   
parse_fullz   s   z MinidumpMemorySegment.parse_fullc                 C   s   || j kr|| jk rdS dS )NTF)rA   rC   )r   	virt_addrr	   r	   r
   inrange   s   zMinidumpMemorySegment.inrangec                 C   sp   || j ks
|| jk rtd|| | j krtd| }|| j }|| j| d ||}||d |S NzReading from wrong segment!zRead would cross boundaries!r7   rC   rA   	Exceptionr8   r9   rD   r    r   virtual_addressrB   file_handlerr=   offsetdatar	   r	   r
   r       s   

zMinidumpMemorySegment.readc                    s   || j ks|| jk rtd|| | j krtd| }|| j }|| j| dI d H  ||I d H }||dI d H  |S rL   rM   rO   r	   r	   r
   aread   s   
zMinidumpMemorySegment.areadF   c                 C   sd  t || jkr	g S | }|| jd g }|du rct|| j}d}d}t || jk rb|d7 }|| jt | kr?| jt | }|||7 }||}	|	dkr[||d | j|	 gS t || jk s+nG|| j}||d d}
t |t |kr||}	|	dkr|S |	|	|
 | j  ||	d d  }|
|	d 7 }
|du r|S t |t |ksy||d |S Nr7   T       
lenrB   r8   r9   rD   minr    findrA   appendr   patternrQ   
find_first	chunksizer=   flrS   imarkerrR   r	   r	   r
   search   sF   


zMinidumpMemorySegment.searchc                    s  t || jkr
g S | }|| jdI d H  g }|du rmt|| j}d}d}t || jk rl|d7 }|| jt | krC| jt | }|||I d H 7 }||}	|	dkre||dI d H  | j|	 gS t || jk s/nMd}
|| jI d H }||dI d H  t |t |kr||}	|	dkr|S |	|	|
 | j  ||	d d  }|
|	d 7 }
|du r|S t |t |ks||dI d H  |S rV   rZ   r_   r	   r	   r
   asearch   sH   


zMinidumpMemorySegment.asearchc                  C   s   g d} | S )N)zVA StartRVASizer	   )r   r	   r	   r
   
get_header   s   z MinidumpMemorySegment.get_headerc                 C   s    t | jt | jt | jg}|S r   hexrA   rD   rB   r   r	   r	   r
   to_row  s
   zMinidumpMemorySegment.to_rowc                 C   s$   dt | jt | jt | jf }|S )NzVA Start: %s, RVA: %s, Size: %srk   r   r	   r	   r
   r)   
  s    zMinidumpMemorySegment.__str__N)FrU   )r+   r,   r-   r   r.   rH   rI   rK   r    rT   rf   rg   rj   rm   r)   r	   r	   r	   r
   r@   f   s    



*+
r@   r0   .r7   c                 C   s  g }z|dd W n t y   t}Y nw |dt| |D ]}| |||  }d}d}	|dt|D ]1}
|
|d kr>|d7 }||
 }
t|
tsKt|
}
t|
dd}
t|
dkr]d|
 }
||
d 7 }q2|d}d}|D ]"}t|tsxt|}d	|  krd
k rn n|t	|7 }qm||7 }qm|dkr|
dt|d d  d |||f  q|
dt|d d  d || |||f  qd|S )z
	@brief Return {src} in hex dump.
	@param[in] length	{Int} Nb Bytes by row.
	@param[in] sep		{Char} For the text part, {sep} will be used for non ASCII char.
	@return {Str} The hexdump

	@note Full support for python2 and python3 !
	r7   rX    F    0x0       z	%08x:  %-   zs  |%s|z%08x(+%04x):  %-
)	NameErrorranger[   
isinstancer   ordrl   replacestripchrr^   strjoin)srclengthsepstartresultxrangerd   subSrchexaisMiddlehtextcr	   r	   r
   hexdump  s@   	



*0
r   Tc           	      C   s  g }| D ]+}t dd |D D ]\}}|t|kr$|d |t|ks||| kr.|||< qqd}t |D ]\}}|dt| d t| d 7 }q6t|dkrSdS |dd	 }d}t | D ]%\}}||j| d
 7 }|dkr|r|dt|dt|d    d
 7 }q_|S )z4Prints a formatted table given a 2 dimensional arrayc                 S   s   g | ]}t |qS r	   )r[   ).0xr	   r	   r
   
<listcomp>C  s    z#construct_table.<locals>.<listcomp>r7   ro   {:z} | Nrw   -rv   rX   )	enumerater[   r^   r   formatsum)	linesseparate_headwidthslinerd   rB   print_stringwidthr   r	   r	   r
   construct_table>  s.   
"$r   N)r0   rn   r7   )T)r   r/   r2   r@   r   r   r	   r	   r	   r
   <module>   s   !* 
+.