
    Xf                         d dl 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                        Z
 G d d	ej                        Ze
ed
Zy)    )objects
interfaces)
exceptions)Flags)	renderers)Unionc                   &   e Zd ZdZdefdZdeeej                  j                  f   fdZdeeej                  j                  f   fdZdeeej                  j                  f   fdZdeeej                  j                  f   fdZdefdZd	 Zy
)SERVICE_RECORDzA service record structure.returnc                     | j                   dk  s| j                   dkD  ry	 | j                  j                  }| j                  j                  }y# t        $ r Y yw xY w)$Determine if the structure is valid.r   i  FT)OrderStatedescriptionStart
ValueError)self_s     k/home/panchajanya/Development/work/volatility3/volatility3/framework/symbols/windows/extensions/services.pyis_validzSERVICE_RECORD.is_valid   sW    ::>TZZ&0	

&&A

&&A   		s   ,A 	AAc                    | j                   j                  dk7  sd| j                         vrt        j                         S 	 | j
                  j                  S # t        j                  $ r t        j                         cY S w xY w)z&Return the pid of the process, if any.SERVICE_RUNNINGPROCESS)
r   r   get_typer   NotApplicableValueServiceProcess	ProcessIdr   InvalidAddressExceptionUnreadableValuer   s    r   get_pidzSERVICE_RECORD.get_pid   so     JJ""&77///11	/&&00011 	/,,..	/s   A 'B Bc                    | j                   j                  dk7  rt        j                         S 	 d| j	                         v r7| j
                  j                  j                         j                  dddd      S | j                  j                         j                  dddd      S # t        j                  $ r t        j                         cY S w xY w)z/Returns the binary associated with the service.r   r   stringutf-16replace   encodingerrors
max_length)r   r   r   r   r   r   
BinaryPathdereferencecast
DriverNamer   r   r   r    s    r   
get_binaryzSERVICE_RECORD.get_binary)   s    ::!!%66//11
	/DMMO+**55AACHHx	c I   22499x	c :   11 	/,,..	/s   AB% 8,B% %'CCc                     	 | j                   j                         j                  dddd      S # t        j                  $ r t        j                         cY S w xY w)zReturns the service name.r#   r$   r%   r&   r'   )ServiceNamer,   r-   r   r   r   r   r    s    r   get_namezSERVICE_RECORD.get_name<   ]    	/##//1668I# 7   11 	/,,..	/   ,/ 'AAc                     	 | j                   j                         j                  dddd      S # t        j                  $ r t        j                         cY S w xY w)zReturns the service display.r#   r$   r%   r&   r'   )DisplayNamer,   r-   r   r   r   r   r    s    r   get_displayzSERVICE_RECORD.get_displayE   r3   r4   c                 p    dddddddd}t        |	      }d
j                   || j                              S )zReturns the binary types.                      )SERVICE_KERNEL_DRIVERSERVICE_FILE_SYSTEM_DRIVERSERVICE_ADAPTORSERVICE_RECOGNIZER_DRIVERSERVICE_WIN32_OWN_PROCESSSERVICE_WIN32_SHARE_PROCESSSERVICE_INTERACTIVE_PROCESS)choices|)r   joinType)r   SERVICE_TYPE_FLAGS
type_flagss      r   r   zSERVICE_RECORD.get_typeN   sF     &'*+ )*)++-+.
 #56
xx
499-..    c              #     K   	 t        | d      rF|  | j                  }|r|j                         rx| |j                  }|re|j                         r#y| }|rN|j                         r=| |j                  j                  j                         }|r|j                         r;yyyyyyy# t        j                  $ r Y yw xY ww)z)Generator that enumerates other services.	PrevEntryN)hasattrrO   r   ServiceListBlinkr,   r   r   )r   recs     r   traversezSERVICE_RECORD.traverse^   s     	t[)
 nncllnI--C clln cllnI////;;=C cllncnc nc 11 		s6   CAB, CAB, %C,C?CCCN)__name__
__module____qualname____doc__boolr   r   intr   r   BaseAbsentValuer!   strr/   r2   r7   r   rT    rM   r   r
   r
      s    %$ /sJ$8$8$H$HHI //E#z';';'K'K"KL /&/%Z%9%9%I%I IJ //U3
(<(<(L(L#LM //# / rM   r
   c                       e Zd ZdZdefdZy)SERVICE_HEADERzA service header structure.r   c                 j    	 | j                   j                         S # t        j                  $ r Y yw xY w)r   F)ServiceRecordr   r   r   r    s    r   r   zSERVICE_HEADER.is_validw   s4    	%%..0011 		s    22N)rU   rV   rW   rX   rY   r   r]   rM   r   r_   r_   t   s    %$ rM   r_   )_SERVICE_RECORD_SERVICE_HEADERN)volatility3.frameworkr   r   r   &volatility3.framework.symbols.wrappersr   r   typingr   
StructTyper
   r_   class_typesr]   rM   r   <module>ri      sI   
 6 , 8 + eW'' ePW''  #1^TrM   