Updated ntdll-Junction_Points patchset

This commit is contained in:
Alistair Leslie-Hughes 2019-05-01 08:50:08 +10:00
parent 05f918ddb4
commit 7d9b7bbdf5
16 changed files with 195 additions and 92 deletions

View File

@ -1,4 +1,4 @@
From e4f4a5fdd7688699cabbe98bedf1314df6bca246 Mon Sep 17 00:00:00 2001
From 87bbbc7d6c67c2ec3e13f84a7eecccb71e486ac0 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 20:56:49 -0700
Subject: ntdll: Add support for junction point creation.
@ -6,22 +6,22 @@ Subject: ntdll: Add support for junction point creation.
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
---
configure.ac | 2 +
dlls/ntdll/file.c | 116 ++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/file.c | 118 ++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/tests/file.c | 101 ++++++++++++++++++++++++++++++++++
include/Makefile.in | 1 +
include/ntifs.h | 42 +++++++++++++++
include/wine/port.h | 9 ++++
include/ntifs.h | 42 ++++++++++++++
include/wine/port.h | 9 +++
libs/port/Makefile.in | 1 +
libs/port/renameat2.c | 55 +++++++++++++++++++
8 files changed, 327 insertions(+)
8 files changed, 329 insertions(+)
create mode 100644 include/ntifs.h
create mode 100644 libs/port/renameat2.c
diff --git a/configure.ac b/configure.ac
index c2f97e0f7d..10c60429e6 100644
index d1502bacf7..84307f0f54 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2189,6 +2189,8 @@ AC_CHECK_FUNCS(\
@@ -2207,6 +2207,8 @@ AC_CHECK_FUNCS(\
pwrite \
readdir \
readlink \
@ -31,7 +31,7 @@ index c2f97e0f7d..10c60429e6 100644
select \
setproctitle \
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 3dafdcfb44..5f2da14398 100644
index 3dafdcfb44..c0992ea657 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -21,6 +21,7 @@
@ -50,7 +50,7 @@ index 3dafdcfb44..5f2da14398 100644
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
WINE_DECLARE_DEBUG_CHANNEL(winediag);
@@ -1648,6 +1650,102 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event,
@@ -1648,6 +1650,104 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event,
}
@ -64,7 +64,7 @@ index 3dafdcfb44..5f2da14398 100644
+ int dest_len = buffer->MountPointReparseBuffer.SubstituteNameLength;
+ int offset = buffer->MountPointReparseBuffer.SubstituteNameOffset;
+ WCHAR *dest = &buffer->MountPointReparseBuffer.PathBuffer[offset];
+ char tmpdir[PATH_MAX], tmplink[PATH_MAX];
+ char tmpdir[PATH_MAX], tmplink[PATH_MAX], *d;
+ ANSI_STRING unix_src, unix_dest;
+ char magic_dest[PATH_MAX];
+ int dest_fd, needs_close;
@ -80,7 +80,8 @@ index 3dafdcfb44..5f2da14398 100644
+ src_allocated = TRUE;
+ nt_dest.Buffer = dest;
+ nt_dest.Length = dest_len;
+ if ((status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, FILE_OPEN, FALSE )))
+ status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, 0, FALSE );
+ if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE)
+ goto cleanup;
+ dest_allocated = TRUE;
+
@ -98,7 +99,8 @@ index 3dafdcfb44..5f2da14398 100644
+
+ /* Produce the link in a temporary location in the same folder */
+ strcpy( tmpdir, unix_src.Buffer );
+ dirname( tmpdir) ;
+ d = dirname( tmpdir);
+ if (d != tmpdir) strcpy( tmpdir, d );
+ strcat( tmpdir, "/.winelink.XXXXXX" );
+ if (mkdtemp( tmpdir ) == NULL)
+ {
@ -153,7 +155,7 @@ index 3dafdcfb44..5f2da14398 100644
/**************************************************************************
* NtFsControlFile [NTDLL.@]
* ZwFsControlFile [NTDLL.@]
@@ -1732,6 +1830,24 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
@@ -1732,6 +1832,24 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
io->Information = 0;
status = STATUS_SUCCESS;
break;
@ -303,10 +305,10 @@ index 8e54dbb541..322dadefe3 100644
+ test_reparse_points();
}
diff --git a/include/Makefile.in b/include/Makefile.in
index 09c84d8254..616f265900 100644
index 4a0f927082..519a34c856 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -479,6 +479,7 @@ SOURCES = \
@@ -480,6 +480,7 @@ SOURCES = \
ntddvdeo.h \
ntdef.h \
ntdsapi.h \

View File

@ -1,4 +1,4 @@
From 7c01bde97a63851a367aa0bd76c9aee398857b4e Mon Sep 17 00:00:00 2001
From 38245bc3099137dd16dc78e3f41c6d50b7f0f804 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 20:57:57 -0700
Subject: ntdll: Add support for reading junction points.
@ -10,10 +10,10 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 119 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 5f2da14398..ee561d9268 100644
index c0992ea657..e0984b4567 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1746,6 +1746,106 @@ cleanup:
@@ -1748,6 +1748,106 @@ cleanup:
}
@ -120,7 +120,7 @@ index 5f2da14398..ee561d9268 100644
/**************************************************************************
* NtFsControlFile [NTDLL.@]
* ZwFsControlFile [NTDLL.@]
@@ -1831,6 +1931,12 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
@@ -1833,6 +1933,12 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
status = STATUS_SUCCESS;
break;

View File

@ -1,20 +1,20 @@
From 8e8839dfe0b2eeae7b0d124b65725257792e3813 Mon Sep 17 00:00:00 2001
From 9f0a95668d86bacd6cd006e6fe6c6d463cfb5e9b Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 21:00:21 -0700
Subject: ntdll: Add support for deleting junction points.
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
---
dlls/ntdll/file.c | 96 +++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/file.c | 97 +++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/tests/file.c | 23 +++++++++-
include/ntifs.h | 12 ++++++
3 files changed, 130 insertions(+), 1 deletion(-)
include/ntifs.h | 12 +++++
3 files changed, 131 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index ee561d9268..1730d816d9 100644
index e0984b4567..54768695b3 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1846,6 +1846,86 @@ cleanup:
@@ -1848,6 +1848,87 @@ cleanup:
}
@ -24,7 +24,7 @@ index ee561d9268..1730d816d9 100644
+ */
+NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer)
+{
+ char tmpdir[PATH_MAX], tmpfile[PATH_MAX];
+ char tmpdir[PATH_MAX], tmpfile[PATH_MAX], *d;
+ BOOL tempdir_created = FALSE;
+ int dest_fd, needs_close;
+ ANSI_STRING unix_name;
@ -46,7 +46,8 @@ index ee561d9268..1730d816d9 100644
+ goto cleanup;
+ }
+ strcpy( tmpdir, unix_name.Buffer );
+ dirname( tmpdir) ;
+ d = dirname( tmpdir);
+ if (d != tmpdir) strcpy( tmpdir, d );
+ strcat( tmpdir, "/.winelink.XXXXXX" );
+ if (mkdtemp( tmpdir ) == NULL)
+ {
@ -101,7 +102,7 @@ index ee561d9268..1730d816d9 100644
/**************************************************************************
* NtFsControlFile [NTDLL.@]
* ZwFsControlFile [NTDLL.@]
@@ -1931,6 +2011,22 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
@@ -1933,6 +2014,22 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
status = STATUS_SUCCESS;
break;

View File

@ -1,4 +1,4 @@
From c94b245b19d852b13048227551641c655c591da1 Mon Sep 17 00:00:00 2001
From 52fb88dc16f22188dd2b3800fc1cd0034dbd118e Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 21:01:25 -0700
Subject: ntdll: Add a test for junction point advertisement.

View File

@ -1,4 +1,4 @@
From 8b1d430506bf0127a4782594937e1ae1505d64f0 Mon Sep 17 00:00:00 2001
From db064094e068f3e6434f4b4302c5b2eadf8395ef Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 21:02:11 -0700
Subject: kernel32,ntdll: Add support for deleting junction points with
@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 46 insertions(+), 8 deletions(-)
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index cf1c768970..6369225b3e 100644
index b8f49bd597..76a9512c77 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -1696,6 +1696,7 @@ BOOL WINAPI CreateDirectoryExW( LPCWSTR template, LPCWSTR path, LPSECURITY_ATTRI

View File

@ -1,24 +1,120 @@
From 602c311b76c08f4d06c71ee0925ea7c3329d7d73 Mon Sep 17 00:00:00 2001
From aa5ad3e25315a3ca2113df9a80e178fdfef58296 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 21:03:47 -0700
Subject: kernel32: Advertise junction point support.
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
---
dlls/kernel32/volume.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
dlls/kernel32/volume.c | 85 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 84 insertions(+), 1 deletion(-)
diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c
index 12084369cb..b8ab8896b9 100644
index 12084369cb..76bb32b850 100644
--- a/dlls/kernel32/volume.c
+++ b/dlls/kernel32/volume.c
@@ -824,7 +824,8 @@ fill_fs_info: /* now fill in the information that depends on the file system ty
@@ -44,6 +44,19 @@
#include "wine/unicode.h"
#include "wine/debug.h"
+#ifdef HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+#endif
+#ifdef HAVE_SYS_STATFS_H
+# include <sys/statfs.h>
+#endif
+#ifdef HAVE_SYS_SYSCALL_H
+# include <sys/syscall.h>
+#endif
+#ifdef HAVE_SYS_VFS_H
+# include <sys/vfs.h>
+#endif
+
WINE_DEFAULT_DEBUG_CHANNEL(volume);
#define BLOCK_SIZE 2048
@@ -680,6 +693,75 @@ static DWORD VOLUME_GetAudioCDSerial( const CDROM_TOC *toc )
}
+static DWORD WINAPI get_fs_flags( UNICODE_STRING *nt_name )
+{
+#if defined(__NR_renameat2) || defined(RENAME_SWAP)
+ ANSI_STRING unix_name;
+#if defined(HAVE_FSTATFS)
+ struct statfs stfs;
+#elif defined(HAVE_FSTATVFS)
+ struct statvfs stfs;
+#endif
+ NTSTATUS status;
+ DWORD flags = 0;
+
+ status = wine_nt_to_unix_file_name( nt_name, &unix_name, FILE_OPEN, FALSE );
+ if (status != STATUS_SUCCESS)
+ return flags;
+#if defined(HAVE_FSTATFS)
+ if (statfs(unix_name.Buffer, &stfs))
+ return flags;
+#elif defined(HAVE_FSTATVFS)
+ if (statvfs(unix_name.Buffer, &stfs))
+ return flags;
+#endif
+#if defined(HAVE_FSTATFS) && defined(linux)
+ switch (stfs.f_type)
+ {
+ case 0x6969: /* nfs */
+ case 0xff534d42: /* cifs */
+ case 0x564c: /* ncpfs */
+ case 0x01021994: /* tmpfs */
+ case 0x28cd3d45: /* cramfs */
+ case 0x1373: /* devfs */
+ case 0x9fa0: /* procfs */
+ case 0xef51: /* old ext2 */
+ case 0xef53: /* ext2/3/4 */
+ case 0x4244: /* hfs */
+ case 0xf995e849: /* hpfs */
+ case 0x5346544e: /* ntfs */
+ flags |= FILE_SUPPORTS_REPARSE_POINTS;
+ break;
+ default:
+ break;
+ }
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__) || defined(__NetBSD__)
+ if (!strcmp("apfs", stfs.f_fstypename) ||
+ !strcmp("nfs", stfs.f_fstypename) ||
+ !strcmp("cifs", stfs.f_fstypename) ||
+ !strcmp("ncpfs", stfs.f_fstypename) ||
+ !strcmp("tmpfs", stfs.f_fstypename) ||
+ !strcmp("cramfs", stfs.f_fstypename) ||
+ !strcmp("devfs", stfs.f_fstypename) ||
+ !strcmp("procfs", stfs.f_fstypename) ||
+ !strcmp("ext2", stfs.f_fstypename) ||
+ !strcmp("ext3", stfs.f_fstypename) ||
+ !strcmp("ext4", stfs.f_fstypename) ||
+ !strcmp("hfs", stfs.f_fstypename) ||
+ !strcmp("hpfs", stfs.f_fstypename) ||
+ !strcmp("ntfs", stfs.f_fstypename))
+ {
+ flags |= FILE_SUPPORTS_REPARSE_POINTS;
+ }
+#endif
+ RtlFreeAnsiString( &unix_name );
+ return flags;
+#else
+ return 0;
+#endif
+}
+
+
/***********************************************************************
* GetVolumeInformationW (KERNEL32.@)
*/
@@ -824,7 +906,8 @@ fill_fs_info: /* now fill in the information that depends on the file system ty
default:
if (fsname) lstrcpynW( fsname, ntfsW, fsname_len );
if (filename_len) *filename_len = 255;
- if (flags) *flags = FILE_CASE_PRESERVED_NAMES | FILE_PERSISTENT_ACLS;
+ if (flags) *flags = FILE_CASE_PRESERVED_NAMES | FILE_PERSISTENT_ACLS
+ | FILE_SUPPORTS_REPARSE_POINTS;
+ | get_fs_flags( &nt_name );
break;
}
ret = TRUE;

View File

@ -1,4 +1,4 @@
From 6c1d1b1d7819118d3511aaa314a8e3da05f4c7ea Mon Sep 17 00:00:00 2001
From 8547ee103b062ae2c8e1a5fd058ea3e9dc8a2146 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 21:06:24 -0700
Subject: ntdll: Add support for absolute symlink creation.
@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
3 files changed, 139 insertions(+), 15 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 1730d816d9..78ea4c5b00 100644
index 54768695b3..18630c12c9 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1657,17 +1657,33 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event,
@ -21,7 +21,7 @@ index 1730d816d9..78ea4c5b00 100644
- int dest_len = buffer->MountPointReparseBuffer.SubstituteNameLength;
- int offset = buffer->MountPointReparseBuffer.SubstituteNameOffset;
- WCHAR *dest = &buffer->MountPointReparseBuffer.PathBuffer[offset];
char tmpdir[PATH_MAX], tmplink[PATH_MAX];
char tmpdir[PATH_MAX], tmplink[PATH_MAX], *d;
ANSI_STRING unix_src, unix_dest;
char magic_dest[PATH_MAX];
int dest_fd, needs_close;
@ -51,7 +51,7 @@ index 1730d816d9..78ea4c5b00 100644
if ((status = server_get_unix_fd( handle, FILE_SPECIAL_ACCESS, &dest_fd, &needs_close, NULL, NULL )))
return status;
@@ -1690,6 +1706,18 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
@@ -1691,6 +1707,18 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
strcat( magic_dest, "." );
strcat( magic_dest, "/" );
}
@ -70,7 +70,7 @@ index 1730d816d9..78ea4c5b00 100644
strcat( magic_dest, unix_dest.Buffer );
/* Produce the link in a temporary location in the same folder */
@@ -2040,6 +2068,7 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
@@ -2043,6 +2071,7 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
switch(buffer->ReparseTag)
{
case IO_REPARSE_TAG_MOUNT_POINT:

View File

@ -1,4 +1,4 @@
From 498e0feb3c25f92c9930e4007259b12c6ff4e567 Mon Sep 17 00:00:00 2001
From b9fa01baf73dc3975bd56b9b0ce0d26eddb45e81 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Wed, 13 Mar 2019 12:55:20 -0600
Subject: ntdll: Add support for reading absolute symlinks.
@ -10,10 +10,10 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 78ea4c5b00..812bfd0e36 100644
index 18630c12c9..80d3e9b089 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1787,6 +1787,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
@@ -1789,6 +1789,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
UNICODE_STRING nt_dest;
DWORD max_length;
NTSTATUS status;
@ -21,7 +21,7 @@ index 78ea4c5b00..812bfd0e36 100644
INT prefix_len;
ssize_t ret;
char *p;
@@ -1833,6 +1834,17 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
@@ -1835,6 +1836,17 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
}
buffer->ReparseTag |= (val << i);
}
@ -39,7 +39,7 @@ index 78ea4c5b00..812bfd0e36 100644
unix_dest.Length -= (p - unix_dest.Buffer);
memmove(unix_dest.Buffer, p, unix_dest.Length);
@@ -1851,6 +1863,16 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
@@ -1853,6 +1865,16 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
buffer->MountPointReparseBuffer.PrintNameLength = nt_dest.Length - prefix_len*sizeof(WCHAR);
print_name = &buffer->MountPointReparseBuffer.PathBuffer[buffer->MountPointReparseBuffer.PrintNameOffset/sizeof(WCHAR)];
break;

