Add debugging prints

This commit is contained in:
Kovid Goyal 2016-01-18 01:22:07 +05:30
parent c6ae497c36
commit bd2118a737

View File

@ -13,7 +13,7 @@ from ctypes import (
wstring_at, addressof, create_unicode_buffer, string_at, c_uint64 as QWORD) wstring_at, addressof, create_unicode_buffer, string_at, c_uint64 as QWORD)
from ctypes.wintypes import DWORD, WORD, ULONG, LPCWSTR, HWND, BOOL, LPWSTR, UINT, BYTE, HANDLE from ctypes.wintypes import DWORD, WORD, ULONG, LPCWSTR, HWND, BOOL, LPWSTR, UINT, BYTE, HANDLE
from calibre import prints from calibre import prints, as_unicode
is64bit = sys.maxsize > (1 << 32) is64bit = sys.maxsize > (1 << 32)
@ -539,12 +539,22 @@ def get_drive_letters_for_device(vendor_id, product_id, bcd=None, debug=False):
return ans return ans
# Get the device ids for all descendants of the found device # Get the device ids for all descendants of the found device
sn_map = get_storage_number_map() sn_map = get_storage_number_map(debug=debug)
if debug:
prints('Storage number map:', sn_map)
for devinst in iterdescendants(devinfo.DevInst): for devinst in iterdescendants(devinfo.DevInst):
devid, wbuf = get_device_id(devinst, buf=wbuf) devid, wbuf = get_device_id(devinst, buf=wbuf)
drive_letter = find_drive(devinst.value, sn_map) try:
if drive_letter: drive_letter = find_drive(devinst.value, sn_map, debug=debug)
ans.append(drive_letter) except Exception as err:
if debug:
prints('Failed to get drive letter for: %s with error: %s' % (devid, as_unicode(err)))
else:
if drive_letter:
ans.append(drive_letter)
if debug:
prints('Drive letter for: %s is: %s' % (devid, drive_letter))
return ans return ans
_devid_pat = None _devid_pat = None
@ -563,20 +573,25 @@ def get_storage_number(devpath):
CloseHandle(handle) CloseHandle(handle)
return sdn.DeviceNumber return sdn.DeviceNumber
def get_storage_number_map(drive_types=(DRIVE_REMOVABLE, DRIVE_FIXED)): def get_storage_number_map(drive_types=(DRIVE_REMOVABLE, DRIVE_FIXED), debug=False):
mask = GetLogicalDrives() mask = GetLogicalDrives()
type_map = {letter:GetDriveType(letter + ':' + os.sep) for i, letter in enumerate(string.ascii_uppercase) if mask & (1 << i)} type_map = {letter:GetDriveType(letter + ':' + os.sep) for i, letter in enumerate(string.ascii_uppercase) if mask & (1 << i)}
drives = (letter for letter, dt in type_map.iteritems() if dt in drive_types) drives = (letter for letter, dt in type_map.iteritems() if dt in drive_types)
ans = {} ans = {}
for letter in drives: for letter in drives:
try: try:
ans[get_storage_number('\\\\.\\' + letter + ':')] = letter sn = get_storage_number('\\\\.\\' + letter + ':')
except WindowsError: if debug and sn in ans:
prints('Duplicate storage number for drives: %s and %s' % (letter, ans[sn]))
ans[sn] = letter
except WindowsError as err:
if debug:
prints('Failed to get storage number for drive: %s with error: %s' % (letter, as_unicode(err)))
continue continue
return ans return ans
def find_drive(devinst, storage_number_map): def find_drive(devinst, storage_number_map, debug=False):
buf = None buf = None
interface_data = SP_DEVICE_INTERFACE_DATA() interface_data = SP_DEVICE_INTERFACE_DATA()
interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA) interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA)
@ -588,10 +603,7 @@ def find_drive(devinst, storage_number_map):
break break
buf, devinfo, devpath = get_device_interface_detail_data(dev_list, byref(interface_data), buf=buf) buf, devinfo, devpath = get_device_interface_detail_data(dev_list, byref(interface_data), buf=buf)
if devinfo.DevInst == devinst: if devinfo.DevInst == devinst:
try: storage_number = get_storage_number(devpath)
storage_number = get_storage_number(devpath)
except WindowsError:
continue
drive_letter = storage_number_map.get(storage_number) drive_letter = storage_number_map.get(storage_number)
if drive_letter: if drive_letter:
return drive_letter return drive_letter