B
    "„Oc‘  ã               @   s(  d Z ddlZddlZ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mZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% yddl
mZ& W nj e'k
rî Z( zJe)e(ƒ *¡  +d¡rÜe ,¡ d d k rÜd!Z-e-d"7 Z-e-d#7 Z-e.e-ƒ‚n‚ W ddZ([(X Y nX ej/d$krddl0Z0ndZ0d%d&d'd(d)d*d+d,d-d.d/d0d1d2gZ1d3Z2d4Z3d5ej4kZ5e0dkrLd6Z6ne0 7d7d2d6i¡Z8e8j6Z6e&j9ej:e&j;ej<e&j=ej>e&j?ej@e&jAejBe&jCejDe&jEejFe&jGejHe&jIejJe&jKejLe&jMejNe&jOe2e&jPejQiZRe0dk	röG d8d9„ d9e0j7ƒZSeTƒ  UeSjV¡ e0dkrdZWdZXd:ZYd;ZZn G d<d=„ d=e0j7ƒZ[eTƒ  Ue[jV¡ e\ddd:d;d>d?d d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOZ]e	dPdQdRdSdTdUgƒZ^e	dVdWdXdYdZd[gƒZ_e	d\d]d^d_d`dadbdcdddedfdgdhgƒZ`e	die`jadj ƒZbe	dkdld]gƒZce	dmdndo decja¡ ƒZee	dpdqdrdsdtdudvgƒZfedwdxdydz„ ƒZgd{d|„ Zhed}d~„ ƒZidd€„ Zjdd‚„ Zke&jlZldƒd„„ Zmd…d†„ Znd‡dˆ„ Zod‰dŠ„ Zpd‹dŒ„ ZqddŽ„ Zrdd„ Zsd‘d’„ Ztd“aud”d•„ Zvd²d–d—„Zwd˜d™„ Zxdšd›„ Zydœd„ ZzdždŸ„ Z{da|d d¡„ Z}d¢d£„ Z~d¤d%„ Zd¥d&„ Z€G d¦d§„ d§eƒZ‚e&jƒZƒe&j„Z„e&j…Z…d¨d©„ Z†d³dªd«„Z‡d¬d­„ Zˆd®d¯„ Z‰G d°d±„ d±eƒZŠdS )´z Windows platform implementation.é    N)Ú
namedtupleé   )Ú_common)ÚENCODING)ÚENCODING_ERRS)ÚAccessDenied)ÚNoSuchProcess)ÚTimeoutExpired)Ú	conn_tmap)Úconn_to_ntuple)Údebug)Úisfile_strict)Úmemoize)Úmemoize_when_activated)Úparse_environ_block)Úusage_percent)ÚPY3)Úlong)Ú	lru_cache)Úrange)Úunicode)ÚABOVE_NORMAL_PRIORITY_CLASS)ÚBELOW_NORMAL_PRIORITY_CLASS)ÚHIGH_PRIORITY_CLASS)ÚIDLE_PRIORITY_CLASS)ÚNORMAL_PRIORITY_CLASS)ÚREALTIME_PRIORITY_CLASS)Ú_psutil_windowszdll load failedé   z3this Windows version is too old (< Windows Vista); z:psutil 3.4.2 is the latest version which supports Windows z2000, XP and 2003 server)é   é   Úwin_service_iterÚwin_service_getr   r   r   r   r   r   ÚIOPRIO_VERYLOWÚ
IOPRIO_LOWÚIOPRIO_NORMALÚIOPRIO_HIGHÚCONN_DELETE_TCBÚAF_LINKZ
DELETE_TCBi+  Z__pypy__éÿÿÿÿÚAddressFamilyc               @   s$   e Zd ZeZeZeZeZeZeZdS )ÚPriorityN)	Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   © r/   r/   ú0lib/python3.7/site-packages/psutil/_pswindows.pyr+   n   s   r+   é   r   c               @   s   e Zd ZdZdZdZdZdS )Ú
IOPriorityr   r   r1   r   N)r,   r-   r.   r#   r$   r%   r&   r/   r/   r/   r0   r2   ~   s   r2   r    é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   )Únum_handlesÚctx_switchesÚ	user_timeÚkernel_timeÚcreate_timeÚnum_threadsÚ	io_rcountÚ	io_wcountÚ	io_rbytesÚ	io_wbytesÚio_count_othersÚio_bytes_othersÚnum_page_faultsÚ	peak_wsetÚwsetÚpeak_paged_poolÚ
paged_poolÚpeak_non_paged_poolÚnon_paged_poolÚpagefileÚpeak_pagefileÚmem_privateÚ	scputimesÚuserÚsystemÚidleÚ	interruptÚdpcÚsvmemÚtotalZ	availableÚpercentÚusedÚfreeÚpmemÚrssÚvmsrO   rP   rQ   rR   rS   Zpeak_nonpaged_poolZnonpaged_poolrV   rW   ZprivateÚpfullmem)ÚussÚpmmap_groupedÚpathÚ	pmmap_extzaddr perms ú ÚpioZ
read_countZwrite_countZ
read_bytesZwrite_bytesÚother_countZother_bytesi   )Úmaxsizec             C   s@   d  |  d¡dd… ¡}t |¡}| t|ƒd… }tj  ||¡S )zConvert paths using native DOS format like:
        "\Device\HarddiskVolume1\Windows\systemew\file.txt"
    into:
        "C:\Windows\systemew\file.txt"
    ú\Nr   )ÚjoinÚsplitÚcextZQueryDosDeviceÚlenÚosrj   )ÚsZrawdriveZdriveletterZ	remainderr/   r/   r0   Úconvert_dos_pathÁ   s    
