diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index 49d766c67f..598522799c 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -901,8 +901,11 @@ class Device(DeviceConfig, DevicePlugin): for d in drives: try: winutil.eject_drive(bytes(d)[0]) - except: - pass + except Exception as e: + try: + prints(as_unicode(e)) + except: + pass t = Thread(target=do_it, args=[drives]) t.daemon = True diff --git a/src/calibre/utils/windows/winutil.c b/src/calibre/utils/windows/winutil.c index 53ebfcca89..bedf6e966e 100644 --- a/src/calibre/utils/windows/winutil.c +++ b/src/calibre/utils/windows/winutil.c @@ -467,11 +467,11 @@ eject_drive_letter(WCHAR DriveLetter) { DeviceNumber = -1; - hVolume = CreateFile(szVolumeAccessPath, 0, + hVolume = CreateFileW(szVolumeAccessPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hVolume == INVALID_HANDLE_VALUE) { - PyErr_SetString(PyExc_ValueError, "Invalid handle value for drive letter"); + PyErr_SetFromWindowsErr(0); return FALSE; } @@ -529,11 +529,17 @@ eject_drive_letter(WCHAR DriveLetter) { static PyObject * winutil_eject_drive(PyObject *self, PyObject *args) { - char DriveLetter; + char letter = '0'; + WCHAR DriveLetter = L'0'; - if (!PyArg_ParseTuple(args, "c", &DriveLetter)) return NULL; + if (!PyArg_ParseTuple(args, "c", &letter)) return NULL; - if (!eject_drive_letter((WCHAR)DriveLetter)) return NULL; + if (mbtowc(&DriveLetter, &letter, 1) == -1) { + PyErr_SetString(PyExc_ValueError, "Failed to convert drive letter to wchar"); + return NULL; + } + + if (!eject_drive_letter(DriveLetter)) return NULL; Py_RETURN_NONE; }