forkables: About hardlink creation and NTFS transaction in rename()

Corinna Vinschen
Wed Nov 30 12:17:00 GMT 2016

On Nov 29 14:47, Michael Haubenwallner wrote:
> On 11/21/2016 04:19 PM, Michael Haubenwallner wrote:
> > Hi Corinna,
> > 
> > now working with the cygfork patches (hardlinks to retain forkability
> > beyond exe/dll update): when creating the forkable hardlink using the
> > earlier opened file handle I may get STATUS_TRANSACTION_NOT_ACTIVE.
> > 
> > It turns out that when loaded 'some.dll' was readonly, then
> > rename("new/some.dll", "some.dll") uses an NTFS-transaction to drop
> > the readonly attribute, breaking the subsequent hardlink creation
> > of "/var/run/cygfork/.../soname.dll" via the original file handle.
> It turns out that when NTFS transactions are involved with the dll,
> creating a hardlink requires the FILE_WRITE_ATTRIBUTES access.
> Strange enough, this also applies when the file handle used to create
> the hardlink is opened _after_ the rename transaction has finished.
> On the other hand, opening the file handle with FILE_WRITE_ATTRIBUTES
> access _before_ the rename(), the transactional unlink_nt fails with

I wonder how Microsoft implemented NTFS transactions.  Something
seems a little bit off here.

> > Now I can see these options:
> > * As using NTFS transactions seems not to be recommended any more,
> >   might we drop the NTFS transaction from rename() and _unlink_nt ()?
> > * Or do I need to create an NTFS-transaction in dll_list::alloc()
> >   when opening the original dll file handle?
> some more now:
> * Just for creating the hardlink open the file by id, determined
>   in dll_list::alloc(), with immediately closing the file handle.
>   However, I've not managed yet to open a file by id...

  You need a handle to some file on the same file system to identify
  the file system.  Let's say the handle is called vol_hdl.  Then:

  path_conv pc ("my.dll");
  NTSTATUS status;

  LARGE_INTEGER &file_id = pc.fai ()->InternalInformation.IndexNumber;
  UNICODE_STRING ufid = { sizeof file_id, sizeof file_id, (PWSTR) &file_id };
  InitializeObjectAttributes (&attr, &ufid, pc.objcaseinsensitive (),
			      vol_hdl, NULL);
  status = NtOpenFile (&hdl, access, &attr, &io, share_flags, options);


Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Maintainer                 cygwin AT cygwin DOT com
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <>

More information about the Cygwin-developers mailing list