View File

@ -1,4 +1,4 @@
From c32fc6d0a84e857f17c1c51af9bab5aab6a5ff1e Mon Sep 17 00:00:00 2001
From 90921ac6aba0f98fb9b33104c82d77e07cc82278 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Wed, 13 Mar 2019 13:02:22 -0600
Subject: ntdll: Add support for deleting symlinks.
@ -10,10 +10,10 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 17 insertions(+)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 812bfd0e36..262d24b9d2 100644
index 80d3e9b089..60affd59a2 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -2068,6 +2068,7 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
@@ -2071,6 +2071,7 @@ NTSTATUS WINAPI NtFsControlFile(HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc
switch(buffer->ReparseTag)
{
case IO_REPARSE_TAG_MOUNT_POINT:

View File

@ -1,17 +1,17 @@
From 273149c2baf56e80063a33ebb5d143819a138436 Mon Sep 17 00:00:00 2001
From 4cfe8631a57057a13afa650f41576c8c3ae465d5 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 11 Apr 2019 12:16:49 -0600
Subject: ntdll: Add support for relative symlink creation.
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
---
dlls/ntdll/file.c | 57 ++++++++++++++++++++++++++++++++++++-----
dlls/ntdll/tests/file.c | 30 +++++++++++++++++-----
dlls/ntdll/file.c | 58 ++++++++++++++++++++++++++++++++++++-----
dlls/ntdll/tests/file.c | 30 ++++++++++++++++-----
include/ntifs.h | 2 ++
3 files changed, 76 insertions(+), 13 deletions(-)
3 files changed, 77 insertions(+), 13 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 262d24b9d2..186156159c 100644
index 60affd59a2..8487bb5158 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1656,16 +1656,19 @@ NTSTATUS WINAPI NtDeviceIoControlFile(HANDLE handle, HANDLE event,
@ -21,9 +21,9 @@ index 262d24b9d2..186156159c 100644
- BOOL src_allocated = FALSE, dest_allocated = FALSE, tempdir_created = FALSE;
+ BOOL src_allocated = FALSE, path_allocated = FALSE, dest_allocated = FALSE;
+ BOOL nt_dest_allocated = FALSE, tempdir_created = FALSE;
+ ANSI_STRING unix_src, unix_dest, unix_path;
char tmpdir[PATH_MAX], tmplink[PATH_MAX];
char tmpdir[PATH_MAX], tmplink[PATH_MAX], *d;
- ANSI_STRING unix_src, unix_dest;
+ ANSI_STRING unix_src, unix_dest, unix_path;
char magic_dest[PATH_MAX];
int dest_fd, needs_close;
+ int relative_offset = 0;
@ -50,7 +50,7 @@ index 262d24b9d2..186156159c 100644
break;
default:
return STATUS_NOT_IMPLEMENTED;
@@ -1690,16 +1695,52 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
@@ -1690,17 +1695,54 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
if ((status = server_get_unix_name( handle, &unix_src )))
goto cleanup;
src_allocated = TRUE;
@ -64,7 +64,8 @@ index 262d24b9d2..186156159c 100644
+ unix_path.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, unix_path.MaximumLength );
+ path_allocated = TRUE;
+ strcpy( unix_path.Buffer, unix_src.Buffer );
+ dirname( unix_path.Buffer );
+ d = dirname( unix_path.Buffer );
+ if (d != unix_path.Buffer) strcpy( unix_path.Buffer, d );
+ strcat( unix_path.Buffer, "/");
+ unix_path.Length = strlen( unix_path.Buffer );
+ if ((status = wine_unix_to_nt_file_name( &unix_path, &nt_path )))
@ -82,7 +83,8 @@ index 262d24b9d2..186156159c 100644
+ nt_dest.Length = dest_len;
+ }
+ nt_dest_allocated = TRUE;
if ((status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, FILE_OPEN, FALSE )))
status = wine_nt_to_unix_file_name( &nt_dest, &unix_dest, 0, FALSE );
if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE)
goto cleanup;
dest_allocated = TRUE;
+ if (flags == SYMLINK_FLAG_RELATIVE)
@ -107,7 +109,7 @@ index 262d24b9d2..186156159c 100644
for (i = 0; i < sizeof(ULONG)*8; i++)
{
if ((buffer->ReparseTag >> i) & 1)
@@ -1718,7 +1759,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
@@ -1719,7 +1761,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
strcat( magic_dest, "." );
strcat( magic_dest, "/" );
}
@ -116,7 +118,7 @@ index 262d24b9d2..186156159c 100644
/* Produce the link in a temporary location in the same folder */
strcpy( tmpdir, unix_src.Buffer );
@@ -1767,7 +1808,9 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
@@ -1769,7 +1811,9 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
cleanup:
if (tempdir_created) rmdir( tmpdir );

