From 20adbd5c5917b94742d87eb4937f2b11888d027f Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Wed, 25 Apr 2018 10:39:04 -0500 Subject: [PATCH 1/2] Using disk service instead of volume for win7 compatibility --- mbed_lstools/windows.py | 42 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/mbed_lstools/windows.py b/mbed_lstools/windows.py index 8835f51..5f30197 100644 --- a/mbed_lstools/windows.py +++ b/mbed_lstools/windows.py @@ -104,15 +104,15 @@ def _get_cached_mounted_points(): return result -def _get_volumes(): - logger.debug('Fetching mounted devices from volume service registry entry') +def _get_disks(): + logger.debug('Fetching mounted devices from disk service registry entry') try: - volumes_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, - 'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum') - volume_strings = _get_values_with_numeric_keys(volumes_key) - return [v for v in volume_strings if _is_mbed_volume(v)] + disks_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, + 'SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum') + disk_strings = _get_values_with_numeric_keys(disks_key) + return [v for v in disk_strings if _is_mbed_volume(v)] except OSError: - logger.debug('No volumes service found, no device can be detected') + logger.debug('No disk service found, no device can be detected') return [] @@ -219,13 +219,14 @@ def __init__(self, **kwargs): def find_candidates(self): cached_mount_points = _get_cached_mounted_points() - volumes = _get_volumes() + disks = _get_disks() usb_storage_devices = _get_usb_storage_devices() target_id_usb_id_mount_point_map = {} for cached_mount_point_info in cached_mount_points: - for index, volume in enumerate(copy(volumes)): - if volume.endswith(cached_mount_point_info['volume_string']): + for index, disk in enumerate(copy(disks)): + match_string = disk.split('\\')[-1] + if match_string in cached_mount_point_info['volume_string']: # TargetID is a hex string with 10-48 chars target_id_usb_id_match = re.search('[&#]([0-9A-Za-z]{10,48})[&#]', cached_mount_point_info['volume_string']) @@ -236,7 +237,7 @@ def find_candidates(self): continue target_id_usb_id_mount_point_map[target_id_usb_id_match.group(1)] = cached_mount_point_info['mount_point'] - volumes.pop(index) + disks.pop(index) break @@ -296,22 +297,19 @@ def find_candidates(self): is_prefix = False try: - entry_key_string, _ = winreg.QueryValueEx(composite_device_key, 'ParentIdPrefix') - logger.debug('Assigning new entry key string of %s to device %s, ' - 'as found in ParentIdPrefix', - entry_key_string, target_id_usb_id) - is_prefix = True + new_entry_key_string, _ = winreg.QueryValueEx(composite_device_key, 'ParentIdPrefix') + + if any(e.startswith(new_entry_key_string) for e in entry_key_strings): + logger.debug('Assigning new entry key string of %s to device %s, ' + 'as found in ParentIdPrefix', + new_entry_key_string, target_id_usb_id) + entry_key_string = new_entry_key_string + is_prefix = True except OSError: logger.debug('Device %s did not have a "ParentIdPrefix" key, ' 'sticking with %s as entry key string', composite_device_key_string, target_id_usb_id) - if not any(e.startswith(entry_key_string) for e in entry_key_strings): - logger.debug('Expected ParentIdPrefix "%s" from device with ' - 'target_id_usb_id "%s" to match an entry in the VID/PID path "%s". ' - 'Skipping.', - entry_key_string, target_id_usb_id, vid_pid_path) - continue vid_pid_target_id_usb_id_map[vid_pid_path][entry_key_string] = { 'target_id_usb_id': target_id_usb_id, From c228d87efb53b9bfc609eb5551b783432fa44599 Mon Sep 17 00:00:00 2001 From: Brian Daniels Date: Wed, 25 Apr 2018 11:20:44 -0500 Subject: [PATCH 2/2] Updating windows tests --- test/os_win7.py | 57 +++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/test/os_win7.py b/test/os_win7.py index 272f53d..6040d43 100644 --- a/test/os_win7.py +++ b/test/os_win7.py @@ -29,7 +29,7 @@ from mbed_lstools.windows import (MbedLsToolsWin7, CompatibleIDsNotFoundException, _get_cached_mounted_points, _is_mbed_volume, _get_values_with_numeric_keys, - _get_volumes, _get_usb_storage_devices, _determine_valid_non_composite_devices, + _get_disks, _get_usb_storage_devices, _determine_valid_non_composite_devices, _determine_subdevice_capability) class Win7TestCase(unittest.TestCase): @@ -70,25 +70,16 @@ def test_empty_reg(self): value_dict = { (None, 'SYSTEM\\MountedDevices'): [ ('\\DosDevices\\F:', - u'_??_USBSTOR#Disk&Ven_SEGGER&Prod_MSD_Volume&Rev_1.00#8&1b8e102b&0&000440035522&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'.encode('utf-16le')), - ('\\DosDevices\\D:', - u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#0240000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'.encode('utf-16le')), + u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#9&215b8c47&0&0240000032044e4500257009997b00386781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'.encode('utf-16le')), ], (None, 'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum'): [], (None, 'SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum'): [] } - key_dict = { - (None, 'SYSTEM\\CurrentControlSet'): ['Services\\usbccgp\\Enum'], - (None, 'SYSTEM\\CurrentControlSet'): ['Enum\\USB'], - ((None, 'SYSTEM\\CurrentControlSet'), 'Enum\\USB'): - ['ROOT_HUB30', 'VID_0416&PID_511E', 'VID_0416&PID_511E&MI_00', - 'VID_0D28&PID_0204', 'VID_0D28&PID_0204&MI_00', 'VID_0D28&PID_0204&MI_04'] - } - self.setUpRegistry(value_dict, key_dict) + self.setUpRegistry(value_dict, {}) candidates = self.lstool.find_candidates() self.assertEqual(_winreg.OpenKey.mock_calls, [ call(_winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\\MountedDevices'), - call(_winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum'), + call(_winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum'), call(_winreg.HKEY_LOCAL_MACHINE, 'SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum') ]) self.assertEqual(candidates, []) @@ -199,7 +190,7 @@ def test_get_cached_mount_points(self): self.assertEqual(_get_cached_mounted_points(), []) - def test_get_volumes(self): + def test_get_disks(self): dummy_key = 'dummy_key' volume_strings = [ 'dummy_volume_1', @@ -211,10 +202,10 @@ def test_get_volumes(self): _num_keys.return_value = volume_strings _is_mbed_volume.return_value = True - result = _get_volumes() + result = _get_disks() _winreg.OpenKey.assert_called_once_with(_winreg.HKEY_LOCAL_MACHINE, - 'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum') + 'SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum') _num_keys.assert_called_once_with(dummy_key) self.assertEqual(result, volume_strings) @@ -222,10 +213,10 @@ def test_get_volumes(self): _winreg.OpenKey.side_effect = OSError _num_keys.reset_mock() - result = _get_volumes() + result = _get_disks() _winreg.OpenKey.assert_called_once_with(_winreg.HKEY_LOCAL_MACHINE, - 'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum') + 'SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum') _num_keys.assert_not_called() self.assertEqual(result, []) @@ -350,20 +341,20 @@ def test_one_composite_dev(self): (None, 'SYSTEM\\MountedDevices'): [ ('\\DosDevices\\C:', u'NOT A VALID MBED DRIVE'.encode('utf-16le')), ('\\DosDevices\\F:', - u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#0240000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'.encode('utf-16le')) + u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#9&215b8c47&0&0240000032044e4500257009997b00386781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'.encode('utf-16le')) ], - (None, 'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum'): [ - ('0', 'STORAGE\\Volume\\_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#0240000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}') + (None, 'SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum'): [ + ('0', 'USBSTOR\\Disk&Ven_MBED&Prod_VFS&Rev_0.1\\9&215b8c47&0&0240000032044e4500257009997b00386781000097969900&0') ], (None, 'SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum'): [ ('0', 'USB\\VID_0D28&PID_0204&MI_00\\8&26b12a60&0&0000') ], (None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204'): [], (((None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204'), - '0240000032044e4500367009997b00086781000097969900'), + '0240000032044e4500257009997b00386781000097969900'), 'ParentIdPrefix'): ('8&26b12a60&0', None), (((None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204'), - '0240000032044e4500367009997b00086781000097969900'), + '0240000032044e4500257009997b00386781000097969900'), 'CompatibleIDs'): ([u'USB\\DevClass_00&SubClass_00&Prot_00', u'USB\\DevClass_00&SubClass_00', u'USB\\DevClass_00', u'USB\\COMPOSITE'], 7), (((None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204&MI_00'), '8&26b12a60&0&0000'), 'CompatibleIDs'): ([u'USB\\Class_08&SubClass_06&Prot_50', u'USB\\Class_08&SubClass_06', u'USB\\Class_08'], 7), (((None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204&MI_01'), @@ -376,7 +367,7 @@ def test_one_composite_dev(self): } key_dict = { (None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204'): - ['0240000032044e4500367009997b00086781000097969900'], + ['0240000032044e4500257009997b00386781000097969900'], (None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204&MI_00'): [], (None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204&MI_01'): [], (((None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204&MI_01'), @@ -390,7 +381,7 @@ def test_one_composite_dev(self): expected_info = { 'mount_point': 'F:', 'serial_port': 'COM7', - 'target_id_usb_id': u'0240000032044e4500367009997b00086781000097969900' + 'target_id_usb_id': u'0240000032044e4500257009997b00386781000097969900' } devices = self.lstool.find_candidates() @@ -402,22 +393,22 @@ def test_one_non_composite_dev(self): (None, 'SYSTEM\\MountedDevices'): [ ('\\DosDevices\\C:', u'NOT A VALID MBED DRIVE'.encode('utf-16le')), ('\\DosDevices\\F:', - u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#0000000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'.encode('utf-16le')) + u'_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#0000000032044e4500257009997b00386781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}'.encode('utf-16le')) ], - (None, 'SYSTEM\\CurrentControlSet\\Services\\volume\\Enum'): [ - ('0', 'STORAGE\\Volume\\_??_USBSTOR#Disk&Ven_MBED&Prod_VFS&Rev_0.1#0000000032044e4500367009997b00086781000097969900&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}') + (None, 'SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum'): [ + ('0', 'USBSTOR\Disk&Ven_MBED&Prod_VFS&Rev_0.1\\0000000032044e4500257009997b00386781000097969900&0') ], (None, 'SYSTEM\\CurrentControlSet\\Services\\USBSTOR\\Enum'): [ - ('0', 'USB\\VID_0D28&PID_0204\\0000000032044e4500367009997b00086781000097969900') + ('0', 'USB\\VID_0D28&PID_0204\\0000000032044e4500257009997b00386781000097969900') ], (None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204'): [], - ((None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204\\0000000032044e4500367009997b00086781000097969900'), + ((None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204\\0000000032044e4500257009997b00386781000097969900'), 'CompatibleIDs'): ([u'USB\\Class_08&SubClass_06&Prot_50', u'USB\\Class_08&SubClass_06', u'USB\\Class_08'], 7) } key_dict = { (None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204'): - ['0000000032044e4500367009997b00086781000097969900'], - (None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204\\0000000032044e4500367009997b00086781000097969900'): [] + ['0000000032044e4500257009997b00386781000097969900'], + (None, 'SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_0D28&PID_0204\\0000000032044e4500257009997b00386781000097969900'): [] } self.setUpRegistry(value_dict, key_dict) @@ -426,7 +417,7 @@ def test_one_non_composite_dev(self): expected_info = { 'mount_point': 'F:', 'serial_port': None, - 'target_id_usb_id': u'0000000032044e4500367009997b00086781000097969900' + 'target_id_usb_id': u'0000000032044e4500257009997b00386781000097969900' } devices = self.lstool.find_candidates()