
    Xf                         d dl 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 d dlmZ d dlmZ  G d dej                   j"                        Zy	)
    )IterableCallableTuple)	renderers
interfaces
exceptions)requirements)utility)mac)pslistc                      e Zd ZdZdZdZdddddd	d
dddddZg dZg dZg dZ	eee	dZ
ed        Zd Zed        Zed        Zed fdej"                  j$                  dedeegef   deeej2                  j4                  ej2                  j4                  ej2                  j4                  f      fd       Zd Zd Zy )!Keventsz,Lists event handlers registered by processes)   r   r   )   r   r   EVFILT_READEVFILT_WRITE
EVFILT_AIOEVFILT_VNODEEVFILT_PROCEVFILT_SIGNALEVFILT_TIMEREVFILT_MACHPORT	EVFILT_FSEVFILT_USER	EVFILT_VM)r   r                     	   
      ))NOTE_DELETEr   )
NOTE_WRITEr   )NOTE_EXTENDr   )NOTE_ATTRIBr!   )	NOTE_LINK   )NOTE_RENAME    )NOTE_REVOKE@   ))	NOTE_EXITl        )NOTE_EXITSTATUSi   )	NOTE_FORKi   @)	NOTE_EXECi    )NOTE_SIGNALi   )	NOTE_REAPi   ))NOTE_SECONDSr   )NOTE_USECONDSr   )NOTE_NSECONDSr   )NOTE_ABSOLUTEr!   )r   r   r    c           	         t        j                  ddddg      t        j                  dt        j                  d      t        j
                  d	t        j                  d
      t        j                  ddt        d      gS )NkernelzKernel module for the OSIntel32Intel64)namedescriptionarchitecturesr   )r   r   r   )r=   pluginversionmacutils)r   r   r   )r=   	componentrA   pidzFilter on specific process IDsT)r=   r>   element_typeoptional)
r	   ModuleRequirementPluginRequirementr   PsListVersionRequirementr   MacUtilitiesListRequirementint)clss    [/home/panchajanya/Development/work/volatility3/volatility3/framework/plugins/mac/kevents.pyget_requirementszKevents.get_requirementsB   s~     **6()4
 **fmmY ++3+;+;Y ((< 	
 	
    c                     |dk(  s|| j                   vryg }| j                   |   }|D ]  \  }}||z  |k(  s|j                  |       ! dj                  |      S )Nr    ,)all_filtersappendjoin)selffilter_indexfilter_flagscontextfiltersflagindexs          rO   _parse_flagszKevents._parse_flagsX   sl    1D4D4D D""<0" 	%KD%e#u,t$	% xx  rQ   c              #     K   	 t        ||      }t        ||      }|j                  d||dz   |j                  d            }|D ]+  }t
        j                  j                  |d      D ]  }	|	  - y# t        j                  $ r Y yw xY ww)z
        Convenience wrapper for walking an array of lists of kernel events
        Handles invalid address references
        arrayr   klist)object_typeoffsetcountsubtypeNkn_link)getattrobjectget_typer   InvalidAddressExceptionr   rK   
walk_slist)
rN   r:   fdparray_pointer_memberarray_size_memberklist_array_pointer
array_sizeklist_arrayrb   kns
             rO   _walk_klist_arrayzKevents._walk_klist_arraye   s     	")#/C"D &78J --#* 1n0	 ( K ! 	E&&11%C 	 11 		s(   B?A4 1B4B
B	B

Bc              #   6  K   |j                   }| j                  ||dd      D ]  }|  | j                  ||dd      D ]  }|  	 |j                  }t
        j                  j                  |d      D ]  }|  y# t        j                  $ r Y yw xY ww)z
        Enumerates event filters per task.
        Uses smear-safe APIs throughout as these data structures
        see a significant amount of smear
        	fd_knlistfd_knlistsize	fd_knhashfd_knhashmaskNrg   )p_fdrt   p_klistr   rk   r   rK   rl   )rN   r:   taskrm   rs   r{   s         rO   _get_task_keventszKevents._get_task_kevents}   s      ii''[/R 	BH	 ''[/R 	BH		llG ""--gyA 	BH	 11 		s*   AB
B  *B BBBBc                      y)NF )_s    rO   <lambda>zKevents.<lambda>   s    rQ   r[   kernel_module_namefilter_funcreturnc              #   N  K   |j                   |   }t        j                  j                  t        j                  j                  d         } ||||      D ]K  }t        j                  |j                        }|j                  }| j                  ||      D ]	  }	|||	f  M yw)aN  
        Returns the kernel event filters registered

        Return values:
            A tuple of 3 elements:
                1) The name of the process that registered the filter
                2) The process ID of the process that registered the filter
                3) The object of the associated kernel event filter
        r   N)
modulesr   rI   get_list_taskspslist_methodsr
   array_to_stringp_commp_pidr}   )
rN   r[   r   r   r:   
list_tasksr|   	task_namerD   rs   s
             rO   list_kernel_eventszKevents.list_kernel_events   s     , !34]]11&--2N2Nq2QR
w(:KH 	)D//<I**C++FD9 )b(()		)s   B#B%c              #     K   t         j                  j                  | j                  j	                  dd             }| j                  | j                  | j                  d   |      D ]|  \  }}}|j                  j                  dz  }|| j                  v r| j                  |   }n?	 |j                  j                  }| j                  ||j                        }d|||||ff ~ y # t        j                  $ r Y w xY ww)NrD   r:   )r   r   )r   rI   create_pid_filterconfiggetr   r[   	kn_keventfilterevent_typesidentr   rk   r_   
kn_sfflags)	rX   r   r   rD   rs   rY   filter_namer   r[   s	            rO   
_generatorzKevents._generator   s     mm55dkkooeT6RS"&"9"9LL$++h/[ #: #
 	EIsB <<..3Lt///"..|<** ''bmmDGsIuk7CDD!	E 55 s*   B$D 'C'=*D 'C=:D <C==D c                     t        j                  dt        fdt        fdt        fdt        fdt        fg| j	                               S )NPIDProcessIdentFilterContext)r   TreeGridrM   strr   )rX   s    rO   runzKevents.run   sK    !!C #3C  OO	
 		
rQ   N)__name__
__module____qualname____doc___required_framework_version_versionr   vnode_filtersproc_filterstimer_filtersrU   classmethodrP   r_   rt   r}   r   r[   ContextInterfacer   r   rM   boolr   r   objectsObjectInterfacer   r   r   r   rQ   rO   r   r      sC   6"+H KMLM K 
 
*!  .  , 
 .=	)##44)  ) seTk*	)
 
......0	

) )@E*

rQ   r   N)typingr   r   r   volatility3.frameworkr   r   r   #volatility3.framework.configurationr	   volatility3.framework.objectsr
   volatility3.framework.symbolsr   volatility3.plugins.macr   pluginsPluginInterfacer   r   rQ   rO   <module>r      s9   
 - , C C < 1 - *F
j  00 F
rQ   