View File

@ -1,19 +1,19 @@
From 2618729bcbd286d60e0a80c3ad1ef840c58c5689 Mon Sep 17 00:00:00 2001
From cdd6070ee2b8876877c66bfdaa44b4b152633b1d Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 11 Apr 2019 12:31:16 -0600
Subject: ntdll: Add support for reading relative symlinks.
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
---
dlls/ntdll/file.c | 42 ++++++++++++++++++++++++++++++++++++++++-
dlls/ntdll/tests/file.c | 13 ++++++++++++-
2 files changed, 53 insertions(+), 2 deletions(-)
dlls/ntdll/file.c | 44 ++++++++++++++++++++++++++++++++++++++++-
dlls/ntdll/tests/file.c | 13 +++++++++++-
2 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 186156159c..8795eb6e9d 100644
index 8487bb5158..5df2d8c3fa 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1828,6 +1828,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
@@ -1831,6 +1831,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
BOOL dest_allocated = FALSE;
int dest_fd, needs_close;
UNICODE_STRING nt_dest;
@ -21,7 +21,7 @@ index 186156159c..8795eb6e9d 100644
DWORD max_length;
NTSTATUS status;
ULONG flags = 0;
@@ -1855,6 +1856,11 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
@@ -1858,6 +1859,11 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
/* Decode the reparse tag from the symlink */
p = unix_dest.Buffer;
@ -33,7 +33,7 @@ index 186156159c..8795eb6e9d 100644
if (*p++ != '/')
{
status = STATUS_NOT_IMPLEMENTED;
@@ -1891,10 +1897,44 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
@@ -1894,10 +1900,46 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
unix_dest.Length -= (p - unix_dest.Buffer);
memmove(unix_dest.Buffer, p, unix_dest.Length);
@ -41,11 +41,13 @@ index 186156159c..8795eb6e9d 100644
+ if (flags == SYMLINK_FLAG_RELATIVE)
+ {
+ int offset = unix_src.Length + 2;
+ char *d;
+ memcpy( &unix_dest.Buffer[offset], unix_dest.Buffer, unix_dest.Length );
+ unix_dest.Buffer[offset+unix_dest.Length] = 0;
+ memcpy( unix_dest.Buffer, unix_src.Buffer, unix_src.Length );
+ unix_dest.Buffer[unix_src.Length] = 0;
+ dirname( unix_dest.Buffer );
+ d = dirname( unix_dest.Buffer );
+ if (d != unix_dest.Buffer) strcpy( unix_dest.Buffer, d );
+ strcat( unix_dest.Buffer, "/" );
+ path_len = strlen( unix_dest.Buffer );
+ memmove( &unix_dest.Buffer[path_len], &unix_dest.Buffer[offset], unix_dest.Length + 1 );

View File

@ -1,4 +1,4 @@
From 0cf6512a8532b065dc92d6ac16678dff180a1107 Mon Sep 17 00:00:00 2001
From 05a16c210c3dabb07cc5b5514e9745f00fb364ea Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 11 Apr 2019 17:57:53 -0600
Subject: ntdll: Add support for file symlinks.
@ -10,7 +10,7 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 55 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 8795eb6e9d..a9fe846e08 100644
index 5df2d8c3fa..03a07d46cd 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1665,6 +1665,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
@ -21,7 +21,7 @@ index 8795eb6e9d..a9fe846e08 100644
NTSTATUS status;
struct stat st;
WCHAR *dest;
@@ -1755,7 +1756,8 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
@@ -1757,7 +1758,8 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
status = FILE_GetNtStatus();
goto cleanup;
}
@ -31,7 +31,7 @@ index 8795eb6e9d..a9fe846e08 100644
strcat( magic_dest, "." );
strcat( magic_dest, "/" );
}
@@ -1781,8 +1783,11 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
@@ -1784,8 +1786,11 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer)
/* Atomically move the link into position */
if (!renameat2( -1, tmplink, -1, unix_src.Buffer, RENAME_EXCHANGE ))
{
@ -45,7 +45,7 @@ index 8795eb6e9d..a9fe846e08 100644
}
else if (errno == ENOSYS)
{
@@ -1989,6 +1994,7 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer)
@@ -1994,6 +1999,7 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer)
BOOL tempdir_created = FALSE;
int dest_fd, needs_close;
ANSI_STRING unix_name;
@ -53,7 +53,7 @@ index 8795eb6e9d..a9fe846e08 100644
NTSTATUS status;
struct stat st;
@@ -2000,12 +2006,13 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer)
@@ -2005,12 +2011,13 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer)
TRACE("Deleting symlink %s\n", unix_name.Buffer);
@ -66,9 +66,9 @@ index 8795eb6e9d..a9fe846e08 100644
}
+ is_dir = S_ISDIR(st.st_mode);
strcpy( tmpdir, unix_name.Buffer );
dirname( tmpdir) ;
strcat( tmpdir, "/.winelink.XXXXXX" );
@@ -2017,11 +2024,21 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer)
d = dirname( tmpdir);
if (d != tmpdir) strcpy( tmpdir, d );
@@ -2023,11 +2030,21 @@ NTSTATUS FILE_RemoveSymlink(HANDLE handle, REPARSE_GUID_DATA_BUFFER *buffer)
tempdir_created = TRUE;
strcpy( tmpfile, tmpdir );
strcat( tmpfile, "/tmpfile" );

