diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c index c63dd728ef3..482ff168779 100644 --- a/dlls/kernel32/tests/volume.c +++ b/dlls/kernel32/tests/volume.c @@ -435,7 +435,7 @@ static void test_GetVolumeInformationA(void) SetLastError(0xdeadbeef); ret = pGetVolumeInformationA(windowsdir, vol_name_buf, vol_name_size, &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); - todo_wine ok(!ret && (GetLastError()==ERROR_DIR_NOT_ROOT || + ok(!ret && (GetLastError()==ERROR_DIR_NOT_ROOT || broken(GetLastError()==ERROR_BAD_PATHNAME/* win9x */)), "GetVolumeInformationA did%s fail, root=%s, last error=%u\n", ret ? " not":"", windowsdir, GetLastError()); /* A subdir with trailing \ yields DIR_NOT_ROOT instead of INVALID_NAME */ diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c index b65d67b33f2..17e70e5ff9b 100644 --- a/dlls/kernel32/volume.c +++ b/dlls/kernel32/volume.c @@ -568,7 +568,13 @@ BOOL WINAPI GetVolumeInformationW( LPCWSTR root, LPWSTR label, DWORD label_len, p = memchrW( nt_name.Buffer + 4, '\\', (nt_name.Length - 4) / sizeof(WCHAR) ); if (p != nt_name.Buffer + nt_name.Length / sizeof(WCHAR) - 1) { - SetLastError( ERROR_INVALID_NAME ); + /* check if root contains an explicit subdir */ + if (root[0] && root[1] == ':') root += 2; + while (*root == '\\') root++; + if (strchrW( root, '\\' )) + SetLastError( ERROR_DIR_NOT_ROOT ); + else + SetLastError( ERROR_INVALID_NAME ); goto done; }