
    е_>                     V   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 Zd Zej(                  Zej,                  Zej,                  Zej,                  Z ej4                  e      xZZej(                  xZZeZeZ  G d dejB                        Z" G d dejB                        Z# ej4                  e#      Z$ej(                  Z%ejL                  jO                  d      Z(e(jR                  Z)ege)_*        ee)_+        e(jX                  Z-e ej4                  e"      eege-_*        ee-_+        e(j\                  Z.eee$ge._*        ee._+        e(j^                  Z0 ej4                  e"      eeege0_*        ee0_+        ee0_1        e(jd                  Z3ee$eeeeege3_*        ee3_+        e(jh                  Z5ee$eeege5_*        ee5_+        e(jl                  Z6ee$eeee ge6_*        ee6_+        ejL                  jO                  d      Z7e7jp                  Z8ege8_*        e	e8_+        e7jr                  Z:eeeeeege:_*        e	e:_+        ejL                  jO                  d      Z;e;jx                  Z<eee
ge<_*        e	e<_+        e;jz                  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ZLd  ZMd%d!ZNeOd"k(  r0 eP eN             D ]  \  ZQZRZS eTd#j                  eQeReS             ! yy)&    )absolute_importN)BOOL)HWND)DWORD)WORD)LONG)ULONG)HKEY)BYTE)	ULONG_PTR)list_ports_commonc                 8    | dk(  rt        j                         | S )Nr   )ctypesWinError)valuefunc	argumentss      A/usr/lib/python3/dist-packages/serial/tools/list_ports_windows.pyValidHandler      s    zooL    c                   4    e Zd Zdefdefdefdedz  fgZd Zy)GUIDData1Data2Data3Data4   c                 `   dj                  | j                  | j                  | j                  dj	                  | j
                  d d D cg c]  }dj                  |       c}      dj	                  | j
                  dd  D cg c]  }dj                  |       c}            S c c}w c c}w )Nz{{{:08x}-{:04x}-{:04x}-{}-{}}}    z{:02x})formatr   r   r   joinr   )selfds     r   __str__zGUID.__str__8   s    /66JJJJJJGGBQ@AX__Q'@AGGAB@AX__Q'@A
 	
 A@s   	B&B+N)__name__
__module____qualname__r   r   r   _fields_r%    r   r   r   r   0   s0    	%	$	$	$(	H
r   r   c                   .    e Zd ZdefdefdefdefgZd Zy)SP_DEVINFO_DATAcbSize	ClassGuidDevInstReservedc                 N    dj                  | j                  | j                        S )NzClassGuid:{} DevInst:{})r!   r.   r/   )r#   s    r   r%   zSP_DEVINFO_DATA.__str__J   s    (//MMr   N)r&   r'   r(   r   r   r   r)   r%   r*   r   r   r,   r,   B   s/    	5	d	E	Y	HNr   r,   setupapiAdvapi32Cfgmgr32r       z   i        #      i     c                    |t         kD  r|sdS |S t               }t        t        j                  |      | d      }|rBt        t        |      t        d            }|t        k(  r|sdS |S t        j                  |      t        j                  d      }t        ||t        j                  |      dz
  d      }|r1t        j                  t        t        |      t        d                  |j                  }	t        j                  d|	t        j                        }
|
s|sdS |S d}d}d}|
j                  d      rt!        |
j                  d      d      }|
j                  d      rt!        |
j                  d      d      }|
j                  d	      r|
j                  d	      }|}|rt        j"                  d
|      sd}|r|st%        ||||dz   |      S ||k7  s||k7  r|sdS |S |st%        ||||dz   |      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      r7   =VID_([0-9a-f]{4})(&PID_([0-9a-f]{4}))?(&MI_(\d{2}))?(\\(.*))?Nr5         ^\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_numbers                  r   rP   rP      s    22+rC1CC gG
W-}a
@C
&uSz58<	 '/2G5GGooi(( 33C8
&'!+		C oo0sU1XFGG+11
		R&$$	A
 +rC1CC
C
CMwwqz!''!*b!wwqz!''!*b!wwqz
 ( RXXh>c'IuqyReff
i3)+ ,rC1CC 'IuqyReff r   c               #   z  K   t        dz         } t               }t        d| t        j                  |       t        j
                  |            st        j                         t        dz         }t               }t        d|t        j                  |      t        j
                  |            st        j                         | d|j                   |d|j                   z   }t        t        |            D ]  }d}t        t        j
                  ||         dt        t              }t               }t        j                  |      |_        d}t        ||t        j
                  |            r?|dz  }t!        |t        j
                  |      t"        dt$        t&              }	t        j(                  d      }
