On Thu, 26 Jun 2025, Jeremy Drake via Cygwin-developers wrote:

> On Thu, 26 Jun 2025, Corinna Vinschen wrote:
>
> > On Jun 25 16:15, Jeremy Drake via Cygwin-developers wrote:
> > > This turned out to be more complicated than I expected,
> > > GetFileInformationByHandleEx(FileNameInfo) sucks badly, and seems to only
> > > actually work for regular files.
> >
> > This is unexpected.  GetFileInformationByHandleEx is basically just a
> > wrapper for NtQueryInformationFile and that goes especially for the
> > FileNameInfo class which even neglects to prepend a drive letter or
> > UNC path to make the result useful in a DOS Path environment.

> > > Which is probably why Cygwin uses
> > > NtQueryObject(ObjectNameInformation) instead, which I switched to
> >
> > Uh, we use NtQueryObject in cases where we want valid return values
> > for real NT objects or device paths like \Device\Null.
>
> Sorry, I meant that it didn't work for handles to \Device\Null (or console
> handles, but they are not part of the tests).  I used /dev/null /dev/zero
> and /dev/full in tests, and they all seem to turn into \Device\Null when
> redirected to/from a Windows executable.  I didn't try with directory
> handles, because they didn't make sense in the context of redirecting
> stdin/out/err.  I guess I could add a test for that and see what the
> result is (EISDIR?).

Turns out Cygwin, Windows and Linux are fine with redirecting a directory
handle/file descriptor to stdin.  I guess any error would happen when the
process tries to actually use it.

> > > This
> > > has the downside of giving NT native paths (\Device\HarddiskVolumeN\path).
> >
> > Downside? *grin*
> >
>
> Downside for me because cygwin_conv_path doesn't produce such paths,
> making it more difficult to pass the expected path to the child for
> verification.

It seems what I really wanted is GetFinalPathNameByHandleW, and then fall
back to NtQueryObject if that fails.  That allowed me to drop loading and
calling into Cygwin dll.

Reply via email to