Alexandre Julliard : kernel32: Rely solely on the DosDevices symbolic links in QueryDosDevice.

Alexandre Julliard julliard at winehq.org
Wed May 3 16:06:09 CDT 2017


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed May  3 11:50:02 2017 +0200

kernel32: Rely solely on the DosDevices symbolic links in QueryDosDevice.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/volume.c | 160 ++-----------------------------------------------
 1 file changed, 4 insertions(+), 156 deletions(-)

diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c
index 92bcf53..b4163f0 100644
--- a/dlls/kernel32/volume.c
+++ b/dlls/kernel32/volume.c
@@ -68,36 +68,6 @@ enum fs_type
     FS_UDF       /* For reference [E] = Ecma-167.pdf, [U] = udf260.pdf */
 };
 
-/* read a Unix symlink; returned buffer must be freed by caller */
-static char *read_symlink( const char *path )
-{
-    char *buffer;
-    int ret, size = 128;
-
-    for (;;)
-    {
-        if (!(buffer = HeapAlloc( GetProcessHeap(), 0, size )))
-        {
-            SetLastError( ERROR_NOT_ENOUGH_MEMORY );
-            return 0;
-        }
-        ret = readlink( path, buffer, size );
-        if (ret == -1)
-        {
-            FILE_SetDosError();
-            HeapFree( GetProcessHeap(), 0, buffer );
-            return 0;
-        }
-        if (ret != size)
-        {
-            buffer[ret] = 0;
-            return buffer;
-        }
-        HeapFree( GetProcessHeap(), 0, buffer );
-        size *= 2;
-    }
-}
-
 /* get the path of a dos device symlink in the $WINEPREFIX/dosdevices directory */
 static char *get_dos_device_path( LPCWSTR name )
 {
@@ -1257,18 +1227,9 @@ BOOL WINAPI DefineDosDeviceA(DWORD flags, LPCSTR devname, LPCSTR targetpath)
  */
 DWORD WINAPI QueryDosDeviceW( LPCWSTR devname, LPWSTR target, DWORD bufsize )
 {
-    static const WCHAR auxW[] = {'A','U','X',0};
-    static const WCHAR prnW[] = {'P','R','N',0};
-    static const WCHAR comW[] = {'C','O','M',0};
-    static const WCHAR lptW[] = {'L','P','T',0};
-    static const WCHAR com0W[] = {'\\','?','?','\\','C','O','M','0',0};
-    static const WCHAR com1W[] = {'\\','D','o','s','D','e','v','i','c','e','s','\\','C','O','M','1',0,0};
-    static const WCHAR lpt1W[] = {'\\','D','o','s','D','e','v','i','c','e','s','\\','L','P','T','1',0,0};
     static const WCHAR dosdevW[] = {'\\','D','o','s','D','e','v','i','c','e','s','\\',0};
 
     UNICODE_STRING nt_name;
-    ANSI_STRING unix_name;
-    WCHAR nt_buffer[10];
     NTSTATUS status;
 
     if (!bufsize)
@@ -1279,8 +1240,7 @@ DWORD WINAPI QueryDosDeviceW( LPCWSTR devname, LPWSTR target, DWORD bufsize )
 
     if (devname)
     {
-        WCHAR *p, name[5];
-        char *path, *link;
+        WCHAR name[8];
         WCHAR *buffer;
         DWORD dosdev, ret = 0;
 
@@ -1300,72 +1260,13 @@ DWORD WINAPI QueryDosDeviceW( LPCWSTR devname, LPWSTR target, DWORD bufsize )
         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 */
+        if (status)
         {
             SetLastError( RtlNtStatusToDosError(status) );
             return 0;
         }
-
-        /* FIXME: should read NT symlink for all devices */
-
-        if (!(path = get_dos_device_path( name ))) return 0;
-        link = read_symlink( path );
-        HeapFree( GetProcessHeap(), 0, path );
-
-        if (link)
-        {
-            ret = MultiByteToWideChar( CP_UNIXCP, 0, link, -1, target, bufsize );
-            HeapFree( GetProcessHeap(), 0, link );
-        }
-        else  /* look for device defaults */
-        {
-            if (!strcmpiW( name, auxW ))
-            {
-                if (bufsize >= sizeof(com1W)/sizeof(WCHAR))
-                {
-                    memcpy( target, com1W, sizeof(com1W) );
-                    ret = sizeof(com1W)/sizeof(WCHAR);
-                }
-                else SetLastError( ERROR_INSUFFICIENT_BUFFER );
-                return ret;
-            }
-            if (!strcmpiW( name, prnW ))
-            {
-                if (bufsize >= sizeof(lpt1W)/sizeof(WCHAR))
-                {
-                    memcpy( target, lpt1W, sizeof(lpt1W) );
-                    ret = sizeof(lpt1W)/sizeof(WCHAR);
-                }
-                else SetLastError( ERROR_INSUFFICIENT_BUFFER );
-                return ret;
-            }
-
-            nt_buffer[0] = '\\';
-            nt_buffer[1] = '?';
-            nt_buffer[2] = '?';
-            nt_buffer[3] = '\\';
-            strcpyW( nt_buffer + 4, name );
-            RtlInitUnicodeString( &nt_name, nt_buffer );
-            status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, TRUE );
-            if (status) SetLastError( RtlNtStatusToDosError(status) );
-            else
-            {
-                ret = MultiByteToWideChar( CP_UNIXCP, 0, unix_name.Buffer, -1, target, bufsize );
-                RtlFreeAnsiString( &unix_name );
-            }
-        }
-    done:
-        if (ret)
-        {
-            if (ret < bufsize) target[ret++] = 0;  /* add an extra null */
-            for (p = target; *p; p++) if (*p == '/') *p = '\\';
-        }
-
+        ret = strlenW( target ) + 1;
+        if (ret < bufsize) target[ret++] = 0;  /* add an extra null */
         return ret;
     }
     else  /* return a list of all devices */
@@ -1373,59 +1274,6 @@ DWORD WINAPI QueryDosDeviceW( LPCWSTR devname, LPWSTR target, DWORD bufsize )
         OBJECT_ATTRIBUTES attr;
         HANDLE handle;
         WCHAR *p = target;
-        int i;
-
-        if (bufsize <= (sizeof(auxW)+sizeof(prnW))/sizeof(WCHAR))
-        {
-            SetLastError( ERROR_INSUFFICIENT_BUFFER );
-            return 0;
-        }
-
-        /* FIXME: these should be NT symlinks too */
-
-        memcpy( p, auxW, sizeof(auxW) );
-        p += sizeof(auxW) / sizeof(WCHAR);
-        memcpy( p, prnW, sizeof(prnW) );
-        p += sizeof(prnW) / sizeof(WCHAR);
-
-        strcpyW( nt_buffer, com0W );
-        RtlInitUnicodeString( &nt_name, nt_buffer );
-
-        for (i = 1; i <= 9; i++)
-        {
-            nt_buffer[7] = '0' + i;
-            if (!wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, TRUE ))
-            {
-                RtlFreeAnsiString( &unix_name );
-                if (p + 5 >= target + bufsize)
-                {
-                    SetLastError( ERROR_INSUFFICIENT_BUFFER );
-                    return 0;
-                }
-                strcpyW( p, comW );
-                p[3] = '0' + i;
-                p[4] = 0;
-                p += 5;
-            }
-        }
-        strcpyW( nt_buffer + 4, lptW );
-        for (i = 1; i <= 9; i++)
-        {
-            nt_buffer[7] = '0' + i;
-            if (!wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, TRUE ))
-            {
-                RtlFreeAnsiString( &unix_name );
-                if (p + 5 >= target + bufsize)
-                {
-                    SetLastError( ERROR_INSUFFICIENT_BUFFER );
-                    return 0;
-                }
-                strcpyW( p, lptW );
-                p[3] = '0' + i;
-                p[4] = 0;
-                p += 5;
-            }
-        }
 
         RtlInitUnicodeString( &nt_name, dosdevW );
         nt_name.Length -= sizeof(WCHAR);  /* without trailing slash */




More information about the wine-cvs mailing list