Dmitry Timoshkov : kernel32: Return upper cased drive letters in paths, some applications depend on it.
Alexandre Julliard
julliard at winehq.org
Wed Feb 27 08:03:28 CST 2008
Module: wine
Branch: master
Commit: aebcbf0f6e10d80b04bc4a3dcd3e8ca55dfd60d0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=aebcbf0f6e10d80b04bc4a3dcd3e8ca55dfd60d0
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Wed Feb 27 19:58:40 2008 +0800
kernel32: Return upper cased drive letters in paths, some applications depend on it.
---
dlls/kernel32/process.c | 2 +-
dlls/kernel32/tests/path.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/path.c | 2 +-
3 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index 8e7e675..b3bf535 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -690,7 +690,7 @@ static void init_windows_dirs(void)
static const WCHAR windirW[] = {'w','i','n','d','i','r',0};
static const WCHAR winsysdirW[] = {'w','i','n','s','y','s','d','i','r',0};
- static const WCHAR default_windirW[] = {'c',':','\\','w','i','n','d','o','w','s',0};
+ static const WCHAR default_windirW[] = {'C',':','\\','w','i','n','d','o','w','s',0};
static const WCHAR default_sysdirW[] = {'\\','s','y','s','t','e','m','3','2',0};
DWORD len;
diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
index 05111a8..dfb7748 100644
--- a/dlls/kernel32/tests/path.c
+++ b/dlls/kernel32/tests/path.c
@@ -727,6 +727,7 @@ static void test_PathNameA(CHAR *curdir, CHAR curDrive, CHAR otherDrive)
"GetFullPathNameA returned part '%s' instead of '%s'\n",strptr,SHORTFILE);
/* Otherwise insert the missing leading slash */
if( otherDrive != NOT_A_VALID_DRIVE) {
+ /* FIXME: this test assumes that current directory on other drive is root */
sprintf(tmpstr,"%c:%s\\%s",otherDrive,SHORTDIR,SHORTFILE);
ok(GetFullPathNameA(tmpstr,MAX_PATH,tmpstr1,&strptr),"GetFullPathNameA failed for %s\n", tmpstr);
sprintf(tmpstr,"%c:\\%s\\%s",otherDrive,SHORTDIR,SHORTFILE);
@@ -1157,6 +1158,87 @@ static void test_NeedCurrentDirectoryForExePathW(void)
ok(!pNeedCurrentDirectoryForExePathW(cmdname), "returned TRUE for \"cmd.exe\"\n");
}
+/* Call various path/file name retrieving APIs and check the case of
+ * the returned drive letter. Some apps (for instance Adobe Photoshop CS3
+ * installer) depend on the driver letter being in upper case.
+ */
+static void test_drive_letter_case(void)
+{
+ UINT ret;
+ char buf[MAX_PATH];
+
+#define is_upper_case_letter(a) ((a) >= 'A' && (a) <= 'Z')
+
+ memset(buf, 0, sizeof(buf));
+ SetLastError(0xdeadbeef);
+ ret = GetWindowsDirectory(buf, sizeof(buf));
+ ok(ret, "GetWindowsDirectory error %u\n", GetLastError());
+ ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret);
+ ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]);
+ ok(is_upper_case_letter(buf[0]), "expected buf[0] upper case letter got %c\n", buf[0]);
+
+ /* re-use the buffer returned by GetFullPathName */
+ buf[2] = '/';
+ SetLastError(0xdeadbeef);
+ ret = GetFullPathName(buf + 2, sizeof(buf), buf, NULL);
+ ok(ret, "GetFullPathName error %u\n", GetLastError());
+ ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret);
+ ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]);
+ ok(is_upper_case_letter(buf[0]), "expected buf[0] upper case letter got %c\n", buf[0]);
+
+ memset(buf, 0, sizeof(buf));
+ SetLastError(0xdeadbeef);
+ ret = GetSystemDirectory(buf, sizeof(buf));
+ ok(ret, "GetSystemDirectory error %u\n", GetLastError());
+ ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret);
+ ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]);
+ ok(is_upper_case_letter(buf[0]), "expected buf[0] upper case letter got %c\n", buf[0]);
+
+ memset(buf, 0, sizeof(buf));
+ SetLastError(0xdeadbeef);
+ ret = GetCurrentDirectory(sizeof(buf), buf);
+ ok(ret, "GetCurrentDirectory error %u\n", GetLastError());
+ ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret);
+ ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]);
+ ok(is_upper_case_letter(buf[0]), "expected buf[0] upper case letter got %c\n", buf[0]);
+
+ memset(buf, 0, sizeof(buf));
+ SetLastError(0xdeadbeef);
+ ret = GetTempPath(sizeof(buf), buf);
+ ok(ret, "GetTempPath error %u\n", GetLastError());
+ ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret);
+ ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]);
+ ok(is_upper_case_letter(buf[0]), "expected buf[0] upper case letter got %c\n", buf[0]);
+
+ memset(buf, 0, sizeof(buf));
+ SetLastError(0xdeadbeef);
+ ret = GetFullPathName(".", sizeof(buf), buf, NULL);
+ ok(ret, "GetFullPathName error %u\n", GetLastError());
+ ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret);
+ ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]);
+ ok(is_upper_case_letter(buf[0]), "expected buf[0] upper case letter got %c\n", buf[0]);
+
+ /* re-use the buffer returned by GetFullPathName */
+ SetLastError(0xdeadbeef);
+ ret = GetShortPathName(buf, buf, sizeof(buf));
+ ok(ret, "GetShortPathName error %u\n", GetLastError());
+ ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret);
+ ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]);
+ ok(is_upper_case_letter(buf[0]), "expected buf[0] upper case letter got %c\n", buf[0]);
+
+ if (pGetLongPathNameA)
+ {
+ /* re-use the buffer returned by GetShortPathName */
+ SetLastError(0xdeadbeef);
+ ret = pGetLongPathNameA(buf, buf, sizeof(buf));
+ ok(ret, "GetLongPathNameA error %u\n", GetLastError());
+ ok(ret < sizeof(buf), "buffer should be %u bytes\n", ret);
+ ok(buf[1] == ':', "expected buf[1] == ':' got %c\n", buf[1]);
+ ok(is_upper_case_letter(buf[0]), "expected buf[0] upper case letter got %c\n", buf[0]);
+ }
+#undef is_upper_case_letter
+}
+
START_TEST(path)
{
CHAR origdir[MAX_PATH],curdir[MAX_PATH], curDrive, otherDrive;
@@ -1188,4 +1270,5 @@ START_TEST(path)
{
test_NeedCurrentDirectoryForExePathW();
}
+ test_drive_letter_case();
}
diff --git a/dlls/ntdll/path.c b/dlls/ntdll/path.c
index db4cd10..73a77a8 100644
--- a/dlls/ntdll/path.c
+++ b/dlls/ntdll/path.c
@@ -1025,7 +1025,7 @@ NTSTATUS WINAPI RtlSetCurrentDirectory_U(const UNICODE_STRING* dir)
*/
NTSTATUS wine_unix_to_nt_file_name( const ANSI_STRING *name, UNICODE_STRING *nt )
{
- static const WCHAR prefixW[] = {'\\','?','?','\\','a',':','\\'};
+ static const WCHAR prefixW[] = {'\\','?','?','\\','A',':','\\'};
unsigned int lenW, lenA = name->Length;
const char *path = name->Buffer;
char *cwd;
More information about the wine-cvs
mailing list