View File

@ -1,4 +1,4 @@
From 2ccff55de1a8e43f12fde63870b0d93ec63dd4ab Mon Sep 17 00:00:00 2001
From 9c0229cf831240320ef2797dbfd21493d7871088 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Sat, 30 Mar 2019 12:00:51 -0600
Subject: ntdll: Correctly report file symbolic links as files.
@ -10,7 +10,7 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 79 insertions(+), 39 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index a9fe846e08..8ffd79ccbf 100644
index 03a07d46cd..8b78306fbf 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -124,6 +124,9 @@ mode_t FILE_umask = 0;
@ -38,7 +38,7 @@ index a9fe846e08..8ffd79ccbf 100644
}
*attr |= get_file_attributes( st );
return ret;
@@ -1822,48 +1829,34 @@ cleanup:
@@ -1825,48 +1832,34 @@ cleanup:
}
@ -102,7 +102,7 @@ index a9fe846e08..8ffd79ccbf 100644
p++;
}
if (*p++ != '/')
@@ -1871,7 +1864,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
@@ -1874,7 +1867,7 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
status = STATUS_NOT_IMPLEMENTED;
goto cleanup;
}
@ -111,7 +111,7 @@ index a9fe846e08..8ffd79ccbf 100644
for (i = 0; i < sizeof(ULONG)*8; i++)
{
char c = *p++;
@@ -1886,21 +1879,68 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
@@ -1889,21 +1882,68 @@ NTSTATUS FILE_GetSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer, ULONG out_s
status = STATUS_NOT_IMPLEMENTED;
goto cleanup;
}

