RFC: Junction Point/NT Symlink Support

Hans Leidekker hans at codeweavers.com
Thu Mar 28 15:09:45 CDT 2019


On Thu, 2019-03-28 at 13:30 -0600, Erich E. Hoover wrote:
> On Thu, Mar 28, 2019 at 10:38 AM Hans Leidekker <hans at codeweavers.com> wrote:
> > 
> > On Thu, 2019-03-28 at 07:58 -0600, Erich E. Hoover wrote:
> > > ...
> > > How do you think we should handle "regular" symlinks that don't have
> > > our magic string?  Conceivably we could use the magic string just for
> > > junction points and auto-detect relative and absolute symlinks.
> > 
> > One reason this can't work is that there are two types of symlinks on
> > Windows: file symlinks and directory symlinks. You have to specify
> > which type you want when you create them because the target doesn't
> > have to exist.
> 
> We have to pick something for non-Wine symlinks, unless you want to
> always treat them as regular (non-reparse point) files?  Treating
> regular symlinks as NT Symlinks seem like the easiest choice, since
> they support both file and directory symlinks.

You wouldn't be able to report their type correctly if the target
doesn't exist.

> > > ...
> > > The way that I'm currently doing it is creating a temporary hidden
> > > directory (.winelink.XXXXXX) and putting the symlink inside that
> > > folder.
> > > ...
> > 
> > That temporary directory can still be seen, right?
> 
> Yes, though it wouldn't be too terrible to completely hide it (rather
> than just "dot" hide it).
> 
> > My testing shows
> > that creating a symlink fails when the link name exists, so I don't see
> > why you need renameat2(RENAME_EXCHANGE) here.
> 
> Are you talking about kernel32:?  I'm working with
> ntdll:DeviceIoControl(), which requires an
> existing handle and is, presumably, used to implement
> CreateSymbolicLink.

I see. So I guess CreateSymbolicLink would call CreateFile(linkname,
CREATE_NEW) and then call DeviceIoControl(FSCTL_SET_REPARSE_POINT) with
that handle.




More information about the wine-devel mailing list