o
    ”Ðµ_•>  ã                   @   s
  d dl m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Zd dlmZ d dlmZ dd„ Zd ZejZejZejZejZe e¡ ZZej ZZeZeZ G dd„ dej!ƒZ"G dd„ dej!ƒZ#e e#¡Z$ejZ%ej& 'd¡Z(e(j)Z)ege)_*ee)_+e(j,Z-ee e"¡eege-_*ee-_+e(j.Z.eee$ge._*ee._+e(j/Z0e e"¡eeege0_*ee0_+ee0_1e(j2Z3ee$eeeeege3_*ee3_+e(j4Z5ee$eeege5_*ee5_+e(j6Z6ee$eeee ge6_*ee6_+ej& 'd¡Z7e7j8Z8ege8_*e	e8_+e7j9Z:eeeeeege:_*e	e:_+ej& 'd¡Z;e;j<Z<eee
ge<_*e	e<_+e;j=Z=eee
e
ge=_*e	e=_+e;j>Z>eege>_*ee>_+dZ?dZ@d ZAdZBdZCdZDdZEdZFdZGdZHdZIdZJdZKd)d d!„ZLd"d#„ ZMd*d%d&„ZNeOd'krePeNƒ ƒD ]\ZQZRZSeTd( UeQeReS¡ƒ qqdS dS )+é    )Úabsolute_importN)ÚBOOL)ÚHWND)ÚDWORD)ÚWORD)ÚLONG)ÚULONG)ÚHKEY)ÚBYTE)Ú	ULONG_PTR)Úlist_ports_commonc                 C   s   | dkrt  ¡ ‚| S )Nr   )ÚctypesÚWinError)ÚvalueÚfuncÚ	arguments© r   úA/usr/lib/python3/dist-packages/serial/tools/list_ports_windows.pyÚValidHandle   s   r   c                   @   s4   e Zd Zdefdefdefded fgZdd„ ZdS )	ÚGUIDÚData1ÚData2ÚData3ÚData4é   c                 C   sL   d  | j| j| jd dd„ | jd d… D ƒ¡d dd„ | jdd … D ƒ¡¡S )Nz{{{:08x}-{:04x}-{:04x}-{}-{}}}Ú c                 S   ó   g | ]}d   |¡‘qS ©z{:02x}©Úformat©Ú.0Údr   r   r   Ú
<listcomp>=   ó    z GUID.__str__.<locals>.<listcomp>é   c                 S   r   r   r   r    r   r   r   r#   >   r$   )r   r   r   r   Újoinr   ©Úselfr   r   r   Ú__str__8   s   ûzGUID.__str__N)Ú__name__Ú
__module__Ú__qualname__r   r   r
   Ú_fields_r)   r   r   r   r   r   0   s    
