Alexandre Julliard : kernel32: Check NT symlink first for all devices in QueryDosDeviceW.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 21 07:24:24 CDT 2015


Module: wine
Branch: master
Commit: f32600d3c1ae47731b53b6a872c16c9d1d0a893d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f32600d3c1ae47731b53b6a872c16c9d1d0a893d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 21 17:35:06 2015 +0900

kernel32: Check NT symlink first for all devices in QueryDosDeviceW.

---

 dlls/kernel32/volume.c | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c
index 38a72c5..0bbf621 100644
--- a/dlls/kernel32/volume.c
+++ b/dlls/kernel32/volume.c
@@ -1282,34 +1282,35 @@ DWORD WINAPI QueryDosDeviceW( LPCWSTR devname, LPWSTR target, DWORD bufsize )
     {
         WCHAR *p, name[5];
         char *path, *link;
+        WCHAR *buffer;
         DWORD dosdev, ret = 0;
 
         if ((dosdev = RtlIsDosDeviceName_U( devname )))
         {
             memcpy( name, devname + HIWORD(dosdev)/sizeof(WCHAR), LOWORD(dosdev) );
             name[LOWORD(dosdev)/sizeof(WCHAR)] = 0;
+            devname = name;
         }
-        else
-        {
-            WCHAR *buffer;
 
-            if (!(buffer = HeapAlloc( GetProcessHeap(), 0, sizeof(dosdevW) + strlenW(devname)*sizeof(WCHAR) )))
-            {
-                SetLastError( ERROR_OUTOFMEMORY );
-                return 0;
-            }
-            memcpy( buffer, dosdevW, sizeof(dosdevW) );
-            strcatW( buffer, devname );
-            status = read_nt_symlink( buffer, target, bufsize );
-            HeapFree( GetProcessHeap(), 0, buffer );
-            if (status)
-            {
-                SetLastError( RtlNtStatusToDosError(status) );
-                return 0;
-            }
+        if (!(buffer = HeapAlloc( GetProcessHeap(), 0, sizeof(dosdevW) + strlenW(devname)*sizeof(WCHAR) )))
+        {
+            SetLastError( ERROR_OUTOFMEMORY );
+            return 0;
+        }
+        memcpy( buffer, dosdevW, sizeof(dosdevW) );
+        strcatW( buffer, devname );
+        status = read_nt_symlink( buffer, target, bufsize );
+        HeapFree( GetProcessHeap(), 0, buffer );
+        if (!status)
+        {
             ret = strlenW( target ) + 1;
             goto done;
         }
+        if (!dosdev)  /* not a special DOS device */
+        {
+            SetLastError( RtlNtStatusToDosError(status) );
+            return 0;
+        }
 
         /* FIXME: should read NT symlink for all devices */
 
@@ -1322,7 +1323,7 @@ DWORD WINAPI QueryDosDeviceW( LPCWSTR devname, LPWSTR target, DWORD bufsize )
             ret = MultiByteToWideChar( CP_UNIXCP, 0, link, -1, target, bufsize );
             HeapFree( GetProcessHeap(), 0, link );
         }
-        else if (dosdev)  /* look for device defaults */
+        else  /* look for device defaults */
         {
             if (!strcmpiW( name, auxW ))
             {




More information about the wine-cvs mailing list