o
    �õ±jì(  ã                   @   sž   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlT d dlT d dlmZ d dlmZ d dlmZ d d	lmZ G d
d„ dƒZdS )é    N)ÚList)ÚMinidumpHeader©ÚMinidumpFileReader)Ú*)ÚMINIDUMP_STREAM_TYPE)ÚMINIDUMP_DIRECTORY)ÚPROCESSOR_ARCHITECTURE)ÚPEBc                   @   s~   e Zd Zdd„ Zedd„ ƒZeddd„ƒZedd	„ ƒZed
d„ ƒZdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚMinidumpFilec                 C   sv   d | _ d | _d | _g | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d | _d | _d | _d | _d S ©N)ÚfilenameÚfile_handleÚheaderÚdirectoriesÚ
threads_exÚthreadsÚmodulesÚmemory_segmentsÚmemory_segments_64ÚsysinfoÚ	comment_aÚ	comment_wÚ	exceptionÚhandlesÚunloaded_modulesÚ	misc_infoÚmemory_infoÚthread_infoÚpeb©Úself© r"   úˆ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minidump/minidumpfile.pyÚ__init__   s&   
zMinidumpFile.__init__c                 C   s$   t ƒ }| |_t| dƒ|_| ¡  |S )NÚrb)r   r   Úopenr   Ú_parse)r   Úmfr"   r"   r#   Úparse0   s
   zMinidumpFile.parseÚ c                 C   s   t ƒ }||_| |_| ¡  |S )z–
		External file handle must be an object that exposes basic file IO functionality
		that you'd get by python's file buffer (read, seek, tell etc.)
		)r   r   r   r'   )r   r   r(   r"   r"   r#   Úparse_external8   s
   zMinidumpFile.parse_externalc                 C   s   t  t | ¡¡S r   )r   Ú
parse_buffÚioÚBytesIO)Údatar"   r"   r#   Úparse_bytesD   s   zMinidumpFile.parse_bytesc                 C   s   t ƒ }| |_| ¡  |S r   )r   r   r'   )Úbufferr(   r"   r"   r#   r,   H   s   zMinidumpFile.parse_buffc                 C   s   t | ƒS r   r   r    r"   r"   r#   Ú
get_readerO   s   zMinidumpFile.get_readerc              
   C   sP   |   ¡  |  ¡  z|  ¡  W d S  ty' } zt d¡ W Y d }~d S d }~ww )NzPEB parsing error!)Ú_MinidumpFile__parse_headerÚ _MinidumpFile__parse_directoriesÚ_MinidumpFile__parse_pebÚ	ExceptionÚloggingr   )r!   Úer"   r"   r#   r'   R   s   €ÿzMinidumpFile._parsec                 C   s’   t  | j¡| _td| jjƒD ]8}| j | jj|d  d¡ t | j¡}|r,| j	 
|¡ q| j | jj|d  d¡ t | j¡}t d| ¡ qd S )Nr   é   z+Found Unknown UserStream directory Type: %x)r   r)   r   r   ÚrangeÚNumberOfStreamsÚseekÚStreamDirectoryRvar   r   ÚappendÚget_stream_type_valuer7   Údebug)r!   ÚiÚminidump_dirÚuser_stream_type_valuer"   r"   r#   Ú__parse_headerZ   s   ÷zMinidumpFile.__parse_headerc              
   C   s  | j D �]h}|jtjkrt d|jj|jjf ¡ q|jtj	kr.t d|jj|jjf ¡ q|jtj
