Utilize reparse points for symlinks

Andy Koppe andy.koppe@gmail.com
Sat Sep 25 08:27:00 GMT 2010


On 24 September 2010 14:16, Corinna Vinschen wrote:
> On Sep 24 14:03, Andy Koppe wrote:
>> On 23 September 2010 16:26, Corinna Vinschen wrote:
>> > I experimented a bit further with reparse points, since it occured to me
>> > that they are still an excellent method to implement symlinks on NTFS.
>> >
>> > What we can't do is to use the offical symlink reparse point introduced
>> > with Windows Vista for the well-known reasons.
>> >
>> > However, what we *could* do is to go the official way and request a
>> > Cygwin reparse point tag at Microsoft(*).  For testing I implemented
>> > this method locally, using the offical REPARSE_GUID_DATA_BUFFER reserved
>> > for 3PPs, a reparse tag 0x20007654, and a GUID I generated by using the
>> > uuidgen tool from the Microsoft SDK.  Works fine, even as non-admin user,
>> > unlike the native Vista symlinks.
>> >
>> > Why am I pursuing this at all?
>> >
>> > The reason is that a reparse point can be easily (read: quickly)
>> > recognized by the DOS reparse attribute.  The reparse point content can
>> > be read without having to use ReadFile, so the access time doesn't
>> > change when reading it.  The reparse tag can even be recognized already
>> > in readdir for free(**).
>>
>> Sounds like a good idea. I assume these still wouldn't work for
>> non-Cygwin programs though? Could they still support them by reading
>> them themselves (using DeviceIoControl with FSCTL_GET_REPARSE_POINT)?
>
> Yes, sure they could, the format will be documented.  But the POSIX
> target path only makes sense if you know the Cygwin mount table, of
> course.

Yep, whereby the most awkward question would be: the mount table of
which Cygwin? Anyways, a few more questions about these reparse
points:

How do they appear in Explorer? What happens if you try to open one?
Is Explorer able to delete them? (Just wondering what complaints to
expect.)

Is there a useful error message when trying to execute one from cmd?
(C:\cygwin\bin\gcc is particularly popular for that. The current
format results in "Access is denied", which isn't great).

Finally, would it be possible to write a system-wide handler for these
reparse points that would make them transparent to all non-Cygwin
programs?

Andy



More information about the Cygwin-developers mailing list