t+        t        j                  |
            }t-        |	dddt        j
                  |
      t        j
                  |             t/        |	       |
j                  j1                  d	      rt        j(                  d      }t3        |t        j
                  |      |t        j                  |      dz
  d      st5        |t        j
                  |      t6        dt        j
                  |      t        j                  |      dz
  d      s/t        j8                         t:        k7  rt        j                         |j                  }t=        j>                  |
j                  d
      }|j1                  d      rtA        jB                  d|t@        jD                        }|rtG        |jI                  d      d      |_%        |jI                  d      r tG        |jI                  d      d      |_&        |jI                  d      rtG        |jI                  d            }|jI                  d      r<tA        jN                  d|jI                  d            r|jI                  d      |_(        n0tS        |jT                  |jJ                  |jL                        |_(        t        j(                  d      }t5        |t        j
                  |      tV        dt        j
                  |      t        j                  |      dz
  d      rtA        jX                  d|j                        }g }|D ]  }|jI                  d      r<|j[                  dj]                  tG        |jI                  d            dz                Pt        |      dkD  r|j[                  d       n|j[                  d       |j[                  |jI                  d              |!|j[                  dj]                  d|             |rdj_                  |      |_0        |jc                         |_2        n|j1                  d      rtA        jB                  d|t@        jD                        }|rgtG        |jI                  d      d      |_%        tG        |jI                  d      d      |_&        |jI                  d      r|jI                  d      |_(        |jc                         |_2        n||_2        t        j(                  d      }t5        |t        j
                  |      tf        dt        j
                  |      t        j                  |      dz
  d      r|j                  |_4        t        j(                  d      }t5        |t        j
                  |      tj        dt        j
                  |      t        j                  |      dz
  d      r|j                  |_6        | t        ||t        j
                  |            r?to        |        yw)z<Return a generator that yields descriptions for serial portsr   PortsModemNr   r7   r=   PortNameLPTT)skip_link_detectionUSBr>   r5   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   r/   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szManufacturers                        r   iterate_comportsr      s    (Jw$MM*%LL)*	,
 oo!8,K$MM+&LL*+	-
 oo.(../+>V?P?V?V2WWE s5z" [,#LLu&	 "#w/#E5&,,w2GHQJE (W% D  &;;C@$V]]3C%DE-.-.0 
  %%007 "77<L-LL) MM,/!3 8W-(\2l3a7 **,0II$oo//+11$112B2H2H^bcD  **51II^`prtrvrvw"1771:r2DHwwqz#&qwwqz2#6wwqz+.qwwqz?( wwqzbhhx&D-.WWQZ*-EgooW[W_W_aeaiai-j*  &;;C@3W-,\2l3a7 $E|GYGYZA!H 8771:$OOFMM#aggaj/A:M,NO"8}q0 ( 4 ( 4$OOAGGAJ78 (3 ,). /  (*(9 MMO	!,,Y7IIOQacecgcgh"1771:r2DH"1771:r2DHwwqz-.WWQZ* MMO	,	 $99#>N/LL)&LL0MM.1A5 $2#7#7  $99#>N/LL)LL0MM.1A5 %3$8$8!J_ $E5&,,w2GH` 	%U+w[,s   ^(^;,^;c                 (    t        t                     S )z0Return a list of info objects about serial ports)listr   )include_linkss    r   comportsr     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   rp   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LoadLibraryr2   r   argtypesrestypeSetupDiClassGuidsFromNameWrl   rr   SetupDiGetClassDevsWro   errcheck!SetupDiGetDeviceRegistryPropertyWr{   SetupDiGetDeviceInstanceIdWrz   rs   advapi32rx   RegQueryValueExWrw   cfgmgr32rC   rH   rE   rq   DIGCF_DEVICEINTERFACEINVALID_HANDLE_VALUEr~   rF   r|   r   r   r   rt   ru   rv   rB   rP   r   r   r&   sortedportdescr   printr!   r*   r   r   <module>r      s   ' 
      !     !      " * 	??


			!6>>%( (&  	
6 
$	Nf&& 	N "6>>/2 #)??  ==$$Z0'DD )1
  %'+  $$?? &,nfnnT.BE6%R  "$(  ! 66 "*E3C!D   $  33  .t 4fdEJ  &  *  #+#M#M  -57GPVX]_dfl,m   )+/   (%AA '/1A5%QW&X  #%)  "44 !)+;UE5RX Y  #  ==$$Z0""v  ++ '7GVWM  ==$$Z0&& %/  .. #UE59     00 $en  "         	 	 '( #Slr,j$ z"8:. 6dDm""4t456 r   