ür   c                   @   s0   e Zd ZdefdefdefdefgZdd„ ZdS )ÚSP_DEVINFO_DATAÚcbSizeÚ	ClassGuidÚDevInstÚReservedc                 C   s   d  | j| j¡S )NzClassGuid:{} DevInst:{})r   r0   r1   r'   r   r   r   r)   J   s   zSP_DEVINFO_DATA.__str__N)r*   r+   r,   r   r   r   r-   r)   r   r   r   r   r.   B   s    ür.   ÚsetupapiÚAdvapi32ÚCfgmgr32r%   é   éz   i  é   é   é#   é   i  é   c                 C   s„  |t kr
|sdS |S tƒ }tt |¡| dƒ}|r0tt|ƒtdƒƒ}|tkr+|s)dS |S t |¡‚t d¡}t	||t 
|¡d dƒ}|rOt tt|ƒtdƒƒ¡‚|j}	t d|	tj¡}
|
sb|s`dS |S d}d}d}|
 d¡rut|
 d¡dƒ}|
 d¡r‚t|
 d¡dƒ}|
 d	¡rŒ|
 d	¡}|}|r˜t d
|¡s˜d}|rœ|s¦t||||d |ƒS ||ks®||kr´|s²dS |S |sÀt||||d |ƒS |S )aG   Get the serial number of the parent of a device.

    Args:
        child_devinst: The device instance handle to get the parent serial number of.
        child_vid: The vendor ID of the child device.
        child_pid: The product ID of the child device.
        depth: The current iteration depth of the USB device tree.
    r   r   éú   r8   ú=VID_([0-9a-f]{4})(&PID_([0-9a-f]{4}))?(&MI_(\d{2}))?(\\(.*))?Nr6   é   é   ú^\w+$)Ú#MAX_USB_DEVICE_TREE_TRAVERSAL_DEPTHr   ÚCM_Get_Parentr   ÚbyrefÚCM_MapCrToWin32ErrÚERROR_NOT_FOUNDr   Úcreate_unicode_bufferÚCM_Get_Device_IDWÚsizeofr   ÚreÚsearchÚIÚgroupÚintÚmatchÚget_parent_serial_number)Úchild_devinstÚ	child_vidÚ	child_pidÚdepthÚlast_serial_numberÚdevinstÚretÚ	win_errorÚparentHardwareIDÚparentHardwareID_strÚmÚvidÚpidÚserial_numberÚfound_serial_numberr   r   r   rP   ˜   sX   

üþ



rP   c               
   c   st   t d ƒ } tƒ }td| t | ¡t |¡ƒst ¡ ‚t d ƒ }tƒ }td|t |¡t |¡ƒs3t ¡ ‚| d|j… |d|j…  }tt	|ƒƒD ]ï}d}t
t || ¡dttƒ}tƒ }t |¡|_d}t||t |¡ƒr3|d7 }t|t |¡tdttƒ}	t d¡}
tt |
¡ƒ}t|	dddt |
¡t |¡ƒ t|	ƒ |
j d	¡r£qct d¡}t|t |¡|t |¡d dƒs×t|t |¡tdt |¡t |¡d dƒs×t ¡ tkr×t ¡ ‚|j}tj|
jd
d}| d¡r±t  !d|t j"¡}|r9t#| $d¡dƒ|_%| $d¡rt#| $d¡dƒ|_&| $d¡rt#| $d¡ƒ}| $d¡r/t  'd| $d¡¡r/| $d¡|_(n
t)|j*|j%|j&ƒ|_(t d¡}t|t |¡t+dt |¡t |¡d dƒr«t  ,d|j¡}g }|D ]4}| $d¡rx| -d .t#| $d¡ƒd ¡¡ q_t	|ƒdkr…| -d¡ n| -d¡ | -| $d¡¡ q_|dur¢| -d .d|¡¡ |r«d /|¡|_0| 1¡ |_2n8| d¡ræt  !d|t j"¡}|ràt#| $d¡dƒ|_%t#| $d¡dƒ|_&| $d¡rà| $d¡|_(| 1¡ |_2n||_2t d¡}t|t |¡t3dt |¡t |¡d dƒr|j|_4t d¡}t|t |¡t5dt |¡t |¡d dƒr'|j|_6|V  t||t |¡ƒsmt7|ƒ qGdS )z<Return a generator that yields descriptions for serial portsr   ÚPortsÚModemNr   r8   r=   ÚPortNameÚLPTT)Úskip_link_detectionÚUSBr>   r6   r?   r<   r@   rA   zUSBROOT\((\w+)\)|#USB\((\w+)\)z{:d}Ú.ú-r%   z:{}.{}Úxr   ÚFTDIBUSz.VID_([0-9a-f]{4})\+PID_([0-9a-f]{4})(\+(\w+))?é   )8r   r   ÚSetupDiClassGuidsFromNamer   rI   rD   r   r   ÚrangeÚlenÚSetupDiGetClassDevsÚNULLÚDIGCF_PRESENTr.   r/   ÚSetupDiEnumDeviceInfoÚSetupDiOpenDevRegKeyÚDICS_FLAG_GLOBALÚ	DIREG_DEVÚKEY_READrG   r   ÚRegQueryValueExÚRegCloseKeyÚ
startswithÚSetupDiGetDeviceInstanceIdÚ SetupDiGetDeviceRegistryPropertyÚSPDRP_HARDWAREIDÚGetLastErrorÚERROR_INSUFFICIENT_BUFFERr   ÚListPortInforJ   rK   rL   rN   rM   r\   r]   rO   r^   rP   r1   ÚSPDRP_LOCATION_PATHSÚfinditerÚappendr   r&   ÚlocationÚusb_infoÚhwidÚSPDRP_FRIENDLYNAMEÚdescriptionÚ	SPDRP_MFGÚmanufacturerÚSetupDiDestroyDeviceInfoList)Ú
PortsGUIDsÚports_guids_sizeÚModemsGUIDsÚmodems_guids_sizeÚGUIDsÚindexÚbInterfaceNumberÚg_hdiÚdevinfoÚhkeyÚport_name_bufferÚport_name_lengthÚszHardwareIDÚszHardwareID_strÚinfor[   Úloc_path_strr‚   ÚgÚszFriendlyNameÚszManufacturerr   r   r   Úiterate_comportsî   s.  €
ü
üüú
ú
úù	 
ù"

þ
ø	
ø	 ð 
 är   Fc                 C   s
   t tƒ ƒS )z0Return a list of info objects about serial ports)Úlistr   )Úinclude_linksr   r   r   Úcomports£  s   
r    Ú__main__z{}: {} [{}])r   N)F)VÚ
__future__r   rJ   r   Úctypes.wintypesr   r   r   r   r   r   r	   r
   ÚserialÚserial.win32r   Úserial.toolsr   r   ro   Úc_void_pÚHDEVINFOÚ	c_wchar_pÚLPCTSTRÚPCTSTRÚPTSTRÚPOINTERÚLPDWORDÚPDWORDÚLPBYTEÚPBYTEÚACCESS_MASKÚREGSAMÚ	Structurer   r.   ÚPSP_DEVINFO_DATAÚ PSP_DEVICE_INTERFACE_DETAIL_DATAÚwindllÚLoadLibraryr3   r‰   ÚargtypesÚrestypeÚSetupDiClassGuidsFromNameWrk   rq   ÚSetupDiGetClassDevsWrn   ÚerrcheckÚ!SetupDiGetDeviceRegistryPropertyWrz   ÚSetupDiGetDeviceInstanceIdWry   rr   Úadvapi32rw   ÚRegQueryValueExWrv   Úcfgmgr32rC   rH   rE   rp   ÚDIGCF_DEVICEINTERFACEÚINVALID_HANDLE_VALUEr}   rF   r{   r…   r   r‡   rs   rt   ru   rB   rP   r   r    r*   ÚsortedÚportÚdescr„   Úprintr   r   r   r   r   Ú<module>   s´   




V 
6
þ