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

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

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


More information about the Cygwin-developers mailing list