Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 20 additions & 22 deletions mbed_lstools/windows.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 []


Expand Down Expand Up @@ -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'])
Expand All @@ -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


Expand Down Expand Up @@ -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,
Expand Down
57 changes: 24 additions & 33 deletions test/os_win7.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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, [])
Expand Down Expand Up @@ -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',
Expand All @@ -211,21 +202,21 @@ 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)

_winreg.OpenKey.reset_mock()
_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, [])

Expand Down Expand Up @@ -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'),
Expand All @@ -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'),
Expand All @@ -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()
Expand All @@ -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)

Expand All @@ -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()
Expand Down