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; }