Author: hbelusca
Date: Sat Jun  8 14:48:33 2013
New Revision: 59193

URL: http://svn.reactos.org/svn/reactos?rev=59193&view=rev
Log:
[KERNEL32]
- Fix IN/OUT declaration of parameters for GetFullPathNameA/W
- Fix a bad usage of GetFullPathNameW in the GetTempPathW API, where the source 
and destination buffer for GetFullPathNameW was the same (Yet another Wineism 
:(( ). On Windows, using the same buffer fills it with a garbled string. Avoid 
this behaviour on ReactOS too, because internally GetFullPathNameW calls 
RtlGetFullPathName_U, the latter zeroing-out the destination buffer before 
usage.

[RTL:PATH]
See comments of revision r59183 (and in particular, fix some ntdll:RtlDos* path 
functions).

Modified:
    trunk/reactos/dll/win32/kernel32/client/path.c
    trunk/reactos/lib/rtl/path.c

Modified: trunk/reactos/dll/win32/kernel32/client/path.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/path.c?rev=59193&r1=59192&r2=59193&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/client/path.c      [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/client/path.c      [iso-8859-1] Sat Jun  8 
14:48:33 2013
@@ -986,8 +986,8 @@
 WINAPI
 GetFullPathNameA(IN LPCSTR lpFileName,
                  IN DWORD nBufferLength,
-                 IN LPSTR lpBuffer,
-                 IN LPSTR *lpFilePart)
+                 OUT LPSTR lpBuffer,
+                 OUT LPSTR *lpFilePart)
 {
     NTSTATUS Status;
     PWCHAR Buffer;
@@ -1099,11 +1099,11 @@
 WINAPI
 GetFullPathNameW(IN LPCWSTR lpFileName,
                  IN DWORD nBufferLength,
-                 IN LPWSTR lpBuffer,
+                 OUT LPWSTR lpBuffer,
                  OUT LPWSTR *lpFilePart)
 {
     /* Call Rtl to do the work */
-    return RtlGetFullPathName_U((LPWSTR)lpFileName,
+    return RtlGetFullPathName_U(lpFileName,
                                 nBufferLength * sizeof(WCHAR),
                                 lpBuffer,
                                 lpFilePart) / sizeof(WCHAR);
@@ -2079,6 +2079,7 @@
     static const WCHAR temp[] = { 'T', 'E', 'M', 'P', 0 };
     static const WCHAR userprofile[] = { 
'U','S','E','R','P','R','O','F','I','L','E',0 };
     WCHAR tmp_path[MAX_PATH];
+    WCHAR full_tmp_path[MAX_PATH];
     UINT ret;
 
     DPRINT("%u,%p\n", count, path);
@@ -2087,42 +2088,44 @@
         !(ret = GetEnvironmentVariableW( temp, tmp_path, MAX_PATH )) &&
         !(ret = GetEnvironmentVariableW( userprofile, tmp_path, MAX_PATH )) &&
         !(ret = GetWindowsDirectoryW( tmp_path, MAX_PATH )))
+    {
         return 0;
-
-   if (ret > MAX_PATH)
-   {
-     SetLastError(ERROR_FILENAME_EXCED_RANGE);
-     return 0;
-   }
-
-   ret = GetFullPathNameW(tmp_path, MAX_PATH, tmp_path, NULL);
-   if (!ret) return 0;
-
-   if (ret > MAX_PATH - 2)
-   {
-     SetLastError(ERROR_FILENAME_EXCED_RANGE);
-     return 0;
-   }
-
-   if (tmp_path[ret-1] != '\\')
-   {
-     tmp_path[ret++] = '\\';
-     tmp_path[ret]   = '\0';
-   }
-
-   ret++; /* add space for terminating 0 */
-
-   if (count)
-   {
-     lstrcpynW(path, tmp_path, count);
-     if (count >= ret)
-         ret--; /* return length without 0 */
-     else if (count < 4)
-         path[0] = 0; /* avoid returning ambiguous "X:" */
-   }
-
-   DPRINT("GetTempPathW returning %u, %S\n", ret, path);
-   return ret;
+    }
+
+    if (ret > MAX_PATH)
+    {
+        SetLastError(ERROR_FILENAME_EXCED_RANGE);
+        return 0;
+    }
+
+    ret = GetFullPathNameW(tmp_path, MAX_PATH, full_tmp_path, NULL);
+    if (!ret) return 0;
+
+    if (ret > MAX_PATH - 2)
+    {
+        SetLastError(ERROR_FILENAME_EXCED_RANGE);
+        return 0;
+    }
+
+    if (full_tmp_path[ret-1] != '\\')
+    {
+        full_tmp_path[ret++] = '\\';
+        full_tmp_path[ret]   = '\0';
+    }
+
+    ret++; /* add space for terminating 0 */
+
+    if (count)
+    {
+        lstrcpynW(path, full_tmp_path, count);
+        if (count >= ret)
+            ret--; /* return length without 0 */
+        else if (count < 4)
+            path[0] = 0; /* avoid returning ambiguous "X:" */
+    }
+
+    DPRINT("GetTempPathW returning %u, %S\n", ret, path);
+    return ret;
 }
 
 /*

Modified: trunk/reactos/lib/rtl/path.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/path.c?rev=59193&r1=59192&r2=59193&view=diff
==============================================================================
--- trunk/reactos/lib/rtl/path.c        [iso-8859-1] (original)
+++ trunk/reactos/lib/rtl/path.c        [iso-8859-1] Sat Jun  8 14:48:33 2013
@@ -160,7 +160,7 @@
         {
             /* Check if the character is a path or drive separator */
             c = *End;
-            if ((c == '\\') || (c == '/') || ((c == ':') && (End == 
PathCopy.Buffer + 1)))
+            if (IS_PATH_SEPARATOR(c) || ((c == ':') && (End == PathCopy.Buffer 
+ 1)))
             {
                 /* Get the next lower case character */
                 End++;
@@ -422,30 +422,33 @@
     if (PartName)
     {
         /* Loop from the back until we find a path separator */
-        p = &NewBuffer[(DosLength - 1) / sizeof (WCHAR)];
-        while (p > NewBuffer) if (*p-- == '\\') break;
-
-        /* Was one found? */
-        if (p > NewBuffer)
-        {
-            /* Move past it -- anything left? */
-            p++;
-            if (!*p)
+        p = &NewBuffer[DosLength / sizeof(WCHAR)];
+        while (--p > NewBuffer)
+        {
+            /* We found a path separator, move past it */
+            if (*p == OBJ_NAME_PATH_SEPARATOR)
             {
-                /* The path ends with a path separator, no part name */
-                *PartName = NULL;
+                ++p;
+                break;
             }
-            else
-            {
-                /* What follows the path separator is the part name */
-                *PartName = p;
-            }
+        }
+
+        /* Check whether a separator was found and if something remains */
+        if ((p > NewBuffer) && *p)
+        {
+            /* What follows the path separator is the partial name */
+            *PartName = p;
+        }
+        else
+        {
+            /* The path ends with a path separator, no partial name */
+            *PartName = NULL;
         }
     }
 
     /* Build the final NT path string */
+    NtPath->Buffer = NewBuffer;
     NtPath->Length = (USHORT)DosLength;
-    NtPath->Buffer = NewBuffer;
     NtPath->MaximumLength = (USHORT)DosLength + sizeof(UNICODE_NULL);
     return STATUS_SUCCESS;
 }
@@ -574,7 +577,6 @@
         /* Nothing else is expected */
         default:
             ASSERT(FALSE);
-
     }
 
     /* Now copy the prefix and the buffer */
@@ -592,7 +594,7 @@
     NtName->Length = (USHORT)Length;
     NtName->MaximumLength = (USHORT)MaxLength;
     NewBuffer[LengthChars] = UNICODE_NULL;
-    DPRINT("new buffer: %S\n", NewBuffer);
+    DPRINT("New buffer: %S\n", NewBuffer);
     DPRINT("NT Name: %wZ\n", NtName);
 
     /* Check if a partial name was requested */
@@ -651,7 +653,7 @@
                     RelativeName->RelativeName.Buffer = 
(PWSTR)((ULONG_PTR)NewBuffer + PrefixLength + FullPath.Length - PrefixCut * 
sizeof(WCHAR));
                     RelativeName->RelativeName.Length = (USHORT)(PathLength - 
FullPath.Length);
                     /* If relative name starts with \, skip it */
-                    if (RelativeName->RelativeName.Buffer[0] == L'\\')
+                    if (RelativeName->RelativeName.Buffer[0] == 
OBJ_NAME_PATH_SEPARATOR)
                     {
                         RelativeName->RelativeName.Buffer++;
                         RelativeName->RelativeName.Length -= sizeof(WCHAR);
@@ -1121,7 +1123,7 @@
     FullPath.Length = (USHORT)FullPathLength;
 
     /* If full path isn't \ terminated, do it */
-    if (FullPath.Buffer[CharLength - 1] != L'\\')
+    if (FullPath.Buffer[CharLength - 1] != OBJ_NAME_PATH_SEPARATOR)
     {
         if ((CharLength + 1) * sizeof(WCHAR) > SavedLength)
         {
@@ -1129,7 +1131,7 @@
             goto Leave;
         }
 
-        FullPath.Buffer[CharLength] = L'\\';
+        FullPath.Buffer[CharLength] = OBJ_NAME_PATH_SEPARATOR;
         FullPath.Buffer[CharLength + 1] = UNICODE_NULL;
         FullPath.Length += sizeof(WCHAR);
     }
@@ -1500,6 +1502,9 @@
 
     if (!name || !*name) return 0;
 
+    /* Zero out the destination buffer (implies that "name" should be 
different from "buffer" to get this function well-behaving) */
+    RtlZeroMemory(buffer, size);
+
     if (file_part) *file_part = NULL;
 
     /* check for DOS device name */
@@ -1733,9 +1738,9 @@
         }
 
         /* Add a terminating slash if needed */
-        if ((BufferStart != NewBuffer) && (BufferStart[-1] != '\\'))
-        {
-            *BufferStart++ = '\\';
+        if ((BufferStart != NewBuffer) && (BufferStart[-1] != 
OBJ_NAME_PATH_SEPARATOR))
+        {
+            *BufferStart++ = OBJ_NAME_PATH_SEPARATOR;
         }
 
         /* Bail out if we reached the end */
@@ -2051,6 +2056,7 @@
     /* Initialize optional arguments */
     if (FullNameOut) *FullNameOut = NULL;
     if (FilePartSize) *FilePartSize = 0;
+    if (LengthNeeded) *LengthNeeded = 0;
     if (DynamicString)
     {
         DynamicString->Length = DynamicString->MaximumLength = 0;
@@ -2322,7 +2328,7 @@
                              &StaticCandidateString,
                              Status);
                 }
-                DPRINT("STatus: %lx BUFFER: %S\n", Status, 
CallerBuffer->Buffer);
+                DPRINT("Status: %lx BUFFER: %S\n", Status, 
CallerBuffer->Buffer);
                 goto Quickie;
             }
             else


Reply via email to