From 10f4c279ca740c8345864d7189baad401b88d087 Mon Sep 17 00:00:00 2001 From: corinna Date: Thu, 26 Aug 2010 12:06:27 +0000 Subject: [PATCH] * cygpath.cc (get_device_name): Prefer the \\.\X: DOS device for harddisks, if available. --- winsup/utils/ChangeLog | 5 +++++ winsup/utils/cygpath.cc | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog index 824c19b887..507ddd37f0 100644 --- a/winsup/utils/ChangeLog +++ b/winsup/utils/ChangeLog @@ -1,3 +1,8 @@ +2010-08-26 Corinna Vinschen + + * cygpath.cc (get_device_name): Prefer the \\.\X: DOS device for + harddisks, if available. + 2010-08-21 Corinna Vinschen * ldd.cc (report): Drop long pathname considerations which result in diff --git a/winsup/utils/cygpath.cc b/winsup/utils/cygpath.cc index 2ba727a9c3..449c5436e4 100644 --- a/winsup/utils/cygpath.cc +++ b/winsup/utils/cygpath.cc @@ -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); -- 2.11.0