OSDN Git Service

* cygpath.cc (get_device_name): Prefer the \\.\X: DOS device for
authorcorinna <corinna>
Thu, 26 Aug 2010 12:06:27 +0000 (12:06 +0000)
committercorinna <corinna>
Thu, 26 Aug 2010 12:06:27 +0000 (12:06 +0000)
harddisks, if available.

winsup/utils/ChangeLog
winsup/utils/cygpath.cc

index 824c19b..507ddd3 100644 (file)
@@ -1,3 +1,8 @@
+2010-08-26  Corinna Vinschen  <corinna@vinschen.de>
+
+       * cygpath.cc (get_device_name): Prefer the \\.\X: DOS device for
+       harddisks, if available.
+
 2010-08-21  Corinna Vinschen  <corinna@vinschen.de>
 
        * ldd.cc (report): Drop long pathname considerations which result in
index 2ba727a..449c543 100644 (file)
@@ -233,8 +233,18 @@ get_device_name (char *path)
              ans.MaximumLength = len;
              ans.Buffer = ret + 4;
              RtlUnicodeStringToAnsiString (&ans, &odi->ObjectName, FALSE);
-             ZwClose (dir);
-             goto out;
+             /* Special case for local disks:  It's most feasible if the
+                DOS device name reflects the DOS drive, so we check for this
+                explicitly and only return prematurely if so. */
+#define              HARDDISK_PREFIX   L"\\Device\\Harddisk"
+             if (ntdev.Length < wcslen (HARDDISK_PREFIX)
+                 || wcsncasecmp (ntdev.Buffer, HARDDISK_PREFIX, 8) != 0
+                 || (odi->ObjectName.Length == 2 * sizeof (WCHAR)
+                     && odi->ObjectName.Buffer[1] == L':'))
+               {
+                 ZwClose (dir);
+                 goto out;
+               }
            }
        }
       ZwClose (dir);