Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2016-01-21 20:40:30 +0300
committerCorinna Vinschen <corinna@vinschen.de>2016-01-21 20:40:30 +0300
commit79b1b77b1fd1fcb036bbb2a9aeb6667f1cdcc1ef (patch)
tree7eca639c017c17499ba9b7dc90566e8c9e080073 /winsup/utils
parentb5c80f5a59fda4e3890bf3cb515a67f420057e02 (diff)
cygpath: Avoid returning SysWOW64
On Cygwin 32 running under WOW64: When case-correcting the path fetched with -S, the underlying Windows function fetching the normalized path returns the real path C:\Windows\SysWOW64 instead of the path redirection enabled C:\Windows\System32 path. This breaks using the result of `cygpath -S' to fetch the POSIX path of the network related files under SYSTEMROOT\drivers\etc. This path is in fact under the *real* C:\Windows\System32 and only mapped into the 32 bit C:\Windows\System32 (aka C:\Windows\SysWOW64) via path redirection. Sounds messy? This patch checks if we're running under WOW64. If so, it changes the path returned by GetSystemDirectoryW from "system32" to "Sysnative". This in turn is changed to "System32" by NtQueryInformationFile, so we're back to what we need. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/utils')
-rw-r--r--winsup/utils/cygpath.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/winsup/utils/cygpath.cc b/winsup/utils/cygpath.cc
index c0a527631..8df8eaaf3 100644
--- a/winsup/utils/cygpath.cc
+++ b/winsup/utils/cygpath.cc
@@ -539,6 +539,7 @@ do_sysfolders (char option)
{
WCHAR wbuf[MAX_PATH];
char buf[PATH_MAX];
+ BOOL iswow64 = FALSE;
wbuf[0] = L'\0';
switch (option)
@@ -581,6 +582,18 @@ do_sysfolders (char option)
case 'S':
GetSystemDirectoryW (wbuf, MAX_PATH);
+ if (!windows_flag
+ && IsWow64Process (GetCurrentProcess (), &iswow64) && iswow64)
+ {
+ /* When calling NtQueryInformationFile(FileNameInformation) on WOW64,
+ the returned path will point to SysWOW64. This breaks path
+ redirection to the network related files under device/etc. This
+ here is a bad hack to make sure that the conversion will convert
+ the case *and* stick to System32. */
+ PWCHAR last_bs = wcsrchr (wbuf, L'\\');
+ if (last_bs)
+ wcpcpy (last_bs + 1, L"Sysnative");
+ }
break;
case 'W':