
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
M]WY*              	   @   s  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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je ZZej ZZeZeZ dd Z!dd Z"G dd dej#Z$G dd dej#Z%eje%Z&ejZ'ej(j)dZ*e*j+Z+ege+_,ee+_-e*j.Z/eeje$eege/_,ee/_-e*j0Z0eee&ge0_,ee0_-e*j1Z2eje$eeege2_,ee2_-ee2_3e*j4Z5ee&eeeeege5_,ee5_-e*j6Z7ee&eeege7_,ee7_-e*j8Z8ee&eeee ge8_,e
e8_-ej(j)dZ9e9j:Z:e
ge:_,ee:_-e9j;Z<e
e	eeeege<_,ee<_-dZ=dZ>d Z?dZ@dZAdZBdZCdZDdZEdZFejGd d!d"d#d$gZHejGd d!d"d#d%d&d'd(gZId)d* ZJd+d, ZKeLd-krx,eMeK D ]\ZNZOZPeQd.jReNeOeP qW dS )/    N)BOOL)HWND)DWORD)WORD)LONG)ULONG)LPCSTR)HKEY)BYTE)	ULONG_PTR)list_ports_commonc             C   s   | dkrt j | S )Nr   )ctypesWinError)valuefuncZ	arguments r   (/usr/lib/python3.6/list_ports_windows.pyValidHandle   s    r   c             C   s
   t |   S )zGet a buffer for a string)r
   )Zlengthr   r   r   byte_buffer.   s    r   c             C   s8   g }x(| D ] }|dkrP |j t|d@  q
W dj|S )Nr       )appendchrjoin)bufferscr   r   r   string3   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| jdjdd | jd d D djdd | jdd  D S )Nz{{{:08x}-{:04x}-{:04x}-{}-{}}}r   c             S   s   g | ]}d j |qS )z{:02x})format).0dr   r   r   
<listcomp>I   s    z GUID.__str__.<locals>.<listcomp>   c             S   s   g | ]}d j |qS )z{:02x})r$   )r%   r&   r   r   r   r'   J   s    )r$   r   r    r!   r   r"   )selfr   r   r   __str__D   s    zGUID.__str__N)__name__
__module____qualname__r   r   r
   _fields_r*   r   r   r   r   r   <   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DevInstZReservedc             C   s   dj | j| jS )NzClassGuid:{} DevInst:{})r$   r1   r2   )r)   r   r   r   r*   V   s    zSP_DEVINFO_DATA.__str__N)r+   r,   r-   r   r   r   r.   r*   r   r   r   r   r/   N   s
   
r/   setupapiZAdvapi32r(      z         #   i  P   o   r   t   s   N   a   m   e   c           	   c   s|  t d  } t }tt| tj| tj|s2tj xBt|j	D ]2}t
tj| | dtt}t }tj||_d}xt||tj|rj|d7 }t|tj|tdtt}td}ttj|}t|tddtj|tj| t| t|jdrqxtd}t|tj|tj|tj|d dsjt|tj|tdtj|tj|d dsjtj tkrjtj t|}	t j!t|}
|	jdrt"j#d|	t"j$}|rt%|j&dd	|
_'t%|j&d
d	|
_(|j&dr|j&d|
_)td}t|tj|t*dtj|tj|d drt"j+dt|}g }xn|D ]f}|j&dr\|j,dj-t%|j&dd  n4t.|dkrv|j,d n
|j,d |j,|j&d
 q,W |rdj/||
_0|
j1 |
_2np|	jdrt"j#d|	t"j$}|rt%|j&dd	|
_'t%|j&d
d	|
_(|j&dr|j&d|
_)|
j1 |
_2n|	|
_2td}t|tj|t3dtj|tj|d drbt||
_4|
V  qxW t5| q@W dS )z<Return a generator that yields descriptions for serial portsr#   Nr   r6      ZLPTZUSBz-VID_([0-9a-f]{4})&PID_([0-9a-f]{4})(\\(\w+))?r4   r(      zUSBROOT\((\w+)\)|#USB\((\w+)\)z{:d}.-r   ZFTDIBUSz.VID_([0-9a-f]{4})\+PID_([0-9a-f]{4})(\+(\w+))?)6r   r   SetupDiClassGuidsFromNamePortsr   ZsizeofZbyrefr   ranger   SetupDiGetClassDevsNULLDIGCF_PRESENTr/   r0   SetupDiEnumDeviceInfoSetupDiOpenDevRegKeyDICS_FLAG_GLOBAL	DIREG_DEVKEY_READr   r   RegQueryValueExPortNameRegCloseKeyr   
startswithSetupDiGetDeviceInstanceId SetupDiGetDeviceRegistryPropertySPDRP_HARDWAREIDZGetLastErrorERROR_INSUFFICIENT_BUFFERr   ZListPortInforesearchIintgroupZvidpidZserial_numberSPDRP_LOCATION_PATHSfinditerr   r$   lenr   locationZusb_infohwidSPDRP_FRIENDLYNAMEdescriptionSetupDiDestroyDeviceInfoList)ZGUIDsZ
guids_sizeindexZg_hdiZdevinfohkeyZport_name_bufferZport_name_lengthZszHardwareIDZszHardwareID_strinfomZloc_path_strrb   gZszFriendlyNamer   r   r   iterate_comports   s    

 


rl   c               C   s
   t t S )z0Return a list of info objects about serial ports)listrl   r   r   r   r   comports$  s    rn   __main__z{}: {} [{}])SrY   r   Zctypes.wintypesr   r   r   r   r   r   r   r	   r
   serialZserial.win32r   Zserial.toolsr   r   rJ   Zc_void_pZHDEVINFOZc_char_pZPCTSTRZPTSTRZc_charZCHARZPOINTERZLPDWORDZPDWORDZLPBYTEZPBYTEZACCESS_MASKZREGSAMr   r   Z	Structurer   r/   ZPSP_DEVINFO_DATAZ PSP_DEVICE_INTERFACE_DETAIL_DATAZwindllZLoadLibraryr3   rf   ZargtypesZrestypeZSetupDiClassGuidsFromNameArF   rL   ZSetupDiGetClassDevsArI   ZerrcheckZ!SetupDiGetDeviceRegistryPropertyArV   ZSetupDiGetDeviceInstanceIdArU   rM   Zadvapi32rS   ZRegQueryValueExArQ   rK   ZDIGCF_DEVICEINTERFACEZINVALID_HANDLE_VALUErX   rW   rd   r_   rN   rO   rP   to_bytesrG   rR   rl   rn   r+   sortedZportZdescrc   printr$   r   r   r   r   <module>   s   
	
 
