Erich E. Hoover : kernel32: Handle device paths in GetVolumePathName.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 23 09:17:15 CDT 2015


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

Author: Erich E. Hoover <erich.e.hoover at wine-staging.com>
Date:   Mon Jun 15 22:20:03 2015 -0600

kernel32: Handle device paths in GetVolumePathName.

NT-style paths that have a device prefix (\??\) also return the drive
of the current working directory (even if they're valid devices).

---

 dlls/kernel32/tests/volume.c | 8 ++++++++
 dlls/kernel32/volume.c       | 5 +++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c
index 7ed55d7..4349ec4 100644
--- a/dlls/kernel32/tests/volume.c
+++ b/dlls/kernel32/tests/volume.c
@@ -675,6 +675,14 @@ static void test_GetVolumePathNameA(void)
             "InvalidDrive:\\AnInvalidFolder", "%CurrentDrive%\\", sizeof(volume_path),
             NO_ERROR, NO_ERROR
         },
+        { /* test 18: a reasonable device path */
+            "\\??\\CdRom0", "%CurrentDrive%\\", sizeof(volume_path),
+            NO_ERROR, NO_ERROR
+        },
+        { /* test 19: an unreasonable device path */
+            "\\??\\ReallyBogus", "%CurrentDrive%\\", sizeof(volume_path),
+            NO_ERROR, NO_ERROR
+        },
     };
     BOOL ret, success;
     DWORD error;
diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c
index 5e3b148..7cb245a 100644
--- a/dlls/kernel32/volume.c
+++ b/dlls/kernel32/volume.c
@@ -1817,6 +1817,7 @@ BOOL WINAPI GetVolumePathNameA(LPCSTR filename, LPSTR volumepathname, DWORD bufl
  */
 BOOL WINAPI GetVolumePathNameW(LPCWSTR filename, LPWSTR volumepathname, DWORD buflen)
 {
+    static const WCHAR deviceprefixW[] = { '\\','?','?','\\',0 };
     static const WCHAR ntprefixW[] = { '\\','\\','?','\\',0 };
     WCHAR fallbackpathW[] = { 'C',':','\\',0 };
     NTSTATUS status = STATUS_SUCCESS;
@@ -1892,9 +1893,9 @@ BOOL WINAPI GetVolumePathNameW(LPCWSTR filename, LPWSTR volumepathname, DWORD bu
         WCHAR cwdW[MAX_PATH];
 
         /* the path was completely invalid */
-        if (filename[0] == '\\')
+        if (filename[0] == '\\' && strncmpW(deviceprefixW, filename, strlenW(deviceprefixW)) != 0)
         {
-            /* NT-style paths fail */
+            /* NT-style paths (that are not device paths) fail */
             status = STATUS_OBJECT_NAME_INVALID;
             goto cleanup;
         }




More information about the wine-cvs mailing list