Index: tools/telemetry/third_party/pyserial/serial/tools/list_ports_windows.py |
diff --git a/tools/telemetry/third_party/pyserial/serial/tools/list_ports_windows.py b/tools/telemetry/third_party/pyserial/serial/tools/list_ports_windows.py |
deleted file mode 100644 |
index ca597ca43e4670469926f8f766e1fa5d7de44bdb..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/pyserial/serial/tools/list_ports_windows.py |
+++ /dev/null |
@@ -1,240 +0,0 @@ |
-import ctypes |
-import re |
- |
-def ValidHandle(value, func, arguments): |
- if value == 0: |
- raise ctypes.WinError() |
- return value |
- |
-import serial |
-from serial.win32 import ULONG_PTR, is_64bit |
-from ctypes.wintypes import HANDLE |
-from ctypes.wintypes import BOOL |
-from ctypes.wintypes import HWND |
-from ctypes.wintypes import DWORD |
-from ctypes.wintypes import WORD |
-from ctypes.wintypes import LONG |
-from ctypes.wintypes import ULONG |
-from ctypes.wintypes import LPCSTR |
-from ctypes.wintypes import HKEY |
-from ctypes.wintypes import BYTE |
- |
-NULL = 0 |
-HDEVINFO = ctypes.c_void_p |
-PCTSTR = ctypes.c_char_p |
-PTSTR = ctypes.c_void_p |
-CHAR = ctypes.c_char |
-LPDWORD = PDWORD = ctypes.POINTER(DWORD) |
-#~ LPBYTE = PBYTE = ctypes.POINTER(BYTE) |
-LPBYTE = PBYTE = ctypes.c_void_p # XXX avoids error about types |
- |
-ACCESS_MASK = DWORD |
-REGSAM = ACCESS_MASK |
- |
- |
-def byte_buffer(length): |
- """Get a buffer for a string""" |
- return (BYTE*length)() |
- |
-def string(buffer): |
- s = [] |
- for c in buffer: |
- if c == 0: break |
- s.append(chr(c & 0xff)) # "& 0xff": hack to convert signed to unsigned |
- return ''.join(s) |
- |
- |
-class GUID(ctypes.Structure): |
- _fields_ = [ |
- ('Data1', DWORD), |
- ('Data2', WORD), |
- ('Data3', WORD), |
- ('Data4', BYTE*8), |
- ] |
- def __str__(self): |
- return "{%08x-%04x-%04x-%s-%s}" % ( |
- self.Data1, |
- self.Data2, |
- self.Data3, |
- ''.join(["%02x" % d for d in self.Data4[:2]]), |
- ''.join(["%02x" % d for d in self.Data4[2:]]), |
- ) |
- |
-class SP_DEVINFO_DATA(ctypes.Structure): |
- _fields_ = [ |
- ('cbSize', DWORD), |
- ('ClassGuid', GUID), |
- ('DevInst', DWORD), |
- ('Reserved', ULONG_PTR), |
- ] |
- def __str__(self): |
- return "ClassGuid:%s DevInst:%s" % (self.ClassGuid, self.DevInst) |
-PSP_DEVINFO_DATA = ctypes.POINTER(SP_DEVINFO_DATA) |
- |
-PSP_DEVICE_INTERFACE_DETAIL_DATA = ctypes.c_void_p |
- |
-setupapi = ctypes.windll.LoadLibrary("setupapi") |
-SetupDiDestroyDeviceInfoList = setupapi.SetupDiDestroyDeviceInfoList |
-SetupDiDestroyDeviceInfoList.argtypes = [HDEVINFO] |
-SetupDiDestroyDeviceInfoList.restype = BOOL |
- |
-SetupDiClassGuidsFromName = setupapi.SetupDiClassGuidsFromNameA |
-SetupDiClassGuidsFromName.argtypes = [PCTSTR, ctypes.POINTER(GUID), DWORD, PDWORD] |
-SetupDiClassGuidsFromName.restype = BOOL |
- |
-SetupDiEnumDeviceInfo = setupapi.SetupDiEnumDeviceInfo |
-SetupDiEnumDeviceInfo.argtypes = [HDEVINFO, DWORD, PSP_DEVINFO_DATA] |
-SetupDiEnumDeviceInfo.restype = BOOL |
- |
-SetupDiGetClassDevs = setupapi.SetupDiGetClassDevsA |
-SetupDiGetClassDevs.argtypes = [ctypes.POINTER(GUID), PCTSTR, HWND, DWORD] |
-SetupDiGetClassDevs.restype = HDEVINFO |
-SetupDiGetClassDevs.errcheck = ValidHandle |
- |
-SetupDiGetDeviceRegistryProperty = setupapi.SetupDiGetDeviceRegistryPropertyA |
-SetupDiGetDeviceRegistryProperty.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD] |
-SetupDiGetDeviceRegistryProperty.restype = BOOL |
- |
-SetupDiGetDeviceInstanceId = setupapi.SetupDiGetDeviceInstanceIdA |
-SetupDiGetDeviceInstanceId.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, PTSTR, DWORD, PDWORD] |
-SetupDiGetDeviceInstanceId.restype = BOOL |
- |
-SetupDiOpenDevRegKey = setupapi.SetupDiOpenDevRegKey |
-SetupDiOpenDevRegKey.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM] |
-SetupDiOpenDevRegKey.restype = HKEY |
- |
-advapi32 = ctypes.windll.LoadLibrary("Advapi32") |
-RegCloseKey = advapi32.RegCloseKey |
-RegCloseKey.argtypes = [HKEY] |
-RegCloseKey.restype = LONG |
- |
-RegQueryValueEx = advapi32.RegQueryValueExA |
-RegQueryValueEx.argtypes = [HKEY, LPCSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD] |
-RegQueryValueEx.restype = LONG |
- |
- |
-DIGCF_PRESENT = 2 |
-DIGCF_DEVICEINTERFACE = 16 |
-INVALID_HANDLE_VALUE = 0 |
-ERROR_INSUFFICIENT_BUFFER = 122 |
-SPDRP_HARDWAREID = 1 |
-SPDRP_FRIENDLYNAME = 12 |
-DICS_FLAG_GLOBAL = 1 |
-DIREG_DEV = 0x00000001 |
-KEY_READ = 0x20019 |
- |
-# workaround for compatibility between Python 2.x and 3.x |
-Ports = serial.to_bytes([80, 111, 114, 116, 115]) # "Ports" |
-PortName = serial.to_bytes([80, 111, 114, 116, 78, 97, 109, 101]) # "PortName" |
- |
-def comports(): |
- GUIDs = (GUID*8)() # so far only seen one used, so hope 8 are enough... |
- guids_size = DWORD() |
- if not SetupDiClassGuidsFromName( |
- Ports, |
- GUIDs, |
- ctypes.sizeof(GUIDs), |
- ctypes.byref(guids_size)): |
- raise ctypes.WinError() |
- |
- # repeat for all possible GUIDs |
- for index in range(guids_size.value): |
- g_hdi = SetupDiGetClassDevs( |
- ctypes.byref(GUIDs[index]), |
- None, |
- NULL, |
- DIGCF_PRESENT) # was DIGCF_PRESENT|DIGCF_DEVICEINTERFACE which misses CDC ports |
- |
- devinfo = SP_DEVINFO_DATA() |
- devinfo.cbSize = ctypes.sizeof(devinfo) |
- index = 0 |
- while SetupDiEnumDeviceInfo(g_hdi, index, ctypes.byref(devinfo)): |
- index += 1 |
- |
- # get the real com port name |
- hkey = SetupDiOpenDevRegKey( |
- g_hdi, |
- ctypes.byref(devinfo), |
- DICS_FLAG_GLOBAL, |
- 0, |
- DIREG_DEV, # DIREG_DRV for SW info |
- KEY_READ) |
- port_name_buffer = byte_buffer(250) |
- port_name_length = ULONG(ctypes.sizeof(port_name_buffer)) |
- RegQueryValueEx( |
- hkey, |
- PortName, |
- None, |
- None, |
- ctypes.byref(port_name_buffer), |
- ctypes.byref(port_name_length)) |
- RegCloseKey(hkey) |
- |
- # unfortunately does this method also include parallel ports. |
- # we could check for names starting with COM or just exclude LPT |
- # and hope that other "unknown" names are serial ports... |
- if string(port_name_buffer).startswith('LPT'): |
- continue |
- |
- # hardware ID |
- szHardwareID = byte_buffer(250) |
- # try to get ID that includes serial number |
- if not SetupDiGetDeviceInstanceId( |
- g_hdi, |
- ctypes.byref(devinfo), |
- ctypes.byref(szHardwareID), |
- ctypes.sizeof(szHardwareID) - 1, |
- None): |
- # fall back to more generic hardware ID if that would fail |
- if not SetupDiGetDeviceRegistryProperty( |
- g_hdi, |
- ctypes.byref(devinfo), |
- SPDRP_HARDWAREID, |
- None, |
- ctypes.byref(szHardwareID), |
- ctypes.sizeof(szHardwareID) - 1, |
- None): |
- # Ignore ERROR_INSUFFICIENT_BUFFER |
- if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER: |
- raise ctypes.WinError() |
- # stringify |
- szHardwareID_str = string(szHardwareID) |
- |
- # in case of USB, make a more readable string, similar to that form |
- # that we also generate on other platforms |
- if szHardwareID_str.startswith('USB'): |
- m = re.search(r'VID_([0-9a-f]{4})&PID_([0-9a-f]{4})(\\(\w+))?', szHardwareID_str, re.I) |
- if m: |
- if m.group(4): |
- szHardwareID_str = 'USB VID:PID=%s:%s SNR=%s' % (m.group(1), m.group(2), m.group(4)) |
- else: |
- szHardwareID_str = 'USB VID:PID=%s:%s' % (m.group(1), m.group(2)) |
- |
- # friendly name |
- szFriendlyName = byte_buffer(250) |
- if not SetupDiGetDeviceRegistryProperty( |
- g_hdi, |
- ctypes.byref(devinfo), |
- SPDRP_FRIENDLYNAME, |
- #~ SPDRP_DEVICEDESC, |
- None, |
- ctypes.byref(szFriendlyName), |
- ctypes.sizeof(szFriendlyName) - 1, |
- None): |
- # Ignore ERROR_INSUFFICIENT_BUFFER |
- #~ if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER: |
- #~ raise IOError("failed to get details for %s (%s)" % (devinfo, szHardwareID.value)) |
- # ignore errors and still include the port in the list, friendly name will be same as port name |
- yield string(port_name_buffer), 'n/a', szHardwareID_str |
- else: |
- yield string(port_name_buffer), string(szFriendlyName), szHardwareID_str |
- |
- SetupDiDestroyDeviceInfoList(g_hdi) |
- |
-# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
-# test |
-if __name__ == '__main__': |
- import serial |
- |
- for port, desc, hwid in sorted(comports()): |
- print "%s: %s [%s]" % (port, desc, hwid) |