Hi, This fixes a bug in DOSFS_DoGetFullPathName that caused the following effect in native cmd.exe: C:\Windows>cd.. *no effect* C:\Windows>cd.. *crashes* It now makes sure that "cd F:\.." doesn't crash it and that the format of the path returned is always "F:\" rather than "F:" ChangeLog: - Fix a bug that caused "cd F:\.." to crash - Fix a bug that caused "F:" rather than "F:\" to sometimes be returned (which is not liked by some programs) Rob
Index: wine/files/dos_fs.c =================================================================== RCS file: /home/wine/wine/files/dos_fs.c,v retrieving revision 1.127 diff -u -r1.127 dos_fs.c --- wine/files/dos_fs.c 13 Dec 2002 20:30:06 -0000 1.127 +++ wine/files/dos_fs.c 11 Jan 2003 21:07:32 -0000 @@ -1556,13 +1556,25 @@ return "c:\test" */ *(full_name.short_name+namelen-3)=0; q = strrchrW(full_name.short_name, '\\'); - *q =0; + if (q) /* fix for example f:\.. */ + *q =0; } if (full_name.short_name[namelen-1]=='.') full_name.short_name[(namelen--)-1] =0; if (!driveletter) if (full_name.short_name[namelen-1]=='\\') full_name.short_name[(namelen--)-1] =0; + + /* this is so the function returns "c:\" whenever it + * wants to return "c:" like the native implementation + * and Win2k cmd.exe expects this */ + if (full_name.short_name[0] && + full_name.short_name[1] == ':' && + !full_name.short_name[2]) + { + full_name.short_name[2] = '\\'; + full_name.short_name[3] = '\0'; + } TRACE("got %s\n", debugstr_w(full_name.short_name)); /* If the lpBuffer buffer is too small, the return value is the @@ -1915,10 +1927,17 @@ HGLOBAL handle; FIND_FIRST_INFO *info; + TRACE("(%s, ...)\n", debugstr_w(lpFileName)); + if (!lpFileName) { SetLastError(ERROR_PATH_NOT_FOUND); return INVALID_HANDLE_VALUE; + } + if (lpFileName[0] && lpFileName[1] == ':' && lpFileName[2] == '\\' && !lpFileName[3]) + { + SetLastError(ERROR_NO_MORE_FILES); + return INVALID_HANDLE_VALUE; } if ((fSearchOp != FindExSearchNameMatch) || (dwAdditionalFlags != 0))