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).
This commit is contained in:
Erich E. Hoover 2015-06-15 22:20:03 -06:00 committed by Alexandre Julliard
parent 5a84969f39
commit ed151a5efc
2 changed files with 11 additions and 2 deletions

View File

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

View File

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