rw   c             C   s&   t r| S t| tƒr| S |  tt¡S dS )zmEncode a unicode string to a byte string by using the default fs
    encoding + "replace" error handler.
    N)r   Ú
isinstanceÚstrÚencoder   r   )rv   r/   r/   r0   Úpy2_strencodeÎ   s
    
r{   c               C   s   t  ¡ S )N)rs   Úgetpagesizer/   r/   r/   r0   r|   Û   s    r|   c              C   sN   t  ¡ } | \}}}}}}|}|}|}	|| }
t|| |dd}t||||
|	ƒS )z&System virtual memory as a namedtuple.r   )Úround_)rs   Úvirtual_memr   r_   )ÚmemZtotphysZ	availphysZtotpagefZ
availpagefZtotvirtZfreevirtr`   Zavailrc   rb   ra   r/   r/   r0   Úvirtual_memoryå   s    r€   c        	      C   sh   t  ¡ } | d }| d }| d }| d }|| }t||| ƒ}|| }t||dd}t ||||dd¡S )z=Swap system memory as a (total, used, free, sin, sout) tuple.r   r   r1   r   )r}   )rs   r~   Úminr   r   Zsswap)	r   Z
total_physZ	free_physZtotal_systemZfree_systemr`   rc   rb   ra   r/   r/   r0   Úswap_memoryò   s    r‚   c             C   sP   t rt| tƒr| jtdd} t | ¡\}}|| }t||dd}t 	||||¡S )z'Return disk usage associated with path.Ústrict)Úerrorsr   )r}   )
r   rx   ÚbytesÚdecoder   rs   Ú
disk_usager   r   Z
sdiskusage)rj   r`   rc   rb   ra   r/   r/   r0   r‡     s    r‡   c             C   s   t  | ¡}dd„ |D ƒS )zReturn disk partitions.c             S   s   g | ]}t j|Ž ‘qS r/   )r   Z	sdiskpart)Ú.0Úxr/   r/   r0   ú
<listcomp>  s    z#disk_partitions.<locals>.<listcomp>)rs   Údisk_partitions)ÚallÚrawlistr/   r/   r0   r‹     s    
r‹   c              C   s<   t  ¡ \} }}tdd„ tt  ¡ Ž D ƒŽ }t| |||j|jƒS )z)Return system CPU times as a named tuple.c             S   s   g | ]}t |ƒ‘qS r/   )Úsum)rˆ   Únr/   r/   r0   rŠ   )  s    zcpu_times.<locals>.<listcomp>)rs   Ú	cpu_timesrY   ÚzipÚper_cpu_timesr]   r^   )rZ   r[   r\   Zpercpu_summedr/   r/   r0   r   #  s    r   c              C   s>   g } x4t  ¡ D ](\}}}}}t|||||ƒ}|  |¡ qW | S )z6Return system per-CPU times as a list of named tuples.)rs   r’   rY   Úappend)ÚretrZ   r[   r\   r]   r^   Úitemr/   r/   r0   r’   .  s
    r’   c               C   s   t  ¡ S )z0Return the number of logical CPUs in the system.)rs   Úcpu_count_logicalr/   r/   r/   r0   r–   7  s    r–   c               C   s   t  ¡ S )z-Return the number of CPU cores in the system.)rs   Úcpu_count_coresr/   r/   r/   r0   r—   <  s    r—   c              C   s$   t  ¡ \} }}}d}t | |||¡S )zReturn CPU statistics.r   )rs   Ú	cpu_statsr   Z	scpustats)rD   Z
interruptsZdpcsZsyscallsZsoft_interruptsr/   r/   r0   r˜   A  s    
r˜   c              C   s(   t  ¡ \} }d}t t| ƒ|t|ƒ¡gS )zMReturn CPU frequency.
    On Windows per-cpu frequency is not supported.
    g        )rs   Úcpu_freqr   ZscpufreqÚfloat)ZcurrZmax_Zmin_r/   r/   r0   r™   I  s    r™   Fc              C   s*   t st ¡  da t ¡ } tdd„ | D ƒƒS )z~Return the number of processes in the system run queue averaged
    over the last 1, 5, and 15 minutes respectively as a tupleTc             S   s   g | ]}t |d ƒ‘qS )r1   )Úround)rˆ   Úloadr/   r/   r0   rŠ   `  s    zgetloadavg.<locals>.<listcomp>)Ú_loadavg_inititializedrs   Zinit_loadavg_counterÚ
