From ed151a5efcc3f4c8d8da567f8692c8eff6fb7bfc Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Mon, 15 Jun 2015 22:20:03 -0600 Subject: [PATCH] kernel32: Handle device paths in GetVolumePathName. NT-style paths that have a device prefix (\??\) also return the drive of the current working directory (even if they're valid devices). --- dlls/kernel32/tests/volume.c | 8 ++++++++ dlls/kernel32/volume.c | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c index 7ed55d7013d..4349ec4ed01 100644 --- a/dlls/kernel32/tests/volume.c +++ b/dlls/kernel32/tests/volume.c @@ -675,6 +675,14 @@ static void test_GetVolumePathNameA(void) "InvalidDrive:\\AnInvalidFolder", "%CurrentDrive%\\", sizeof(volume_path), NO_ERROR, NO_ERROR }, + { /* test 18: a reasonable device path */ + "\\??\\CdRom0", "%CurrentDrive%\\", sizeof(volume_path), + NO_ERROR, NO_ERROR + }, + { /* test 19: an unreasonable device path */ + "\\??\\ReallyBogus", "%CurrentDrive%\\", sizeof(volume_path), + NO_ERROR, NO_ERROR + }, }; BOOL ret, success; DWORD error; diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c index 5e3b148318e..7cb245aca9c 100644 --- a/dlls/kernel32/volume.c +++ b/dlls/kernel32/volume.c @@ -1817,6 +1817,7 @@ BOOL WINAPI GetVolumePathNameA(LPCSTR filename, LPSTR volumepathname, DWORD bufl */ BOOL WINAPI GetVolumePathNameW(LPCWSTR filename, LPWSTR volumepathname, DWORD buflen) { + static const WCHAR deviceprefixW[] = { '\\','?','?','\\',0 }; static const WCHAR ntprefixW[] = { '\\','\\','?','\\',0 }; WCHAR fallbackpathW[] = { 'C',':','\\',0 }; NTSTATUS status = STATUS_SUCCESS; @@ -1892,9 +1893,9 @@ BOOL WINAPI GetVolumePathNameW(LPCWSTR filename, LPWSTR volumepathname, DWORD bu WCHAR cwdW[MAX_PATH]; /* the path was completely invalid */ - if (filename[0] == '\\') + if (filename[0] == '\\' && strncmpW(deviceprefixW, filename, strlenW(deviceprefixW)) != 0) { - /* NT-style paths fail */ + /* NT-style paths (that are not device paths) fail */ status = STATUS_OBJECT_NAME_INVALID; goto cleanup; }