krBt d|jj|jjf ¡ q|jtjkr^t d|jj|jjf ¡ t || j¡| _q|jtjkrzt d|jj|jjf ¡ t || j¡| _q|jtjkr–t d|jj|jjf ¡ t || j¡| _q|jtjkr²t d|jj|jjf ¡ t || j¡| _q|jtjkrÎt d|jj|jjf ¡ t || j¡| _q|jtjkrêt d	|jj|jjf ¡ t || j¡| _q|jtjk�rt d
|jj|jjf ¡ t || j¡| _ q|jtj!k�r$t d|jj|jjf ¡ t! || j¡| _"q|jtj#k�rAt d|jj|jjf ¡ t$ || j¡| _%q|jtj&k�r^t d|jj|jjf ¡ t' || j¡| _(q|jtj)k�rxt d|jj|jjf ¡ t d¡ q|jtj*k�r•t d|jj|jjf ¡ t+ || j¡| _,q|jtj-k�r²t d|jj|jjf ¡ t. || j¡| _/q|jtj0k�rÏt d|jj|jjf ¡ t1 || j¡| _2q|jtj3k�rôt d|jj|jjf ¡ t4 || j¡| _5t t6| j5ƒ¡ q|jtj7k�rt d|jj|jjf ¡ t d¡ q|jtj8k�r(t d|jj|jjf ¡ t d¡ nD|jtj9k�rBt d|jj|jjf ¡ t d¡ n*|jtj:k�r\t d|jj|jjf ¡ t d¡ nt d|jj;|jj|jjf ¡ qz|  <¡  W d S  t=�y� } zt %d¡ W Y d }~d S d }~ww )NzFound UnusedStream @%x Size: %dz"Found ReservedStream0 @%x Size: %dz"Found ReservedStream1 @%x Size: %dz#Found ThreadListStream @%x Size: %dz#Found ModuleListStream @%x Size: %dz#Found MemoryListStream @%x Size: %dz#Found SystemInfoStream @%x Size: %dz%Found ThreadExListStream @%x Size: %dz%Found Memory64ListStream @%x Size: %dz!Found CommentStreamA @%x Size: %dz!Found CommentStreamW @%x Size: %dz"Found ExceptionStream @%x Size: %dz#Found HandleDataStream @%x Size: %dz&Found FunctionTableStream @%x Size: %dz3Parsing of this stream type is not yet implemented!z+Found UnloadedModuleListStream @%x Size: %dz!Found MiscInfoStream @%x Size: %dz'Found MemoryInfoListStream @%x Size: %dz'Found ThreadInfoListStream @%x Size: %dz)Found SystemMemoryInfoStream @%x Size: %dzISystemMemoryInfoStream parsing is not implemented (Missing documentation)z'Found JavaScriptDataStream @%x Size: %dzGJavaScriptDataStream parsing is not implemented (Missing documentation)z*Found ProcessVmCountersStream @%x Size: %dzJProcessVmCountersStream parsing is not implemented (Missing documentation)zFound TokenStream @%x Size: %dz>TokenStream parsing is not implemented (Missing documentation)z+Found Unknown Stream! Type: %s @%x Size: %dzThread context parsing error!)>r   Ú
StreamTyper   ÚUnusedStreamr7   r@   ÚLocationÚRvaÚDataSizeÚReservedStream0ÚReservedStream1ÚThreadListStreamÚMinidumpThreadListr)   r   r   ÚModuleListStreamÚMinidumpModuleListr   ÚMemoryListStreamÚMinidumpMemoryListr   ÚSystemInfoStreamÚMinidumpSystemInfor   ÚThreadExListStreamÚMinidumpThreadExListr   ÚMemory64ListStreamÚMinidumpMemory64Listr   ÚCommentStreamAr   ÚCommentStreamWr   ÚExceptionStreamÚExceptionListr   ÚHandleDataStreamÚMinidumpHandleDataStreamr   ÚFunctionTableStreamÚUnloadedModuleListStreamÚMinidumpUnloadedModuleListr   ÚMiscInfoStreamÚMinidumpMiscInfor   ÚMemoryInfoListStreamÚMinidumpMemoryInfoListr   ÚThreadInfoListStreamÚMinidumpThreadInfoListr   ÚstrÚSystemMemoryInfoStreamÚJavaScriptDataStreamÚProcessVmCountersStreamÚTokenStreamÚnameÚ#_MinidumpFile__parse_thread_contextr6   )r!   Údirr8   r"   r"   r#   Ú__parse_directoriesg   s¸   

 €ÿz MinidumpFile.__parse_directoriesc                 C   sp   | j r| jsd S | jjD ])}|jj}| j |¡ | j jtjkr't	 
| j¡|_q| j jtjkr5t 
| j¡|_qd S r   )r   r   ÚThreadContextrH   r   r<   ÚProcessorArchitecturer	   ÚAMD64ÚCONTEXTr)   ÚContextObjectÚINTELÚWOW64_CONTEXT)r!   ÚthreadÚrvar"   r"   r#   Ú__parse_thread_contextÜ   s   €úz#MinidumpFile.__parse_thread_contextc                 C   s    | j r| jsd S t | ¡| _d S r   )r   r   r
   Úfrom_minidumpr   r    r"   r"   r#   Ú__parse_pebç   s   zMinidumpFile.__parse_pebc                 C   s®   d}|t | jƒ7 }|t | jƒ7 }| jD ]
}|t |ƒd 7 }q| jjD ]
}|t |ƒd 7 }q"| jd urA| jjD ]
}|t |ƒd 7 }q6| jd urU| jjD ]
}|t |ƒd 7 }qJ|S )Nz== Minidump File ==
Ú
)rg   r   r   r   r   r   r   )r!   Útrn   ÚmodÚsegmentr"   r"   r#   Ú__str__ï   s   


zMinidumpFile.__str__N)r*   )Ú__name__Ú
__module__Ú__qualname__r$   Ústaticmethodr)   r+   r0   r,   r2   r'   r3   r4   rm   r5   r€   r"   r"   r"   r#   r      s"    


ur   )r-   ÚsysÚenumÚstructr7   Útypingr   Úminidump.headerr   Úminidump.minidumpreaderr   Úminidump.streamsÚminidump.common_structsÚminidump.constantsr   Úminidump.directoryr   Ú!minidump.streams.SystemInfoStreamr	   Úminidump.structures.pebr
   r   r"   r"   r"   r#   Ú<module>   s   