getloadavgÚtuple)Z	raw_loadsr/   r/   r0   rž   U  s
    rž   c             C   sž   | t kr(td| d dd„ t D ƒ¡f ƒ‚t |  \}}t |||¡}tƒ }xL|D ]D}|\}}}	}
}}}t|||	|
||t|dkr€|ndd}| |¡ qNW t	|ƒS )zˆReturn socket connections.  If pid == -1 return system-wide
    connections (as opposed to connections opened by one process only).
    z+invalid %r kind argument; choose between %sz, c             S   s   g | ]}t |ƒ‘qS r/   )Úrepr)rˆ   r‰   r/   r/   r0   rŠ   n  s    z#net_connections.<locals>.<listcomp>r)   N)Úpid)
r
   Ú
ValueErrorrq   rs   Únet_connectionsÚsetr   ÚTCP_STATUSESÚaddÚlist)ÚkindÚ_pidZfamiliesÚtypesr   r”   r•   ÚfdZfamÚtypeZladdrZraddrÚstatusr¡   Úntr/   r/   r0   r£   h  s    
r£   c              C   s~   i } t  ¡ }xl| ¡ D ]`\}}ts@t|tƒs8tt|ƒƒ‚t|ƒ}|\}}}}t	t
dƒr`t
 |¡}t
 ||||d¡| |< qW | S )z)Get NIC stats (isup, duplex, speed, mtu).Ú	NicDuplexÚ )rs   Únet_if_statsÚitemsr   rx   r   ÚAssertionErrorr¬   r{   Úhasattrr   r¯   Z	snicstats)r”   ZrawdictÚnamer²   ZisupZduplexZspeedZmtur/   r/   r0   r±   z  s    

r±   c              C   s   t  ¡ } tdd„ |  ¡ D ƒƒS )zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    c             S   s   g | ]\}}t |ƒ|f‘qS r/   )r{   )rˆ   ÚkÚvr/   r/   r0   rŠ   Ž  s    z#net_io_counters.<locals>.<listcomp>)rs   Únet_io_countersÚdictr²   )r”   r/   r/   r0   r¸   ‰  s    r¸   c              C   s<   g } x2t  ¡ D ]&}t|ƒ}t|d ƒ|d< |  |¡ qW | S )z,Return the addresses associated to each NIC.r   )rs   Únet_if_addrsr§   r{   r“   )r”   r²   r/   r/   r0   rº   ‘  s    rº   c              C   sd   t  ¡ \} }}}| dk}t|d@ ƒ}t|d@ ƒ}|r8dS |s@|rHtj}n|dkrVtj}t |||¡S )zReturn battery information.r   é€   r5   Nr)   )rs   Úsensors_batteryÚboolr   ZPOWER_TIME_UNLIMITEDZPOWER_TIME_UNKNOWNZsbattery)Zacline_statusÚflagsra   ZsecsleftZpower_pluggedZ
no_batteryZchargingr/   r/   r0   r¼      s    r¼   c              C   s,   t t ¡ ƒ} t| t ƒdkr tS | a| S dS )z:The system boot time expressed in seconds since the epoch.r   N)rš   rs   Ú	boot_timeÚabsÚ_last_btime)r”   r/   r/   r0   r¿   ¼  s
    r¿   c              C   sL   g } t  ¡ }x:|D ]2}|\}}}t|ƒ}t |d||d¡}|  |¡ qW | S )z:Return currently connected users as a list of namedtuples.N)rs   Úusersr{   r   Zsuserr“   )Úretlistr   r•   rZ   ZhostnameZtstampr®   r/   r/   r0   rÂ   Ê  s    

