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r‚d
k r‹n 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} | Néýÿÿÿrw   ú-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   !* 
+.