From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 75712 invoked by alias); 21 Jan 2016 18:34:40 -0000 Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Mail-Followup-To: cygwin@cygwin.com Received: (qmail 75672 invoked by uid 89); 21 Jan 2016 18:34:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_05,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=mystery, angry, sk:invalid, WRONG X-HELO: lb3-smtp-cloud3.xs4all.net Received: from lb3-smtp-cloud3.xs4all.net (HELO lb3-smtp-cloud3.xs4all.net) (194.109.24.30) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 21 Jan 2016 18:34:37 +0000 Received: from webmail.xs4all.nl ([194.109.20.205]) by smtp-cloud3.xs4all.net with ESMTP id 8iaZ1s0064RV18J01iaZhc; Thu, 21 Jan 2016 19:34:33 +0100 Received: from a83-162-234-136.adsl.xs4all.nl ([83.162.234.136]) by webmail.xs4all.nl with HTTP (HTTP/1.1 POST); Thu, 21 Jan 2016 19:34:33 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Thu, 21 Jan 2016 19:52:00 -0000 From: Houder To: cygwin@cygwin.com Subject: Re: cygpath 2.4.0 (32-bits) in error? In-Reply-To: <20160121154209.GA12461@calimero.vinschen.de> References: <20160121154209.GA12461@calimero.vinschen.de> Message-ID: <892d9876668c7f8a417ed63db8befa8a@xs4all.nl> X-Sender: houder@xs4all.nl (JwZWcNYoRTbAdDKfX+6nqw==) User-Agent: XS4ALL Webmail X-IsSubscribed: yes X-SW-Source: 2016-01/txt/msg00270.txt.bz2 On 2016-01-21 16:42, Corinna Vinschen wrote: > On Jan 21 15:11, Achim Gratz wrote: >> Houder 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