View File

@ -1,4 +1,4 @@
From 447ceb46b34604f8c72014b8516851e81850b4de Mon Sep 17 00:00:00 2001
From e34db8f28e43091a02cccb2eb590f9beda9da059 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Sat, 30 Mar 2019 12:01:50 -0600
Subject: kernel32: Set error code when attempting to delete file symlinks as
@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index 6369225b3e..832e77bfc0 100644
index 76a9512c77..f15b6dd68b 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -1738,7 +1738,10 @@ BOOL WINAPI RemoveDirectoryW( LPCWSTR path )

View File

@ -1,4 +1,4 @@
From d6f127ccdc6bb2a2c74551bfae669a6eee55c312 Mon Sep 17 00:00:00 2001
From 245f8c8ad1d014bbf726020fd4c37c99e8bcafea Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Sat, 30 Mar 2019 13:41:07 -0600
Subject: server: Properly handle file symlink deletion.

View File

@ -1,4 +1,4 @@
From a4a9f0c9c9b4453a46d5060d0ec32b8f49cf19a1 Mon Sep 17 00:00:00 2001
From 99b54adfcc2740af27224957748f94a0e84b47c3 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Wed, 13 Mar 2019 16:02:05 -0600
Subject: kernel32: Implement CreateSymbolicLink[A|W] with ntdll reparse
@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
2 files changed, 214 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index 832e77bfc0..9fef494cfa 100644
index f15b6dd68b..d96471e4c6 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -34,6 +34,8 @@
@ -23,7 +23,7 @@ index 832e77bfc0..9fef494cfa 100644
#include "kernel_private.h"
#include "wine/unicode.h"
@@ -2088,8 +2090,106 @@ WCHAR * CDECL wine_get_dos_file_name( LPCSTR str )
@@ -2087,8 +2089,106 @@ WCHAR * CDECL wine_get_dos_file_name( LPCSTR str )
*/
BOOLEAN WINAPI CreateSymbolicLinkW(LPCWSTR link, LPCWSTR target, DWORD flags)
{
@ -132,7 +132,7 @@ index 832e77bfc0..9fef494cfa 100644
}
/*************************************************************************
@@ -2097,8 +2197,24 @@ BOOLEAN WINAPI CreateSymbolicLinkW(LPCWSTR link, LPCWSTR target, DWORD flags)
@@ -2096,8 +2196,24 @@ BOOLEAN WINAPI CreateSymbolicLinkW(LPCWSTR link, LPCWSTR target, DWORD flags)
*/
BOOLEAN WINAPI CreateSymbolicLinkA(LPCSTR link, LPCSTR target, DWORD flags)
{