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>
This commit is contained in:
Corinna Vinschen 2016-01-21 18:40:30 +01:00
parent b5c80f5a59
commit 79b1b77b1f

View File

@ -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':