rÂ   c              c   s.   x(t  ¡ D ]\} }tt| ƒt|ƒƒV  q
W dS )z*Yields a list of WindowsService instances.N)rs   Zwinservice_enumerateÚWindowsServicer{   )rµ   Údisplay_namer/   r/   r0   r!   Û  s    c             C   s   t | dƒ}| ¡ d |_|S )zBOpen a Windows service and return it as a WindowsService instance.NrÅ   )rÄ   Ú_query_configÚ_display_name)rµ   Zservicer/   r/   r0   r"   á  s    
c               @   sž   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
ej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 d!„ Zd"d#„ Zd$S )%rÄ   z(Represents an installed Windows service.c             C   s   || _ || _d S )N)Ú_namerÇ   )Úselfrµ   rÅ   r/   r/   r0   Ú__init__ë  s    zWindowsService.__init__c             C   s    d| j | jf }d| jj|f S )Nz(name=%r, display_name=%r)z%s%s)rÈ   rÇ   Ú	__class__r,   )rÉ   Zdetailsr/   r/   r0   Ú__str__ï  s    zWindowsService.__str__c             C   s   d|   ¡ t| ƒf S )Nz
<%s at %s>)rÌ   Úid)rÉ   r/   r/   r0   Ú__repr__ô  s    zWindowsService.__repr__c             C   s   t |tƒstS | j|jkS )N)rx   rÄ   ÚNotImplementedrÈ   )rÉ   Úotherr/   r/   r0   Ú__eq__÷  s    
zWindowsService.__eq__c             C   s
   | |k S )Nr/   )rÉ   rÐ   r/   r/   r0   Ú__ne__þ  s    zWindowsService.__ne__c          	   C   sH   |   ¡  t | j¡\}}}}W d Q R X tt|ƒt|ƒt|ƒt|ƒdS )N)rÅ   ÚbinpathÚusernameÚ
start_type)Ú_wrap_exceptionsrs   Zwinservice_query_configrÈ   r¹   r{   )rÉ   rÅ   rÓ   rÔ   rÕ   r/   r/   r0   rÆ     s    
zWindowsService._query_configc          	   C   s<   |   ¡  t | j¡\}}W d Q R X |dkr0d }t||dS )Nr   )r­   r¡   )rÖ   rs   Zwinservice_query_statusrÈ   r¹   )rÉ   r­   r¡   r/   r/   r0   Ú_query_status  s
    
zWindowsService._query_statusc          
   c   s~   y
dV  W nn t k
rx } zPt|ƒr<td| jd| j d‚n,|jtjtjfkrftd| jd| j d‚n‚ W dd}~X Y nX dS )z{Ctx manager which translates bare OSError and WindowsError
        exceptions into NoSuchProcess and AccessDenied.
        Nz2service %r is not querable (not enough privileges))r¡   rµ   Úmsgzservice %r does not exist))	ÚOSErrorÚis_permission_errr   rÈ   Úwinerrorrs   ZERROR_INVALID_NAMEZERROR_SERVICE_DOES_NOT_EXISTr   )rÉ   Úerrr/   r/   r0   rÖ     s    

zWindowsService._wrap_exceptionsc             C   s   | j S )z¢The service name. This string is how a service is referenced
        and can be passed to win_service_get() to get a new
        WindowsService instance.
        )rÈ   )rÉ   r/   r/   r0   rµ   *  s    zWindowsService.namec             C   s   | j S )z_The service display name. The value is cached when this class
        is instantiated.
        )rÇ   )rÉ   r/   r/   r0   rÅ   1  s    zWindowsService.display_namec             C   s   |   ¡ d S )zwThe fully qualified path to the service binary/exe file as
        a string, including command line arguments.
        rÓ   )rÆ   )rÉ   r/   r/   r0   rÓ   7  s    zWindowsService.binpathc             C   s   |   ¡ d S )z,The name of the user that owns this service.rÔ   )rÆ   )rÉ   r/   r/   r0   rÔ   =  s    zWindowsService.usernamec             C   s   |   ¡ d S )zRA string which can either be "automatic", "manual" or
        "disabled".
        rÕ   )rÆ   )rÉ   r/   r/   r0   rÕ   A  s    zWindowsService.start_typec             C   s   |   ¡ d S )zzThe process PID, if any, else None. This can be passed
        to Process class to control the service's process.
        r¡   )r×   )rÉ   r/   r/   r0   r¡   I  s    zWindowsService.pidc             C   s   |   ¡ d S )zService status as a string.r­   )r×   )rÉ   r/   r/   r0   r­   O  s    zWindowsService.statusc             C   s   t t |  ¡ ¡ƒS )zService long description.)r{   rs   Zwinservice_query_descrrµ   )rÉ   r/   r/   r0   ÚdescriptionS  s    zWindowsService.descriptionc             C   s>   |   ¡ }| |  ¡ ¡ |  ¡ |d< |  ¡ |d< |  ¡ |d< |S )zUUtility method retrieving all the information above as a
        dictionary.
        rµ   rÅ   rÝ   )rÆ   Úupdater×   rµ   rÅ   rÝ   )rÉ   Údr/   r/   r0   Úas_dictY  s    zWindowsService.as_dictN)r,   r-   r.   Ú__doc__rÊ   rÌ   rÎ   rÑ   rÒ   rÆ   r×   Ú
