This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: cygpath 2.4.0 (32-bits) in error?


On 2016-01-21 16:42, Corinna Vinschen wrote:
On Jan 21 15:11, Achim Gratz wrote:
Houder <houder <at> xs4all.nl> writes:
> %% uname -a
> CYGWIN_NT-6.1-WOW Seven 2.4.0(0.293/5/3) 2016-01-15 16:14 i686 Cygwin
>
> %% /usr/bin/cygpath -S -u
> /drv/c/Windows/SysWOW64 <==== Nice, the truth is out! ... but do we want
> it here?
> %% /usr/bin/cygpath -S -w
> C:\Windows\system32
> %%
> %% /usr/bin/cygpath -S -U
> /proc/cygdrive/c/Windows/SysWOW64 <==== ditto

Well

/usr/bin/cygpath -u $( /usr/bin/cygpath -Sw )

delivers the right result. I guess an option to chose which result to get
might be nice, but I can cope either way.

I hate this path redirection stuff.  Patches welcome.  Maybe we should
simply replace SysWOW64 with System32, a simple string operation.

Hi Corinna,

Did not mean to get you angry ...

do_sysfolders() in cygpath.cc has changed between 2.3.1 and 2.4.0 where
it attempts to ascertain the 'system directory'.

The postprocessing after GetSystemDirectoryW() is different ...

The call to NtQueryInformationFile() in 2.4.0 spoils the result that has
been obtained by GetSystemDirectoryW() call.

Reverting your modification makes cygpath correct again (tested: 32-bits).

It is clear from the commentary what you are attempting to achieve after
the call to GetSystemDirectoryW() ...

However, the code after the call to GetSystemDirectoryW() is a mystery to
me. Sorry.

Regards,
Henri

do_sysfolders() in cygpath.cc

-----
2.3.1
    case 'S':
      {
	HANDLE fh;
	WIN32_FIND_DATAW w32_fd;

	GetSystemDirectoryW (wbuf, MAX_PATH);
	/* The path returned by GetSystemDirectoryW is not case preserving.
	   The below code is a trick to get the correct case of the system
	   directory from Windows. */
	if ((fh = FindFirstFileW (wbuf, &w32_fd)) != INVALID_HANDLE_VALUE)
	  {
	    FindClose (fh);
	    wcscpy (wcsrchr (wbuf, L'\\') + 1, w32_fd.cFileName);
	  }
      }
      break;

-----
2.4.0:
    case 'S':
      {
	GetSystemDirectoryW (wbuf, MAX_PATH);
...
      if (iswalpha (wbuf[0]) && wbuf[1] == L':' && wbuf[2] == L'\\')
	{
	  OBJECT_ATTRIBUTES attr;
	  NTSTATUS status;
	  HANDLE h;
	  IO_STATUS_BLOCK io;
	  UNICODE_STRING upath;
	  const ULONG size = sizeof (FILE_NAME_INFORMATION)
			     + PATH_MAX * sizeof (WCHAR);
	  PFILE_NAME_INFORMATION pfni = (PFILE_NAME_INFORMATION) alloca (size);

	  /* Avoid another buffer, reuse pfni. */
	  wcpcpy (wcpcpy (pfni->FileName, L"\\??\\"), wbuf);
wprintf (L" 1: pfni->FileName: %S\n", pfni->FileName); // still correct
	  RtlInitUnicodeString (&upath, pfni->FileName);
wprintf (L" 2: pfni->FileName: %S\n", pfni->FileName); // still correct
	  InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE,
				      NULL, NULL);
	  status = NtOpenFile (&h, READ_CONTROL, &attr, &io,
			       FILE_SHARE_VALID_FLAGS, FILE_OPEN_REPARSE_POINT);
	  if (NT_SUCCESS (status))
	    {
	      status = NtQueryInformationFile (h, &io, pfni, size,
					       FileNameInformation); // returns the wrong path
wprintf (L" 3: pfni->FileName: %S\n", pfni->FileName); // WRONG
	      if (NT_SUCCESS (status))
		{
		  pfni->FileName[pfni->FileNameLength / sizeof (WCHAR)] = L'\0';
wprintf (L" 4: pfni->FileName: %S\n", pfni->FileName);
		  wcscpy (wbuf + 2, pfni->FileName);
wprintf (L"wcscpy(): %S\n", wbuf);
		}
	      NtClose (h);
	    }
	}

=====



--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]