From b38f7476b18b06f4152a863e761bc967143dfbf7 Mon Sep 17 00:00:00 2001 From: Ben Peddell Date: Fri, 3 Jan 2025 15:20:23 +1000 Subject: [PATCH] Handle alternate NT path forms `convert_dos_path` does not currently handle UNC paths or paths of the form `\??\X:` (as returned by Wine). This results in the `psutil/tests/test_process.py::TestProcess::test_exe` test failing in the following cases: * Python is run from a network share; or * The tests are performed under Wine on a drive other than the one Python is installed on. Add handling for the following NT path forms: * `\\server\share` * `\Device\Mup\server\share` -> `\\server\share` * `\??\UNC\server\share` -> `\\server\share` * `\??\X:` -> `X:` Signed-off-by: Ben Peddell --- psutil/_pswindows.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/psutil/_pswindows.py b/psutil/_pswindows.py index 69820ba41..ce6c535c7 100644 --- a/psutil/_pswindows.py +++ b/psutil/_pswindows.py @@ -184,12 +184,21 @@ class IOPriority(enum.IntEnum): @functools.lru_cache(maxsize=512) def convert_dos_path(s): r"""Convert paths using native DOS format like: - "\Device\HarddiskVolume1\Windows\systemew\file.txt" + "\Device\HarddiskVolume1\Windows\systemew\file.txt" or + "\??\C:\Windows\systemew\file.txt" into: "C:\Windows\systemew\file.txt". """ + if s[:2] == '\\\\': + return s rawdrive = '\\'.join(s.split('\\')[:3]) - driveletter = cext.QueryDosDevice(rawdrive) + if rawdrive in {"\\??\\UNC", "\\Device\\Mup"}: + rawdrive = '\\'.join(s.split('\\')[:4]) + driveletter = "\\\\" + s.split('\\')[3] + elif rawdrive[:4] == '\\??\\': + driveletter = rawdrive[4:] + else: + driveletter = cext.QueryDosDevice(rawdrive) remainder = s[len(rawdrive) :] return os.path.join(driveletter, remainder)