contextlibÚcontextmanagerrÖ   rµ   rÅ   rÓ   rÔ   rÕ   r¡   r­   rÝ   rà   r/   r/   r/   r0   rÄ   è  s$   rÄ   c             C   s<   t | tƒst| ƒ‚| jtjtjfkp:t| ddƒtjtj	fkS )z*Return True if this is a permission error.rÛ   r)   )
rx   rÙ   r³   ÚerrnoZEPERMZEACCESÚgetattrrs   ZERROR_ACCESS_DENIEDZERROR_PRIVILEGE_NOT_HELD)Úexcr/   r/   r0   rÚ   –  s    rÚ   c             C   sF   t | tƒst| ƒ‚t| ƒr&t||dS | jtjkr>t||dS | ‚dS )z3Convert OSError into NoSuchProcess or AccessDenied.)r¡   rµ   N)rx   rÙ   r³   rÚ   r   rä   ZESRCHr   )ræ   r¡   rµ   r/   r/   r0   Úconvert_oserror¡  s    rç   c                s   t  ˆ ¡‡ fdd„ƒ}|S )zDDecorator which converts OSError into NoSuchProcess or AccessDenied.c          
      sJ   yˆ | f|ž|ŽS  t k
rD } zt|| j| jd‚W d d }~X Y nX d S )N)r¡   rµ   )rÙ   rç   r¡   rÈ   )rÉ   ÚargsÚkwargsrÜ   )Úfunr/   r0   Úwrapper­  s    z wrap_exceptions.<locals>.wrapper)Ú	functoolsÚwraps)rê   rë   r/   )rê   r0   Úwrap_exceptions«  s    rî   c                s   t  ˆ ¡‡ fdd„ƒ}|S )z€Workaround for https://github.com/giampaolo/psutil/issues/875.
    See: https://stackoverflow.com/questions/4457745#4457745
    c       	         sž   d}d}xt |ƒD ]d}yˆ | f|ž|ŽS  tk
rt } z0|}|jtkrbt |¡ t|d dƒ}wn‚ W d d }~X Y qX qW dˆ ||f }t| j| j	|d‚d S )Ng-Cëâ6?é!   r1   g{®Gáz¤?zI%s retried %s times, converted to AccessDenied as it's still returning %r)r¡   rµ   rØ   )
r   ÚWindowsErrorrÛ   ÚERROR_PARTIAL_COPYÚtimeÚsleepr   r   r¡   rÈ   )	rÉ   rè   ré   ÚdelayÚtimesr‰   Ú_rÜ   rØ   )rê   r/   r0   rë   º  s    

z)retry_error_partial_copy.<locals>.wrapper)rì   rí   )rê   rë   r/   )rê   r0   Úretry_error_partial_copy¶  s    r÷   c               @   sÄ  e Zd ZdZddddgZdd„ Zdd	„ Zd
d„ Zedd„ ƒZ	dd„ Z
eedd„ ƒƒZeedd„ ƒƒZeedd„ ƒƒZdd„ Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zed d!„ ƒZed"d#„ ƒZedPd%d&„ƒZed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZed3d4„ ƒZeed5d6„ ƒƒZed7d8„ ƒZ edQd:d;„ƒZ!ed<d=„ ƒZ"ed>d?„ ƒZ#ed@dA„ ƒZ$edBdC„ ƒZ%edDdE„ ƒZ&edFdG„ ƒZ'edHdI„ ƒZ(edJdK„ ƒZ)edLdM„ ƒZ*edNdO„ ƒZ+d$S )RÚProcessz1Wrapper class around underlying C implementation.r¡   rÈ   Ú_ppidÚ_cachec             C   s   || _ d | _d | _d S )N)r¡   rÈ   rù   )rÉ   r¡   r/   r/   r0   rÊ   Õ  s    zProcess.__init__c             C   s   | j  | ¡ | j | ¡ d S )N)Ú
_proc_infoZcache_activateÚexe)rÉ   r/   r/   r0   Úoneshot_enterÜ  s    zProcess.oneshot_enterc             C   s   | j  | ¡ | j | ¡ d S )N)rû   Zcache_deactivaterü   )rÉ   r/   r/   r0   Úoneshot_exità  s    zProcess.oneshot_exitc             C   s$   t  | j¡}t|ƒttƒks t‚|S )zOReturn multiple information about this process as a
        raw tuple.
        )rs   Z	proc_infor¡   rt   Ú	pinfo_mapr³   )rÉ   r”   r/   r/   r0   rû   ä  s    zProcess._proc_infoc             C   s,   | j dkrdS | j dkrdS tj |  ¡ ¡S )zbReturn process name, which on Windows is always the final
        part of the executable.
        r   zSystem Idle Processr    ZSystem)r¡   ru   rj   Úbasenamerü   )rÉ   r/   r/   r0   rµ   í  s
    

zProcess.namec          
   C   sŽ   t r`yt | j¡}W ql tk
r\ } z*|jdkrJtd| ƒ t| j| jƒ‚‚ W d d }~X Y qlX nt | j¡}t	sxt
|ƒ}| d¡rŠt|ƒS |S )Né   z%r translated into AccessDeniedrp   )ÚPYPYrs   Zproc_exer¡   rð   rä   r   r   rÈ   r   r{   Ú
startswithrw   )rÉ   rü   rÜ   r/   r/   r0   rü   ù  s    

zProcess.exec          
   C   sŒ   t jt jkrbyt j| jdd}W qr tk
r^ } z t|ƒrLt j| jdd}n‚ W d d }~X Y qrX nt j| jdd}trz|S dd„ |D ƒS d S )NT)Zuse_pebFc             S   s   g | ]}t |ƒ‘qS r/   )r{   )rˆ   rv   r/   r/   r0   rŠ      s    z#Process.cmdline.<locals>.<listcomp>)rs   ZWINVERZWINDOWS_8_1Zproc_cmdliner¡   rÙ   rÚ   r   )rÉ   r”   rÜ   r/   r/   r0   Úcmdline  s    zProcess.cmdlinec             C   s6   t  | j¡}|r*ts*t|tƒs*tt|ƒƒ‚tt	|ƒƒS )N)
rs   Zproc_environr¡   r   rx   r   r³   r¬   r   r{   )rÉ   Zustrr/   r/   r0   Úenviron"  s    zProcess.environc             C   s4   yt ƒ | j S  tk
r.   t| j| jƒ‚Y nX d S )N)Úppid_mapr¡   ÚKeyErrorr   rÈ   )rÉ   r/   r/   r0   Úppid*  s    zProcess.ppidc             C   s®   yt  | j¡S  tk
r¨ } z~t|ƒr–|  ¡ }|td  |td  |td  |td  |td  |td  |td  |td  |td	  |td
  f
S ‚ W d d }~X Y nX d S )NrO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   )rs   Zproc_memory_infor¡   rÙ   rÚ   rû   rÿ   )rÉ   rÜ   Úinfor/   r/   r0   Ú_get_raw_meminfo0  s     








zProcess._get_raw_meminfoc             C   s(   |   ¡ }|d }|d }t||f| Ž S )Nr1   r4   )r
  rd   )rÉ   Útre   rf   r/   r/   r0   Úmemory_infoF  s    zProcess.memory_infoc             C   s,   |   ¡ }t | j¡}|tƒ 9 }t||f Ž S )N)r  rs   Zproc_memory_ussr¡   r|   rg   )rÉ   Z	basic_memrh   r/   r/   r0   Úmemory_full_infoP  s    
zProcess.memory_full_infoc          
   c   sˆ   yt  | j¡}W n2 tk
rB } zt|| j| jƒ‚W d d }~X Y nBX x>|D ]6\}}}}t|ƒ}tsjt|ƒ}t	|ƒ}||||fV  qJW d S )N)
rs   Zproc_memory_mapsr¡   rÙ   rç   rÈ   rw   r   r{   Úhex)rÉ   ÚrawrÜ   ZaddrZpermrj   re   r/   r/   r0   Úmemory_mapsW  s    "zProcess.memory_mapsc             C   s   t  | j¡S )N)rs   Ú	proc_killr¡   )rÉ   r/   r/   r0   Úkillf  s    zProcess.killc             C   sT   |t jkrt | j¡ n8|tt dtƒ ƒtt dtƒ ƒfkrHt | j|¡ nt	dƒ‚d S )NZCTRL_C_EVENTZCTRL_BREAK_EVENTzPonly SIGTERM, CTRL_C_EVENT and CTRL_BREAK_EVENT signals are supported on Windows)
ÚsignalÚSIGTERMrs   r  r¡   rå   Úobjectru   r  r¢   )rÉ   Zsigr/   r/   r0   Úsend_signalj  s    
zProcess.send_signalNc             C   sæ   |d krt j}nt|d ƒ}ttdtjƒ}|d k	r<|ƒ | nd }yt  | j|¡}W n> t jk
rx   t|| j| jƒ‚Y n t j	k
r   d }Y nX d}xJt
| jƒs¦|S |rÆ|ƒ |krÆt|| j| jd‚t |¡ t|d dƒ}q˜W d S )Niè  Z	monotonicg-Cëâ6?)r¡   rµ   r1   g{®Gáz¤?)rs   ZINFINITEÚintrå   rò   Z	proc_waitr¡   r	   rÈ   ZTimeoutAbandonedÚ
pid_existsró   r   )rÉ   ZtimeoutZcext_timeoutZtimerZstop_atZ	exit_coderô   r/   r/   r0   Úwaitw  s&    	


zProcess.waitc             C   s2   | j dkrdS t | j ¡\}}t|ƒd t|ƒ S )N)r   r    zNT AUTHORITY\SYSTEMrp   )r¡   rs   Zproc_usernamer{   )rÉ   ZdomainrZ   r/   r/   r0   rÔ   ¢  s    
zProcess.usernamec          
   C   sX   yt  | j¡\}}}|S  tk
rR } zt|ƒr@|  ¡ td  S ‚ W d d }~X Y nX d S )NrG   )rs   Ú
proc_timesr¡   rÙ   rÚ   rû   rÿ   )rÉ   rZ   r[   ÚcreatedrÜ   r/   r/   r0   rG   ©  s    zProcess.create_timec             C   s   |   ¡ td  S )NrH   )rû   rÿ   )rÉ   r/   r/   r0   rH   µ  s    zProcess.num_threadsc             C   s@   t  | j¡}g }x*|D ]"\}}}t |||¡}| |¡ qW |S )N)rs   Zproc_threadsr¡   r   Zpthreadr“   )rÉ   r   rÃ   Z	thread_idÚutimeZstimeÚntupler/   r/   r0   Úthreads¹  s    zProcess.threadsc          
   C   st   yt  | j¡\}}}W nL tk
rb } z.t|ƒs2‚ |  ¡ }|td  }|td  }W d d }~X Y nX t ||dd¡S )NrE   rF   g        )	rs   r  r¡   rÙ   rÚ   rû   rÿ   r   Z	pcputimes)rÉ   rZ   r[   r  rÜ   r	  r/   r/   r0   r   Â  s    zProcess.cpu_timesc             C   s   t  | jd¡ d S )NT)rs   Úproc_suspend_or_resumer¡   )rÉ   r/   r/   r0   ÚsuspendÏ  s    zProcess.suspendc             C   s   t  | jd¡ d S )NF)rs   r  r¡   )rÉ   r/   r/   r0   ÚresumeÓ  s    zProcess.resumec             C   s4   | j dkrt| j | jƒ‚t | j ¡}ttj |¡ƒS )N)r   r    )	r¡   r   rÈ   rs   Zproc_cwdr{   ru   rj   Únormpath)rÉ   rj   r/   r/   r0   Úcwd×  s    
zProcess.cwdc             C   sh   | j dkrg S tƒ }t | j ¡}x>|D ]6}t|ƒ}t|ƒr&tsFt|ƒ}t 	|d¡}| 
|¡ q&W t|ƒS )N)r   r    r)   )r¡   r¤   rs   Zproc_open_filesrw   r   r   r{   r   Z	popenfiler¦   r§   )rÉ   r”   Zraw_file_namesZ_filer  r/   r/   r0   Ú
open_filesá  s    

zProcess.open_filesÚinetc             C   s   t || jdS )N)r©   )r£   r¡   )rÉ   r¨   r/   r/   r0   Úconnectionsô  s    zProcess.connectionsc             C   s    t  | j¡}td k	rt|ƒ}|S )N)rs   Zproc_priority_getr¡   Úenumr+   )rÉ   Úvaluer/   r/   r0   Únice_getø  s    zProcess.nice_getc             C   s   t  | j|¡S )N)rs   Zproc_priority_setr¡   )rÉ   r(  r/   r/   r0   Únice_setÿ  s    zProcess.nice_setc             C   s    t  | j¡}td k	rt|ƒ}|S )N)rs   Zproc_io_priority_getr¡   r'  r2   )rÉ   r”   r/   r/   r0   Ú
ionice_get  s    zProcess.ionice_getc             C   s:   |rt dƒ‚|ttttfkr(td| ƒ‚t | j|¡ d S )Nz&value argument not accepted on Windowsz%s is not a valid priority)	Ú	TypeErrorr#   r$   r%   r&   r¢   rs   Zproc_io_priority_setr¡   )rÉ   Zioclassr(  r/   r/   r0   Ú
ionice_set
  s    zProcess.ionice_setc             C   sŽ   yt  | j¡}W nt tk
r„ } zVt|ƒs,‚ |  ¡ }|td  |td  |td  |td  |td  |td  f}W d d }~X Y nX t|Ž S )NrI   rJ   rK   rL   rM   rN   )rs   Zproc_io_countersr¡   rÙ   rÚ   rû   rÿ   rm   )rÉ   r”   rÜ   r	  r/   r/   r0   Úio_counters  s    




 zProcess.io_countersc             C   s    t  | j¡}|rtjS tjS d S )N)rs   Zproc_is_suspendedr¡   r   ZSTATUS_STOPPEDZSTATUS_RUNNING)rÉ   Z	suspendedr/   r/   r0   r­   %  s    zProcess.statusc             C   s   dd„ }t  | j¡}||ƒS )Nc                s   ‡ fdd„t dƒD ƒS )Nc                s   g | ]}d |> ˆ @ r|‘qS )r   r/   )rˆ   Úi)r‰   r/   r0   rŠ   0  s    zBProcess.cpu_affinity_get.<locals>.from_bitmask.<locals>.<listcomp>é@   )r   )r‰   r/   )r‰   r0   Úfrom_bitmask/  s    z.Process.cpu_affinity_get.<locals>.from_bitmask)rs   Zproc_cpu_affinity_getr¡   )rÉ   r1  Úbitmaskr/   r/   r0   Úcpu_affinity_get-  s    zProcess.cpu_affinity_getc             C   sr   dd„ }t tttƒ ƒƒƒ}x<|D ]4}||kr t|ttfƒsHtd| ƒ‚q td| ƒ‚q W ||ƒ}t	 
| j|¡ d S )Nc             S   s2   | st d|  ƒ‚d}x| D ]}|d| O }qW |S )Nzinvalid argument %rr   r1   )r¢   )ZlsÚoutÚbr/   r/   r0   Ú
to_bitmask6  s    
z,Process.cpu_affinity_set.<locals>.to_bitmaskz&invalid CPU %r; an integer is requiredzinvalid CPU %r)r§   r   rt   r’   rx   r  r   r,  r¢   rs   Zproc_cpu_affinity_setr¡   )rÉ   r(  r6  ZallcpusZcpur2  r/   r/   r0   Úcpu_affinity_set4  s    
zProcess.cpu_affinity_setc          
   C   sN   yt  | j¡S  tk
rH } zt|ƒr6|  ¡ td  S ‚ W d d }~X Y nX d S )NrC   )rs   Zproc_num_handlesr¡   rÙ   rÚ   rû   rÿ   )rÉ   rÜ   r/   r/   r0   rC   M  s    zProcess.num_handlesc             C   s   |   ¡ td  }t |d¡S )NrD   r   )rû   rÿ   r   Zpctxsw)rÉ   rD   r/   r/   r0   Únum_ctx_switchesV  s    zProcess.num_ctx_switches)N)r%  ),r,   r-   r.   rá   Ú	__slots__rÊ   rý   rþ   r   rû   rµ   rî   rü   r÷   r  r  r  r
  r  r  r  r  r  r  rÔ   rG   rH   r  r   r   r!  r#  r$  r&  r)  r*  r+  r-  r.  r­   r3  r7  rC   r8  r/   r/   r/   r0   rø   Ð  sX   	
*				rø   )r)   )NN)‹rá   râ   rä   rì   ru   r  Úsysrò   Úcollectionsr   r°   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Z_compatr   r   r   r   r   r   r   r   r   r   r   r   rs   ÚImportErrorrÜ   ry   Úlowerr  ZgetwindowsversionrØ   ÚRuntimeErrorÚversion_infor'  Z__extra__all__r'   rñ   Úbuiltin_module_namesr  r(   ÚIntEnumr*   ZMIB_TCP_STATE_ESTABZCONN_ESTABLISHEDZMIB_TCP_STATE_SYN_SENTZCONN_SYN_SENTZMIB_TCP_STATE_SYN_RCVDZCONN_SYN_RECVZMIB_TCP_STATE_FIN_WAIT1ZCONN_FIN_WAIT1ZMIB_TCP_STATE_FIN_WAIT2ZCONN_FIN_WAIT2ZMIB_TCP_STATE_TIME_WAITZCONN_TIME_WAITZMIB_TCP_STATE_CLOSEDZ
CONN_CLOSEZMIB_TCP_STATE_CLOSE_WAITZCONN_CLOSE_WAITZMIB_TCP_STATE_LAST_ACKZCONN_LAST_ACKZMIB_TCP_STATE_LISTENZCONN_LISTENZMIB_TCP_STATE_CLOSINGZCONN_CLOSINGZMIB_TCP_STATE_DELETE_TCBZPSUTIL_CONN_NONEZ	CONN_NONEr¥   r+   ÚglobalsrÞ   Ú__members__r#   r$   r%   r&   r2   r¹   rÿ   rY   r_   rd   Ú_fieldsrg   ri   rq   rk   rm   rw   r{   r|   r€   r‚   Zdisk_io_countersr‡   r‹   r   r’   r–   r—   r˜   r™   r   rž   r£   r±   r¸   rº   r¼   rÁ   r¿   rÂ   r!   r"   r  rÄ   Zpidsr  r  rÚ   rç   rî   r÷   rø   r/   r/   r/   r0   Ú<module>   s8  








		
 *

